/* ============================================================
   工作台 v2 · 组件样式（配合 styles.css 的设计变量）
   ============================================================ */

/* ---------- 基础工具类 ---------- */
.hide{display:none !important}
.spacer{flex:1}
.muted{color:var(--text-3)}
.mono{font-family:ui-monospace,"SF Mono",Menlo,Consolas,monospace;font-size:12.5px}
.num{text-align:right;font-variant-numeric:tabular-nums;font-family:ui-monospace,"SF Mono",Menlo,Consolas,monospace;font-size:13px}
.ok{color:var(--success)}
.warnc{color:var(--warn)}
.danger-text{color:var(--danger)}
.sub{font-size:11.5px;color:var(--text-3);margin-top:2px}
.muted-line{color:var(--text-2);font-size:13px;line-height:1.7;margin:0 0 14px}
.disabled{opacity:.6;background:var(--surface-2)}
.skeleton{background:linear-gradient(90deg,var(--surface-2) 25%,var(--border) 37%,var(--surface-2) 63%);
  background-size:400% 100%;animation:sk 1.3s ease infinite;border-radius:var(--r-md)}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}
.list-skeleton{height:220px}
.kpi-skeleton{height:104px}
.pad-sm{padding:14px 16px}

/* ---------- 登录页 ---------- */
.login-screen{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:24px;background:var(--bg);z-index:50;overflow:auto}
.login-bg{position:fixed;inset:0;pointer-events:none;
  background:
    radial-gradient(760px 420px at 12% 8%,rgba(76,110,245,.16),transparent 62%),
    radial-gradient(680px 400px at 88% 92%,rgba(120,80,242,.14),transparent 60%),
    radial-gradient(520px 320px at 78% 12%,rgba(18,184,134,.10),transparent 60%)}
.login-card{position:relative;width:100%;max-width:378px;background:var(--surface);border:1px solid var(--border);
  border-radius:22px;box-shadow:var(--shadow-strong);padding:30px 28px 24px;display:flex;flex-direction:column;gap:14px}
.login-brand{display:flex;align-items:center;gap:13px;margin-bottom:6px}
.login-brand h1{font-size:20px;margin:0;letter-spacing:.02em}
.login-brand p{margin:2px 0 0;font-size:12.5px;color:var(--text-3)}
.login-field{position:relative;display:flex;align-items:center}
.login-field .lf-ico{position:absolute;left:13px;color:var(--text-3);display:flex;pointer-events:none}
.login-field input{width:100%;height:46px;padding:0 14px 0 40px;border-radius:12px;border:1px solid var(--border);
  background:var(--surface-2);color:var(--text);font-size:14.5px;font-family:inherit;transition:all .16s;outline:none}
.login-field input:focus{border-color:var(--primary);background:var(--surface);box-shadow:0 0 0 3px var(--primary-soft)}
.btn-lg{height:46px;font-size:15px;border-radius:12px}
.login-tip{text-align:center;font-size:12px;color:var(--text-3);line-height:1.6}
.login-foot{position:relative;margin-top:20px;font-size:12px;color:var(--text-3);text-align:center}

/* ---------- 顶栏用户区 ---------- */
.top-user{display:flex;align-items:center;gap:8px;height:36px;padding:0 10px 0 6px;border-radius:20px;
  background:var(--surface);border:1px solid var(--border);color:var(--text);cursor:pointer;transition:all .16s}
.top-user:hover{border-color:var(--border-strong);box-shadow:var(--sh-2)}
.tu-name{font-size:13px;font-weight:600;max-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------- 侧栏补充 ---------- */
.side-user-text{display:flex;flex-direction:column;min-width:0;flex:1}
.side-user-role{font-size:11px;color:var(--text-3)}
.side-user{cursor:pointer;border-radius:var(--r-md);padding:8px;transition:background .16s}
.side-user:hover{background:var(--surface-2)}
.nav-sep{height:1px;background:var(--border);margin:10px 12px}

/* ---------- 首页 hero ---------- */
.hero{position:relative;overflow:hidden;border-radius:var(--r-lg);padding:22px 24px;margin-bottom:14px;
  background:linear-gradient(120deg,#3B57D6 0%,#4C6EF5 48%,#6B5CD9 100%);color:#fff;
  display:flex;justify-content:space-between;align-items:center;gap:18px;flex-wrap:wrap;box-shadow:var(--sh-2)}
.hero::after{content:"";position:absolute;right:-60px;top:-70px;width:240px;height:240px;border-radius:50%;
  background:radial-gradient(circle,rgba(255,255,255,.22),transparent 66%)}
.hero-hello{font-size:19px;font-weight:600;position:relative}
.hero-hello b{font-weight:700}
.hero-sub{font-size:12.5px;opacity:.86;margin-top:6px;position:relative}
.hero-actions{display:flex;gap:9px;flex-wrap:wrap;position:relative}
.btn-hero{background:rgba(255,255,255,.16);color:#fff;border:1px solid rgba(255,255,255,.26);backdrop-filter:blur(6px);
  height:36px;padding:0 13px;font-size:13px;border-radius:10px;display:inline-flex;align-items:center;gap:6px}
.btn-hero:hover{background:rgba(255,255,255,.26)}
.hero .role-badge{background:rgba(255,255,255,.2);color:#fff;border-color:rgba(255,255,255,.3)}

/* ---------- 范围选择条 ---------- */
.range-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.range-hint{font-size:12px;color:var(--text-3);margin-left:4px}
.range-inputs{display:flex;align-items:center;gap:6px}
.range-inputs .input{height:32px;font-size:12.5px;padding:0 8px;width:auto}
.range-inputs i{color:var(--text-3);font-style:normal}

/* ---------- KPI 卡片 ---------- */
.kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.kpi-grid.kpi-mini{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}
.kpi-card{padding:15px 16px;position:relative;overflow:hidden}
.kpi-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
.kpi-label{font-size:12.5px;color:var(--text-2)}
.kpi-ico{width:26px;height:26px;border-radius:8px;display:flex;align-items:center;justify-content:center;background:var(--primary-soft);color:var(--primary)}
.kpi-value{font-size:23px;font-weight:700;letter-spacing:-.01em;font-variant-numeric:tabular-nums;line-height:1.2}
.kpi-sub{font-size:11.5px;color:var(--text-3);margin-top:5px}
.kpi-card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px}
.k-blue::before{background:var(--primary)}   .k-blue .kpi-ico{background:var(--primary-soft);color:var(--primary)}
.k-green::before{background:var(--success)} .k-green .kpi-ico{background:var(--success-soft);color:var(--success)}
.k-orange::before{background:var(--warn)}   .k-orange .kpi-ico{background:var(--warn-soft);color:var(--warn)}
.k-purple::before{background:var(--purple)} .k-purple .kpi-ico{background:var(--purple-soft);color:var(--purple)}
.k-teal::before{background:var(--teal)}     .k-teal .kpi-ico{background:var(--teal-soft);color:var(--teal)}

/* ---------- 面板 ---------- */
.sec-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:14px;flex-wrap:wrap}
.sec-head h2{font-size:15px;margin:0;letter-spacing:.01em}
.sec-head span{display:block;font-size:12px;color:var(--text-3);margin-top:3px}
.sec-right{display:flex;gap:8px;align-items:center}
.notice{display:flex;gap:12px;align-items:flex-start;margin-bottom:16px;color:var(--text-2);font-size:13px;line-height:1.65}
.notice>svg{flex:none;color:var(--primary);margin-top:2px}
.notice b{display:block;color:var(--text);font-size:13.5px;margin-bottom:2px}

/* ---------- 图表 ---------- */
.chart{width:100%;height:auto;display:block;overflow:visible}
.ch-grid{stroke:var(--border);stroke-width:1;stroke-dasharray:3 5}
.ch-axis{fill:var(--text-3);font-size:10.5px;font-family:inherit}
.ch-dot{transition:r .14s}
.ch-dot:hover{r:5}
.ch-seg{transition:opacity .16s}
.ch-seg:hover{opacity:.76}
.chart-legend{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px}
.lg-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2)}
.lg-item i{width:9px;height:9px;border-radius:3px;display:inline-block}
.chart-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  color:var(--text-3);font-size:12.5px;border:1px dashed var(--border);border-radius:var(--r-md);background:var(--surface-2)}
.donut-wrap{display:flex;flex-direction:column;gap:12px;align-items:center}
.donut-wrap svg{flex:none}
.dn-center{fill:var(--text);font-size:17px;font-weight:700;font-family:inherit}
.dn-sub{fill:var(--text-3);font-size:11px;font-family:inherit}
.donut-legend{width:100%;display:flex;flex-direction:column;gap:7px}
.dl-row{display:flex;align-items:center;gap:8px;font-size:12.5px}
.dl-row i{width:9px;height:9px;border-radius:3px;flex:none}
.dl-name{flex:1;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dl-val{font-variant-numeric:tabular-nums;font-weight:600}
.dl-pct{color:var(--text-3);width:46px;text-align:right;font-size:11.5px}
.hbar-list{display:flex;flex-direction:column;gap:12px}
.hbar-row{display:flex;flex-direction:column;gap:5px}
.hb-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px;font-size:12.5px}
.hb-name{color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hb-val{font-weight:600;font-variant-numeric:tabular-nums;flex:none}
.hb-track{height:7px;border-radius:5px;background:var(--surface-2);overflow:hidden}
.hb-track i{display:block;height:100%;border-radius:5px;transition:width .5s var(--ease)}
.hb-sub{font-size:11px;color:var(--text-3)}
.spark{display:block}
.spark-empty{height:30px}

/* ---------- 表格 ---------- */
.table-wrap{overflow-x:auto;border-radius:var(--r-lg);border:1px solid var(--border);background:var(--surface)}
.tbl thead th{position:sticky;top:0;background:var(--surface-2);z-index:1;white-space:nowrap;
  font-size:12px;font-weight:600;color:var(--text-2);padding:11px 12px;text-align:left;border-bottom:1px solid var(--border)}
.tbl th.num,.tbl td.num{text-align:right}
.tbl tbody td{padding:11px 12px;border-bottom:1px solid var(--border);vertical-align:middle}
.tbl tbody tr:last-child td{border-bottom:none}
.tbl tbody tr{transition:background .14s}
.tbl tbody tr:hover{background:var(--surface-2)}
.td-main b{font-weight:600}
.td-actions{white-space:nowrap;text-align:right}
.tr-total td{background:var(--surface-2);border-top:2px solid var(--border-strong)}
.user-cell{display:flex;align-items:center;gap:9px}

/* ---------- 徽章 ---------- */
.role-badge{display:inline-flex;align-items:center;height:20px;padding:0 8px;border-radius:6px;font-size:11px;font-weight:600;border:1px solid transparent}
.rb-super{background:var(--purple-soft);color:var(--purple);border-color:transparent}
.rb-admin{background:var(--primary-soft);color:var(--primary)}
.rb-member{background:var(--surface-2);color:var(--text-2);border-color:var(--border)}
.scope-badge{display:inline-flex;align-items:center;gap:4px;height:21px;padding:0 8px;border-radius:6px;font-size:11px;font-weight:500}
.sb-company{background:var(--teal-soft);color:var(--teal)}
.sb-private{background:var(--surface-2);color:var(--text-3);border:1px solid var(--border)}
.st-badge{display:inline-flex;align-items:center;height:21px;padding:0 9px;border-radius:6px;font-size:11.5px;font-weight:500}
.sb-in{background:var(--success-soft);color:var(--success)}
.sb-sold{background:var(--primary-soft);color:var(--primary)}
.sb-back{background:var(--warn-soft);color:var(--warn)}
.sb-out{background:var(--danger-soft);color:var(--danger)}
.tx-badge{display:inline-flex;align-items:center;height:21px;padding:0 9px;border-radius:6px;font-size:11.5px;font-weight:600}
.tx-in{background:var(--success-soft);color:var(--success)}
.tx-out{background:var(--warn-soft);color:var(--warn)}
.tx-partial{background:var(--purple-soft);color:var(--purple)}
.delta{font-size:11.5px;font-weight:600}
.delta.up{color:var(--danger)}     /* 中国市场习惯：涨红跌绿在此不适用，收支用中性色 */
.delta.down{color:var(--success)}
.delta.flat{color:var(--text-3)}
.file-link{display:inline-flex;align-items:center;gap:5px;color:var(--primary);text-decoration:none;font-size:12.5px}
.file-link:hover{text-decoration:underline}

/* ---------- 快速记事 ---------- */
.quick-note{margin-bottom:16px}
.qn-head{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--text-2);margin-bottom:10px}
.qn-head svg{color:var(--warn)}
.qn-head span{font-size:11.5px;color:var(--text-3);margin-left:auto}
.quick-note .textarea{min-height:56px;font-size:14px}
.qn-foot{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:10px;flex-wrap:wrap}
.qn-opts{display:flex;gap:8px;flex-wrap:wrap}
.qn-btns{display:flex;gap:8px}
.select-sm{height:32px;font-size:12.5px;padding:0 8px;width:auto}

/* ---------- 记事 ---------- */
.note-day{margin-bottom:20px}
.nd-head{display:flex;align-items:baseline;gap:10px;margin-bottom:10px;padding-left:2px}
.nd-date{font-size:14px;font-weight:600}
.nd-week{font-size:12px;color:var(--text-3)}
.nd-count{font-size:11.5px;color:var(--text-3);margin-left:auto;background:var(--surface-2);padding:2px 9px;border-radius:20px}
.note-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px}
.note-card{padding:14px 15px;display:flex;flex-direction:column;gap:9px}
.note-card:hover{box-shadow:var(--sh-2);border-color:var(--border-strong)}
.note-card.pinned{border-color:var(--warn);box-shadow:0 0 0 1px var(--warn-soft)}
.nc-head{display:flex;align-items:flex-start;gap:8px}
.nc-head h4{margin:0;font-size:14px;flex:1;line-height:1.45;font-weight:600}
.pin-flag{color:var(--warn);display:flex;margin-top:2px}
.nc-actions{display:flex;gap:2px;opacity:.35;transition:opacity .16s}
.note-card:hover .nc-actions{opacity:1}
.nc-body{font-size:13px;color:var(--text-2);line-height:1.72;white-space:pre-wrap;word-break:break-word;
  display:-webkit-box;-webkit-line-clamp:8;-webkit-box-orient:vertical;overflow:hidden}
.nc-foot{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:2px}
.nc-owner{font-size:11.5px;color:var(--text-3);margin-left:auto}

/* ---------- 库存 ---------- */
.item-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:12px}
.item-card{padding:14px;display:flex;flex-direction:column;gap:9px}
.item-card:hover{box-shadow:var(--sh-2)}
.ic-head{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;font-size:14px}
.ic-sn{color:var(--text-3)}
.ic-meta{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--text-2)}
.ic-meta span{display:inline-flex;align-items:center;gap:4px}
.ic-price{display:flex;gap:14px;font-size:12.5px;color:var(--text-2)}
.ic-sold{font-size:12.5px;color:var(--success);font-weight:600}
.ic-foot{display:flex;justify-content:space-between;align-items:center;padding-top:4px;border-top:1px solid var(--border)}
.ic-actions{display:flex;gap:2px}
.sell-tip{grid-column:1/-1;background:var(--primary-soft);color:var(--primary);border-radius:var(--r-md);
  padding:10px 12px;font-size:12.5px;margin-bottom:4px}
.quick-sale-search{display:flex;flex-direction:column;gap:10px}
.quick-sale-lead{display:flex;align-items:baseline;gap:9px;color:var(--text-2);font-size:12.5px}
.quick-sale-lead b{font-size:15px;color:var(--text)}
.quick-sale-searchbar{display:flex;align-items:center;gap:8px;padding:4px 7px 4px 12px;border:1px solid var(--border-strong);
  border-radius:12px;background:var(--surface);color:var(--text-3)}
.quick-sale-searchbar:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px rgba(76,110,245,.13)}
.quick-sale-searchbar .input{height:38px;border:0;box-shadow:none;padding-left:2px;background:transparent}
.quick-sale-searchbar .icon-btn{color:var(--text-3)}
.quick-sale-searchbar .icon-btn:hover{color:var(--text);background:var(--surface-2)}
.quick-sale-hint{font-size:12px;color:var(--text-3);margin-top:-3px}
.quick-sale-result-title{display:flex;justify-content:space-between;align-items:center;margin-top:5px;padding:0 2px;font-size:12.5px;font-weight:650;color:var(--text-2)}
.quick-sale-result-title span{font-size:11.5px;font-weight:400;color:var(--text-3)}
.quick-sale-results{display:flex;flex-direction:column;gap:7px;max-height:390px;overflow:auto;padding:2px 2px 4px}
.quick-sale-result{display:grid;grid-template-columns:minmax(0,1fr) auto auto auto;align-items:center;gap:12px;width:100%;padding:11px 12px;
  border:1px solid var(--border);border-radius:11px;background:var(--surface);color:var(--text);text-align:left;cursor:pointer;
  transition:border-color .16s,background .16s,box-shadow .16s,transform .12s}
.quick-sale-result:hover{border-color:var(--primary);background:var(--primary-soft);box-shadow:var(--sh-1);transform:translateY(-1px)}
.quick-sale-result-main{display:flex;flex-direction:column;gap:4px;min-width:0}
.quick-sale-result-main b{font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.quick-sale-result-meta{font-size:11.5px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.quick-sale-result-meta i{font-style:normal;color:var(--warn)}
.quick-sale-result-stock,.quick-sale-result-price{font-size:12px;color:var(--text-2);white-space:nowrap}
.quick-sale-result-stock b{color:var(--success);font-size:13px}
.quick-sale-result-go{display:inline-flex;align-items:center;gap:3px;color:var(--primary);font-size:12px;font-weight:600;white-space:nowrap}
.quick-sale-loading{padding:35px 12px;text-align:center;color:var(--text-3);font-size:12.5px}
@media (max-width:700px){
  .quick-sale-lead{flex-direction:column;gap:3px}
  .quick-sale-result{grid-template-columns:minmax(0,1fr) auto;gap:5px 10px}
  .quick-sale-result-stock{grid-column:2;grid-row:1}
  .quick-sale-result-price{grid-column:1;grid-row:2}
  .quick-sale-result-go{grid-column:2;grid-row:2}
}

/* ---------- 时间线 ---------- */
.timeline{display:flex;flex-direction:column;position:relative}
.timeline.tl-lg{padding:4px 0}
.tl-item{display:flex;gap:12px;padding:9px 0;position:relative}
.tl-item:not(:last-child)::before{content:"";position:absolute;left:5px;top:22px;bottom:-2px;width:1px;background:var(--border)}
.tl-dot{width:11px;height:11px;border-radius:50%;background:var(--text-3);flex:none;margin-top:5px;position:relative;z-index:1;
  box-shadow:0 0 0 3px var(--surface)}
.tl-create{background:var(--success)}
.tl-update{background:var(--primary)}
.tl-delete{background:var(--danger)}
.tl-sell{background:var(--teal)}
.tl-login{background:var(--text-3)}
.tl-backup{background:var(--purple)}
.tl-restore{background:var(--warn)}
.tl-purge{background:var(--danger)}
.tl-body{flex:1;min-width:0}
.tl-text{font-size:13px;line-height:1.6;word-break:break-word}
.tl-meta{display:flex;gap:9px;flex-wrap:wrap;font-size:11.5px;color:var(--text-3);margin-top:4px;align-items:center}
.tl-user{font-weight:600;color:var(--text-2)}
.tl-tag{padding:1px 7px;border-radius:5px;background:var(--surface-2);border:1px solid var(--border);color:var(--text-2)}
.tl-tag.ghost{background:transparent}
.audit-detail{margin-top:8px}
.audit-detail summary{font-size:12px;color:var(--primary);cursor:pointer;list-style:none}
.audit-detail summary::-webkit-details-marker{display:none}
.ad-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px;margin-top:8px}
.ad-grid b{font-size:11.5px;color:var(--text-3);display:block;margin-bottom:4px}
.ad-grid pre{margin:0;background:var(--surface-2);border:1px solid var(--border);border-radius:var(--r-sm);
  padding:9px 10px;font-size:11.5px;overflow:auto;max-height:220px;white-space:pre-wrap;word-break:break-all;color:var(--text-2)}

/* ---------- 频道 ---------- */
.channel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(216px,1fr));gap:12px}
.ch-card{padding:15px;display:flex;flex-direction:column;gap:9px;cursor:pointer;position:relative;overflow:hidden}
.ch-card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--ch,var(--primary))}
.ch-card:hover{box-shadow:var(--sh-2);transform:translateY(-1px)}
.ch-head{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
.ch-name{font-size:14.5px;font-weight:600}
.ch-actions{display:flex;gap:2px;opacity:.35}
.ch-card:hover .ch-actions{opacity:1}
.ch-desc{font-size:12.5px;color:var(--text-2);line-height:1.6;min-height:20px}
.ch-stat{font-size:11.5px;color:var(--text-3);display:flex;gap:6px;align-items:center}
.ch-stat svg{opacity:.7}
.ch-foot{display:flex;justify-content:space-between;align-items:center;padding-top:6px;border-top:1px solid var(--border);font-size:11.5px}

/* ---------- 左侧导航配置 ---------- */
.mail-config-card{margin-bottom:18px}
.mail-status-row{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin-bottom:14px;padding:10px 12px;border-radius:10px;background:var(--surface-2)}
.mail-form-grid{gap:12px 14px}
.mail-form-grid .field{display:flex;flex-direction:column;gap:6px}
.mail-form-grid .field span{font-size:12.5px;color:var(--text-2)}
.mail-form-grid .field-full{grid-column:1/-1}
.mail-recipients{height:auto;min-height:64px;resize:vertical;padding-top:10px;padding-bottom:10px}
.mail-help{margin:12px 0 0;font-size:12px}
.branding-config-card{margin-top:18px}
.branding-form-grid{gap:12px 14px}
.branding-form-grid .field{display:flex;flex-direction:column;gap:6px}
.branding-form-grid .field span{font-size:12.5px;color:var(--text-2)}
.branding-help{margin:12px 0 0;font-size:12px}
.nav-config-card{margin-top:18px}
.section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:16px}
.section-head h3{margin:0 0 5px;font-size:16px}
.section-head p{margin:0;font-size:12.5px}
.section-actions{display:flex;gap:8px;flex:none}
.nav-config-group{border:1px solid var(--border);border-radius:12px;background:var(--surface-2);padding:10px;margin-bottom:10px}
.nav-config-group:last-child{margin-bottom:0}
.nav-config-group-head{display:flex;align-items:center;gap:9px;padding:3px 2px 10px;border-bottom:1px solid var(--border);cursor:grab}
.nav-config-group-head:active{cursor:grabbing}
.nav-config-group-head.drag-over{border-color:var(--primary);box-shadow:0 0 0 2px var(--primary-soft)}
.nav-drag-handle{width:20px;flex:none;text-align:center;color:var(--text-3);font-size:17px;letter-spacing:-3px;cursor:grab;user-select:none}
.nav-group-name{max-width:280px;font-weight:600}
.nav-visible{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;color:var(--text-2);font-size:12px;cursor:pointer}
.nav-visible input{accent-color:var(--primary)}
.nav-config-items{padding-top:8px;display:grid;gap:6px}
.nav-config-item{display:flex;align-items:center;gap:8px;min-height:40px;padding:4px 6px;border:1px solid transparent;border-radius:9px;background:var(--surface)}
.nav-config-item:hover{border-color:var(--border-strong);box-shadow:var(--sh-1)}
.nav-config-item.dragging,.nav-config-group.dragging{opacity:.48}
.nav-config-item.drag-over{border-color:var(--primary);background:var(--primary-soft)}
.nav-item-preview{width:24px;display:flex;align-items:center;justify-content:center;color:var(--text-2);flex:none}
.nav-item-name{flex:1;min-width:130px}
.nav-item-icon{width:120px;flex:none}
.nav-config-item .nav-visible{width:52px;justify-content:flex-end}
@media (max-width:860px){
  .section-head{flex-direction:column}
  .section-actions{width:100%}
  .section-actions .btn{flex:1}
  .nav-config-item{flex-wrap:wrap}
  .nav-item-name{min-width:calc(100% - 58px);order:2}
  .nav-item-icon{order:3;flex:1;width:auto}
  .nav-config-item .nav-visible{order:4;width:auto}
}

/* ---------- 表单 / 弹窗补充 ---------- */
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.form-grid .field-full,.form-grid .sell-tip,.form-grid .seg-row{grid-column:1/-1}
.switch-row{display:flex;align-items:center;gap:9px;font-size:13.5px;padding:9px 0;cursor:pointer}
.switch-row input{width:17px;height:17px;accent-color:var(--primary);cursor:pointer}
.seg-row{display:flex;gap:8px;margin-bottom:14px;background:var(--surface-2);padding:3px;border-radius:11px}
.seg{flex:1;height:36px;border-radius:9px;border:none;background:transparent;color:var(--text-2);font-size:13.5px;
  font-family:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px;transition:all .16s}
.seg.on{background:var(--surface);color:var(--primary);font-weight:600;box-shadow:var(--sh-1)}
.file-input{height:auto;padding:9px 10px;font-size:12.5px;cursor:pointer}
/* 长表单弹窗：标题和提交栏固定，中间内容单独滚动，随时都能保存。 */
.modal{display:flex;flex-direction:column;overflow:hidden;max-height:calc(100vh - 40px)}
.modal-head{flex:none;border-bottom:1px solid var(--border);padding-bottom:14px}
.modal-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-top:4px;padding-bottom:4px}
.modal-foot{flex:none;border-top:1px solid var(--border);background:var(--surface);box-shadow:0 -8px 18px -18px rgba(17,24,39,.55);padding-top:13px;padding-bottom:calc(14px + env(safe-area-inset-bottom))}
.modal-wide{max-width:640px !important}
.kv-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;border-bottom:1px dashed var(--border);font-size:13px}
.kv-row:last-child{border-bottom:none}
.kv-row span{color:var(--text-2);flex:none;margin-right:12px}
.kv-row b{font-variant-numeric:tabular-nums;text-align:right;max-width:64%;word-break:break-all}

/* ---------- 发票识别（OCR） ---------- */
.form-sec{font-size:12px;font-weight:600;color:var(--text-3);letter-spacing:.06em;margin:16px 0 6px}
.form-sec:first-child{margin-top:0}
.inv-attach-field{border-top:1px solid var(--border);padding-top:12px;margin-top:6px}
.ocr-loading{display:flex;align-items:center;gap:9px;padding:14px 16px;border:1px dashed var(--border);border-radius:11px;
  color:var(--text-2);font-size:13px;margin-bottom:14px}
.ocr-attach{margin-top:12px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
.ocr-thumb{max-width:100%;max-height:240px;border-radius:11px;border:1px solid var(--border);background:var(--surface-2)}
.ocr-warn{color:var(--danger) !important}
.ocr-raw{margin-top:14px;font-size:12.5px;color:var(--text-2)}
.ocr-raw summary{cursor:pointer;color:var(--primary);padding:6px 0}
.ocr-raw pre{margin:6px 0 0;padding:11px;background:var(--surface-2);border-radius:10px;max-height:220px;overflow:auto;
  white-space:pre-wrap;word-break:break-all;font-size:11.5px;line-height:1.65;color:var(--text-2)}
.inv-detail-file{margin-top:14px;padding-top:12px;border-top:1px solid var(--border)}
.empty-box{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:9px;padding:46px 20px;
  color:var(--text-3);text-align:center}
.empty-box h3{margin:0;font-size:14px;color:var(--text-2)}
.empty-box p{margin:0;font-size:12.5px}
.pager{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-top:14px;font-size:12.5px;color:var(--text-3);flex-wrap:wrap}
.pager-btns{display:flex;gap:8px}

/* ---------- 我的 ---------- */
.me-head{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:16px}
.company-edit{display:flex;flex-direction:column;gap:12px}
.tag-list{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.tag-list .tx-badge{display:inline-flex;align-items:center;gap:5px;padding-right:6px}
.tag-list .tx-badge button{color:inherit;opacity:.7}
.tag-list .tx-badge button:hover{opacity:1}
.co-add{display:flex;gap:8px;align-items:center}
.co-add .input{flex:1;height:36px;font-size:13px}
.co-add .btn{flex:none}

/* ---------- 可输入的下拉（combo）：既能选，也能手打 ---------- */
.combo{position:relative;display:block}
.combo .combo-input{padding-right:34px}
.combo-caret{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:24px;height:24px;display:flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--text-3);border-radius:6px;cursor:pointer;padding:0}
.combo-caret:hover{background:var(--surface-2);color:var(--text-2)}
.combo-caret svg{transition:transform .16s var(--ease)}
.combo.open .combo-caret svg{transform:rotate(180deg)}
.combo-menu{position:absolute;z-index:60;left:0;right:0;top:calc(100% + 5px);max-height:216px;overflow-y:auto;background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--r-sm);box-shadow:var(--sh-2);padding:4px}
.combo.up .combo-menu{top:auto;bottom:calc(100% + 5px)}
.combo-menu[hidden]{display:none}
.combo-menu.no-hit{pointer-events:none}
.combo-item{padding:8px 10px;border-radius:6px;font-size:13.5px;color:var(--text);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.combo-item[hidden]{display:none}
.combo-item:hover,.combo-item.hl{background:var(--surface-2)}
.combo-item.on{color:var(--primary-dark);font-weight:600;background:var(--primary-soft)}
.combo-empty{padding:8px 10px;font-size:12px;color:var(--text-3)}
.combo-empty[hidden]{display:none}
:root[data-theme="dark"] .combo-item.on{color:#9DB4FF}
.me-profile{display:flex;align-items:center;gap:15px}
.me-profile h2{margin:0;font-size:17px;display:flex;align-items:center;gap:9px}
.me-actions{display:flex;gap:8px;flex-wrap:wrap}

/* ---------- 响应式 ---------- */
@media (max-width:1180px){
  .kpi-grid{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:860px){
  .content{padding:14px 12px calc(var(--bottom-nav-h) + 20px + env(safe-area-inset-bottom))}
  .hero{padding:18px 16px;flex-direction:column;align-items:flex-start;gap:14px}
  .hero-actions{width:100%}
  .btn-hero{flex:1;justify-content:center}
  .kpi-grid{grid-template-columns:repeat(2,1fr);gap:10px}
  .kpi-grid.kpi-mini{grid-template-columns:repeat(2,1fr)}
  .kpi-value{font-size:19px}
  .note-cards{grid-template-columns:1fr}
  .item-grid{grid-template-columns:1fr}
  .channel-grid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}
  .form-grid{grid-template-columns:1fr}
  .field-half{grid-column:1/-1}
  .top-user .tu-name{display:none}
  .top-user{padding:0 6px}
  .top-user .role-badge{display:none}
  #topLogout{display:none}
  .range-inputs{width:100%}
  .range-inputs .input{flex:1}
  .toolbar{gap:8px}
  .toolbar .tb-left,.toolbar .tb-right{width:100%}
  .tb-left .input,.tb-left .select{width:100%}
  .modal-wide{max-width:none !important}
  .donut-wrap{flex-direction:column}
  .me-actions .btn{flex:1;justify-content:center}
  .ad-grid{grid-template-columns:1fr}
}
@media (max-width:520px){
  .kpi-grid{grid-template-columns:1fr 1fr}
  .kpi-card{padding:12px}
  .kpi-value{font-size:17px}
  .kpi-label{font-size:11.5px}
  .modal-mask{padding:10px}
  .modal{max-height:calc(100vh - 20px);border-radius:16px}
  .modal-head{padding:16px 16px 12px}
  .modal-body{padding-left:16px;padding-right:16px}
  .modal-foot{padding-left:16px;padding-right:16px}
  .modal-foot .btn{min-width:96px}
}

/* ============================================================
   个人工作台（v3.1 新增）
   ============================================================ */

/* ---------- 首页 Hero ---------- */
.ps-hero{background:linear-gradient(135deg,var(--primary) 0%,#7048E8 100%);border-radius:var(--r-lg);padding:24px 26px;color:#fff;box-shadow:var(--sh-2);margin-bottom:18px}
.ps-hero-in{display:flex;gap:24px;align-items:center;flex-wrap:wrap}
.ps-hero-l{flex:1;min-width:230px}
.ps-date{font-size:12.5px;opacity:.82;letter-spacing:.4px}
.ps-greet{font-size:24px;font-weight:700;margin-top:6px;letter-spacing:.5px}
.ps-tip{font-size:13px;opacity:.88;margin-top:8px;line-height:1.6}
.ps-quick{display:flex;gap:8px;margin-top:16px;flex-wrap:wrap}
.ps-quick .btn-primary{background:#fff;color:var(--primary-dark);border-color:#fff}
.ps-quick .btn-primary:hover{background:#F2F5FF}
.ps-quick .btn-outline{background:rgba(255,255,255,.14);color:#fff;border-color:rgba(255,255,255,.45)}
.ps-quick .btn-outline:hover{background:rgba(255,255,255,.24)}
.ps-hero-stats{display:grid;grid-template-columns:repeat(5,minmax(60px,1fr));gap:8px;min-width:320px}
.ps-hstat{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.2);border-radius:14px;padding:12px 10px;text-align:center;cursor:pointer;transition:background .16s var(--ease)}
.ps-hstat:hover{background:rgba(255,255,255,.24)}
.ps-hn{font-size:21px;font-weight:700;line-height:1.15}
.ps-hl{font-size:11.5px;opacity:.85;margin-top:4px}

/* ---------- 通用区块 ---------- */
.ps-sec{margin-bottom:18px}
.ps-grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.ps-grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.ps-ch-title{display:flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;margin-bottom:12px;color:var(--text-2)}
.chart-card{position:relative}
/* 卡片三档大小 */
.chart-card.sz-sm{grid-column:span 1}
.chart-card.sz-md{grid-column:span 2}
.chart-card.sz-lg{grid-column:span 3}
@media (max-width:1180px){.chart-card.sz-lg{grid-column:span 2}}
@media (max-width:860px){.chart-card.sz-sm,.chart-card.sz-md,.chart-card.sz-lg{grid-column:span 1}}
/* 卡片右上操作按钮（调大小 / 删除） */
.ch-acts{position:absolute;top:8px;right:32px;display:flex;gap:4px;opacity:0;transition:opacity .15s}
.chart-card:hover .ch-acts{opacity:1}
.ch-btn{min-width:24px;height:24px;padding:0 5px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text-3);font-size:11.5px;line-height:1;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.ch-btn:hover{color:var(--primary);border-color:var(--primary)}
.ch-btn[data-cact="del"]:hover{color:var(--danger,#e5484d);border-color:var(--danger,#e5484d)}
/* 「添加卡片」虚线卡位 */
.chart-add{min-height:140px;border:1.5px dashed var(--border-strong);border-radius:var(--r-md);background:transparent;display:flex;align-items:center;justify-content:center;gap:7px;color:var(--text-3);font-size:13px;cursor:pointer;transition:all .15s}
.chart-add:hover{color:var(--primary);border-color:var(--primary);background:var(--surface-2)}
/* 添加弹窗里的候选行 */
.pick-list{display:flex;flex-direction:column}
.pick-row{display:flex;align-items:center;gap:11px;padding:10px 4px;border-bottom:1px solid var(--border)}
.pick-row:last-of-type{border-bottom:none}
.pick-ico{width:32px;height:32px;border-radius:8px;background:var(--surface-2);display:flex;align-items:center;justify-content:center;color:var(--text-2);flex:none}
.pick-name{flex:1;font-size:13.5px;font-weight:500}
.pick-name small{display:block;font-weight:400;font-size:12px;color:var(--text-3);margin-top:2px}
/* 模块卡移除按钮与「添加模块」卡位 */
.mod-x{position:absolute;top:8px;right:8px;width:24px;height:24px;border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text-3);cursor:pointer;display:none;align-items:center;justify-content:center;padding:0}
.mod-card:hover .mod-x{display:inline-flex}
.mod-x:hover{color:var(--danger,#e5484d);border-color:var(--danger,#e5484d)}
.mod-add{min-height:86px;border:1.5px dashed var(--border-strong);border-radius:var(--r-md);background:transparent;display:flex;align-items:center;justify-content:center;gap:7px;color:var(--text-3);font-size:13px;cursor:pointer;transition:all .15s}
.mod-add:hover{color:var(--primary);border-color:var(--primary);background:var(--surface-2)}
.mod-card.mod-action{cursor:pointer}
.mod-card.mod-quick-sale,.mod-card[data-mod="quickSale"]{border-color:rgba(18,184,134,.38)}
.mod-card.mod-quick-sale .mod-ico,.mod-card[data-mod="quickSale"] .mod-ico{background:var(--success);color:#fff;box-shadow:0 8px 18px -10px var(--success)}
.mod-card.mod-quick-sale .mod-name,.mod-card[data-mod="quickSale"] .mod-name{color:#087F5B}
:root[data-theme="dark"] .mod-card.mod-quick-sale .mod-name,:root[data-theme="dark"] .mod-card[data-mod="quickSale"] .mod-name{color:#3DDCB0}
.side-copyright{font-size:10.5px;color:var(--text-3);line-height:1.5;text-align:center;margin-bottom:2px}
.chart-card .grip{position:absolute;top:8px;right:8px;opacity:0;transition:opacity .15s;cursor:grab}
.chart-card:hover .grip{opacity:.7}
.chart-card.dragging{opacity:.45;transform:scale(.98)}
.chart-card.dragover{outline:2px dashed var(--primary);outline-offset:2px}
.ps-ch-sub{font-size:11.5px;color:var(--text-3);margin-bottom:10px;line-height:1.6}
.ps-stock-num{font-size:32px;font-weight:700;line-height:1.15;color:var(--text-1)}
.ps-stock-num small{font-size:13px;font-weight:500;color:var(--text-3);margin-left:4px}
/* 库存卡：参考「奶油渐变 + 大字 + 细进度条」风格
   用 background-image 而不是 background 简写，否则会把 data-skin 的 --skin-img 一起冲掉 */
.chart-card.stock-hero{background-color:transparent;background-image:var(--skin-img,none),linear-gradient(150deg,#FFFBEF 0%,#FBF3E2 46%,#EEF0FA 100%);border:1px solid rgba(120,100,60,.10);box-shadow:0 6px 22px rgba(150,120,60,.10)}
.stock-hero .ps-ch-title{letter-spacing:8px;font-weight:700;color:#4A4436}
.stock-hero .grip{color:#8A8168}
.stock-hero .ps-stock-num{font-size:46px;letter-spacing:-1px;color:#26221A}
.stock-hero .ps-stock-num small{font-size:14px;color:#7A7260;font-weight:500}
.stock-hero .ps-ch-sub{color:#8A8168}
.ps-brand-list{display:flex;flex-direction:column;gap:10px;margin-top:4px}
.ps-brand-row{display:flex;align-items:center;gap:10px}
.ps-brand-name{font-size:13px;font-weight:700;color:#3A3529;min-width:70px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:.5px}
.ps-brand-bar{flex:1;height:6px;border-radius:3px;background:rgba(60,50,30,.10);overflow:hidden}
.ps-brand-bar i{display:block;height:100%;border-radius:3px;background:linear-gradient(90deg,#8FB0F7,#5B8DEF)}
.ps-brand-n{font-size:12.5px;font-weight:600;color:#5C5442;min-width:40px;text-align:right}
.ps-stock-link{display:inline-flex;align-items:center;gap:4px;margin-top:12px;background:none;border:none;cursor:pointer;font-size:12.5px;font-weight:600;color:#4A6CF7;padding:0}
.ps-stock-link:hover{text-decoration:underline}
:root[data-theme="dark"] .chart-card.stock-hero{background-color:transparent;background-image:var(--skin-img,none),linear-gradient(150deg,#2B2620 0%,#28232E 100%);border-color:rgba(255,255,255,.08);box-shadow:none}
:root[data-theme="dark"] .stock-hero .ps-ch-title{color:#D8CDB4}
:root[data-theme="dark"] .stock-hero .grip{color:#8A8168}
:root[data-theme="dark"] .stock-hero .ps-stock-num{color:#F2EDE0}
:root[data-theme="dark"] .stock-hero .ps-stock-num small,
:root[data-theme="dark"] .stock-hero .ps-ch-sub{color:#A99F88}
:root[data-theme="dark"] .ps-brand-name{color:#E8E0CE}
:root[data-theme="dark"] .ps-brand-bar{background:rgba(255,255,255,.12)}
:root[data-theme="dark"] .ps-brand-bar i{background:linear-gradient(90deg,#5B8DEF,#8FB0F7)}
:root[data-theme="dark"] .ps-brand-n{color:#B8AE96}
:root[data-theme="dark"] .ps-stock-link{color:#9DB4FF}
.ps-row{display:flex;gap:8px;flex-wrap:wrap}
.ps-toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;padding:0 14px 12px}
.ps-tools{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}
.ps-dim{color:var(--text-3)}
.muted{color:var(--text-2)}
.nowrap{white-space:nowrap}
.muted-line{font-size:12px;color:var(--text-3)}

/* ---------- 迷你柱状图 ---------- */
.ps-bars{display:flex;align-items:flex-end;gap:8px;height:120px;padding:0 2px}
.ps-bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;height:100%;justify-content:flex-end}
.ps-bar{width:100%;max-width:38px;background:var(--primary);border-radius:6px 6px 3px 3px;min-height:4px;opacity:.9;transition:opacity .16s}
.ps-bar-col:hover .ps-bar{opacity:1}
.ps-bar-col.today .ps-bar{background:var(--success)}
.ps-bar-lbl{font-size:11.5px;color:var(--text-3)}
.ps-bar-val{font-size:11px;color:var(--text-3);min-height:14px}
.ps-bar-col.today .ps-bar-val{color:var(--success);font-weight:600}

/* ---------- 列表项 ---------- */
.ps-list{display:flex;flex-direction:column}
.ps-li{display:flex;align-items:center;gap:11px;padding:12px 14px;border-bottom:1px solid var(--border);transition:background .14s}
.ps-li:last-child{border-bottom:none}
.ps-li:hover{background:var(--surface-2)}
.ps-li.top{align-items:flex-start}
.ps-li-main{flex:1;min-width:0}
.ps-li-t{font-size:14px;line-height:1.5;word-break:break-word}
.ps-li.done .ps-li-t{text-decoration:line-through;color:var(--text-3)}
.ps-li-m{font-size:12px;color:var(--text-3);margin-top:4px;display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center}
.ps-li-m span{display:inline-flex;align-items:center;gap:4px}
.ps-li-m.late,.ps-li-m .late{color:var(--danger);font-weight:600}
.ps-li-m.today,.ps-li-m .today{color:var(--warn);font-weight:600}
.ps-li-m.soon,.ps-li-m .soon{color:var(--primary-dark)}
.ps-li-note{font-size:12.5px;color:var(--text-2);margin-top:6px;line-height:1.7;white-space:pre-wrap;word-break:break-word}
.ps-li-ops{display:flex;gap:2px;flex:none;align-items:center;opacity:.6;transition:opacity .16s}
.ps-li:hover .ps-li-ops{opacity:1}
.ps-check{width:21px;height:21px;border-radius:50%;border:2px solid var(--border-strong);background:transparent;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none;padding:0;transition:all .16s var(--ease)}
.ps-check svg{opacity:0;transform:scale(.5);transition:all .18s var(--ease);color:#fff}
.ps-check.on{background:var(--primary);border-color:var(--primary)}
.ps-check.on svg{opacity:1;transform:scale(1)}
.ps-star{background:none;border:none;cursor:pointer;color:var(--text-3);display:flex;padding:4px}
.ps-star.on{color:var(--warn)}
.icon-btn.on-star{color:var(--warn)}

/* ---------- 标签 / 徽标 ---------- */
.ps-tag{display:inline-flex;align-items:center;gap:3px;font-size:11px;padding:2px 7px;border-radius:6px;background:var(--surface-2);border:1px solid var(--border);color:var(--text-2);white-space:nowrap}
.ps-tag.pub{background:var(--success-soft);border-color:transparent;color:#0A8C66}
.ps-tag.pri{background:var(--surface-2);color:var(--text-2)}
:root[data-theme="dark"] .ps-tag.pub{color:#3DDCB0}
.ps-badge{display:inline-flex;align-items:center;gap:3px;font-size:11.5px;padding:2px 8px;border-radius:7px;background:var(--surface-2);border:1px solid var(--border);color:var(--text-2);white-space:nowrap}
.ps-badge.blue{background:var(--primary-soft);border-color:transparent;color:var(--primary-dark)}
.ps-badge.green{background:var(--success-soft);border-color:transparent;color:#0A8C66}
.ps-badge.red{background:var(--danger-soft);border-color:transparent;color:#D33B3B}
.ps-badge.orange{background:var(--warn-soft);border-color:transparent;color:#C97A00}
.ps-badge.purple{background:var(--purple-soft);border-color:transparent;color:#5F3DC4}
.ps-badge.gray{background:var(--surface-2);color:var(--text-2)}
:root[data-theme="dark"] .ps-badge.green{color:#3DDCB0}
:root[data-theme="dark"] .ps-badge.red{color:#FF8A8A}
:root[data-theme="dark"] .ps-badge.orange{color:#FFB347}
:root[data-theme="dark"] .ps-badge.purple{color:#B197FC}
:root[data-theme="dark"] .ps-badge.blue{color:#9DB4FF}

/* ---------- 方块入口 ---------- */
.mod-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:12px}
.mod-card{display:flex;align-items:flex-start;gap:13px;padding:16px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);cursor:grab;transition:all .18s var(--ease);box-shadow:var(--sh-1);position:relative}
.mod-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:var(--border-strong)}
.mod-card:active{cursor:grabbing}
.mod-card .grip{position:absolute;top:8px;right:8px;color:var(--text-3);opacity:0;transition:opacity .15s;cursor:grab}
.mod-card:hover .grip{opacity:.7}
.mod-card.dragging{opacity:.45;transform:scale(.98)}
.mod-card.dragover{border-color:var(--primary);border-style:dashed;box-shadow:0 0 0 3px var(--primary-soft)}
.mod-ico{width:42px;height:42px;border-radius:13px;display:flex;align-items:center;justify-content:center;flex:none;background:var(--primary-soft);color:var(--primary-dark)}
.mod-ico.m-teal{background:var(--teal-soft);color:#0A8C8C}
.mod-ico.m-orange{background:var(--warn-soft);color:#C97A00}
.mod-ico.m-purple{background:var(--purple-soft);color:#5F3DC4}
.mod-ico.m-green{background:var(--success-soft);color:#0A8C66}
.mod-ico.m-blue{background:var(--primary-soft);color:var(--primary-dark)}
.mod-ico.m-gray{background:var(--surface-2);color:var(--text-2)}
.mod-body{min-width:0;flex:1}
.mod-name{font-size:14.5px;font-weight:600}
.mod-desc{font-size:12.5px;color:var(--text-3);margin-top:3px;line-height:1.45;word-break:break-word}
.mod-count{font-size:11.5px;color:var(--text-3);margin-top:8px}
/* 外部工具入口：点一下在新窗口打开 */
.mod-card.mod-out{border-style:dashed}
.mod-ext{display:inline-flex;vertical-align:-1px;margin-left:5px;color:var(--text-3)}
.mod-card.mod-out:hover .mod-ext{color:var(--primary)}
:root[data-theme="dark"] .mod-ico.m-teal{color:#3DDBC0}
:root[data-theme="dark"] .mod-ico.m-orange{color:#FFB347}
:root[data-theme="dark"] .mod-ico.m-purple{color:#B197FC}
:root[data-theme="dark"] .mod-ico.m-green{color:#3DDCB0}

/* ---------- 工具卡片（网站/工具收藏） ---------- */
.site-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:12px}
.site-card{padding:14px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);display:flex;flex-direction:column;gap:11px;cursor:pointer;transition:all .18s var(--ease);box-shadow:var(--sh-1)}
.site-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:var(--border-strong)}
.site-card.dragging{opacity:.4}
.site-card.dragover{border-color:var(--primary);box-shadow:0 0 0 3px rgba(76,110,245,.12)}
.sc-top{display:flex;align-items:center;gap:11px;min-width:0}
.site-ico{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:16px;flex:none;overflow:hidden}
.site-body{min-width:0;flex:1}
.site-name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.site-url{font-size:11.5px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}
.sc-foot{display:flex;align-items:center;gap:8px;min-height:24px}
.sc-ops{margin-left:auto;display:flex;gap:2px}
.grip{cursor:grab;color:var(--text-3);display:flex;flex:none}
.chipbar{display:flex;gap:6px;flex-wrap:wrap}

/* ---------- 项目卡片 ---------- */
.proj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(285px,1fr));gap:14px}
.proj-card{padding:18px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);display:flex;flex-direction:column;gap:12px;box-shadow:var(--sh-1)}
.proj-top{display:flex;align-items:flex-start;gap:10px}
.proj-name{font-size:15px;font-weight:600;flex:1;min-width:0;word-break:break-word}
.proj-desc{font-size:12.5px;color:var(--text-2);line-height:1.65;min-height:20px;word-break:break-word}
.proj-prog .pp-head{display:flex;justify-content:space-between;font-size:12px;color:var(--text-3);margin-bottom:6px}
.proj-prog .pp-head b{color:var(--text-2)}
.prog{height:7px;border-radius:7px;background:var(--surface-2);border:1px solid var(--border);overflow:hidden}
.prog i{display:block;height:100%;border-radius:7px;background:var(--primary);transition:width .45s var(--ease)}
.prog i.green{background:var(--success)}
.prog i.orange{background:var(--warn)}
.proj-foot{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--text-3);flex-wrap:wrap}
.proj-foot .pf-right{margin-left:auto;display:flex;gap:2px}
.proj-owner{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--text-3);border-top:1px solid var(--border);padding-top:10px}

/* ---------- 表格在窄屏变卡片 ---------- */
@media (max-width:720px){
  .tbl-mobile-cards thead{display:none}
  .tbl-mobile-cards tbody tr{display:block;border:1px solid var(--border);border-radius:var(--r-sm);margin-bottom:10px;padding:8px 10px;background:var(--surface)}
  .tbl-mobile-cards tbody td{display:flex;justify-content:space-between;gap:12px;border:none;padding:5px 0;text-align:left !important}
  .tbl-mobile-cards tbody td::before{content:attr(data-label);color:var(--text-3);font-size:12px;flex:none}
  .tbl-mobile-cards tbody td .cell-actions{opacity:1}
}

/* ---------- 合同 / 报价单 ---------- */
.ct-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px}
.ct-card{padding:16px;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);display:flex;flex-direction:column;gap:10px;box-shadow:var(--sh-1);border-left:3px solid var(--primary)}
.ct-card[data-k="contract"]{border-left-color:var(--purple)}
.ct-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ct-kind{font-size:11px;padding:2px 8px;border-radius:6px;font-weight:600;background:var(--primary-soft);color:var(--primary-dark)}
.ct-kind.k-c{background:var(--purple-soft);color:#5F3DC4}
:root[data-theme="dark"] .ct-kind.k-c{color:#B197FC}
.ct-no{font-size:12px;color:var(--text-3)}
.ct-title{font-size:15px;font-weight:600;line-height:1.45;word-break:break-word}
.ct-cust{font-size:12.5px;color:var(--text-2);display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.ct-nums{display:grid;grid-template-columns:1fr 1fr;gap:8px;background:var(--surface-2);border-radius:var(--r-sm);padding:11px 12px}
.ct-nums>div{display:flex;justify-content:space-between;font-size:12px;color:var(--text-3)}
.ct-nums>div b{color:var(--text-2);font-weight:600}
.ct-nums>div.hi b{color:var(--success);font-size:14px}
.ct-foot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11.5px}
.ct-ops{margin-left:auto;display:flex;gap:3px;align-items:center}
.ct-owner{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--text-3);border-top:1px solid var(--border);padding-top:9px}

/* 合同表单 */
.cf-row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.cf-row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px}
.cf-no{display:flex;gap:8px}
.cf-no .input{flex:1}
.cf-sec{margin:16px 0 14px;border-top:1px solid var(--border);padding-top:14px}
.cf-table-wrap{overflow-x:auto;margin-top:10px}
.cf-table{width:100%;border-collapse:collapse;min-width:620px}
.cf-table th,.cf-table td{border-bottom:1px solid var(--border);padding:7px 6px;font-size:12.5px;text-align:left}
.cf-table th{color:var(--text-3);font-weight:500;background:var(--surface-2)}
.cf-table .input{padding:6px 9px;font-size:13px}
.cf-table .cf-amt{text-align:right;font-weight:600;color:var(--text-2);white-space:nowrap}
.cf-total{margin-top:14px;background:var(--surface-2);border-radius:var(--r-sm);padding:12px 14px}
.cft-row{display:flex;justify-content:space-between;font-size:13px;padding:4px 0;color:var(--text-2)}
.cft-row.big{border-top:1px solid var(--border-strong);margin-top:6px;padding-top:9px;font-size:16px;font-weight:700;color:var(--text)}
.cft-row.big b{color:var(--success)}

@media (max-width:1180px){
  .ps-grid3{grid-template-columns:1fr 1fr}
  .ps-hero-stats{min-width:0;width:100%}
}
@media (max-width:860px){
  .ps-hero{padding:20px}
  .ps-greet{font-size:20px}
  .ps-grid2,.ps-grid3{grid-template-columns:1fr}
  .mod-grid{grid-template-columns:1fr 1fr}
  .cf-row2,.cf-row3{grid-template-columns:1fr}
  .ct-grid,.proj-grid,.site-grid{grid-template-columns:1fr}
  .ps-tools{margin-left:0;width:100%}
  .ps-toolbar{padding:0 12px 12px}
}
@media (max-width:520px){
  .ps-hero-stats{grid-template-columns:1fr 1fr}
  .mod-grid{grid-template-columns:1fr}
  .ps-bars{height:100px}
}

/* 快速输入行的图标 */
.q-ico{color:var(--primary);display:flex;flex:none}
.quick{margin-bottom:0;border:none;box-shadow:none;background:transparent;padding:12px 14px}
.quick .input{background:var(--surface-2)}
.card .ps-list{border-top:1px solid var(--border)}
.card .ps-toolbar{border-bottom:1px solid var(--border)}

/* ---------- 今日待办：快速新增面板（原来只有一条细输入框，太不显眼） ---------- */
.td-new-card{padding:0;overflow:hidden}
.td-new{padding:16px 18px 14px;
  background-image:linear-gradient(158deg,rgba(76,110,245,.11),rgba(121,80,242,.06) 58%,rgba(255,255,255,0));
  border-bottom:1px solid var(--border)}
.tdn-head{display:flex;align-items:center;gap:11px;margin-bottom:12px}
.tdn-ico{width:36px;height:36px;flex:none;border-radius:12px;display:grid;place-items:center;color:#fff;
  background:linear-gradient(150deg,var(--primary),#7950F2);box-shadow:0 9px 20px -11px rgba(76,110,245,.95)}
.tdn-t{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.tdn-t b{font-size:15.5px;letter-spacing:.2px}
.tdn-t span{font-size:12px;color:var(--text-3)}
.tdn-input{width:100%;min-height:76px;resize:vertical;font-size:15px;line-height:1.6;
  padding:13px 15px;border-radius:14px;border:1.5px solid var(--border);
  background:var(--surface-2);color:var(--text);font-family:inherit;outline:none;
  transition:border-color .16s,box-shadow .16s,background .16s;box-sizing:border-box}
.tdn-input::placeholder{color:var(--text-3)}
.tdn-input:focus{border-color:var(--primary);box-shadow:0 0 0 4px rgba(76,110,245,.14);background:var(--surface)}
.tdn-foot{display:flex;align-items:center;gap:10px;margin-top:12px;flex-wrap:wrap}
.tdn-opts{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tdn-chip,.tdn-date{display:inline-flex;align-items:center;gap:6px;height:38px;padding:0 13px;
  border-radius:11px;border:1.5px solid var(--border);background:var(--surface-2);
  color:var(--text-2);font-size:13px;font-family:inherit;cursor:pointer;
  transition:border-color .16s,color .16s,background .16s}
.tdn-chip:hover,.tdn-date:hover{border-color:var(--border-strong);color:var(--text)}
.tdn-chip.on{border-color:#F08C00;color:#B36B00;background:rgba(240,140,0,.13)}
.tdn-chip.on svg{color:#F08C00;fill:rgba(240,140,0,.85)}
.tdn-date input[type=date]{border:none;background:transparent;color:inherit;font:inherit;
  outline:none;padding:0;width:110px;cursor:pointer}
.tdn-add{height:38px;padding:0 18px;font-size:14px;margin-left:auto;white-space:nowrap;
  box-shadow:0 10px 22px -12px rgba(76,110,245,.95)}
@media (max-width:600px){
  .tdn-add{margin-left:0;flex:1;justify-content:center}
  .tdn-date input[type=date]{width:96px}
}
:root[data-theme="dark"] .td-new{background-image:linear-gradient(158deg,rgba(76,110,245,.22),rgba(121,80,242,.14) 58%,rgba(255,255,255,0))}
:root[data-theme="dark"] .tdn-chip.on{color:#F5B24A;background:rgba(240,140,0,.20)}

/* ---------- 外业项目：卡片上的业务信息行 ---------- */
.pj-meta{display:flex;flex-wrap:wrap;gap:6px 8px;margin-top:3px}
.pj-m{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-2);
  background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:3px 9px;max-width:100%}
.pj-m svg{color:var(--text-3);flex:none}
.pj-m b{font-weight:500;color:var(--text-3);font-size:11.5px}
.pj-m .ps-badge{padding:1px 7px;font-size:11px}
.form-tip{margin-top:10px;font-size:12px;color:var(--text-3);line-height:1.5}

/* ============================================================
   v3.6 视觉升级
   1) 页面极光底色 → 让毛玻璃有层次可透
   2) 所有卡片：默认渐变色 + 毛玻璃质感
   3) 每张卡片可单独换色（data-skin）
   4) 筛选栏：毛玻璃胶囊 + 输入框清除按钮
   ============================================================ */

:root{
  --glass:linear-gradient(165deg,rgba(255,255,255,.95) 0%,rgba(255,255,255,.78) 52%,rgba(244,247,255,.70) 100%);
  --glass-solid:linear-gradient(165deg,rgba(255,255,255,.99) 0%,rgba(251,252,255,.97) 100%);
  --glass-bd:var(--border);
  --glass-sh:0 16px 38px -26px rgba(23,32,60,.42), 0 1px 0 rgba(255,255,255,.9) inset;
  --sk-o1:.26;
  --sk-o2:.05;
}
:root[data-theme="dark"]{
  --glass:linear-gradient(165deg,rgba(33,40,63,.86) 0%,rgba(24,29,47,.78) 100%);
  --glass-solid:linear-gradient(165deg,rgba(32,38,60,.99) 0%,rgba(25,30,48,.98) 100%);
  --glass-sh:0 18px 42px -26px rgba(0,0,0,.85), 0 1px 0 rgba(255,255,255,.05) inset;
  --sk-o1:.30;
  --sk-o2:.08;
}

/* ---------- 1) 极光底色 ---------- */
body::before{
  content:"";position:fixed;inset:-18% -12% -12%;z-index:-1;pointer-events:none;
  background:
    radial-gradient(50% 44% at 10% 2%, rgba(76,110,245,.34), transparent 68%),
    radial-gradient(42% 38% at 96% -2%, rgba(121,80,242,.30), transparent 68%),
    radial-gradient(50% 46% at 84% 100%, rgba(12,165,165,.26), transparent 68%),
    radial-gradient(40% 36% at 0% 92%, rgba(240,140,0,.20), transparent 68%);
}
:root[data-theme="dark"] body::before{
  background:
    radial-gradient(50% 44% at 10% 2%, rgba(76,110,245,.46), transparent 68%),
    radial-gradient(42% 38% at 96% -2%, rgba(121,80,242,.40), transparent 68%),
    radial-gradient(50% 46% at 84% 100%, rgba(12,165,165,.30), transparent 68%);
}

/* ---------- 2) 卡片：渐变 + 毛玻璃 ---------- */
.card,.mod-card,.site-card,.proj-card,.ct-card,.item-card,.stat,.table-wrap,.quick,.toolbar{
  background-color:transparent;
  background-image:var(--skin-img,none),var(--glass);
  border-color:var(--glass-bd);
  box-shadow:var(--glass-sh);
  -webkit-backdrop-filter:blur(18px) saturate(160%);
  backdrop-filter:blur(18px) saturate(160%);
}
.kpi-card{background-color:transparent;background-image:var(--skin-img,none),var(--glass);
  box-shadow:var(--glass-sh);-webkit-backdrop-filter:blur(18px) saturate(160%);backdrop-filter:blur(18px) saturate(160%)}
/* KPI 卡保留各自的色调，但改成渐变 */
.k-blue{background-image:linear-gradient(152deg,rgba(124,156,255,.26),rgba(76,110,245,.04) 72%),var(--glass)}
.k-green{background-image:linear-gradient(152deg,rgba(99,230,190,.26),rgba(18,184,134,.04) 72%),var(--glass)}
.k-orange{background-image:linear-gradient(152deg,rgba(255,192,120,.28),rgba(240,140,0,.05) 72%),var(--glass)}
.k-purple{background-image:linear-gradient(152deg,rgba(177,151,252,.26),rgba(121,80,242,.04) 72%),var(--glass)}
.k-teal{background-image:linear-gradient(152deg,rgba(102,217,217,.26),rgba(12,165,165,.04) 72%),var(--glass)}
.k-gray{background-image:linear-gradient(152deg,rgba(168,180,200,.24),rgba(100,116,139,.04) 72%),var(--glass)}
/* 弹窗 / 登录卡：不要透太多，保证文字对比度 */
.modal,.login-card{background-color:transparent;background-image:var(--glass-solid);border-color:var(--glass-bd)}

/* ---------- 3) 每张卡片可换色 ---------- */
[data-skin="blue"]{--sk-a:76,110,245;--sk-b:124,156,255}
[data-skin="violet"]{--sk-a:121,80,242;--sk-b:177,151,252}
[data-skin="pink"]{--sk-a:230,73,128;--sk-b:255,143,177}
[data-skin="red"]{--sk-a:240,82,82;--sk-b:255,154,154}
[data-skin="orange"]{--sk-a:240,140,0;--sk-b:255,192,120}
[data-skin="green"]{--sk-a:18,184,134;--sk-b:99,230,190}
[data-skin="teal"]{--sk-a:12,165,165;--sk-b:102,217,217}
[data-skin="cyan"]{--sk-a:16,152,173;--sk-b:116,212,232}
[data-skin="slate"]{--sk-a:100,116,139;--sk-b:168,180,200}
[data-skin]{
  --skin-img:linear-gradient(155deg,rgba(var(--sk-b),var(--sk-o1)) 0%,rgba(var(--sk-a),var(--sk-o2)) 68%);
}
/* 换色按钮：卡片右上角 */
.skin-btn{min-width:24px;height:24px;padding:0 5px;border-radius:6px;border:1px solid var(--border);
  background:var(--surface);color:var(--text-3);cursor:pointer;display:inline-flex;align-items:center;justify-content:center}
.skin-btn:hover{color:var(--primary);border-color:var(--primary)}
/* 模块卡右上三个按钮排开，避免互相压住 */
.mod-card .grip{right:68px}
.mod-skin{position:absolute;top:8px;right:38px;display:none}
.mod-card:hover .mod-skin{display:inline-flex}
@media (max-width:860px){
  .mod-skin{display:inline-flex}
  .mod-x{display:inline-flex}
}
.skin-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}
.skin-item{display:flex;flex-direction:column;align-items:center;gap:7px;padding:10px 4px;border-radius:12px;
  border:1.5px solid transparent;background:var(--surface-2);cursor:pointer;transition:all .15s var(--ease)}
.skin-item:hover{border-color:var(--border-strong);transform:translateY(-1px)}
.skin-item.on{border-color:var(--primary);background:var(--primary-soft)}
.skin-dot{width:30px;height:30px;border-radius:50%;border:1px solid rgba(0,0,0,.08);box-shadow:0 4px 10px -4px rgba(23,32,60,.4)}
.skin-name{font-size:11.5px;color:var(--text-2)}
.skin-item.on .skin-name{color:var(--primary-dark);font-weight:600}
@media (max-width:520px){.skin-grid{grid-template-columns:repeat(4,1fr)}}

/* ---------- 4) 筛选栏：毛玻璃胶囊 ---------- */
.toolbar{gap:10px;padding:10px 12px;border-radius:16px;border:1px solid var(--glass-bd);margin-bottom:16px}
.tb-left{display:flex;gap:9px;align-items:center;flex-wrap:wrap;flex:1;min-width:0}
.tb-right{display:flex;gap:9px;align-items:center;flex-wrap:wrap}
.tb-filters{display:flex;gap:9px;align-items:center;flex-wrap:wrap;min-width:0}
.toolbar .search-wrap{flex:1 1 240px;max-width:340px;min-width:170px}
.toolbar .search-wrap .input{
  height:38px;border-radius:999px;background:var(--surface-2);border-color:transparent;
  padding-left:38px;padding-right:36px;font-size:13.5px;
  box-shadow:inset 0 1px 2px rgba(23,32,60,.06);
}
.toolbar .search-wrap .input:focus{
  background:var(--surface);border-color:transparent;
  box-shadow:0 0 0 3px rgba(76,110,245,.18),inset 0 1px 2px rgba(23,32,60,.05);
}
.toolbar .search-wrap .sw-ico{left:13px}
.sw-clear{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:0;
  border-radius:50%;background:var(--border);color:var(--text-2);display:none;align-items:center;justify-content:center;
  cursor:pointer;padding:0;transition:all .15s}
.search-wrap.has-val .sw-clear{display:flex}
.sw-clear:hover{background:var(--border-strong);color:var(--text)}
.toolbar .select{
  height:38px;width:auto;min-width:108px;max-width:200px;border-radius:999px;font-size:13px;color:var(--text-2);
  background-color:var(--surface-2);border-color:transparent;padding:0 30px 0 14px;
  box-shadow:inset 0 1px 2px rgba(23,32,60,.06);transition:all .16s var(--ease);
}
.toolbar .select:hover{border-color:var(--border-strong)}
.toolbar .select:focus{border-color:transparent;box-shadow:0 0 0 3px rgba(76,110,245,.18)}
.toolbar .select[data-on="1"]{
  background-color:var(--primary-soft);color:var(--primary-dark);font-weight:600;
  box-shadow:inset 0 0 0 1px rgba(76,110,245,.30);
}
.toolbar .tb-filters>.input{height:38px;width:auto;border-radius:999px;background:var(--surface-2);
  border-color:transparent;box-shadow:inset 0 1px 2px rgba(23,32,60,.06)}
.toolbar .tb-filters>.input:focus{background:var(--surface);box-shadow:0 0 0 3px rgba(76,110,245,.18)}
.toolbar .chip{height:38px;padding:0 15px;border-radius:999px;display:inline-flex;align-items:center;gap:6px;
  font-size:13px;background:var(--surface-2);border-color:transparent}
.toolbar .chip.on{background:var(--primary);border-color:var(--primary);color:#fff}
@media (max-width:860px){
  .toolbar{padding:9px 10px}
  .toolbar .search-wrap{flex:1 1 100%;max-width:none}
  .toolbar .tb-filters{flex-wrap:nowrap;overflow-x:auto;width:100%;padding-bottom:2px;scrollbar-width:none}
  .toolbar .tb-filters::-webkit-scrollbar{display:none}
  .toolbar .tb-filters>.select,.toolbar .tb-filters>.input{width:auto;flex:0 0 auto}
  .toolbar .tb-left,.toolbar .tb-right{width:100%}
}

/* ---------- 视图切换（表格 / 卡片） ---------- */
.view-seg{display:inline-flex;gap:2px;padding:3px;border-radius:999px;background:var(--surface-2);flex:none}
.seg-btn{width:30px;height:30px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;
  color:var(--text-3);background:none;border:0;cursor:pointer;padding:0;transition:all .15s var(--ease)}
.seg-btn:hover{color:var(--text)}
.seg-btn.on{background:var(--surface);color:var(--primary);box-shadow:var(--sh-1)}

/* ---------- 库存批量操作 ---------- */
.td-sel{width:38px;text-align:center;padding-right:0 !important}
.ck{width:17px;height:17px;border-radius:5px;accent-color:var(--primary);cursor:pointer;vertical-align:middle}
tr.row-on>td{background:var(--primary-soft)}
.bulk-bar{display:none;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px;padding:10px 14px;
  border-radius:14px;border:1px solid rgba(76,110,245,.32);background:var(--primary-soft);color:var(--primary-dark)}
.bulk-bar.show{display:flex}
.bulk-bar .bb-n{font-size:13px;font-weight:700}
.bulk-bar .bb-btns{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap}
.bb-sep{width:1px;height:20px;background:rgba(76,110,245,.28)}
.item-card .ic-head{align-items:center}
.item-card .ic-head .ck{margin-right:2px}
.item-card .ic-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
.ic-head-r{display:flex;align-items:center;gap:6px;flex:none}
.item-card.row-on{box-shadow:0 0 0 2px rgba(76,110,245,.55), var(--glass-sh)}
tr.row-on>td{background:var(--primary-soft)}
tr.row-on:hover>td{background:var(--primary-soft)}
@media (max-width:860px){
  table.tbl td.td-sel{padding:0 0 8px !important}
  table.tbl td.td-sel::before{content:"" !important}
  .bulk-bar{padding:10px}
  .bulk-bar .bb-btns{margin-left:0;width:100%}
}

/* ---------- 今日重点：卡片 + 颜色分级 + 拖动排序 ---------- */
.focus-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(238px,1fr));gap:12px;padding:4px 14px 14px}
.focus-card{position:relative;overflow:hidden;border-radius:14px;padding:13px 14px 12px;cursor:grab;
  border:1px solid var(--glass-bd);background-color:transparent;background-image:var(--skin-img,none),var(--glass);
  box-shadow:var(--glass-sh);-webkit-backdrop-filter:blur(16px) saturate(150%);backdrop-filter:blur(16px) saturate(150%);
  transition:transform .17s var(--ease),box-shadow .17s var(--ease);border-left:3px solid var(--fc,#8C95A8)}
.focus-card:hover{transform:translateY(-2px);box-shadow:0 20px 40px -24px rgba(23,32,60,.5)}
.focus-card:active{cursor:grabbing}
.focus-card.dragging{opacity:.42;transform:scale(.97)}
.focus-card.dragover{outline:2px dashed var(--primary);outline-offset:2px}
.focus-card.p3{border-left-color:#F05252}
.focus-card.p2{border-left-color:#F08C00}
.focus-card.p1{border-left-color:#4C6EF5}
.focus-card.p0{border-left-color:#94A3B8}
.fc-top{display:flex;align-items:center;gap:7px;margin-bottom:8px}
.fc-prio{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:999px;
  font-size:11px;font-weight:700;border:1px solid transparent;cursor:pointer;background:none}
.fc-prio.p3{background:rgba(240,82,82,.16);color:#D33B3B;border-color:rgba(240,82,82,.3)}
.fc-prio.p2{background:rgba(240,140,0,.16);color:#B96C00;border-color:rgba(240,140,0,.3)}
.fc-prio.p1{background:rgba(76,110,245,.14);color:#3B57D6;border-color:rgba(76,110,245,.28)}
.fc-prio.p0{background:var(--surface-2);color:var(--text-3)}
:root[data-theme="dark"] .fc-prio.p3{color:#FF8A8A}
:root[data-theme="dark"] .fc-prio.p2{color:#FFB347}
:root[data-theme="dark"] .fc-prio.p1{color:#9DB4FF}
.fc-grip{margin-left:auto;color:var(--text-3);opacity:.45;display:flex;cursor:grab}
.focus-card:hover .fc-grip{opacity:.9}
.fc-txt{font-size:13.5px;line-height:1.55;word-break:break-word;min-height:22px}
.fc-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px;font-size:11.5px;color:var(--text-3)}
.fc-meta .late{color:var(--danger);font-weight:600}
.fc-meta .today{color:var(--warn);font-weight:600}
.fc-meta .soon{color:var(--primary-dark)}
.fc-ops{margin-left:auto;display:flex;gap:2px;align-items:center;opacity:0;transition:opacity .15s}
.focus-card:hover .fc-ops{opacity:1}
.focus-card .fc-check{width:19px;height:19px;border-radius:50%;border:2px solid var(--border-strong);background:transparent;
  display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none;padding:0;transition:all .16s var(--ease)}
.focus-card .fc-check svg{opacity:0;transform:scale(.5);transition:all .18s var(--ease);color:#fff}
.focus-card .fc-check:hover{border-color:var(--primary)}
@media (max-width:860px){
  .focus-grid{grid-template-columns:1fr;padding:4px 12px 12px}
  .fc-ops{opacity:1}
}

/* ---------- 库存批量导入 ---------- */
.imp-note{display:flex;flex-direction:column;gap:7px;padding:12px 14px;border-radius:12px;
  background:var(--surface-2);font-size:12.5px;color:var(--text-2);line-height:1.65}
.imp-note>div{display:flex;gap:8px;align-items:flex-start}
.imp-note b{flex:none;min-width:72px;color:var(--text-1)}
.imp-cols code,.imp-map code{display:inline-block;margin:1px 4px 1px 0;padding:1px 7px;border-radius:6px;
  background:var(--surface);border:1px solid var(--border);font-size:11.5px;color:var(--text-2);font-family:inherit}
.imp-tpl{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:14px 0 2px;font-size:12.5px;color:var(--text-3)}
.imp-sub{margin:14px 0 8px;font-size:12.5px;font-weight:600;color:var(--text-2)}
.imp-pick{display:flex;align-items:center;gap:10px;margin-top:14px;padding:13px 14px;border-radius:12px;
  border:1.5px dashed var(--border-strong);background:var(--surface-2)}
.imp-pick .btn{flex:none}
.imp-file{font-size:12.5px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.imp-sum{display:flex;gap:8px;flex-wrap:wrap;margin:16px 0 8px}
.imp-tag{font-size:12.5px;padding:4px 12px;border-radius:999px;border:1px solid transparent;font-weight:600}
.imp-tag b{font-size:14px}
.imp-tag.ok{background:var(--success-soft);color:var(--success)}
.imp-tag.warn{background:var(--warn-soft);color:var(--warn)}
.imp-tag.bad{background:var(--danger-soft);color:var(--danger)}
.imp-map{font-size:12.5px;color:var(--text-3);line-height:2.1}
.imp-ignore{margin-left:10px;opacity:.75}
.imp-none{color:var(--danger)}
.imp-tablewrap{max-height:320px;overflow:auto;border:1px solid var(--border);border-radius:12px;margin:8px 0}
.imp-tbl{margin:0;font-size:12px}
.imp-tbl thead th{position:sticky;top:0;background:var(--surface);z-index:1;white-space:nowrap}
.imp-tbl thead th.off{color:var(--text-3);opacity:.55}
.imp-more,.imp-bad,.imp-dup{margin-top:10px;font-size:12.5px;line-height:1.7;border-radius:10px;padding:10px 12px}
.imp-more{color:var(--text-3);padding:4px 0 0;background:none}
.imp-bad{background:var(--danger-soft);color:var(--danger)}
.imp-dup{background:var(--warn-soft);color:var(--warn)}
.imp-bad ul{margin:5px 0 0 18px;padding:0}
@media (max-width:640px){
  .imp-note>div{flex-direction:column;gap:2px}
  .imp-note b{min-width:0}
}

/* ---------- 移动端触控与筛选条（新版优化） ---------- */
@media (max-width:860px){
  /* 小控件热区放大：手指点得准，视觉只大一点。
     集中写在文件末尾，避免与上面的基础规则同优先级互相覆盖（老坑）。 */
  .ck{width:22px;height:22px}
  .ps-check{width:26px;height:26px}
  .focus-card .fc-check{width:26px;height:26px}
  .ch-btn{min-width:30px;height:30px;font-size:12px}
  .seg-btn{width:36px;height:36px}
  /* 窄屏筛选条是横向滑动的：内容溢出时右边缘渐隐，
     否则最后一个下拉被裁掉一半，用户不知道右边还有筛选条件（is-scroll 由 ui.js 标记） */
  .toolbar .tb-filters.is-scroll{
    -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 26px),transparent);
    mask-image:linear-gradient(to right,#000 calc(100% - 26px),transparent);
  }
}

/* ============================================================
   手机端可读性 + 首页紧凑度（v3.8）
   ⚠️ 必须放在文件末尾：同优先级下靠「源顺序」取胜，上面已有的
      @media (max-width:860px) / (max-width:520px) 块会把这些规则顶掉。
      项目中已因此踩过两次坑（.back-top 位置、.icon-btn.sm 热区）。
   ============================================================ */
@media (max-width:860px){
  /* ① 辅助文字字号下限。
        手机上 11~11.5px 太细，操作记录页一屏能有 120 多处小字，统一抬到 12.5px。 */
  .ps-hl,.ps-ch-sub,.kpi-sub,.sub,.dl-pct,.hb-sub,.ch-stat,.ch-foot,
  .nc-owner,.nd-count,.delta,.side-user-role,.mod-count,.qn-head span,
  .ad-grid b,.audit-detail summary{font-size:12.5px}
  /* ①b 这些选择器的基础规则优先级更高（表格里的 .sub、.pj-m b 等），
        光靠上面那一组盖不住，必须逐个点名。 */
  .ps-badge,.ps-tag,.ct-kind,.ct-foot,.ct-owner,.site-url,
  .pj-m b,.pj-m .ps-badge,table.tbl tbody td.td-main .sub{font-size:12px}
  /* ①c 外业项目卡的创建人（.proj-owner 基础规则 11.5px）与
        操作记录页「查看变更详情」里的 JSON（.ad-grid pre 11.5px） */
  .proj-owner{font-size:12px}
  .ad-grid pre{font-size:12px;line-height:1.5}
  /* 操作记录每条 4~5 个 meta 片段，最密的一处，顺带把行距收一点 */
  .tl-meta{font-size:12.5px;gap:7px;line-height:1.5}
  .ch-btn{font-size:12.5px}
  /* ② 小徽章：11/11.5px 偏小，抬到 12px 并略增高，文字不再贴着边框 */
  .role-badge,.scope-badge,.st-badge,.tx-badge,.badge{font-size:12px}
  .role-badge,.scope-badge,.st-badge,.tx-badge{height:22px}
  /* ⑥ KPI 卡标签：窄屏本来被压到 11.5px，回到 12.5px */
  .kpi-label{font-size:12.5px}
  /* ⑦ 图表轴标签：基础规则是 10.5px，而 charts.js 在窄屏已把画布缩到
        ~1:1 渲染（原来 640 画布被缩到 0.52 倍，实际只剩 7px），
        所以这里直接给到 12px。 */
  .ch-axis{font-size:12px}
  /* ④ 首页「近 7 天」：窄屏原来掉成单列，4 张图要占满一整屏。
        改两列；库存大卡内部是 46px 大数字，让它占满整行。 */
  .ps-grid3{grid-template-columns:1fr 1fr;gap:12px}
  .chart-card.stock-hero{grid-column:1/-1}
  .ps-bars{height:92px;gap:6px}
  .ps-bar-lbl,.ps-bar-val{font-size:12px}
  .ps-ch-title{margin-bottom:9px}
  /* ⑤ 区块与卡片间距收紧，一屏能多放内容 */
  .ps-hero{margin-bottom:13px;padding:18px 16px}
  .ps-sec{margin-bottom:13px}
  .sec-head{margin-bottom:10px}
}
@media (max-width:520px){
  /* 首页 hero 的 5 个指标：原来是 2+2+1 三行（末行单格还只占半宽），
     改成一行 5 格，直接省下约 130px。 */
  .ps-hero-stats{grid-template-columns:repeat(5,1fr);gap:6px;min-width:0}
  .ps-hstat{padding:9px 3px;border-radius:11px}
  .ps-hn{font-size:16px}
  .ps-hl{font-size:12px;margin-top:3px;letter-spacing:-.2px}
  /* 个人工作台模块：原来窄屏单列，9 个模块要滑 700 多 px，改成两列。
     描述最多两行，避免长短不一撑高卡片。 */
  .mod-grid{grid-template-columns:1fr 1fr;gap:10px}
  .mod-card{padding:12px;gap:10px}
  .mod-ico{width:34px;height:34px;border-radius:11px}
  .mod-name{font-size:13.5px}
  .mod-desc{font-size:12px;-webkit-line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
  .mod-count{margin-top:5px}
  .mod-add{min-height:72px}
  /* 数据看板 8 张 KPI 卡排 4 行，收紧内边距把字号抬上去多占的高度补回来 */
  .kpi-card{padding:11px 12px}
  .kpi-top{margin-bottom:6px}
  .kpi-sub{margin-top:4px}
}

/* ⑧ 环形图中心的副标题（.dn-sub，如「收入合计」）。
      donut 用的是固定 width/height 的 SVG，不存在等比缩放，11px 就是屏幕上的真实字号，
     所以这条不分端、全局抬到 12px（放在文件末尾以保证同优先级下胜出）。 */
.dn-sub{font-size:12px}

/* ---------- 通用附件上传 ---------- */
.att-list{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.att-row{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:10px;background:var(--surface-2);border:1px solid var(--border)}
.att-ico{color:var(--primary);flex:none;display:flex}
.att-name{flex:1;min-width:0;font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.att-name a{color:var(--primary);text-decoration:none}
.att-name a:hover{text-decoration:underline}
.att-size{flex:none;font-size:11.5px;color:var(--text-3);font-family:ui-monospace,Menlo,Consolas,monospace}
.att-upload{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.att-tip{font-size:12px;color:var(--text-3)}
.att-badge{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--primary);background:var(--primary-soft);padding:3px 9px;border-radius:999px;border:none;cursor:pointer;font:inherit;line-height:inherit;transition:background .15s,color .15s}.att-badge:hover{background:var(--primary);color:#fff}
@media (max-width:860px){
  .att-row{padding:11px}
  .att-tip{width:100%}
}

/* ---------- 我的 → 下拉选项设置（按业务分组，一组多行） ---------- */
.opt-group{padding:0 0 4px}
.opt-group + .opt-group{margin-top:14px;padding-top:14px;border-top:1px dashed var(--border)}
.opt-group-h{font-size:12.5px;font-weight:600;color:var(--text-2);margin:0 0 10px;letter-spacing:.3px}
.opt-row + .opt-row{margin-top:14px}
.opt-row-h{display:flex;align-items:baseline;gap:8px;margin-bottom:6px;flex-wrap:wrap}
.opt-row-h b{font-size:13px;color:var(--text)}
.opt-row-h span{font-size:11.5px;color:var(--text-3);font-family:ui-monospace,Menlo,Consolas,monospace}
.opt-row .company-edit{gap:9px}
.opt-row .muted-line{margin:0}
@media (max-width:860px){
  .opt-row-h span{display:none}          /* 手机上不用看内部 key */
  .opt-row .co-add .input{height:44px}   /* 触控热区 */
  .opt-row .co-add .btn{height:44px}
  .opt-row .tag-list .tx-badge button.icon-btn{width:22px;height:22px}
}

/* ---------- 仪器租用（出租台账）---------- */
.rent-card.is-renting{border-color:#9db4ff;box-shadow:0 6px 18px rgba(76,110,245,.14)}
.rent-card.is-renting .ic-name{color:#2b5cff}
.rent-card.is-returned{opacity:.6;filter:grayscale(.75)}
.rm-no{font-weight:600;color:#64748B;margin-left:5px;font-size:13px}
.rent-dates{font-size:12.5px;color:#64748B;display:flex;gap:6px;align-items:center;margin:6px 0 2px;flex-wrap:wrap}
.rent-photos{display:flex;gap:6px;flex-wrap:wrap;margin:4px 0 6px}
.rent-photo{width:52px;height:52px;border-radius:10px;overflow:hidden;border:1px solid rgba(0,0,0,.08);display:block}
.rent-photo img{width:100%;height:100%;object-fit:cover;display:block}
.rent-remark{font-size:12.5px;color:#525f73;background:var(--bg-2,#f3f5fa);border-radius:8px;padding:6px 8px;margin:6px 0 2px;line-height:1.5}
.rm-amt{color:#2b6cff;font-weight:700}
.st-badge.sb-rent{background:rgba(18,184,134,.16);color:#0CA678}

/* ---------- 销售统计 ---------- */
.grid.g1{grid-template-columns:1fr}
.custom-range{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:-4px 0 14px}
.custom-range.hide{display:none}
.custom-range .cr-sep{color:#64748B;font-size:13px}
.filter-bar{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;margin-bottom:12px}
.filter-bar label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:#64748B}
.filter-bar .input.sm{min-width:120px}
.sm-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.sm-card{background:var(--bg-2,#f3f5fa);border:1px solid var(--border,#e6e9f2);border-radius:12px;padding:10px 12px;text-align:center}
.sm-card .sm-label{font-size:12.5px;color:#64748B;margin-bottom:4px}
.sm-card .sm-qty{font-size:22px;font-weight:700;color:#1f2a44;line-height:1.1}
.sm-card .sm-qty span{font-size:12px;font-weight:500;color:#64748B}
.sm-card .sm-amt{font-size:14px;font-weight:600;color:#2b6cff;margin-top:4px}
.sm-card .sm-profit{font-size:12px;color:#0CA678;margin-top:2px}
.table-scroll{overflow-x:auto}
.tbl-pager{font-size:12.5px;color:#64748B;margin-bottom:8px}

/* 销售统计：与所选时间范围匹配的 KPI 卡高亮 */
.kpi-card.kpi-hot{outline:2px solid #4C6EF5;outline-offset:-1px;box-shadow:0 4px 14px rgba(76,110,245,.18)}
/* 仪器租用：逾期未还（仍在租但已过租止日） */
.rent-card.is-overdue{border-color:#ffa8a8;box-shadow:0 6px 18px rgba(225,49,49,.16)}
.rent-card.is-overdue .ic-name{color:#E03131}
.st-badge.sb-late{background:rgba(225,49,49,.14);color:#E03131}

/* 目标完成率 */
.tgt-row{margin-bottom:14px}
.tgt-row:last-of-type{margin-bottom:8px}
.tgt-head{display:flex;justify-content:space-between;align-items:baseline;font-size:12.5px;color:#64748B;margin-bottom:5px}
.tgt-head b{font-size:14px;color:#1f2a44;font-weight:600}
.tgt-bar{height:10px;border-radius:6px;background:var(--bg-2,#eef1f8);overflow:hidden}
.tgt-bar i{display:block;height:100%;border-radius:6px;background:linear-gradient(90deg,#4C6EF5,#12B886);transition:width .4s ease}
.tgt-bar.alt i{background:linear-gradient(90deg,#7950F2,#E8590C)}
.tgt-pct{font-size:12.5px;color:#64748B;margin-top:4px}
.tgt-pct.done{color:#0CA678;font-weight:600}
.tgt-meta{font-size:12px;color:#8A94A6;border-top:1px dashed var(--border,#e6e9f2);padding-top:8px;margin-top:4px}
.tgt-empty{padding:4px 0}

/* 环比 / 同比 */
.cmp-sub{font-size:12px;color:#8A94A6;margin-bottom:8px;line-height:1.5}
.cmp-up{color:#0CA678;font-weight:600}
.cmp-down{color:#E03131;font-weight:600}
.cmp-flat,.cmp-na{color:#8A94A6}
@media (max-width:640px){
  .sm-cards{grid-template-columns:1fr 1fr 1fr;gap:6px}
  .sm-card .sm-qty{font-size:18px}
}

/* ---------- 列表分页条 ---------- */
.list-pager{display:flex;align-items:center;gap:12px;padding:10px 4px 2px;font-size:13px;color:#8A94A6;flex-wrap:wrap}
.list-pager .lp-info{font-weight:500}
.list-pager .lp-page{color:#49546B}
.list-pager .lp-btns{display:inline-flex;gap:4px;margin-left:auto}
.list-pager .icon-btn{min-width:28px;height:28px;line-height:1;font-weight:600}
.list-pager .icon-btn:disabled{opacity:.35;cursor:default}
