Files
small-packages/luci-app-honk/htdocs/luci-static/resources/view/honk/honk.css
T
2026-11-06 23:35:05 +08:00

1207 lines
26 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* SPDX-License-Identifier: GPL-3.0-only */
/* Honk — Apple-style design system.
Cards, pill badges, iOS segmented controls and soft-tinted buttons on a
translucent surface, so the UI adapts to every LuCI theme (light or dark). */
.honk-page {
/* Accent — Apple system blue */
--hk-accent-rgb: 0, 122, 255;
--hk-accent: rgba(var(--hk-accent-rgb), 0.9);
--hk-accent-strong: rgba(var(--hk-accent-rgb), 1);
--hk-accent-border: rgba(var(--hk-accent-rgb), 0.35);
--hk-accent-soft: rgba(var(--hk-accent-rgb), 0.09);
--hk-accent-soft-hover: rgba(var(--hk-accent-rgb), 0.16);
/* Status — Apple system green / red */
--hk-green: #34c759;
--hk-red: #ff3b30;
--hk-orange: #ff9500;
/* Surfaces (translucent → adapts to any theme) */
--hk-card-bg: rgba(128, 128, 128, 0.04);
--hk-card-border: rgba(128, 128, 128, 0.14);
--hk-field-bg: rgba(128, 128, 128, 0.05);
--hk-field-border: rgba(128, 128, 128, 0.22);
--hk-hover: rgba(128, 128, 128, 0.08);
--hk-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);
--hk-shadow-hover: 0 8px 28px rgba(0, 0, 0, 0.08);
--hk-muted: rgba(74, 86, 106, 0.62);
--hk-radius: 14px;
--hk-radius-sm: 9px;
--hk-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
"Hiragino Sans GB", "Helvetica Neue", "Microsoft YaHei", sans-serif;
--hk-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
"Liberation Mono", monospace;
font-family: var(--hk-font);
width: 100%;
min-width: 0;
box-sizing: border-box;
}
.honk-page,
.honk-page * {
box-sizing: border-box;
}
/* LuCI themes (Argon/Bootstrap) set #view>div:first-child and .cbi-map to flex;
force block so our card/segmented-control layout behaves identically across
themes (ID selector specificity requires !important). */
.cbi-map.honk-page {
display: block !important;
}
/* ---------- Hidden attribute guard ---------- */
.honk-page [hidden] {
display: none !important;
}
/* ---------- Page header ---------- */
.honk-header {
margin: 4px 0 18px;
display: flex;
align-items: center;
gap: 12px;
}
.honk-header-logo {
height: 30px;
width: auto;
flex: none;
display: block;
}
.honk-header-text {
min-width: 0;
}
.honk-header h2 {
margin: 0;
padding: 0;
font-size: 26px;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.15;
background: transparent !important;
box-shadow: none !important;
border-radius: 0 !important;
}
.honk-header-sub {
margin: 6px 0 0;
font-size: 13px;
line-height: 1.5;
color: var(--hk-muted);
max-width: 68ch;
}
@media (max-width: 480px) {
.honk-header { gap: 10px; }
.honk-header-logo { height: 26px; }
}
/* ---------- Cards ---------- */
.honk-page .cbi-section,
.honk-page .cbi-section-node {
background: transparent !important;
border: 0 !important;
box-shadow: none !important;
margin: 0;
padding: 0;
}
.honk-card {
background: var(--hk-card-bg);
border: 1px solid var(--hk-card-border);
border-radius: var(--hk-radius);
padding: 18px 20px;
margin-bottom: 16px;
box-shadow: var(--hk-shadow);
backdrop-filter: blur(6px);
transition: box-shadow 0.25s ease;
}
.honk-card:hover {
box-shadow: var(--hk-shadow-hover);
}
.honk-card-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 12px;
}
.honk-card-title {
margin: 0 0 6px;
padding: 0 !important;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
opacity: 0.55;
background: transparent !important;
box-shadow: none !important;
border-radius: 0 !important;
width: auto !important;
}
.honk-card-head .honk-card-title {
margin-bottom: 4px;
}
/* ---------- Status badge (pill) ---------- */
.honk-badge {
display: inline-flex;
align-items: center;
gap: 7px;
padding: 4px 14px;
border-radius: 999px;
font-size: 12.5px;
font-weight: 600;
line-height: 1.3;
border: 1px solid transparent;
white-space: nowrap;
}
.honk-badge::before {
content: "";
width: 7px;
height: 7px;
border-radius: 50%;
background: currentColor;
flex: none;
}
.honk-badge--run {
color: var(--hk-green);
border-color: rgba(52, 199, 89, 0.5);
}
.honk-badge--stop {
color: var(--hk-red);
border-color: rgba(255, 59, 48, 0.55);
}
.honk-badge--idle {
color: var(--hk-muted);
border-color: rgba(128, 128, 128, 0.35);
}
/* ---------- Buttons ---------- */
.honk-page .cbi-button {
font-family: var(--hk-font);
font-size: 13px !important;
font-weight: 500;
line-height: 1.35 !important;
min-height: 0 !important;
height: auto !important;
padding: 7px 16px !important;
border-radius: 10px !important;
border: 1px solid rgba(128, 128, 128, 0.32) !important;
background: transparent !important;
color: inherit !important;
box-shadow: none !important;
cursor: pointer;
white-space: nowrap;
transition: background-color 0.18s ease, border-color 0.18s ease,
opacity 0.18s ease, transform 0.12s ease;
}
.honk-page .cbi-button:hover {
background: var(--hk-hover) !important;
}
.honk-page .cbi-button:active {
transform: scale(0.98);
}
.honk-page .cbi-button:disabled {
opacity: 0.42;
cursor: not-allowed;
}
/* Primary — soft Apple blue */
.honk-page .cbi-button-action {
border-color: var(--hk-accent-border) !important;
color: var(--hk-accent) !important;
background: var(--hk-accent-soft) !important;
}
.honk-page .cbi-button-action:hover {
background: var(--hk-accent-soft-hover) !important;
border-color: var(--hk-accent) !important;
}
/* Positive — soft green */
.honk-page .cbi-button-positive {
border-color: rgba(52, 199, 89, 0.5) !important;
color: var(--hk-green) !important;
background: rgba(52, 199, 89, 0.09) !important;
}
.honk-page .cbi-button-positive:hover {
background: rgba(52, 199, 89, 0.16) !important;
border-color: var(--hk-green) !important;
}
/* Negative — soft red */
.honk-page .cbi-button-negative {
border-color: rgba(255, 59, 48, 0.5) !important;
color: var(--hk-red) !important;
background: rgba(255, 59, 48, 0.08) !important;
}
.honk-page .cbi-button-negative:hover {
background: rgba(255, 59, 48, 0.15) !important;
border-color: var(--hk-red) !important;
}
/* ---------- Button groups ---------- */
.honk-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
/* ---------- Meta line (mono, muted) ---------- */
.honk-meta {
display: flex;
flex-wrap: wrap;
gap: 6px 14px;
font-family: var(--hk-mono);
font-size: 12px;
color: var(--hk-muted);
}
.honk-meta-item {
display: inline-flex;
align-items: baseline;
gap: 5px;
}
.honk-meta-label {
opacity: 0.55;
}
/* ---------- Forms / fields ---------- */
/* 两栏表单:左栏固定宽度、标签右对齐贴近控件(和最早的设计一致)。
窄屏(手机)自动堆叠,标签改成左对齐放在控件上方。 */
.honk-page .cbi-value {
display: flex;
align-items: center;
gap: 12px;
padding: 9px 0;
margin: 0;
border: 0;
background: transparent;
}
/* 用 `.cbi-value > label.cbi-value-title` 压过 Bootstrap 的
`.cbi-value label.cbi-value-title`(它把标签设成 flex 定宽 + 右对齐)。 */
.honk-page .cbi-value > label.cbi-value-title {
float: none;
display: block;
flex: 0 0 168px;
width: auto;
padding: 0 8px 0 0;
text-align: right;
line-height: 1.5;
font-size: 13px;
font-weight: 600;
opacity: 0.85;
white-space: nowrap;
}
.honk-page .cbi-value-field {
display: block;
flex: 1 1 auto;
width: auto;
margin-left: 0;
padding: 0;
min-width: 0;
}
@media (max-width: 719px) {
.honk-page .cbi-value {
flex-direction: column;
align-items: stretch;
gap: 6px;
}
.honk-page .cbi-value > label.cbi-value-title {
flex: none;
padding: 0;
text-align: left;
white-space: normal;
}
}
.honk-page .cbi-value-description {
font-size: 12px;
color: var(--hk-muted);
line-height: 1.5;
padding-top: 6px;
}
.honk-page .cbi-input-text,
.honk-page .cbi-input-password,
.honk-page .cbi-input-select,
.honk-page .cbi-input-textarea,
.honk-page select,
.honk-page input[type="text"],
.honk-page input[type="password"],
.honk-page input[type="number"],
.honk-page input[type="url"],
.honk-page textarea {
width: 100%;
max-width: 100%;
min-width: 0;
box-sizing: border-box;
font-family: var(--hk-font);
font-size: 13.5px;
height: 38px;
padding: 7px 12px;
border: 1px solid var(--hk-field-border);
border-radius: var(--hk-radius-sm);
background: var(--hk-field-bg);
color: inherit;
transition: border-color 0.18s ease, box-shadow 0.18s ease,
background-color 0.18s ease;
}
.honk-page textarea,
.honk-page .cbi-input-textarea {
height: auto;
min-height: 96px;
resize: vertical;
font-family: var(--hk-mono);
line-height: 1.5;
}
/* Full dae configuration editor: keep dae source lines unwrapped so line
numbers and indentation stay meaningful while scrolling horizontally. */
.honk-page .honk-config-editor {
min-height: 420px;
white-space: pre;
overflow-wrap: normal;
overflow-x: auto;
tab-size: 4;
}
.honk-page .cbi-input-text:focus,
.honk-page .cbi-input-password:focus,
.honk-page .cbi-input-select:focus,
.honk-page .cbi-input-textarea:focus,
.honk-page select:focus,
.honk-page input[type="text"]:focus,
.honk-page input[type="password"]:focus,
.honk-page input[type="number"]:focus,
.honk-page input[type="url"]:focus,
.honk-page textarea:focus {
outline: 0;
border-color: var(--hk-accent-border);
box-shadow: 0 0 0 3px var(--hk-accent-soft);
background: transparent;
}
.honk-page .cbi-input-text::placeholder,
.honk-page textarea::placeholder,
.honk-page input::placeholder {
opacity: 0.5;
}
/* Comfortable field widths inside full-width cards */
.honk-page .cbi-value-field .cbi-input-text,
.honk-page .cbi-value-field .cbi-input-password,
.honk-page .cbi-value-field input[type="number"],
.honk-page .cbi-value-field input[type="url"],
.honk-page .cbi-value-field input[type="text"],
.honk-page .cbi-value-field .cbi-input-select,
.honk-page .cbi-value-field select,
.honk-page .cbi-value-field input[type="file"] {
max-width: 400px;
}
.honk-page .cbi-value-field textarea,
.honk-page .cbi-value-field .cbi-input-textarea {
max-width: 640px;
}
/* 导入配置:文件选择行。原生的 file 控件在 Argon/Bootstrap 下都会被拉成
一个大盒子、内嵌按钮贴着左上角,所以隐藏它,用 label 冒充按钮。 */
.honk-page .honk-file-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
margin-top: 10px;
}
.honk-page .honk-file-pick {
display: inline-flex;
align-items: center;
cursor: pointer;
margin: 0;
white-space: nowrap;
}
.honk-page .honk-file-pick input[type="file"] {
display: none;
}
.honk-page .honk-file-name {
/* 只占自身宽度,别把「导入并启动」推到屏幕最右边 */
flex: 0 1 auto;
max-width: 40ch;
min-width: 0;
font-size: 12.5px;
color: var(--hk-muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 配置页的标签栏:一排切换,只显示当前板块 */
.honk-tabs-wrap {
margin: 4px 0 14px;
}
.honk-page .honk-tabs {
display: flex;
flex-wrap: wrap;
max-width: 100%;
}
.honk-page .honk-tabs .honk-seg-btn:disabled {
opacity: 0.32;
cursor: not-allowed;
}
/* 分段/标签控件:选中态原来用纯白药丸,深色主题下非常刺眼。
Argon 的暗色是额外加载 dark.css、不在 <html> 上留标记,所以不能靠
属性选择器区分明暗;这里统一用中性灰的半透明层次,明暗两种背景都成立,
同时把主题给 <button> 的边框和阴影压掉,保证和轨道融为一体。 */
.honk-page .honk-seg {
background: rgba(128, 128, 128, 0.18);
}
.honk-page .honk-seg-btn {
border: 0 !important;
background: transparent !important;
color: inherit;
box-shadow: none !important;
opacity: 0.7;
}
.honk-page .honk-seg-btn.is-active,
.honk-page .honk-seg-btn[aria-selected="true"] {
background: rgba(128, 128, 128, 0.38) !important;
color: inherit;
opacity: 1;
font-weight: 600;
box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.22) !important;
}
/* ---------- iOS toggle switch (boot-enabled checkbox) ---------- */
.honk-page input[type="checkbox"] {
-webkit-appearance: none;
appearance: none;
position: relative;
/* !important:Argon 用 `input[type="checkbox"]{width:1rem !important}` 强压尺寸,
不跟着加就只剩 16px,开关的圆点还会溢出成一个白球。 */
width: 46px !important;
height: 27px !important;
margin: 0;
border: 0;
border-radius: 999px;
background: rgba(128, 128, 128, 0.42);
/* 只靠底色时浅色主题和深色主题都会糊掉,加深色描边让轨道边界清楚 */
box-shadow: inset 0 0 0 1px rgba(128, 128, 128, 0.3);
background-image: none !important;
cursor: pointer;
transition: background-color 0.2s ease, opacity 0.2s ease;
flex: none;
}
/* 主题会给复选框画自己的方框与勾(Bootstrap 用 ::before/::after),
我们的 ::before 是开关圆点,所以只保留自己的,把主题的 ::after 关掉。 */
.honk-page input[type="checkbox"]::after {
content: none !important;
}
.honk-page input[type="checkbox"]::before {
content: "";
position: absolute;
/* 圆点必须完整落在轨道里:27px 高减去上下各 3px 留白 */
top: 3px;
left: 3px;
width: 21px;
height: 21px;
border-radius: 50%;
background: #fff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3), 0 0 0 0.5px rgba(0, 0, 0, 0.04);
transition: transform 0.2s ease;
}
.honk-page input[type="checkbox"]:checked {
background: var(--hk-green);
/* 挡掉主题注入的勾选图标(Argon 会给 :checked 塞一张 SVG 背景图) */
background-image: none !important;
}
.honk-page input[type="checkbox"]:checked::before {
transform: translateX(19px);
}
.honk-page input[type="checkbox"]:checked {
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
}
.honk-page input[type="checkbox"]:focus-visible {
outline: 2px solid var(--hk-accent);
outline-offset: 3px;
}
.honk-page input[type="checkbox"]:disabled {
opacity: 0.42;
cursor: not-allowed;
}
/* ---------- Segmented control (iOS style) ---------- */
.honk-seg {
display: inline-flex;
align-items: center;
gap: 2px;
padding: 3px;
border-radius: 10px;
background: rgba(128, 128, 128, 0.12);
max-width: 100%;
overflow-x: auto;
}
.honk-seg-btn {
height: 30px;
line-height: 30px;
padding: 0 14px;
border: 0;
border-radius: 8px;
background: transparent;
color: inherit;
font-family: var(--hk-font);
font-size: 12.5px;
font-weight: 500;
opacity: 0.6;
cursor: pointer;
white-space: nowrap;
transition: background-color 0.18s ease, color 0.18s ease,
opacity 0.18s ease;
}
.honk-seg-btn:hover {
opacity: 0.85;
}
.honk-seg-btn[aria-selected="true"],
.honk-seg-btn.is-active {
background: #fff;
color: #1c1c1e;
opacity: 1;
font-weight: 600;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.16), 0 0 0 0.5px rgba(0, 0, 0, 0.04);
}
.honk-seg-btn:focus-visible {
outline: 2px solid var(--hk-accent);
outline-offset: 2px;
}
/* ---------- Notes & alerts ---------- */
.honk-note {
font-size: 12.5px;
line-height: 1.55;
color: var(--hk-muted);
max-width: 72ch;
}
.honk-page .alert-message {
font-size: 12.5px;
line-height: 1.55;
padding: 10px 14px;
border-radius: var(--hk-radius-sm);
background: rgba(255, 59, 48, 0.08);
border: 1px solid rgba(255, 59, 48, 0.25);
color: inherit;
margin: 10px 0;
list-style: none;
}
.honk-page .alert-message li {
margin: 4px 0;
}
.honk-status-msg {
font-size: 12.5px;
color: var(--hk-muted);
min-height: 1.4em;
margin: 10px 0 0;
}
.honk-status-msg:empty {
margin: 0;
}
/* ---------- Disclosure (details/summary) ---------- */
.honk-page details {
margin-top: 12px;
}
.honk-page details > summary {
min-height: 36px;
padding: 8px 0;
font-size: 13px;
font-weight: 600;
cursor: pointer;
opacity: 0.85;
user-select: none;
list-style: none;
display: flex;
align-items: center;
gap: 8px;
}
.honk-page details > summary::-webkit-details-marker {
display: none;
}
.honk-page details > summary::before {
content: "";
width: 7px;
height: 7px;
border-right: 1.5px solid currentColor;
border-bottom: 1.5px solid currentColor;
transform: rotate(-45deg);
transition: transform 0.2s ease;
opacity: 0.6;
flex: none;
margin-top: -3px;
}
.honk-page details[open] > summary::before {
transform: rotate(45deg);
margin-top: 3px;
}
.honk-page details > summary:hover {
opacity: 1;
}
.honk-disclosure-danger > summary {
color: var(--hk-red);
}
/* ---------- Logs ---------- */
.honk-log-toolbar {
display: flex;
align-items: flex-end;
gap: 10px;
flex-wrap: wrap;
margin: 12px 0;
}
.honk-log-toolbar .honk-field {
padding: 0;
}
.honk-log-toolbar label {
display: grid;
gap: 5px;
min-width: min(12em, 100%);
font-size: 12px;
font-weight: 600;
opacity: 0.8;
}
.honk-log-output {
width: 100%;
min-height: 380px;
max-height: 62vh;
margin: 0;
padding: 14px 16px;
border-radius: var(--hk-radius-sm);
border: 1px solid rgba(128, 128, 128, 0.22);
background: #1a1d21;
color: #d8dde6;
overflow: auto;
white-space: pre-wrap;
overflow-wrap: anywhere;
font-family: var(--hk-mono);
font-size: 12px;
line-height: 1.55;
}
.honk-log-output .honk-log-line {
display: block;
padding: 1px 6px;
border-radius: 4px;
}
.honk-log-output .honk-log-ts {
color: #6b7480;
margin-right: 8px;
white-space: nowrap;
}
.honk-log-output .honk-log-lvl {
display: inline-block;
min-width: 40px;
padding: 0 5px;
margin-right: 8px;
border-radius: 3px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.4px;
text-align: center;
vertical-align: 1px;
}
.honk-log-output .honk-log-lvl-info {
color: #7fc7a8;
background: rgba(127, 199, 168, 0.08);
}
.honk-log-output .honk-log-lvl-warn {
color: #e8b95a;
background: rgba(232, 185, 90, 0.10);
}
.honk-log-output .honk-log-lvl-error {
color: #ea7878;
background: rgba(234, 120, 120, 0.10);
}
.honk-log-output .honk-log-lvl-debug {
color: #7a8290;
background: rgba(122, 130, 144, 0.10);
}
.honk-log-output .honk-log-lvl-trace {
color: #68717d;
background: rgba(104, 113, 125, 0.10);
}
.honk-log-output .honk-log-msg {
color: inherit;
}
.honk-log-output .honk-log-error .honk-log-msg {
color: #ea7878;
}
.honk-log-output .honk-log-warn .honk-log-msg {
color: #e8b95a;
}
.honk-log-output .honk-log-info .honk-log-msg {
color: #cfd6df;
}
.honk-log-output .honk-log-debug .honk-log-msg {
color: #7a8290;
}
.honk-log-output .honk-log-trace .honk-log-msg {
color: #68717d;
}
/* ---------- Package update rows ---------- */
.honk-pkg-row {
display: grid;
grid-template-columns: 24px 130px minmax(0, 1fr) auto auto;
gap: 10px;
align-items: center;
font-size: 12.5px;
padding: 9px 0;
border-top: 1px dashed rgba(128, 128, 128, 0.18);
}
.honk-pkg-row:first-child {
border-top: 0;
}
.honk-pkg-icon {
text-align: center;
font-size: 14px;
}
.honk-pkg-ok {
color: var(--hk-green);
}
.honk-pkg-err {
color: var(--hk-red);
}
.honk-pkg-new {
color: var(--hk-accent);
}
.honk-pkg-name {
font-weight: 600;
opacity: 0.85;
}
.honk-pkg-meta {
opacity: 0.7;
font-family: var(--hk-mono);
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.honk-up-log {
margin-top: 12px;
padding: 10px 12px;
border: 1px solid var(--hk-field-border);
border-radius: var(--hk-radius-sm);
max-height: 220px;
overflow: auto;
white-space: pre-wrap;
word-break: break-all;
font-family: var(--hk-mono);
font-size: 12px;
line-height: 1.5;
}
@media (max-width: 640px) {
.honk-pkg-row {
grid-template-columns: 24px minmax(0, 1fr);
row-gap: 4px;
}
.honk-pkg-row .honk-pkg-icon {
grid-column: 1;
grid-row: 1;
}
.honk-pkg-row .honk-pkg-name {
grid-column: 2;
grid-row: 1;
}
.honk-pkg-row .honk-pkg-meta {
grid-column: 2;
grid-row: 2;
white-space: normal;
}
.honk-pkg-row > span:nth-child(4) {
display: none;
}
.honk-pkg-row > button,
.honk-pkg-row > span:last-child {
grid-column: 2;
grid-row: 3;
justify-self: start;
}
}
/* ---------- Page actions footer ---------- */
.honk-page .cbi-page-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
background: transparent;
border: 0;
padding: 12px 0 0;
margin: 0;
}
/* ---------- Configuration page ---------- */
/* 顶部说明卡片:一眼看出"能做什么",折叠区只放真正需要确认的三条。 */
.honk-config-hero {
display: flex;
flex-direction: column;
gap: 6px;
padding: 20px 22px;
}
.honk-hero-eyebrow {
margin: 0;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--hk-muted);
}
.honk-hero-lead {
margin: 0;
font-size: 15px;
line-height: 1.55;
}
.honk-hero-points {
margin: 0;
font-size: 12.5px;
color: var(--hk-muted);
}
.honk-hero-details {
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid var(--hk-card-border);
font-size: 12.5px;
line-height: 1.6;
color: var(--hk-muted);
}
.honk-hero-details summary {
cursor: pointer;
list-style: none;
color: var(--hk-accent-border);
}
.honk-hero-details summary::-webkit-details-marker {
display: none;
}
.honk-hero-details summary::before {
content: '\25B8';
display: inline-block;
margin-right: 6px;
transition: transform 0.15s ease;
}
.honk-hero-details[open] summary::before {
transform: rotate(90deg);
}
.honk-hero-details ul {
margin: 8px 0 0;
padding-left: 18px;
max-width: 72ch;
}
/* 订阅表单:桌面两行、标签右对齐;移动端上下排列(见下方媒体查询)。 */
.honk-form-row {
display: flex;
align-items: flex-start;
gap: 14px;
margin-bottom: 12px;
}
.honk-form-label {
flex: 0 0 7.5rem;
padding-top: 8px;
font-size: 12.5px;
text-align: right;
color: var(--hk-muted);
}
.honk-form-field {
flex: 1 1 auto;
min-width: 0;
display: flex;
flex-direction: column;
gap: 6px;
}
.honk-page .honk-form-field .cbi-input-text {
width: 100%;
min-width: 0;
}
.honk-form-hint {
margin: 0;
font-size: 12px;
color: var(--hk-muted);
}
.honk-form-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
.honk-draft-note {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 10px;
}
.honk-page .honk-config-editor {
height: 46vh;
max-height: 560px;
}
/* ---------- Responsive ---------- */
@media (max-width: 640px) {
.honk-page {
max-width: 100%;
}
.honk-header h2 {
font-size: 22px;
}
.honk-card {
padding: 15px 16px;
border-radius: 12px;
}
.honk-card-head {
flex-direction: column;
align-items: stretch;
}
.honk-actions {
width: 100%;
}
.honk-actions .cbi-button {
flex: 1 1 auto;
}
.honk-log-output {
min-height: 320px;
}
}
/* ---------- Dark mode ---------- */
body.dark .honk-page,
html.dark .honk-page,
body[data-theme="dark"] .honk-page,
html[data-theme="dark"] .honk-page,
body[data-bs-theme="dark"] .honk-page,
html[data-bs-theme="dark"] .honk-page,
body[data-darkmode="1"] .honk-page,
html[data-darkmode="1"] .honk-page,
body[data-darkmode="true"] .honk-page,
html[data-darkmode="true"] .honk-page {
--hk-green: #30d158;
--hk-red: #ff453a;
--hk-orange: #ff9f0a;
--hk-card-bg: rgba(255, 255, 255, 0.04);
--hk-card-border: rgba(255, 255, 255, 0.1);
--hk-field-bg: rgba(255, 255, 255, 0.05);
--hk-field-border: rgba(255, 255, 255, 0.16);
--hk-hover: rgba(255, 255, 255, 0.08);
--hk-shadow: 0 4px 24px rgba(0, 0, 0, 0.35);
--hk-shadow-hover: 0 10px 32px rgba(0, 0, 0, 0.45);
--hk-muted: rgba(200, 210, 224, 0.6);
}
body.dark .honk-page .honk-seg-btn[aria-selected="true"],
html.dark .honk-page .honk-seg-btn[aria-selected="true"],
body[data-theme="dark"] .honk-page .honk-seg-btn[aria-selected="true"],
html[data-theme="dark"] .honk-page .honk-seg-btn[aria-selected="true"],
body[data-bs-theme="dark"] .honk-page .honk-seg-btn[aria-selected="true"],
html[data-bs-theme="dark"] .honk-page .honk-seg-btn[aria-selected="true"],
body[data-darkmode="1"] .honk-page .honk-seg-btn[aria-selected="true"],
html[data-darkmode="1"] .honk-page .honk-seg-btn[aria-selected="true"],
body[data-darkmode="true"] .honk-page .honk-seg-btn[aria-selected="true"],
html[data-darkmode="true"] .honk-page .honk-seg-btn[aria-selected="true"],
body.dark .honk-page .honk-seg-btn.is-active,
html.dark .honk-page .honk-seg-btn.is-active,
body[data-theme="dark"] .honk-page .honk-seg-btn.is-active,
html[data-theme="dark"] .honk-page .honk-seg-btn.is-active,
body[data-bs-theme="dark"] .honk-page .honk-seg-btn.is-active,
html[data-bs-theme="dark"] .honk-page .honk-seg-btn.is-active,
body[data-darkmode="1"] .honk-page .honk-seg-btn.is-active,
html[data-darkmode="1"] .honk-page .honk-seg-btn.is-active,
body[data-darkmode="true"] .honk-page .honk-seg-btn.is-active,
html[data-darkmode="true"] .honk-page .honk-seg-btn.is-active {
background: rgba(255, 255, 255, 0.22);
color: #fff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
}
body.dark .honk-page .honk-log-output,
html.dark .honk-page .honk-log-output,
body[data-theme="dark"] .honk-page .honk-log-output,
html[data-theme="dark"] .honk-page .honk-log-output,
body[data-bs-theme="dark"] .honk-page .honk-log-output,
html[data-bs-theme="dark"] .honk-page .honk-log-output,
body[data-darkmode="1"] .honk-page .honk-log-output,
html[data-darkmode="1"] .honk-page .honk-log-output,
body[data-darkmode="true"] .honk-page .honk-log-output,
html[data-darkmode="true"] .honk-page .honk-log-output {
background: rgba(0, 0, 0, 0.28);
}
/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
.honk-page .cbi-button,
.honk-page .cbi-button:active,
.honk-card,
.honk-page input[type="checkbox"],
.honk-page input[type="checkbox"]::before,
.honk-page details > summary::before {
transition: none !important;
transform: none !important;
}
}
@media (max-width: 640px) {
.honk-form-row {
flex-direction: column;
align-items: stretch;
gap: 6px;
margin-bottom: 14px;
}
.honk-form-label {
flex: none;
padding-top: 0;
text-align: left;
}
.honk-form-actions {
justify-content: stretch;
}
.honk-form-actions .cbi-button {
flex: 1 1 auto;
}
.honk-config-hero {
padding: 16px;
}
.honk-page .honk-config-editor {
height: auto;
min-height: 300px;
max-height: 60vh;
}
}