/* ==========================================================================
基础排版 & 布局骨架(v3)
- 光场 .ambient:四团色光 + 左上斜下的天光,极缓漂移(尊重 reduced-motion)
- 噪点 .grain:细颗粒,让玻璃像材质而不是纯渐变
- 侧栏/顶栏:整片玻璃(L3),与内容区背景形成"浮在上面的玻璃层"
========================================================================== */
*,*::before,*::after{box-sizing:border-box}
html,body{margin:0;padding:0}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
body{
font-family:var(--font);
font-size:14px;line-height:1.55;color:var(--ink);
background:var(--bg);
-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
text-rendering:optimizeLegibility;
min-height:100vh;overflow-x:hidden;
}
h1,h2,h3,h4,h5,p,ul,ol,dl,dd,figure{margin:0}
ul,ol{padding:0;list-style:none}
a{color:var(--accent-ink);text-decoration:none}
a:hover{text-decoration:underline;text-underline-offset:3px}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
input,select{font:inherit;color:inherit}
img{max-width:100%}
:focus-visible{outline:2px solid var(--accent-line);outline-offset:2px;border-radius:8px}
::selection{background:rgba(29,92,240,.16)}
/* 数字:等宽数字保证列对齐;小单位用自己的字号层级 */
.num{font-family:var(--font-num);font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.ta-r{text-align:right}
/* ---------- 光场(装饰层,永不承载内容) ---------- */
.ambient{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.ambient::before{
/* 从左上斜下的天光:这是"光源"本身 */
content:"";position:absolute;inset:0;
background:
radial-gradient(120% 90% at 8% -10%, rgba(255,255,255,.95) 0%, rgba(255,255,255,.35) 32%, rgba(255,255,255,0) 62%);
}
.ambient i{position:absolute;display:block;border-radius:50%;filter:blur(70px);opacity:.85;will-change:transform}
.ambient .b1{width:62vw;height:52vw;left:-16vw;top:-18vw;background:radial-gradient(circle at 40% 40%,rgba(122,167,255,.55),rgba(122,167,255,0) 68%);animation:drift1 46s ease-in-out infinite alternate}
.ambient .b2{width:48vw;height:44vw;right:-12vw;top:-14vw;background:radial-gradient(circle at 50% 50%,rgba(227,211,255,.75),rgba(227,211,255,0) 66%);animation:drift2 58s ease-in-out infinite alternate}
.ambient .b3{width:52vw;height:46vw;left:-8vw;bottom:-26vw;background:radial-gradient(circle at 50% 50%,rgba(159,240,212,.55),rgba(159,240,212,0) 66%);animation:drift3 52s ease-in-out infinite alternate}
.ambient .b4{width:46vw;height:40vw;right:-10vw;bottom:-22vw;background:radial-gradient(circle at 50% 50%,rgba(255,225,194,.7),rgba(255,225,194,0) 66%);animation:drift4 64s ease-in-out infinite alternate}
@keyframes drift1{to{transform:translate3d(6vw,4vw,0) scale(1.08)}}
@keyframes drift2{to{transform:translate3d(-5vw,6vw,0) scale(.94)}}
@keyframes drift3{to{transform:translate3d(7vw,-4vw,0) scale(1.06)}}
@keyframes drift4{to{transform:translate3d(-6vw,-5vw,0) scale(.95)}}
/* 噪点:用 SVG 湍流生成,极淡叠加 */
.grain{
position:fixed;inset:0;z-index:0;pointer-events:none;opacity:.22;mix-blend-mode:soft-light;
background-image:url("data:image/svg+xml;utf8,");
}
/* ---------- 应用骨架 ---------- */
.app{position:relative;z-index:1;display:grid;grid-template-columns:var(--sidebar) minmax(0,1fr);min-height:100vh}
/* 侧栏:整片玻璃(L3)。边缘发丝边用伪元素画成渐变,上亮下暗 */
.side{
position:sticky;top:0;height:100vh;display:flex;flex-direction:column;
padding:22px 14px 16px;
background:linear-gradient(180deg,rgba(255,255,255,.58),rgba(255,255,255,.40));
-webkit-backdrop-filter:var(--blur-3);backdrop-filter:var(--blur-3);
border-right:1px solid rgba(255,255,255,.55);
box-shadow:var(--light-top),var(--lift-1);
}
.brand{display:flex;align-items:center;gap:11px;padding:2px 10px 20px}
.brand .mark{
width:28px;height:28px;border-radius:9px;flex:none;position:relative;
background:linear-gradient(150deg,rgba(255,255,255,.95),rgba(255,255,255,.45) 55%,rgba(160,185,255,.55));
border:1px solid rgba(255,255,255,.85);
box-shadow:var(--light-top),0 6px 14px -8px rgba(32,48,90,.35),inset 0 -6px 10px -6px rgba(122,167,255,.55);
display:grid;place-items:center;font-size:12.5px;font-weight:700;color:var(--ink);
}
.brand .name{font-size:14.5px;font-weight:600;letter-spacing:.1px;line-height:1.25}
.brand .sub{font-size:11px;color:var(--ink-3);margin-top:1px}
.nav{display:flex;flex-direction:column;gap:2px}
.nav-group{font-size:11px;color:var(--ink-4);padding:16px 12px 6px;letter-spacing:.6px}
.nav a{
display:flex;align-items:center;gap:9px;position:relative;
padding:8px 12px;border-radius:11px;
color:var(--ink-2);font-size:13.5px;text-decoration:none;
border:1px solid transparent;
transition:background .16s ease,color .16s ease,border-color .16s ease;
}
.nav a svg{width:15px;height:15px;opacity:.55;flex:none;margin-left:-2px}
.nav a:hover{background:rgba(255,255,255,.42);color:var(--ink);text-decoration:none}
.nav a:hover svg{opacity:.85}
.nav a.on svg{opacity:1;color:var(--accent)}
.nav a.on{
background:linear-gradient(150deg,rgba(255,255,255,.92),rgba(255,255,255,.62));
color:var(--ink);
border-color:rgba(255,255,255,.95);
box-shadow:var(--light-top),0 6px 16px -12px rgba(32,48,90,.4);
}
.nav a.on::before{content:"";position:absolute;left:-1px;top:9px;bottom:9px;width:2px;border-radius:2px;background:var(--accent);box-shadow:var(--accent-glow)}
.nav a .cnt{margin-left:auto;font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.nav a.on .cnt{color:var(--ink-3)}
.side .foot{margin-top:auto;padding:12px 12px 0;border-top:1px solid var(--rule);font-size:11px;color:var(--ink-3);display:flex;align-items:center;gap:7px}
.dot{width:6px;height:6px;border-radius:50%;background:var(--ink-4);flex:none}
.dot.live{background:var(--ok);box-shadow:0 0 0 3px rgba(20,122,85,.14)}
.dot.syncing{background:var(--warn);animation:pulse 1.2s ease-in-out infinite}
.dot.err{background:var(--risk)}
@keyframes pulse{50%{opacity:.35}}
/* 主区 */
.main{min-width:0;display:flex;flex-direction:column}
/* 顶栏:同一片玻璃;滚动时内容从下面透过去 */
.topbar{
position:sticky;top:0;z-index:20;
display:flex;align-items:center;gap:16px;
min-height:var(--topbar);padding:0 clamp(20px,3vw,40px);
background:linear-gradient(180deg,rgba(255,255,255,.62),rgba(255,255,255,.44));
-webkit-backdrop-filter:var(--blur-3);backdrop-filter:var(--blur-3);
border-bottom:1px solid rgba(255,255,255,.6);
box-shadow:var(--light-top),0 10px 30px -24px rgba(32,48,90,.35);
}
.crumb{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink-3);min-width:0}
.crumb a{color:var(--ink-3)}
.crumb .sep{color:var(--ink-4)}
.crumb .now{color:var(--ink);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:42ch}
.topbar .tools{margin-left:auto;display:flex;align-items:center;gap:10px}
/* 搜索 */
.search{position:relative;display:flex;align-items:center}
.search svg{position:absolute;left:11px;width:15px;height:15px;color:var(--ink-3);pointer-events:none}
.search input{
width:260px;height:36px;padding:0 34px 0 34px;border-radius:11px;
border:1px solid rgba(255,255,255,.75);background:rgba(255,255,255,.42);
box-shadow:var(--light-top),inset 0 1px 2px rgba(32,48,90,.05);
font-size:13px;outline:none;transition:background .2s,border-color .2s,box-shadow .2s;
}
.search input::placeholder{color:var(--ink-3)}
.search input:focus{background:rgba(255,255,255,.86);border-color:rgba(255,255,255,.98);box-shadow:var(--light-top),0 0 0 3px var(--accent-wash),0 1px 2px rgba(32,48,90,.05)}
.search .clear{position:absolute;right:6px;width:22px;height:22px;border-radius:7px;display:grid;place-items:center;color:var(--ink-3)}
.search .clear:hover{background:rgba(24,34,56,.07)}
/* 内容区 */
.view{padding:clamp(22px,3vw,40px) clamp(20px,3vw,40px) 80px;max-width:1560px;width:100%;margin:0 auto}
.view-head{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:26px}
.view-head h1{font-size:24px;font-weight:600;letter-spacing:-.3px;line-height:1.25}
.view-head .lede{font-size:13px;color:var(--ink-3);margin-top:5px;max-width:68ch;line-height:1.65}
.view-head .aside{margin-left:auto;display:flex;gap:8px;align-items:center}
/* 区块标题 */
.sec{display:flex;align-items:baseline;gap:10px;margin:34px 0 12px}
.sec:first-child{margin-top:0}
.sec h2{font-size:15px;font-weight:600;letter-spacing:.1px}
.sec .hint{font-size:12px;color:var(--ink-3)}
.sec .more{margin-left:auto;font-size:12.5px}
/* ---------- 玻璃基元 ----------
* .glass 是最小的玻璃面板:半透明白 + 背景模糊 + 发丝边 + 顶部内高光 + 极浅影。
* 发丝边用双层背景实现:第一层画在 border-box 上做 1px 渐变边(上亮下暗),
* 第二层是面板本体(稍微内缩),形成"边缘折光"的感觉。 */
.glass{
position:relative;
background:
var(--edge) border-box;
border:1px solid transparent;
border-radius:var(--r-lg);
-webkit-backdrop-filter:var(--blur-2);backdrop-filter:var(--blur-2);
box-shadow:var(--light-top),var(--lift-1);
}
/* 用 ::before 叠加一层半透明本体,避免 border-box 渐变把整块染色 */
.glass::before{
content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;
background:var(--glass-2);
z-index:-1;
}
.glass > *{position:relative}
.panel{
position:relative;border-radius:var(--r-lg);overflow:hidden;
background:var(--glass-1);
-webkit-backdrop-filter:var(--blur-1);backdrop-filter:var(--blur-1);
border:1px solid rgba(255,255,255,.6);
box-shadow:var(--light-top),var(--lift-1);
}
.panel::after{
/* 上亮下暗的边缘:顶部一条细高光,底部一条极淡暗边 */
content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
background:linear-gradient(180deg,rgba(255,255,255,.28),rgba(255,255,255,0) 18%,rgba(255,255,255,0) 82%,rgba(255,255,255,.12));
box-shadow:inset 0 -1px 0 rgba(32,48,90,.05);
}
.panel-pad{padding:20px 22px}
.panel-head{display:flex;align-items:center;gap:10px;padding:14px 22px;border-bottom:1px solid var(--rule)}
.panel-head h3{font-size:13.5px;font-weight:600}
.panel-head .hint{margin-left:auto;font-size:12px;color:var(--ink-3)}
/* 通用文字 */
.muted{color:var(--ink-3)}
.dim{color:var(--ink-2)}
.tiny{font-size:12px}
.mono-num{font-family:var(--font-num);font-variant-numeric:tabular-nums}
/* 移动端菜单按钮 */
.menu-btn{display:none;width:36px;height:36px;border-radius:11px;border:1px solid rgba(255,255,255,.8);background:rgba(255,255,255,.45);box-shadow:var(--light-top);place-items:center}
.menu-btn svg{width:18px;height:18px}
.scrim{display:none}
/* ---------- 降级:不支持 backdrop-filter 时,玻璃退回"高亮度磨砂纸" ---------- */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
.panel{background:rgba(255,255,255,.80)}
.side,.topbar{background:rgba(255,255,255,.86)}
.ambient{opacity:.6}
}
/* 台账定位:?focus= 时高亮那一行,并在结果区上方给出"你在找这条"的说明 */
.focus-note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px;padding:10px 14px;border-radius:12px;background:var(--accent-wash);box-shadow:inset 0 0 0 1px rgba(29,92,240,.16);font-size:12.5px;color:var(--ink-2)}
.focus-note b{color:var(--accent-ink)}
.tbl tbody tr.focus-on td{animation:focusRow 2.4s ease-out}
@keyframes focusRow{0%,40%{background:rgba(29,92,240,.13)}100%{background:transparent}}