:root {
  --bg: #f6f7fb;
  --surface: #ffffff;
  --border: #e3e6ee;
  --text: #1d2330;
  --muted: #6b7280;
  --primary: #3454d1;
  --primary-weak: #eef1ff;
  --danger: #c0392b;
  --ok: #1f9254;
  --warn: #b7791f;
  --radius: 12px;
  --shadow: 0 1px 2px rgba(20, 28, 45, 0.06), 0 8px 24px rgba(20, 28, 45, 0.06);
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--text);
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  font-size: 15px;
  line-height: 1.55;
  overflow-x: hidden;
}

a { color: var(--primary); text-decoration: none; }
a:hover { text-decoration: underline; }

.topbar {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 20px;
  padding: 0 24px;
  min-height: 56px;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
}

.brand { font-weight: 700; font-size: 17px; color: var(--text); letter-spacing: .2px; }
.topnav { display: flex; gap: 16px; flex: 1; min-width: 0; }
.nav-link { color: var(--muted); font-size: 14px; }
.userbox { display: flex; align-items: center; gap: 10px; min-width: 0; }
.user-name { color: var(--muted); font-size: 13px; max-width: 42vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.page { max-width: 1180px; margin: 0 auto; padding: 24px; }
.page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; flex-wrap: wrap; }
.page-title { margin: 0; font-size: 24px; line-height: 1.3; }
.page-subtitle { margin: 6px 0 0; color: var(--muted); font-size: 14px; }
.breadcrumb { margin: 0 0 4px; color: var(--muted); font-size: 13px; }
.head-actions { display: flex; gap: 10px; flex-wrap: wrap; }

.panel {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 16px;
}
.panel-title { margin: 0 0 12px; font-size: 16px; }

.btn {
  appearance: none;
  border: 1px solid transparent;
  border-radius: 8px;
  padding: 8px 14px;
  font-size: 14px;
  font-family: inherit;
  cursor: pointer;
  background: var(--surface);
  color: var(--text);
  transition: background .15s, border-color .15s, opacity .15s;
}
.btn:disabled { opacity: .5; cursor: not-allowed; }
.btn-primary { background: var(--primary); color: #fff; }
.btn-primary:hover:not(:disabled) { background: #2b46b4; }
.btn-secondary { background: var(--primary-weak); color: var(--primary); }
.btn-secondary:hover:not(:disabled) { background: #e2e7ff; }
.btn-ghost { background: transparent; border-color: var(--border); color: var(--muted); }
.btn-ghost:hover { background: #f2f4f9; }
.btn-danger { background: transparent; border-color: #f0d3cf; color: var(--danger); }
.btn-danger:hover { background: #fdf1ef; }
.btn-block { width: 100%; }

[hidden] { display: none !important; }

.form { display: flex; flex-direction: column; gap: 14px; }
.form-inline { flex-direction: row; align-items: flex-end; flex-wrap: wrap; gap: 12px; }
.field { display: flex; flex-direction: column; gap: 6px; flex: 1 1 200px; min-width: 0; }
.form:not(.form-inline) > .field { flex: 0 0 auto; }
.field-narrow { flex: 0 1 140px; }
.field-label { font-size: 13px; color: var(--muted); }
input[type="text"], input[type="password"], input[type="number"], input[type="date"], textarea, select {
  width: 100%;
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 9px 11px;
  font-size: 14px;
  font-family: inherit;
  background: #fff;
  color: var(--text);
}
input:focus, textarea:focus, select:focus { outline: 2px solid var(--primary-weak); border-color: var(--primary); }
.form-actions { display: flex; gap: 10px; }
.form-error { margin: 0; color: var(--danger); font-size: 13px; }

.auth-body { min-height: 100vh; display: grid; place-items: center; padding: 24px; }
.auth-card {
  width: 100%;
  max-width: 380px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 16px;
  box-shadow: var(--shadow);
  padding: 28px;
}
.auth-title { margin: 0; font-size: 26px; letter-spacing: .5px; }
.auth-subtitle { margin: 6px 0 22px; color: var(--muted); font-size: 13px; }

.project-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(420px, 1fr)); gap: 18px; }
.project-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 20px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
}
.project-card h3 { margin: 0; font-size: 20px; overflow-wrap: anywhere; }
.project-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.project-card-head-main { min-width: 0; }
.project-card-meta { margin-top: 5px; color: var(--muted); font-size: 12px; display: flex; flex-wrap: wrap; gap: 8px; }
.project-progress-row { display: flex; align-items: center; gap: 10px; }
.project-progress-row .progress { flex: 1; }
.project-progress-row strong { min-width: 44px; text-align: right; font-size: 13px; }
.project-facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; }
.project-fact { padding: 8px 10px; border-radius: 9px; background: #f7f8fc; min-width: 0; }
.project-fact span { display: block; color: var(--muted); font-size: 11px; }
.project-fact strong { display: block; margin-top: 2px; font-size: 14px; overflow-wrap: anywhere; }
.project-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; color: var(--muted); font-size: 12px; }
.card-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 0; }

.badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  border-radius: 999px;
  background: #eef1f7;
  color: var(--muted);
  font-size: 12px;
}
.badge-ok { background: #e8f6ee; color: var(--ok); }
.badge-warn { background: #fdf5e6; color: var(--warn); }

.empty-state { color: var(--muted); font-size: 14px; }
.hint { color: var(--muted); font-size: 12px; margin: 10px 0 0; }
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.btn-sm { padding: 5px 10px; font-size: 12px; }

.workbench { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: 16px; align-items: start; }
.chapter-list { position: sticky; top: 72px; max-height: calc(100vh - 96px); overflow: auto; }
.chapter-ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.chapter-item {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 10px;
  border-radius: 8px;
  cursor: pointer;
  border: 1px solid transparent;
  min-width: 0;
}
.chapter-item:hover { background: #f2f4f9; }
.chapter-item.is-active { background: var(--primary-weak); border-color: #d6ddff; }
.chapter-item .c-title { font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chapter-item .c-meta { font-size: 12px; color: var(--muted); }

.editor { min-width: 0; display: flex; flex-direction: column; gap: 12px; }
.editor-head { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; align-items: flex-start; }
.editor-meta { margin: 0; color: var(--muted); font-size: 13px; }
.editor-actions { display: flex; gap: 10px; flex-wrap: wrap; }
.editor-textarea {
  min-height: 420px;
  resize: vertical;
  line-height: 1.8;
  font-size: 15px;
}

.task-strip { display: flex; align-items: center; gap: 10px; font-size: 13px; color: var(--muted); flex-wrap: wrap; }
.status-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--muted); flex: 0 0 auto; }
.status-dot.running { background: var(--warn); }
.status-dot.succeeded { background: var(--ok); }
.status-dot.failed { background: var(--danger); }
.progress { flex: 1 1 120px; height: 6px; background: #eef1f7; border-radius: 999px; overflow: hidden; min-width: 80px; }
.progress-bar { height: 100%; width: 0; background: var(--primary); transition: width .3s; }

.character-workbench { display: grid; grid-template-columns: 300px minmax(0, 1fr); gap: 16px; align-items: start; }
.character-sidebar { position: sticky; top: 72px; min-width: 0; }
.character-sidebar-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.character-sidebar-head .panel-title { margin-bottom: 0; }
.count-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  height: 24px;
  padding: 0 8px;
  border-radius: 999px;
  background: var(--primary-weak);
  color: var(--primary);
  font-size: 12px;
  font-weight: 600;
}
.search-field { display: block; margin: 14px 0 10px; }
.search-field input { min-width: 0; }
.character-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: calc(100vh - 250px);
  overflow-y: auto;
}
.character-item {
  width: 100%;
  min-width: 0;
  appearance: none;
  border: 1px solid transparent;
  border-radius: 10px;
  background: transparent;
  color: var(--text);
  padding: 10px;
  text-align: left;
  font: inherit;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.character-item:hover { background: #f5f7fb; }
.character-item.is-active { background: var(--primary-weak); border-color: #d6ddff; }
.character-item-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-width: 0; }
.character-item-head strong { font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mini-lock {
  flex: 0 0 auto;
  border-radius: 999px;
  padding: 1px 7px;
  background: #fdf5e6;
  color: var(--warn);
  font-size: 11px;
  font-weight: 600;
}
.character-item-preview {
  color: var(--muted);
  font-size: 12px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.character-item-meta { color: #9198a8; font-size: 11px; }
.character-main { min-width: 0; display: flex; flex-direction: column; gap: 16px; }
.character-editor { min-width: 0; }
.character-editor-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 16px;
}
.character-editor-head .panel-title { margin-bottom: 4px; overflow-wrap: anywhere; }
.character-content { min-height: 360px; resize: vertical; line-height: 1.75; }
.character-form-actions { flex-wrap: wrap; }
.version-panel { min-width: 0; }
.version-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }
.version-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: 10px;
  min-width: 0;
}
.version-row.is-current { border-color: #cbd5ff; background: #fafbff; }
.version-copy { min-width: 0; }
.version-title { display: flex; align-items: center; gap: 8px; }
.version-note { margin: 3px 0 0; font-size: 13px; overflow-wrap: anywhere; }
.version-time { margin: 2px 0 0; color: var(--muted); font-size: 11px; }

.kind-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0 0 16px;
  padding: 6px;
  background: var(--panel, #fff);
  border: 1px solid var(--border);
  border-radius: 12px;
}
.kind-tabs a {
  padding: 7px 12px;
  border-radius: 8px;
  font-size: 13px;
  color: var(--muted);
  text-decoration: none;
}
.kind-tabs a:hover { background: var(--primary-weak); color: var(--primary); }
.kind-tabs a.is-active { background: var(--primary); color: #fff; }

.form:not(.form-inline) > .field-narrow { max-width: 240px; }

.outline-workbench { display: grid; grid-template-columns: 320px minmax(0, 1fr); gap: 16px; align-items: start; }
.outline-sidebar { min-width: 0; }
.outline-tree,
.outline-children { list-style: none; margin: 0; padding: 0; }
.outline-tree {
  display: flex;
  flex-direction: column;
  gap: 3px;
  max-height: calc(100vh - 310px);
  overflow-y: auto;
  overflow-x: hidden;
}
.outline-node { min-width: 0; }
.outline-node-row { display: flex; align-items: center; gap: 2px; min-width: 0; }
.outline-toggle {
  appearance: none;
  flex: 0 0 auto;
  width: 22px;
  height: 28px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--muted);
  cursor: pointer;
}
.outline-toggle:disabled { cursor: default; opacity: .35; }
.outline-node-main {
  appearance: none;
  display: flex;
  align-items: center;
  gap: 7px;
  flex: 1 1 auto;
  min-width: 0;
  padding: 5px 8px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--text);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.outline-node-main:hover { background: #f4f6fb; }
.outline-node-main.is-active { background: var(--primary-weak); border-color: #cbd5ff; }
.outline-node-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
.tree-badge { flex: 0 0 auto; padding: 1px 6px; border-radius: 999px; font-size: 10px; }
.tree-level-1 { background: #e8edff; color: #4353c8; }
.tree-level-2 { background: #e7f7ef; color: #217a4c; }
.tree-level-3 { background: #fff4e5; color: #9a5b00; }

.outline-move-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px dashed var(--border);
}
.outline-move-gap { margin-left: 8px; }
.outline-move-row select { max-width: 260px; min-width: 0; }

.validation-panel { margin-top: 16px; min-width: 0; }
.validation-panel .character-editor-head .btn { flex: 0 0 auto; white-space: nowrap; }
.validation-result { margin-top: 12px; }
.validation-summary { margin: 0 0 8px; font-size: 13px; color: var(--muted); }
.validation-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.validation-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 13px;
  overflow-wrap: anywhere;
}
.validation-item.is-error { background: #fff1f1; border-color: #f4c7c7; }
.validation-item.is-warning { background: #fff8ea; border-color: #f0d9a8; }

.ledger-summary { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; }
.ledger-chip {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 9px 14px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--panel, #fff);
  color: var(--muted);
  font-size: 13px;
  text-decoration: none;
}
.ledger-chip strong { color: var(--text); font-size: 16px; }
.ledger-chip.is-active { border-color: #cbd5ff; background: var(--primary-weak); color: var(--primary); }
.ledger-chip.is-active strong { color: var(--primary); }
.ledger-textarea { min-height: 150px; resize: vertical; line-height: 1.65; }
.ledger-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: 0 0 auto; }
.ledger-dot.is-status-planned { background: var(--muted); }
.ledger-dot.is-status-planted { background: #d39a24; }
.ledger-dot.is-status-triggered { background: #c2572b; }
.ledger-dot.is-status-paid_off { background: #2f9e62; }

.check-launcher { margin-bottom: 16px; min-width: 0; }
.check-types-field { flex: 1 1 320px; }
.check-type-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px 12px; }
.check-type-item { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--muted); }
.check-type-item input { width: auto; min-width: 0; }
.report-list { max-height: calc(100vh - 250px); }
.severity-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); flex: 0 0 auto; }
.severity-dot.is-queued { background: #d39a24; }
.severity-dot.is-completed { background: #2f9e62; }
.severity-dot.is-failed { background: var(--danger); }
.issue-toolbar { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 12px; }
.issue-toolbar select { min-width: 120px; max-width: 200px; }
.issue-stats { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.issue-stat {
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 12px;
  background: #f1f3f8;
  color: var(--muted);
}
.issue-stat.is-open { background: #fff4e5; color: #9a5b00; }
.issue-stat.is-confirmed { background: #e8edff; color: #4353c8; }
.issue-stat.is-fixed { background: #e7f7ef; color: #217a4c; }
.issue-stat.is-ignored { background: #f1f3f8; color: #6b7280; }
.issue-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.issue-item {
  border: 1px solid var(--border);
  border-left: 4px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  min-width: 0;
}
.issue-item.is-fatal { border-left-color: #b42318; }
.issue-item.is-severe { border-left-color: #d97706; }
.issue-item.is-normal { border-left-color: #4353c8; }
.issue-item.is-suggestion { border-left-color: #6b7280; }
.issue-head { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.severity-badge.is-fatal { background: #fee4e2; color: #b42318; }
.severity-badge.is-severe { background: #fff4e5; color: #9a5b00; }
.severity-badge.is-normal { background: #e8edff; color: #4353c8; }
.severity-badge.is-suggestion { background: #f1f3f8; color: #6b7280; }
.issue-type { font-size: 12px; color: var(--muted); }
.issue-status { margin-left: auto; font-size: 12px; color: var(--muted); }
.issue-desc { margin: 8px 0 0; font-size: 14px; overflow-wrap: anywhere; }
.issue-meta { margin: 5px 0 0; font-size: 12px; color: var(--muted); overflow-wrap: anywhere; }
.issue-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }

.commit-list { max-height: calc(100vh - 260px); }
.commit-item { list-style: none; }
.commit-row { display: flex; align-items: stretch; gap: 6px; }
.commit-main {
  appearance: none;
  flex: 1 1 auto;
  min-width: 0;
  text-align: left;
  padding: 9px 10px;
  border: 1px solid transparent;
  border-radius: 9px;
  background: transparent;
  color: var(--text);
  font: inherit;
  cursor: pointer;
}
.commit-main:hover { background: #f4f6fb; }
.commit-main.is-active { background: var(--primary-weak); border-color: #cbd5ff; }
.commit-message { display: block; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.commit-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 4px; font-size: 11px; color: var(--muted); }
.commit-rollback { align-self: center; flex: 0 0 auto; }
.diff-controls { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 8px; }
.diff-summary { display: flex; align-items: center; flex-wrap: wrap; gap: 18px; margin: 14px 0; }
.diff-stat { display: flex; align-items: baseline; gap: 6px; }
.diff-stat strong { font-size: 22px; }
.diff-stat span { font-size: 12px; color: var(--muted); }
.diff-hashes { font-size: 12px; color: var(--muted); }
.diff-bucket {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 10px 12px;
  margin-bottom: 8px;
}
.diff-bucket h3 { display: flex; align-items: center; gap: 8px; margin: 0 0 8px; font-size: 13px; }
.diff-chip {
  display: inline-block;
  max-width: 100%;
  margin: 0 6px 6px 0;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 11px;
  overflow-wrap: anywhere;
}
.diff-chip.is-added { background: #e7f7ef; color: #217a4c; }
.diff-chip.is-removed { background: #fee4e2; color: #b42318; }
.diff-chip.is-changed { background: #fff4e5; color: #9a5b00; }
.diff-files ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; font-size: 12px; }
.diff-files h3 { font-size: 13px; margin: 12px 0 6px; }
.diff-file-status { color: var(--muted); }
.diff-raw { margin-top: 12px; }
.diff-raw summary { cursor: pointer; font-size: 13px; color: var(--muted); }
.diff-raw pre {
  margin: 8px 0 0;
  padding: 12px;
  max-height: 420px;
  overflow: auto;
  background: #f8f9fc;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 12px;
  line-height: 1.5;
  white-space: pre-wrap;
  word-break: break-word;
}

.polish-launcher,
.export-launcher { margin-bottom: 16px; min-width: 0; }
.polish-instruction-field { flex: 2 1 300px; }
.segment-stats { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 14px; }
.segment-stat {
  padding: 4px 10px;
  border-radius: 999px;
  background: #f1f3f8;
  color: var(--muted);
  font-size: 12px;
}
.segment-stat.stat-changed { background: #e8edff; color: #4353c8; }
.segment-stat.stat-pending { background: #fff4e5; color: #9a5b00; }
.segment-stat.stat-accepted { background: #e7f7ef; color: #217a4c; }
.segment-stat.stat-rejected { background: #f1f3f8; color: #6b7280; }
.segment-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.segment-card {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  min-width: 0;
}
.segment-card.is-accepted { border-color: #cbe8d8; background: #fbfefc; }
.segment-card.is-rejected { opacity: .78; }
.segment-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 10px;
  font-size: 13px;
}
.segment-columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.segment-block {
  min-width: 0;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #f8f9fc;
}
.segment-block.is-polished { background: #f4f8ff; border-color: #dbe4ff; }
.segment-block-label { display: block; margin-bottom: 6px; color: var(--muted); font-size: 11px; }
.segment-text {
  margin: 0;
  max-height: 320px;
  overflow: auto;
  font-size: 14px;
  line-height: 1.75;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.segment-note { margin: 8px 0 0; color: var(--muted); font-size: 12px; overflow-wrap: anywhere; }
.segment-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.polish-job-list { max-height: calc(100vh - 250px); }

.export-form-row { align-items: flex-end; }
.export-options { display: flex; flex-wrap: wrap; gap: 10px 20px; padding: 10px 12px; border: 1px solid var(--border); border-radius: 9px; }
.export-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.export-card {
  border: 1px solid var(--border);
  border-left: 4px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  min-width: 0;
}
.export-card.is-completed { border-left-color: var(--ok); }
.export-card.is-failed { border-left-color: var(--danger); }
.export-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.export-title { display: flex; align-items: center; gap: 8px; min-width: 0; }
.export-title strong { overflow-wrap: anywhere; }
.format-badge {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: 6px;
  background: var(--primary-weak);
  color: var(--primary);
  font-size: 11px;
  font-weight: 700;
}
.export-meta { margin: 7px 0 0; color: var(--muted); font-size: 12px; overflow-wrap: anywhere; }
.export-options-line { margin: 5px 0 0; color: var(--muted); font-size: 12px; }
.export-error { margin: 7px 0 0; color: var(--danger); font-size: 12px; overflow-wrap: anywhere; }
.export-warnings { margin: 7px 0 0; padding-left: 18px; color: var(--warn); font-size: 12px; overflow-wrap: anywhere; }
.export-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.filter-inline { display: inline-flex; min-width: 0; }
.filter-inline select,
.filter-inline input { min-width: 130px; max-width: 220px; }

.tab-button {
  appearance: none;
  border: 0;
  background: transparent;
  color: var(--muted);
  padding: 7px 12px;
  border-radius: 8px;
  font: inherit;
  font-size: 13px;
  cursor: pointer;
}
.tab-button:hover { background: var(--primary-weak); color: var(--primary); }
.tab-button.is-active { background: var(--primary); color: #fff; }
.system-panel { min-width: 0; }
.runtime-strip { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
.runtime-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  max-width: 100%;
  padding: 7px 11px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--surface);
  color: var(--muted);
  font-size: 12px;
}
.runtime-chip strong { color: var(--text); font-weight: 600; overflow-wrap: anywhere; }
.runtime-chip.is-ok { border-color: #cbe8d8; background: #f7fdf9; }
.usage-panel,
.config-panel { margin-bottom: 16px; }
.quota-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
.quota-card {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 12px;
  min-width: 0;
}
.quota-card.is-exceeded { border-color: #efc7c2; background: #fff8f7; }
.quota-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 13px; }
.quota-head span { color: var(--muted); font-size: 12px; }
.quota-bar { height: 7px; margin: 9px 0 8px; border-radius: 999px; background: #eef1f7; overflow: hidden; }
.quota-fill { height: 100%; background: var(--primary); }
.quota-card.is-exceeded .quota-fill { background: var(--danger); }
.quota-value { margin: 0; font-size: 12px; overflow-wrap: anywhere; }
.quota-remaining { margin: 3px 0 0; color: var(--muted); font-size: 11px; }
.usage-summary { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.usage-writing {
  margin-top: 16px;
  padding: 16px;
  border: 1px solid #d9e1fb;
  border-radius: 12px;
  background: linear-gradient(180deg, #fbfcff, #f5f7ff);
}
.usage-section-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.usage-section-head h3 { margin: 0; font-size: 15px; }
.usage-section-head p { margin: 4px 0 0; color: var(--muted); font-size: 12px; }
.usage-chip {
  display: inline-flex;
  align-items: baseline;
  gap: 7px;
  padding: 5px 10px;
  border-radius: 8px;
  background: #f5f7fb;
  font-size: 12px;
  color: var(--muted);
}
.usage-chip strong { color: var(--text); }
.usage-rows { display: flex; flex-direction: column; gap: 4px; margin-top: 12px; }
.usage-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  gap: 12px;
  align-items: center;
  padding: 7px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  font-size: 12px;
}
.usage-row strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.usage-row span { color: var(--muted); }
.config-group { margin-bottom: 18px; }
.config-group:last-child { margin-bottom: 0; }
.config-group-title { margin: 0 0 10px; font-size: 14px; }
#save-config-btn { flex: 0 0 auto; white-space: nowrap; }
.config-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.config-row {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  padding: 11px;
  border: 1px solid var(--border);
  border-radius: 9px;
  min-width: 0;
}
.config-field { display: flex; flex-direction: column; gap: 5px; width: 100%; min-width: 0; }
.config-meta { margin: 0; color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }

.prompt-workbench,
.tool-workbench { grid-template-columns: 320px minmax(0, 1fr); }
.prompt-filters { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; margin: 12px 0 8px; }
.prompt-toolbar { margin-bottom: 10px; }
.file-button { display: inline-flex; align-items: center; cursor: pointer; }
.prompt-list,
.tool-list { max-height: calc(100vh - 340px); }
.prompt-content { min-height: 240px; resize: vertical; line-height: 1.7; }
.variables-input { min-height: 92px; resize: vertical; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
.prompt-form-actions { flex-wrap: wrap; }
.preview-variables { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.preview-variable { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.preview-output {
  margin: 12px 0 0;
  padding: 12px;
  max-height: 320px;
  overflow: auto;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #f8f9fc;
  font-size: 13px;
  line-height: 1.65;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.tool-config { min-height: 210px; resize: vertical; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; line-height: 1.55; }

.outline-ai-panel { margin-top: 16px; min-width: 0; }
.outline-ai-form { margin-bottom: 10px; }
.outline-ai-instruction { min-height: 88px; resize: vertical; line-height: 1.6; }
.outline-generation-list {
  list-style: none;
  margin: 10px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-height: 280px;
  overflow-y: auto;
}
.outline-ai-preview {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid var(--border);
  min-width: 0;
}
.outline-ai-preview-title { margin: 0 0 4px; font-size: 15px; overflow-wrap: anywhere; }
.outline-ai-tree {
  margin-top: 12px;
  padding: 12px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #f8f9fc;
  min-width: 0;
  overflow-wrap: anywhere;
}
.outline-ai-root { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.outline-ai-content { margin: 6px 0 0; color: var(--muted); font-size: 13px; line-height: 1.65; }
.outline-ai-volumes { margin: 10px 0 0; padding-left: 20px; display: flex; flex-direction: column; gap: 10px; }
.outline-ai-volume-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.outline-ai-chapters { margin: 7px 0 0; padding-left: 20px; display: flex; flex-direction: column; gap: 4px; }
.outline-ai-chapters li { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; font-size: 13px; }
.outline-ai-target { margin-left: auto; color: var(--muted); font-size: 11px; }

.toast {
  position: fixed;
  left: 50%;
  bottom: 24px;
  transform: translateX(-50%);
  background: #1f2430;
  color: #fff;
  padding: 10px 16px;
  border-radius: 10px;
  font-size: 13px;
  max-width: calc(100vw - 32px);
  z-index: 50;
  box-shadow: var(--shadow);
}
.toast.is-error { background: var(--danger); }

@media (max-width: 900px) {
  .workbench { grid-template-columns: 1fr; }
  .chapter-list { position: static; max-height: 240px; }
  .editor-textarea { min-height: 320px; }
  .character-workbench { grid-template-columns: 1fr; }
  .character-sidebar { position: static; }
  .character-list { max-height: 260px; }
  .outline-workbench { grid-template-columns: 1fr; }
  .outline-tree { max-height: 280px; }
  .quota-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .prompt-workbench,
  .tool-workbench { grid-template-columns: 1fr; }
  .prompt-list,
  .tool-list { max-height: 280px; }
}

@media (max-width: 768px) {
  .topbar { padding: 0 14px; gap: 12px; }
  .page { padding: 16px 14px 28px; }
  .page-title { font-size: 20px; }
  .project-grid { grid-template-columns: 1fr; }
  .project-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nav-group { flex: 1 1 100%; flex-wrap: wrap; border-right: 0; border-bottom: 1px solid #eef0f6; padding: 3px 0 5px; }
  .nav-group:last-child { border-bottom: 0; }
  .form-inline { flex-direction: column; align-items: stretch; }
  .form-inline > .field { flex: 0 0 auto; }
  .check-launcher .form-actions .btn { width: 100%; }
  .field-narrow { flex: 1 1 auto; }
  .editor-actions { width: 100%; }
  .editor-actions .btn { flex: 1 1 140px; }
  .auth-card { padding: 22px; }
  .character-content { min-height: 300px; }
  .character-form-actions .btn { flex: 1 1 120px; }
  .version-row { align-items: flex-start; flex-direction: column; }
  .version-row .btn { width: 100%; }
  .outline-move-row .btn { flex: 1 1 100px; }
  .outline-move-row select { width: 100%; max-width: none; }
  .check-type-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .diff-controls { grid-template-columns: 1fr; }
  .commit-row { flex-direction: column; }
  .commit-rollback { align-self: stretch; }
  .segment-columns { grid-template-columns: 1fr; }
  .quota-grid,
  .config-grid,
  .preview-variables { grid-template-columns: 1fr; }
  .prompt-filters { grid-template-columns: 1fr; }
  .filter-inline { width: 100%; }
  .filter-inline select,
  .filter-inline input { max-width: none; width: 100%; }
  .segment-actions .btn,
  .export-actions .btn,
  .prompt-form-actions .btn { flex: 1 1 120px; }
  .usage-row { grid-template-columns: 1fr; gap: 2px; }
  .outline-ai-volumes { padding-left: 16px; }
  .outline-ai-chapters { padding-left: 16px; }
  .outline-ai-target { margin-left: 0; }
}

/* BW-24 人物关系图谱 */
.graph-toolbar {
  display: flex;
  align-items: center;
  gap: 14px 18px;
  flex-wrap: wrap;
  padding: 14px 18px;
  margin-bottom: 16px;
}
.graph-stats { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; color: var(--muted); font-size: 13px; }
.graph-stats strong { color: var(--text); font-size: 15px; margin-right: 2px; }
.graph-missing { color: var(--warn); }
.graph-filter { display: flex; align-items: center; gap: 8px; margin-left: auto; font-size: 13px; color: var(--muted); white-space: nowrap; }
.graph-filter select { min-width: 132px; max-width: 180px; }
.graph-toolbar .hint { flex: 1 1 100%; margin: 0; }

.graph-workbench { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 16px; align-items: start; }
.graph-panel { padding: 0; overflow: hidden; min-width: 0; }
.graph-canvas {
  position: relative;
  height: clamp(340px, 56vh, 560px);
  overflow: hidden;
  touch-action: none;
  background: radial-gradient(circle at 50% 45%, #fbfcff 0, #f4f6fc 65%, #eef1f9 100%);
}
.graph-edges { position: absolute; inset: 0; width: 100%; height: 100%; }
.graph-nodes { position: absolute; inset: 0; pointer-events: none; }
.graph-edge { stroke: #b9c2d8; stroke-width: 1.6; }
.graph-edge-hit { fill: none; stroke: transparent; stroke-width: 14px; pointer-events: stroke; cursor: pointer; }
.graph-edge.status-ended,
.graph-edge.status-broken { stroke: #c4c9d6; stroke-dasharray: 5 5; }
.graph-edge.is-selected { stroke: var(--primary); stroke-width: 2.6; }
.graph-edge.is-dimmed { opacity: .18; }
.graph-edge-label {
  font-size: 11px;
  fill: #5b6478;
  paint-order: stroke;
  stroke: #f7f8fc;
  stroke-width: 3px;
  pointer-events: none;
}
.graph-edge-label.is-dimmed { opacity: .18; }
.graph-node {
  position: absolute;
  transform: translate(-50%, -50%);
  width: 118px;
  min-height: 46px;
  padding: 8px 10px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: center;
  border: 1px solid #cfd8ee;
  border-radius: 12px;
  background: #fff;
  box-shadow: 0 2px 8px rgba(20, 28, 45, 0.08);
  color: var(--text);
  font: inherit;
  text-align: center;
  cursor: grab;
  touch-action: none;
  pointer-events: auto;
}
.graph-node:hover { border-color: #9fb0e8; }
.graph-node.is-missing { border-style: dashed; border-color: #d8b26a; background: #fffdf6; }
.graph-node.is-locked { box-shadow: 0 0 0 2px #f1dfb8, 0 2px 8px rgba(20, 28, 45, 0.08); }
.graph-node.is-selected { border-color: var(--primary); box-shadow: 0 0 0 2px #c9d3ff, 0 6px 18px rgba(52, 84, 209, 0.22); }
.graph-node.is-dimmed { opacity: .25; }
.graph-node.is-dragging { cursor: grabbing; z-index: 3; opacity: .92; }
.graph-node-name {
  max-width: 100%;
  font-size: 13px;
  line-height: 1.25;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.graph-node-meta {
  max-width: 100%;
  font-size: 11px;
  line-height: 1.3;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.graph-node.is-locked .graph-node-meta { color: var(--warn); }
.graph-empty {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 24px;
  margin: 0;
  text-align: center;
}
.graph-detail { padding: 18px; min-width: 0; }
.graph-detail-list { display: grid; grid-template-columns: auto 1fr; gap: 6px 12px; margin: 14px 0; font-size: 13px; }
.graph-detail-list dt { color: var(--muted); }
.graph-detail-list dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.graph-detail-subtitle { margin: 16px 0 8px; font-size: 13px; font-weight: 600; color: var(--muted); }
.graph-relations { list-style: none; margin: 0 0 14px; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.graph-relation {
  width: 100%;
  padding: 8px 10px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: flex-start;
  border: 1px solid var(--border);
  border-radius: 9px;
  background: #fafbff;
  color: var(--text);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.graph-relation:hover { border-color: #b9c6f2; background: #f4f6ff; }
.graph-relation span { font-size: 12px; color: var(--muted); }
.graph-summary { margin: 0 0 12px; font-size: 13px; line-height: 1.65; color: #3c4453; }
.graph-legend { display: grid; grid-template-columns: 14px 1fr; gap: 8px; align-items: center; margin-top: 14px; font-size: 12px; color: var(--muted); }
.legend-dot { width: 10px; height: 10px; border-radius: 50%; background: #fff; border: 1px solid #cfd8ee; }
.legend-missing { border: 1px dashed #d8b26a; background: #fffdf6; }
.legend-locked { box-shadow: 0 0 0 2px #f1dfb8; }

@media (max-width: 900px) {
  .graph-workbench { grid-template-columns: 1fr; }
}

@media (max-width: 768px) {
  .graph-filter { margin-left: 0; width: 100%; }
  .graph-filter select { flex: 1 1 auto; max-width: none; width: 100%; }
  .graph-canvas { height: clamp(360px, 60vh, 480px); }
  .graph-node { width: 104px; padding: 7px 8px; }
}

/* BW-25 项目看板与全局导航 */
.back-btn { flex: 0 0 auto; }
.project-subnav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  margin: 0 0 16px;
  padding: 6px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 12px;
}
.nav-group { display: flex; align-items: center; gap: 2px; padding-right: 7px; border-right: 1px solid var(--border); }
.nav-group:last-child { border-right: 0; padding-right: 0; }
.nav-group-label { padding: 0 4px 0 2px; color: #8b93a7; font-size: 10px; letter-spacing: .08em; white-space: nowrap; }
.project-subnav a {
  padding: 6px 10px;
  border-radius: 8px;
  color: var(--muted);
  font-size: 13px;
  white-space: nowrap;
}
.project-subnav a:hover { background: #f4f6fb; text-decoration: none; }
.project-subnav a.is-active { background: var(--primary-weak); color: var(--primary); font-weight: 600; }

.dashboard-hero { display: flex; align-items: center; gap: 24px; padding: 22px; margin-bottom: 16px; }
.progress-ring {
  width: 112px;
  height: 112px;
  flex: 0 0 auto;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: conic-gradient(var(--primary) calc(var(--value, 0) * 1%), #e9edf7 0);
}
.progress-ring-inner {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  background: #fff;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.progress-ring-inner strong { font-size: 22px; line-height: 1.2; }
.progress-ring-inner span { font-size: 11px; color: var(--muted); }
.hero-copy { flex: 1 1 auto; min-width: 0; }
.hero-title-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.hero-title-row h2 { margin: 0; font-size: 22px; line-height: 1.3; overflow-wrap: anywhere; }
.hero-meta { margin: 6px 0 10px; color: var(--muted); font-size: 14px; }
.dashboard-progress { height: 10px; margin-bottom: 14px; }
.hero-facts { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; }
.hero-fact { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.hero-fact span { font-size: 11px; color: var(--muted); }
.hero-fact strong { font-size: 13px; font-weight: 600; overflow-wrap: anywhere; }

.dashboard-modules { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin-bottom: 16px; }
.dash-module {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--surface);
  color: var(--text);
}
.dash-module:hover { border-color: #b9c6f2; box-shadow: var(--shadow); text-decoration: none; }
.dash-module-label { font-size: 12px; color: var(--muted); }
.dash-module-value { font-size: 22px; line-height: 1.2; }
.dash-module-hint { font-size: 11px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dash-module.is-warn .dash-module-value { color: var(--warn); }

.dashboard-columns { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); gap: 16px; align-items: start; }
.dashboard-column { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.dash-card { padding: 16px 18px; }
.dash-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
.dash-card-head .panel-title { margin: 0; }
.dash-card-head a { font-size: 12px; }
.dash-note { font-size: 11px; color: var(--muted); }
.dash-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.dash-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 0; border-bottom: 1px dashed var(--border); color: var(--text); }
.dash-row:last-child { border-bottom: 0; }
a.dash-row:hover { color: var(--primary); text-decoration: none; }
.dash-row.is-static { align-items: flex-start; }
.dash-row-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.dash-row-main strong { font-size: 13px; font-weight: 600; overflow-wrap: anywhere; }
.dash-row-sub { font-size: 11px; color: var(--muted); }
.dash-row-meta { flex: 0 0 auto; font-size: 11px; color: var(--muted); white-space: nowrap; }
.dash-line-head { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.dash-line-head strong { font-weight: 500; }
.chapter-chips { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 3px; }
.chapter-chip {
  display: inline-flex;
  align-items: center;
  padding: 1px 7px;
  border-radius: 999px;
  background: #f1f4fb;
  color: #41527a;
  font-size: 11px;
  white-space: nowrap;
}
.chapter-chip:hover { background: #e6ebfa; text-decoration: none; }
.chapter-chip.is-missing { background: #f6f7fa; color: var(--muted); }
.chapter-chip.is-muted { background: transparent; color: var(--muted); }
.appearance-row { padding: 9px 0; border-bottom: 1px dashed var(--border); }
.appearance-row:last-child { border-bottom: 0; }
.appearance-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.appearance-head strong { font-size: 13px; }
.dash-task-list { margin-top: 6px; border-top: 1px dashed var(--border); padding-top: 6px; }

.dashboard-next { margin: 0 0 16px; padding: 20px; border-color: #cdd7fb; background: linear-gradient(180deg, #fbfcff, #f5f7ff); }
.dashboard-next-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.dashboard-next-lead { margin: 4px 0 0; color: var(--muted); font-size: 12px; }
.dashboard-next-primary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-top: 12px;
  padding: 16px 18px;
  border: 1px solid #b9c6f2;
  border-radius: 12px;
  background: #fff;
  color: var(--text);
}
.dashboard-next-primary strong { display: block; font-size: 17px; }
.dashboard-next-primary span { display: block; margin-top: 4px; color: var(--muted); font-size: 13px; }
.dashboard-next-primary .next-arrow { color: var(--primary); font-size: 22px; }
.dashboard-next-primary:hover { border-color: var(--primary); text-decoration: none; box-shadow: 0 4px 16px rgba(48, 78, 190, .08); }
.dashboard-next-secondary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 10px; }
.dashboard-next-action {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 12px;
  border: 1px solid var(--border);
  border-radius: 10px;
  color: var(--text);
  font-size: 13px;
  font-weight: 600;
}
.dashboard-next-action span { font-size: 11px; color: var(--muted); font-weight: 400; }
.dashboard-next-action:hover { border-color: #b9c6f2; text-decoration: none; }
.outline-path { margin: 0 0 12px; padding: 9px 12px; border-radius: 9px; background: #f7f8fc; color: var(--muted); font-size: 13px; overflow-wrap: anywhere; }
.outline-path strong { color: var(--text); }

/* BW-26 文笔示范 */
.style-picker {
  display: flex;
  align-items: center;
  gap: 10px 14px;
  flex-wrap: wrap;
  padding: 10px 12px;
  margin: 10px 0;
  border: 1px dashed var(--border);
  border-radius: 10px;
  background: #fafbff;
}
.style-picker-label { display: flex; align-items: center; gap: 8px; min-width: 0; font-size: 12px; color: var(--muted); }
.style-picker-label select { min-width: 160px; max-width: 260px; }
.style-manage-link { margin-left: auto; font-size: 12px; white-space: nowrap; }
.checkbox-field { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; line-height: 1.5; color: var(--muted); }
.checkbox-field input { margin-top: 3px; flex: 0 0 auto; }
.style-sample-content { min-height: 320px; resize: vertical; line-height: 1.8; font-size: 14px; }

/* BW-27 故事关联图 */
.story-stats { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 10px; padding: 14px 18px; margin-bottom: 14px; }
.story-stat { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.story-stat strong { font-size: 20px; line-height: 1.2; }
.story-stat span { font-size: 11px; color: var(--muted); }
.story-toolbar { display: flex; align-items: center; gap: 12px 16px; flex-wrap: wrap; padding: 12px 18px; margin-bottom: 14px; }
.story-filter { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--muted); white-space: nowrap; }
.story-filter select { min-width: 120px; }
.story-filter input { min-width: 150px; }
.story-toolbar .hint { flex: 1 1 100%; margin: 0; }
.story-workbench { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 16px; align-items: start; margin-bottom: 16px; }
.story-matrix-panel { padding: 16px 18px; min-width: 0; }
.matrix-scroll { max-width: 100%; overflow-x: auto; padding-bottom: 4px; }
.story-matrix { border-collapse: separate; border-spacing: 2px; font-size: 11px; }
.story-matrix th,
.story-matrix td { padding: 0; }
.matrix-corner {
  position: sticky;
  left: 0;
  z-index: 2;
  background: var(--surface);
  color: var(--muted);
  font-weight: 500;
  text-align: left;
  white-space: nowrap;
  padding: 4px 6px !important;
}
.matrix-chapter-head { text-align: center; }
.matrix-col-button {
  width: 28px;
  height: 24px;
  border: 0;
  border-radius: 6px;
  background: #f4f6fb;
  color: var(--muted);
  font-size: 10px;
  cursor: pointer;
}
.matrix-col-button.is-selected { background: var(--primary); color: #fff; }
.matrix-character-head {
  position: sticky;
  left: 0;
  z-index: 1;
  background: var(--surface);
  text-align: left;
}
.matrix-row-button {
  width: 122px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 1px;
  padding: 4px 6px;
  border: 0;
  border-radius: 6px;
  background: transparent;
  color: var(--text);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.matrix-row-button strong { font-size: 12px; max-width: 110px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.matrix-row-button span { font-size: 10px; color: var(--muted); }
tr.is-selected .matrix-row-button { background: var(--primary-weak); }
.matrix-cell-wrap { text-align: center; }
.matrix-cell {
  width: 28px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 2px;
  border: 1px solid #eef1f8;
  border-radius: 6px;
  background: #fcfdff;
  cursor: pointer;
}
.matrix-cell:hover { border-color: #b9c6f2; }
.matrix-cell.is-empty { background: transparent; border-color: transparent; }
.matrix-cell.is-signal { background: #fafbff; }
.matrix-mark { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
.matrix-mark.is-person { background: var(--primary); }
.matrix-state {
  min-width: 13px;
  padding: 0 3px;
  border-radius: 999px;
  background: #fdf5e6;
  color: var(--warn);
  font-size: 9px;
}
.matrix-signal { font-size: 9px; line-height: 1; padding: 1px 3px; border-radius: 4px; }
.matrix-signal.is-foreshadow { background: #eef1ff; color: var(--primary); }
.matrix-signal.is-payoff { background: #eaf7f0; color: var(--ok); }
.matrix-signal.is-timeline { background: #f1f4fb; color: #41527a; }
.matrix-signal.is-issue { background: #fdf5e6; color: var(--warn); }
.matrix-signal-label { font-size: 11px; color: var(--muted); padding: 4px 6px; }
.story-legend { display: flex; gap: 14px; flex-wrap: wrap; margin-top: 10px; font-size: 11px; color: var(--muted); }
.story-legend span { display: inline-flex; align-items: center; gap: 5px; }
.story-legend .matrix-mark.is-state { background: #f1c27d; }
.story-legend .matrix-mark.is-foreshadow { border-radius: 3px; background: var(--primary); }
.story-legend .matrix-mark.is-issue { border-radius: 3px; background: var(--warn); }

.story-detail { padding: 16px 18px; position: sticky; top: 72px; max-height: calc(100vh - 92px); overflow-y: auto; min-width: 0; }
.story-detail-body { display: flex; flex-direction: column; gap: 12px; }
.story-detail-section { display: flex; flex-direction: column; gap: 6px; }
.story-detail-subtitle { margin: 0; font-size: 12px; font-weight: 600; color: var(--muted); }
.story-detail-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; font-size: 12px; }
.story-detail-list li { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding-bottom: 5px; border-bottom: 1px dashed var(--border); overflow-wrap: anywhere; }
.story-detail-list li:last-child { border-bottom: 0; padding-bottom: 0; }
.story-detail-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 4px; }
.story-chips { display: flex; flex-wrap: wrap; gap: 5px; }
.story-chip {
  padding: 2px 8px;
  border: 1px solid #dfe5f3;
  border-radius: 999px;
  background: #f7f9ff;
  color: #41527a;
  font-size: 11px;
  font-family: inherit;
  cursor: pointer;
}
.story-chip:hover { border-color: #b9c6f2; color: var(--primary); }
.story-timeline-panel { padding: 16px 18px; }
.story-chapters { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.story-chapter-card { border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px; background: #fff; }
.story-chapter-card.is-selected { border-color: #b9c6f2; box-shadow: 0 0 0 2px var(--primary-weak); }
.story-chapter-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.story-chapter-title {
  border: 0;
  background: transparent;
  padding: 0;
  color: var(--text);
  font: inherit;
  font-weight: 600;
  font-size: 13px;
  text-align: left;
  cursor: pointer;
}
.story-chapter-title:hover { color: var(--primary); }
.story-chapter-tags { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 7px; }
.story-tag { padding: 1px 7px; border-radius: 999px; font-size: 10px; background: #f4f6fb; color: #41527a; }
.story-tag.is-foreshadow { background: #eef1ff; color: var(--primary); }
.story-tag.is-payoff { background: #eaf7f0; color: var(--ok); }
.story-tag.is-timeline { background: #f1f4fb; color: #41527a; }
.story-tag.is-state { background: #fdf5e6; color: var(--warn); }
.story-tag.is-relation { background: #f4f0ff; color: #6b4bb5; }
.story-tag.is-issue { background: #fdecea; color: var(--danger); }
.story-chapter-link { display: inline-block; margin-top: 7px; font-size: 11px; }

@media (max-width: 1000px) {
  .story-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .story-workbench { grid-template-columns: 1fr; }
  .story-detail { position: static; max-height: none; }
}

@media (max-width: 768px) {
  .story-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .story-filter { width: 100%; }
  .story-filter select,
  .story-filter input { flex: 1 1 auto; min-width: 0; width: 100%; }
  .story-chapter-head { align-items: flex-start; }
}

/* BW-28 DeepSeek 深度审阅 */
.review-panel {
  margin: 12px 0 16px;
  padding: 14px 16px;
  border: 1px solid #d6ddff;
  border-radius: 12px;
  background: linear-gradient(135deg, #f7f9ff 0, #ffffff 70%);
}
.review-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.review-head h3 { margin: 0; font-size: 15px; }
.review-overall { margin: 8px 0 12px; font-size: 13px; line-height: 1.8; color: #333b4a; }
.review-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.review-block h4 { margin: 0 0 6px; font-size: 12px; font-weight: 600; color: var(--muted); }
.review-block ul { margin: 0; padding-left: 18px; font-size: 12px; line-height: 1.7; }

@media (max-width: 768px) {
  .review-grid { grid-template-columns: 1fr; }
}

@media (max-width: 900px) {
  .dashboard-modules { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .dashboard-columns { grid-template-columns: 1fr; }
  .hero-facts { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .dashboard-next-actions { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 768px) {
  .dashboard-hero { flex-direction: column; align-items: flex-start; gap: 16px; }
  .dashboard-modules { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .hero-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .dashboard-next-actions { grid-template-columns: 1fr; }
  .dashboard-next-secondary { grid-template-columns: 1fr; }
  .dashboard-next-primary { align-items: flex-start; }
  .dash-row { align-items: flex-start; }
  .dash-row-meta { white-space: normal; text-align: right; }
  .style-picker-label { width: 100%; flex-direction: column; align-items: flex-start; }
  .style-picker-label select { width: 100%; max-width: none; }
  .style-manage-link { margin-left: 0; }
  .topbar { gap: 8px; }
  .brand { white-space: nowrap; font-size: 15px; }
  .topnav .nav-link:not(#system-link) { display: none; }
  .user-name { display: none; }
  .back-btn { padding: 4px 8px; font-size: 12px; }
}
