/* =====================================================================
   研行 · 学业跟踪 —— 重构样式（源力设计系统 Yuanli Design System）
   令牌来源：tokens.css（colors_and_type.css，字节云 B2B 后台规范）
   基准：4px 栅格 · 32px 操作高度 · 48px 导航高度 · 主色 #1664FF
   本文件只负责外壳与业务组件样式，不改动 app.js 逻辑
   ===================================================================== */

/* ---------- 实测校准：以线上站点渲染值为准（覆盖规范默认） ---------- */
:root{
  --primary-1:#F5F5FF; --primary-2:#ECECFF; --primary-5:#6E6EFF;
  --primary-6:#5252FF; --primary-7:#3D3DE6;
  --color-primary:#5252FF; --primary-hover:#6E6EFF; --primary-active:#3D3DE6;
  --color-bg-4:#F6F6FC; --color-bg-5:#ECECF2;
  --divider:#EDEDF3;   /* 实测：火山引擎页面/分区分隔 hairline */
}

/* ---------- 重置与基线 ---------- */
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--color-bg-4);
  color:var(--color-text-1);
  font:400 14px/21px var(--font-body);
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
h1,h2,h3,h4,p{margin:0}
a{color:var(--primary-6);text-decoration:none}
a:hover{text-decoration:none;color:var(--primary-5)}
button,input,textarea,select{font:inherit;color:inherit}
button{cursor:pointer;appearance:none;border:0;background:none;-webkit-tap-highlight-color:transparent}
button:disabled{cursor:not-allowed;opacity:.5}
svg{display:block;flex:none}
[hidden]{display:none!important}
body:has(dialog[open]){overflow:hidden}
:focus-visible{outline:2px solid var(--primary-6);outline-offset:1px;border-radius:2px}
:is(input,textarea,select):focus-visible{outline:none}
::selection{background:var(--primary-2);color:var(--color-text-1)}
.skip{position:absolute;left:-9999px;top:0;background:#fff;padding:10px 16px;z-index:99;border-radius:4px;box-shadow:var(--shadow-3)}
.skip:focus{left:12px;top:12px}
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-thumb{background:#DDE2E9;border-radius:9999px;border:3px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:#C9CDD4;background-clip:content-box}

/* =====================================================================
   按钮 / 链接
   ===================================================================== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:32px;padding:0 16px;border-radius:6px;
  font:500 13px/20px var(--font-body);white-space:nowrap;
  background:#F1F2F9;color:var(--color-text-2);border:.5px solid transparent;
  transition:background .16s,color .16s;
}
.btn:hover{background:#E9EBF5;color:var(--color-text-1)}
.btn:active{background:#E2E5F3}
.btn:disabled{background:#F5F6FA;color:var(--color-text-4)}
.btn.primary{background:var(--primary-6);color:#fff}
.btn.primary:hover{background:var(--primary-hover);color:#fff}
.btn.primary:active{background:var(--primary-active)}
.btn.danger{background:transparent;color:var(--color-danger);box-shadow:0 0 0 .5px #F0BDBA}
.btn.danger:hover{background:var(--color-tag-danger-bg)}
.btn.ghost{background:transparent;color:var(--color-text-2);padding:0 10px}
.btn.ghost:hover{background:#F1F2F9;color:var(--color-text-1)}
.btn.ghost.danger{color:var(--color-danger)}
.btn.ghost.danger:hover{background:var(--color-tag-danger-bg);color:var(--color-danger)}
.btn.sm{height:28px;padding:0 12px;font-size:12px}
.btn.sm.ghost{padding:0 8px}

.link{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:28px;padding:0 8px;
  border-radius:var(--radius-sm);color:var(--primary-6);font:500 12px/1 var(--font-body);background:transparent;transition:background .16s}
.link:hover{background:rgba(22,100,255,.06)}

.icon-btn{display:grid;place-items:center;width:32px;height:32px;flex:none;border-radius:var(--radius-sm);
  color:var(--color-text-2);font-size:18px;line-height:1;transition:background .16s,color .16s}
.icon-btn:hover{background:var(--color-bg-5);color:var(--color-text-1)}

/* =====================================================================
   TopNav（56px · #F6F6FC · 无阴影，与侧栏同色连成一片）
   ===================================================================== */
.top-nav{position:sticky;top:0;z-index:100;height:56px;flex:none;width:100%;background:var(--color-bg-4);
  display:flex;align-items:center}
.hamburger-btn{width:48px;height:56px;flex:none;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px}
.hamburger-line{width:16px;height:2px;background:var(--color-text-2);border-radius:1px;transition:background .16s}
.hamburger-btn:hover .hamburger-line{background:var(--color-text-1)}
.nav-brand{display:flex;align-items:center;gap:10px;flex:none;padding:0 4px}
.brand-logo{width:26px;height:26px;flex:none;border-radius:6px;display:grid;place-items:center;background:var(--primary-6)}
.brand-name{display:flex;flex-direction:column;line-height:1.1;font:500 17px/1.1 var(--font-body);color:#1C2633;letter-spacing:.01em}
.brand-name small{font:400 10px/1.4 var(--font-body);letter-spacing:.16em;color:var(--color-text-3)}
.nav-links{display:flex;align-items:center;gap:24px;margin-left:32px;padding-left:24px;height:100%;overflow-x:auto}
.nav-link{font:400 13px/1 var(--font-body);color:var(--color-text-2);white-space:nowrap;transition:color .16s}
.nav-link:hover{color:var(--primary-6)}
.nav-right{margin-left:auto;display:flex;align-items:center;gap:12px;padding-right:16px}
.search-box{display:flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:1px solid var(--color-border-3);
  border-radius:6px;background:#fff;color:var(--color-text-3);transition:border-color .16s}
.search-box:focus-within{border-color:var(--primary-6)}
.search-input{border:0;outline:none;background:transparent;width:180px;font:400 13px/20px var(--font-body);color:var(--color-text-1)}
.search-input::placeholder{color:var(--color-text-3)}
.nav-icon{width:32px;height:32px;flex:none;display:grid;place-items:center;border-radius:8px;
  color:var(--color-text-2);transition:background .16s,color .16s}
.nav-icon:hover{background:var(--color-bg-5);color:var(--color-text-1)}
.nav-avatar{width:28px;height:28px;flex:none;border-radius:50%;background:var(--primary-2);color:var(--primary-7);
  font:500 12px/1 var(--font-body);display:grid;place-items:center;cursor:pointer}
.nav-login{font:400 13px/1 var(--font-body);color:var(--color-text-1);white-space:nowrap;transition:color .16s}
.nav-login:hover{color:var(--primary-6)}
.nav-sep{width:1px;height:16px;flex:none;background:var(--divider)}

/* 顶栏倒计时 chip —— 品牌淡染底 + 数字主色，让一长句里先被看见的是「还有多少天」 */
.cd-chip{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 12px 0 10px;border-radius:8px;
  background:linear-gradient(135deg,var(--primary-1) 0%,#fff 64%);
  border:1px solid #E7E7F6;transition:border-color .16s,box-shadow .16s,background .16s}
.cd-chip:hover{border-color:var(--primary-5);box-shadow:0 1px 3px rgba(82,82,255,.16)}
.cd-ico{width:15px;height:15px;flex:none;color:var(--primary-6)}
.cd-chip .countdown{display:inline-flex;align-items:baseline;gap:5px;background:none;border:0;height:auto;padding:0;
  color:var(--color-text-2);font:400 13px/20px var(--font-body);white-space:nowrap;cursor:pointer;transition:color .16s}
.cd-chip .countdown:hover{color:var(--primary-6)}
.cd-num{font:600 15px/20px var(--font-body);color:var(--primary-6);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.cd-unit{color:var(--color-text-2)}
.cd-date{color:var(--color-text-3)}
.cd-chip .countdown.is-near .cd-num{color:var(--color-warning)}
.cd-chip:has(.countdown.is-near){background:linear-gradient(135deg,var(--color-tag-warning-bg) 0%,#fff 64%);
  border-color:#F3E1BC}
.cd-chip:has(.countdown.is-near):hover{border-color:var(--color-warning)}

/* =====================================================================
   布局：灰底外壳 + 白色圆角内容面板
   ===================================================================== */
.layout{display:flex;align-items:stretch;min-height:calc(100vh - 56px);background:var(--color-bg-4);padding-top:8px}
.nav-collapsed .sidenav{display:none}

/* ---- Sidenav（200px · #F6F6FC） ---- */
.sidenav{width:200px;flex:none;background:var(--color-bg-4);display:flex;flex-direction:column;
  position:sticky;top:56px;height:calc(100vh - 56px);overflow:auto}
.sidenav-header{flex:none;display:flex;align-items:center;gap:8px;padding:16px 22px 8px}
.product-icon{width:24px;height:24px;flex:none;display:grid;place-items:center}
.product-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font:500 16px/24px var(--font-body);color:var(--color-text-1)}
.sidenav-menu{flex:1;overflow-y:auto;padding:4px 0 12px}
.menu-section{display:flex;flex-direction:column;gap:4px;padding:0 2px}
.group-title{padding:3px 14px;font:400 12px/20px var(--font-body);color:var(--color-text-3)}
.menu-group-block{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}
.menu-item{display:flex;align-items:center;gap:8px;width:100%;height:40px;padding:0 12px;
  border-radius:8px;background:transparent;color:var(--color-text-1);
  font:400 14px/22px var(--font-body);text-align:left;transition:background .15s}
.menu-item:hover{background:rgba(0,0,0,.04)}
.menu-item.is-active{background:#EBEBF5}
.menu-item.is-active .menu-text{color:var(--color-text-1);font-weight:500}
.menu-icon{flex:none;width:20px;height:20px;display:grid;place-items:center;color:var(--color-text-2)}
.menu-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.menu-chevron{flex:none;width:12px;height:12px;display:grid;place-items:center;color:var(--color-text-3)}
.rail-badge{flex:none;min-width:16px;height:16px;padding:0 5px;border-radius:9999px;
  background:var(--color-danger);color:#fff;font:500 10px/16px var(--font-mono);text-align:center}
.sidenav-state{flex:none;display:flex;align-items:center;gap:6px;padding:12px 22px;
  color:var(--color-text-3);font:400 12px/20px var(--font-body)}
.sidenav-state .dot{width:6px;height:6px;border-radius:50%;background:var(--color-success)}

/* ---- Content：白色圆角面板（浮在灰底上） ---- */
.content{flex:1;min-width:0;background:#fff;border-radius:12px 0 0 0;
  padding:0 32px 40px;min-height:calc(100vh - 64px)}

/* ---- PageHeader 复合件（面包屑 + 标题 + 描述 + 操作） ---- */
.page-header-comp{display:flex;flex-direction:column;position:relative;background:#fff;
  border-bottom:1px solid var(--divider);
  background-image:radial-gradient(130% 200% at 100% -50%,#F4F4FF 0%,rgba(255,255,255,0) 56%)}
.page-header-top{display:block;padding:26px 0 22px}
.page-header-left{display:flex;flex-direction:column;align-items:stretch;gap:10px;min-width:0}
.page-header-breadcrumb{display:flex;align-items:center;gap:2px}
.page-header-eyebrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.page-header-eyebrow::before{content:"";flex:none;width:3px;height:12px;border-radius:2px;
  background:linear-gradient(180deg,var(--primary-5),var(--primary-7))}
.page-header-eyebrow-dot{width:3px;height:3px;border-radius:50%;background:#C9CDD4;flex:none}
.page-header-breadcrumb-item{font:400 12px/20px var(--font-body);color:var(--color-text-3);cursor:pointer;white-space:nowrap}
.page-header-breadcrumb-item:hover{color:var(--primary-6)}
.page-header-breadcrumb-item.current{color:var(--color-text-2);font-weight:500;cursor:default}
.page-header-breadcrumb-item.current:hover{color:var(--color-text-2)}
.page-header-breadcrumb-sep{display:grid;place-items:center;padding:0 2px;color:var(--color-text-3)}
.page-header-breadcrumb-sep svg{width:14px;height:14px}
.page-header-title-row{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}
.page-header-title{font:600 28px/38px var(--font-body);color:#0B0B0F;letter-spacing:-.02em}
.page-header-desc{font:400 14px/22px var(--font-body);color:var(--color-text-2);max-width:66ch}
.page-header-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.page-header-meta-text{display:inline-flex;align-items:center;gap:6px;font:400 12px/18px var(--font-body);
  color:var(--color-text-3);letter-spacing:.01em;font-variant-numeric:tabular-nums;
  padding:1px 8px;border-radius:4px;background:var(--color-bg-4)}
.page-header-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:none}
.page-header-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:32px;padding:0 16px;
  border-radius:6px;background:#F1F2F9;color:var(--color-text-2);border:.5px solid transparent;
  font:500 13px/20px var(--font-body);white-space:nowrap;transition:background .15s,color .15s}
.page-header-btn:hover{background:#E9EBF5;color:var(--color-text-1)}
.page-header-btn.primary{background:var(--primary-6);color:#fff}
.page-header-btn.primary:hover{background:var(--primary-hover);color:#fff}
.page-foot{margin-top:64px;padding-top:20px;border-top:1px solid var(--color-border-2);
  color:var(--color-text-3);font:400 12px/20px var(--font-body)}
.kbd{display:inline-block;padding:0 5px;border-radius:3px;border:1px solid var(--color-border-3);
  font:500 11px/18px var(--font-mono);color:var(--color-text-2);background:var(--color-bg-4)}

/* =====================================================================
   通知
   ===================================================================== */
#notice:empty{display:none}
.notice{display:flex;gap:8px;align-items:center;margin:16px 0 0;padding:8px 14px;border-radius:var(--radius-sm);
  background:var(--color-tag-success-bg);color:var(--color-success);font:400 12px/20px var(--font-body);
  border:1px solid rgba(42,129,75,.22)}
.notice.is-error{background:var(--color-tag-danger-bg);color:var(--color-danger);border-color:rgba(215,49,42,.22)}
.notice.is-info{background:var(--color-bg-4);color:var(--color-text-2);border-color:var(--divider)}

/* =====================================================================
   分区
   ===================================================================== */
.page{display:block}
.section{margin-top:32px;border-top:1px solid var(--divider);padding-top:32px}
.section:first-child{margin-top:0;border-top:0;padding-top:0}
.section-head{display:flex;justify-content:space-between;align-items:center;gap:16px;min-height:32px;
  padding-bottom:13px;border-bottom:1px solid var(--divider);margin-bottom:18px}
.section-title{display:flex;align-items:center;gap:8px;font:600 16px/24px var(--font-body);color:#0B0B0F;letter-spacing:-.01em;min-width:0;overflow-wrap:anywhere}
.section-action{flex:none;display:flex;align-items:center;gap:8px}

/* =====================================================================
   指标卡（数字条）：软渐变卡面 + 首个主指标强调（对齐火山引擎控制台卡片）
   ===================================================================== */
.statbar{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:12px;margin:20px 0 12px}
.section .statbar{margin:0;grid-auto-flow:row;grid-template-columns:repeat(3,minmax(0,1fr))}
.stat{position:relative;min-width:0;padding:16px 18px 18px;border-radius:var(--radius-lg);overflow:hidden;
  background:linear-gradient(158deg,#F6F7FF 0%,#FCFDFF 60%,#FFFFFF 100%);
  border:1px solid var(--color-border-2);transition:border-color .16s,box-shadow .16s,transform .16s}
.stat::after{content:"";position:absolute;right:-34px;bottom:-46px;width:128px;height:128px;border-radius:50%;
  background:radial-gradient(circle,var(--state-hover),transparent 70%);pointer-events:none}
.stat:first-child::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;
  background:linear-gradient(90deg,var(--primary-5),var(--primary-7))}
.stat:hover{border-color:var(--primary-3);box-shadow:var(--shadow-1);transform:translateY(-1px)}
.stat-num{position:relative;z-index:1;font:600 30px/38px var(--font-body);color:var(--color-text-1);font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.stat-label{position:relative;z-index:1;font:400 13px/20px var(--font-body);color:var(--color-text-2);margin-top:4px}
.stat-note{position:relative;z-index:1;font:400 12px/20px var(--font-body);color:var(--color-text-3);margin-top:2px}

/* =====================================================================
   双栏
   ===================================================================== */
.cols{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:32px;align-items:start;margin-top:32px;border-top:1px solid var(--divider);padding-top:32px}
.cols>*{min-width:0}
.cols>:last-child{border-left:1px solid var(--color-border-2);padding-left:32px}
.cols .cols{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.cols .cols>:last-child{padding-left:20px}
.cols .section{border-top:0;padding-top:0}
.cols .section:first-child{border-top:0;padding-top:0;margin-top:0}
.cols>.section{margin-top:0}

/* =====================================================================
   行条目 / 列表
   ===================================================================== */
.list{display:flex;flex-direction:column}
.list.boxed{background:transparent}
.list.boxed .row{padding-left:20px;padding-right:20px}
@keyframes swap-in{from{opacity:.55;transform:translateY(3px)}to{opacity:1;transform:none}}
.list.boxed.is-swap{animation:swap-in .18s ease both}
.row{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;padding:16px;border-bottom:1px solid var(--color-border-3);transition:background .16s}
.row:last-child{border-bottom:0}
.row:hover,.row:focus-within{background:rgba(0,0,0,.03)}
.row-main{min-width:0}
.row-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:6px}
.row-date{font:400 12px/20px var(--font-mono);color:var(--color-text-3);margin-left:auto;font-variant-numeric:tabular-nums}
.row-title{font:500 14px/22px var(--font-body);color:var(--color-text-1);margin:2px 0 6px;overflow-wrap:anywhere}
.row-body{font:400 14px/22px var(--font-body);color:var(--color-text-2);white-space:pre-wrap;overflow-wrap:anywhere;margin:4px 0}
.row-note{font:400 12px/20px var(--font-body);color:var(--color-text-3);margin-top:4px;overflow-wrap:anywhere}
.row-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end;opacity:0;transform:translateY(2px);transition:opacity .16s,transform .16s}
.row:hover .row-actions,.row:focus-within .row-actions{opacity:1;transform:none}
@media(hover:none){.row-actions{opacity:1;transform:none}}
.row-actions .btn{height:28px;padding:0 12px;font-size:12px}
.attachments{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.attachments:empty{display:none}
.attachments img{width:96px;height:72px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--color-border-2)}
.attachments a{font-size:12px}

/* 卡片网格：目标与资料等条目两列铺开，信息密度与边界更清晰 */
.cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}
.cards>.row{border:1px solid var(--color-border-2);border-radius:var(--radius-md);padding:16px;
  transition:border-color .16s,background .16s,box-shadow .16s}
.cards>.row:hover,.cards>.row:focus-within{border-color:var(--color-border-3);background:var(--color-bg-1);box-shadow:var(--shadow-1)}
.cards>.row .row-actions{opacity:1;transform:none;justify-content:flex-start;margin-top:10px}
.cards>.empty{grid-column:1/-1}

/* =====================================================================
   标签
   ===================================================================== */
.pill{display:inline-flex;align-items:center;gap:4px;border-radius:var(--radius-sm);padding:1px 8px;
  background:#F2F3F5;color:var(--color-text-2);font:400 12px/20px var(--font-body);max-width:100%;overflow-wrap:anywhere}
.pill-ok{background:var(--color-tag-success-bg);color:var(--color-success)}
.pill-warn{background:var(--color-tag-warning-bg);color:var(--color-warning)}
.pill-danger{background:var(--color-tag-danger-bg);color:var(--color-danger)}
.pill-accent{background:var(--primary-2);color:var(--primary-6)}

/* =====================================================================
   空状态 / 提示
   ===================================================================== */
.empty{padding:0;color:var(--color-text-3)}
.empty p{margin:0 0 14px;font:400 14px/23px var(--font-body);color:var(--color-text-2);max-width:62ch}
.empty .link{display:inline-flex;align-items:center;justify-content:center;gap:6px;width:auto;height:34px;padding:0 16px;
  border-radius:6px;background:#F1F2F9;color:var(--color-text-1);font:500 13px/20px var(--font-body);
  border:.5px solid transparent;transition:background .16s,color .16s}
.empty .link::before{content:"＋";color:var(--primary-6);font-weight:400}
.empty .link:hover{background:var(--primary-1);color:var(--primary-6)}
.hintline{color:var(--color-text-3);font:400 13px/21px var(--font-body);margin:12px 0 0}
.hintline.loop{display:flex;align-items:center;flex-wrap:wrap;gap:2px;margin-top:20px;padding-top:16px;
  border-top:1px solid var(--divider)}
.hintline.loop .link{height:24px;padding:0 6px}
.hintline.draft{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:var(--color-tag-warning-bg);
  color:var(--color-warning);padding:8px 14px;border-radius:var(--radius-sm);border-left:3px solid var(--color-warning);margin:0 0 20px;font-weight:500}
.streak{display:flex;flex-wrap:wrap;align-items:baseline;gap:12px;margin:0 0 24px;padding:10px 20px;border-radius:8px;background:var(--color-bg-4)}
.streak b{font:500 13px/20px var(--font-body);color:var(--color-text-1)}
.streak span{font-size:12px;color:var(--color-text-3)}
.quiet{color:var(--color-text-3);font:400 13px/21px var(--font-body);padding:12px 0}
.eyebrow{display:block;font:500 12px/18px var(--font-body);color:var(--color-text-3);letter-spacing:.04em}

/* =====================================================================
   图表柱
   ===================================================================== */
.bars{display:flex;flex-direction:column;gap:12px}
.bar-row{display:grid;grid-template-columns:96px minmax(20px,1fr) 68px;align-items:center;gap:12px;font:400 12px/20px var(--font-body)}
.bar-name{color:var(--color-text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bar-track{display:block;height:8px;border-radius:9999px;background:var(--color-bg-5);overflow:hidden}
.bar-fill{display:block;height:100%;border-radius:9999px;background:var(--primary-6);transition:width .18s ease}
.bar-fill.alt{background:#A0C0FF}
.bar-val{text-align:right;font:400 12px/20px var(--font-mono);color:var(--color-text-2);font-variant-numeric:tabular-nums}
.bar-sub{grid-column:1/-1;font-size:11px;color:var(--color-text-3);margin-top:-4px}
.chart-empty{display:grid;place-items:center;min-height:96px;margin-top:2px;border-radius:var(--radius-md);
  background:var(--color-bg-4);color:var(--color-text-3);font:400 13px/21px var(--font-body)}

/* =====================================================================
   页签 / 母版-细节 / 定位条
   ===================================================================== */
.tabs{display:inline-flex;flex-wrap:wrap;gap:2px;padding:2px;border-radius:var(--radius-sm);background:var(--color-bg-5);margin-bottom:12px}
.tab{display:inline-flex;align-items:center;gap:6px;border:0;background:none;color:var(--color-text-3);padding:5px 12px;border-radius:var(--radius-sm);font:400 12px/20px var(--font-body);transition:all .16s}
.tab:hover{color:var(--color-text-1)}
.tab.is-active{background:#fff;color:var(--primary-6);font-weight:500;box-shadow:var(--shadow-1)}
.tab-count{font:500 10px/1 var(--font-mono);margin-left:6px;opacity:.75}
.master-detail{display:grid;grid-template-columns:200px minmax(0,1fr);gap:32px;align-items:start;margin-top:24px}
.master-detail>:last-child{border-left:1px solid var(--color-border-2);padding-left:24px;min-width:0}
.master{display:flex;flex-direction:column;gap:2px;position:sticky;top:24px}
.master-item{display:flex;justify-content:space-between;align-items:center;gap:8px;min-height:36px;
  border:0;background:none;color:var(--color-text-2);padding:8px 12px;border-radius:var(--radius-sm);text-align:left;
  font:400 13px/20px var(--font-body);transition:all .16s}
.master-item:hover{background:var(--color-bg-4);color:var(--color-text-1)}
.master-item.is-active{background:var(--primary-2);color:var(--primary-6);font-weight:500}
.master-count{font:500 10px/16px var(--font-mono);color:var(--color-text-3);background:var(--color-bg-5);border-radius:9999px;padding:2px 8px}
.master-item.is-active .master-count{background:#fff;color:var(--primary-6)}
/* 定位条：目标与资料页顶部的方向概览（克制卡面 + hairline 分隔，对齐火山引擎控制台） */
.locate{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;padding:4px 0;background:var(--color-bg-4);
  border:1px solid var(--color-border-2);border-radius:var(--radius-lg);overflow:hidden}
.locate>div{min-width:0;overflow-wrap:anywhere;padding:16px 24px;border-left:1px solid var(--color-border-3)}
.locate>div:first-child,.locate>div:nth-child(3n+1){border-left:0}
.locate .eyebrow{margin-bottom:6px}
.locate h3{font:600 16px/24px var(--font-body);color:var(--color-text-1);margin:0 0 4px}
.locate p{font:400 12px/20px var(--font-body);color:var(--color-text-3)}

/* =====================================================================
   工具栏 / 表单控件
   ===================================================================== */
.toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:16px 0;border-bottom:1px solid var(--color-border-2);margin-bottom:24px}
.toolbar .hintline,.toolbar>span{margin:0}
.toolbar .field-inline{display:flex;align-items:center;gap:6px}
.filter-more{position:relative;flex:none}
.filter-more>summary{display:inline-flex;align-items:center;height:32px;padding:0 12px;border:1px solid var(--color-border-3);
  border-radius:var(--radius-sm);background:#fff;color:var(--color-text-2);font:400 13px/1 var(--font-body);cursor:pointer;list-style:none;white-space:nowrap;box-shadow:var(--shadow-1)}
.filter-more>summary::-webkit-details-marker{display:none}
.filter-more[open]>summary{border-color:var(--primary-6);color:var(--primary-6)}
.filter-more-body{position:absolute;z-index:30;top:calc(100% + 6px);right:0;width:260px;display:flex;flex-direction:column;gap:12px;
  padding:16px;background:#fff;border:1px solid var(--color-border-2);border-radius:var(--radius-md);box-shadow:var(--shadow-3)}
.filter-more-body .field-inline{color:var(--color-text-2);font-size:12px}
.tool-actions{margin-left:auto;display:flex;gap:8px}

input,textarea,select{width:100%;border:1px solid var(--color-border-3);background:#fff;border-radius:var(--radius-sm);
  padding:5px 12px;color:var(--color-text-1);min-height:32px;font:400 13px/22px var(--font-body);transition:border-color .16s,box-shadow .16s}
input::placeholder,textarea::placeholder{color:var(--color-text-3)}
input:hover,textarea:hover,select:hover{border-color:#C9CDD4}
input:focus,textarea:focus,select:focus{border-color:var(--primary-6);box-shadow:0 0 0 2px rgba(22,100,255,.12);outline:none}
input[type=checkbox]{width:16px;min-height:16px;accent-color:var(--primary-6)}
textarea{min-height:88px;resize:vertical;line-height:22px}
input[type=file]{background:var(--color-bg-4);font-size:12px;padding:6px 10px}
input[type=file]::file-selector-button{font:inherit;color:var(--color-text-2);background:#fff;box-shadow:var(--shadow-gray);
  border:0;border-radius:var(--radius-sm);padding:4px 10px;margin-right:10px;cursor:pointer;height:24px}
.toolbar input,.toolbar select{width:auto;min-width:0}
.toolbar input[type=month]{max-width:170px}
.toolbar select{max-width:180px}
.toolbar .search{flex:1;min-width:170px}

/* 表单 */
.form-intro{color:var(--color-text-3);font:400 13px/22px var(--font-body);margin-bottom:20px}
.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.field{min-width:0}
.field.wide{grid-column:1/-1}
.field:not(.wide):has(+.field.wide){grid-column:1/-1}
.field-label{display:block;font:400 12px/20px var(--font-body);color:var(--color-text-3);margin-bottom:6px}
.field-help{font-size:12px;color:var(--color-text-3);margin-top:6px;line-height:20px}
.field:has(input[type=checkbox]){display:flex;align-items:center;gap:12px;grid-column:1/-1}
.field:has(input[type=checkbox]) .field-label{margin:0;order:2;color:var(--color-text-2)}
.form-grid>details{grid-column:1/-1;border-top:1px solid var(--color-border-2);padding:12px 0 2px}
.form-grid>details>summary{color:var(--primary-6);font:500 12px/20px var(--font-body);padding:2px 0;cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px}
.form-grid>details>summary::-webkit-details-marker{display:none}
.form-grid>details>summary::before{content:"";width:7px;height:7px;border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;transform:rotate(-45deg);transition:transform .16s}
.form-grid>details[open]>summary::before{transform:rotate(45deg)}
.form-grid>details .form-grid{margin-top:16px}
.form-actions{display:flex;justify-content:space-between;gap:12px;border-top:1px solid var(--color-border-2);
  padding:16px 0;margin-top:20px;position:sticky;bottom:-20px;background:#fff;z-index:1}
.form-grid+.field{margin-top:24px;padding-top:16px;border-top:1px solid var(--color-border-2)}
.form-error{font-size:12px;color:var(--color-danger);white-space:pre-wrap;margin-top:12px}
.subject-template{background:var(--color-bg-4);border:1px solid var(--color-border-2);border-radius:var(--radius-sm);padding:12px 16px;margin-top:8px}
.form-grid>details.subject-template{padding:16px;border:1px solid var(--color-border-2);margin-top:8px}
.form-grid>details.subject-template>summary{padding:4px 0;color:var(--primary-7);font-weight:500}
.field[hidden],details[hidden]{display:none!important}

/* =====================================================================
   日历 / 热力图
   ===================================================================== */
.cal{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}
.cal-head{text-align:center;font:500 11px/20px var(--font-body);color:var(--color-text-3);padding:4px 0;letter-spacing:.05em}
.cal-cell{position:relative;display:grid;place-items:center;height:36px;border:0;background:none;
  border-radius:var(--radius-sm);color:var(--color-text-2);font:400 12px/20px var(--font-body);transition:background .16s,color .16s}
.cal-cell:hover{background:var(--color-bg-5)}
.cal-cell.is-active{background:var(--primary-6);color:#fff;font-weight:500}
.cal-cell.is-today{box-shadow:inset 0 0 0 1.5px var(--primary-6)}
.cal-dot{position:absolute;bottom:4px;width:4px;height:4px;border-radius:50%;background:var(--primary-6)}
.cal-cell.is-active .cal-dot{background:#fff}
.cal-summary{display:flex;gap:20px;margin-top:16px;padding-top:16px;border-top:1px solid var(--color-border-2)}
.cal-summary b{font:600 18px/26px var(--font-body);color:var(--color-text-1);font-variant-numeric:tabular-nums}
.cal-summary span{font-size:12px;color:var(--color-text-3);margin-left:6px}

.heat{display:grid;grid-template-rows:repeat(7,13px);grid-auto-flow:column;gap:3px;overflow-x:auto;padding:2px 0 12px}
.heat-cell{width:13px;height:13px;padding:0;border:0;border-radius:3px;background:#E8EBF0;cursor:pointer;transition:transform .16s}
.heat-cell:hover{outline:1.5px solid var(--primary-6);outline-offset:1px}
.heat-cell.lvl-1{background:#D6E4FF}
.heat-cell.lvl-2{background:#A0C0FF}
.heat-cell.lvl-3{background:#387BFF}
.heat-cell.lvl-4{background:var(--primary-6)}
.heat-cell.is-today{box-shadow:0 0 0 1.5px var(--color-text-3)}

/* =====================================================================
   抽屉 / 弹窗
   ===================================================================== */
dialog{margin:0;padding:0;border:0;max-width:none;max-height:none;width:100vw;height:100dvh;background:transparent;color:var(--color-text-1);overflow:hidden}
dialog:not([open]){display:none}
dialog[open]{display:flex;justify-content:flex-end}
dialog::backdrop{background:rgba(12,13,14,.42)}
.confirm-dialog[open]{justify-content:center;align-items:center}
.confirm-dialog .sheet{width:min(440px,calc(100vw - 32px));height:auto;max-height:82vh;border-radius:var(--radius-md)}
.confirm-dialog .section-title{margin-bottom:16px}
.confirm-dialog p{line-height:22px}
.confirm-dialog .form-actions{justify-content:flex-end;position:static;border-top:1px solid var(--color-border-2);margin-top:16px}
.sheet{width:min(720px,100vw);height:100dvh;background:#fff;display:flex;flex-direction:column;box-shadow:var(--shadow-4)}
.sheet.is-wide{width:min(860px,100vw)}
.sheet-head{flex:none;display:flex;justify-content:space-between;align-items:center;gap:16px;
  padding:16px 24px;border-bottom:1px solid var(--color-border-2)}
.sheet-head h2{font:600 16px/24px var(--font-body);color:var(--color-text-1)}
.sheet-body{flex:1 1 auto;overflow-y:auto;padding:24px;min-height:0;overscroll-behavior:contain;scrollbar-gutter:stable}

/* =====================================================================
   数据与备份 / 导入 / 差异
   ===================================================================== */
.export-list{display:grid;grid-template-columns:1fr;gap:0;margin:16px 0;border:1px solid var(--color-border-2);border-radius:var(--radius-md);overflow:hidden}
.export-list a{display:flex;flex-direction:column;gap:2px;padding:12px 16px;background:#fff;border-bottom:1px solid var(--color-border-2);transition:background .16s}
.export-list a:last-child{border-bottom:0}
.export-list a:hover{background:var(--primary-1)}
.export-list b{font:500 13px/20px var(--font-body);color:var(--color-text-1)}
.export-list span{font-size:12px;color:var(--color-text-3)}
.tools-body h3{font:500 14px/22px var(--font-body);color:var(--color-text-1);margin:32px 0 12px;padding-top:20px;border-top:1px solid var(--color-border-2)}
/* 文件选择：限制宽度并与操作按钮同排，避免整行空白与按钮堆叠 */
.tools-body input[type=file]{width:auto;max-width:min(100%,420px);display:inline-block;vertical-align:middle;
  margin-top:12px;padding:5px 10px;background:var(--color-bg-4);border-radius:var(--radius-md)}
.tools-body input[type=file]::file-selector-button{margin-right:10px;padding:2px 12px;border:1px solid var(--color-border-3);
  border-radius:6px;background:#fff;color:var(--color-text-2);font:500 12px/20px var(--font-body);cursor:pointer;box-shadow:none;
  transition:background .16s,border-color .16s,color .16s}
.tools-body input[type=file]::file-selector-button:hover{background:var(--primary-1);border-color:var(--primary-5);color:var(--primary-6)}
.tools-body>button{margin-top:12px;margin-left:12px;vertical-align:middle}
.tools-feedback:empty{display:none}
.tools-feedback{padding:10px 14px;margin-top:16px;background:var(--color-tag-danger-bg);border-radius:var(--radius-sm);color:var(--color-danger);font:400 12px/20px var(--font-body);overflow-wrap:anywhere}
.tools-feedback.is-success{background:var(--color-tag-success-bg);color:var(--color-success)}
.conflict{border:1px solid var(--color-border-2);border-radius:var(--radius-sm);padding:12px;margin-top:12px}
.conflict pre{white-space:pre-wrap;overflow-wrap:anywhere;font:400 11px/18px var(--font-mono);background:var(--color-bg-4);padding:8px;border-radius:4px;margin:8px 0 0}
.diff{margin-top:8px;display:flex;flex-direction:column;gap:2px}
.diff-row{display:grid;grid-template-columns:88px minmax(0,1fr) minmax(0,1fr);gap:12px;align-items:baseline;
  padding:6px 0;border-top:1px solid var(--color-border-2);font:400 12px/20px var(--font-body)}
.diff-head{border-top:0;color:var(--color-text-3);font-size:11px}
.diff-key{color:var(--color-text-3)}
.diff-from{color:var(--color-text-3);text-decoration:line-through;overflow-wrap:anywhere}
.diff-to{color:var(--color-text-1);overflow-wrap:anywhere}
.diff .quiet{padding:8px 0}
.source-details{margin:6px 0 2px;font-size:12px;color:var(--color-text-3)}
.source-details summary{padding:4px 0;width:fit-content;cursor:pointer}
.source-details summary:hover{color:var(--primary-6)}
.source-details[open]{padding:8px 12px;background:var(--color-bg-4);border-left:2px solid var(--color-border-3)}
.guide-step,.weekly-prompt{padding:16px 0;border-bottom:1px solid var(--color-border-2)}
.guide-step:last-child,.weekly-prompt:last-child{border-bottom:0}
.weekly-prompt .quiet{padding:8px 0}
.guide-step .eyebrow,.weekly-prompt .eyebrow{margin-bottom:4px}
summary{cursor:pointer}
details p{overflow-wrap:anywhere;font-size:12px;color:var(--color-text-3);margin:4px 0}

/* =====================================================================
   加载
   ===================================================================== */
.skeleton{padding:32px 0;color:var(--color-text-3);font-size:12px}

/* =====================================================================
   数据体检
   ===================================================================== */
.audit-summary{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 12px;margin:24px 0 0;padding:12px 16px;
  border-radius:var(--radius-sm);background:var(--color-tag-success-bg);border-left:3px solid var(--color-success)}
.audit-summary.has-issues{background:var(--color-tag-warning-bg);border-left-color:var(--color-warning)}
.audit-summary b{font:500 13px/20px var(--font-body);color:var(--color-text-1)}
.audit-summary span{font-size:12px;color:var(--color-text-3)}
.checks{display:flex;flex-direction:column}
.check{padding:18px 0;border-bottom:1px solid var(--divider)}
.check:last-child{border-bottom:0}
.check-head{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:0}
.check-title{font:600 14px/22px var(--font-body);color:#0B0B0F;letter-spacing:-.01em;overflow-wrap:anywhere}
.check-count{flex:none;border-radius:9999px;padding:1px 10px;font:500 12px/20px var(--font-body)}
.check-hint{color:var(--color-text-3);font:400 12px/20px var(--font-body);margin:4px 0 0;max-width:72ch}
.check-list{display:flex;flex-direction:column;gap:2px;margin-top:8px}
.check-item{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:6px 0;border-top:1px solid var(--color-border-2)}
.check-item-text{display:flex;flex-direction:column;gap:1px;min-width:0}
.check-item-label{font:400 12px/20px var(--font-body);color:var(--color-text-1);overflow-wrap:anywhere}
.check-item-sub{font:400 11px/18px var(--font-body);color:var(--color-text-3);overflow-wrap:anywhere}
.check-item .btn{flex:none}
.check .source-details{margin-top:8px}

/* =====================================================================
   倒计时 / 补录
   ===================================================================== */
.countdown{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px;border:1px solid transparent;
  border-radius:6px;background:var(--primary-1);color:var(--primary-6);font:500 12px/22px var(--font-body);transition:background .16s}
.countdown:hover{border-color:var(--primary-6);color:var(--primary-6)}
.countdown.is-near{background:var(--color-tag-warning-bg);border-color:transparent;color:var(--color-warning);font-weight:500}
.inline-actions{display:inline-flex;gap:8px;align-items:center;flex-wrap:wrap}
.quickfix{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--color-border-2)}
.quickfix:first-of-type{border-top:0}
.quickfix-text{flex:1;min-width:0;font-size:12px;color:var(--color-text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* =====================================================================
   错题收件箱 / 手机传照
   ===================================================================== */
/* 手机传照：品牌淡染横幅（借鉴火山引擎信息条的克制处理），开启后降为中性卡面 */
.lan-card{padding:18px 20px;border-radius:var(--radius-lg);background:var(--primary-1);border:1px solid var(--primary-2)}
.lan-card.is-on{background:var(--color-bg-4);border-color:var(--divider)}
.lan-main{display:flex;gap:14px;align-items:flex-start}
.lan-ico{width:40px;height:40px;flex:none;border-radius:10px;display:grid;place-items:center;
  background:#fff;border:1px solid var(--primary-2);color:var(--primary-6)}
.lan-card.is-on .lan-ico{border-color:var(--divider)}
.lan-text{min-width:0;display:flex;flex-direction:column;gap:3px}
.lan-title{font:500 14px/22px var(--font-body);color:var(--color-text-1)}
.lan-desc{font:400 13px/21px var(--font-body);color:var(--color-text-2);max-width:72ch}
.lan-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:16px}
.lan-note{margin-top:12px;font:400 12px/20px var(--font-body);color:var(--color-text-3)}
.lan-live{display:flex;gap:20px;align-items:flex-start;flex-wrap:wrap;margin-top:18px;
  padding-top:18px;border-top:1px solid var(--primary-2)}
.lan-card.is-on .lan-live{border-top-color:var(--divider)}
.lan-qr{width:160px;height:160px;flex:none;padding:10px;background:#fff;border:1px solid var(--color-border-2);border-radius:var(--radius-md);box-shadow:var(--shadow-1)}
.lan-qr svg{width:100%;height:100%;display:block}
.lan-info{flex:1;min-width:200px;display:flex;flex-direction:column;gap:12px;justify-content:center}
.lan-url{display:block;padding:8px 10px;background:#fff;border:1px solid var(--primary-2);border-radius:var(--radius-sm);
  font:400 12px/20px var(--font-mono);color:var(--color-text-2);word-break:break-all}
.lan-card.is-on .lan-url{background:var(--color-bg-1);border-color:var(--color-border-2)}

/* 收件箱条目：缩略图 + 正文（操作常驻，便于逐条归类） */
.inbox-card{display:flex;gap:16px;padding:16px 0;border-bottom:1px solid var(--divider)}
.inbox-card:last-child{border-bottom:0}
.inbox-media{flex:none;width:100px;display:flex;flex-direction:column;gap:8px}
.inbox-media a{display:block;line-height:0;border:1px solid var(--color-border-2);border-radius:8px;overflow:hidden}
.inbox-media img{width:100px;height:100px;object-fit:cover}
.inbox-thumb-empty{width:100px;height:100px;border-radius:8px;display:grid;place-items:center;
  background:var(--color-bg-4);border:1px dashed var(--color-border-3);color:var(--color-text-4)}
.inbox-thumb-empty svg{width:22px;height:22px}
.inbox-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px}
.inbox-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}
.inbox-date{margin-left:auto;font:400 12px/20px var(--font-mono);color:var(--color-text-3);font-variant-numeric:tabular-nums}
.inbox-note{font:500 14px/22px var(--font-body);color:var(--color-text-1);overflow-wrap:anywhere}
.inbox-sub{font:400 12px/20px var(--font-body);color:var(--color-text-3);overflow-wrap:anywhere}
.inbox-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:2px}
@media(max-width:720px){
  .inbox-card{flex-direction:column;gap:12px}
  .inbox-media{flex-direction:row;flex-wrap:wrap;width:auto}
  .inbox-media img,.inbox-thumb-empty{width:76px;height:76px}
  .lan-live{gap:16px}
  .lan-qr{width:140px;height:140px}
}

/* =====================================================================
   内置计时器
   ===================================================================== */
.timer{position:fixed;right:20px;bottom:20px;z-index:60;background:#fff;border:1px solid var(--color-border-2);
  border-radius:var(--radius-md);box-shadow:var(--shadow-4);overflow:hidden;min-width:176px}
.timer.is-running{border-color:var(--primary-6)}
.timer-toggle{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:12px 16px;border:0;background:transparent;color:var(--color-text-1)}
.timer-clock{font:500 19px/1 var(--font-mono);letter-spacing:.02em;font-variant-numeric:tabular-nums}
.timer.is-running .timer-clock{color:var(--primary-6)}
.timer-caret{color:var(--color-text-3);font-size:12px}
.timer-body{padding:0 16px 16px;display:flex;flex-direction:column;gap:12px}
.timer-hint{font-size:12px;color:var(--color-text-3);line-height:20px}
.timer-actions{display:flex;gap:8px;flex-wrap:wrap}

/* =====================================================================
   统一选择器（app.js 生成）
   ===================================================================== */
.choice{position:relative;min-width:0;width:100%}
.choice select.choice-native{position:absolute;width:1px;height:1px;min-height:0;padding:0;border:0;opacity:0;clip-path:inset(50%);pointer-events:none}
.choice-trigger{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:32px;padding:5px 12px;text-align:left;
  background:#fff;border:1px solid var(--color-border-3);border-radius:var(--radius-sm);font:400 13px/22px var(--font-body);transition:border-color .16s,box-shadow .16s}
.choice-trigger::after{content:'';flex:none;width:7px;height:7px;border-right:1.6px solid var(--color-text-3);border-bottom:1.6px solid var(--color-text-3);transform:rotate(45deg);margin:0 3px 4px;transition:transform .16s}
.choice-trigger:hover{border-color:#C9CDD4}
.choice-trigger[aria-expanded=true],.choice-trigger:focus-visible{border-color:var(--primary-6);outline:none;box-shadow:0 0 0 2px rgba(22,100,255,.12)}
.choice-trigger[aria-expanded=true]::after{transform:rotate(225deg);margin-bottom:0}
.choice-panel{position:fixed;z-index:100;display:flex;flex-direction:column;gap:8px;padding:8px;background:#fff;border:1px solid var(--color-border-2);border-radius:var(--radius-md);box-shadow:var(--shadow-3);overflow:hidden;animation:choice-in .12s ease}
.choice-panel .choice-search{min-height:32px;flex:none;font-size:13px;padding:5px 10px}
.choice-list{min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable}
.choice-option{display:block;width:100%;border:0;border-radius:var(--radius-sm);padding:6px 12px;background:#fff;font:400 13px/22px var(--font-body);text-align:left;overflow-wrap:anywhere}
.choice-option[aria-selected=true]{background:var(--primary-2);color:var(--primary-6);font-weight:500}
.choice-option.is-highlighted,.choice-option:hover{background:var(--color-bg-5)}
.choice-empty{padding:16px;color:var(--color-text-3);font-size:12px}
.toolbar .choice{width:180px;flex:0 1 180px}

/* =====================================================================
   附件上传
   ===================================================================== */
.upload-input{position:absolute!important;width:1px!important;height:1px!important;min-height:0!important;opacity:0;clip-path:inset(50%);padding:0!important;pointer-events:none}
.upload-zone{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:24px 16px;
  background:var(--color-bg-4);border:1px dashed var(--color-border-3);border-radius:var(--radius-md);transition:background .16s,border-color .16s;cursor:pointer}
.upload-zone.is-dragging,.upload-zone:focus-within{background:var(--primary-1);border-color:var(--primary-6)}
.upload-title{font:500 13px/20px var(--font-body);color:var(--color-text-1)}
.upload-help{display:block;font-size:12px;line-height:20px;color:var(--color-text-3);overflow-wrap:anywhere}
.upload-status{margin-top:8px;font-size:12px;color:var(--primary-6);overflow-wrap:anywhere}
.upload-status:empty{display:none}
.upload-list{display:flex;flex-direction:column;gap:8px;margin-top:12px}
.upload-list:empty{display:none}
.upload-item{display:flex;align-items:center;gap:12px;padding:12px;border:1px solid var(--color-border-2);border-radius:var(--radius-sm);min-width:0;background:#fff}
.upload-item img,.upload-file-icon{width:56px;height:56px;flex:none;object-fit:cover;border-radius:var(--radius-sm);background:var(--color-bg-5)}
.upload-file-icon{display:grid;place-items:center;color:var(--color-text-3);font-size:11px}
.upload-info{flex:1;min-width:0;font-size:12px;overflow-wrap:anywhere}
.upload-name{display:block;color:var(--color-text-1)}
.upload-info progress{width:100%;height:6px;accent-color:var(--primary-6)}
.upload-info .form-error{margin-top:4px;font-size:11px}
.upload-item.is-failed{border-color:var(--color-danger);background:var(--color-tag-danger-bg)}
.upload-item .btn{flex:none;height:28px;padding:0 10px;font-size:12px}

/* =====================================================================
   动效
   ===================================================================== */
dialog[open]>.sheet{animation:sheet-in .24s ease both}
dialog[open]::backdrop{animation:scrim-in .2s ease both}
dialog.is-closing>.sheet{animation:sheet-out .18s ease both}
dialog.is-closing::backdrop{animation:scrim-out .16s ease both}
.confirm-dialog[open]>.sheet{animation:confirm-in .18s ease both}
.confirm-dialog.is-closing>.sheet{animation:confirm-out .14s ease both}
@keyframes sheet-in{from{opacity:0;transform:translateX(40px)}to{opacity:1;transform:none}}
@keyframes sheet-out{from{opacity:1;transform:none}to{opacity:0;transform:translateX(30px)}}
@keyframes confirm-in{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}
@keyframes confirm-out{from{opacity:1;transform:none}to{opacity:0;transform:scale(.98)}}
@keyframes scrim-in{from{background:rgba(12,13,14,0)}to{background:rgba(12,13,14,.42)}}
@keyframes scrim-out{from{background:rgba(12,13,14,.42)}to{background:rgba(12,13,14,0)}}
@keyframes choice-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@keyframes page-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.page{animation:page-in .3s ease both}
@media(prefers-reduced-motion:reduce){
  *{transition:none!important;animation:none!important}
  dialog[open]>.sheet,dialog::backdrop,.choice-panel{animation:none!important}
}

/* =====================================================================
   响应式
   ===================================================================== */
@media(max-width:1180px){
  .cols{grid-template-columns:minmax(0,1fr) 300px;gap:24px}
  .master-detail{grid-template-columns:176px minmax(0,1fr);gap:24px}
}
@media(max-width:1024px){
  .layout{flex-direction:column;padding-top:0}
  .sidenav{position:static;height:auto;width:100%;flex-direction:row;flex-wrap:wrap;align-items:center;
    border-bottom:1px solid var(--color-border-2)}
  .sidenav-header{padding:10px 16px}
  .sidenav-menu{flex:1 0 100%;overflow-x:auto;padding:0 8px 8px}
  .menu-section{flex-direction:row;flex-wrap:wrap;align-items:center;gap:2px;padding:0}
  .menu-group-block{flex-direction:row;gap:2px;margin:0}
  .menu-item{width:auto;height:34px}
  .group-title{display:none}
  .sidenav-state{display:none}
  .nav-links{display:none}
  .content{padding:0 20px 32px;border-radius:12px 12px 0 0}
  .page-header-top{flex-direction:column;align-items:stretch;gap:12px;padding:20px 0 16px}
  .cols{grid-template-columns:1fr;gap:24px}
  .cols>:last-child{border-left:0;padding-left:0;padding-top:20px;border-top:1px solid var(--color-border-2)}
  .cols .cols>:last-child{border-left:0;padding-left:0}
  .master-detail{grid-template-columns:1fr;gap:16px}
  .master-detail>:last-child{border-left:0;padding-left:0}
  .master{flex-direction:row;flex-wrap:wrap;overflow-x:auto;position:static;padding-bottom:12px;border-bottom:1px solid var(--color-border-2)}
}
@media(max-width:640px){
  .search-box{display:none}
  .content{padding:0 16px 24px}
  .page-header-title{font-size:20px;line-height:28px}
  .statbar{grid-auto-flow:row;grid-template-columns:repeat(2,minmax(0,1fr))}
  .stat{padding:16px}
  .row{padding:16px 12px}
  .row-actions{opacity:1;transform:none;justify-content:flex-start}
  .form-grid{grid-template-columns:1fr}
  .field.wide,.form-grid>details{grid-column:1}
  .locate{grid-template-columns:1fr;gap:0}
  .locate>div{border-left:0;border-top:1px solid var(--color-border-3)}
  .locate>div:first-child{border-top:0}
  .cards{grid-template-columns:1fr}
  .bar-row{grid-template-columns:80px minmax(16px,1fr) 58px}
  .sheet{width:100vw}
  .timer{right:12px;bottom:12px;left:12px;min-width:0}
}

/* =====================================================================
   hairline 统一：对齐火山引擎（分隔线一律 #EDEDF3）
   ===================================================================== */
.row,.toolbar,.guide-step,.weekly-prompt,.check-item,.quickfix,.page-foot,
.cols>:last-child,.master-detail>:last-child,.cal-summary,.form-grid>details,
.form-actions,.sheet-head,.export-list a,.subject-card+.subject-card{border-color:var(--divider)}
