/* 研究院应用平台门户：沉稳蓝色企业风格；浅色为默认，深色跟随系统或手动切换 */
:root {
  color-scheme: light;
  --font: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Noto Sans CJK SC", "Source Han Sans SC", "Hiragino Sans GB", "Segoe UI", sans-serif;
  --bg: #f2f5fa;
  --surface: #ffffff;
  --surface-2: #f7f9fc;
  --fg: #1a2538;
  --muted: #5d6c85;
  --faint: #8794a9;
  --line: #e2e8f1;
  --line-strong: #cdd7e6;
  --primary: #1f4e9c;
  --primary-hover: #173f80;
  --primary-soft: #e9f0fa;
  --primary-solid: #1f4e9c;
  --on-primary: #ffffff;
  --focus: #2f6fd1;
  --success: #17794a;
  --success-soft: #e5f4ec;
  --warning: #96580a;
  --warning-soft: #fff2db;
  --danger: #bc3727;
  --danger-soft: #fdebe9;
  --info: #1f5fae;
  --info-soft: #e5eefa;
  --neutral: #5d6c85;
  --neutral-soft: #edf0f5;
  --c1: #2b67c2; --c2: #14a3a0; --c3: #e0a02e; --c4: #7a5cc4; --c5: #e0775b; --c6: #6c7b94;
  --shadow: 0 1px 2px rgba(20, 35, 60, .04), 0 4px 16px rgba(20, 35, 60, .05);
  --shadow-lg: -12px 0 40px rgba(20, 35, 60, .16);
  --radius: 12px;
  --topbar-h: 58px;
  --nav-w: 200px;
  --drawer-w: 440px;
}

/* 业务审批：沿用门户颜色及字体，表单与列表优先，不增加统计图或假 KPI。 */
.approval-page {max-width:1400px;margin:0 auto}
.approval-header,.approval-detail-head {display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:20px}
.approval-header .btn,.approval-page .btn {min-height:44px}
.approval-policy {display:flex;align-items:flex-start;gap:12px;padding:16px 18px;margin:16px 0;border:1px solid var(--line);border-radius:10px;background:var(--primary-soft);color:var(--fg);line-height:1.65}
.approval-policy .icon {flex-shrink:0;margin-top:3px}
.approval-muted {color:var(--muted);font-size:13px;line-height:1.7;margin:6px 0}
.approval-tabs {display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:22px 0 16px}
.approval-tabs .active {background:var(--primary-soft);border-color:var(--primary);color:var(--primary)}
.approval-tabs .approval-muted {margin-left:auto}
.approval-workspace {display:grid;grid-template-columns:310px minmax(0,1fr);gap:20px;align-items:start}
.approval-sidebar,.approval-detail {min-width:0;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);box-shadow:var(--shadow)}
.approval-sidebar {padding:16px}
.approval-list-head {display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.approval-list-head h2 {font-size:15px;margin:0}
.approval-list {display:grid;gap:8px;max-height:72vh;overflow:auto}
.approval-item {display:flex;flex-direction:column;gap:7px;width:100%;min-height:84px;text-align:left;border:1px solid var(--line);border-radius:8px;padding:12px;background:var(--surface);color:var(--fg);font:inherit;cursor:pointer;overflow-wrap:anywhere}
.approval-item:hover {background:var(--surface-2);border-color:var(--line-strong)}
.approval-item.selected {background:var(--primary-soft);border-color:var(--primary)}
.approval-item-top {display:flex;gap:8px;justify-content:space-between;align-items:flex-start;width:100%}
.approval-item-top strong {font-size:14px;min-width:0}
.approval-item-meta {display:block;color:var(--muted);font-size:12px;line-height:1.6}
.approval-detail {padding:24px;min-height:460px;overflow-wrap:anywhere}
.approval-detail h2 {font-size:20px;margin:0 0 8px;line-height:1.4}
.approval-detail h3 {font-size:15px;margin:16px 0 8px}
.approval-detail>.btn {margin:8px 10px 8px 0}
.approval-empty {display:flex;flex-direction:column;align-items:flex-start;gap:12px;padding:28px 8px}
.approval-empty .icon {color:var(--primary)}
.approval-form,.approval-decision-form {display:grid;gap:10px}
.approval-form label,.approval-decision-form label {font-size:14px;font-weight:600;line-height:1.6}
.approval-form input[type=text],.approval-page select,.approval-page textarea {width:100%;min-width:0;font:inherit;font-size:14px;line-height:1.7;padding:10px 12px;border:1px solid var(--line-strong);border-radius:8px;background:var(--surface);color:var(--fg)}
.approval-page textarea {resize:vertical;min-height:100px}
.approval-page input[type=file] {display:block;max-width:100%;font:inherit;font-size:13px;min-height:44px;padding-top:10px}
.approval-material-field {display:grid;gap:7px;padding:18px 0;border-top:1px solid var(--line);margin-top:16px}
.approval-checkbox {display:flex;gap:10px;align-items:center;min-height:44px;cursor:pointer}
.approval-checkbox input {width:19px;height:19px;flex-shrink:0}
.approval-actions {display:flex;gap:10px;flex-wrap:wrap;margin:14px 0 0}
.approval-error {margin:16px 0;border:1px solid var(--danger);background:var(--danger-soft);color:var(--danger);padding:14px 18px;border-radius:8px;line-height:1.7}
.approval-check {border:1px solid var(--line);border-left:3px solid var(--line-strong);border-radius:6px;padding:14px 16px;margin:12px 0;line-height:1.7}
.approval-check p {margin:7px 0}
.approval-check blockquote {margin:12px 0 0;padding:10px 12px;background:var(--surface-2);border-left:2px solid var(--primary);font-size:13px;white-space:pre-wrap}
.approval-result {font-weight:600;line-height:1.7}
.approval-text {white-space:pre-wrap;overflow-wrap:anywhere;font:13px/1.8 var(--font);background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:12px;max-height:380px;overflow:auto}
.approval-fold {border-top:1px solid var(--line);padding:14px 0;margin-top:14px}
.approval-fold summary {cursor:pointer;min-height:32px;font-size:14px;font-weight:600;line-height:1.7}
.approval-decision-form {margin:22px 0;padding:18px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px}
.approval-event {padding:14px 0;border-bottom:1px solid var(--line);font-size:13px}
.approval-confirm {width:min(620px,calc(100vw - 32px));max-height:85vh;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--fg);padding:0;box-shadow:var(--shadow-lg)}
.approval-confirm::backdrop {background:rgba(10,20,40,.48)}
.approval-confirm-body {padding:24px}
.approval-confirm-body h2 {font-size:20px;margin:0 0 12px}
.approval-page :is(button,input,select,textarea,summary):focus-visible {outline:3px solid var(--focus);outline-offset:3px}
@media (max-width:1000px) {.approval-workspace{grid-template-columns:260px minmax(0,1fr)}.approval-tabs .approval-muted{width:100%;margin-left:0}}
@media (max-width:740px) {.approval-workspace{grid-template-columns:1fr}.approval-list{max-height:300px}.approval-detail{padding:18px}.approval-header{flex-wrap:wrap}.approval-header .btn{width:100%}.approval-item-top{flex-wrap:wrap}.approval-actions>.btn{flex:1}.approval-policy{padding:14px}}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --bg: #0d1422;
    --surface: #151e30;
    --surface-2: #1a2438;
    --fg: #e5ebf6;
    --muted: #9eabc2;
    --faint: #75839c;
    --line: #26324a;
    --line-strong: #364562;
    --primary: #77a9f2;
    --primary-hover: #a0c3f7;
    --primary-soft: #1b2c4a;
    --primary-solid: #3a70c8;
    --on-primary: #ffffff;
    --focus: #7fb0f5;
    --success: #6fd4a0;
    --success-soft: #153427;
    --warning: #f0c36e;
    --warning-soft: #3a2f17;
    --danger: #ff9b8f;
    --danger-soft: #402220;
    --info: #86b6f5;
    --info-soft: #172b49;
    --neutral: #9eabc2;
    --neutral-soft: #212c42;
    --c1: #5b9bf0; --c2: #3fc7c0; --c3: #f0be5a; --c4: #a58af0; --c5: #f09a80; --c6: #94a3b8;
    --shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 6px 18px rgba(0, 0, 0, .22);
    --shadow-lg: -12px 0 40px rgba(0, 0, 0, .45);
  }
}

:root[data-theme="dark"] {
  color-scheme: dark;
  --bg: #0d1422;
  --surface: #151e30;
  --surface-2: #1a2438;
  --fg: #e5ebf6;
  --muted: #9eabc2;
  --faint: #75839c;
  --line: #26324a;
  --line-strong: #364562;
  --primary: #77a9f2;
  --primary-hover: #a0c3f7;
  --primary-soft: #1b2c4a;
  --primary-solid: #3a70c8;
  --on-primary: #ffffff;
  --focus: #7fb0f5;
  --success: #6fd4a0;
  --success-soft: #153427;
  --warning: #f0c36e;
  --warning-soft: #3a2f17;
  --danger: #ff9b8f;
  --danger-soft: #402220;
  --info: #86b6f5;
  --info-soft: #172b49;
  --neutral: #9eabc2;
  --neutral-soft: #212c42;
  --c1: #5b9bf0; --c2: #3fc7c0; --c3: #f0be5a; --c4: #a58af0; --c5: #f09a80; --c6: #94a3b8;
  --shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 6px 18px rgba(0, 0, 0, .22);
  --shadow-lg: -12px 0 40px rgba(0, 0, 0, .45);
}

* { box-sizing: border-box; }
[hidden] { display: none !important; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  font: 14px/1.6 var(--font);
  color: var(--fg);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3, p { margin: 0; }
button { font: inherit; color: inherit; }
.num { font-variant-numeric: tabular-nums; }
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.icon { flex: none; }

:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 6px; }
.skip-link { position: absolute; left: 12px; top: -48px; z-index: 100; background: var(--primary-solid); color: var(--on-primary); padding: 8px 14px; border-radius: 8px; text-decoration: none; transition: top .15s; }
.skip-link:focus { top: 10px; }

/* ---------- 顶栏 ---------- */
.topbar {
  position: sticky; top: 0; z-index: 30;
  height: var(--topbar-h);
  display: flex; align-items: center; gap: 14px;
  padding: 0 20px;
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.brand { display: flex; align-items: center; gap: 10px; text-decoration: none; color: var(--fg); border-radius: 8px; }
.brand-name { font-size: 16px; font-weight: 650; letter-spacing: .02em; }
.topbar-date { color: var(--faint); font-size: 13px; padding-left: 14px; border-left: 1px solid var(--line); }
.spacer { flex: 1; }
.user { display: flex; align-items: center; gap: 8px; min-width: 0; }
.user-name { font-weight: 560; max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.role-badge { padding: 2px 10px; border-radius: 999px; background: var(--primary-soft); color: var(--primary); font-size: 12px; font-weight: 600; white-space: nowrap; }

.icon-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; padding: 0;
  border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--muted); cursor: pointer;
  transition: background-color .15s, color .15s, border-color .15s;
}
.icon-btn:hover:not(:disabled) { background: var(--neutral-soft); color: var(--fg); }
.icon-btn:disabled { cursor: default; opacity: .6; }
.icon-btn.lg { width: 36px; height: 36px; border-color: var(--line); }

.assistant-btn {
  display: inline-flex; align-items: center; gap: 7px;
  height: 36px; padding: 0 14px; border: 0; border-radius: 8px;
  background: var(--primary-solid); color: var(--on-primary); font-weight: 600; cursor: pointer;
  transition: filter .15s;
}
.assistant-btn:hover { filter: brightness(1.1); }

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-height: 34px; padding: 0 14px;
  border: 1px solid var(--line-strong); border-radius: 8px; background: var(--surface); color: var(--fg); font-weight: 560; cursor: pointer;
  transition: background-color .15s, border-color .15s;
}
.btn:hover { background: var(--surface-2); border-color: var(--primary); }
.approval-page .btn-primary {background:var(--primary-solid);color:var(--on-primary);border-color:var(--primary-solid)}
.approval-page .btn-primary:hover {background:color-mix(in srgb,var(--primary-solid) 86%,black);color:var(--on-primary)}
.btn.sm { min-height: 30px; padding: 0 11px; font-size: 13px; }
.btn-primary { background: var(--primary-solid); color: var(--on-primary); border-color: var(--primary-solid); }
.btn-primary:hover { background: color-mix(in srgb, var(--primary-solid) 86%, black); color: var(--on-primary); }
.btn-secondary { background: var(--surface-2); color: var(--fg); }
.btn-danger { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 55%, var(--line)); }
.btn-danger:hover { background: var(--danger-soft); border-color: var(--danger); }

/* ---------- 外壳 ---------- */
.shell { display: flex; align-items: flex-start; min-height: calc(100vh - var(--topbar-h)); }
.sidenav {
  position: sticky; top: var(--topbar-h);
  width: var(--nav-w); flex: none;
  height: calc(100vh - var(--topbar-h));
  padding: 16px 12px;
  display: flex; flex-direction: column; gap: 4px;
  background: var(--surface); border-right: 1px solid var(--line);
}
.nav-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; border-radius: 8px;
  color: var(--muted); text-decoration: none; font-weight: 560;
  transition: background-color .15s, color .15s;
}
.nav-item:hover { background: var(--neutral-soft); color: var(--fg); }
.nav-item[aria-current="page"] { background: var(--primary-soft); color: var(--primary); }
.main { flex: 1; min-width: 0; padding: 24px 28px 96px; max-width: 1560px; outline: none; }

/* ---------- 页面 ---------- */
.hero { margin-bottom: 20px; }
.hero-title { font-size: 24px; font-weight: 650; letter-spacing: .01em; }
.hero-date { margin-top: 2px; color: var(--muted); }
.hero-hint { margin-top: 10px; display: inline-flex; align-items: center; gap: 7px; padding: 5px 12px; border-radius: 999px; background: var(--primary-soft); color: var(--primary); font-size: 13px; }
.page-head { margin-bottom: 20px; }
.page-title { font-size: 22px; font-weight: 650; }
.page-sub { margin-top: 2px; color: var(--muted); }

.grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 16px; }
.span-12 { grid-column: span 12; }
.span-8 { grid-column: span 8; }
.span-6 { grid-column: span 6; }
.span-4 { grid-column: span 4; }

/* ---------- 卡片 ---------- */
.card {
  display: flex; flex-direction: column; min-width: 0;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 14px 16px 6px; }
.card-titles { min-width: 0; }
.card-title { font-size: 15px; font-weight: 650; line-height: 1.4; }
.card-sub { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 1px; font-size: 12px; color: var(--faint); }
.card-tools { display: flex; align-items: center; gap: 4px; flex: none; }
.card-time { font-size: 12px; color: var(--faint); margin-right: 4px; white-space: nowrap; }
.ask-btn {
  display: inline-flex; align-items: center; gap: 4px;
  height: 28px; padding: 0 10px; border: 1px solid var(--line-strong); border-radius: 999px;
  background: transparent; color: var(--primary); font-size: 12.5px; font-weight: 560; cursor: pointer;
  transition: background-color .15s, border-color .15s;
}
.ask-btn:hover { background: var(--primary-soft); border-color: var(--primary); }
.card.loading .icon-btn .icon { animation: spin .8s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.card-body { flex: 1; min-width: 0; padding: 8px 16px 16px; }
.view-table .card-body, .view-list .card-body { padding-left: 0; padding-right: 0; padding-bottom: 8px; }
.view-table .card-body { padding-left: 8px; padding-right: 8px; }
.view-ui .card-body { padding: 4px 8px 8px; }

.badge-sample {
  display: inline-flex; align-items: center; padding: 0 7px; height: 18px; border-radius: 5px;
  background: var(--warning-soft); color: var(--warning); font-size: 11px; font-weight: 600; letter-spacing: .02em;
}

/* 标签 */
.tag {
  display: inline-flex; align-items: center; padding: 1px 9px; border-radius: 999px;
  font-size: 12px; font-weight: 600; line-height: 1.6; white-space: nowrap;
}
.tone-success { background: var(--success-soft); color: var(--success); }
.tone-warning { background: var(--warning-soft); color: var(--warning); }
.tone-danger { background: var(--danger-soft); color: var(--danger); }
.tone-info { background: var(--info-soft); color: var(--info); }
.tone-neutral { background: var(--neutral-soft); color: var(--neutral); }
.delta.tone-success, .delta.tone-danger, .delta.tone-neutral, .delta.tone-primary { background: transparent; }

/* 骨架屏 */
.skeleton { display: flex; flex-direction: column; gap: 12px; padding-top: 4px; }
.sk-line, .sk-block { border-radius: 6px; background: linear-gradient(90deg, var(--neutral-soft) 25%, var(--line) 50%, var(--neutral-soft) 75%); background-size: 200% 100%; animation: shimmer 1.4s linear infinite; }
.sk-line { height: 14px; }
.sk-block { height: 110px; }
.w40 { width: 40%; } .w55 { width: 55%; } .w70 { width: 70%; }
@keyframes shimmer { to { background-position: -200% 0; } }

/* 空与错误 */
.empty { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 36px 16px; color: var(--faint); text-align: center; }
.empty.big { padding: 64px 16px; border: 1px dashed var(--line-strong); border-radius: var(--radius); background: var(--surface); }
.error-state { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; min-height: 180px; padding: 28px 16px; text-align: center; color: var(--danger); }
.error-text { color: var(--fg); max-width: 36em; }
.page-error { margin: 80px auto; }

/* KPI */
.kpi-grid { --kpi-cols: 4; display: grid; grid-template-columns: repeat(auto-fit, minmax(clamp(165px, calc(100% / var(--kpi-cols) - 12px), 420px), 1fr)); gap: 12px; }
.kpi { padding: 12px 14px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface-2); display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.kpi-label { font-size: 12.5px; color: var(--muted); }
.kpi-value { font-size: 28px; font-weight: 650; line-height: 1.25; letter-spacing: -.01em; white-space: nowrap; }
.kpi-unit { margin-left: 4px; font-size: 13px; font-weight: 500; color: var(--muted); letter-spacing: 0; }
.kpi-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 26px; }
.delta { font-size: 12.5px; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.delta.tone-success { color: var(--success); }
.delta.tone-danger { color: var(--danger); }
.delta.tone-neutral { color: var(--faint); font-weight: 500; }
.spark { flex: none; overflow: visible; }
.spark-line { stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.spark-area { stroke: none; opacity: .12; }
.spark.tone-primary { color: var(--c1); }
.spark.tone-success { color: var(--success); }
.spark.tone-danger { color: var(--danger); }
.spark .spark-line { stroke: currentColor; }
.spark .spark-area, .spark .spark-dot { fill: currentColor; }
.spark.tone-success, .spark.tone-danger, .spark.tone-primary { background: none; }

/* 图表 */
.chart { width: 100%; }

/* 表格 */
.table-wrap { width: 100%; overflow-x: auto; }
table.data { width: 100%; border-collapse: collapse; font-size: 13.5px; }
table.data th { padding: 8px 10px; text-align: left; font-size: 12px; font-weight: 600; color: var(--muted); background: var(--surface-2); white-space: nowrap; border-bottom: 1px solid var(--line); }
table.data th:first-child { border-top-left-radius: 8px; border-bottom-left-radius: 8px; }
table.data th:last-child { border-top-right-radius: 8px; border-bottom-right-radius: 8px; }
table.data td { padding: 9px 10px; border-bottom: 1px solid var(--line); vertical-align: middle; }
table.data tbody tr:last-child td { border-bottom: 0; }
table.data tbody tr:hover td { background: var(--surface-2); }
table.data .r { text-align: right; }
table.data .nowrap { white-space: nowrap; }
.progress { display: flex; align-items: center; gap: 8px; min-width: 120px; }
.progress-track { flex: 1; height: 6px; border-radius: 3px; background: var(--neutral-soft); overflow: hidden; }
.progress-fill { height: 100%; border-radius: 3px; background: var(--c1); }
.progress-text { width: 36px; text-align: right; font-size: 12.5px; color: var(--muted); }

/* 列表 */
.list { list-style: none; margin: 0; padding: 0; }
.li { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 10px 16px; border-bottom: 1px solid var(--line); }
.li:last-child { border-bottom: 0; }
.li:hover { background: var(--surface-2); }
.li-main { min-width: 0; }
.li-title { font-weight: 560; line-height: 1.45; }
.li-meta { margin-top: 1px; font-size: 12.5px; color: var(--faint); }
.li-side { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; flex: none; }
.li-time { font-size: 12px; color: var(--faint); white-space: nowrap; }

/* ui 卡片 */
.ui-frame { display: block; width: 100%; border: 0; background: transparent; color-scheme: normal; }

/* ---------- 应用中心 ---------- */
.tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; }
.tile {
  display: flex; flex-direction: column; gap: 6px; text-align: left;
  padding: 16px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow);
  cursor: pointer; transition: border-color .15s, transform .15s, box-shadow .15s;
}
.tile:hover { border-color: var(--primary); transform: translateY(-2px); }
.tile-top { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.tile-avatar { width: 38px; height: 38px; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; font-size: 17px; font-weight: 650; color: #fff; }
.tile-avatar.c1 { background: var(--c1); } .tile-avatar.c2 { background: var(--c2); } .tile-avatar.c3 { background: var(--c3); }
.tile-avatar.c4 { background: var(--c4); } .tile-avatar.c5 { background: var(--c5); } .tile-avatar.c6 { background: var(--c6); }
.tile-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); }
.tile-status .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--faint); }
.tile-status.on .dot { background: var(--success); box-shadow: 0 0 0 3px var(--success-soft); }
.tile-title { font-size: 15.5px; font-weight: 650; }
.tile-desc { color: var(--muted); font-size: 13px; min-height: 40px; }
.tile-tags { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.tile-count { margin-left: auto; font-size: 12px; color: var(--faint); }

/* ---------- 悬浮按钮与抽屉 ---------- */
.fab {
  position: fixed; right: 24px; bottom: 24px; z-index: 40;
  display: inline-flex; align-items: center; gap: 8px; height: 46px; padding: 0 20px 0 16px;
  border: 0; border-radius: 999px; background: var(--primary-solid); color: var(--on-primary); font-weight: 600; font-size: 14.5px; cursor: pointer;
  box-shadow: 0 8px 24px rgba(31, 78, 156, .35);
  transition: transform .15s, filter .15s, opacity .15s;
}
.fab:hover { transform: translateY(-1px); filter: brightness(1.1); }
body.drawer-open .fab, body.sp-open .fab { opacity: 0; pointer-events: none; }

.drawer {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 50;
  width: min(var(--drawer-w), 100vw);
  display: flex; flex-direction: column;
  background: var(--surface); border-left: 1px solid var(--line); box-shadow: var(--shadow-lg);
  transform: translateX(104%); visibility: hidden;
  transition: transform .22s ease, visibility 0s linear .22s;
}
.drawer.open { transform: none; visibility: visible; transition: transform .22s ease; }
.drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: var(--topbar-h); padding: 0 12px 0 16px; border-bottom: 1px solid var(--line); flex: none; }
.drawer-title { font-weight: 650; font-size: 15px; }
.drawer-actions { display: flex; align-items: center; gap: 6px; }
.drawer-body { position: relative; flex: 1; min-height: 0; background: var(--surface); }
.drawer-loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: var(--faint); }
.chat-frame { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; background: var(--surface); }

@media (min-width: 1280px) {
  body.drawer-open .shell, body.drawer-open .topbar { margin-right: var(--drawer-w); }
}

/* ---------- 登录遮罩 ---------- */
.login-overlay { position: fixed; inset: 0; z-index: 90; display: flex; align-items: center; justify-content: center; padding: 24px; background: color-mix(in srgb, var(--bg) 86%, transparent); backdrop-filter: blur(8px); }
.login-box { width: min(480px, 100%); height: min(720px, 100%); display: flex; flex-direction: column; overflow: hidden; background: var(--surface); border: 1px solid var(--line); border-radius: 16px; box-shadow: 0 20px 60px rgba(20, 35, 60, .25); }
.login-head { display: flex; align-items: center; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--line); }
.login-title { font-weight: 650; font-size: 15px; }
.login-sub { font-size: 12.5px; color: var(--muted); }
.login-frame { flex: 1; width: 100%; border: 0; background: var(--surface); }
body.login-open { overflow: hidden; }

/* 提示条 */
.toast-area { position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%); z-index: 100; display: flex; flex-direction: column; gap: 8px; align-items: center; pointer-events: none; width: max-content; max-width: calc(100vw - 32px); }
.toast { padding: 10px 18px; border-radius: 10px; background: var(--fg); color: var(--bg); font-size: 13.5px; box-shadow: 0 8px 24px rgba(0, 0, 0, .25); animation: toast-in .2s ease; }
.toast.leaving { opacity: 0; transition: opacity .25s; }
@keyframes toast-in { from { opacity: 0; transform: translateY(8px); } }


/* ---------- 上架记录 ---------- */
.filter-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.filters { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 12px;
  border: 1px solid var(--line-strong); border-radius: 999px; background: var(--surface); color: var(--muted); font-size: 13px; font-weight: 560; cursor: pointer;
  transition: background-color .15s, border-color .15s, color .15s;
}
.chip:hover { border-color: var(--primary); color: var(--fg); }
.chip.on { background: var(--primary-soft); border-color: var(--primary); color: var(--primary); }
.chip-n { min-width: 20px; padding: 0 6px; border-radius: 999px; background: var(--neutral-soft); color: var(--muted); font-size: 12px; text-align: center; line-height: 18px; }
.chip.on .chip-n { background: var(--primary-solid); color: var(--on-primary); }
.icon-btn.spinning .icon { animation: spin .8s linear infinite; }
.sp-list-card { padding: 6px 8px 8px; }
table.data.clickable td { padding-top: 10px; padding-bottom: 10px; }
tr.row-click { cursor: pointer; }
tr.row-click:focus-visible { outline-offset: -2px; }
table.data tbody tr.row-click.selected td { background: var(--primary-soft); }
.sub-title { font-weight: 600; line-height: 1.4; }
.sub-id { display: block; font-size: 12px; font-weight: 400; color: var(--faint); line-height: 1.4; }
dd .sub-id, .inline-gap .sub-id { display: inline; margin-left: 8px; }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; font-size: 12.5px; }
.wrap-any { overflow-wrap: anywhere; }
.muted { color: var(--muted); }
.muted-dash { color: var(--faint); }
.inline-gap { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 10px; }

.side-panel {
  position: fixed; top: var(--topbar-h); right: 0; bottom: 0; z-index: 35;
  width: min(580px, 100vw);
  display: flex; flex-direction: column;
  background: var(--surface); border-left: 1px solid var(--line); box-shadow: var(--shadow-lg);
  transform: translateX(104%); visibility: hidden;
  transition: transform .22s ease, visibility 0s linear .22s;
}
.side-panel.open { transform: none; visibility: visible; transition: transform .22s ease; }
.sp-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 52px; padding: 0 12px 0 18px; border-bottom: 1px solid var(--line); flex: none; }
.sp-title { font-weight: 650; font-size: 15.5px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sp-body { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 18px 28px; }
.sp-sec { padding: 16px 0; border-bottom: 1px solid var(--line); }
.sp-sec:last-child { border-bottom: 0; }
.sp-sec-title { display: flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 650; margin-bottom: 10px; }
.sp-sub { margin: 12px 0 6px; font-size: 12.5px; font-weight: 600; color: var(--muted); }
.sp-meta { margin-top: 10px; font-size: 12.5px; color: var(--faint); }
.sp-list { margin: 0; padding-left: 1.2em; }
.sp-list li { margin: 3px 0; overflow-wrap: anywhere; }
.kv { display: grid; grid-template-columns: 5.5em minmax(0, 1fr); gap: 8px 12px; margin: 0; }
.kv dt { color: var(--muted); font-size: 13px; }
.kv dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.callout { margin-top: 10px; padding: 10px 12px; border-radius: 10px; border: 1px solid transparent; }
.callout.danger { background: var(--danger-soft); border-color: var(--danger); color: var(--fg); }
.callout.warning { background: var(--warning-soft); border-color: var(--warning); color: var(--fg); font-weight: 560; }
.submission-decision-reason { display: block; width: 100%; min-height: 84px; margin: 12px 0 8px; resize: vertical; }
.submission-decision-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.submission-decision-actions .btn { min-height: 42px; }
.submission-decision-error { margin: 6px 0 0; }
.form-error { color: var(--danger); }
.form-success { color: var(--success); }
section.callout { margin-top: 16px; padding: 14px 16px; border-bottom: 1px solid var(--danger); }
section.callout.danger .sp-sec-title { color: var(--danger); }
section.callout.danger .sp-list { color: var(--fg); }
table.data.compact { font-size: 13px; }
table.data.compact th, table.data.compact td { padding: 6px 8px; }
.notes { white-space: pre-wrap; overflow-wrap: anywhere; }
.fold summary { cursor: pointer; color: var(--primary); font-weight: 560; padding: 2px 0; }
pre.code {
  margin: 10px 0 0; padding: 12px 14px; max-height: 420px; overflow: auto;
  background: var(--surface-2); border: 1px solid var(--line); border-radius: 10px;
  font: 12.5px/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace; white-space: pre; tab-size: 2;
}
.timeline { list-style: none; margin: 0; padding: 0 0 0 4px; }
.tl-item { position: relative; display: flex; gap: 12px; padding: 0 0 16px 0; }
.tl-item:last-child { padding-bottom: 0; }
.tl-item::before { content: ""; position: absolute; left: 4px; top: 14px; bottom: -2px; width: 2px; background: var(--line); }
.tl-item:last-child::before { display: none; }
.tl-dot { flex: none; width: 10px; height: 10px; margin-top: 7px; border-radius: 50%; background: var(--line-strong); box-shadow: 0 0 0 3px var(--surface); position: relative; z-index: 1; }
.tl-item.here .tl-dot { background: var(--primary-solid); }
.tl-main { min-width: 0; }
.tl-top { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.tl-time { margin-left: auto; font-size: 12px; color: var(--faint); }
.tl-here { font-size: 11.5px; color: var(--primary); font-weight: 600; }
.tl-sub { margin-top: 2px; font-size: 12.5px; color: var(--muted); overflow-wrap: anywhere; }

@media (max-width: 899px) {
  .side-panel { top: 0; z-index: 60; width: 100vw; border-left: 0; }
  .sp-body { padding: 4px 14px 28px; }
  .filters { gap: 6px; }
}

/* ---------- 规则中心 ---------- */
.policy-page {max-width:1480px}
.policy-page-head {display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:20px}
.policy-page-head .btn {min-height:44px}
.policy-eyebrow {font-size:12px;font-weight:700;letter-spacing:.08em;color:var(--primary);text-transform:uppercase}
.policy-page h2 {font-size:17px;line-height:1.4}
.policy-page h3 {font-size:14px}
.policy-page .card {box-shadow:var(--shadow)}
.policy-current {position:relative;display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:24px;overflow:hidden;padding:24px;margin-bottom:16px}
.policy-current-accent {position:absolute;inset:0 auto 0 0;width:5px;background:var(--primary-solid)}
.policy-current-main {min-width:0;padding-left:5px}
.policy-current-heading {display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.policy-current-heading h2 {font-size:28px;margin-top:2px}
.policy-current-copy {max-width:76ch;margin:12px 0 18px;color:var(--muted);line-height:1.75}
.policy-meta-grid {display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.policy-meta-grid.compact {grid-template-columns:repeat(4,minmax(0,1fr))}
.policy-kv {min-width:0;display:flex;flex-direction:column;gap:3px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--surface-2)}
.policy-kv-label {color:var(--muted);font-size:12px}
.policy-kv-value {min-width:0;overflow-wrap:anywhere}
.policy-hash {grid-column:span 2}
.policy-copy {max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--primary);background:none;border:0;padding:0;cursor:pointer;text-align:left}
.policy-current-side {display:grid;grid-template-columns:1fr;gap:10px;align-content:start}
.policy-summary-card {min-width:0;padding:14px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}
.policy-summary-card.wide {grid-column:span 2}
.policy-summary-label {margin-bottom:7px;color:var(--muted);font-size:12px;font-weight:600}
.policy-big-number {font-size:27px;line-height:1.2}
.policy-workspace {display:grid;grid-template-columns:330px minmax(0,1fr);gap:16px;align-items:start;margin-bottom:16px}
.policy-versions,.policy-detail,.policy-candidates,.policy-events {min-width:0;padding:18px}
.policy-section-head {display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px}
.policy-section-head h2 {margin:0}
.policy-section-head p {margin-top:3px}
.policy-section-actions {display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.policy-version-list {display:grid;gap:7px}
.policy-version-item {position:relative;display:flex;align-items:flex-start;gap:10px;width:100%;min-height:82px;padding:11px 12px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--fg);text-align:left;cursor:pointer}
.policy-version-item:hover {border-color:var(--primary);background:var(--surface-2)}
.policy-version-item.selected {border-color:var(--primary);background:var(--primary-soft)}
.policy-version-item:focus-visible,.policy-candidate-row:focus-visible {outline:3px solid var(--focus);outline-offset:2px}
.policy-version-dot {flex:none;width:10px;height:10px;margin-top:6px;border-radius:50%;background:var(--line-strong);box-shadow:0 0 0 3px var(--surface)}
.policy-version-dot.active {background:var(--success)}
.policy-version-body {display:grid;gap:2px;min-width:0;flex:1}
.policy-version-top {display:flex;align-items:center;gap:7px;justify-content:space-between}
.policy-version-meta {font-size:12px;color:var(--muted)}
.policy-version-hash {font-size:11px;color:var(--faint);overflow:hidden;text-overflow:ellipsis}
.policy-detail {min-height:380px}
.policy-detail-head {display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:18px}
.policy-detail-head h2 {font-size:24px;margin:3px 0 5px}
.policy-detail-actions {display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.policy-detail-grid {display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.policy-detail-grid .policy-summary-card {min-height:118px}
.policy-list {margin:0;padding-left:1.15em;color:var(--fg);font-size:13px;line-height:1.7}
.policy-list li {margin:2px 0;overflow-wrap:anywhere}
.policy-rule-details {display:grid;gap:16px;margin-top:18px;padding:18px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}
.policy-rule-details-loading {min-height:80px;align-content:center}
.policy-rule-details-head {display:flex;align-items:flex-start;justify-content:space-between;gap:14px}
.policy-rule-details-head h3 {margin:3px 0 5px;font-size:18px}
.policy-rule-details-head p {max-width:82ch;line-height:1.65}
.policy-rule-grid {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.policy-rule-group {min-width:0;padding:14px;border:1px solid var(--line);border-radius:9px;background:var(--surface)}
.policy-rule-group.wide {grid-column:span 2}
.policy-rule-group h4 {margin:0 0 10px;font-size:14px}
.policy-rule-rows {display:grid;gap:8px}
.policy-rule-row {display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0;padding:9px 0;border-top:1px solid var(--line)}
.policy-rule-row:first-child {padding-top:0;border-top:0}
.policy-rule-row-main {min-width:0;display:grid;gap:3px}
.policy-rule-row-title {overflow-wrap:anywhere}
.policy-rule-row-body {color:var(--muted);font-size:13px;line-height:1.6;overflow-wrap:anywhere}
.policy-rule-row>.tag {flex:none}
.policy-rule-chips {display:flex;flex-wrap:wrap;gap:6px}
.policy-rule-resources,.policy-rule-json {margin-top:0}
.policy-rule-resource {margin-top:8px;padding:0 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface)}
.policy-rule-resource summary {min-height:38px;padding:8px 0}
.policy-rule-pre {max-height:420px;margin:0;padding:12px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;border-top:1px solid var(--line);color:var(--fg);font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
.policy-diff-slot {margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.policy-diff {display:grid;gap:10px}
.policy-subhead {display:flex;align-items:center;justify-content:space-between;gap:10px}
.policy-change-list {display:grid;gap:7px;margin:0;padding:0;list-style:none}
.policy-change-list li {display:flex;align-items:flex-start;gap:8px;min-width:0;font-size:13px}
.policy-change-list .tag {flex:none}
.policy-fold {margin-top:14px;padding-top:14px;border-top:1px solid var(--line)}
.policy-fold summary {min-height:36px;padding:5px 0;cursor:pointer;color:var(--primary);font-weight:600;line-height:1.7}
.policy-files {margin-top:20px}
.policy-files table.data td,.policy-files table.data th {padding:7px 8px}
.policy-candidates {margin-bottom:16px}
.policy-upload-button {min-height:40px}
.policy-upload-empty {display:flex;flex-direction:column;align-items:center;gap:6px;padding:22px 10px;border:1px dashed var(--line-strong);border-radius:9px;text-align:center}
.policy-upload-empty .icon {color:var(--primary)}
.policy-candidate-list {display:grid;gap:7px}
.policy-candidate-row {display:flex;align-items:center;gap:10px;width:100%;min-height:52px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--fg);text-align:left;cursor:pointer}
.policy-candidate-row:hover,.policy-candidate-row.selected {border-color:var(--primary);background:var(--primary-soft)}
.policy-candidate-icon {display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;background:var(--info-soft);color:var(--info);flex:none}
.policy-candidate-row-main {display:grid;gap:1px;min-width:0;flex:1}
.policy-candidate-row-main strong {overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.policy-candidate-detail {display:grid;gap:12px;margin-top:14px;padding:16px;border:1px solid var(--line);border-radius:10px;background:var(--surface-2)}
.policy-candidate-heading {display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.policy-candidate-heading p {margin-top:3px}
.policy-candidate-actions {display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.policy-editor {display:grid;gap:14px;margin:0 0 16px;padding:18px;border:1px solid var(--primary);border-radius:10px;background:var(--primary-soft)}
.policy-editor-heading {display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.policy-editor-heading h3 {margin:3px 0 5px;font-size:17px}
.policy-editor-heading p {max-width:80ch;line-height:1.65}
.policy-editor-json,.policy-editor-text {width:100%;resize:vertical;padding:11px 12px;border:1px solid var(--line-strong);border-radius:8px;background:var(--surface);color:var(--fg);font:12px/1.65 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
.policy-editor-json {min-height:300px}
.policy-editor-text {min-height:180px}
.policy-editor select {width:100%;min-height:42px;padding:8px 10px;border:1px solid var(--line-strong);border-radius:8px;background:var(--surface);color:var(--fg);font:inherit}
.policy-editor :is(textarea,select):focus-visible {outline:3px solid var(--focus);outline-offset:2px}
.policy-editor-resource {display:grid;gap:12px;padding-top:14px;border-top:1px solid var(--line)}
.policy-editor-actions {display:flex;justify-content:flex-end;gap:8px}
.policy-events {margin-bottom:20px}
.policy-event-list {display:grid;gap:0;margin:0;padding:0;list-style:none}
.policy-event {display:flex;gap:12px;padding:13px 0;border-bottom:1px solid var(--line)}
.policy-event:last-child {border-bottom:0}
.policy-event-mark {display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;flex:none}
.policy-event-mark.success {background:var(--success-soft);color:var(--success)}
.policy-event-mark.warning {background:var(--warning-soft);color:var(--warning)}
.policy-event-mark.neutral {background:var(--neutral-soft);color:var(--muted)}
.policy-event-main {min-width:0;flex:1}
.policy-event-top {display:flex;align-items:center;justify-content:space-between;gap:10px}
.policy-event-time {font-size:12px;color:var(--faint);white-space:nowrap}
.policy-event-main p {margin-top:3px;overflow-wrap:anywhere}
.policy-loading {min-height:420px;padding-top:20px}
.policy-inline-error {margin:8px 0;color:var(--danger);font-size:13px}
.policy-field {display:grid;gap:6px;font-size:14px;font-weight:600}
.policy-field textarea {width:100%;min-height:100px;resize:vertical;padding:10px 12px;border:1px solid var(--line-strong);border-radius:8px;background:var(--surface);color:var(--fg);font:inherit;line-height:1.7}
.policy-field textarea:focus-visible {outline:3px solid var(--focus);outline-offset:2px}
.policy-help {font-size:12px;color:var(--muted);font-weight:400}
.policy-confirm {width:min(620px,calc(100vw - 32px));max-height:88vh;padding:0;border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);box-shadow:var(--shadow-lg)}
.policy-confirm::backdrop {background:rgba(10,20,40,.5)}
.policy-confirm-body {padding:22px}
.policy-confirm-head {display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.policy-confirm-head h2 {font-size:20px;margin-top:3px}
.policy-confirm-lede {margin:14px 0;color:var(--muted);line-height:1.7}
.policy-confirm-facts {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:14px}
.policy-confirm-actions {display:flex;justify-content:flex-end;gap:8px;margin-top:16px}
.policy-confirm .btn {min-height:42px}
.policy-confirm .is-loading {opacity:.65;cursor:wait}

@media (max-width:1100px) {
  .policy-current {grid-template-columns:minmax(0,1fr)}
  .policy-current-side {grid-template-columns:repeat(3,minmax(0,1fr))}
  .policy-workspace {grid-template-columns:280px minmax(0,1fr)}
}

@media (max-width:899px) {
  .policy-page-head,.policy-detail-head {flex-wrap:wrap}
  .policy-page-head>.btn,.policy-detail-head>.btn,.policy-detail-actions {width:100%}
  .policy-detail-actions>* {flex:1}
  .policy-meta-grid,.policy-meta-grid.compact {grid-template-columns:repeat(2,minmax(0,1fr))}
  .policy-hash {grid-column:span 2}
  .policy-workspace {grid-template-columns:1fr}
  .policy-version-list {max-height:300px;overflow:auto}
  .policy-detail-grid {grid-template-columns:repeat(2,minmax(0,1fr))}
  .policy-summary-card.wide {grid-column:span 2}
  .policy-rule-grid {grid-template-columns:1fr}
  .policy-rule-group.wide {grid-column:auto}
}

@media (max-width:560px) {
  .policy-current,.policy-versions,.policy-detail,.policy-candidates,.policy-events {padding:14px}
  .policy-current-heading h2 {font-size:23px}
  .policy-current-side {grid-template-columns:1fr}
  .policy-meta-grid,.policy-meta-grid.compact,.policy-detail-grid,.policy-confirm-facts {grid-template-columns:1fr}
  .policy-hash,.policy-summary-card.wide {grid-column:auto}
  .policy-rule-details {padding:14px}
  .policy-rule-details-head {flex-direction:column}
  .policy-rule-group.wide {grid-column:auto}
  .policy-section-head {align-items:stretch;flex-direction:column}
  .policy-section-head>.btn,.policy-upload-button,.policy-section-actions {width:100%}
  .policy-section-actions>* {flex:1}
  .policy-event-top {align-items:flex-start;flex-direction:column;gap:4px}
  .policy-event-time {white-space:normal}
}

/* ---------- 响应式 ---------- */
@media (max-width: 1100px) {
  .span-4 { grid-column: span 6; }
  .main { padding: 20px 20px 96px; }
}

@media (max-width: 899px) {
  .topbar { padding: 0 14px; gap: 10px; }
  .topbar-date { display: none; }
  .user-name { display: none; }
  .shell { flex-direction: column; align-items: stretch; }
  .sidenav {
    position: sticky; top: var(--topbar-h); z-index: 20; width: auto; height: auto;
    flex-direction: row; gap: 4px; padding: 8px 12px; overflow-x: auto;
    border-right: 0; border-bottom: 1px solid var(--line);
  }
  .nav-item { padding: 7px 14px; white-space: nowrap; }
  .main { padding: 16px 14px 96px; }
  .grid { grid-template-columns: minmax(0, 1fr); }
  .span-12, .span-8, .span-6, .span-4 { grid-column: auto; }
  .hero-title { font-size: 21px; }
  .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  .kpi { padding: 10px 12px; }
  .kpi-value { font-size: 23px; white-space: normal; }
  .spark { width: 56px; }
  .card-head { flex-wrap: wrap; }
  .card-time { display: none; }
  .drawer { width: 100vw; border-left: 0; }
  .fab { right: 16px; bottom: 16px; }
  .assistant-btn span { display: none; }
  .assistant-btn { padding: 0 10px; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
}
