:root {
  --bg: #eef3f6;
  --panel: #ffffff;
  --line: #d6dee6;
  --text: #1c2633;
  --muted: #647386;
  --blue: #1f6feb;
  --green: #26734d;
  --amber: #a15c10;
  --red: #b83232;
  --cyan: #0f766e;
  --shadow: 0 8px 22px rgba(31, 41, 55, 0.08);
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  min-height: 100vh;
  background: var(--bg);
  color: var(--text);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
  letter-spacing: 0;
}

button,
input,
select,
textarea,
a {
  font: inherit;
}

a {
  color: inherit;
  text-decoration: none;
}

button,
.topbar-actions a {
  min-height: 34px;
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 7px 11px;
  background: #fff;
  color: var(--text);
  cursor: pointer;
}

button:hover,
.topbar-actions a:hover {
  border-color: var(--blue);
  color: var(--blue);
}

.secondary {
  background: #f8fafc;
}

.app-shell {
  min-height: 100vh;
  display: grid;
  grid-template-columns: 246px minmax(0, 1fr);
}

.nav-pane {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 18px;
  background: #17202c;
  color: #e9f1fb;
  position: sticky;
  top: 0;
  height: 100vh;
}

.brand strong {
  display: block;
  font-size: 21px;
}

.brand span,
.nav-note span,
.nav-note strong {
  display: block;
  color: #aab8c8;
  font-size: 12px;
  line-height: 1.5;
}

.nav-note {
  margin-top: auto;
  padding: 12px;
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 8px;
}

.nav-pane nav {
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}
/* 可折叠分组 */
.nav-section { display: flex; flex-direction: column; }
.nav-sec-head {
  display: flex; align-items: center; justify-content: space-between;
  width: 100%; min-height: 24px; padding: 0 10px; margin: 2px 0 0;
  background: transparent; border: none; cursor: pointer;
  color: #7e8da2; font-size: 10.5px; font-weight: 600; letter-spacing: 1px; text-transform: uppercase;
}
.nav-sec-head:hover { color: #cfe0f2; }
.nav-sec-head .chev { transition: transform .15s; font-size: 9px; }
.nav-section.collapsed .nav-sec-head .chev { transform: rotate(-90deg); }
.nav-sec-body { display: grid; gap: 2px; padding: 2px 0 4px; }
.nav-section.collapsed .nav-sec-body { display: none; }

.nav-pane nav a {
  min-height: 31px;
  display: flex;
  align-items: center;
  border-radius: 6px;
  padding: 0 10px;
  font-size: 13.5px;
  color: #dce8f5;
}

.nav-pane nav a.active,
.nav-pane nav a:hover {
  background: #243447;
  color: #fff;
}

.main-pane {
  min-width: 0;
  padding: 14px;
}

.topbar {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: flex-start;
  margin-bottom: 14px;
  padding: 16px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--panel);
  box-shadow: var(--shadow);
}

.topbar h1 {
  margin: 0;
  font-size: 22px;
}

.topbar p,
.panel-heading p {
  margin: 4px 0 0;
  color: var(--muted);
  font-size: 13px;
}

.topbar-actions,
.button-row {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  justify-content: flex-end;
}

.panel {
  margin-bottom: 14px;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--panel);
  box-shadow: var(--shadow);
}

.panel h2 {
  margin: 0 0 10px;
  font-size: 15px;
}

.panel-heading {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  align-items: flex-start;
  margin-bottom: 12px;
}

.stats-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(120px, 1fr));
  gap: 12px;
  margin-bottom: 14px;
}

.workbench-status.good {
  border-color: rgba(38, 115, 77, 0.35);
}

.workbench-status.warn {
  border-color: rgba(161, 92, 16, 0.35);
}

.workbench-status.bad {
  border-color: rgba(184, 50, 50, 0.35);
}

.health-row {
  display: grid;
  grid-template-columns: 116px minmax(180px, 1fr) minmax(260px, 1.2fr);
  gap: 14px;
  align-items: center;
}

.health-score {
  min-height: 94px;
  display: grid;
  align-content: center;
  justify-items: center;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.health-score strong {
  font-size: 34px;
  line-height: 1;
}

.health-score span,
.health-copy p,
.action-card span,
.workbench-list span,
.mainline-list span,
.delivery-summary span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.health-score.good strong,
.workbench-list .good strong,
.mainline-list a.ready strong {
  color: var(--green);
}

.health-score.warn strong,
.workbench-list .warn strong {
  color: var(--amber);
}

.health-score.bad strong,
.workbench-list .bad strong {
  color: var(--red);
}

.health-meter {
  height: 14px;
  overflow: hidden;
  border: 1px solid #dbe4ee;
  border-radius: 999px;
  background: #eef3f6;
}

.health-meter span {
  display: block;
  height: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, var(--red), var(--amber), var(--green));
}

.health-copy strong {
  display: block;
  font-size: 15px;
}

.health-copy p {
  margin: 6px 0 0;
  line-height: 1.45;
}

.stat-card,
.pipeline div,
.task-grid div,
.summary-list div,
.rule-list div,
.field-summary-list div,
.result,
.validation-list div {
  padding: 12px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.stat-card span,
.pipeline span,
.task-grid span,
.summary-list span,
.rule-list span,
.field-summary-list span,
.schema-list span,
.object-row span,
.result span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.stat-card strong {
  display: block;
  margin-top: 4px;
  font-size: 24px;
}

.content-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.2fr) minmax(320px, 0.8fr);
  gap: 14px;
}

.pipeline {
  display: grid;
  grid-template-columns: repeat(5, minmax(120px, 1fr));
  gap: 10px;
}

.pipeline div {
  border-left: 4px solid var(--blue);
  min-height: 112px;
}

.pipeline strong,
.task-grid strong,
.rule-list strong,
.field-summary-list strong,
.schema-list strong,
.object-row strong,
.result strong {
  display: block;
  margin-top: 4px;
  font-size: 13px;
  line-height: 1.35;
}

.pipeline p,
.task-grid p,
.rule-list p,
.field-summary-list p,
.schema-list p,
.result p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.summary-list,
.task-grid,
.rule-list,
.field-summary-list,
.schema-list,
.object-table,
.validation-list,
.result-list,
.capability-list,
.file-chip-list,
.upstream-list,
.runtime-profile-list {
  display: grid;
  gap: 8px;
}

.action-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.action-card,
.workbench-list div,
.mainline-list a,
.delivery-summary div,
.capability-list div,
.file-chip-list div,
.upstream-list div,
.runtime-profile-list div,
.intake-contract-grid article {
  min-height: 76px;
  padding: 12px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.gate-profile-list div.active {
  border-color: var(--blue);
  background: #f6f9ff;
}

.action-card {
  display: block;
}

.action-card:hover {
  border-color: var(--blue);
  box-shadow: 0 0 0 2px rgba(31, 111, 235, 0.08);
}

.action-card strong,
.workbench-list strong,
.mainline-list strong,
.delivery-summary strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
  line-height: 1.35;
}

.action-card p,
.workbench-list p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.workbench-list,
.mainline-list,
.delivery-summary {
  display: grid;
  gap: 8px;
}

.delivery-summary {
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
}

.delivery-links.compact {
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
}

.source-grid,
.intake-contract-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.check-line {
  align-items: center;
  border: 1px solid var(--border);
  border-radius: 8px;
  display: flex;
  gap: 8px;
  min-height: 42px;
  padding: 9px 10px;
}

.check-line input {
  accent-color: var(--accent);
  flex: 0 0 auto;
}

.check-line.compact {
  border: 0;
  min-height: 0;
  padding: 0;
}

.capability-list span,
.file-chip-list span,
.upstream-list span,
.runtime-profile-list span,
.intake-contract-grid article > span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.capability-list strong,
.file-chip-list strong,
.upstream-list strong,
.runtime-profile-list strong,
.intake-contract-grid article > strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.capability-list p,
.upstream-list p,
.runtime-profile-list p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.runtime-profile-list small,
.delivery-links small {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.4;
}

.portability-note {
  margin: 10px 0;
  padding: 12px;
  border: 1px solid #d6dee6;
  border-radius: 8px;
  background: #f6f8fb;
}

.portability-note strong {
  display: block;
  margin-bottom: 5px;
  font-size: 13px;
}

.portability-note p {
  margin: 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.5;
}

label {
  display: block;
  margin: 10px 0 6px;
  color: var(--muted);
  font-size: 12px;
}

input,
select,
textarea {
  width: 100%;
  border: 1px solid var(--line);
  border-radius: 6px;
  padding: 9px 10px;
  background: #fff;
  color: var(--text);
}

textarea,
pre {
  font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
}

pre {
  max-height: 440px;
  overflow: auto;
  margin: 12px 0 0;
  padding: 12px;
  border-radius: 8px;
  background: #111827;
  color: #e5eef8;
  font-size: 12px;
  line-height: 1.55;
  white-space: pre-wrap;
  word-break: break-word;
}

.registry-layout {
  display: grid;
  grid-template-columns: 340px minmax(0, 1fr);
  gap: 14px;
}

.textviz-layout {
  display: grid;
  grid-template-columns: minmax(360px, 0.92fr) minmax(480px, 1.08fr);
  gap: 14px;
}

.chartspec-layout {
  display: grid;
  grid-template-columns: minmax(380px, 0.9fr) minmax(520px, 1.1fr);
  gap: 14px;
}

.graphvis-layout {
  display: grid;
  grid-template-columns: minmax(400px, 0.86fr) minmax(560px, 1.14fr);
  gap: 14px;
}

.geotime-layout {
  display: grid;
  grid-template-columns: minmax(400px, 0.86fr) minmax(560px, 1.14fr);
  gap: 14px;
}

.evidence-layout {
  display: grid;
  grid-template-columns: minmax(380px, 0.9fr) minmax(520px, 1.1fr);
  gap: 14px;
}

.critic-layout {
  display: grid;
  grid-template-columns: minmax(380px, 0.9fr) minmax(520px, 1.1fr);
  gap: 14px;
}

.research-builder {
  display: grid;
  grid-template-columns: minmax(380px, 0.82fr) minmax(560px, 1.18fr);
  gap: 14px;
}

.case-layout {
  display: grid;
  grid-template-columns: minmax(380px, 0.82fr) minmax(560px, 1.18fr);
  gap: 14px;
}

.textviz-controls,
.chart-controls,
.graph-controls,
.geotime-controls {
  display: grid;
  grid-template-columns: 100px 100px minmax(180px, 1fr);
  gap: 10px;
  align-items: end;
}

.chart-controls {
  grid-template-columns: 110px repeat(3, minmax(120px, 1fr));
}

.graph-controls {
  grid-template-columns: 110px 110px minmax(160px, 1fr);
}

.geotime-controls {
  grid-template-columns: 130px repeat(2, minmax(140px, 1fr));
}

.textviz-controls label,
.chart-controls label,
.graph-controls label,
.geotime-controls label {
  margin-top: 0;
}

.textviz-preview {
  display: grid;
  gap: 14px;
}

.chartspec-preview {
  display: grid;
  gap: 14px;
}

.graphvis-preview {
  display: grid;
  gap: 14px;
}

.geotime-preview {
  display: grid;
  gap: 14px;
}

.case-preview {
  display: grid;
  gap: 14px;
}

.case-run-meter {
  height: 10px;
  overflow: hidden;
  border: 1px solid #d8e2ee;
  border-radius: 999px;
  background: #eef3f8;
}

.case-run-meter span {
  display: block;
  height: 100%;
  min-width: 3px;
  background: #2f7d74;
}

.case-decision {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 14px;
  padding: 12px;
  border: 1px solid #d8e2ee;
  border-left-width: 4px;
  border-radius: 8px;
  background: #fbfcfe;
}

.case-decision span,
.case-readiness-grid span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.case-decision strong,
.case-readiness-grid strong {
  display: block;
  margin-top: 3px;
  font-size: 14px;
}

.case-decision p,
.case-readiness-grid p {
  margin: 4px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.case-decision small {
  justify-self: end;
  max-width: 260px;
  color: var(--text);
  font-size: 12px;
  line-height: 1.45;
  text-align: right;
}

.case-decision.good,
.case-readiness-grid .good {
  border-color: #a9d8c8;
  border-left-color: #2f7d74;
  background: #f5fbf8;
}

.case-decision.warn,
.case-readiness-grid .warn {
  border-color: #ecd69e;
  border-left-color: #b78116;
  background: #fffaf0;
}

.case-decision.bad,
.case-readiness-grid .bad {
  border-color: #efc0b8;
  border-left-color: #b94a3a;
  background: #fff7f5;
}

.case-readiness-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.case-readiness-grid div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-left-width: 4px;
  border-radius: 8px;
  background: #fbfcfe;
}

.case-launch-wizard,
.case-wizard-steps {
  display: grid;
  gap: 10px;
}

.case-wizard-steps {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.case-wizard-steps div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-top-width: 4px;
  border-radius: 8px;
  background: #fbfcfe;
}

.case-wizard-steps .done {
  border-color: #a9d8c8;
  border-top-color: #2f7d74;
  background: #f5fbf8;
}

.case-wizard-steps .ready {
  border-color: #ecd69e;
  border-top-color: #b78116;
  background: #fffaf0;
}

.case-wizard-steps .waiting {
  border-color: #d8e2ee;
  border-top-color: #8191a4;
}

.case-wizard-steps span,
.case-wizard-steps p {
  display: block;
  margin: 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.case-wizard-steps strong {
  display: block;
  margin: 4px 0;
  font-size: 13px;
}

.case-start-guide {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
}

.case-start-guide div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.case-start-guide h3 {
  margin: 0 0 8px;
  font-size: 13px;
}

.case-start-guide p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.case-start-guide strong {
  color: var(--text);
}

.case-intake-recipe,
.case-intake-pack {
  display: grid;
  gap: 12px;
}

.case-recipe-summary,
.case-recipe-grid,
.case-pack-grid {
  display: grid;
  gap: 10px;
}

.case-recipe-summary {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.case-recipe-grid,
.case-pack-grid {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}

.case-recipe-grid > div,
.case-pack-grid > div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.case-recipe-grid h3,
.case-pack-grid h3 {
  margin: 0 0 8px;
  font-size: 13px;
}

.case-recipe-grid article,
.case-pack-grid article {
  padding: 8px 0;
  border-top: 1px solid #e7edf3;
}

.case-recipe-grid article:first-of-type,
.case-pack-grid article:first-of-type {
  border-top: 0;
}

.case-recipe-grid span,
.case-recipe-grid p,
.case-pack-grid span,
.case-pack-grid p {
  display: block;
  margin: 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.case-recipe-grid strong,
.case-pack-grid strong {
  display: block;
  margin: 3px 0;
  font-size: 13px;
}

.case-pack-grid article.matched {
  border-left: 3px solid #2f7d74;
  padding-left: 8px;
}

.case-pack-grid article.missing {
  border-left: 3px solid #b94a3a;
  padding-left: 8px;
}

.case-recipe-routes {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.graph-canvas {
  min-height: 380px;
}

.graph-detail-grid {
  display: grid;
  grid-template-columns: minmax(180px, 0.7fr) minmax(260px, 1.3fr);
  gap: 14px;
}

.graph-detail-grid h3 {
  margin: 0 0 8px;
  font-size: 14px;
}

.geotime-detail-grid {
  display: grid;
  grid-template-columns: minmax(240px, 1fr) minmax(240px, 1fr);
  gap: 14px;
}

.geotime-detail-grid h3 {
  margin: 0 0 8px;
  font-size: 14px;
}

.type-summary,
.edge-list,
.event-list,
.case-stage-list {
  display: grid;
  gap: 8px;
}

.type-summary div,
.edge-list div,
.event-list div,
.case-stage-list div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.type-summary span,
.edge-list span,
.edge-list p,
.event-list span,
.event-list p,
.case-stage-list span,
.case-stage-list p,
.case-stage-list small {
  display: block;
  margin: 0;
  color: var(--muted);
  font-size: 12px;
}

.type-summary strong,
.edge-list strong,
.event-list strong,
.case-stage-list strong {
  display: block;
  margin-top: 3px;
  font-size: 13px;
}

.textviz-preview h3 {
  margin: 0 0 8px;
  font-size: 14px;
}

.case-columns {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
}

.case-columns h3 {
  margin: 0 0 8px;
  font-size: 14px;
}

.case-columns p {
  margin: 0 0 8px;
  color: var(--muted);
  font-size: 13px;
}

.term-cloud.large {
  min-height: 250px;
}

.ngram-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.ngram-list div {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.ngram-list strong {
  font-size: 13px;
}

.ngram-list span {
  color: var(--muted);
  font-size: 12px;
}

.data-preview {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.data-preview div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.data-preview span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.data-preview strong {
  display: block;
  margin-top: 3px;
  font-size: 13px;
}

.packable-list,
.manifest-list,
.source-list,
.review-target-list,
.review-report-list {
  display: grid;
  gap: 8px;
  margin: 10px 0;
}

.packable-list div,
.manifest-list div,
.source-list div,
.review-target-list div,
.review-report-list div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.packable-list span,
.manifest-list span,
.source-list span,
.review-target-list span,
.review-report-list span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.packable-list strong,
.manifest-list strong,
.source-list strong,
.review-target-list strong,
.review-report-list strong {
  display: block;
  margin-top: 3px;
  font-size: 13px;
}

.review-report-list p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.packable-list small {
  display: inline-flex;
  margin-top: 6px;
  font-size: 12px;
}

.evidence-preview {
  display: grid;
  gap: 14px;
}

.html-preview {
  width: 100%;
  min-height: 320px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fff;
}

.schema-list button,
.object-row {
  width: 100%;
  min-height: 72px;
  text-align: left;
  background: #fbfcfe;
}

.schema-list button.active,
.object-row.active {
  border-color: var(--blue);
  box-shadow: 0 0 0 2px rgba(31, 111, 235, 0.1);
}

.delivery-links {
  display: grid;
  grid-template-columns: minmax(240px, 1fr) repeat(3, auto);
  gap: 8px;
  align-items: stretch;
  margin-top: 10px;
}

.delivery-links div,
.delivery-links a {
  min-height: 54px;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.delivery-links a {
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--blue);
  font-size: 13px;
}

.delivery-links span,
.delivery-links p {
  display: block;
  margin: 0;
  color: var(--muted);
  font-size: 12px;
}

.delivery-links strong {
  display: block;
  margin-top: 3px;
  font-size: 13px;
}

.package-tools {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  align-items: flex-start;
  margin: 10px 0;
}

.package-import > div:first-child,
.package-upload > div:first-child {
  flex: 1;
}

.package-import small,
.package-upload small {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.4;
}

.package-import-preview {
  display: grid;
  gap: 10px;
  margin: 10px 0;
  padding: 12px;
  border: 1px solid #d6dee6;
  border-radius: 8px;
  background: #f8fafc;
}

.preview-head,
.preview-actions,
.preview-trust,
.preview-diff,
.preview-merge {
  display: grid;
  grid-template-columns: minmax(260px, 1fr) minmax(320px, 0.9fr);
  gap: 10px;
}

.preview-head > div,
.preview-actions div,
.preview-trust > div,
.preview-diff > div,
.preview-merge > div,
.preview-object-list div {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fff;
}

.preview-diff {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

.preview-trust.external_integrity_passed_unsigned > div:first-child,
.preview-trust.unknown_unsigned > div:first-child {
  border-color: rgba(177, 83, 0, 0.32);
  background: #fffaf5;
}

.preview-trust.local_generated_integrity_passed_unsigned > div:first-child,
.preview-trust.local_generated_unsigned > div:first-child,
.preview-trust.integrity_passed_unsigned > div:first-child {
  border-color: rgba(38, 115, 77, 0.22);
  background: #f7fcf9;
}

.preview-trust.integrity_failed > div:first-child {
  border-color: rgba(184, 50, 50, 0.35);
  background: #fff7f7;
}

.preview-merge.conflict > div:first-child,
.preview-merge.blocked > div:first-child {
  border-color: rgba(177, 83, 0, 0.35);
  background: #fffaf5;
}

.preview-merge.safe > div:first-child,
.preview-merge.no_change > div:first-child {
  border-color: rgba(38, 115, 77, 0.25);
  background: #f7fcf9;
}

.preview-counts {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
}

.preview-strategy {
  display: grid;
  grid-template-columns: 140px minmax(220px, 1fr);
  gap: 10px;
  align-items: end;
}

.preview-strategy label,
.preview-object-list label {
  margin: 0;
}

.preview-object-list label {
  display: grid;
  grid-template-columns: 72px minmax(0, 1fr);
  gap: 8px;
  align-items: center;
  margin-top: 8px;
}

.preview-object-list select,
.preview-strategy select {
  width: 100%;
}

.preview-object-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.preview-object-list .new {
  border-color: rgba(22, 101, 52, 0.25);
}

.preview-object-list .changed,
.preview-object-list .unreadable_existing,
.preview-object-list .invalid {
  border-color: rgba(177, 83, 0, 0.28);
}

.preview-head span,
.preview-actions span,
.preview-trust span,
.preview-diff span,
.preview-merge span,
.preview-counts span,
.preview-object-list span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.preview-head strong,
.preview-actions strong,
.preview-trust strong,
.preview-diff strong,
.preview-merge strong,
.preview-counts strong,
.preview-object-list strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.preview-head p,
.preview-actions p,
.preview-trust p,
.preview-diff p,
.preview-merge p,
.preview-more {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.preview-object-list small {
  display: block;
  margin-top: 5px;
  color: var(--muted);
  font-size: 11px;
  line-height: 1.4;
}

.timeline-summary,
.timeline-stage-list {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
  margin-bottom: 10px;
}

.timeline-summary > div,
.timeline-stage-list > div,
.timeline-track article {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.timeline-stage-list > div {
  min-height: 54px;
}

.timeline-track {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}

.timeline-track.compact {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.timeline-track article {
  border-left: 4px solid var(--line);
}

.timeline-track article.contract,
.timeline-track article.upstream {
  border-left-color: var(--cyan);
}

.timeline-track article.artifact,
.timeline-track article.presentation {
  border-left-color: var(--blue);
}

.timeline-track article.review,
.timeline-track article.evidence {
  border-left-color: var(--green);
}

.timeline-track article.package,
.timeline-track article.import,
.timeline-track article.timeline {
  border-left-color: var(--amber);
}

.timeline-summary span,
.timeline-stage-list span,
.timeline-track span,
.timeline-track small {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.timeline-summary strong,
.timeline-stage-list strong,
.timeline-track strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.timeline-track p {
  margin: 6px 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.gap-type-list {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
  margin-bottom: 10px;
}

.gap-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

.gap-type-list > div,
.gap-list article {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.gap-list article {
  border-left: 4px solid var(--amber);
}

.gap-list article.block {
  border-left-color: var(--red);
  background: #fff7f7;
}

.gap-list article.info {
  border-left-color: var(--blue);
}

.gap-type-list span,
.gap-list span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.gap-type-list strong,
.gap-list strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.gap-list p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.release-gate-findings {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
  margin: 10px 0;
}

.release-gate-findings > div {
  display: grid;
  gap: 8px;
}

.release-gate-findings > div > span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.release-gate-findings article {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-left: 4px solid var(--amber);
  border-radius: 8px;
  background: #fbfcfe;
}

.release-gate-findings article.block {
  border-left-color: var(--red);
  background: #fff7f7;
}

.release-gate-findings article.waived {
  border-left-color: var(--blue);
  background: #f6f9ff;
}

.release-gate-findings article.relaxed {
  border-left-color: var(--amber);
  background: #fffaf0;
}

.release-gate-findings strong {
  display: block;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.release-gate-findings p {
  margin: 6px 0 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.release-gate-findings small {
  display: block;
  margin-top: 6px;
  color: var(--muted);
  font-size: 11px;
}

.remediation-plan {
  margin: 10px 0;
  padding: 12px;
  border: 1px solid #d6dee6;
  border-radius: 8px;
  background: #f8fafc;
}

.panel-heading.compact {
  margin-bottom: 8px;
}

.panel-heading.compact h3 {
  margin: 0;
  font-size: 14px;
}

.remediation-actions {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}

.remediation-actions article {
  display: grid;
  gap: 6px;
  align-content: start;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-left: 4px solid var(--amber);
  border-radius: 8px;
  background: #fff;
}

.remediation-actions article.block {
  border-left-color: var(--red);
}

.remediation-actions article.requested,
.remediation-actions article.in_progress {
  border-left-color: var(--blue);
  background: #f6f9ff;
}

.remediation-actions article.resolved {
  border-left-color: var(--green);
  background: #f7fbf7;
}

.remediation-actions article.waived {
  border-left-color: #8b95a1;
  background: #f7f8fa;
}

.remediation-actions span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.remediation-actions strong {
  display: block;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.remediation-actions p {
  margin: 0;
  color: var(--muted);
  font-size: 12px;
  line-height: 1.45;
}

.remediation-actions button {
  width: fit-content;
}

.package-gate {
  min-width: 260px;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.package-gate span,
.package-gate p,
.package-object small {
  display: block;
  margin: 0;
  color: var(--muted);
  font-size: 12px;
}

.package-gate strong {
  display: block;
  margin: 3px 0;
  font-size: 14px;
}

.package-gate.passed strong,
.package-object.passed small {
  color: var(--green);
}

.package-gate.passed_with_warnings strong,
.package-gate.passed_with_waivers strong,
.package-gate.passed_with_profile_relaxations strong,
.package-object.warning small {
  color: var(--amber);
}

.package-gate.blocked strong,
.package-object.blocked small {
  color: var(--red);
}

.package-selector {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  margin: 10px 0;
}

.package-object {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr);
  gap: 8px;
  align-items: flex-start;
  margin: 0;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.package-object input {
  width: auto;
  margin-top: 2px;
}

.package-object strong {
  display: block;
  overflow-wrap: anywhere;
  font-size: 13px;
}

button:disabled {
  cursor: not-allowed;
  opacity: 0.55;
}

.field-table {
  display: grid;
  gap: 8px;
}

.object-detail {
  display: grid;
  gap: 12px;
  margin: 12px 0;
}

.detail-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 8px;
}

.detail-grid div,
.hash-line,
.detail-list div,
.import-result-grid > div,
.import-result-grid article {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.detail-grid span,
.hash-line span,
.detail-list span,
.import-result-grid span,
.import-result-grid article span {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.detail-grid strong,
.detail-list strong,
.import-result-grid article strong {
  display: block;
  margin-top: 4px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.detail-grid small,
.import-result-grid article small {
  display: block;
  margin-top: 4px;
  color: var(--muted);
  overflow-wrap: anywhere;
  font-size: 11px;
  line-height: 1.4;
}

.hash-line code {
  display: block;
  margin-top: 6px;
  overflow-wrap: anywhere;
  color: var(--ink);
  font-size: 12px;
}

.delivery-package-detail a {
  color: var(--blue);
  overflow-wrap: anywhere;
}

.delivery-package-detail .import-result-grid article {
  min-width: 0;
}

.detail-section h3 {
  margin: 0 0 8px;
  font-size: 14px;
}

.detail-list,
.import-result-grid {
  display: grid;
  gap: 8px;
}

.detail-list {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.import-result-grid {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.import-result-grid > div {
  display: grid;
  align-content: start;
  gap: 8px;
}

.import-result-grid p {
  margin: 0;
  color: var(--muted);
  font-size: 12px;
}

.field-table div {
  display: grid;
  grid-template-columns: minmax(160px, 1fr) 120px 90px;
  gap: 10px;
  align-items: center;
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
}

.pill,
.badge {
  display: inline-flex;
  width: fit-content;
  min-height: 24px;
  align-items: center;
  border-radius: 999px;
  padding: 2px 9px;
  background: #e8f1ff;
  color: #1554b3;
  font-size: 12px;
}

.pill.required,
.badge.error,
.result.error,
.validation-list .error,
small.error {
  color: var(--red);
}

.pill.recommended,
.validation-list .warn {
  color: var(--amber);
}

.pill.optional,
.badge.ok,
.result.ok,
.validation-list .ok,
small.ok {
  color: var(--green);
}

.subhead {
  margin-top: 18px !important;
}

.empty {
  padding: 18px;
  border: 1px dashed var(--line);
  border-radius: 8px;
  color: var(--muted);
  background: #fbfcfe;
}

.research-page {
  max-width: 1080px;
  margin: 0 auto;
}

.research-header,
.research-card {
  margin-bottom: 14px;
  padding: 18px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: #fff;
  box-shadow: var(--shadow);
}

.research-header span {
  color: var(--muted);
  font-size: 12px;
}

.research-header h2 {
  margin: 8px 0;
  font-size: 26px;
}

.research-header p {
  color: var(--muted);
}

.research-components {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 14px;
}

.relation-layout {
  display: grid;
  grid-template-columns: minmax(420px, 1fr) minmax(340px, 0.78fr);
  gap: 14px;
}

.relation-svg {
  width: 100%;
  min-height: 360px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #f8fafc;
}

.relation-svg > rect {
  fill: #fbfcfe;
}

.relation-svg path {
  fill: none;
  stroke: #95a3b8;
  stroke-width: 2;
}

.relation-svg path.contract {
  stroke: var(--blue);
}

.relation-svg path.review {
  stroke: var(--amber);
}

.relation-svg path.evidence,
.relation-svg path.presentation,
.relation-svg path.package {
  stroke: var(--green);
}

.relation-svg path.import,
.relation-svg path.imported {
  stroke: #6f63c2;
  stroke-dasharray: 2 3;
}

.relation-svg path.rendered {
  stroke: var(--cyan);
  stroke-dasharray: 4 4;
}

.relation-svg path.upstream {
  stroke: var(--red);
  stroke-dasharray: 5 5;
}

.relation-svg text {
  fill: var(--muted);
  font-size: 10px;
}

.relation-node rect {
  fill: #fff;
  stroke: #d6dee6;
  stroke-width: 1;
}

.relation-node.contract rect {
  stroke: var(--blue);
}

.relation-node.artifact rect {
  stroke: var(--cyan);
}

.relation-node.review rect {
  stroke: var(--amber);
}

.relation-node.upstream rect {
  stroke: var(--red);
}

.relation-node.evidence rect,
.relation-node.presentation rect,
.relation-node.package rect {
  stroke: var(--green);
}

.relation-node.import rect {
  stroke: #6f63c2;
}

.relation-node.clickable {
  cursor: pointer;
}

.relation-node .schema {
  fill: var(--muted);
  font-size: 10px;
}

.relation-node .id {
  fill: var(--text);
  font-size: 12px;
  font-weight: 700;
}

.relation-node .title {
  fill: var(--muted);
  font-size: 10px;
}

.relation-edge-list,
.relation-node-list {
  display: grid;
  gap: 8px;
}

.relation-edge-list div,
.relation-node-list button {
  padding: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #fbfcfe;
  text-align: left;
}

.relation-edge-list span,
.relation-node-list span,
.relation-node-list small {
  display: block;
  color: var(--muted);
  font-size: 12px;
}

.relation-edge-list strong,
.relation-node-list strong {
  display: block;
  margin-top: 3px;
  overflow-wrap: anywhere;
  font-size: 13px;
}

.research-card h3 {
  margin: 0 0 12px;
  font-size: 16px;
}

.term-cloud {
  min-height: 150px;
  display: flex;
  align-content: center;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 10px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  padding: 14px;
  background: #f8fafc;
}

.term-cloud span {
  color: var(--blue);
  font-weight: 700;
  font-size: calc(14px * var(--w));
}

.kwic-list p {
  margin: 10px 0 0;
  color: var(--muted);
  font-size: 13px;
}

.chart-svg,
.graph-svg,
.geotime-svg {
  width: 100%;
  min-height: 220px;
  border: 1px solid #e7edf3;
  border-radius: 8px;
  background: #f8fafc;
}

.chart-svg line,
.chart-svg polyline,
.graph-svg line {
  fill: none;
  stroke: #7b8aa0;
  stroke-width: 2;
}

.chart-svg polyline {
  stroke: var(--blue);
  stroke-width: 3;
}

.chart-svg circle,
.graph-svg circle {
  fill: #fff;
  stroke: var(--blue);
  stroke-width: 2;
}

.graph-svg rect {
  fill: #fbfcfe;
}

.graph-svg .person circle {
  fill: #1f6feb;
}

.graph-svg .place circle {
  fill: #26734d;
}

.graph-svg .concept circle {
  fill: #6d28d9;
}

.graph-svg .event circle {
  fill: #a15c10;
}

.graph-svg .entity circle {
  fill: #0f766e;
}

.chart-svg text,
.graph-svg text,
.geotime-svg text {
  fill: var(--muted);
  font-size: 11px;
}

.geotime-svg .map-bg {
  fill: #edf7f2;
  stroke: #c9d8d1;
}

.geotime-svg .map-grid,
.geotime-svg .timeline-axis,
.geotime-svg .geo-tick line {
  fill: none;
  stroke: #b8c6d2;
  stroke-width: 1.2;
}

.geotime-svg .geo-path {
  fill: none;
  stroke: var(--cyan);
  stroke-width: 2.5;
  stroke-dasharray: 6 5;
}

.geotime-svg .geo-event circle,
.geotime-svg .geo-tick circle {
  fill: #fff;
  stroke: var(--cyan);
  stroke-width: 2;
}

.geotime-svg .geo-event.has-gap circle,
.geotime-svg .geo-tick.has-gap circle {
  fill: #fff5f5;
  stroke: var(--red);
}

.geotime-svg .axis-title {
  fill: var(--text);
  font-size: 12px;
  font-weight: 700;
}

@media (max-width: 1120px) {
  .app-shell,
  .content-grid,
  .registry-layout,
  .textviz-layout,
  .chartspec-layout,
  .graphvis-layout,
  .geotime-layout,
  .critic-layout,
  .evidence-layout,
  .relation-layout,
  .research-builder,
  .case-layout,
  .research-components,
  .geotime-detail-grid,
  .case-columns {
    grid-template-columns: 1fr;
  }

  .nav-pane {
    position: static;
  }

  .pipeline,
  .stats-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .health-row,
  .action-grid,
  .delivery-summary,
  .preview-head,
  .preview-actions,
  .preview-trust,
  .preview-diff,
  .preview-merge,
  .preview-object-list,
  .preview-strategy,
  .detail-grid,
  .detail-list,
  .timeline-summary,
  .timeline-stage-list,
  .timeline-track,
  .timeline-track.compact,
  .gap-type-list,
  .gap-list,
  .release-gate-findings,
  .remediation-actions,
  .import-result-grid,
	  .source-grid,
	  .intake-contract-grid,
	  .case-readiness-grid,
	  .case-wizard-steps,
	  .case-start-guide,
	  .case-recipe-summary,
	  .case-recipe-grid,
	  .case-pack-grid {
	    grid-template-columns: 1fr;
	  }
}

@media (max-width: 720px) {
  .topbar,
  .field-table div {
    display: block;
  }

  .topbar-actions,
  .button-row {
    justify-content: flex-start;
    margin-top: 12px;
  }

  .pipeline,
  .stats-grid,
  .health-row,
  .action-grid,
  .source-grid,
  .intake-contract-grid,
  .textviz-controls,
  .chart-controls,
  .graph-controls,
  .geotime-controls,
  .data-preview,
  .ngram-list,
  .graph-detail-grid,
  .geotime-detail-grid,
  .case-columns,
  .case-decision,
	  .case-readiness-grid,
	  .case-wizard-steps,
	  .case-start-guide,
	  .case-recipe-summary,
	  .case-recipe-grid,
	  .case-pack-grid,
	  .delivery-links,
  .delivery-summary,
  .preview-head,
  .preview-actions,
  .preview-trust,
  .preview-diff,
  .preview-merge,
  .preview-object-list,
  .preview-counts,
  .preview-strategy,
  .detail-grid,
  .detail-list,
  .timeline-summary,
  .timeline-stage-list,
  .timeline-track,
  .timeline-track.compact,
  .gap-type-list,
  .gap-list,
  .release-gate-findings,
  .remediation-actions,
  .import-result-grid,
  .package-selector {
    grid-template-columns: 1fr;
  }

  .case-decision small {
    justify-self: start;
    max-width: none;
    text-align: left;
  }

  .package-tools {
    display: block;
  }
}

/* MapLibre 地图块（在线底图 + SVG 离线回退） */
.geo-map-block {
  position: relative;
}

.geo-map-canvas {
  width: 100%;
  height: 360px;
  border-radius: 10px;
  overflow: hidden;
  background: #edf7f2;
}

/* 默认显示地图画布、隐藏 SVG 回退；mountGeoMaps 失败时加 .map-failed 切换。 */
.geo-map-fallback {
  display: none;
}

.geo-map-block.map-failed .geo-map-canvas {
  display: none;
}

.geo-map-block.map-failed .geo-map-fallback {
  display: block;
}

.geo-marker {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #3b6ef0;
  border: 2px solid #fff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
  cursor: pointer;
}

.geo-marker.has-gap {
  background: #e5484d;
}

/* 实验室导航分组 + 嵌入原型的 iframe 容器 */
.nav-pane nav .nav-group-label {
  margin-top: 10px;
  padding: 4px 10px 0;
  font-size: 11px;
  letter-spacing: .5px;
  color: #7f8ca0;
  border-top: 1px solid rgba(255, 255, 255, 0.10);
}
.lab-frame-wrap {
  display: flex;
  flex-direction: column;
  height: calc(100vh - 124px);
}
.lab-frame-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 2px 8px;
}
.lab-frame-bar .muted { color: var(--muted); font-size: 12px; }
.lab-frame-bar .lab-pop {
  display: inline-flex; align-items: center; min-height: 30px;
  padding: 0 12px; border-radius: 6px; font-size: 13px;
  background: var(--panel); border: 1px solid var(--line); color: var(--text, #e8edf4);
}
.lab-frame-bar .lab-pop:hover { background: #243447; color: #fff; }
.lab-frame {
  flex: 1; width: 100%; border: 1px solid var(--line);
  border-radius: 10px; background: #0d1016; box-shadow: var(--shadow);
}

/* 实验室栏：进入独立页面 / 新标签 */
.lab-bar-acts { display: inline-flex; gap: 8px; align-items: center; }
.lab-frame-bar .lab-pop2 {
  display: inline-flex; align-items: center; min-height: 30px;
  padding: 0 10px; border-radius: 6px; font-size: 12px;
  background: transparent; border: 1px solid var(--line); color: var(--muted); text-decoration: none;
}
.lab-frame-bar .lab-pop2:hover { color: #fff; background: #243447; }

/* 品牌版本说明（移到 logo 下方） */
.brand .brand-ver { display: block; color: #7e8aaa; font-size: 11px; line-height: 1.5; margin-top: 6px; }
/* 侧栏底部「设置管理」入口 */
.nav-settings { margin-top: auto; display: flex; align-items: center; gap: 6px; min-height: 40px; padding: 0 10px; border-radius: 6px; color: #dce8f5; text-decoration: none; border: 1px solid rgba(255,255,255,.12); }
.nav-settings:hover, .nav-settings.active { background: #243447; color: #fff; }
/* 设置管理视图 */
.settings-view { display: flex; flex-direction: column; gap: 14px; }
.settings-frame { width: 100%; height: max(760px, calc(100vh - 300px)); border: 1px solid var(--line); border-radius: 10px; background: #0d1016; }
.settings-view .muted-note { color: var(--muted); font-size: 13px; margin: 4px 0 12px; }
.settings-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
.settings-card { display: flex; flex-direction: column; gap: 4px; padding: 14px; border: 1px dashed var(--line); border-radius: 10px; background: var(--panel); }
.settings-card.disabled { opacity: .6; }
.settings-card strong { font-size: 14px; }
.settings-card span { font-size: 12px; color: var(--muted); }

/* 平台级可视化助手（常驻，挂 body，路由切换不销毁） */
.pf-cp-btn { position: fixed; right: 22px; bottom: 22px; z-index: 300; background: #17202c; color: #dce8f5; border: 1px solid #3b6ef0; border-radius: 22px; padding: 10px 18px; font-size: 14px; cursor: pointer; box-shadow: 0 8px 24px rgba(0,0,0,.28); }
.pf-cp-btn:hover { background: #243447; }
.pf-cp-btn.hidden { display: none; }
.pf-cp { position: fixed; right: 22px; bottom: 22px; z-index: 300; width: 370px; height: min(560px, calc(100vh - 44px)); display: flex; flex-direction: column; background: #ffffff; border: 1px solid var(--line); border-radius: 14px; box-shadow: 0 22px 60px rgba(15,23,42,.35); overflow: hidden; }
.pf-cp.hidden { display: none; }
.pf-cp-head { display: flex; align-items: baseline; gap: 8px; padding: 12px 14px 10px; background: #17202c; color: #e9f1fb; }
.pf-cp-head strong { font-size: 14.5px; }
.pf-cp-head .pf-cp-sub { flex: 1; font-size: 10.5px; color: #8fa0b6; }
.pf-cp-head button { background: transparent; border: none; color: #aab8c8; font-size: 18px; cursor: pointer; line-height: 1; }
.pf-cp-msgs { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; background: #f8fafc; }
.pf-cp-msg { max-width: 92%; padding: 8px 11px; border-radius: 10px; font-size: 13px; line-height: 1.6; word-break: break-word; white-space: pre-wrap; }
.pf-cp-msg.user { align-self: flex-end; background: #1f6feb; color: #fff; }
.pf-cp-msg.bot { align-self: flex-start; background: #ffffff; border: 1px solid var(--line); color: #1e293b; }
.pf-cp-msg.act { align-self: flex-start; background: transparent; border: 1px dashed #cbd5e1; color: #64748b; font-size: 11.5px; padding: 4px 9px; }
.pf-cp-msg.sys { align-self: flex-start; color: #94a3b8; font-size: 11.5px; background: transparent; }
.pf-cp-chips { display: flex; flex-wrap: wrap; gap: 5px; padding: 8px 12px; border-top: 1px solid var(--line); background: #fff; }
.pf-cp-chip { background: #f1f5f9; color: #475569; border: 1px solid var(--line); border-radius: 12px; padding: 3px 10px; font-size: 11.5px; cursor: pointer; }
.pf-cp-chip:hover { background: #e2e8f0; color: #0f172a; }
.pf-cp-input { display: flex; gap: 7px; padding: 10px 12px 12px; background: #fff; }
.pf-cp-input textarea { flex: 1; border: 1px solid var(--line); border-radius: 8px; padding: 7px 9px; font-size: 13px; line-height: 1.5; resize: none; font-family: inherit; }
.pf-cp-input button { align-self: flex-end; background: #1f6feb; color: #fff; border: none; border-radius: 8px; padding: 8px 15px; font-size: 13px; cursor: pointer; }
.pf-cp-input button:disabled { opacity: .5; cursor: wait; }

/* 助手方案卡（P3 目标驱动） */
.pf-cp-msg.plan { align-self: stretch; max-width: 100%; background: #f0f6ff; border: 1px solid #bcd3f7; }
.pf-plan-title { font-weight: 700; font-size: 13.5px; margin-bottom: 4px; }
.pf-plan-note { color: #47608a; font-size: 12px; margin-bottom: 6px; }
.pf-plan-steps { margin: 0; padding-left: 20px; display: flex; flex-direction: column; gap: 4px; }
.pf-plan-steps li strong { font-weight: 600; }
.pf-plan-steps li span { display: block; color: #64748b; font-size: 11.5px; }
.pf-cp-errdetail { color: #b83232; font-size: 10.5px; word-break: break-all; }

/* 登录组件（右上角常驻 chip + 模态） */
.au-chip { position: fixed; top: 14px; right: 22px; z-index: 290; display: flex; align-items: center; gap: 6px; background: rgba(23,32,44,.95); color: #dce8f5; border: 1px solid #2c3850; border-radius: 18px; padding: 5px 12px; font-size: 12.5px; box-shadow: 0 6px 18px rgba(0,0,0,.25); }
.au-chip .au-role { color: #8fa0b6; font-size: 11px; }
.au-chip button { background: transparent; border: none; color: #7fb0ff; cursor: pointer; font-size: 12px; padding: 0 2px; min-height: 0; }
.au-chip .au-login-btn { font-size: 12.5px; }
.au-overlay { position: fixed; inset: 0; z-index: 400; background: rgba(15,23,42,.55); display: flex; align-items: center; justify-content: center; }
.au-overlay.hidden { display: none; }
.au-modal { width: min(360px, 92vw); background: #fff; border-radius: 14px; box-shadow: 0 24px 70px rgba(0,0,0,.4); overflow: hidden; }
.au-head { display: flex; justify-content: space-between; align-items: center; padding: 13px 16px; background: #17202c; color: #e9f1fb; }
.au-head button { background: transparent; border: none; color: #aab8c8; font-size: 18px; cursor: pointer; min-height: 0; }
#auBody { padding: 16px; }
.au-h { margin: 0 0 10px; font-size: 15px; }
.au-tabs { display: flex; gap: 6px; margin-bottom: 12px; }
.au-tabs button { flex: 1; border: 1px solid var(--line); border-radius: 8px; padding: 6px; background: #f8fafc; cursor: pointer; }
.au-tabs button.active { background: #1f6feb; color: #fff; border-color: #1f6feb; }
.au-form { display: flex; flex-direction: column; gap: 9px; }
.au-form.hidden { display: none; }
.au-form input { border: 1px solid var(--line); border-radius: 8px; padding: 9px 10px; font-size: 13.5px; }
.au-form button { background: #1f6feb; color: #fff; border: none; border-radius: 8px; padding: 9px; font-size: 13.5px; cursor: pointer; }
.au-msg { margin: 8px 0 0; color: #b83232; font-size: 12px; min-height: 15px; }
.au-note { margin: 8px 0 0; color: #94a3b8; font-size: 11.5px; line-height: 1.5; }
