/* 个人总控台 v2.3 · 布局与组件（只引用 Token，不写死色值） */
/* ---- 壳：顶栏 / 抽屉 / 页面 ---- */
.topbar{position:sticky;top:0;z-index:var(--z-sticky);display:flex;align-items:center;gap:var(--space-3);height:52px;padding:0 var(--space-4);background:var(--surface);border-bottom:1px solid var(--border)}
.brand{display:flex;align-items:center;gap:var(--space-2);text-decoration:none;color:var(--fg);font-weight:var(--weight-ann)}
.brand-ic{color:var(--accent)}.brand-ver{font-weight:var(--weight-read)}
.mainnav{display:flex;gap:2px;margin-left:var(--space-3)}
.mainnav a,.drawer-nav a{padding:8px 14px;border-radius:9px;font-size:var(--text-base);font-weight:var(--weight-em);color:var(--muted);text-decoration:none;transition:color var(--motion-fast) var(--ease),background var(--motion-fast) var(--ease)}
.mainnav a:hover,.drawer-nav a:hover{color:var(--fg-2);background:var(--surface-warm)}
.mainnav a.on,.drawer-nav a.on{background:var(--accent-soft);color:var(--accent)}
.topbar-acts{margin-left:auto;display:flex;align-items:center;gap:var(--space-2)}
.topbar-ver{white-space:nowrap}
.searchbox{position:relative;display:flex;align-items:center;gap:6px;color:var(--meta)}
.searchbox input{border:1px solid var(--border);border-radius:var(--radius-btn);background:var(--surface);padding:6px 9px 6px 26px;font-size:13px;width:180px;color:var(--fg)}
.searchbox .icon-i{position:absolute;left:7px}
.search-drop{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);box-shadow:var(--elev-raised);padding:4px;max-height:320px;overflow:auto}
.search-drop button{display:flex;gap:8px;align-items:center;width:100%;border:0;background:none;text-align:left;padding:8px;border-radius:var(--radius-btn);cursor:pointer;color:var(--fg);font-size:13px}
.search-drop button:hover{background:var(--surface-warm)}
.oplog-badge{display:inline-flex;align-items:center;gap:4px;font-size:var(--text-sm);color:var(--warn-ink);background:var(--warn-soft);border-radius:var(--radius-pill);padding:3px 10px}
.icon-btn{display:inline-flex;align-items:center;justify-content:center;min-width:var(--touch-min);min-height:var(--touch-min);border:0;background:none;color:var(--fg-2);cursor:pointer;border-radius:var(--radius-btn)}
.only-mobile{display:none}
.drawer-mask{position:fixed;inset:0;z-index:var(--z-drawer);background:rgba(15,23,42,.32)}
.drawer{position:fixed;top:0;left:0;bottom:0;z-index:calc(var(--z-drawer) + 1);width:var(--sidebar-drawer-w);background:var(--surface);padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3);box-shadow:var(--elev-raised)}
.drawer-nav{display:flex;flex-direction:column;gap:2px}
.page{max-width:var(--container-max);margin:0 auto;padding:var(--space-4) var(--space-4) var(--space-8)}
/* ---- 通用：区块 / 卡片 / 文案 ---- */
.section{margin-top:var(--section-y)}
.sec-head{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-2);font-size:var(--text-md);font-weight:var(--weight-ann)}
.sec-head .cnt{font-size:var(--text-sm);color:var(--meta);font-weight:var(--weight-read)}
.sec-head .spacer{flex:1}
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);padding:var(--space-3) var(--space-4)}
.meta{color:var(--meta);font-size:var(--text-sm)}
.muted{color:var(--muted)}
.empty{padding:22px 0;text-align:center;color:var(--meta);font-size:13px;display:flex;flex-direction:column;align-items:center;gap:6px}
.danger-ink{color:var(--danger-ink)}.warn-ink{color:var(--warn-ink)}.success-ink{color:var(--success-ink)}
.hl{box-shadow:0 0 0 2px var(--accent);border-radius:var(--radius-card);transition:box-shadow 400ms var(--ease)}
/* ---- 按钮 ---- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:var(--radius-btn);border:1px solid var(--border);background:transparent;color:var(--accent);font-size:13px;font-weight:var(--weight-em);padding:8px 13px;min-height:38px;cursor:pointer;transition:background var(--motion-fast) var(--ease),border-color var(--motion-fast) var(--ease)}
.btn:hover{background:var(--surface-warm)}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-on)}
.btn.primary:hover{background:var(--accent-hover)}.btn.primary:active{background:var(--accent-active)}
.btn.green{background:var(--success);border-color:var(--success);color:var(--accent-on)}
.btn.green:hover{filter:brightness(.92)}
.btn.red{background:var(--surface);color:var(--danger-ink)}
.btn.red:hover{background:var(--danger-soft)}
.btn.sm{padding:4px 9px;min-height:30px;font-size:var(--text-sm)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn:disabled:hover{background:inherit;filter:none}
.btn.primary:disabled:hover{background:var(--accent)}
.spin{animation:rot 1s linear infinite}
@keyframes rot{to{transform:rotate(360deg)}}
/* ---- 徽章 ---- */
.tag{display:inline-flex;align-items:center;gap:4px;font-size:var(--text-xs);font-weight:var(--weight-em);letter-spacing:.02em;padding:2px 7px;border-radius:5px;background:var(--slate-soft);color:var(--slate-ink);white-space:nowrap}
.tag.red{background:var(--danger-soft);color:var(--danger-ink)}.tag.amber{background:var(--warn-soft);color:var(--warn-ink)}
.tag.green{background:var(--success-soft);color:var(--success-ink)}.tag.blue{background:var(--accent-soft);color:var(--accent)}
.lc-active{background:var(--lc-active);color:var(--accent-on)}
.lc-pause{background:var(--lc-pause-stripe);color:var(--warn-ink)}
.lc-merged{background:var(--lc-merged);color:var(--accent-on)}
.lc-stopped{background:var(--lc-stopped);color:var(--accent-on);cursor:pointer}
.lc-incubate{background:transparent;border:1.5px dashed var(--lc-incubate);color:var(--slate-ink)}
/* ---- 总览：今日 / 指标 / 功能区 / 流 ---- */
.dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:7px}
.dot.red{background:var(--danger)}.dot.amber{background:var(--warn)}.dot.green{background:var(--success)}
.row-item{display:flex;gap:10px;padding:10px 0;border-bottom:1px dashed var(--border)}
.row-item:last-child{border-bottom:0}
.row-item:hover{background:var(--surface-warm)}
.row-main{flex:1;min-width:0}
.row-title{font-weight:var(--weight-em);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.row-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:var(--text-sm);color:var(--muted);margin-top:2px}
.row-meta .mi{display:inline-flex;align-items:center;gap:4px}
.row-acts{display:flex;gap:6px;align-items:flex-start;flex-shrink:0}
.metric-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:var(--space-2)}
.metric{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);padding:11px;text-align:center}
.metric:hover{border-color:var(--muted)}
.metric b{display:block;font-size:var(--text-xl);font-weight:var(--weight-ann);line-height:var(--leading-tight)}
.metric span{font-size:var(--text-xs);color:var(--meta);display:inline-flex;align-items:center;gap:4px;margin-top:2px}
.metric.red b{color:var(--danger-ink)}.metric.amber b{color:var(--warn-ink)}.metric.green b{color:var(--success-ink)}
.layer-head{display:flex;align-items:center;gap:8px;margin:var(--space-3) 0 var(--space-2);cursor:pointer;background:none;border:0;padding:0;font-size:var(--text-base);color:var(--fg-2);font-weight:var(--weight-em)}
.layer-head .chev{transition:transform var(--motion-base) var(--ease)}
.layer-head.closed .chev{transform:rotate(-90deg)}
.layer-dot{width:8px;height:8px;border-radius:50%}
.layer-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--space-2)}
.proj{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);padding:var(--space-3)}
.proj:hover{border-color:var(--muted)}
.proj-name{font-weight:var(--weight-em);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.proj-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:var(--text-sm);color:var(--muted);margin:4px 0}
.proj-intro{font-size:var(--text-sm);color:var(--meta);margin:0 0 8px}
.pbar{height:6px;border-radius:var(--radius-pill);background:var(--border-soft);overflow:hidden}
.pbar i{display:block;height:100%;border-radius:var(--radius-pill)}
.duo{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3)}
/* ---- 任务 / 灵感 ---- */
.seg{display:inline-flex;background:var(--surface-warm);border-radius:8px;padding:3px;gap:2px}
.seg button{border:0;background:none;border-radius:6px;padding:6px 12px;font-size:var(--text-sm);color:var(--muted);cursor:pointer;font-weight:var(--weight-em)}
.seg button.on{background:var(--surface);color:var(--fg);box-shadow:var(--elev-card)}
.form-card{margin-top:var(--space-2)}
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--space-3)}
.field label{display:block;font-size:var(--text-sm);color:var(--fg-2);font-weight:var(--weight-em);margin-bottom:4px}
.field input,.field select,.field textarea{width:100%;border:1px solid var(--border);border-radius:var(--radius-btn);background:var(--surface);padding:9px;font-size:16px;min-height:42px;color:var(--fg);font-family:var(--font-body)}
.field input:hover,.field select:hover,.field textarea:hover{border-color:var(--muted)}
.field input:focus-visible,.field select:focus-visible,.field textarea:focus-visible{border-color:var(--accent)}
.field .err{display:flex;align-items:center;gap:4px;font-size:var(--text-sm);color:var(--danger-ink);margin-top:4px}
.field.bad input,.field.bad select{border-color:var(--danger)}
.field .def{font-size:var(--text-xs);color:var(--meta);text-align:right;margin-top:2px}
.group-title{font-size:var(--text-sm);color:var(--meta);font-weight:var(--weight-em);margin:var(--space-3) 0 0;letter-spacing:.02em}
.steps-box{margin-top:6px;padding:8px 10px;background:var(--surface-warm);border-radius:var(--radius-btn);font-size:13px}
.steps-box label{display:flex;gap:8px;align-items:flex-start;padding:3px 0;cursor:pointer}
.steps-box .done{text-decoration:line-through;color:var(--meta)}
.quick-capture{display:flex;gap:var(--space-2);align-items:center}
.quick-capture input{flex:1}
.chip-row{display:flex;gap:6px;flex-wrap:wrap;margin-top:var(--space-2)}
.chip{border:1px solid var(--border);background:var(--surface);border-radius:var(--radius-pill);padding:3px 10px;font-size:var(--text-sm);color:var(--muted);cursor:pointer}
.chip.on{background:var(--accent-soft);color:var(--accent);border-color:var(--accent)}
/* ---- 排期甘特 ---- */
.gantt-wrap{overflow-x:auto}
.gantt{width:100%;border-collapse:collapse;table-layout:fixed;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);overflow:hidden}
.gantt th,.gantt td{border:1px solid var(--border-soft);vertical-align:top;padding:6px;font-size:var(--text-sm)}
.gantt th{background:var(--surface-warm);color:var(--fg-2);font-weight:var(--weight-em);text-align:left}
.gantt th.cur,.gantt td.cur{border-left:2px solid var(--gantt-weekline)}
.gantt .owner-col{width:14%;min-width:120px}
.tbar{font-size:var(--text-sm);border-radius:var(--radius-bar);padding:5px 7px;margin:3px 0;cursor:default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tbar.doing{background:var(--gantt-doing-bg);color:var(--gantt-doing-ink)}
.tbar.overdue{background:var(--gantt-overdue-bg);color:var(--gantt-overdue-ink)}
.tbar.done{background:var(--gantt-done-bg);color:var(--gantt-done-ink);text-decoration:line-through}
.tbar.conflict{outline:1.5px dashed var(--gantt-conflict);outline-offset:1px}
.loadbar{height:4px;border-radius:var(--radius-pill);background:var(--border-soft);margin-top:4px;overflow:hidden}
.loadbar i{display:block;height:100%;background:var(--gantt-load);border-radius:var(--radius-pill)}
.loadbar.over i{background:var(--gantt-load-over)}
td.over-cell{background:var(--gantt-overdue-bg)}
.load-n{font-size:10px;color:var(--meta);margin-top:2px;display:flex;justify-content:space-between;align-items:center}
.tbar .icon-btn{min-width:0;min-height:0;width:16px;height:16px;padding:0;margin-right:2px;vertical-align:-3px;color:inherit}
.tbar .icon-btn svg{width:12px;height:12px}
.legend{display:flex;gap:12px;font-size:var(--text-sm);color:var(--muted);align-items:center;flex-wrap:wrap}
.legend i{width:12px;height:12px;border-radius:3px;display:inline-block;margin-right:4px;vertical-align:-2px}
.week-cards{display:none}
/* ---- 冲突卡 / 门禁 / 健康 ---- */
.conflict-card{display:flex;gap:10px;align-items:center;background:var(--warn-soft);border-radius:var(--radius-card);padding:10px 12px;margin-bottom:8px;color:var(--warn-ink)}
.conflict-card .body{flex:1;font-size:13px;color:var(--fg-2)}
.gate{max-width:480px;margin:48px auto;text-align:center;display:flex;flex-direction:column;align-items:center;gap:var(--space-3)}
.gate h2{margin:0;font-size:var(--text-lg);font-weight:var(--weight-ann)}
.strip{display:flex;gap:8px;align-items:center;border-radius:var(--radius-card);padding:10px 12px;font-size:13px;margin-bottom:var(--space-3)}
.strip.red{background:var(--danger-soft);color:var(--danger-ink)}
.strip.green{background:var(--success-soft);color:var(--success-ink)}
.matrix{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);overflow:hidden;font-size:13px}
.matrix th,.matrix td{border:1px solid var(--border-soft);padding:8px;text-align:left}
.matrix th{background:var(--surface-warm);color:var(--fg-2);font-weight:var(--weight-em)}
.matrix .tname{font-weight:var(--weight-em);position:sticky;left:0;background:var(--surface)}
.mini-bar{height:4px;border-radius:var(--radius-pill);background:var(--border-soft);margin-top:3px;width:72px}
.mini-bar i{display:block;height:100%;border-radius:var(--radius-pill)}
.code-block{font-family:var(--font-mono);font-size:13px;background:var(--surface-warm);border-radius:var(--radius-card);padding:12px;white-space:pre-wrap;word-break:break-all;user-select:all;color:var(--fg-2)}
/* ---- 弹层 / Toast ---- */
.overlay{position:fixed;inset:0;z-index:var(--z-overlay);background:rgba(15,23,42,.32);display:flex;align-items:center;justify-content:center;padding:var(--space-4)}
.sheet{background:var(--surface);border-radius:var(--radius-card);box-shadow:var(--elev-raised);padding:var(--space-5);width:100%;max-width:520px;max-height:85vh;overflow:auto}
.sheet-head{display:flex;align-items:center;gap:8px;font-size:var(--text-md);font-weight:var(--weight-ann);margin-bottom:var(--space-3)}
.sheet-row{margin-bottom:var(--space-3);font-size:13px}
.sheet-foot{text-align:center;font-size:var(--text-sm);color:var(--meta);margin-top:var(--space-3)}
.sheet-acts{display:flex;gap:var(--space-2);margin-top:var(--space-4)}
.sheet-acts .btn{flex:1;min-height:44px}
.obj-chip{display:inline-flex;align-items:center;background:var(--accent-soft);color:var(--accent);border-radius:var(--radius-pill);padding:3px 12px;font-weight:var(--weight-em)}
.obj-chip.warn{background:var(--warn-soft);color:var(--warn-ink)}
#toast-root{position:fixed;bottom:calc(16px + env(safe-area-inset-bottom));left:50%;transform:translateX(-50%);z-index:var(--z-toast);display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{display:flex;align-items:center;gap:6px;background:rgba(15,23,42,.92);color:var(--accent-on);font-size:13px;border-radius:var(--radius-card);padding:10px 16px;opacity:0;transform:translateY(8px);transition:opacity var(--motion-base) var(--ease),transform var(--motion-base) var(--ease)}
.toast.show{opacity:1;transform:translateY(0)}
/* ---- 响应式 ---- */
@media (max-width:900px){.searchbox,.topbar-ver{display:none}}
@media (max-width:700px){
  .only-mobile{display:inline-flex}.mainnav{display:none}
  .page{padding:var(--space-3) var(--space-3) var(--space-6)}
  .duo{grid-template-columns:1fr}.metric-grid{grid-template-columns:1fr 1fr}
  .row-acts .btn{min-height:var(--touch-min)}
  .gantt-wrap{display:none}.week-cards{display:block}
  .overlay{align-items:flex-end;padding:0}
  .sheet{max-width:none;border-radius:12px 12px 0 0;padding-bottom:calc(var(--space-5) + env(safe-area-inset-bottom))}
  .matrix-scroll{overflow-x:auto}
  .quick-capture{flex-wrap:wrap}
}
@media (prefers-reduced-motion:reduce){.hl{transition:none}.toast{transition:none}.spin{animation:none}}
