/* ===========================================================================
   Fruiticecake — 全站外壳「动捕棚」
   颜色 / 字体 token 来自 /stage/tokens.css（深色默认 + 浅色「日光棚」），文字动效原语来自 /stage/motion.css。
   日报、开源雷达、对话、日历等由脚本生成的 HTML 结构不变，这里只负责样式。
   小字号文字只用不透明墨色（--ink / --ink-2 / --ink-3，均为实色且对比度 ≥ 4.5:1）。
   =========================================================================== */
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-padding-top:4.5rem}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:clamp(16px,.3vw + 15px,17.5px);
  line-height:1.85;-webkit-font-smoothing:antialiased;transition:background-color .35s,color .35s}
body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:60;
  background:repeating-linear-gradient(0deg,var(--scanline) 0 1px,transparent 1px 3px)}
h1,h2,h3,h4{margin:0;line-height:1.3;color:var(--ink)}
p{margin:0}
a{color:inherit;text-decoration:none}
img,svg{max-width:100%}
:focus-visible{outline:2px solid var(--mark);outline-offset:3px}
::selection{background:var(--mark);color:var(--on-mark)}
.wrap{width:min(100% - 2*clamp(1rem,3vw,2.5rem),78rem);margin-inline:auto}
main.wrap{min-height:60vh}
.tc{font-family:var(--mono);font-size:.74rem;letter-spacing:.05em;color:var(--mark);margin:0 0 .8rem}
.tc a:hover{text-decoration:underline}
.empty-note{color:var(--ink-3);font-size:.9rem}
.more,.more-link{font-family:var(--mono);font-size:.72rem;color:var(--ink-3)}
.more a,.more-link:hover,.more:hover{color:var(--mark)}

/* ========================= 顶栏 ========================= */
.bar{position:sticky;top:0;z-index:40;background:color-mix(in srgb,var(--bg) 84%,transparent);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.bar .wrap{display:flex;align-items:center;gap:1.2rem;height:3.25rem}
.brand{display:flex;align-items:center;gap:.55rem;font-family:var(--disp);font-weight:700;font-size:1rem;letter-spacing:.06em;white-space:nowrap}
.brand i{width:.55rem;height:.55rem;border-radius:50%;background:var(--mark);box-shadow:var(--glow-shadow)}
.site-nav{display:flex;gap:.1rem;margin-left:auto}
.site-nav a{position:relative;padding:.35rem .65rem;font-size:.86rem;color:var(--ink-2);border-radius:2px;white-space:nowrap;transition:color .2s,background .2s}
.site-nav a:hover{color:var(--ink);background:var(--mark-dim)}
.site-nav a[aria-current="page"]{color:var(--ink)}
.site-nav a[aria-current="page"]::after{content:"";position:absolute;left:.65rem;right:.65rem;bottom:-.55rem;height:2px;background:var(--mark);box-shadow:var(--glow-shadow)}
.bar-tools{display:flex;align-items:center;gap:.9rem}
.rec{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--mono);font-size:.7rem;color:var(--ir);white-space:nowrap}
.rec::before{content:"";width:.5rem;height:.5rem;border-radius:50%;background:var(--ir);animation:rec-blink 1.2s steps(2) infinite}
@keyframes rec-blink{50%{opacity:.15}}
.theme-btn{display:grid;place-items:center;width:2rem;height:2rem;border:1px solid var(--line-2);background:transparent;color:var(--ink-2);cursor:pointer;border-radius:2px;transition:color .2s,border-color .2s}
.theme-btn:hover{color:var(--mark);border-color:var(--mark)}
.theme-btn svg{width:1rem;height:1rem}
.theme-btn .sun{display:none}
:root[data-theme-resolved="light"] .theme-btn .sun{display:block}
:root[data-theme-resolved="light"] .theme-btn .moon{display:none}
/* 环境音开关：和主题按钮同一套外观；开着时变成标记色，记住了「开」但还没出声时轻轻闪 */
.sound-btn{display:grid;place-items:center;width:2rem;height:2rem;border:1px solid var(--line-2);background:transparent;color:var(--ink-2);cursor:pointer;border-radius:2px;transition:color .2s,border-color .2s}
.sound-btn:hover{color:var(--mark);border-color:var(--mark)}
.sound-btn svg{width:1rem;height:1rem}
.sound-btn .wave{display:none}
.sound-btn[aria-pressed="true"]{color:var(--mark);border-color:var(--mark)}
.sound-btn[aria-pressed="true"] .wave{display:inline}
.sound-btn[aria-pressed="true"] .mute{display:none}
.sound-btn.is-waiting{animation:sound-wait 1.6s ease-in-out infinite}
@keyframes sound-wait{50%{opacity:.45}}
:is(.sound-btn,.theme-btn):focus-visible{outline:2px solid var(--mark);outline-offset:2px}
@media (max-width:420px){.bar-tools{gap:.55rem}.rec #clock{display:none}}   /* 窄屏：REC 只留红点，给两个按钮让位 */
.progress{position:absolute;left:0;bottom:-1px;height:2px;width:100%;background:var(--mark);transform-origin:left;
  transform:scaleX(var(--read,0));box-shadow:var(--glow-shadow)}

/* ========================= 页头 / 区块 ========================= */
.page-head{padding:clamp(2rem,5vw,3.6rem) 0 clamp(1.4rem,3vw,2rem);border-bottom:1px solid var(--line);margin-bottom:1.6rem}
.page-head h1{font-weight:900;font-size:clamp(2rem,4.4vw,3.6rem);line-height:1.12;text-wrap:balance}
.page-head p{margin-top:.6rem;color:var(--ink-2);max-width:42rem}
.page-head .count{font-family:var(--mono);font-size:.72rem;color:var(--ink-3);margin-top:.9rem}
.page-head .count a:hover{color:var(--mark)}
.block{margin:clamp(2.4rem,5vw,3.8rem) 0}
.block-head{display:flex;align-items:baseline;gap:1rem;margin-bottom:1rem}
.block-head .tc{margin:0}
.block-head h2,.block > h2{font-size:clamp(1.25rem,1.1vw + 1rem,1.65rem);font-weight:900}
.block > h2{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-bottom:1rem}
.block-head .more{margin-left:auto}

/* ========================= 首页 ========================= */
.home-hero{padding-top:clamp(1.2rem,2.5vw,2rem)}
.viewer{position:relative;margin:0;border:1px solid var(--line-2);background:var(--viewer-bg)}
.viewer svg{display:block;width:100%;height:auto;touch-action:manipulation}
.viewer.is-failed{min-height:6rem}
.vf-label{font-family:var(--mono);font-size:11px;fill:var(--ink-3);letter-spacing:.04em}
.vf-label.hot{fill:var(--mark)}
.vf-label.older{fill:var(--ink-2);cursor:pointer}
.vf-corner{fill:none;stroke:var(--ink-2);stroke-width:1.5}
.lane{stroke:var(--line);stroke-dasharray:2 6}
.tick{stroke:var(--line-2)}
.bone{stroke:var(--ink-3);stroke-width:1;opacity:.55;fill:none}
.mk,.mk-core{transform-box:fill-box;transform-origin:center}
.mk{fill:var(--mark);filter:var(--glow)}
.mk.is-stage{fill:none;stroke:var(--mark);stroke-width:2}
.mk-core{fill:var(--mark);pointer-events:none}
.mk.is-hot{fill:var(--ir);filter:none}
.pulse{fill:none;stroke:var(--ir);stroke-width:1.2;transform-box:fill-box;transform-origin:center;animation:pulse 2.2s ease-out infinite}
@keyframes pulse{0%{transform:scale(1);opacity:.9}100%{transform:scale(3.2);opacity:0}}
.cross{stroke:var(--mark);stroke-width:1;stroke-dasharray:3 4;opacity:0;transition:opacity .15s}
.viewer.is-hover .cross{opacity:.7}
.scan{fill:url(#scan-grad);opacity:.5;animation:scan 9s linear infinite}
.scan-stop-a{stop-color:var(--mark);stop-opacity:0}
.scan-stop-b{stop-color:var(--mark);stop-opacity:.14}
@keyframes scan{from{transform:translateX(-10%)}to{transform:translateX(110%)}}
html.m-on .viewer .mk,html.m-on .viewer .mk-core{opacity:0}
html.m-on .viewer .is-captured .mk,html.m-on .viewer .is-captured .mk-core{animation:capture .5s var(--d,0s) var(--ease) forwards}
html.m-on .viewer .bone{stroke-dasharray:1;stroke-dashoffset:1}
html.m-on .viewer .is-captured .bone{animation:draw-line 1.6s .3s var(--ease) forwards}
@keyframes capture{0%{opacity:0;transform:scale(2.4)}100%{opacity:1;transform:none}}
@keyframes draw-line{to{stroke-dashoffset:0}}
.tip{position:absolute;z-index:3;pointer-events:none;min-width:12rem;max-width:20rem;padding:.55rem .75rem;background:var(--panel-2);
  border:1px solid var(--mark);font-size:.82rem;line-height:1.5;color:var(--ink);transform:translate(-50%,calc(-100% - 14px));opacity:0;transition:opacity .15s}
.tip.is-on{opacity:1}
.tip small{display:block;font-family:var(--mono);font-size:.66rem;color:var(--mark);margin-bottom:.15rem}
.viewer-cap{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem 1.2rem;padding:.55rem 1rem;border-top:1px solid var(--line);
  font-family:var(--mono);font-size:.68rem;color:var(--ink-3)}
.viewer-cap span{display:inline-flex;align-items:center;gap:.45rem}
.viewer-cap .cap-note{margin-left:auto}
.k-dot,.k-hot{width:.5rem;height:.5rem;border-radius:50%;background:var(--mark)}
.k-hot{background:var(--ir)}
.k-ring{width:.65rem;height:.65rem;border-radius:50%;border:2px solid var(--mark)}
.range{display:inline-flex;border:1px solid var(--line-2)}
.range button{font:inherit;font-size:.68rem;padding:.25rem .6rem;background:transparent;color:var(--ink-3);border:0;cursor:pointer;transition:color .2s,background .2s}
.range button+button{border-left:1px solid var(--line-2)}
.range button:hover{color:var(--ink)}
.range button[aria-pressed="true"]{background:var(--mark);color:var(--on-mark)}

.home-head{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(1.5rem,4vw,4rem);align-items:end;
  padding:clamp(2rem,4vw,3.2rem) 0 clamp(1.8rem,3vw,2.6rem);border-bottom:1px solid var(--line)}
.home-head h1{font-family:var(--disp);font-weight:700;font-size:clamp(2.6rem,6.4vw,5.6rem);line-height:.95;letter-spacing:-.01em}
.home-head h1 .hl{color:var(--mark)}
.home-head .lede{color:var(--ink-2);font-size:1.02rem}
.telemetry{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line-2);border:1px solid var(--line-2);margin:clamp(1.6rem,3vw,2.4rem) 0}
.telemetry div{background:var(--bg-2);padding:.9rem 1rem}
.telemetry small{display:block;font-family:var(--mono);font-size:.62rem;letter-spacing:.08em;color:var(--ink-3)}
.telemetry b{display:block;font-family:var(--disp);font-size:clamp(1.8rem,3vw,2.6rem);line-height:1.15;color:var(--mark)}
.telemetry b small{display:inline;font-size:.45em;color:var(--ink-3);letter-spacing:0}
.telemetry span{font-size:.78rem;color:var(--ink-3)}
.strands{margin:0 0 clamp(1.6rem,3vw,2.4rem);overflow:hidden}
.strands canvas{display:block;width:100%;height:clamp(280px,40vw,500px);touch-action:pan-y}
.strands-note{min-width:0;color:var(--ink-2)}
/* 数字行当作海藻场的形态菜单（JS 加 .is-menu）：与下方画布拼成一块，选中项顶上一道荧光线 */
.telemetry.is-menu{margin-bottom:0}
.telemetry.is-menu + .strands{border-top:0}
.telemetry.is-menu [data-form]{position:relative;cursor:pointer;transition:background .2s}
.telemetry.is-menu [data-form]:hover{background:var(--panel)}
.telemetry.is-menu [data-form]::before{content:"";position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--mark);
  box-shadow:var(--glow-shadow);transform:scaleX(0);transition:transform .35s var(--ease)}
.telemetry.is-menu [aria-pressed="true"]::before{transform:none}
.telemetry.is-menu [aria-pressed="false"] b{color:var(--ink-3)}
.latest{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:1.2rem}
.feature{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:1rem;min-height:17rem;padding:1.4rem;border:1px solid var(--line-2);
  background:var(--panel);overflow:hidden;transition:border-color .25s}
.feature::before,.feature::after{content:"";position:absolute;width:14px;height:14px;border:0 solid var(--mark);opacity:0;transition:transform .3s var(--ease),opacity .3s}
.feature::before{left:-1px;top:-1px;border-width:2px 0 0 2px;transform:translate(-6px,-6px)}
.feature::after{right:-1px;bottom:-1px;border-width:0 2px 2px 0;transform:translate(6px,6px)}
.feature:hover{border-color:var(--mark)}
.feature:hover::before,.feature:hover::after{transform:none;opacity:1}
.feature h3{font-size:clamp(1.35rem,1.6vw + 1rem,2rem);line-height:1.3;font-weight:900}
.feature p{color:var(--ink-2);font-size:.95rem}
.feature .meta{margin-top:auto;font-family:var(--mono);font-size:.7rem;color:var(--ink-3)}
.badge{display:inline-flex;align-items:center;gap:.4rem;justify-self:start;font-family:var(--mono);font-size:.66rem;letter-spacing:.04em;color:var(--mark);
  border:1px solid var(--line-2);padding:.12rem .5rem;vertical-align:middle;font-weight:500}
.badge::before{content:"";width:.4rem;height:.4rem;border-radius:50%;background:currentColor}
.takes{list-style:none;margin:0;padding:0;border-top:1px solid var(--line-2)}
.takes a{display:grid;grid-template-columns:4.6rem 1fr auto;gap:.9rem;align-items:baseline;padding:.75rem .2rem;border-bottom:1px solid var(--line);
  transition:background .2s,padding .25s var(--ease)}
.takes a:hover{background:var(--mark-dim);padding-left:.6rem}
.take-no{font-family:var(--mono);font-size:.68rem;color:var(--ink-3);white-space:nowrap}
.take-title{font-weight:700;line-height:1.45}
.take-date{font-family:var(--mono);font-size:.68rem;color:var(--ink-3);white-space:nowrap}
.takes a:hover .take-no,.log a:hover .take-no{color:var(--mark)}
.channels{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}
.channel{display:grid;gap:.5rem;align-content:start;padding:1.1rem 1.1rem 1.2rem;background:var(--bg-2);border:1px solid var(--line-2);transition:background .25s,border-color .25s}
.channel:hover{border-color:var(--mark)}
.channel:hover{background:var(--panel)}
.channel .ch-id{display:flex;justify-content:space-between;font-family:var(--mono);font-size:.66rem;color:var(--ink-3)}
.channel h3{font-size:1.15rem;font-weight:900}
.channel:hover h3{color:var(--mark)}
.channel p{font-size:.84rem;color:var(--ink-2);line-height:1.6}
.channel .last{font-size:.78rem;color:var(--ink-3);line-height:1.5;overflow:hidden;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}
.channel.is-archive{background:var(--panel)}
.channel.is-archive h3::after{content:" →";color:var(--mark)}
.spark{display:block;width:100%;height:28px;margin-top:.3rem}
.spark rect{fill:var(--mark)}
.spark rect.z{fill:var(--ink-3);opacity:.5}

/* ========================= 列表 ========================= */
.log{list-style:none;margin:0 0 4rem;padding:0;border-top:1px solid var(--line-2)}
.log a{display:grid;grid-template-columns:5.4rem minmax(0,1fr) 6.6rem;gap:1.2rem;padding:1.05rem .2rem;border-bottom:1px solid var(--line);
  transition:background .2s,padding .25s var(--ease)}
.log a:hover{background:var(--mark-dim);padding-left:.7rem}
.log a:focus-visible{outline:none;box-shadow:inset 0 0 0 2px var(--mark)}
.log .take-no{padding-top:.25rem}
.log h3{margin:0 0 .25rem;font-size:1.06rem;line-height:1.45}
.log h3 .badge{margin-left:.4rem}
.log p{font-size:.86rem;color:var(--ink-3);line-height:1.6;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.log .take-date{text-align:right;padding-top:.25rem}
.post-list{display:grid;gap:0;border-top:1px solid var(--line-2);margin-bottom:3rem}
.post-item{padding:1rem .2rem;border-bottom:1px solid var(--line);transition:background .2s}
.post-item:hover{background:var(--mark-dim)}
.post-item h3{font-size:1.05rem;margin:.35rem 0}
.post-item h3 a:hover{color:var(--mark)}
.post-item .excerpt{color:var(--ink-3);font-size:.86rem;line-height:1.6}
.meta{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem;font-family:var(--mono);font-size:.68rem;color:var(--ink-3)}
.sec-badge{font-family:var(--mono);font-size:.64rem;letter-spacing:.04em;color:var(--mark);border:1px solid var(--line-2);padding:.08rem .45rem}
a.sec-badge:hover{border-color:var(--mark)}
.model-badge{font-family:var(--mono);font-size:.66rem;color:var(--ink-2);border:1px solid var(--line-2);padding:.12rem .5rem}

/* ========================= AI HOT 日报 / 日历 ========================= */
.daily-top{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,22rem);gap:1px;background:var(--line-2);border:1px solid var(--line-2)}
.stat-card{display:grid;align-content:center;gap:.9rem;padding:clamp(1.3rem,3vw,2rem);background:var(--panel);min-width:0}
.stat{display:grid;gap:.2rem;min-width:0}
.stat-label{font-family:var(--mono);font-size:.66rem;letter-spacing:.08em;color:var(--ink-3)}
.stat-num{font-family:var(--disp);font-size:clamp(3rem,8vw,5.2rem);font-weight:700;line-height:1;color:var(--mark);font-variant-numeric:tabular-nums}
.stat-num small{font-size:.32em;color:var(--ink-3);margin-left:.3rem}
.stat-sub{font-size:.86rem;color:var(--ink-2)}
.stat-chips{display:flex;flex-wrap:wrap;gap:.5rem}
.stat-chip{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--mono);font-size:.68rem;color:var(--ink-2);border:1px solid var(--line-2);padding:.2rem .6rem}
.stat-chip::before{content:"";width:.4rem;height:.4rem;border-radius:50%;background:var(--mark)}
.cal-card{padding:1.1rem;background:var(--bg-2);min-width:0}
.cal-head{display:flex;align-items:center;justify-content:space-between;gap:.6rem;margin-bottom:.8rem}
.cal-month{font-family:var(--mono);font-size:.8rem;color:var(--ink)}
.cal-legend{font-family:var(--mono);font-size:.64rem;color:var(--ink-3)}
.cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}
.cal-wd{display:flex;justify-content:center;padding:0 0 .3rem;font-family:var(--mono);font-size:.64rem;color:var(--ink-2)}
.cal-cell{aspect-ratio:1/1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border:1px solid transparent;
  font-family:var(--mono);font-size:.74rem;color:var(--ink-3);font-variant-numeric:tabular-nums;transition:border-color .2s,background .2s,color .2s}
.cal-cell.is-blank{visibility:hidden}
.cal-cell.is-past{border-color:var(--line)}
.cal-cell.has-post{border-color:var(--line-2);color:var(--ink);background:var(--panel)}
a.cal-cell.has-post:hover{border-color:var(--mark);color:var(--mark)}
.cal-cell.is-today{border-color:var(--mark);color:var(--mark)}
.cal-mark{font-size:0;width:4px;height:4px;border-radius:50%;background:transparent}
.cal-cell.has-post .cal-mark{background:var(--mark);box-shadow:var(--glow-shadow)}
.daily-top + .block{margin-top:2.4rem}
.aihot-list{display:grid;border-top:1px solid var(--line-2)}
.aihot-list-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:1rem;align-items:center;padding:.85rem .2rem;border-bottom:1px solid var(--line);
  transition:background .2s,padding .25s var(--ease)}
.aihot-list-row:hover{background:var(--mark-dim);padding-left:.7rem}
.aihot-list-date{font-family:var(--mono);font-size:.78rem;color:var(--ink)}
.aihot-list-row:hover .aihot-list-date{color:var(--mark)}
.aihot-list-headline{margin-top:.15rem;font-size:.86rem;color:var(--ink-2);line-height:1.55}
.aihot-list-count{font-family:var(--mono);font-size:.68rem;color:var(--mark);white-space:nowrap}
/* 日报正文 */
.aihot-intro{color:var(--ink-2);margin:0 0 1.4rem}
.aihot-group{margin:2rem 0}
.aihot-group-title{font-size:1.15rem;margin:0 0 .9rem}
.aihot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(15rem,1fr));gap:.75rem}
.aihot-card{display:flex;flex-direction:column;gap:.5rem;padding:1rem;min-height:10rem;background:var(--bg-2);border:1px solid var(--line-2);color:inherit;transition:background .2s,border-color .2s}
.aihot-card:hover{background:var(--panel);border-color:var(--mark)}
.aihot-card-cat{align-self:flex-start;font-family:var(--mono);font-size:.62rem;color:var(--mark);border:1px solid var(--line-2);padding:.08rem .45rem}
.aihot-card h3{font-size:.98rem;line-height:1.45}
.aihot-card:hover h3{color:var(--mark)}
.aihot-card p{flex:1;font-size:.84rem;color:var(--ink-2);line-height:1.6}
.aihot-card-src{font-family:var(--mono);font-size:.64rem;color:var(--ink-3)}

/* ========================= AI 对话 ========================= */
.chat-inbox{display:grid;border-top:1px solid var(--line-2)}
.chat-inbox-row{display:flex;gap:1rem;align-items:flex-start;padding:1rem .2rem;border-bottom:1px solid var(--line);transition:background .2s}
.chat-inbox-row:hover{background:var(--mark-dim)}
.chat-avatar{flex:none;display:grid;place-items:center;width:2.4rem;height:2.4rem;border:1px solid var(--mark);color:var(--mark);font-family:var(--mono);font-weight:700}
.chat-inbox-body{flex:1;min-width:0}
.chat-inbox-top{display:flex;justify-content:space-between;gap:.8rem}
.chat-inbox-title{font-weight:700}
.chat-inbox-row:hover .chat-inbox-title{color:var(--mark)}
.chat-inbox-date{font-family:var(--mono);font-size:.68rem;color:var(--ink-3);white-space:nowrap}
.chat-inbox-preview{margin-top:.4rem;font-size:.86rem;color:var(--ink-2);border-left:2px solid var(--line-2);padding-left:.7rem}
.chat-thread{display:flex;flex-direction:column;gap:1.1rem;margin:.6rem 0}
.chat-turn{display:flex;flex-direction:column;max-width:82%}
.chat-user{align-self:flex-end;align-items:flex-end}
.chat-ai{align-self:flex-start;align-items:flex-start}
.chat-role{font-family:var(--mono);font-size:.66rem;color:var(--ink-3);margin-bottom:.35rem}
.chat-bubble{padding:.8rem 1.05rem;font-size:.95rem;line-height:1.75;border:1px solid var(--line-2)}
.chat-user .chat-bubble{background:var(--mark-dim);border-color:color-mix(in srgb,var(--mark) 40%,transparent);color:var(--ink)}
.chat-ai .chat-bubble{background:var(--panel);color:var(--ink-2)}
.chat-bubble p{margin:0 0 .6rem}
.chat-bubble p:last-child{margin-bottom:0}

/* ========================= 开源雷达 ========================= */
.opensource-lead{position:relative;isolation:isolate;overflow:hidden;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:1.6rem;
  min-height:15rem;padding:clamp(1.4rem,4vw,2.6rem);border:1px solid var(--line-2);background:var(--viewer-bg);transition:border-color .25s}
.opensource-lead:hover{border-color:var(--mark)}
.opensource-lead::before{content:"";position:absolute;z-index:-1;top:-5rem;right:-3rem;width:20rem;aspect-ratio:1;border-radius:50%;
  border:1px solid var(--line-2);background:repeating-radial-gradient(circle,transparent 0 3rem,var(--line) 3rem calc(3rem + 1px))}
.opensource-lead::after{content:"";position:absolute;z-index:-1;top:-5rem;right:-3rem;width:20rem;aspect-ratio:1;border-radius:50%;
  background:conic-gradient(from 0deg,transparent 0 82%,var(--mark-dim) 92%,color-mix(in srgb,var(--mark) 45%,transparent) 99%,transparent 100%);
  animation:radar-scan 7s linear infinite;pointer-events:none}
@keyframes radar-scan{to{transform:rotate(1turn)}}
.opensource-lead>div{min-width:0;max-width:40rem}
.opensource-lead-kicker{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem;margin-bottom:.9rem;font-family:var(--mono);font-size:.7rem;color:var(--mark)}
.opensource-project-count{border:1px solid var(--line-2);padding:.1rem .5rem;color:var(--ink-2)}
.opensource-lead h2{font-size:clamp(1.6rem,3.6vw,2.6rem);line-height:1.15;font-weight:900}
.opensource-lead p{margin-top:.8rem;color:var(--ink-2);font-size:.92rem}
.opensource-lead>span{font-family:var(--mono);font-size:.72rem;padding:.45rem .8rem;border:1px solid var(--line-2);white-space:nowrap;transition:background .2s,color .2s}
.opensource-lead:hover>span{background:var(--mark);color:var(--on-mark);border-color:var(--mark)}
.opensource-trends,.opensource-history{margin-top:clamp(1.6rem,4vw,2.6rem)}
.opensource-trends h2,.opensource-history h2,.radar-featured>h2,.radar-quick-list>h2{display:flex;align-items:center;gap:.7rem;margin-bottom:.9rem;
  font-family:var(--sans);font-size:1rem;font-weight:700;letter-spacing:0;color:var(--ink)}
.opensource-trends h2::before,.opensource-history h2::before,.radar-featured>h2::before,.radar-quick-list>h2::before{content:"//";font-family:var(--mono);color:var(--mark)}
.opensource-trends h2{color:var(--ink)}
.opensource-trends ol,.radar-trends ol{counter-reset:trend;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;margin:0;padding:0;list-style:none;
  background:var(--line-2);border:1px solid var(--line-2)}
.opensource-trends li,.radar-trends li{counter-increment:trend;padding:1rem;background:var(--bg-2);color:var(--ink);font-size:.88rem;overflow-wrap:anywhere}
.opensource-trends li::before,.radar-trends li::before{content:"0" counter(trend);display:block;margin-bottom:.5rem;font-family:var(--disp);font-size:1.6rem;color:var(--mark)}
.opensource-history .aihot-list-headline{color:var(--ink-2)}
/* 雷达正文 */
.radar-digest{display:flex;flex-direction:column;gap:clamp(1.6rem,4vw,2.6rem);min-width:0}
.radar-issue-header{display:grid;gap:.3rem;padding:.8rem 1rem;border:1px dashed var(--line-2);font-family:var(--mono);font-size:.74rem;color:var(--ink-2)}
.radar-method-note{color:var(--ink-3)}
.radar-trends{padding:clamp(1rem,3vw,1.6rem);border:1px solid var(--line-2);background:var(--panel)}
.radar-trends h2{margin:0 0 1rem;font-size:clamp(1.2rem,2.4vw,1.6rem);color:var(--ink)}
.radar-featured,.radar-quick-list,.radar-quick-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;min-width:0}
.radar-featured>h2,.radar-quick-list>h2{grid-column:1/-1;margin:0}
.radar-quick-list,.radar-quick-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
.radar-feature,.radar-quick{min-width:0;background:var(--bg-2);border:1px solid var(--line-2);overflow-wrap:anywhere}
.radar-feature{padding:clamp(1rem,2.6vw,1.6rem)}
.radar-feature:first-of-type{grid-row:span 2;background:var(--panel);box-shadow:inset 0 3px 0 var(--mark)}
.radar-feature h3{font-size:clamp(1.1rem,2.2vw,1.45rem)}
.radar-feature h3 a,.radar-quick h3 a{color:var(--ink)}
.radar-feature h3 a:hover,.radar-quick h3 a:hover{color:var(--mark)}
.radar-feature p{margin:.7rem 0;color:var(--ink-2);font-size:.88rem}
.radar-feature p strong{display:block;margin-bottom:.1rem;font-family:var(--mono);font-size:.64rem;font-weight:500;letter-spacing:.06em;color:var(--ink)}
.radar-facts{font-family:var(--mono);font-size:.7rem;color:var(--ink-3)}
.radar-quick{padding:1rem}
.radar-quick h3{margin:0 0 .5rem;font-size:1rem}
.radar-quick p{margin:0;color:var(--ink-2);font-size:.84rem}
.difficulty-label,.radar-signal{display:inline-flex;align-items:center;gap:.45rem;max-width:100%;margin-top:.7rem;font-family:var(--mono);font-size:.66rem;color:var(--ink)}
.difficulty-label{width:max-content;padding:.15rem .55rem;border:1px solid var(--line-2);color:var(--ink)}
.radar-signal{padding:.4rem 0 .4rem .7rem;border-left:2px solid var(--mark);line-height:1.45;color:var(--ink-2)}
.difficulty-label::before,.radar-signal::before{content:"";flex:none;width:.4rem;height:.4rem;border-radius:50%;background:var(--mark)}

/* ========================= 普通文章阅读页 ========================= */
.post-layout{display:grid;grid-template-columns:13rem minmax(0,44rem) minmax(0,1fr);column-gap:clamp(1.5rem,4vw,3.5rem)}
.post-layout.no-rail{grid-template-columns:minmax(0,46rem);justify-content:center}
.post-layout.is-wide{grid-template-columns:minmax(0,1fr)}
.post-head{grid-column:1 / -1;padding:clamp(2rem,5vw,3.4rem) 0 1.6rem;border-bottom:1px solid var(--line);margin-bottom:.6rem}
.post-head h1{font-weight:900;font-size:clamp(1.8rem,3.6vw,3rem);line-height:1.2;max-width:52rem;text-wrap:balance}
.post-meta{display:flex;flex-wrap:wrap;gap:.4rem .7rem;margin-top:1rem;font-family:var(--mono);font-size:.7rem;color:var(--ink-3)}
.post-meta > span:not(.model-badge){border:1px solid var(--line-2);padding:.12rem .5rem}
.tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.8rem}
.tag{font-family:var(--mono);font-size:.68rem;color:var(--ink-2);padding:.12rem .5rem;background:var(--mark-dim);transition:color .2s}
.tag::before{content:"#";color:var(--mark)}
.tag:hover{color:var(--mark)}
.source-note{margin-top:.7rem;font-family:var(--mono);font-size:.72rem;color:var(--ink-3)}
.source-note a{color:var(--ink-2);text-decoration:underline;text-decoration-color:var(--mark);word-break:break-all}
.rail{position:sticky;top:4.4rem;align-self:start;max-height:calc(100vh - 5.5rem);overflow:auto;padding:1.6rem 0 2rem;scrollbar-width:thin}
.rail p{font-family:var(--mono);font-size:.64rem;color:var(--ink-3);letter-spacing:.1em;margin:0 0 .7rem}
.rail ol{list-style:none;margin:0;padding:0;border-left:1px solid var(--line-2)}
.rail a{display:block;padding:.3rem 0 .3rem .8rem;margin-left:-1px;border-left:2px solid transparent;font-size:.8rem;line-height:1.45;color:var(--ink-3);transition:color .2s,border-color .2s}
.rail a.lv3{padding-left:1.6rem;font-size:.76rem}
.rail a:hover{color:var(--ink)}
.rail a.is-on{color:var(--ink);border-left-color:var(--mark)}
.prose{padding:1.6rem 0 3rem;color:var(--ink-2);min-width:0}
.prose > :first-child{margin-top:0}
.prose h1,.prose h2,.prose h3,.prose h4{color:var(--ink);scroll-margin-top:5rem;line-height:1.4}
.prose h1{margin:2.4rem 0 1rem;font-size:1.7rem;font-weight:900}
.prose h2{margin:2.8rem 0 1rem;font-size:1.5rem;font-weight:900}
.prose h2[data-tc]::before{content:attr(data-tc);display:block;font-family:var(--mono);font-size:.7rem;font-weight:500;color:var(--mark);margin-bottom:.35rem;letter-spacing:.05em}
.prose h3{margin:2rem 0 .8rem;font-size:1.15rem;font-weight:700}
.prose h4{margin:1.6rem 0 .6rem;font-size:1rem}
.prose p{margin:0 0 1.2em}
.prose strong,.prose b{color:var(--ink)}
.prose p a,.prose li a,.prose td a,.prose blockquote a{color:var(--ink);text-decoration:underline;text-decoration-color:var(--mark);text-underline-offset:.2em;transition:color .2s}
.prose p a:hover,.prose li a:hover,.prose td a:hover,.prose blockquote a:hover{color:var(--mark)}
.prose img{max-width:100%;height:auto;border:1px solid var(--line-2);background:var(--panel)}
.prose blockquote{margin:1.6rem 0;padding:.2rem 0 .2rem 1rem;border-left:2px solid var(--mark);color:var(--ink-2)}
.prose code{font-family:var(--mono);font-size:.86em;color:var(--mark);background:var(--mark-dim);padding:.08em .35em}
.prose pre{position:relative;background:var(--panel);border:1px solid var(--line-2);padding:1rem 1.1rem;overflow:auto;font-size:.82rem;line-height:1.7;margin:1.4rem 0}
.prose pre code{color:var(--ink-2);background:none;padding:0;font-size:inherit}
.prose pre.mermaid,.prose .mermaid{background:var(--panel);text-align:center}
.copy-btn{position:absolute;top:.5rem;right:.5rem;font-family:var(--mono);font-size:.62rem;color:var(--ink-3);background:var(--bg);border:1px solid var(--line-2);
  padding:.15rem .5rem;cursor:pointer;opacity:.75;transition:opacity .2s,color .2s,border-color .2s}
.copy-btn:hover{opacity:1;color:var(--mark);border-color:var(--mark)}
.prose table{width:100%;border-collapse:collapse;font-size:.88rem;margin:1.4rem 0;display:block;overflow-x:auto}
.prose th,.prose td{border-bottom:1px solid var(--line-2);padding:.5rem .6rem;text-align:left;vertical-align:top}
.prose th{font-family:var(--sans);font-size:.78rem;color:var(--ink-3);font-weight:600;letter-spacing:.02em}
.prose th strong{font-weight:inherit}   /* CSDN 导入的表头常包一层 strong，避免中文回退字体被二次加粗 */
.prose ul,.prose ol{padding-left:1.4rem;margin:0 0 1.2em}
.prose li{margin:.3rem 0}
.prose li::marker{color:var(--mark)}
.prose hr{border:0;border-top:1px dashed var(--line-2);margin:2.4rem 0}
.post-foot{grid-column:1 / -1;display:flex;justify-content:space-between;gap:1rem;padding:1.2rem 0 3rem;border-top:1px solid var(--line);font-family:var(--mono);font-size:.72rem}
.post-foot a{color:var(--ink-3)}
.post-foot a:hover{color:var(--mark)}

/* ========================= 归档 / 标签 ========================= */
.archive{margin-bottom:3rem}
.archive-month{display:grid;grid-template-columns:8rem minmax(0,1fr);gap:1.2rem;padding:1.2rem 0;border-bottom:1px solid var(--line)}
.archive-month-label{position:sticky;top:4.2rem;align-self:start;font-family:var(--mono);font-size:.78rem;color:var(--mark)}
.archive-timeline{display:grid;border-left:1px solid var(--line-2)}
.archive-row{position:relative;display:flex;justify-content:space-between;gap:1rem;padding:.4rem 0 .4rem 1rem;transition:background .2s}
.archive-row:hover{background:var(--mark-dim)}
.archive-dot{position:absolute;left:-4px;top:.95rem;width:7px;height:7px;border-radius:50%;background:var(--ink-3)}
.archive-row:hover .archive-dot{background:var(--mark);box-shadow:var(--glow-shadow)}
.archive-title{font-size:.92rem;color:var(--ink)}
.archive-row:hover .archive-title{color:var(--mark)}
.archive-date{font-family:var(--mono);font-size:.68rem;color:var(--ink-3);white-space:nowrap}
.tag-cloud{display:flex;flex-wrap:wrap;align-items:baseline;gap:.4rem 1rem;padding:1.2rem 0 3rem}
.tag-prop{line-height:1.6;transition:color .2s}
.tag-prop:hover{color:var(--mark)!important}
.tag-prop .c{font-family:var(--mono);font-size:.7em;color:var(--ink-3)}

/* ========================= 页脚 / 标签栏 / 回到顶部 ========================= */
.site-footer{margin-top:3rem;border-top:1px solid var(--line);padding:1.6rem 0 2.4rem;font-family:var(--mono);font-size:.7rem;color:var(--ink-3)}
.site-footer .wrap{display:flex;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.site-footer a:hover{color:var(--mark)}
.tabbar{display:none}
.back-to-top{position:fixed;right:1.2rem;bottom:1.2rem;z-index:45;display:grid;place-items:center;width:2.6rem;height:2.6rem;font-family:var(--mono);
  background:var(--panel);color:var(--ink-2);border:1px solid var(--line-2);cursor:pointer;opacity:0;pointer-events:none;transition:opacity .25s,color .2s,border-color .2s}
.back-to-top.show{opacity:1;pointer-events:auto}
.back-to-top:hover{color:var(--mark);border-color:var(--mark)}

/* ========================= 文字动效（站点特有部分） ========================= */
html.m-on .m-row{opacity:0;transform:translateX(-10px)}
html.m-on .m-row.is-in{opacity:1;transform:none;transition:opacity .5s var(--ease),transform .5s var(--ease);transition-delay:calc(var(--i,0) * 45ms)}
html.m-on .page-head .count,html.m-on .page-head h1 + p{opacity:0}
html.m-on.m-ready .page-head .count,html.m-on.m-ready .page-head h1 + p{animation:rise .6s .35s var(--ease) forwards}
/* 正文重点词：读到时画出荧光划线 */
/* 只给段落里的重点词画线；整段只有一个加粗词（旧文常拿它当小标题）由 JS 标为 .is-label，不画 */
.prose > p strong:not(.is-label){background:linear-gradient(transparent 64%,color-mix(in srgb,var(--mark) 22%,transparent) 64%) no-repeat;background-size:100% 100%}
html.m-on .prose > p.m-rise strong:not(.is-label){background-size:0% 100%;transition:background-size .8s .35s var(--ease)}
html.m-on .prose > p.m-rise.is-in strong:not(.is-label){background-size:100% 100%}
.prose > p > strong.is-label{display:inline-block;margin-top:.6rem;color:var(--ink)}
html.m-on [data-reveal]{opacity:0;transform:translateY(12px);transition:opacity .6s var(--ease),transform .6s var(--ease)}
html.m-on [data-reveal].is-in{opacity:1;transform:none}

/* ========================= 响应式 ========================= */
@media(max-width:1080px){
  .rec{display:none}
  .site-nav a{padding:.3rem .45rem;font-size:.82rem}
  .site-nav a[aria-current="page"]::after{left:.45rem;right:.45rem}
}
@media(max-width:1100px){
  .post-layout{grid-template-columns:minmax(0,1fr)}
  .rail{display:none}
}
@media(max-width:960px){
  .daily-top,.latest,.home-head{grid-template-columns:1fr}
  .channels{grid-template-columns:repeat(2,minmax(0,1fr))}
  .radar-featured,.radar-quick-list,.radar-quick-grid,.opensource-trends ol,.radar-trends ol{grid-template-columns:1fr}
  .radar-feature:first-of-type{grid-row:auto}
  .opensource-lead{grid-template-columns:1fr}
}
@media(max-width:760px){
  .site-nav{display:none}
  .rec{display:none}
  .bar-tools{margin-left:auto}
  .telemetry{grid-template-columns:repeat(2,1fr)}
  .channels{grid-template-columns:1fr}
  .viewer-cap .cap-note{margin-left:0}
  .log a{grid-template-columns:3.6rem minmax(0,1fr)}
  .log .take-date{grid-column:2;text-align:left;padding-top:0;order:-1}
  .takes a{grid-template-columns:4rem 1fr}
  .takes .take-date{display:none}
  .archive-month{grid-template-columns:1fr;gap:.6rem}
  .archive-month-label{position:static}
  .chat-turn{max-width:100%}
  body{padding-bottom:calc(4.2rem + env(safe-area-inset-bottom))}
  .back-to-top{bottom:calc(5rem + env(safe-area-inset-bottom))}
  .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:45;background:color-mix(in srgb,var(--bg) 92%,transparent);
    backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-top:1px solid var(--line-2);padding:.3rem .3rem calc(.3rem + env(safe-area-inset-bottom))}
  .tabbar a{flex:1;min-width:0;display:grid;justify-items:center;gap:.1rem;padding:.25rem 0;color:var(--ink-3)}
  .tabbar svg{width:1.15rem;height:1.15rem;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
  .tab-label{font-size:.62rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  .tabbar a[aria-current="page"]{color:var(--mark)}
}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}
/* 列表紧跟页头时只保留页头底线，避免两条平行线 */
.page-head + .log,.page-head + .post-list,.page-head + .chat-inbox{border-top:0}
