  * { margin:0; padding:0; box-sizing:border-box; }
  :root {
    /* —— 取自 zs-ai website-frontend/src/styles/zengsu-theme.css 的 --ly-* —— */
    --brand:#2563eb; --brand-hover:#1d4ed8; --brand-soft:rgba(37,99,235,.10);
    --brand-bg:#eff6ff; --brand-bd:#bfdbfe;
    --text:#000000; --text-muted:#666666; --text-subtle:#6b7280;
    --border:#e2e8f0; --border-hi:#2563eb;
    --bg-shell:#f9f9f9; --bg-muted:#f3f4f6; --surface:#ffffff;
    --radius:12px; --radius-sm:8px; --radius-lg:16px;
    --shadow-card:0 4px 24px rgba(15,23,42,.06), 0 1px 3px rgba(15,23,42,.04);
    --shadow-nav:0 1px 0 rgba(15,23,42,.06);
    /* —— zsyy 补充的语义色：zs-ai 只定义了 --ly-err，其余按浅底 4.5:1 实测选档 —— */
    --ok:#15803d;    --ok-bg:#f0fdf4;   --ok-bd:#bbf7d0;
    --warn:#b45309;  --warn-bg:#fffbeb; --warn-bd:#fde68a;
    --bad:#b91c1c;   --bad-bg:#fef2f2;  --bad-bd:#fecaca;
    /* —— zsyy 补充的周期色：品牌已占用蓝，「一次」让位给中性 —— */
    --week:#6d28d9;  --week-bg:#f5f3ff;
    --month:#be185d; --month-bg:#fdf2f8;
    --once:#475569;  --once-bg:#f1f5f9;
    --track:#eef1f5; --ink:#0f172a;
  }
  /* 字体栈取自 zs-ai --ly-font，末尾额外加 'Noto Sans CJK SC'：Linux 浏览器上
     没有 PingFang SC / Microsoft YaHei 时会回退到没有中文竖排字形度量的字体，
     实测导致竖排文字重叠。 */
  body { font-family:system-ui,-apple-system,'Segoe UI','PingFang SC','Microsoft YaHei','Noto Sans CJK SC',sans-serif; background:var(--bg-muted); color:var(--text); height:100vh; overflow:hidden; }
  /* Loading overlay */
  .loading-overlay { position:fixed; top:0; left:0; width:100%; height:100%; background:var(--bg-muted); display:flex; align-items:center; justify-content:center; z-index:9999; flex-direction:column; }
  .loading-overlay.hidden { display:none; }
  .loading-spinner { width:48px; height:48px; border:4px solid #f0f0f0; border-top:4px solid var(--brand); border-radius:50%; animation:spin 0.8s linear infinite; margin-bottom:16px; }
  @keyframes spin { 0%{transform:rotate(0deg)} 100%{transform:rotate(360deg)} }
  .loading-text { font-size:16px; color:var(--text-muted); }
  .loading-error { font-size:14px; color:var(--bad); margin-top:8px; text-align:center; line-height:1.6; }
  .loading-retry { margin-top:16px; padding:10px 24px; border:none; border-radius:var(--radius-sm); background:var(--brand); color:#fff; cursor:pointer; font-size:14px; font-weight:600; }
  /* Layout */
  .app { display:flex; height:100vh; }
  .app.dashboard-mode .sidebar { display:none; }
  .sidebar { width:260px; background:var(--surface); border-right:1px solid var(--border); display:flex; flex-direction:column; flex-shrink:0; }
  .main { flex:1; display:flex; flex-direction:column; overflow:hidden; }
  /* Sidebar */
  .sidebar-header { padding:18px 20px; border-bottom:1px solid var(--border); }
  .sidebar-header h1 { font-size:18px; color:var(--brand); margin-bottom:4px; }
  .sidebar-header p { font-size:11px; color:var(--text-subtle); }
  .store-list { flex:1; overflow-y:auto; padding:12px; }
  .store-list::-webkit-scrollbar { width:4px; }
  .store-list::-webkit-scrollbar-thumb { background:#ddd; border-radius:2px; }
  /* 侧栏搜索 / 状态筛选：#storeSearch 是静态 DOM（index.html 手写），
     JS 只重建 .store-chips / .store-count，重渲染不会冲掉输入框的值与焦点。 */
  .store-filter { padding:11px 12px; border-bottom:1px solid var(--border); }
  .store-search { position:relative; }
  .store-search-icon { position:absolute; left:10px; top:50%; transform:translateY(-50%); font-size:12px; }
  .store-search input { width:100%; padding:7px 11px 7px 30px; border:1px solid var(--border); border-radius:var(--radius-sm); font-size:13px; font-family:inherit; outline:none; box-sizing:border-box; }
  .store-search input:focus { border-color:var(--brand); box-shadow:0 0 0 3px var(--brand-soft); }
  .store-chips { display:flex; gap:5px; margin-top:9px; flex-wrap:wrap; }
  .store-chip { font-size:11.5px; padding:3px 9px; border:1px solid var(--border); border-radius:var(--radius-sm); background:var(--surface); color:var(--text-muted); cursor:pointer; }
  .store-chip:hover { border-color:var(--brand); color:var(--brand); }
  .store-chip.on { background:var(--brand); border-color:var(--brand); color:#fff; font-weight:600; }
  .store-chip .c { font-variant-numeric:tabular-nums; opacity:.75; margin-left:3px; }
  .store-count { font-size:11px; color:var(--text-subtle); margin-top:8px; font-variant-numeric:tabular-nums; }

  .store-item {
    padding:12px 14px; border-radius:var(--radius-sm); cursor:pointer; margin-bottom:6px;
    border:1px solid var(--border); background:var(--surface); transition:all 0.2s; position:relative;
  }
  .store-item:hover { background:var(--brand-bg); border-color:var(--brand-bd); }
  .store-item.active { background:var(--brand-bg); border-color:var(--brand); }
  /* Store select grid (运营清单列表-未选店铺) */
  .store-select-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:16px; }
  .store-select-card { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:16px 20px; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius); cursor:pointer; transition:all 0.2s; }
  .store-select-card:hover { border-color:var(--brand); background:var(--brand-bg); transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,0.08); }
  .ssc-info { flex:1; }
  .ssc-name { font-size:15px; font-weight:600; color:#333; margin-bottom:4px; }
  .ssc-meta { font-size:12px; color:var(--text-subtle); }
  .ssc-progress { text-align:center; min-width:80px; }
  .ssc-pct { font-size:18px; font-weight:700; color:var(--brand); }
  .ssc-bar { height:6px; background:var(--track); border-radius:3px; overflow:hidden; margin-top:4px; }
  .ssc-bar-fill { height:100%; border-radius:3px; background:var(--brand); transition:width 0.5s; }
  .ssc-count { font-size:11px; color:var(--text-subtle); margin-top:2px; }
  /* Main header */
  .main-header { background:var(--surface); border-bottom:1px solid var(--border); padding:10px 24px; display:flex; align-items:center; justify-content:space-between; box-shadow:var(--shadow-nav); }
  .main-title { font-size:17px; font-weight:700; color:var(--text); display:flex; align-items:center; gap:8px; }
  .main-title .store-tag { font-size:11px; padding:3px 10px; border-radius:var(--radius-sm); background:var(--brand-bg); color:var(--brand); font-weight:500; }
  .header-brand { display:flex; align-items:center; gap:10px; font-size:17px; font-weight:800; color:var(--brand); letter-spacing:0.5px; }
  .header-brand-icon { width:32px; height:32px; border-radius:var(--radius-sm); background:var(--brand); color:#fff; display:flex; align-items:center; justify-content:center; font-size:16px; box-shadow:0 2px 6px rgba(37,99,235,0.25); }
  .tabs { display:flex; align-items:center; gap:4px; padding:4px; background:#f5f5f7; border-radius:var(--radius-sm); }
  .tab { padding:7px 18px; border-radius:var(--radius-sm); cursor:pointer; font-size:13px; color:var(--text-muted); transition:all 0.2s; border-bottom:none; display:inline-flex; align-items:center; gap:5px; font-weight:500; }
  .tab:hover { color:var(--brand); background:rgba(37,99,235,0.06); }
  .tab.active { color:#fff; background:var(--brand); font-weight:600; box-shadow:0 2px 6px rgba(37,99,235,0.25); }
  /* Content area */
  .content { flex:1; overflow-y:auto; padding:20px 24px; }
  .content::-webkit-scrollbar { width:6px; }
  .content::-webkit-scrollbar-thumb { background:#ccc; border-radius:3px; }
  /* 全局 select 去浏览器默认样式：一条规则盖住全站 19 个 select（6 个写在 HTML
     里 + 13 个 JS 拼接生成的），不逐个类名改。原来箭头是内联 SVG data URI，灰色
     颜色值写死在字符串里——data: URI 里不能引用 CSS 自定义属性，改 token 时必然
     漏改，这是本项目已踩过的坑。<select> 是替换元素，放不进 .uisel-arrow 那种
     边框三角用的子元素/伪元素，改用两层三角形渐变拼出向下箭头——直接写
     var(--text-subtle)，以后改这个 token 不需要再手动同步任何地方。 */
  select { appearance:none; -webkit-appearance:none; -moz-appearance:none; cursor:pointer;
    background-color:var(--surface); color:var(--text); border:1px solid var(--border); border-radius:var(--radius-sm);
    padding:7px 30px 7px 12px; font-size:13px;
    background-image:
      linear-gradient(45deg, transparent 50%, var(--text-subtle) 50%),
      linear-gradient(135deg, var(--text-subtle) 50%, transparent 50%);
    background-position: right 15px center, right 10px center;
    background-size: 5px 5px, 5px 5px;
    background-repeat:no-repeat; }
  select:focus { border-color:var(--brand); box-shadow:0 0 0 3px var(--brand-soft); outline:none; }
  select:disabled { opacity:.5; cursor:not-allowed; }
  /* appearance:none 只能改"收起态"；展开后的选项面板是操作系统/浏览器绘制的，
     CSS 改不了。曾经的 ponytail 记录（appearance:none 那一轮）把这个天花板
     标成"本轮不做"，触发条件是"产品明确要求自定义选项面板样式"——已经触发，
     升级为下面的 .uisel-* 自定义 listbox 组件（js/ui/select.js + select-keys.js，
     两个页面都加载）。这条全局 select 规则本身继续保留：它是自定义组件失败时
     的兜底外观（增强抛错时原生 select 原样可用，见 select.js 头部注释），也是
     JS 尚未跑到时的首帧样式。

     ===== 自定义下拉展开态面板（.uisel-*）=====
     触发器/面板/键盘交互的 JS 逻辑在 js/ui/select.js（构建、MutationObserver
     增强、value 拦截同步）与 js/ui/select-keys.js（开合定位、键盘、移动端抽屉）；
     下面这段 CSS 里的字面量必须与那两个文件里同名的 JS 常量保持一致（改一处
     记得看另一处）：z-index 5200 = select.js 的 UISEL_Z（比 dialog.js
     的 UIDLG_Z_TOAST=5100 高一档，面板要盖过对话框与其上的 toast）；断点 700px
     = select.js 的 UISEL_MOBILE_BQ（比 css/mobile.css 的 768px 窄屏断点更早切换
     成抽屉式面板，见实施计划「五」）。触发器收起态视觉与上面的全局 select 规则
     同源（同一套 border/radius/font-size/焦点环 token），箭头改用边框三角实现
     （原生 select 那边做不到子元素，只能留两层渐变三角），展开态从系统面板换成
     这一套自定义面板。 */
  .uisel-wrap { position:relative; display:inline-block; vertical-align:middle; }
  .uisel-trigger { all:unset; box-sizing:border-box; display:flex; align-items:center; justify-content:space-between;
    gap:8px; width:100%; min-height:38px; cursor:pointer; background:var(--surface); color:var(--text); border:1px solid var(--border);
    border-radius:var(--radius-sm); padding:8px 32px 8px 12px; font-size:13px; font-family:inherit; position:relative; }
  .uisel-trigger:hover { border-color:#cbd5e1; }
  .uisel-trigger:focus { border-color:var(--brand); box-shadow:0 0 0 3px var(--brand-soft); }
  .uisel-trigger[aria-expanded="true"] { border-color:var(--brand); box-shadow:0 0 0 3px var(--brand-soft); }
  .uisel-trigger[disabled] { opacity:.5; cursor:not-allowed; }
  .uisel-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* 边框三角箭头：一个 6x6 的方块只留右边框+下边框，旋转 45deg 变成向下的 ∨，
     展开时转 225deg 变向上的 ∧。颜色直接是 border-color，不再是写死的 SVG 描边色。 */
  .uisel-arrow { position:absolute; right:13px; top:50%; width:6px; height:6px; margin-top:-5px; pointer-events:none;
    border-right:1.6px solid var(--text-subtle); border-bottom:1.6px solid var(--text-subtle);
    transition:transform .16s cubic-bezier(.2,.8,.3,1); transform:rotate(45deg); }
  .uisel-trigger[aria-expanded="true"] .uisel-arrow { transform:rotate(225deg); }
  .uisel-native { position:absolute; opacity:0; pointer-events:none; width:1px; height:1px; overflow:hidden; }
  @media (prefers-reduced-motion:reduce) { .uisel-arrow { transition:none!important; } }

  .uisel-panel { position:fixed; z-index:5200; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-sm);
    box-shadow:var(--shadow-card); overflow-y:auto; padding:5px; transition:opacity .16s cubic-bezier(.2,.8,.3,1); }
  .uisel-opt { padding:8px 11px; border-radius:6px; font-size:13px; color:var(--text); cursor:pointer;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .uisel-opt:hover, .uisel-opt.uisel-opt-hi { background:var(--brand-bg); color:var(--brand-hover); }
  .uisel-opt[aria-selected="true"] { font-weight:600; color:var(--brand-hover); background:var(--brand-bg); }
  @media (prefers-reduced-motion:reduce) { .uisel-panel { transition:none!important; } }

  /* 移动端抽屉：牺牲系统原生滚轮选择器换取样式统一，见实施计划「五」的 ponytail
     取舍（完整注释见 js/ui/select.js 头部，避免同一条决策在两处各写一半）。
     ponytail: 升级触发条件——若移动端反馈选择效率下降，改为触屏走原生 select、
     桌面走自定义面板。 */
  @media (max-width:700px) {
    .uisel-panel.uisel-drawer { position:fixed; left:0; right:0; bottom:0; top:auto!important; width:100%!important;
      max-height:70vh; border-radius:var(--radius-lg) var(--radius-lg) 0 0; padding:8px 8px calc(8px + env(safe-area-inset-bottom));
      box-shadow:0 -8px 30px rgba(15,23,42,.2); }
    .uisel-panel.uisel-drawer .uisel-opt { padding:12px 14px; min-height:44px; display:flex; align-items:center; }
  }
