统一 Airshelf 界面组件与图标

This commit is contained in:
iye
2026-05-27 12:29:41 +08:00
parent ea335587d2
commit 086d92991e
47 changed files with 750 additions and 450 deletions
+64 -14
View File
@@ -1,5 +1,5 @@
/* ============================================================
流·Studio · Restraint V2.1 · Firecrawl-aligned · 纯净版
Airshelf · Restraint V2.1 · Firecrawl-aligned · 纯净版
============================================================
严格遵循 DESIGN_SPEC_V2.md V2.1 · 不含任何 V1/V2 legacy alias
============================================================ */
@@ -115,11 +115,11 @@
--r-pill: 999px;
/* ===== Font · 关键:--font-mono 必须含 PuHuiTi 中文 fallback ===== */
/* Inter / JetBrains Mono 都不含 CJK 字形。
/* Inter 不含 CJK 字形。
字体链按字符级 fallthrough,中文字符会找下一个候选 —— 必须包含 PuHuiTi。 */
--font-sans: 'Inter', 'Alibaba PuHuiTi', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
--font-inter: 'Inter', system-ui, sans-serif;
--font-mono: 'JetBrains Mono', 'Geist Mono', ui-monospace, 'Alibaba PuHuiTi', 'PingFang SC', 'Microsoft YaHei', monospace;
--font-mono: 'Inter', 'Alibaba PuHuiTi', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
/* ===== Transition ===== */
--t-fast: 100ms ease;
@@ -161,6 +161,52 @@ button { font: inherit; cursor: pointer; border: 0; background: none; color: inh
input, textarea, select { font: inherit; color: inherit; outline: none; }
img, svg, video { display: block; max-width: 100%; }
/* ─── Icon system · Lucide-line only ─── */
:root {
--icon-stroke: 1.5;
--icon-xs: 12px;
--icon-s: 14px;
--icon-m: 16px;
--icon-l: 20px;
--icon-xl: 24px;
}
.ui-icon {
width: var(--icon-m);
height: var(--icon-m);
flex: 0 0 auto;
display: block;
fill: none;
stroke: currentColor;
stroke-width: var(--icon-stroke);
stroke-linecap: round;
stroke-linejoin: round;
}
.ui-icon * { vector-effect: non-scaling-stroke; }
.ui-icon [stroke="none"] {
fill: currentColor;
stroke: none;
}
:where(nav a, .search-box, .balance-chip, .queue-chip, .icon-btn, .btn, .chip, .toolbar, .page-head, .toast, .modal, .drawer, .card-del-btn, .row-more, .gen-img-btn, .shortcut, .empty-state) svg:not(.corner):not(.quote-icon) {
flex: 0 0 auto;
fill: none;
stroke: currentColor;
stroke-width: var(--icon-stroke);
stroke-linecap: round;
stroke-linejoin: round;
}
:where(nav a, .search-box, .balance-chip, .queue-chip, .icon-btn, .btn, .chip, .toolbar, .page-head, .toast, .modal, .drawer, .card-del-btn, .row-more, .gen-img-btn, .shortcut, .empty-state) svg:not(.corner):not(.quote-icon) [fill="currentColor"] {
fill: none;
stroke: currentColor;
}
:where(nav a, .search-box, .balance-chip, .queue-chip, .icon-btn, .btn, .chip, .toolbar, .page-head, .toast, .modal, .drawer, .card-del-btn, .row-more, .gen-img-btn, .shortcut, .empty-state) svg:not(.corner):not(.quote-icon) [stroke="none"] {
fill: currentColor;
stroke: none;
}
.row-more svg circle {
fill: currentColor !important;
stroke: none !important;
}
.num, .tnum { font-variant-numeric: tabular-nums; }
.mono { font-family: var(--font-mono); }
.muted { color: var(--black-alpha-56); }
@@ -185,8 +231,8 @@ aside.sidebar {
overflow-y: auto;
}
.brand { display: flex; align-items: center; gap: 10px; padding: 6px 8px 16px; }
.flame { width: 22px; height: 22px; color: var(--heat); }
.flame svg { width: 100%; height: 100%; }
.brand-mark, .flame { width: 22px; height: 22px; color: var(--heat); }
.brand-mark svg, .flame svg { width: 100%; height: 100%; }
.brand .name { font-weight: 600; font-size: 18px; letter-spacing: -.012em; color: var(--accent-black); }
/* sidebar search · Ctrl K Inter Bold 平铺 */
@@ -203,7 +249,7 @@ aside.sidebar {
}
.search-box:hover { border-color: var(--black-alpha-24); }
.search-box:focus-within { border-color: var(--heat-40); box-shadow: inset 0 0 0 1px var(--heat-40); }
.search-box svg { width: 14px; height: 14px; flex-shrink: 0; color: var(--black-alpha-56); }
.search-box svg { width: var(--icon-m); height: var(--icon-m); flex-shrink: 0; color: var(--black-alpha-56); }
.search-box input {
flex: 1; min-width: 0;
border: 0; background: transparent;
@@ -242,7 +288,7 @@ nav a {
}
nav a:hover { background: var(--black-alpha-4); color: var(--accent-black); }
nav a.active { background: var(--heat-12); color: var(--heat); }
nav a svg { width: 14px; height: 14px; opacity: .85; }
nav a svg { width: var(--icon-m); height: var(--icon-m); opacity: .85; }
nav a.active svg { opacity: 1; }
nav a .pill-mini {
margin-left: auto;
@@ -330,20 +376,20 @@ main { position: relative; background: var(--background-base); min-width: 0; }
}
.balance-chip:hover { background: var(--black-alpha-4); border-color: var(--black-alpha-24); }
.balance-chip strong { color: var(--accent-black); font-weight: 600; font-variant-numeric: tabular-nums; }
.balance-chip svg { width: 13px; height: 13px; color: var(--heat); }
.balance-chip svg { width: var(--icon-m); height: var(--icon-m); color: var(--heat); }
.icon-btn {
width: 36px; height: 36px;
display: flex; align-items: center; justify-content: center;
background: var(--surface);
border: 1px solid var(--border-faint);
border-radius: var(--r-md);
border-radius: var(--r-pill);
color: var(--black-alpha-56);
cursor: pointer;
position: relative;
transition: background var(--t-base), border-color var(--t-base), color var(--t-base);
}
.icon-btn:hover { background: var(--black-alpha-4); color: var(--accent-black); border-color: var(--black-alpha-24); }
.icon-btn svg { width: 15px; height: 15px; }
.icon-btn svg { width: var(--icon-m); height: var(--icon-m); }
.icon-btn .dot-noti {
position: absolute; top: 8px; right: 9px;
width: 7px; height: 7px; border-radius: 50%;
@@ -376,7 +422,7 @@ main { position: relative; background: var(--background-base); min-width: 0; }
}
.queue-chip:hover { background: var(--black-alpha-4); border-color: var(--black-alpha-24); }
.queue-chip[hidden] { display: none; }
.queue-chip svg { width: 14px; height: 14px; color: var(--black-alpha-56); }
.queue-chip svg { width: var(--icon-m); height: var(--icon-m); color: var(--black-alpha-56); }
.queue-chip .count {
display: inline-flex; align-items: center; justify-content: center;
height: 20px; min-width: 20px; padding: 0 6px;
@@ -441,7 +487,8 @@ main { position: relative; background: var(--background-base); min-width: 0; }
padding: 0 20px;
font-size: 13.5px;
}
.page-head .actions > .btn svg { width: 14px; height: 14px; }
.page-head .actions > .btn svg { width: var(--icon-s); height: var(--icon-s); }
.page-head .actions > .btn.btn-create svg { width: var(--icon-m); height: var(--icon-m); }
.section-h { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 14px; }
.section-h h2 { font-size: 16px; font-weight: 600; letter-spacing: -.01em; color: var(--accent-black); }
@@ -482,7 +529,7 @@ main { position: relative; background: var(--background-base); min-width: 0; }
background: var(--black-alpha-5);
border-color: var(--black-alpha-12);
}
.btn svg { width: 13px; height: 13px; }
.btn svg { width: var(--icon-s); height: var(--icon-s); }
.btn[hidden] { display: none; }
.btn-primary {
@@ -1588,7 +1635,10 @@ table.t tbody tr:hover { background: var(--black-alpha-4); }
.product-card:has(.tri-missing-badge:hover),
.product-card:has(.tri-missing-badge:focus-within),
.asset-card:has(.tri-missing-badge:hover),
.asset-card:has(.tri-missing-badge:focus-within) {
.asset-card:has(.tri-missing-badge:focus-within),
.asset-card-2:has(.tri-missing-badge:hover),
.asset-card-2:has(.tri-missing-badge:focus-within) {
overflow: visible;
z-index: 5;
position: relative;
}