
  :root{
    --brand:#4263eb; --brand-2:#5c7cfa; --brand-soft:#e7ecfe; --brand-softer:#f3f6ff;
    --ink:#1f2937; --muted:#6b7280; --muted-2:#9aa1ac;
    --bg:#f5f6f8; --panel:#ffffff; --line:#e8eaed; --line-2:#f0f1f4;
    --ok:#2f9e44; --warn:#e8590c; --bad:#e03131;
    --radius:14px; --radius-sm:10px;
    --sh-1:0 1px 2px rgba(16,24,40,.05), 0 1px 3px rgba(16,24,40,.04);
    --sh-2:0 6px 18px rgba(16,24,40,.07);
    --sh-3:0 12px 32px rgba(16,24,40,.10);
    --t:.18s cubic-bezier(.4,0,.2,1);
  }
  *{box-sizing:border-box}
  body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
       background:var(--bg);color:var(--ink);font-size:14px}
  .text-muted2{color:var(--muted)}
  #login{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#eef2ff 0%,#f4f5f7 55%);padding:20px}
  .login-wrap{width:860px;max-width:100%;display:flex;background:#fff;border:1px solid var(--line);border-radius:18px;overflow:hidden;box-shadow:var(--sh-3)}
  .login-aside{width:46%;background:linear-gradient(160deg,#3b5bdb 0%,#4263eb 62%,#5c7cfa 100%);color:#fff;padding:38px 34px;display:flex;flex-direction:column}
  .login-aside .la-brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:18px}
  .login-aside .la-brand .brand-logo{background:rgba(255,255,255,.18)}
  .login-aside .la-title{margin-top:32px;font-size:22px;font-weight:700;line-height:1.45}
  .login-aside .la-feats{list-style:none;padding:0;margin:26px 0 0;display:flex;flex-direction:column;gap:15px}
  .login-aside .la-feats li{display:flex;gap:10px;font-size:13.5px;opacity:.95;line-height:1.5}
  .login-aside .la-feats i{color:#ffd43b;flex:0 0 auto;margin-top:2px}
  .login-aside .la-foot{margin-top:auto;font-size:12px;opacity:.7;padding-top:24px}
  .login-main{flex:1;display:flex;align-items:center;justify-content:center;padding:44px}
  .login-main .login-card{width:100%;max-width:340px;border:0;box-shadow:none;padding:0}
  .login-foot{margin-top:18px;font-size:12px;text-align:center}
  @media (max-width:720px){ .login-wrap{flex-direction:column} .login-aside{width:100%} .login-aside .la-feats{display:none} .login-main{padding:32px 24px} }
  .brand-logo{width:40px;height:40px;border-radius:10px;background:var(--brand);display:flex;align-items:center;justify-content:center;color:#fff;font-size:20px}
  #app{display:none}
  .sidebar{position:fixed;top:0;left:0;bottom:0;width:218px;background:var(--panel);border-right:1px solid var(--line);
    display:flex;flex-direction:column;padding:18px 14px;z-index:20;box-shadow:1px 0 0 var(--line),2px 0 18px rgba(16,24,40,.04)}
  .side-brand{display:flex;align-items:center;gap:10px;padding:4px 10px 16px;font-weight:700;font-size:15px}
  .side-brand .brand-logo{width:34px;height:34px;border-radius:9px;font-size:17px}
  .nav-group{font-size:11px;color:var(--muted-2);padding:15px 12px 5px;letter-spacing:.06em;font-weight:600;
    border-top:1px solid var(--line-2);margin-top:6px}
  .nav-group:first-of-type{border-top:0;margin-top:0}
  .nav-link{position:relative;cursor:pointer;color:var(--ink);border-radius:10px;padding:9px 12px;display:flex;
    align-items:center;gap:11px;margin-bottom:3px;font-weight:500;font-size:13.5px;transition:background var(--t),color var(--t)}
  .nav-link i{font-size:17px;width:20px;text-align:center;color:var(--muted)}
  .nav-link:hover{background:var(--bg)}
  .nav-link.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
  .nav-link.active i{color:var(--brand)}
  .nav-link.active::before{content:'';position:absolute;left:-14px;top:50%;transform:translateY(-50%);
    width:3px;height:18px;border-radius:3px;background:var(--brand)}
  .main{margin-left:218px;padding:0;min-height:100vh;background:var(--bg)}
  .topbar{height:60px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;align-items:center;
    justify-content:space-between;padding:0 28px;position:sticky;top:0;z-index:10;box-shadow:0 1px 2px rgba(16,24,40,.03)}
  .content{padding:26px 30px}
  .card-x{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:22px;margin-bottom:20px;
    box-shadow:var(--sh-1);transition:box-shadow var(--t)}
  .chart-wrap{position:relative;flex:1 1 auto;min-height:220px}
  .chart-wrap canvas{position:absolute;inset:0;width:100%!important;height:100%!important}
  /* 环形/饼图专用：强制容器正方形，否则 canvas 拉伸会把圆渲染成椭圆 */
  .chart-wrap.ring{aspect-ratio:1/1;max-width:100%;max-height:100%;align-self:center}
  .stat{position:relative;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:18px 18px 18px 20px;
    box-shadow:var(--sh-1);transition:transform var(--t),box-shadow var(--t);overflow:hidden;height:100%;min-height:96px;display:flex;flex-direction:column;justify-content:flex-start}
  .stat:hover{transform:translateY(-3px);box-shadow:var(--sh-2)}
  .stat .ico{position:absolute;top:16px;right:16px;width:34px;height:34px;border-radius:10px;display:flex;
    align-items:center;justify-content:center;font-size:17px;background:var(--brand-soft);color:var(--brand)}
  .stat .label{color:var(--muted);font-size:12px;margin-bottom:9px;font-weight:500}
  .stat .value{font-size:23px;font-weight:700;letter-spacing:-.02em;line-height:1.2}
  .stat .sub{font-size:12px;margin-top:7px;color:var(--muted)}
  .up{color:var(--ok)} .down{color:var(--bad)}
  .badge-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:6px}
  .app-loading{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;flex-direction:column;gap:12px;background:rgba(255,255,255,.72)}
  [data-theme="dark"] .app-loading{background:rgba(15,18,30,.72)}
  .app-loading .sp{width:28px;height:28px;border:3px solid var(--line);border-top-color:var(--brand);border-radius:50%;animation:spin .7s linear infinite}
  .app-loading .tx{font-size:13px;color:var(--muted)}
  @keyframes spin{to{transform:rotate(360deg)}}
  table.t{width:100%;border-collapse:collapse;font-size:13px}
  table.t th{text-align:left;color:var(--muted);font-weight:600;font-size:12px;padding:11px 14px;
    border-bottom:1px solid var(--line);background:#f7f8fa;white-space:nowrap}
  table.t td{padding:11px 14px;border-bottom:1px solid var(--line-2);vertical-align:middle}
  table.t tbody tr{transition:background var(--t)}
  table.t tbody tr:hover{background:#f8faff}
  table.t tr.row-click{cursor:pointer} table.t tr.row-click:hover td{background:#f3f6ff}
  .det{bg:#fafbff;background:#fafbff;font-size:12px;color:var(--muted)}
  .pill{display:inline-block;padding:2px 9px;border-radius:20px;font-size:12px;font-weight:600}
  .pill.ok{background:#e6f7ec;color:var(--ok)} .pill.bad{background:#fdeaea;color:var(--bad)}
  .pill.gray{background:#eef0f2;color:var(--muted)} .pill.warn{background:#fff0e6;color:var(--warn)}
  .mask{font-family:monospace;letter-spacing:.04em}
  .section-title{font-size:16px;font-weight:700;margin:0 0 16px;display:flex;align-items:center;gap:9px;color:var(--ink);letter-spacing:.01em}
  .section-title::before{content:'';width:4px;height:16px;border-radius:3px;background:var(--brand);flex:0 0 auto}
  .mini{font-size:12px;color:var(--muted);margin-bottom:16px}
  .kv{display:flex;justify-content:space-between;padding:9px 0;border-bottom:1px dashed var(--line);gap:12px}
  .kv:last-child{border-bottom:0}
  .kv .k{color:var(--muted);white-space:nowrap}
  .kv .v{text-align:right}
  .view{display:none} .view.active{display:block}
  .top-avatar{width:34px;height:34px;border-radius:50%;background:var(--brand-soft);color:var(--brand);display:flex;align-items:center;justify-content:center;font-weight:700}
  .top-actions{display:flex;align-items:center;gap:8px;margin-left:auto}
  .icon-btn{width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;gap:6px;
    border:1px solid var(--line);border-radius:10px;background:transparent;color:var(--muted);
    font-size:16px;cursor:pointer;padding:0;transition:all var(--t)}
  .icon-btn:hover{background:var(--brand-soft);border-color:var(--brand);color:var(--brand);transform:translateY(-1px)}
  .icon-btn .ib-txt{font-size:12.5px;font-weight:600;line-height:1}
  .icon-btn-quiet{width:30px;height:30px;font-size:15px;border:0;background:var(--bg);color:var(--muted);border-radius:8px}
  .icon-btn-quiet:hover{background:var(--bad);color:#fff;transform:none}
  .top-divider{width:1px;height:22px;background:var(--line);margin:0 2px}
  .top-user{display:flex;align-items:center;gap:8px;padding:4px 8px 4px 5px;border:1px solid var(--line);
    border-radius:999px;background:var(--panel);transition:all var(--t)}
  .top-user:hover{border-color:var(--brand);box-shadow:var(--sh-1)}
  .top-user-name{font-size:13px;font-weight:600;color:var(--ink);max-width:84px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .top-user{cursor:pointer}
  .us-caret{font-size:11px;color:var(--muted-2);transition:transform var(--t);margin-left:1px}
  .top-user[aria-expanded="true"] .us-caret{transform:rotate(180deg)}
  .dropdown-menu.user-drop{min-width:212px;padding:8px;margin-top:9px;background:var(--panel);border:1px solid var(--line);border-radius:12px;box-shadow:var(--sh-2)}
  .user-drop .ud-head{display:flex;align-items:center;gap:10px;padding:6px 8px 10px}
  .top-avatar.sm{width:38px;height:38px;font-size:15px}
  .ud-name{font-size:13.5px;font-weight:700;color:var(--ink)}
  .ud-sub{font-size:11.5px;color:var(--muted)}
  .user-drop .dropdown-item{display:flex;align-items:center;gap:10px;border-radius:8px;padding:9px 10px;font-size:13px;color:var(--ink);cursor:pointer}
  .user-drop .dropdown-item i{font-size:15px;color:var(--muted)}
  .user-drop .dropdown-item:hover{background:var(--brand-soft);color:var(--brand)}
  .user-drop .dropdown-item:hover i{color:var(--brand)}
  .user-drop .dropdown-divider{margin:6px 4px}
  .legend{font-size:12px;color:var(--muted);margin-top:8px}
  .hint{font-size:12px;color:var(--muted);background:var(--brand-soft);border-radius:8px;padding:10px 12px;margin-top:12px}
  .seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
  .seg button{border:0;background:#fff;padding:5px 12px;font-size:12px;cursor:pointer;color:var(--muted)}
  .seg button.active{background:var(--brand);color:#fff}
  .toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:14px}
  /* 与全局 .form-select/font-size:13.5px 对齐,避免 38px 容器内文字被微切 */
  .toolbar select,.toolbar input{font-size:13.5px}
  .summary{display:flex;gap:18px;flex-wrap:wrap;padding:12px 14px;background:#fafbff;border:1px solid var(--line);border-radius:8px;margin-bottom:14px}
  .summary div{font-size:13px} .summary b{font-size:15px}
  .pager{display:flex;gap:10px;justify-content:flex-start;margin-top:20px;align-items:center;padding:14px 22px}
  .pager button{border:1px solid var(--line);background:#fff;border-radius:6px;padding:4px 10px;font-size:12px;cursor:pointer}
  .pager button.active{background:var(--brand);color:#fff;border-color:var(--brand)}
  .pager button:disabled{opacity:.4;cursor:not-allowed}
  .quick{display:flex;gap:10px;flex-wrap:wrap}
  .quick .q{border:1px solid var(--line);border-radius:12px;padding:14px 18px;cursor:pointer;background:var(--panel);
    display:flex;align-items:center;gap:13px;min-width:158px;transition:transform var(--t),box-shadow var(--t),border-color var(--t)}
  .quick .q:hover{background:var(--panel);transform:translateY(-2px);box-shadow:var(--sh-2);border-color:#d6dae0}
  .quick .q i{font-size:17px;color:var(--brand);width:38px;height:38px;border-radius:10px;background:var(--brand-soft);
    display:flex;align-items:center;justify-content:center;flex-shrink:0}
  .key-card{border:1px solid var(--line);border-radius:12px;padding:15px 17px;margin-bottom:12px;background:var(--panel);
    box-shadow:var(--sh-1);transition:box-shadow var(--t),transform var(--t)}
  .key-card:hover{box-shadow:var(--sh-2)}
  .key-card .head{display:flex;justify-content:space-between;align-items:center}
  .asset{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--panel);height:100%;
    box-shadow:var(--sh-1);transition:box-shadow var(--t),transform var(--t)}
  .asset:hover{box-shadow:var(--sh-2);transform:translateY(-2px)}
  .asset .thumb{height:120px;background:linear-gradient(135deg,#eef2ff,#e7ecfe);display:flex;align-items:center;
                justify-content:center;font-size:30px;color:var(--brand);position:relative;overflow:hidden}
  .asset .thumb.exp{background:linear-gradient(135deg,#f1f3f5,#e9ecef);color:#adb5bd}
  .asset .thumb .thumb-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1}
  .asset .thumb.exp .thumb-media{filter:grayscale(1);opacity:.78}
  .asset .tag{position:absolute;top:8px;left:8px;z-index:3;background:rgba(31,41,55,.72);color:#fff;font-size:11px;
              padding:2px 8px;border-radius:20px}
  .asset .body{padding:11px 13px}
  .asset .nm{font-weight:600;font-size:13px;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .asset .ops{display:flex;gap:6px;margin-top:9px}
  .asset .ops .btn{padding:3px 9px;font-size:12px;border-radius:7px}
  /* 素材库 列表视图：横向行布局 */
  .mat-list{display:flex;flex-direction:column;gap:8px}
  .mat-list .asset-row{display:flex;align-items:center;gap:14px;padding:10px 14px;border:1px solid var(--line);border-radius:12px;background:var(--panel);transition:box-shadow var(--t),transform var(--t)}
  .mat-list .asset-row:hover{box-shadow:var(--sh-2)}
  .mat-list .ar-thumb{flex:0 0 46px;height:46px;border-radius:9px;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background:linear-gradient(135deg,#eef2ff,#e7ecfe);color:var(--brand);font-size:19px}
  .mat-list .ar-thumb.exp{background:linear-gradient(135deg,#f1f3f5,#e9ecef);color:#adb5bd}
  .mat-list .ar-thumb .thumb-media{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1;border-radius:9px}
  .mat-list .ar-main{flex:1 1 auto;min-width:0}
  .mat-list .ar-name{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mat-list .ar-sub{font-size:12px;color:var(--muted);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .mat-list .ar-type{flex:0 0 auto}
  .mat-list .ar-meta{flex:0 0 auto;min-width:74px;text-align:center}
  .mat-list .ar-ops{flex:0 0 auto;display:flex;gap:6px}
  .mat-list .ar-ops .btn{padding:3px 9px;font-size:12px;border-radius:7px}
  @media (max-width:575px){ .mat-list .ar-type,.mat-list .ar-meta{display:none} }
  .bar{height:5px;border-radius:4px;background:#eef0f2;overflow:hidden;margin-top:5px}
  .bar i{display:block;height:100%;background:var(--brand)}
  .wh-log{font-size:12px;display:flex;justify-content:space-between;padding:5px 0;border-bottom:1px dashed var(--line)}
  /* ---- 空态 ---- */
  .empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:46px 20px;color:var(--muted-2);text-align:center}
  .empty .ico{width:52px;height:52px;border-radius:14px;background:var(--line-2);color:var(--muted);display:flex;align-items:center;justify-content:center;font-size:24px;margin-bottom:12px}
  .empty .t{font-size:14px;font-weight:600;color:var(--muted);margin-bottom:4px}
  .empty .d{font-size:12.5px;max-width:340px;line-height:1.5}
  /* ---- 滚动条 ---- */
  ::-webkit-scrollbar{width:9px;height:9px}
  ::-webkit-scrollbar-thumb{background:#cfd3da;border-radius:8px;border:2px solid var(--bg)}
  ::-webkit-scrollbar-thumb:hover{background:#b6bcc6}
  ::-webkit-scrollbar-track{background:transparent}
  *{scrollbar-width:thin;scrollbar-color:#cfd3da var(--bg)}
  /* ---- 按钮/交互过渡 ---- */
  .btn{border-radius:8px;transition:background var(--t),border-color var(--t),color var(--t),box-shadow var(--t)}
  .form-control:focus,.form-select:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);outline:none}
  .pager button{transition:background var(--t),border-color var(--t),color var(--t)}
  .pill{transition:background var(--t)}
  .chip{transition:background var(--t),border-color var(--t),color var(--t)}
  /* ---- 页面标题 ---- */
  .page-head{margin-bottom:16px}
  /* ---- 告警/提示条 ---- */
  .banner{display:flex;align-items:center;gap:10px;border-radius:10px;padding:12px 14px;margin-bottom:14px;font-size:13px}
  .banner.warn{background:#fff4e6;border:1px solid #ffd8a8;color:#a15c00}
  .banner.bad{background:#ffe9e9;border:1px solid #ffc9c9;color:#b02020}
  .banner.ok{background:#e9f9ef;border:1px solid #b7ebc8;color:#1a7f37}
  /* ---- API 文档 / Playground ---- */
  .doc-wrap{display:grid;grid-template-columns:200px 1fr;gap:18px}
  .doc-nav{border:1px solid var(--line);border-radius:10px;background:#fff;padding:8px}
  .doc-nav .i{cursor:pointer;padding:7px 10px;border-radius:6px;font-size:13px}
  .doc-nav .i:hover{background:var(--bg)}
  .doc-nav .i.active{background:var(--brand-soft);color:var(--brand);font-weight:600}
  .pg-out{background:#f7f8fa;border:1px solid var(--line);border-radius:8px;padding:12px;font-size:12px;
          font-family:ui-monospace,Menlo,Consolas,monospace;white-space:pre-wrap;max-height:240px;overflow:auto;margin:0}
  /* ---- 时间轴 ---- */
  .tl{border-left:2px solid var(--line);margin-left:6px;padding-left:16px}
  .tl .it{position:relative;padding-bottom:15px}
  .tl .it:before{content:'';position:absolute;left:-22px;top:4px;width:9px;height:9px;border-radius:50%;background:var(--brand)}
  .tl .it.bad:before{background:var(--bad)} .tl .it.ok:before{background:var(--ok)}
  .tl .it.gray:before{background:var(--muted)}
  /* ---- 标签选择 ---- */
  .chip{border:1px solid var(--line);border-radius:20px;padding:3px 10px;font-size:12px;display:inline-block;margin:0 6px 6px 0;cursor:pointer}
  .chip.sel{background:var(--brand-soft);border-color:var(--brand);color:var(--brand)}
  /* ---- 错误分布条 ---- */
  .errbar{height:8px;border-radius:4px;background:var(--brand);display:block}
  /* ---- 深色模式 ---- */
  [data-theme="dark"]{--brand:#748ffc;--brand-soft:#232a44;--ink:#e6e8eb;--muted:#9aa0aa;
    --bg:#14161a;--line:#2a2e36;--ok:#51cf66;--warn:#ff922b;--bad:#ff6b6b}
  [data-theme="dark"] .sidebar,[data-theme="dark"] .topbar,[data-theme="dark"] .card-x,
  [data-theme="dark"] .stat,[data-theme="dark"] .login-card,[data-theme="dark"] .asset,
  [data-theme="dark"] .doc-nav,[data-theme="dark"] .key-card,[data-theme="dark"] .modal-content{background:#1a1d23}
  [data-theme="dark"] .modal-content{color:var(--ink)}
  [data-theme="dark"] table.t th{background:#1f232a}
  [data-theme="dark"] table.t td{border-color:var(--line)}
  [data-theme="dark"] .det{background:#1f232a}
  [data-theme="dark"] .hint{background:#232a44}
  [data-theme="dark"] .summary{background:#1f232a}
  [data-theme="dark"] .pg-out,[data-theme="dark"] pre{background:#1f232a !important}
  [data-theme="dark"] #login{background:linear-gradient(135deg,#15171c 0%,#101216 55%)}
  [data-theme="dark"] .login-wrap{background:#1b1e24;border-color:var(--line)}
  [data-theme="dark"] .login-aside{background:linear-gradient(160deg,#2b3a8f 0%,#324ab0 62%,#3b4ecf 100%)}
  [data-theme="dark"] .login-main .login-card{box-shadow:none}
  [data-theme="dark"] .form-control,[data-theme="dark"] .form-select{background:#1f232a;color:var(--ink);border-color:var(--line)}
  [data-theme="dark"] .nav-link:hover{background:#1f232a}
  [data-theme="dark"] .seg button{background:#1a1d23;color:var(--muted)}
  [data-theme="dark"] .pager button{background:#1a1d23;color:var(--ink)}
  [data-theme="dark"] .quick .q{background:#1a1d23}
  [data-theme="dark"] .asset .thumb{background:linear-gradient(135deg,#232a44,#1f232a)}
  [data-theme="dark"] .input-group-text{background:#1f232a;color:var(--ink);border-color:var(--line)}
  [data-theme="dark"] .stat:hover{box-shadow:0 8px 22px rgba(0,0,0,.35)}
  [data-theme="dark"] .stat .ico{background:#252a33}
  [data-theme="dark"] .quick .q i{background:#252a33;color:#a5b1ff}
  [data-theme="dark"] .empty .ico{background:#252a33;color:#a5b1ff}
  [data-theme="dark"] .hint{background:#1f232a;color:#a5b1ff}
  [data-theme="dark"] .icon-btn:hover{background:#252a33;border-color:#3b424e;color:var(--ink)}
  [data-theme="dark"] .card-x:hover{box-shadow:0 8px 22px rgba(0,0,0,.3)}
  [data-theme="dark"] .key-card:hover,[data-theme="dark"] .asset:hover{box-shadow:0 8px 22px rgba(0,0,0,.3)}
  [data-theme="dark"] ::-webkit-scrollbar-thumb{border-color:var(--bg)}
  [data-theme="dark"] .empty .ico,[data-theme="dark"] .asset .thumb{background:linear-gradient(135deg,#232a44,#1f232a)}
  [data-theme="dark"] .mat-list .ar-thumb{background:linear-gradient(135deg,#232a44,#1f232a);color:#9aa6ff}
  [data-theme="dark"] .mat-list .ar-thumb.exp{background:linear-gradient(135deg,#232a44,#1f232a);color:#5b6478}

  /* 通用提示弹框（替代原生 alert） */
  #appAlertModal .modal-content{border:0;border-radius:14px;box-shadow:0 12px 40px rgba(15,23,42,.18);overflow:hidden}
  #appAlertModal .app-alert-icon{font-size:40px;line-height:1}
  #appAlertModal .modal-dialog{width:auto;max-width:360px}
.view-note{padding:10px 14px;margin-bottom:14px;border-radius:10px;font-size:13px;line-height:1.5;}
.view-note.err{background:rgba(230,60,60,.1);color:#c92a2a;border:1px solid rgba(230,60,60,.32);}
.view-note.empty{background:rgba(120,120,120,.08);color:var(--muted);border:1px dashed rgba(120,120,120,.35);}

  /* ==================================================================
     视觉精修层 —— 覆盖 Bootstrap 5.3 默认外观，统一控件质感
     浅色 / 深色双主题；放在最后以保证优先级
     ================================================================== */

  /* ---- 1. 按钮 ---- */
  .btn{
    --bs-btn-padding-y:.44rem; --bs-btn-padding-x:1.05rem;
    --bs-btn-font-size:13.5px; --bs-btn-font-weight:600;
    --bs-btn-border-radius:9px; --bs-btn-focus-shadow-rgb:66,99,235;
    letter-spacing:.01em; white-space:nowrap;
    transition:background .18s cubic-bezier(.4,0,.2,1),border-color .18s cubic-bezier(.4,0,.2,1),
               color .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),
               transform .12s ease;
    -webkit-user-select:none; user-select:none;
  }
  .btn:focus{box-shadow:0 0 0 3px rgba(66,99,235,.18)}
  .btn:focus-visible{box-shadow:0 0 0 3px rgba(66,99,235,.30);outline:none}
  .btn:active:not(:disabled):not(.disabled){transform:translateY(1px)}
  .btn:disabled,.btn.disabled{opacity:.5;box-shadow:none}

  /* 主按钮：品牌渐变 + 柔和投影 + 悬浮上浮 */
  .btn-primary{
    background:linear-gradient(180deg,#5b7cf7 0%,#4263eb 100%);
    border-color:#3b5bdb;
    box-shadow:0 1px 2px rgba(66,99,235,.26),0 4px 12px rgba(66,99,235,.16);
  }
  .btn-primary:hover{
    background:linear-gradient(180deg,#6f8cfa 0%,#4c6ef5 100%);
    border-color:#3b5bdb;
    box-shadow:0 2px 5px rgba(66,99,235,.30),0 8px 20px rgba(66,99,235,.22);
    transform:translateY(-1px);
  }
  .btn-primary:active{
    background:linear-gradient(180deg,#4c6ef5 0%,#3b5bdb 100%);
    box-shadow:0 1px 2px rgba(66,99,235,.34); transform:translateY(0);
  }

  /* 次级 / 描边按钮：弱化为中性灰，避免和主按钮抢焦点 */
  .btn-secondary{background:#f1f3f6;border-color:#e3e6ec;color:var(--ink)}
  .btn-secondary:hover{background:#e8ebf0;border-color:#d7dbe3;color:var(--ink)}
  .btn-secondary:active{background:#dfe3ea;border-color:#ccd1da;color:var(--ink)}

  .btn-outline-secondary{color:var(--muted);border-color:var(--line);background:var(--panel)}
  .btn-outline-secondary:hover{color:var(--ink);background:#f3f5f9;border-color:#c9cfda}
  .btn-outline-secondary:active{color:var(--ink);background:#e9ecf2;border-color:#c1c8d4}
  .btn-outline-primary{color:var(--brand);border-color:#c3cdfa;background:var(--panel)}
  .btn-outline-primary:hover{color:#fff;background:var(--brand);border-color:var(--brand)}
  .btn-outline-danger{color:var(--bad);border-color:#f5c6c6;background:var(--panel)}
  .btn-outline-danger:hover{color:#fff;background:var(--bad);border-color:var(--bad)}

  .btn-sm{--bs-btn-padding-y:.3rem;--bs-btn-padding-x:.78rem;--bs-btn-font-size:12.5px;--bs-btn-border-radius:8px}
  .btn-lg{--bs-btn-padding-y:.6rem;--bs-btn-padding-x:1.4rem;--bs-btn-font-size:14.5px;--bs-btn-border-radius:10px}

  .btn-close{transition:transform var(--t),opacity var(--t),background var(--t)}
  .btn-close:hover{opacity:1;transform:rotate(90deg)}

  /* ---- 2. 弹框 ---- */
  .modal-content{
    border:0;border-radius:16px;overflow:hidden;
    box-shadow:0 24px 60px rgba(16,24,40,.18),0 2px 8px rgba(16,24,40,.06);
  }
  .modal-header{
    padding:16px 20px!important;
    border-bottom:1px solid var(--line-2);
    background:linear-gradient(180deg,#fdfdff,#f8f9fc);
    align-items:center;
    display:flex;
    justify-content:space-between;
    gap:12px;
  }
  .modal-header .modal-title{font-size:15px;font-weight:700;letter-spacing:.01em;color:var(--ink)}
  .modal-header .btn-close{margin:0;padding:.5rem;opacity:.45;border-radius:8px;flex-shrink:0}
  .modal-header .btn-close:hover{opacity:1}
  .modal-body{padding:20px}
  /* 申请开票:可开金额提示 / 超限标红 */
  .iv-hint{color:var(--muted-2);font-weight:500}
  .iv-hint b{color:var(--ink);font-weight:600}
  .iv-err{color:#dc2626;margin-top:4px}
  .iv-err b{font-weight:600}
  .form-control.is-invalid,.form-select.is-invalid{border-color:#dc2626 !important;box-shadow:0 0 0 2px rgba(220,38,38,.12) !important}
  /* 素材预览模态 */
  .preview-media{display:flex;align-items:center;justify-content:center;min-height:200px;max-height:60vh;background:#0f172a0d;border-radius:12px;overflow:hidden;padding:10px}
  [data-theme="dark"] .preview-media{background:rgba(255,255,255,.05)}
  .preview-media .pv-img,.preview-media .pv-video{max-width:100%;max-height:60vh;border-radius:8px;display:block}
  .preview-media .pv-video{background:#000}
  .preview-empty{flex-direction:column;color:var(--muted-2);text-align:center;padding:34px 20px}
  .preview-empty i{font-size:46px;color:var(--muted-2)}
  .preview-meta{display:grid;grid-template-columns:1fr 1fr;gap:2px 20px;margin-top:16px}
  .preview-meta .kv{padding:8px 0;font-size:13px}
  .modal-footer{
    padding:14px 20px!important;
    border-top:1px solid var(--line-2);
    background:#fbfbfd;
    gap:8px;
  }
  .modal-footer .btn{min-width:84px}
  .modal-backdrop{--bs-backdrop-bg:#0f1424;backdrop-filter:blur(3px)}
  .modal-backdrop.show{--bs-backdrop-opacity:.42}
  /* 进场：轻微上浮 + 缩放，替代 Bootstrap 生硬的位移 */
  .modal.fade .modal-dialog{transform:translateY(14px) scale(.975);transition:transform .24s cubic-bezier(.2,.8,.3,1)}
  .modal.show .modal-dialog{transform:none}

  /* ---- 3. 表单控件 ---- */
  .form-control,.form-select{
    border-radius:9px;border-color:var(--line);
    padding:.46rem .78rem;font-size:13.5px;
    transition:border-color var(--t),box-shadow var(--t),background var(--t);
  }
  .form-control:hover:not(:focus):not(:disabled),
  .form-select:hover:not(:focus):not(:disabled){border-color:#c9cfda}
  .form-control::placeholder{color:var(--muted-2);opacity:1}
  .form-label{font-size:12.5px;font-weight:600;color:var(--muted);margin-bottom:6px}
  .input-group-text{background:#f7f8fa;border-color:var(--line);color:var(--muted);font-size:13px}
  .form-check-input:checked{background-color:var(--brand);border-color:var(--brand)}
  .form-check-input:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(66,99,235,.16)}
  textarea.form-control{resize:vertical;min-height:76px}

  /* ---- 4. 下拉 / 浮层 ---- */
  .dropdown-menu{
    border:1px solid var(--line);border-radius:12px;padding:6px;
    box-shadow:0 10px 32px rgba(16,24,40,.12),0 2px 6px rgba(16,24,40,.05);
  }
  .dropdown-item{
    border-radius:8px;font-size:13px;padding:8px 10px;
    transition:background var(--t),color var(--t);
  }
  .dropdown-item:hover,.dropdown-item:focus{background:var(--brand-soft);color:var(--brand)}
  .dropdown-item.active,.dropdown-item:active{background:var(--brand);color:#fff}
  .dropdown-divider{margin:6px 4px;opacity:.7}

  /* ---- 5. 表格 ---- */
  table.t th{
    background:linear-gradient(180deg,#fbfcfe,#f5f7fa);
    font-weight:600;letter-spacing:.02em;padding:12px 14px;
  }
  table.t tbody tr:last-child td{border-bottom:0}
  table.t tbody tr:hover{background:var(--brand-softer)}
  table.t td{font-variant-numeric:tabular-nums}
  .stat .value{font-variant-numeric:tabular-nums}

  /* ---- 6. 自建控件：分段 / 分页 / 标签 / 徽标 ---- */
  .seg{border-radius:10px;background:#f4f5f7;padding:2px;border-color:var(--line)}
  .seg button{
    background:transparent;border-radius:8px;padding:5px 14px;
    font-weight:600;color:var(--muted);transition:all var(--t);
  }
  .seg button:hover{color:var(--ink)}
  .seg button.active{
    background:var(--brand);color:#fff;
    box-shadow:0 1px 3px rgba(66,99,235,.30);
  }
  .pager button{
    border-radius:8px;padding:5px 12px;font-weight:600;color:var(--muted);
    background:var(--panel);transition:all var(--t);
  }
  .pager button:hover:not(.active):not(:disabled){
    border-color:var(--brand);color:var(--brand);background:var(--brand-softer);
  }
  .pager button.active{
    background:var(--brand);border-color:var(--brand);color:#fff;
    box-shadow:0 2px 6px rgba(66,99,235,.26);
  }
  .chip{
    border-radius:999px;padding:4px 12px;background:var(--panel);
    transition:all var(--t);user-select:none;
  }
  .chip:hover{border-color:#c9cfda;background:#f7f8fa}
  .chip.sel{background:var(--brand);border-color:var(--brand);color:#fff}
  .pill{padding:3px 10px;border-radius:999px;font-size:11.5px;letter-spacing:.02em;line-height:1.65}

  /* ---- 7. 其它细节 ---- */
  .card-x:hover{box-shadow:var(--sh-2)}
  ::selection{background:rgba(66,99,235,.18);color:inherit}
  .toolbar select,.toolbar input{border-radius:9px}
  /* 7b. toolbar 控件等高 + 顶部对齐：
     1) select / input / btn 全部强制 height:38px + border-box，消除 Chrome <input> UA 高度差异
     2) 绝不对 <input> 用 display:flex（date/number 是 replaced element，会被破坏高度/渲染）
     3) 所有子项 align-self:flex-start，让日期框与 select/金额框/按钮顶部齐平（避免 82px 高时间区把 38px 控件顶到中间） */
  .toolbar .form-select,.toolbar .form-control{height:38px !important;box-sizing:border-box !important;line-height:1.5;padding-top:.375rem;padding-bottom:.375rem}
  .toolbar .btn{height:38px !important;min-height:38px !important;display:inline-flex;align-items:center;justify-content:center}
  .toolbar .btn-sm{--bs-btn-padding-y:.34rem;--bs-btn-padding-x:.8rem}
  .toolbar .mini{margin-bottom:0;line-height:1}
  .toolbar > *{align-self:flex-start}
  /* select 在 flex 容器默认 flex-shrink:1 + width:auto 会被挤压,文字和右侧下拉箭头一起被裁;
     强制 min-width:130px + flex-shrink:0,保证箭头和文字都有空间(覆盖全部 12 处 width:auto 的 select) */
  .toolbar > .form-select{flex-shrink:0;min-width:130px;padding-right:1.85rem}
  /* 时间范围：开始/结束时间常驻显示，chips 放到时间的下方（纵向排列，两行同宽对齐、chips 均匀分布，整块呈一个整齐的矩形） */
  .range-quick{display:inline-flex;flex-direction:column;gap:6px;align-items:flex-start}
  .range-quick .dt{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
  .range-quick .dt .form-control{width:150px;height:38px}
  .range-quick .dt .mini{line-height:1.2}
  .range-quick .chips{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:flex-start}
  .range-quick .chip{cursor:pointer;white-space:nowrap;font-size:11.5px;user-select:none;padding:2px 9px;border:1px solid var(--line);border-radius:999px;transition:background .12s,border-color .12s,color .12s}
  .range-quick .chip:hover{border-color:var(--brand);color:var(--brand)}
  .range-quick .chip.sel{background:var(--brand);border-color:var(--brand);color:#fff}
  .seg button{padding:6px 14px}
  table.t .btn{padding:.28rem .62rem;font-size:12px;border-radius:7px}

  /* ---- 8. 深色主题适配 ---- */
  [data-theme="dark"] .btn-primary{
    background:linear-gradient(180deg,#8f9fff 0%,#5c7cfa 100%);
    border-color:#5c7cfa;color:#10142a;
    box-shadow:0 1px 2px rgba(0,0,0,.3),0 4px 14px rgba(92,124,250,.24);
  }
  [data-theme="dark"] .btn-primary:hover{
    background:linear-gradient(180deg,#a2b0ff 0%,#6d89fb 100%);
    border-color:#6d89fb;color:#10142a;
    box-shadow:0 2px 5px rgba(0,0,0,.34),0 8px 22px rgba(92,124,250,.3);
  }
  [data-theme="dark"] .btn-primary:active{background:linear-gradient(180deg,#6d89fb 0%,#4c6ef5 100%);color:#10142a}
  [data-theme="dark"] .btn-secondary{background:#252a33;border-color:#323842;color:var(--ink)}
  [data-theme="dark"] .btn-secondary:hover{background:#2c323c;border-color:#3b424e;color:var(--ink)}
  [data-theme="dark"] .btn-outline-secondary{color:var(--muted);border-color:var(--line);background:transparent}
  [data-theme="dark"] .btn-outline-secondary:hover{background:#252a33;color:var(--ink);border-color:#3b424e}
  [data-theme="dark"] .btn-outline-primary{color:var(--brand);border-color:#3a4470;background:transparent}
  [data-theme="dark"] .btn-outline-primary:hover{color:#10142a;background:var(--brand);border-color:var(--brand)}
  [data-theme="dark"] .btn-outline-danger{color:var(--bad);border-color:#5a2b2b;background:transparent}
  [data-theme="dark"] .btn-outline-danger:hover{color:#fff;background:var(--bad);border-color:var(--bad)}
  [data-theme="dark"] .modal-content{box-shadow:0 24px 64px rgba(0,0,0,.55),0 2px 8px rgba(0,0,0,.4)}
  [data-theme="dark"] .modal-header,
  [data-theme="dark"] .modal-footer{background:#171a20;border-color:var(--line)}
  [data-theme="dark"] .dropdown-menu{background:#1a1d23;box-shadow:0 10px 32px rgba(0,0,0,.45)}
  [data-theme="dark"] .form-control::placeholder{color:#6b7280}
  [data-theme="dark"] table.t th{background:linear-gradient(180deg,#1f232a,#1b1f26)}
  /* 暗色模式表格 hover：品牌色微透，柔和高亮又不刺眼 */
  [data-theme="dark"] table.t tbody tr:hover{background:rgba(116,143,252,.10);box-shadow:inset 2px 0 0 rgba(116,143,252,.55)}
  /* 暗色模式表格 hover 时光标也提示整行可点 */
  [data-theme="dark"] table.t tr.row-click:hover td{background:rgba(116,143,252,.10)}
  /* 暗色模式头像胶囊：背景与顶栏同色系，hover/展开不再硬切品牌蓝边 */
  [data-theme="dark"] .top-user{background:#1f232a;border-color:#2a3140}
  [data-theme="dark"] .top-user:hover{background:#252a33;border-color:#3b424e;box-shadow:0 4px 14px rgba(0,0,0,.35)}
  [data-theme="dark"] .top-user[aria-expanded="true"]{background:#252a33;border-color:#3b424e;box-shadow:0 6px 18px rgba(0,0,0,.45)}
  /* 暗色模式头像圆：从蓝紫光斑改为暗灰底 + 柔和蓝字，融入顶栏整体克制感 */
  [data-theme="dark"] .top-avatar{background:#2a3140;color:#a5b1ff}
  /* 暗色模式左侧导航激活：去掉泛紫蓝底，改深灰底 + 蓝字 + 左蓝边 */
  [data-theme="dark"] .nav-link.active{background:rgba(116,143,252,.10);color:#a5b1ff}
  [data-theme="dark"] .nav-link.active i{color:#a5b1ff}
  /* 暗色模式 pill：去浅底（破洞感），改低饱和深色 */
  [data-theme="dark"] .pill.ok{background:rgba(81,207,102,.12);color:#5cd680;border:1px solid rgba(81,207,102,.25)}
  [data-theme="dark"] .pill.bad{background:rgba(255,107,107,.12);color:#ff8c8c;border:1px solid rgba(255,107,107,.25)}
  [data-theme="dark"] .pill.gray{background:rgba(154,160,170,.12);color:var(--muted);border:1px solid rgba(154,160,170,.25)}
  [data-theme="dark"] .pill.warn{background:rgba(255,146,43,.12);color:#ffa552;border:1px solid rgba(255,146,43,.25)}
  /* 暗色模式 chip：默认态柔和灰底，hover 更亮一档，激活用半透品牌色取代硬实心 */
  [data-theme="dark"] .chip{background:#1f232a;border-color:#2a2e36;color:var(--muted)}
  [data-theme="dark"] .chip:hover{background:#252a33;border-color:#3b424e;color:var(--ink)}
  [data-theme="dark"] .chip.sel{background:rgba(116,143,252,.18);border-color:#5a73e0;color:#c5d1ff}
  [data-theme="dark"] .range-quick .chip.sel{background:rgba(116,143,252,.18);border-color:#5a73e0;color:#c5d1ff}
  /* 暗色模式 seg 切换激活：用半透品牌色 + 蓝字，取代硬实心蓝白 */
  [data-theme="dark"] .seg{background:#1a1d23}
  [data-theme="dark"] .seg button{background:#1a1d23;color:var(--muted)}
  [data-theme="dark"] .seg button:hover{color:var(--ink)}
  [data-theme="dark"] .seg button.active{background:rgba(116,143,252,.18);color:#a5b1ff;box-shadow:inset 0 0 0 1px #5a73e0}
  [data-theme="dark"] .btn-close{filter:invert(1) grayscale(100%) brightness(220%)}
  [data-theme="dark"] .modal-header .btn-close{opacity:.6}
  [data-theme="dark"] .modal-header .btn-close:hover{opacity:1}
