/* 平移自 design-preview/prototype.html（界面真相源）。差异仅四处：
   1. @font-face 指向 /fonts/（Vite public 目录）
   2. body/.win 从「演示画布」改为全窗应用（无渐变底、无 zoom、无圆角投影）
   3. 交通灯由装饰 <i> 改为可点 <button>，登录配图高度自适应窗口
   4. dock 区用 Progressive blur：列表底部多层渐进模糊做过渡（原型是 mask 渐隐 + 单一 blur） */
@font-face{font-family:"SN Pro";font-style:normal;font-weight:100 900;font-display:swap;
  src:url("/fonts/SNPro-Variable.woff2") format("woff2")}
@font-face{font-family:"SN Pro";font-style:italic;font-weight:100 900;font-display:swap;
  src:url("/fonts/SNPro-VariableItalic.woff2") format("woff2")}
/* 思源宋体 Noto Serif SC（SIL OFL）。拉丁 / 拼音 / 简体分文件、分家族：
   缺字落到下一家族，而不是在同一个家族里画出豆腐块。正文 400，标题 600。 */
@font-face{font-family:"Noto Serif SC Latin";font-style:normal;font-weight:400;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-latin-400.woff2") format("woff2")}
@font-face{font-family:"Noto Serif SC Latin";font-style:normal;font-weight:600;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-latin-600.woff2") format("woff2")}
@font-face{font-family:"Noto Serif SC Ext";font-style:normal;font-weight:400;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-latin-ext-400.woff2") format("woff2")}
@font-face{font-family:"Noto Serif SC Ext";font-style:normal;font-weight:600;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-latin-ext-600.woff2") format("woff2")}
@font-face{font-family:"Noto Serif SC";font-style:normal;font-weight:400;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-sc-400.woff2") format("woff2")}
@font-face{font-family:"Noto Serif SC";font-style:normal;font-weight:600;font-display:swap;
  src:url("/fonts/reading/NotoSerifSC-sc-600.woff2") format("woff2")}
:root{
  /* 深色分两档：--text 界面，--ink-read 长文。底用炭色而非纯黑，减轻反极性光渗。
     正文 #e8e4dc / #1c1b19 ≈ APCA Lc -89（流畅阅读档 90，旧纯黑方案只有 -74） */
  --bg-page:#121110; --bg-win:#1c1b19; --text:#eeeae4; --text-2:#b0aaa0; --text-3:#8d887f; --ink-read:#e8e4dc;
  --hairline:rgba(255,255,255,.09); --hover:rgba(255,255,255,.045);
  /* 全站零饱和：accent = 中性最亮档（Radix Sand 12），--accent-fg 是铺在 accent 底上的前景 */
  --accent:#eeeeec; --accent-fg:#111110;
  /* 唯一一处色相例外：dock 选中格文字/图标。黄要暖档（≈50°），柠檬相（#fef115，56.7°）已点名否决 */
  --dock-on:#ffd60a;
  --sb:rgba(255,255,255,.22);
  /* Liquid Glass（HIG Materials）两档：--glass 给文字多的容器（regular，靠模糊+压暗保清晰），
     --pill 给浮在内容上的瞬时控件（clear，更透、优先露出背后内容）；--press 是按压时的着色填充 */
  --glass:linear-gradient(180deg,rgba(48,48,48,.68),rgba(24,24,24,.74));
  --glass-edge:rgba(255,255,255,.12); --glass-hi:rgba(255,255,255,.3);
  --pill:linear-gradient(180deg,rgba(255,255,255,.13),rgba(255,255,255,.03) 55%,rgba(255,255,255,.08));
  --pill-edge:rgba(255,255,255,.22);
  --pill-sh:inset 0 1px 0 rgba(255,255,255,.36),inset 0 -1px 0 rgba(0,0,0,.2),0 10px 28px rgba(0,0,0,.35);
  --pill-blur:blur(18px) saturate(2);
  --press:rgba(255,255,255,.16); --solid:#2a2926; --scrim-bg:rgba(0,0,0,.38);
  /* 内容层的卡片底（不是玻璃：无模糊、无折射，只是比纸面重一档的填充） */
  --card:rgba(255,255,255,.028); --card-line:rgba(255,255,255,.17);
  --bar:linear-gradient(180deg,rgba(30,30,30,.86),rgba(16,16,16,.8));
  /* 界面字号对齐 macOS 刻度：11 说明 / 13 控件 / 15 行标题（正文排版另走 --fs） */
  --t-cap:11px; --t-ctl:13px; --t-row:15px;
  --fs:19px; --lh:1.8; --measure:34em;
  /* 拉丁两边都是 SN Pro。汉字按本机挑：Mac 苹方，Windows 微软雅黑。
     system-ui 放最后——它在 Windows 上是 Segoe，不含汉字。 */
  --ff:"SN Pro","PingFang SC","Microsoft YaHei UI","Microsoft YaHei","Segoe UI",system-ui,sans-serif;
  /* 无衬线长文比界面松一档：Mac 仍是苹方；Windows 用等线（屏幕黑体），雅黑垫底 */
  --ff-sans:"SN Pro","PingFang SC","DengXian","Microsoft YaHei",sans-serif;
  /* 衬线长文是内嵌思源宋体。缺字：Mac 宋体-简，Windows SimSun（宋体-简 / 华文宋体这边没有） */
  --ff-read:"Noto Serif SC Latin","Noto Serif SC Ext","Noto Serif SC","Songti SC","Source Han Serif SC","STSong","SimSun",serif;
}
body.light{
  /* 纸色而非纯白：把适应亮度从最亮档挪开，墨色跟着压暗，正文对比仍停在 Lc 89.5 */
  --bg-page:#ebe9e4; --bg-win:#f4f3f1; --text:#2c2b28; --text-2:#7a7872; --text-3:#a39e95; --ink-read:#3a3936;
  --hairline:rgba(0,0,0,.09); --hover:rgba(0,0,0,.035); --sb:rgba(0,0,0,.2);
  --accent:#21201c; --accent-fg:#fdfdfc;
  --dock-on:#7a5c00; /* 同色相压深：亮黄在浅色轨道上只有 1.24:1，这档约 5.5:1 */
  --glass:linear-gradient(180deg,rgba(255,255,255,.92),rgba(252,252,251,.86));
  --glass-edge:#fff; --glass-hi:#fff;
  --pill:linear-gradient(180deg,#fff,rgba(255,255,255,.75));
  --pill-edge:#fff;
  --pill-sh:inset 0 1px 0 #fff,0 10px 28px rgba(0,0,0,.16);
  --press:rgba(0,0,0,.07); --solid:#fff; --scrim-bg:rgba(28,25,20,.22);
  --card:#fbfaf8; --card-line:rgba(0,0,0,.16);
  --bar:linear-gradient(180deg,rgba(255,255,255,.9),rgba(252,252,251,.8));
  color-scheme:light; /* 原生控件（下拉弹层、滚动条、密码显隐）跟着换亮色板 */
}
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}
body{background:var(--bg-win);overflow:hidden;color:var(--text);font-family:var(--ff);color-scheme:dark}
svg{stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
/* 滚动条：槽位常驻（滚动时不引起布局跳动），滑块静止时透明、滚动中点亮，停下后淡出 */
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background-color:transparent;background-clip:content-box;
  border:2px solid transparent;border-radius:99px;transition:background-color .45s}
.sb::-webkit-scrollbar-thumb{background-color:var(--sb)}

.win{width:100%;height:100%;background:var(--bg-win);display:flex;flex-direction:column;position:relative;overflow:hidden}

/* ===== 标题栏 = Tahoe 式统一工具栏：玻璃浮在内容层之上，列表从其下滚过 ===== */
.titlebar{position:absolute;top:0;left:0;right:0;height:38px;display:flex;align-items:center;user-select:none;z-index:22;
  background:var(--bar);backdrop-filter:blur(14px) saturate(1.6);-webkit-backdrop-filter:blur(14px) saturate(1.6);
  box-shadow:inset 0 -1px 0 var(--hairline)}
/* 滚动边缘效应（HIG Scroll Edge Effects）：行接近工具栏时先淡出再消失。
   这里刻意不用第二层 backdrop-filter——它会把 .scrim 的 backdrop 采样整段打断（弹窗背景不再模糊） */
.tb-edge{position:absolute;top:38px;left:0;right:0;height:26px;z-index:21;pointer-events:none;
  background:linear-gradient(180deg,var(--bg-win),transparent);
  transition:opacity .25s,visibility .25s}
.tb-edge.gone{opacity:0;visibility:hidden}
.tl{display:flex;gap:8px;padding:0 14px 0 16px;align-items:center;flex:none}
.tl-btn{width:12px;height:12px;border-radius:50%;border:none;padding:0;cursor:pointer;display:block}
.tl-btn:hover{filter:brightness(1.12)}
.tl .r{background:#ff5f57}.tl .y{background:#febc2e}.tl .g{background:#28c840}
.tb-left{display:flex;align-items:center;gap:8px}
.brand-dot{width:13px;height:13px;border-radius:50%;
  background:conic-gradient(from 210deg,var(--accent),var(--text-2),var(--accent))}
.tb-name{font-size:var(--t-cap);color:var(--text-2);letter-spacing:.05em}
.tb-drag{flex:1;height:100%}
.tb-icon{width:30px;height:26px;display:grid;place-items:center;color:var(--text-3);border-radius:6px;cursor:pointer;margin-right:2px}
.tb-icon:hover{background:var(--hover);color:var(--text)}
.tb-icon.spin svg{animation:spin .8s linear}
@keyframes spin{to{transform:rotate(360deg)}}

/* ===== 登录页 · 纸面双栏 ===== */
.login{position:absolute;inset:38px 0 0 0;background:var(--bg-win);z-index:30;overflow:hidden;
  transition:opacity .45s,visibility .45s}
.login.gone{opacity:0;visibility:hidden;pointer-events:none}
.lg-inner{position:absolute;inset:0;max-width:880px;margin:0 auto;display:flex;align-items:center;gap:44px;padding:40px 48px 40px 44px}
.lg-fig{flex:1.15;min-width:0;align-self:stretch;margin:0;border-radius:16px;overflow:hidden;
  border:1px solid var(--hairline);box-shadow:0 24px 60px rgba(0,0,0,.28)}
.lg-fig img{display:block;width:100%;height:100%;object-fit:cover}
.lg-side{flex:none;width:344px;max-width:100%}
.lg-copy h1{font-size:24px;font-weight:650;line-height:1.45;letter-spacing:.01em}
.lg-card{margin-top:18px;background:var(--lg-card,#131313);border:1px solid var(--hairline);
  border-radius:14px;padding:22px;box-shadow:0 14px 40px rgba(0,0,0,.22)}
body.light .lg-card{--lg-card:#fff;box-shadow:0 14px 40px rgba(0,0,0,.08)}
.lg-tabs{display:flex;padding:3px;border-radius:9px;background:var(--hover);margin-bottom:18px}
.lg-tabs button{flex:1;height:30px;border:none;border-radius:7px;font-size:var(--t-ctl);background:transparent;
  color:var(--text-2);cursor:pointer;font-family:inherit}
.lg-tabs button.on{background:var(--lg-tabon,#2a2a2a);color:var(--text);box-shadow:0 1px 3px rgba(0,0,0,.25)}
body.light .lg-tabs button.on{--lg-tabon:#fff}
.lg-hi{font-size:17px;font-weight:650}
.lg-hi-sub{margin-top:6px;font-size:var(--t-cap);line-height:1.7;color:var(--text-2)}
.lg-form{margin-top:18px;display:flex;flex-direction:column;gap:13px}
.lg-lab{display:block;margin-bottom:6px;font-size:var(--t-cap);letter-spacing:.06em;color:var(--text-2)}
.lg-field input{width:100%;height:40px;padding:0 12px;border-radius:8px;background:var(--lg-input,#1b1b1b);
  border:1px solid transparent;color:var(--text);font-size:var(--t-ctl);outline:none;font-family:inherit}
body.light .lg-field input{--lg-input:#f4f3f0}
.lg-field input:focus{border-color:var(--accent)}
.lg-field.bad input{border-color:#e05d52}
.lg-err{font-size:var(--t-cap);color:#e05d52}
.lg-submit{height:40px;margin-top:4px;border:none;border-radius:8px;background:var(--accent);color:var(--accent-fg);
  font-size:var(--t-ctl);font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;font-family:inherit}
.lg-submit:hover{filter:brightness(1.1)}
.lg-submit[disabled]{opacity:.7;pointer-events:none}
.lg-submit .spin{display:none;width:12px;height:12px;border-radius:50%;border:1.6px solid rgba(128,128,128,.5);
  border-top-color:currentColor;animation:spin .7s linear infinite}
.lg-submit.busy .spin{display:block}

/* ===== 启动遮罩（鉴权完成前盖住空文库，之下是文库、之上是登录页） ===== */
.boot{position:absolute;inset:38px 0 0 0;background:var(--bg-win);z-index:25;display:grid;place-items:center;
  transition:opacity .25s,visibility .25s}
.boot.gone{opacity:0;visibility:hidden;pointer-events:none}
.boot-spin{width:18px;height:18px;border-radius:50%;border:2px solid var(--hairline);
  border-top-color:var(--accent);animation:spin .8s linear infinite}

/* ===== 文库 ===== */
.stage{flex:1;overflow:hidden;display:flex;flex-direction:column}
/* 列表底部不再用 mask 透明渐隐，由 .dock-blur 渐进模糊层接管过渡 */
.stage.hide{display:none}
.page{display:none;flex:1;overflow-y:auto;padding:80px 80px 110px}
.page.show{display:block;position:relative}
.row{height:52px;display:flex;align-items:center;gap:12px;margin:0 -80px;padding:0 92px;border-bottom:1px solid var(--hairline);position:relative;cursor:pointer}
/* 待读分隔线收在内容区（页边 80px）内，hover 底色仍通栏 */
.page[data-page="todo"] .row{border-bottom:none}
.page[data-page="todo"] .row::after{content:"";position:absolute;left:80px;right:80px;bottom:0;height:1px;background:var(--hairline)}
.row:hover{background:var(--hover)}
.row .dot{width:5px;height:5px;border-radius:50%;background:var(--accent);flex:none}
.row .tg{flex:none;color:var(--text-3);display:grid;place-items:center}
.row .t{font-size:var(--t-row);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row .meta{margin-left:auto;font-size:var(--t-cap);color:var(--text-3);flex:none}
/* 动作位静息态就占住两枚按钮的宽度（58px）只藏不见：hover 才 display 会让长标题
   向内重排省略号。右对齐是让只有一枚删除按钮的已读行也贴右沿，与其它行截断点一致 */
.row .acts{margin-left:auto;display:flex;gap:2px;min-width:58px;justify-content:flex-end;visibility:hidden}
.row .meta+.acts{margin-left:10px}
.row:hover .acts{visibility:visible}
.page[data-page="trash"] .row.dim{cursor:default}
.icon-btn{color:var(--text-3);cursor:pointer;display:grid;place-items:center;width:28px;height:28px;border-radius:7px}
.icon-btn:hover{color:var(--text);background:var(--hover)}
.row.dim .t{color:var(--text-3)}
/* ===== 页首工具条：标题 + 计数在左、批量动作右钉（对标 Finder 回收站的文字按钮）。
   静息三枚按钮同权，只有不可逆的那枚在 hover 露危险色 ===== */
.phead{display:flex;align-items:center;gap:12px;padding:2px 0 11px;border-bottom:1px solid var(--hairline)}
.ph-label{font-size:var(--t-cap);letter-spacing:.12em;color:var(--text-3);font-variant-numeric:tabular-nums}
.ph-btn{margin-left:auto;flex:none;font-family:inherit;font-size:var(--t-cap);letter-spacing:.06em;
  color:var(--text-2);padding:4px 12px;border-radius:99px;border:1px solid var(--hairline);
  background:transparent;cursor:pointer;transition:color .18s,border-color .18s,background .18s}
.ph-btn:hover{color:var(--text);border-color:var(--card-line);background:var(--hover)}
.ph-btn:active{background:var(--press)}
.ph-btn.danger:hover{color:#e05d52;border-color:rgba(224,93,82,.5)}
body.light .ph-btn.danger:hover{color:#c42b1c;border-color:rgba(196,43,28,.45)}
/* 回收站分段标题：两类内容都在时才出现，只有一类时这个标题是多余的 */
.tsec{font-size:var(--t-cap);letter-spacing:.12em;color:var(--text-3);padding:18px 0 2px}
.empty{position:absolute;left:0;right:0;top:38px;bottom:110px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
.empty svg{color:var(--text-3);opacity:.4;stroke-width:1.1}
.empty .e-t{font-size:var(--t-ctl);color:var(--text-2);margin-top:16px}

/* 灵感卡：从通栏发丝线行改成圆角分块卡片，卡片底比纸面重一档，玻璃一律不上内容层 */
.icards{display:flex;flex-direction:column;gap:10px;margin-top:14px}
.idea{padding:15px 17px;border:1px solid var(--hairline);border-radius:13px;background:var(--card);
  position:relative;transition:border-color .18s}
.idea:hover{border-color:var(--card-line)}
/* 播放条正拿着这条：边框提到 --text-3，进度和时间只在播放条上，卡上不再出现 */
.idea.playing{border-color:var(--text-3)}
.idea .txt{font-size:var(--t-row);line-height:1.7;padding-right:96px;overflow-wrap:anywhere}
.idea .txt[contenteditable="true"]{outline:1px solid var(--accent);outline-offset:6px;border-radius:4px}
.idea .foot{display:flex;align-items:center;gap:10px;margin-top:9px;font-size:var(--t-cap);color:var(--text-2)}
.idea .src.link:hover{color:var(--accent);cursor:pointer}
.idea .right{margin-left:auto;display:flex;align-items:center;gap:9px;color:var(--text-3);font-size:var(--t-cap);font-variant-numeric:tabular-nums}
.idea .play{display:grid;place-items:center;width:22px;height:22px;border:1px solid var(--hairline);border-radius:50%;color:var(--text-2);cursor:pointer}
.idea .playing .play{border-color:var(--text-3);color:var(--text)}
.idea .acts{position:absolute;right:12px;top:12px;display:flex;gap:2px;opacity:0;visibility:hidden;transition:opacity .15s,visibility .15s}
.idea:hover .acts{opacity:1;visibility:visible}

/* ===== dock 渐进模糊（Progressive blur）：列表滑入 dock 区域时逐级变糊再消失。
   单一 backdrop-filter 做不出强度渐变，用 4 层切片纵向拼接（上弱下强、羽化交叠），
   最下一层是底色托底，保证窗口底沿干净。阅读页打开时随 dock 一起淡出。 ===== */
.dock-blur{position:absolute;left:0;right:0;bottom:0;height:200px;z-index:15;
  pointer-events:none;transition:opacity .25s,visibility .25s}
.dock-blur.gone{opacity:0;visibility:hidden}
.dock-blur>div{position:absolute;inset:0}
.dock-blur>div:nth-child(1){backdrop-filter:blur(2px) saturate(1.4);-webkit-backdrop-filter:blur(2px) saturate(1.4);
  -webkit-mask-image:linear-gradient(to bottom,transparent 0%,#000 16%,#000 30%,transparent 44%);
  mask-image:linear-gradient(to bottom,transparent 0%,#000 16%,#000 30%,transparent 44%)}
.dock-blur>div:nth-child(2){backdrop-filter:blur(5px) saturate(1.5);-webkit-backdrop-filter:blur(5px) saturate(1.5);
  -webkit-mask-image:linear-gradient(to bottom,transparent 30%,#000 44%,#000 56%,transparent 70%);
  mask-image:linear-gradient(to bottom,transparent 30%,#000 44%,#000 56%,transparent 70%)}
.dock-blur>div:nth-child(3){backdrop-filter:blur(11px) saturate(1.6);-webkit-backdrop-filter:blur(11px) saturate(1.6);
  -webkit-mask-image:linear-gradient(to bottom,transparent 56%,#000 70%,#000 80%,transparent 92%);
  mask-image:linear-gradient(to bottom,transparent 56%,#000 70%,#000 80%,transparent 92%)}
.dock-blur>div:nth-child(4){backdrop-filter:blur(22px) saturate(1.7);-webkit-backdrop-filter:blur(22px) saturate(1.7);
  -webkit-mask-image:linear-gradient(to bottom,transparent 80%,#000 93%,#000 100%);
  mask-image:linear-gradient(to bottom,transparent 80%,#000 93%,#000 100%)}
.dock-blur>div:nth-child(5){background:linear-gradient(to bottom,transparent 52%,var(--bg-win) 94%)}

/* ===== 底部 dock · iOS 相机模式切换 =====
   轨道是实色底（不折射、无渐强透镜），选中项才是 Liquid Glass：一圈受光亮边 + 极淡提亮。
   切页时透镜带弹性滑动。 */
.dock{position:absolute;left:50%;bottom:20px;transform:translateX(-50%);display:flex;gap:2px;padding:4px;
  border-radius:99px;background:rgba(38,38,38,.92);border:1px solid rgba(255,255,255,.14);
  box-shadow:0 18px 40px rgba(0,0,0,.5),0 4px 12px rgba(0,0,0,.32);
  z-index:20;transition:opacity .25s,visibility .25s}
body.light .dock{background:rgba(0,0,0,.055);border-color:rgba(0,0,0,.08);
  box-shadow:0 18px 40px rgba(0,0,0,.12),0 4px 12px rgba(0,0,0,.05)}
.dock.gone{opacity:0;visibility:hidden}
/* 透镜边缘：一整圈均匀描边是「画上去的圈」，玻璃的边只有受光的顶沿亮、两侧和下沿渐隐 */
.thumb{position:absolute;top:4px;left:4px;height:calc(100% - 8px);width:0;border-radius:99px;pointer-events:none;
  background:linear-gradient(180deg,rgba(255,255,255,.15),rgba(255,255,255,.05));
  backdrop-filter:blur(10px) saturate(1.7);-webkit-backdrop-filter:blur(10px) saturate(1.7);
  border:1px solid transparent;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.32),inset 0 1px 0 rgba(255,255,255,.55),
    inset 0 -1px 0 rgba(0,0,0,.3),0 0 14px rgba(255,255,255,.08),0 3px 10px rgba(0,0,0,.35);
  transition:left .5s cubic-bezier(.32,1.35,.45,1),width .5s cubic-bezier(.32,1.35,.45,1);z-index:1}
body.light .thumb{background:linear-gradient(180deg,#fff,rgba(255,255,255,.86));
  box-shadow:inset 0 1px 0 #fff,inset 0 0 0 1px rgba(255,255,255,.9),0 2px 8px rgba(0,0,0,.18)}
.dock button{border:none;background:transparent;color:var(--text-2);height:34px;font-size:var(--t-ctl);
  font-weight:500;letter-spacing:.08em;padding:0 22px;border-radius:99px;cursor:pointer;position:relative;z-index:1;
  display:flex;align-items:center;gap:6px;transition:color .3s;font-family:inherit}
.dock button:hover{color:var(--text)}
/* 选中只改色不改字重：字重会变宽，邻居跟着抖，透镜量到的宽度就对不上了。
   .active 排在 :hover 之后（同权重，后写先生效）：选中项 hover 时不被提回中性色 */
/* 选中改色相：全站唯一一处，文字与图标（currentColor）一起转 --dock-on；hover 仍只提亮文字 */
.dock button.active{color:var(--dock-on)}
/* 图标静息比文字弱一档，hover / 选中才与文字同强 */
.dock button svg{opacity:.7;transition:opacity .3s}
.dock button:hover svg,.dock button.active svg{opacity:1}

/* ===== 阅读页：零界面 ===== */
.reader{position:absolute;top:38px;left:0;right:0;bottom:0;background:var(--bg-win);
  overflow-y:auto;display:none}
.reader.show{display:block}
.article{max-width:var(--measure);margin:0 auto;padding:6px 0 25vh;font-family:var(--ff-sans);
  /* 禁止假粗：Windows 的等线/雅黑/宋体没有 480 这一档，描粗会发糊。
     Mac 的苹方和 SN Pro 是可变字体，480 仍是真字重。
     正文用次像素抗锯齿：Mac 默认的灰度平滑会把笔画磨细，Windows 则保持 ClearType */
  font-synthesis:none;-webkit-font-smoothing:subpixel-antialiased}
/* 悬浮返回 + 翻译：占住顶上一条，标题从它下面开始。
   默认隐身保沉浸（仍占位，标题不跳），鼠标靠近顶沿或键盘聚焦时才浮现 */
.rback-wrap{position:sticky;top:8px;min-height:34px;margin:8px 0 16px;z-index:5;
  opacity:0;pointer-events:none;transition:opacity .25s}
.rback-wrap.peek,.rback-wrap:focus-within{opacity:1;pointer-events:auto}
.rback,.rtrans{position:absolute;top:0;display:inline-flex;align-items:center;gap:4px;
  padding:7px 14px 7px 10px;border-radius:99px;font-family:inherit;
  font-size:var(--t-ctl);color:var(--text);cursor:pointer;transition:transform .15s;
  background:var(--pill);border:1px solid var(--pill-edge);
  backdrop-filter:var(--pill-blur);-webkit-backdrop-filter:var(--pill-blur);
  box-shadow:var(--pill-sh)}
.rback{left:14px}
.rtrans{right:14px;padding:7px 13px}
/* 底部输入卡：只由快捷键呼出，悬浮在阅读页底部 */
.rcompose{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:6;
  width:min(560px,calc(100% - 48px));
  display:flex;flex-direction:column;gap:10px;
  padding:14px;border-radius:18px;
  background:var(--pill);border:1px solid var(--pill-edge);
  backdrop-filter:var(--pill-blur);-webkit-backdrop-filter:var(--pill-blur);box-shadow:var(--pill-sh)}
.rcompose textarea{width:100%;min-height:110px;border:none;background:transparent;resize:none;outline:none;
  color:var(--text);font:inherit;font-size:var(--t-row);line-height:1.7;max-height:260px;padding:2px}
.rcompose textarea::placeholder{color:var(--text-3)}
.rtrans[disabled]{opacity:.55;cursor:default}
.rback:active,.rtrans:active{transform:scale(.94)}
.article h1{font-size:calc(var(--fs)*1.55);line-height:1.35;font-weight:650;letter-spacing:.01em}
.article .rmeta{margin-top:14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  font-size:13px;color:var(--text-2)}
.article .rmeta .asrc{color:var(--text-3)}
/* 主要观点卡：不上 --pill 玻璃，第二层 backdrop-filter 会打断 .scrim 的采样（弹窗背景不再模糊） */
.article .rpoint{margin-top:1.6em;padding:14px 16px;border-radius:12px;
  border:1px solid var(--hairline);background:var(--hover);
  font-size:15px;line-height:1.75;color:var(--text-2);overflow-wrap:anywhere}
.article .body{margin-top:2.6em;font-size:var(--fs);line-height:var(--lh);color:var(--ink-read);font-kerning:normal}
/* 深色无衬线可变字体提到 480。静态黑体（Windows）因 font-synthesis:none 仍是 400 */
body:not(.light):not(.serif) .article .body{font-weight:480}
.article .body p{margin-bottom:1.35em}
.article .body h2{font-size:calc(var(--fs)*1.2);margin:1.8em 0 .8em;font-weight:650}
/* 第三方抽取 HTML 的 containment：行内宽高/样式不得顶穿排版 */
.article .body img{max-width:100% !important;height:auto !important;display:block;margin:1em auto}
.article .body figure{margin:1em 0;max-width:100%}
.article .body pre{max-width:100%;overflow-x:auto}
.article .body blockquote{margin:1em 0;padding-left:1em;border-left:2px solid var(--hairline);color:var(--text-2)}
.article .body hr{border:none;border-top:1px solid var(--hairline);margin:1.5em 0}
.article .body table{max-width:100%;display:block;overflow-x:auto}
/* 去饱和后正文链接与正文同色，靠下划线识别（悬停只加深下划线，不撤掉）。
   取 --text 不取 --accent：长文里不留最亮档，通篇只留一个亮度台阶 */
.article .body a{color:var(--text);text-decoration:underline;text-decoration-color:var(--text-3);
  text-underline-offset:.22em;overflow-wrap:anywhere;cursor:pointer}
.article .body a:hover{text-decoration-color:var(--text)}
/* 外链卡（X tweet.card 这类）：左文右图，X 原生布局；标题回正文色 */
.xcard{margin:1.2em 0;border:1px solid rgba(255,255,255,.14);border-radius:12px;overflow:hidden;
  background:rgba(255,255,255,.03)}
body.light .xcard{background:#faf9f7;border-color:var(--hairline)}
.xcard a{display:block;padding:12px 14px;color:inherit;text-decoration:none}
/* 外链卡整卡可点，不参与正文链接的下划线规则（.article .body a 特异度更高，须同范围覆盖） */
.article .body .xcard a{color:inherit;text-decoration:none}
.xcard a:hover{text-decoration:none}
.xcard .xrow{display:flex;gap:12px;align-items:flex-start}
.xcard .xrow2{align-items:flex-end;margin-top:14px}
.xcard a:hover{text-decoration:none}
.xcard .xb{flex:1;min-width:0}
.xcard .xt{font-size:14.5px;font-weight:650;line-height:1.4;color:var(--text);overflow-wrap:anywhere}
.xcard .xd{margin-top:6px;font-size:13px;color:var(--text-2);line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* 来源行：卡片之外（照 X） */
.xsrc{margin:10px 2px 0;font-size:12px;color:var(--text-3)}
/* GitHub 四格数据 + 深色链接条（照 X 卡片） */
.xstats{display:flex;gap:36px}
.xg{display:flex;flex-direction:column;gap:1px}
.xg b{display:flex;align-items:center;gap:5px;font-size:14px;font-weight:600;color:var(--text)}
.xg span{font-size:12px;color:var(--text-3)}
.xgh{flex:none;margin-left:auto;color:#9aa4b2}
.xpill{margin:12px 0 0;background:#1e1e20;color:#fff;font-size:12.5px;line-height:1.5;
  padding:8px 12px;border-radius:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.xcard .ximg{flex:none;width:96px;height:96px;border-radius:8px;object-fit:cover}
.article .body .xcard .ximg{margin:0}
body.serif .article .body,body.serif .article h1,
body.serif .m-preview .pv-title,body.serif .m-preview .pv-body{font-family:var(--ff-read)}
body.serif .article h1,body.serif .article .body h2,body.serif .m-preview .pv-title{font-weight:600}

/* 录音胶囊：连续声波（录音功能接入后启用） */
.capsule{position:absolute;bottom:26px;left:50%;transform:translateX(-50%);
  padding:11px 20px;border-radius:99px;pointer-events:none;opacity:0;visibility:hidden;
  background:var(--pill);border:1px solid var(--pill-edge);
  backdrop-filter:var(--pill-blur);-webkit-backdrop-filter:var(--pill-blur);
  box-shadow:var(--pill-sh);
  transition:opacity .22s,visibility .22s,transform .4s cubic-bezier(.3,1.2,.4,1)}
.capsule.on{opacity:1;visibility:visible}
.capsule.absorb{opacity:0;transform:translateX(-50%) translateY(16px) scale(.55)}
.capsule canvas{display:block;width:216px;height:26px}

/* ===== 迷你播放条：录音回放的唯一出口。浮在 dock 之上，切页 / 进阅读页都不收 ===== */
.player{position:absolute;left:50%;bottom:74px;transform:translateX(-50%) translateY(10px);z-index:19;
  width:min(560px,calc(100% - 48px));display:flex;flex-direction:column;gap:9px;padding:11px 13px 12px;
  border-radius:15px;opacity:0;visibility:hidden;pointer-events:none;
  background:var(--pill);border:1px solid var(--pill-edge);
  backdrop-filter:var(--pill-blur);-webkit-backdrop-filter:var(--pill-blur);box-shadow:var(--pill-sh);
  transition:opacity .22s,visibility .22s,transform .34s cubic-bezier(.3,1.15,.4,1)}
.player.on{opacity:1;visibility:visible;pointer-events:auto;transform:translateX(-50%)}
.pl-row{display:flex;align-items:center;gap:11px;min-width:0}
.pl-play{flex:none;width:26px;height:26px;display:grid;place-items:center;border-radius:50%;cursor:pointer;
  font-family:inherit;font-size:10px;line-height:1;color:var(--text);
  border:1px solid var(--pill-edge);background:rgba(255,255,255,.1)}
body.light .pl-play{border-color:rgba(0,0,0,.1);background:rgba(0,0,0,.045)}
.pl-play.on{background:var(--accent);border-color:transparent;color:var(--accent-fg)}
.pl-play:active{background:var(--press)}
.pl-txt{flex:1;min-width:0;font-size:var(--t-ctl);line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pl-time{flex:none;font-size:var(--t-cap);color:var(--text-2);font-variant-numeric:tabular-nums}
.pl-stop{flex:none;width:24px;height:24px;display:grid;place-items:center;border:none;border-radius:7px;
  color:var(--text-3);cursor:pointer;background:transparent}
.pl-stop:hover{color:var(--text);background:var(--press)}
/* 4px 的进度条按不准：::before 把命中区撑到 18px，只画 4px */
.pl-bar{position:relative;height:4px;border-radius:99px;background:var(--hairline);cursor:pointer}
.pl-bar::before{content:"";position:absolute;left:0;right:0;top:-7px;bottom:-7px}
.pl-bar i{display:block;height:100%;width:0;border-radius:99px;background:var(--accent)}
/* 播放条出现时：toast 抬到它之上，列表底部多让一档。:has 免 JS 挂类 */
.win:has(.player.on) .toast{bottom:142px}
.win:has(.player.on) .page{padding-bottom:172px}
/* 阅读页底部输入卡呼出时播放条给它让位 */
.reader:has(.rcompose) ~ .player{bottom:196px}

/* ===== 弹窗：与胶囊同一套 Liquid Glass 质感 =====
   遮罩自带背景模糊（玻璃要有东西可折），卡片为半透玻璃 + 顶缘镜面高光；
   卡片内的小控件一律用白透明填充仿玻璃，不再套 backdrop-filter（嵌套采样不可靠） */
.scrim{position:absolute;inset:0;background:var(--scrim-bg);z-index:40;
  backdrop-filter:blur(18px) saturate(1.25);-webkit-backdrop-filter:blur(18px) saturate(1.25);
  display:none;place-items:center}
.scrim.show{display:grid;animation:scrim-in .18s ease-out}
@keyframes scrim-in{from{opacity:0}to{opacity:1}}
@keyframes card-in{from{opacity:0;transform:translateY(8px) scale(.985)}to{opacity:1;transform:none}}
.glass{position:relative;border-radius:18px;border:1px solid var(--glass-edge);
  background:var(--glass);
  backdrop-filter:blur(10px) saturate(1.5);-webkit-backdrop-filter:blur(10px) saturate(1.5);
  box-shadow:0 44px 92px rgba(0,0,0,.6),0 8px 26px rgba(0,0,0,.34),
    inset 0 1px 0 var(--glass-hi),inset 0 -1px 0 rgba(255,255,255,.05);
  animation:card-in .24s cubic-bezier(.2,.9,.3,1)}
.glass::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:radial-gradient(115% 46% at 50% -14%,rgba(255,255,255,.1),transparent 60%)}
/* 扫光压在内容之下（格子上留 z-index） */
.glass>*{position:relative;z-index:1}
body.light .glass{box-shadow:0 44px 92px rgba(0,0,0,.2),0 8px 26px rgba(0,0,0,.09),
    inset 0 1px 0 #fff,inset 0 -1px 0 rgba(255,255,255,.6)}
body.light .glass::before{background:radial-gradient(130% 70% at 50% -22%,rgba(255,255,255,.9),transparent 58%)}
/* 轨道（tab 组 / 段选共用）：底上开一道凹槽，选中项是一枚独立小透镜 */
.track{position:relative;display:flex;gap:2px;padding:3px;border-radius:11px;background:rgba(255,255,255,.055);
  box-shadow:inset 0 1px 1px rgba(0,0,0,.22),inset 0 0 0 1px rgba(255,255,255,.07)}
body.light .track{background:rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.06)}
/* 透镜的位置与宽度由 settings.ts 量出选中项后回填 --x/--w，切换时滑过去（同 dock 的 thumb） */
.tlens{position:absolute;top:3px;left:var(--x,3px);width:var(--w,0);height:calc(100% - 6px);border-radius:8px;
  pointer-events:none;z-index:0;background:rgba(255,255,255,.06);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.3),inset 0 1px 0 rgba(255,255,255,.45),
    inset 0 -1px 0 rgba(0,0,0,.26),0 2px 8px rgba(0,0,0,.3);
  transition:left .42s cubic-bezier(.32,1.28,.42,1),width .42s cubic-bezier(.32,1.28,.42,1)}
body.light .tlens{background:linear-gradient(180deg,#fff,rgba(255,255,255,.88));
  box-shadow:inset 0 1px 0 #fff,inset 0 -1px 0 rgba(0,0,0,.05),0 2px 8px rgba(0,0,0,.13)}
.m-tab.on,.seg span.on{color:var(--text);font-weight:600}
#settings-scrim{align-items:start;padding-top:clamp(24px, calc(100vh - 560px), 133px)}
.modal{width:520px;position:relative;overflow:hidden;transition:width .26s cubic-bezier(.3,.9,.3,1)}
.modal.with-pv{width:760px}
.m-head{display:flex;align-items:center;gap:8px;padding:14px 16px 12px}
.m-hgap{flex:1}
.m-tab{position:relative;z-index:1;padding:6px 14px;font-size:var(--t-ctl);color:var(--text-2);cursor:pointer;
  border-radius:8px;transition:color .2s,background .2s}
.m-tab:hover{color:var(--text)}
.m-act{font-size:var(--t-ctl);color:var(--text-2);cursor:pointer;padding:6px 12px;border-radius:9px;
  border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);transition:color .2s,background .2s}
.m-act:hover{color:var(--text);background:rgba(255,255,255,.1)}
.m-act.on{color:var(--accent);border-color:var(--accent)}
body.light .m-act{border-color:rgba(0,0,0,.1);background:rgba(0,0,0,.02)}
body.light .m-act:hover{background:var(--hover)}
.m-close{width:28px;height:28px;display:grid;place-items:center;color:var(--text-3);border-radius:8px;cursor:pointer}
.m-close:hover{background:var(--hover);color:var(--text)}
.m-body{display:flex;min-height:250px;max-height:470px}
.modal.with-pv .m-body{min-height:400px}
.m-ctrls{flex:1;padding:6px 22px 22px;overflow-y:auto}
.m-pane{display:none}.m-pane.show{display:block}
.m-preview{display:none;width:320px;flex:none;overflow-y:auto;padding:24px 26px;
  background:linear-gradient(180deg,rgba(0,0,0,.2),rgba(0,0,0,.08));border-left:1px solid rgba(255,255,255,.1)}
body.light .m-preview{background:linear-gradient(180deg,rgba(0,0,0,.035),rgba(0,0,0,.012));border-left-color:rgba(0,0,0,.07)}
.modal.with-pv .m-preview{display:block}
.m-preview .pv-title,.m-preview .pv-body{font-family:var(--ff-sans);font-synthesis:none}
.m-preview .pv-title{font-size:calc(var(--fs)*1.15);font-weight:650}
.m-preview .pv-body{margin-top:1.2em;font-size:var(--fs);line-height:var(--lh);color:var(--ink-read)}
.m-preview .pv-body p{margin-bottom:1.35em}
.grp{margin-bottom:20px}
.m-pane>.grp:last-child{margin-bottom:0}
.grp label{display:flex;justify-content:space-between;align-items:baseline;font-size:var(--t-cap);letter-spacing:.05em;
  color:var(--text-2);margin-bottom:9px}
.grp output{font-size:var(--t-ctl);color:var(--text);font-variant-numeric:tabular-nums}
/* 滑块：轨道已填充段用 --p（CSS 读不到 value，由 settings.ts 回填），拇指为小玻璃珠 */
input[type=range]{-webkit-appearance:none;appearance:none;display:block;width:100%;height:20px;
  background:transparent;cursor:pointer}
input[type=range]::-webkit-slider-runnable-track{height:3px;border-radius:99px;
  background:linear-gradient(90deg,var(--accent) 0 var(--p,50%),rgba(255,255,255,.16) var(--p,50%) 100%)}
body.light input[type=range]::-webkit-slider-runnable-track{background:linear-gradient(90deg,var(--accent) 0 var(--p,50%),rgba(0,0,0,.12) var(--p,50%) 100%)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;margin-top:-5.5px;
  border-radius:50%;border:1px solid rgba(255,255,255,.55);color:var(--text);
  background:linear-gradient(180deg,rgba(255,255,255,.95),rgba(255,255,255,.6));
  box-shadow:inset 0 1px 0 #fff,0 2px 7px rgba(0,0,0,.4)}
body.light input[type=range]::-webkit-slider-thumb{border-color:#fff;background:linear-gradient(180deg,#fff,#f4f3f1);
  box-shadow:inset 0 1px 0 #fff,0 2px 7px rgba(0,0,0,.18)}
input[type=range]:active::-webkit-slider-thumb{transform:scale(1.12)}
.seg span{position:relative;z-index:1;flex:1;text-align:center;font-size:var(--t-ctl);padding:6px 4px;border-radius:8px;cursor:pointer;
  color:var(--text-2);transition:color .2s,background .2s}
.seg span:hover{color:var(--text)}
.hk-row{display:flex;align-items:center;justify-content:space-between;font-size:var(--t-ctl);padding:11px 0;
  border-bottom:1px solid var(--hairline)}
.hk-key{font-family:ui-monospace,Consolas,monospace;font-size:var(--t-ctl);min-width:44px;text-align:center;
  border:1px solid rgba(255,255,255,.18);border-radius:8px;padding:5px 11px;color:var(--text);cursor:pointer;
  background:linear-gradient(180deg,rgba(255,255,255,.15),rgba(255,255,255,.05));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.3),0 2px 6px rgba(0,0,0,.24);transition:color .2s,border-color .2s}
body.light .hk-key{border-color:rgba(0,0,0,.1);background:linear-gradient(180deg,#fff,rgba(255,255,255,.7));
  box-shadow:inset 0 1px 0 #fff,0 2px 6px rgba(0,0,0,.08)}
.hk-key.wait{color:var(--accent);border-color:var(--accent);animation:wait 1.3s ease-in-out infinite}
@keyframes wait{50%{border-color:var(--text-2)}}
/* 设置页文本框（模型接口地址/模型/Key）：贴登录页输入框质感 */
.tinput{width:250px;max-width:60%;height:30px;padding:0 10px;border-radius:8px;
  background:var(--lg-input,#1b1b1b);border:1px solid transparent;color:var(--text);
  font-size:var(--t-ctl);outline:none;font-family:inherit}
body.light .tinput{--lg-input:#f4f3f0}
.tinput:focus{border-color:var(--accent)}
.tinput.wide{width:100%;max-width:none}
select.tinput{cursor:pointer}

/* 确认框 / 链接解析卡 / toast */
.parse{width:480px;padding:22px 24px 18px}
.parse > .p-orbit{position:absolute;inset:0;border-radius:inherit;padding:1.5px;pointer-events:none;opacity:0;z-index:3;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask-composite:exclude;overflow:hidden}
.p-orbit i{position:absolute;left:50%;top:50%;width:150%;aspect-ratio:1;transform:translate(-50%,-50%);
  background:conic-gradient(from 0deg,transparent 0 60%,var(--dock-on) 80%,#fff 88%,transparent 96%)}
.parse.parsing > .p-orbit{opacity:1}
.parse.parsing .p-orbit i{animation:p-rot 1.05s linear infinite}
@keyframes p-rot{to{transform:translate(-50%,-50%) rotate(1turn)}}
.p-kicker{display:flex;justify-content:space-between;gap:12px;font-size:var(--t-cap);letter-spacing:.08em;color:var(--text-3)}
.p-kicker span:last-child{letter-spacing:0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 文库行分类丸子：无标签不占位 */
.rtag{flex:none;font-size:var(--t-cap);color:var(--text-2);border:1px solid var(--hairline);
  border-radius:99px;padding:1px 9px;white-space:nowrap}
/* 待读页顶部分类筛选：单行横向滚动，tag 再多也只占一行高。
   两端渐隐按剩余内容开关（.f-l / .f-r），没溢出就不裁丸子。
   这里只覆盖横向滚动条高度，不写 scrollbar-width —— 写了会让整套 ::-webkit-scrollbar 失效 */
.tagbar{display:flex;gap:8px;padding:2px 0 14px;overflow-x:auto;overscroll-behavior-x:none}
.tagbar::-webkit-scrollbar{height:0}
.tagbar.f-l{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 26px,#000 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 26px,#000 100%)}
.tagbar.f-r{-webkit-mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 26px),transparent 100%);
  mask-image:linear-gradient(90deg,#000 0,#000 calc(100% - 26px),transparent 100%)}
.tagbar.f-l.f-r{-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 26px,#000 calc(100% - 26px),transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 26px,#000 calc(100% - 26px),transparent 100%)}
.tagpill{font-size:var(--t-ctl);color:var(--text-2);border:1px solid var(--hairline);border-radius:99px;
  padding:4px 13px;cursor:pointer;white-space:nowrap}
.tagpill:hover{color:var(--text)}
.tagpill.on{background:var(--accent);border-color:transparent;color:var(--accent-fg);font-weight:600}
/* 多行：标题行 + 简介行（分类丸子在简介左），无简介保持单行 */
.row.tall{height:auto;min-height:52px;flex-direction:column;align-items:stretch;justify-content:center;
  gap:4px;padding-top:8px;padding-bottom:8px}
/* 常驻住下动作按钮的高度：hover 浮出的 .icon-btn 有 28px，比标题行盒高，
   不给 .r-main 留出这 28px，多行行一 hover 就长高、整列被顶下去 */
.r-main{display:flex;align-items:center;gap:12px;min-height:28px}
.r-sub{font-size:var(--t-ctl);color:var(--text-2);line-height:1.6;overflow-wrap:anywhere;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* 简介行内的丸子压一档行高，免得撑高首行 */
.r-sub .rtag{line-height:1.4;vertical-align:.12em;margin-right:8px}
.p-copy{position:relative;overflow:hidden;margin-top:10px}
.p-copy::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 32%,rgba(255,255,255,.7) 46%,rgba(255,214,10,.55) 52%,transparent 68%);
  transform:translateX(-120%)}
.parse.parsing .p-copy::after{animation:p-sweep .9s ease}
@keyframes p-sweep{to{transform:translateX(120%)}}
.p-title{font-size:18px;font-weight:650;line-height:1.45;letter-spacing:.01em}
.p-intro{margin-top:8px;font-size:var(--t-ctl);line-height:1.7;color:var(--text-2);
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.p-btns{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}
.p-go{position:relative;overflow:hidden;background:var(--accent);color:var(--accent-fg);border-color:transparent}
.p-go::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 30%,rgba(255,255,255,.55) 50%,transparent 70%);
  transform:translateX(-120%)}
.parse.parsing .p-go::after{animation:p-sweep .7s ease}
body.light .p-go{background:var(--accent);color:var(--accent-fg);border-color:transparent;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}
.confirm{width:380px;padding:22px 24px}
.confirm .c-t{font-size:var(--t-row);font-weight:600;line-height:1.5;overflow-wrap:anywhere}
.confirm .c-d{font-size:var(--t-ctl);color:var(--text-2);margin-top:7px;line-height:1.6}
.confirm .c-btns{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}
.btn{font-size:var(--t-ctl);padding:7px 15px;border-radius:9px;color:var(--text);cursor:pointer;font-family:inherit;
  border:1px solid rgba(255,255,255,.18);
  background:linear-gradient(180deg,rgba(255,255,255,.13),rgba(255,255,255,.04));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.28);transition:background .2s,border-color .2s}
.btn:hover{background:linear-gradient(180deg,rgba(255,255,255,.2),rgba(255,255,255,.08));border-color:rgba(255,255,255,.3)}
/* body.light .btn 的特异度高于 .btn.danger，故排除 danger，避免红底被洗成白底白字 */
body.light .btn:not(.danger){border-color:rgba(0,0,0,.1);background:linear-gradient(180deg,#fff,rgba(255,255,255,.72));
  box-shadow:inset 0 1px 0 #fff,0 1px 4px rgba(0,0,0,.06)}
body.light .btn:not(.danger):hover{border-color:rgba(0,0,0,.18);background:linear-gradient(180deg,#fff,#faf9f7)}
body.light .btn.p-go,body.light .btn.p-go:hover{background:var(--accent);color:var(--accent-fg);border-color:transparent;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.2)}
.btn.danger{background:#c42b1c;border-color:transparent;color:#fff;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22),0 4px 14px rgba(196,43,28,.32)}
.btn.danger:hover{background:#d13424;border-color:transparent}
.toast{position:absolute;left:50%;bottom:96px;transform:translateX(-50%) translateY(8px);z-index:50;
  font-size:var(--t-ctl);color:var(--text);padding:8px 14px;border-radius:99px;opacity:0;transition:.25s;
  pointer-events:none;display:flex;gap:12px;align-items:center;
  background:var(--pill);border:1px solid var(--pill-edge);
  backdrop-filter:var(--pill-blur);-webkit-backdrop-filter:var(--pill-blur);box-shadow:var(--pill-sh)}
.toast.show{opacity:1;transform:translateX(-50%);pointer-events:auto}
/* 图标按钮比原「撤销」文字宽，负外边距抵消 pill 内边距，避免通知变高变大 */
.toast .t-undo{display:grid;place-items:center;width:24px;height:24px;margin:-4px -6px -4px -4px;
  border-radius:50%;color:var(--accent);cursor:pointer;transition:background .2s}
.toast .t-undo:hover{background:var(--hover)}

/* ===== 按压态：功能层控件按下时统一着一次色（玻璃层内的命中反馈） ===== */
.m-tab:active,.seg span:active,.m-act:active,.m-close:active,.tb-icon:active,.icon-btn:active,
.dock button:active,.toast .t-undo:active{background:var(--press)}
.btn:active{background:var(--press);border-color:transparent}
body.light .btn:not(.danger):active{background:var(--press);border-color:transparent}
.btn.danger:active{background:#a8241a;border-color:transparent;color:#fff}

/* ===== 无障碍回退（HIG Appearance：跟随系统的降低透明度 / 增强对比度 / 减弱动态效果） ===== */
/* 降低透明度：质感让位，玻璃一律换成不透明底并关掉模糊 */
@media (prefers-reduced-transparency:reduce){
  :root{--glass:var(--solid);--pill:var(--solid);--pill-sh:none;--scrim-bg:rgba(0,0,0,.94);--bar:var(--solid)}
  body.light{--glass:#fff;--pill:#fff;--pill-sh:none;--scrim-bg:rgba(0,0,0,.62);--bar:#fff}
  .thumb,.glass,.scrim,.rback,.rtrans,.capsule,.player,.toast,.titlebar{
    backdrop-filter:none;-webkit-backdrop-filter:none}
  .dock{background:var(--solid);border-color:var(--glass-edge)}
  body.light .dock{background:#e9e8e4;border-color:rgba(0,0,0,.14)}
  /* 透镜让位：不透明底上靠 accent 文字表选中，圈保留但换成实色 */
  .thumb{background:transparent;border-color:var(--text-2);box-shadow:none}
  .glass::before,.tb-edge{display:none}
  .tlens{background:var(--press);box-shadow:none}
}
/* 增强对比度：玻璃之上的次要文字与分隔线加重到 AA 以上 */
@media (prefers-contrast:more){
  :root{--text:#fff;--ink-read:#fff;--text-2:#bcbcbc;--text-3:#929292;--hairline:rgba(255,255,255,.22);--accent:#fff;
    --glass-edge:rgba(255,255,255,.44);--pill-edge:rgba(255,255,255,.62);--card:rgba(255,255,255,.06);--card-line:rgba(255,255,255,.44)}
  body.light{--text:#111;--ink-read:#111;--text-2:#585858;--text-3:#6f6f6f;--hairline:rgba(0,0,0,.28);--accent:#111;--accent-fg:#fff;
    --glass-edge:rgba(0,0,0,.3);--card:#fff;--card-line:rgba(0,0,0,.42)}
}
/* 减弱动态效果：只压位移与缩放，旋转类进度指示保留 */
@media (prefers-reduced-motion:reduce){
  .scrim.show,.glass{animation:none}
  .thumb,.tlens{transition:none}
  .capsule,.toast{transition:opacity .2s,visibility .2s}
  .capsule.absorb{transform:translateX(-50%)}
  .player{transition:opacity .2s,visibility .2s}
  .player,.player.on{transform:translateX(-50%)}
  .rback:active,.rtrans:active{transform:none}
  .rback-wrap{transition:none}
  .hk-key.wait{animation:none}
  .parse.parsing .p-orbit i,.parse.parsing .p-copy::after,.parse.parsing .p-go::after{animation:none}
  .parse.parsing > .p-orbit{opacity:.85}
}
