
/* ── Character page base scale ─────────────────────────────────── */
/* 125% via the root font-size (16px -> 20px), same approach as
   staff.css. Everything is sized in rem so it all scales together; the
   a11y Text Size chips override this inline on <html>. This used to be
   CSS `zoom`, which broke caret placement in text inputs on phones in
   "desktop mode" (typed text came out reversed) and mispositioned the
   Aa panel under browser/OS zoom. Size new things in rem, not px. */
:root:has(body.char-body) {
  font-size: 20px;
}
.char-body {
  overflow-x: hidden;
}

/* style.css is shared with the quiz (16px root) and staff (20px root)
   sites, so its few px sizes are scaled for character pages here. */
.char-body {
  --radius: 0.375rem;
  --radius-md: 0.375rem;
}
.char-body .card      { max-width: 30rem; }
.char-body .card-wide { max-width: 53.125rem; }
.char-body .btn       { min-width: 9.375rem; }
@media (max-width: 520px) {
  .char-body .btn     { min-width: 0; }
}
.char-body .avatar    { width: 3rem; height: 3rem; }
.char-body .avatar-sm { width: 2rem; height: 2rem; }

/* ── Accessibility: light theme override ─────────────────────────
   Scoped to .char-body so it only affects character pages, not the
   quiz/staff sections which share style.css's :root palette. ────── */
.char-body.theme-light {
  --bg: #F3EEE3;
  --surface: #FFFFFF;
  --surface2: #FBF6EA;
  --bg-surface: #FFFFFF;
  --bg-raised: #FBF6EA;
  --bg-overlay: rgba(0,0,0,0.035);
  --bg-void: #F3EEE3;

  --text: #241C12;
  --text-dim: rgba(36,28,18,0.62);
  --text-muted: rgba(36,28,18,0.62);
  --text-faint: rgba(36,28,18,0.38);

  --border: rgba(154,90,10,0.28);
  --border-bright: rgba(154,90,10,0.55);
  --border-dim: rgba(0,0,0,0.1);

  --amber: #8A5200;
  --amber-bright: #A6620A;
  --amber-dim: #C88A2A;
  --amber-glow: rgba(138,82,0,0.1);
  --accent: #8A5200;
  --accent-hover: #A6620A;

  --blood: #7A160C;
  --blood-bright: #A81F14;

  --success: #2E6B3A;
  --error: #7A1F12;
  --ok: #2E6B3A;
  --warn: #8A5A0A;
  --info: #1F5570;

  --badge-blue-text: #0C447C;
  --badge-green-text: #27500A;
  --badge-red-text: #791F1F;
  --badge-tan-text: #6B5628;

  --tie-green-text: #1F5A2E;
  --tie-amber-text: #7A4F0A;
  --tie-purple-text: #4A3F8C;
  --tie-red-text: #8C2A2A;
  --tie-gray-text: #5A5248;
}

/* ── Accessibility: readable/serif font overrides ────────────────
   Display font (headers/buttons) stays branded on purpose — only
   the reading fonts change. ─────────────────────────────────────── */
.char-body.font-readable {
  --font: 'Atkinson Hyperlegible', sans-serif;
  --font-ui: 'Atkinson Hyperlegible', sans-serif;
}

.char-body.font-serif {
  --font: Georgia, 'Times New Roman', serif;
  --font-ui: Georgia, 'Times New Roman', serif;
}

/* ── Nav bar (character pages) ─────────────────────────────────── */
.dl-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 1.25rem;
  height: 4rem;
  background: var(--bg-surface);
  border-bottom: 2px solid var(--amber-dim);
  box-shadow: 0 2px 1.25rem rgba(0,0,0,0.6), 0 1px 0 var(--border-bright);
  flex-shrink: 0;
  z-index: 10;
}

.dl-nav .nav-brand {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-family: var(--font-display);
  font-size: 1.4rem;
  letter-spacing: 0.08em;
  color: var(--amber);
  text-decoration: none;
}

.dl-nav .nav-logo {
  height: 2.625rem;
  width: 2.625rem;
  object-fit: contain;
  flex-shrink: 0;
  filter: drop-shadow(0 0 0.5rem var(--amber-glow));
}

.dl-nav .nav-right {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-size: 0.85rem;
  color: var(--text-dim);
}

.dl-nav .nav-badge {
  background: var(--blood);
  color: var(--text);
  font-family: var(--font-display);
  font-size: 0.65rem;
  letter-spacing: 0.1em;
  padding: 0.15rem 0.45rem;
  border-radius: var(--radius-md);
  border: 1px solid var(--blood-bright);
  text-transform: uppercase;
}

.dl-nav .nav-username { color: var(--text); font-weight: 600; }

.dl-nav .nav-logout {
  color: var(--text-faint);
  text-decoration: none;
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 0.2rem 0.55rem;
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  transition: all 0.15s;
}

.dl-nav .nav-logout:hover {
  color: var(--blood-bright);
  border-color: var(--blood);
  background: var(--danger-glow);
}

.dl-nav .avatar-sm {
  width: 2.125rem;
  height: 2.125rem;
  border-radius: 50%;
  border: 1px solid var(--border-dim);
}

/* ── Accessibility panel ──────────────────────────────────────── */
.a11y-toggle-btn {
  width: 2.125rem;
  height: 2.125rem;
  border-radius: 50%;
  background: var(--amber-glow);
  border: 1px solid var(--border-bright);
  color: var(--amber);
  font-family: var(--font-ui);
  font-size: 0.8rem;
  font-weight: 700;
  cursor: pointer;
  transition: all 0.15s;
}

.a11y-toggle-btn:hover { background: rgba(232,146,10,0.22); }

.a11y-panel {
  position: absolute;
  top: calc(100% + 0.5rem);
  right: 0;
  width: 12.5rem;
  background: var(--bg-raised);
  border: 1px solid var(--border-bright);
  border-radius: var(--radius-md);
  padding: 0.85rem;
  z-index: 50;
  box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.4);
}

.a11y-panel-label {
  font-family: var(--font-ui);
  font-size: 0.68rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-faint);
  margin: 0.75rem 0 0.4rem;
}

.a11y-panel-label:first-child { margin-top: 0; }

.a11y-chip-row { display: flex; gap: 0.4rem; }
.a11y-chip-col { display: flex; flex-direction: column; gap: 0.4rem; }

.a11y-chip {
  flex: 1;
  background: transparent;
  border: 1px solid var(--border-bright);
  border-radius: var(--radius-md);
  color: var(--text);
  font-family: var(--font-ui);
  font-size: 0.78rem;
  padding: 0.35rem 0.5rem;
  cursor: pointer;
  transition: all 0.15s;
}

.a11y-chip:hover { background: rgba(232,146,10,0.1); }

.a11y-chip.active {
  color: var(--amber);
  background: var(--amber-glow);
  border-color: var(--amber);
}

/* ── Page-level tab bar (Character / Build / Ties / Hooks) ─────── */
.char-page-tabs {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin-bottom: 1.5rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--border-dim);
}

.char-page-tab {
  background: transparent;
  border: 1px solid var(--border-dim);
  border-radius: 0.375rem;
  color: var(--text-dim);
  cursor: pointer;
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 0.6rem 1.15rem;
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  transition: all 0.15s;
}

.char-page-tab:hover {
  color: var(--amber);
  border-color: var(--border);
  background: var(--amber-glow);
}

.char-page-tab.active {
  color: #0A0806;
  background: var(--amber);
  border-color: var(--amber);
  font-weight: 700;
}

.char-page-tab.tab-locked {
  color: var(--text-faint);
}

.char-page-tab.tab-locked:hover {
  color: var(--text-dim);
  background: rgba(255,255,255,0.03);
}

.char-page-tab.char-tab-discussion {
  color: var(--amber);
  border-color: var(--border);
  background: var(--amber-glow);
}

.char-page-tab.char-tab-discussion:hover {
  background: rgba(232,146,10,0.22);
}

.char-page-tab.char-tab-discussion.active {
  color: #0A0806;
  background: var(--amber);
  border-color: var(--amber);
}

.char-page-tab.char-tab-finalize {
  background: var(--ok);
  color: #0A0806;
  border-color: var(--ok);
  font-weight: 700;
}

.char-page-tab.char-tab-finalize:hover {
  background: #5FBE71;
  border-color: #5FBE71;
  color: #0A0806;
}

.char-page-tab.char-tab-finalized {
  color: var(--ok);
  border-color: rgba(74,158,92,0.3);
  cursor: default;
}

.char-page-tab.char-tab-finalized:hover {
  background: transparent;
  border-color: rgba(74,158,92,0.3);
}

/* Staff's variant is an actual button (un-finalize on click), the
   player's is a static span, style them differently so only staff get
   an interactive-looking hover. */
button.char-page-tab.char-tab-finalized {
  cursor: pointer;
}

button.char-page-tab.char-tab-finalized:hover {
  background: rgba(74,158,92,0.15);
  border-color: var(--ok);
}

.tab-lock-icon {
  font-size: 0.75rem;
  opacity: 0.7;
}

.char-tab-optional-tag {
  font-family: var(--font-ui);
  font-size: 0.62rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: none;
  color: var(--text-dim);
  border: 1px solid var(--border);
  padding: 1px 0.375rem;
  border-radius: 0.5rem;
  margin-left: 0.4rem;
}

/* ── Build tab specific ─────────────────────────────────────────── */
.build-stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(8.75rem, 1fr));
  gap: 1.1rem;
}

.build-stat-field { display: flex; flex-direction: column; gap: 0.4rem; }

.build-stat-row {
  display: flex;
  align-items: center;
  gap: 0.65rem;
}

.build-stat-value {
  font-family: var(--font-mono);
  font-size: 1.1rem;
  color: var(--amber);
  min-width: 1.8rem;
  text-align: center;
}

.build-skill-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(13.75rem, 1fr));
  gap: 0.85rem;
}

.build-skill-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.65rem;
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 2px;
  padding: 0.55rem 0.85rem;
}

.build-skill-name { font-family: var(--font-ui); font-size: 0.88rem; color: var(--text); }

.build-skill-dots { display: flex; gap: 0.25rem; }

.skill-dot {
  width: 1.25rem; height: 1.25rem;
  border-radius: 2px;
  background: var(--bg-void);
  border: 1px solid var(--border-dim);
  cursor: pointer;
  transition: background 0.1s, border-color 0.1s;
}
.skill-dot.filled { background: var(--amber-dim); border-color: var(--amber); }
.skill-dot:hover  { border-color: var(--amber); }

.build-trait-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr));
  gap: 0.65rem;
}

.build-trait-chip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 2px;
  padding: 0.5rem 0.75rem;
  cursor: pointer;
  font-family: var(--font-ui);
  font-size: 0.85rem;
  color: var(--text-dim);
  transition: all 0.12s;
}

.build-trait-chip:hover { border-color: var(--amber-dim); }

.build-trait-chip.selected.trait-positive {
  border-color: var(--ok);
  background: rgba(74,158,92,0.1);
  color: #6ee07e;
}

.build-trait-chip.selected.trait-negative {
  border-color: var(--blood);
  background: rgba(158,42,26,0.1);
  color: #e07070;
}

.trait-cost {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  opacity: 0.85;
}

.trait-points-bar {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 2px;
  padding: 0.6rem 0.9rem;
  margin-bottom: 1rem;
  font-family: var(--font-display);
  font-size: 0.85rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--amber-dim);
}

.trait-points-bar .points-remaining { color: var(--amber); font-family: var(--font-mono); letter-spacing: normal; text-transform: none; }
.trait-points-bar .points-remaining.over-budget { color: var(--blood-bright); }

.build-locked-overlay {
  opacity: 0.55;
  pointer-events: none;
  filter: grayscale(0.3);
}

/* ── Badge text colors — dark-mode defaults (light overrides live in
   the .char-body.theme-light block above) ──────────────────────── */
.char-body {
  --badge-blue-text: #7ec8e3;
  --badge-green-text: #8fd460;
  --badge-red-text: #F06060;
  --badge-tan-text: #D4B87A;

  --tie-green-text: #7acf94;
  --tie-amber-text: #d4a030;
  --tie-purple-text: #9d8fe0;
  --tie-red-text: #d46060;
  --tie-gray-text: #9a9088;
}

/* ── Character review-status badges (used in staff queues) ─────── */
.char-badge-in_progress     { background: rgba(255,255,255,0.06); color: var(--text-dim); border-color: var(--border-dim); text-transform: capitalize; }
.char-badge-awaiting_review { background: var(--warn-glow); color: var(--amber-bright); border-color: var(--warn); text-transform: capitalize; }
.char-badge-in_discussion   { background: rgba(42,110,139,0.15); color: var(--badge-blue-text); border-color: var(--info); text-transform: capitalize; }
.char-badge-approved        { background: rgba(99,153,34,0.2); color: var(--badge-green-text); border-color: rgba(99,153,34,0.5); text-transform: capitalize; }
.char-badge-finalized       { background: rgba(99,153,34,0.2); color: var(--badge-green-text); border-color: rgba(99,153,34,0.5); text-transform: capitalize; }
.char-badge-rejected        { background: rgba(192,39,26,0.18); color: var(--badge-red-text); border-color: rgba(192,39,26,0.45); text-transform: capitalize; }
.char-badge-archived        { background: rgba(192,39,26,0.18); color: var(--badge-red-text); border-color: rgba(192,39,26,0.45); text-transform: capitalize; }

/* ── Roster-status badges (active / shelved / dead / retired) ──── */
.char-badge-active   { background: rgba(99,153,34,0.2); color: var(--badge-green-text); border-color: rgba(99,153,34,0.5); text-transform: capitalize; }
.char-badge-shelved  { background: rgba(232,146,10,0.15); color: var(--amber-bright); border-color: rgba(232,146,10,0.4); text-transform: capitalize; }
.char-badge-dead     { background: rgba(192,39,26,0.18); color: var(--badge-red-text); border-color: rgba(192,39,26,0.45); text-transform: capitalize; }
.char-badge-retired  { background: rgba(196,170,120,0.15); color: var(--badge-tan-text); border-color: rgba(196,170,120,0.4); text-transform: capitalize; }

/* ── Page layout shell ───────────────────────────────────────────── */
.char-layout {
  width: 100%;
  max-width: 75rem;
  margin: 0 auto;
  padding: 2rem 1.5rem 4rem;
  box-sizing: border-box;
}

.char-header {
  margin-bottom: 1.25rem;
}

.char-title {
  font-family: var(--font-display);
  font-size: 2.2rem;
  letter-spacing: 0.04em;
  color: var(--amber);
  text-transform: uppercase;
  margin: 0;
}

/* The character's actual name, shown as-typed rather than forced uppercase
   like the rest of this display-font heading style. Bebas Neue is a
   unicase display font with no real lowercase letterforms, so removing
   text-transform alone doesn't actually show mixed case, it needs a font
   that has real lowercase glyphs to display it visibly. */
.char-title.char-name-heading {
  font-family: var(--font-ui);
  font-weight: 700;
  letter-spacing: 0.01em;
  text-transform: none;
}

/* ── Character picker page ──────────────────────────────────────── */
.picker-layout {
  width: 100%;
  max-width: 75rem;
  margin: 0 auto;
  box-sizing: border-box;
  padding: 2rem 1.5rem 4rem;
}

.picker-header {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-bottom: 0.5rem;
}

.picker-slots-note {
  font-family: var(--font-ui);
  font-size: 0.82rem;
  color: var(--text-faint);
  margin-bottom: 1.75rem;
}

.picker-slots-note strong { color: var(--text-dim); }

.picker-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(16.25rem, 1fr));
  gap: 1.1rem;
}

.picker-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  padding: 1.1rem 1.2rem;
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  text-decoration: none;
  transition: all 0.15s;
  position: relative;
  overflow: hidden;
}

.picker-card:hover {
  border-color: var(--border-bright);
  box-shadow: 0 0.375rem 1.5rem rgba(0,0,0,0.35), 0 0 0 1px var(--border);
  transform: translateY(-2px);
}

.picker-card.roster-active   { border-left: 0.1875rem solid var(--ok); }
.picker-card.roster-shelved  { border-left: 0.1875rem solid var(--amber-dim); }
.picker-card.roster-dead      { border-left: 0.1875rem solid var(--blood); opacity: 0.75; }
.picker-card.roster-retired  { border-left: 0.1875rem solid var(--border-dim); opacity: 0.75; }

.picker-card-top {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 0.5rem;
}

.picker-card-name {
  font-family: var(--font-display);
  font-size: 1.3rem;
  letter-spacing: 0.02em;
  color: var(--text);
  line-height: 1.1;
}

.picker-card-meta {
  font-family: var(--font-ui);
  font-size: 0.78rem;
  color: var(--text-faint);
}

.picker-card-badges {
  display: flex;
  gap: 0.4rem;
  flex-wrap: wrap;
}

.picker-card-photo {
  width: 3.5rem; height: 3.5rem;
  border-radius: 2px;
  object-fit: cover;
  border: 1px solid var(--border-dim);
  flex-shrink: 0;
}

.picker-card-photo-placeholder {
  width: 3.5rem; height: 3.5rem;
  border-radius: 2px;
  background: var(--bg-overlay);
  border: 1px solid var(--border-dim);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: 1.1rem;
  color: var(--text-faint);
  flex-shrink: 0;
}

.picker-card-snippet {
  font-size: 0.82rem;
  color: var(--text-dim);
  line-height: 1.45;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.picker-card-row {
  display: flex;
  align-items: center;
  gap: 0.6rem;
}

.picker-create-card {
  background: transparent;
  border: 1px dashed var(--border-dim);
  border-radius: var(--radius-md);
  padding: 1.1rem 1.2rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  text-decoration: none;
  min-height: 8.75rem;
  transition: all 0.15s;
  color: var(--text-faint);
}

.picker-create-card:hover {
  border-color: var(--amber-dim);
  color: var(--amber);
  background: var(--amber-glow);
}

.picker-create-card-disabled {
  cursor: not-allowed;
  opacity: 0.6;
}

.picker-create-note {
  font-size: 0.75rem;
  color: var(--text-faint);
  text-align: center;
  text-transform: none;
  letter-spacing: normal;
}

.picker-create-icon {
  font-size: 1.8rem;
  line-height: 1;
}

.picker-create-label {
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

.picker-empty-state {
  text-align: center;
  padding: 3rem 1rem;
  color: var(--text-faint);
}

.picker-empty-state .picker-create-card {
  max-width: 17.5rem;
  margin: 1.25rem auto 0;
}

/* ── Character form ────────────────────────────────────────────── */
.char-form {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

.char-section {
  background: var(--bg-surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  padding: 1.5rem 1.5rem 1.75rem;
}

/* ── Stat pills (My Hooks / My Ties headers) ─────────────────────── */
.tie-stat-pill {
  display: inline-flex;
  align-items: center;
  font-family: var(--font-ui, sans-serif);
  font-size: 0.76rem;
  font-weight: 500;
  border-radius: 0.1875rem;
  padding: 2px 0.5625rem;
  white-space: nowrap;
  border: 1px solid;
}
.tie-stat-green  { color: var(--tie-green-text, #7acf94); background: rgba(40,120,60,0.15);  border-color: rgba(60,160,80,0.3); }
.tie-stat-amber  { color: var(--tie-amber-text, #d4a030); background: rgba(180,120,10,0.15); border-color: rgba(180,120,10,0.3); }
.tie-stat-purple { color: var(--tie-purple-text, #9d8fe0); background: rgba(90,70,160,0.15);  border-color: rgba(90,70,160,0.3); }

.char-section-title {
  font-family: var(--font-display);
  font-size: 1.35rem;
  letter-spacing: 0.05em;
  color: var(--amber);
  text-transform: uppercase;
  margin: 0 0 1.25rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--border-dim);
}

.char-divider {
  border: none;
  border-top: 1px solid var(--border-dim);
  margin: 0.75rem 0;
}

.char-field-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(13.75rem, 1fr));
  gap: 1rem;
}

.char-field {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  margin-bottom: 0.5rem;
}

.char-field-full {
  grid-column: 1 / -1;
}

.char-label {
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.04em;
  color: var(--text);
  text-transform: uppercase;
}

.char-label .required { color: var(--amber); }
.char-label .optional { color: var(--text-faint); font-size: 0.8rem; text-transform: none; letter-spacing: normal; }

.char-sublabel {
  font-family: var(--font-ui);
  font-size: 0.85rem;
  font-style: italic;
  color: var(--text-dim);
  line-height: 1.4;
  margin-bottom: 0.15rem;
}

.char-hint {
  font-size: 0.82rem;
  color: var(--text-dim);
  margin: 0 0 0.25rem;
  line-height: 1.4;
}

.char-input {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  color: var(--text);
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  padding: 0.55rem 0.75rem;
  transition: border-color 0.15s;
  width: 100%;
}

.char-input:focus {
  outline: none;
  border-color: var(--amber-dim);
}

.char-input:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.char-input::placeholder { color: var(--text-faint); }

.field-error {
  display: block;
  font-family: var(--font-ui);
  font-size: 0.78rem;
  color: var(--blood-bright);
  margin-top: 0.25rem;
  min-height: 1em;
}

.char-field-card.field-missing,
.char-input.field-missing,
.char-textarea.field-missing {
  border-color: var(--blood-bright) !important;
}

/* ── Narrative field cards ─────────────────────────────────────── */
.char-field-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  overflow: hidden;
  transition: border-color 0.15s;
  margin-bottom: 1rem;
}

.char-field-card:last-child {
  margin-bottom: 0;
}

.char-field-card:focus-within {
  border-color: var(--amber-dim);
}

.char-field-card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.65rem 1rem;
  background: var(--bg-raised);
  border-bottom: 1px solid var(--border-dim);
}

.char-field-card-title-group {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  flex: 1;
  min-width: 0;
}

.char-field-card-title {
  font-family: var(--font-display);
  font-size: 1rem;
  letter-spacing: 0.04em;
  color: var(--text);
  text-transform: uppercase;
  display: flex;
  align-items: center;
  gap: 0.4rem;
}

.char-field-card-sublabel {
  font-family: var(--font-ui);
  font-size: 0.85rem;
  font-style: italic;
  color: var(--text-dim);
  line-height: 1.4;
}

.char-field-card-title .required { color: var(--amber); }


.char-field-card .char-textarea {
  border: none;
  border-radius: 0;
  background: transparent;
  padding: 0.85rem 1rem;
}

.char-field-card .char-textarea:focus {
  outline: none;
}

.word-count {
  font-family: var(--font-ui);
  font-size: 0.75rem;
  color: var(--text-faint);
  text-align: right;
  padding: 0.3rem 1rem 0.5rem;
}

.word-count.over-limit {
  color: var(--blood-bright);
  font-weight: 600;
}

.char-textarea {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  color: var(--text);
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  padding: 0.6rem 0.75rem;
  resize: vertical;
  width: 100%;
  min-height: 5rem;
  line-height: 1.55;
  transition: border-color 0.15s;
}

.char-textarea:focus {
  outline: none;
  border-color: var(--amber-dim);
}

.char-textarea:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* ── Save bar ──────────────────────────────────────────────────── */
.char-save-bar {
  display: flex;
  align-items: center;
  gap: 1rem;
  margin-bottom: 1.25rem;
  flex-wrap: wrap;
}

.save-status {
  font-family: var(--font-ui);
  font-size: 0.85rem;
  color: var(--text-faint);
}

.save-status.save-ok { color: var(--ok); }
.save-status.save-error { color: var(--blood-bright); }

/* ── Buttons ───────────────────────────────────────────────────── */
.btn {
  font-family: var(--font-display);
  font-size: 0.9rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.5rem 1.1rem;
  border-radius: 0.1875rem;
  cursor: pointer;
  border: 1px solid var(--border-dim);
  background: var(--bg-raised);
  color: var(--text);
  transition: all 0.15s;
}

.btn:hover {
  border-color: var(--border-bright);
  background: var(--bg-overlay);
}

.btn-primary {
  background: var(--amber);
  color: #000;
  border-color: var(--amber);
  font-weight: 700;
  font-size: 1.1rem;
  padding: 0.65rem 1.5rem;
  text-shadow: none;
  letter-spacing: 0.08em;
}

.btn-primary:hover {
  background: var(--amber-bright);
  border-color: var(--amber-bright);
}

.btn-secondary {
  background: var(--bg-raised);
  border-color: var(--amber-dim);
  color: var(--amber);
}

.btn-secondary:hover {
  background: var(--amber-glow);
  border-color: var(--amber);
}

.btn-sm {
  font-size: 0.75rem;
  padding: 0.3rem 0.7rem;
}

.btn-revoke {
  background: var(--bg-raised);
  border-color: rgba(192,39,26,0.4);
  color: var(--blood-bright);
}

.btn-revoke:hover {
  background: rgba(192,39,26,0.15);
  border-color: var(--blood-bright);
}

.btn-detail {
  font-family: var(--font-ui);
  font-size: 0.8rem;
  color: var(--amber);
  text-decoration: none;
  border: 1px solid var(--amber-dim);
  padding: 0.2rem 0.6rem;
  border-radius: 0.1875rem;
  transition: all 0.15s;
}

.btn-detail:hover {
  background: var(--amber-glow);
  border-color: var(--amber);
}

/* ── Status banners ────────────────────────────────────────────── */
.char-submitted-banner {
  background: var(--warn-glow);
  border: 1px solid var(--warn);
  border-radius: var(--radius-md);
  padding: 0.85rem 1.1rem;
  margin-bottom: 1rem;
  font-size: 0.9rem;
  color: var(--amber-bright);
  line-height: 1.45;
}

.char-approved-banner {
  background: var(--ok-glow);
  border-color: var(--ok);
  color: #6ee07e;
}

.char-rejected-banner {
  background: var(--danger-glow);
  border-color: var(--blood);
  color: #e07070;
}

.char-unread-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  flex-wrap: wrap;
  background: var(--amber-glow, rgba(232,146,10,0.1));
  border: 1px solid var(--amber-dim);
  border-left: 0.1875rem solid var(--amber);
  border-radius: var(--radius-md);
  padding: 0.65rem 1rem;
  margin-bottom: 1rem;
  font-size: 0.88rem;
  color: var(--text);
}

.char-mentor-flag-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  flex-wrap: wrap;
  background: var(--danger-glow, rgba(168,31,20,0.12));
  border: 1px solid var(--blood-bright);
  border-left: 0.1875rem solid var(--blood-bright);
  border-radius: var(--radius-md);
  padding: 0.65rem 1rem;
  margin-bottom: 1rem;
  font-size: 0.88rem;
  color: var(--text);
  line-height: 1.5;
}

.char-mentor-flag-banner button {
  flex-shrink: 0;
}

.char-unread-banner button {
  flex-shrink: 0;
}

.char-unread-banner a {
  color: var(--amber);
  font-weight: 600;
  white-space: nowrap;
  text-decoration: none;
  margin-left: 0.6rem;
}

.char-unread-banner a:hover {
  text-decoration: underline;
}

.char-review-note {
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-left: 0.1875rem solid var(--amber-dim);
  border-radius: var(--radius-md);
  padding: 0.75rem 1rem;
  margin-bottom: 1rem;
  font-size: 0.88rem;
  color: var(--text-dim);
  line-height: 1.45;
}

/* ── Collapsible "what is this?" explainer ────────────────────────── */
.char-explainer {
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-left: 0.1875rem solid var(--amber-dim);
  border-radius: var(--radius-md);
  padding: 0.65rem 1rem;
  margin-bottom: 1.25rem;
  font-size: 0.88rem;
  color: var(--text-dim);
  line-height: 1.55;
}
.char-explainer summary {
  cursor: pointer;
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.03em;
  color: var(--amber);
  text-transform: uppercase;
  list-style: none;
}
.char-explainer summary::-webkit-details-marker { display: none; }
.char-explainer summary::before { content: "▸ "; }
.char-explainer[open] summary::before { content: "▾ "; }
.char-explainer-body { margin-top: 0.65rem; }
.char-explainer-body p { margin: 0 0 0.65rem; }
.char-explainer-body p:last-child { margin-bottom: 0; }
.char-explainer-body ul { margin: 0.4rem 0 0.65rem 1.15rem; padding: 0; }
.char-explainer-body li { margin-bottom: 0.3rem; }
.char-explainer-body strong { color: var(--text); }
.char-explainer-body a { color: var(--amber-bright); }
.char-explainer-body a:hover { text-decoration: none; }

/* ── Language chips ────────────────────────────────────────────── */
.lang-row {
  display: flex;
  align-items: center;
  gap: 1rem;
  flex-wrap: wrap;
}

.lang-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
}

.lang-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  background: var(--ok-glow);
  border: 1px solid var(--ok);
  border-radius: 0.1875rem;
  padding: 0.35rem 0.75rem;
  font-size: 0.95rem;
  color: #6ee07e;
  font-weight: 500;
}

.lang-chip.static-chip {
  color: #6ee07e;
  border-color: var(--ok);
  background: var(--ok-glow);
}

.chip-remove {
  background: none;
  border: none;
  color: var(--text-faint);
  cursor: pointer;
  font-size: 1.1rem;
  line-height: 1;
  padding: 0 0.15rem;
}

.chip-remove:hover { color: var(--blood-bright); }

.lang-chip .sec-icon-btn { width: 1.125rem; height: 1.125rem; }
.lang-chip .sec-badge { font-size: 0.62rem; padding: 2px 0.3125rem; }

.lang-add-row {
  display: flex;
  gap: 0.5rem;
  align-items: center;
  flex-shrink: 0;
}

/* ── Image + Description row ───────────────────────────────────── */
.image-description-row {
  display: flex;
  gap: 1.5rem;
  align-items: flex-start;
}

.image-column {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  flex-shrink: 0;
  width: 12.5rem;
}

.description-column {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  flex: 1;
  min-width: 0;
}

.description-column .char-textarea {
  flex: 1;
  min-height: 13.75rem;
  height: 100%;
  margin-top: 0.35rem;
}

@media (max-width: 600px) {
  .image-description-row { flex-direction: column; }
}

/* ── Description mode toggle ──────────────────────────────────── */
.desc-panel { display: none; }
.desc-panel.active { display: block; }

.desc-mode-switch {
  display: inline-flex;
  background: var(--surface2);
  border: 1px solid var(--border-dim);
  border-radius: 62.4375rem;
  padding: 0.1875rem;
  gap: 2px;
  margin-top: 0.35rem;
  margin-bottom: 0.35rem;
}

.desc-mode-btn {
  font-family: var(--font-ui);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--text-dim);
  background: transparent;
  border: none;
  border-radius: 62.4375rem;
  padding: 0.4rem 0.9rem;
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}

.desc-mode-btn:hover { color: var(--text); }

.desc-mode-btn.active {
  background: var(--amber);
  color: #1A1006;
}

.desc-mode-btn:disabled {
  cursor: not-allowed;
  opacity: 0.5;
}

.description-column .guided-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1px;
  background: var(--border-dim);
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  overflow: hidden;
  margin-top: 0.35rem;
}

.description-column .guided-field {
  background: var(--bg-raised);
  padding: 0.6rem 0.75rem;
}

.description-column .guided-field.span-2 {
  grid-column: 1 / -1;
}

.description-column .guided-label {
  display: block;
  font-family: var(--font-display);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-dim);
  margin-bottom: 0.3rem;
}

.description-column .guided-input {
  font-family: var(--font-ui);
  font-size: 0.9rem;
  color: var(--text);
  background: var(--bg-surface);
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  padding: 0.4rem 0.55rem;
  width: 100%;
  transition: border-color 0.15s;
}

.description-column .guided-input:focus {
  outline: none;
  border-color: var(--amber-dim);
}

.description-column .guided-input:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

.description-column textarea.guided-input {
  resize: none;
  overflow: hidden;
  line-height: 1.5;
  font-family: var(--font-ui);
}

@media (max-width: 480px) {
  .description-column .guided-grid { grid-template-columns: 1fr; }
}

/* ── Photo upload ──────────────────────────────────────────────── */
.photo-upload-area {
  margin-top: 0.65rem;
}

.photo-preview {
  width: 100%;
  height: auto;
  object-fit: cover;
  border-radius: 0.1875rem;
  border: 1px solid var(--border-dim);
}

.photo-controls-row {
  display: flex;
  align-items: center;
  gap: 0.25rem;
  margin-top: 0.5rem;
  flex-wrap: nowrap;
}

.photo-ctrl-btn {
  font-family: var(--font-display);
  font-size: 0.875rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 0.375rem 0.75rem;
  border-radius: 0.1875rem;
  cursor: pointer;
  white-space: nowrap;
  border: 1px solid var(--amber-dim);
  transition: all 0.15s;
}

.photo-ctrl-secondary {
  background: var(--bg-raised);
  color: var(--amber);
}

.photo-ctrl-secondary:hover {
  background: var(--amber-glow);
  border-color: var(--amber);
}

.photo-ctrl-primary {
  background: var(--amber);
  color: #0A0806;
  border-color: var(--amber);
  font-weight: 700;
}

.photo-ctrl-primary:hover {
  background: var(--amber-bright);
  border-color: var(--amber-bright);
}

.photo-placeholder {
  width: 100%;
  aspect-ratio: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg-raised);
  border: 1px dashed var(--border-dim);
  border-radius: 0.1875rem;
  font-size: 0.82rem;
  color: var(--text-faint);
  text-align: center;
  line-height: 1.3;
}

/* ── Hook cards ────────────────────────────────────────────────── */
.hook-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-dim);
  border-radius: var(--radius-md);
  padding: 0.85rem 1rem;
}

.hook-card-header {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  flex-wrap: wrap;
}

.hook-rel-type {
  font-family: var(--font-display);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  color: var(--amber);
  text-transform: uppercase;
}

.hook-status-in_progress { border-left: 0.1875rem solid var(--border-dim); }
.hook-status-open { border-left: 0.1875rem solid var(--ok); }
.hook-status-pending_approval { border-left: 0.1875rem solid var(--amber-dim); }
.hook-status-approved { border-left: 0.1875rem solid var(--ok); }
.hook-status-filled { border-left: 0.1875rem solid var(--info); }

.hook-badge-in_progress { color: var(--text-dim); font-size: 0.78rem; text-transform: capitalize; }
.hook-badge-open { color: #6ee07e; font-size: 0.78rem; text-transform: capitalize; }
.hook-badge-pending_approval { color: var(--amber-bright); font-size: 0.78rem; text-transform: capitalize; }
.hook-badge-approved { color: #6ee07e; font-size: 0.78rem; text-transform: capitalize; }
.hook-badge-filled { color: #7ec8e3; font-size: 0.78rem; text-transform: capitalize; }

.open-hooks-list {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  max-height: 31.25rem;
  overflow-y: auto;
  padding-right: 0.25rem;
}

.open-hooks-list::-webkit-scrollbar { width: 0.375rem; }
.open-hooks-list::-webkit-scrollbar-track { background: transparent; }
.open-hooks-list::-webkit-scrollbar-thumb { background: var(--border-dim); border-radius: 0.1875rem; }
.open-hooks-list::-webkit-scrollbar-thumb:hover { background: var(--amber-dim); }

/* ── Select input ──────────────────────────────────────────────── */
.char-select {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  color: var(--text);
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  padding: 0.55rem 0.75rem;
  width: 100%;
  transition: border-color 0.15s;
}

.char-select:focus {
  outline: none;
  border-color: var(--amber-dim);
}

/* ── Badge (shared) ────────────────────────────────────────────── */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-family: var(--font-display);
  font-size: 0.7rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.15rem 0.55rem;
  border-radius: 0.1875rem;
  border: 1px solid transparent;
}
.badge-ties-pending { background: rgba(180,120,10,0.15); color: #d4a030; border-color: rgba(180,120,10,0.3); }

/* ── Toast notification ────────────────────────────────────────── */
.char-toast {
  position: fixed;
  top: -3.75rem;
  left: 50%;
  transform: translateX(-50%);
  background: #1a1410;
  border: 1px solid rgba(186,117,23,0.35);
  border-left: 0.1875rem solid var(--amber);
  color: var(--amber);
  /* var(--font-display) (Bebas Neue) is unicase, it has no real lowercase
     letterforms, so any message shown here would visually render as if
     it were all-caps regardless of its actual text. Using the UI font
     instead so toast messages actually display in the case they're written. */
  font-family: var(--font-ui);
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  padding: 0.65rem 1.5rem;
  border-radius: 0 0 0.25rem 0.25rem;
  z-index: 9999;
  opacity: 0;
  transition: top 0.35s ease, opacity 0.35s ease;
  pointer-events: none;
  white-space: nowrap;
  box-shadow: 0 2px 0.75rem rgba(0,0,0,0.3);
}
.char-toast.visible {
  top: 0;
  opacity: 1;
}

/* ── Staff action panel ─────────────────────────────────────────── */
.staff-action-panel {
  background: var(--bg-raised);
  border: 1px solid var(--border-dim);
  border-radius: 0.25rem;
  padding: 0.85rem 1rem;
  margin-bottom: 1rem;
}
.staff-action-row { display: flex; gap: 0.5rem; flex-wrap: wrap; align-items: center; }
/* .btn-primary is intentionally larger everywhere else (it's the main CTA
   on player-facing pages like "Submit for Review"), but staff action rows
   mix primary/secondary/pass/revoke buttons together and looked mismatched
   sitting side by side, so this row normalizes them all to one size. */
.staff-action-row .btn {
  font-size: 0.85rem;
  padding: 0.55rem 1.2rem;
}
.staff-action-hints {
  margin-top: 0.65rem;
  padding-top: 0.6rem;
  border-top: 1px solid var(--border-dim);
}
.staff-action-hints p {
  font-size: 0.78rem;
  color: var(--text-dim);
  margin: 0 0 0.25rem;
  line-height: 1.35;
}
.staff-action-hints strong { color: var(--text); }

.staff-status-toggle {
  display: none;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  background: none;
  border: none;
  color: var(--amber);
  font-family: var(--font-ui);
  font-size: 0.9rem;
  font-weight: 600;
  padding: 0;
  cursor: pointer;
}
.staff-status-toggle-chevron { transition: transform 0.15s; }
.staff-action-panel.open .staff-status-toggle-chevron { transform: rotate(180deg); }

.char-page-tabs-toggle {
  display: none;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  background: var(--amber);
  border: 1px solid var(--amber);
  border-radius: 0.375rem;
  color: #0A0806;
  font-family: var(--font-display);
  font-size: 0.95rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 700;
  padding: 0.6rem 1.15rem;
  cursor: pointer;
  margin-bottom: 1.5rem;
}
.char-page-tabs-toggle-chevron { transition: transform 0.15s; }
.char-page-tabs-wrap.open .char-page-tabs-toggle-chevron { transform: rotate(180deg); }

@media (max-width: 860px) {
  .staff-status-toggle { display: flex; }
  .staff-action-row, .staff-action-hints { display: none; }
  .staff-action-panel.open .staff-action-row { display: flex; margin-top: 0.75rem; }
  .staff-action-panel.open .staff-action-hints { display: block; }

  /* Swap the horizontal tab row for a tap-to-open dropdown list, same
     interaction as the staff status toggle above, rather than a scrolling
     row that gives no visual cue it can be swiped. */
  .char-page-tabs-toggle { display: flex; }
  .char-page-tabs {
    display: none;
    flex-direction: column;
    flex-wrap: nowrap;
    gap: 0.4rem;
    margin-bottom: 1.5rem;
    padding: 0.75rem;
    background: var(--bg-raised);
    border: 1px solid var(--border-dim);
    border-radius: 0.375rem;
  }
  .char-page-tabs-wrap.open .char-page-tabs { display: flex; }
  .char-page-tab { width: 100%; justify-content: flex-start; }
}

/* ── Section review controls (staff inline) ────────────────────── */
.char-label-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.sec-ctrl { display: flex; gap: 0.25rem; }
.sec-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.625rem;
  height: 1.625rem;
  border-radius: 0.1875rem;
  border: none;
  cursor: pointer;
  transition: all 0.12s;
}
.sec-icon-approve {
  background: rgba(34,197,94,0.12);
  color: #22c55e;
  border: 1px solid rgba(34,197,94,0.25);
}
.sec-icon-approve:hover { background: #22c55e; color: var(--bg); }
.sec-icon-revise {
  background: rgba(232,146,10,0.1);
  color: var(--amber);
  border: 1px solid rgba(232,146,10,0.2);
}
.sec-icon-revise:hover { background: var(--amber); color: var(--bg); }
.sec-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.1875rem;
  font-family: var(--font-ui);
  font-size: 0.7rem;
  font-weight: 600;
  padding: 0.1875rem 0.5rem;
  border-radius: 0.1875rem;
}
.sec-badge-approved {
  color: #22c55e;
  background: rgba(34,197,94,0.1);
  border: 1px solid rgba(34,197,94,0.2);
}
.sec-badge-revise {
  color: var(--amber);
  background: rgba(232,146,10,0.08);
  border: 1px solid rgba(232,146,10,0.2);
}

/* ── Prior-chapter toggle ──────────────────────────────────────── */
.char-toggle-row {
  display: flex;
  gap: 0;
  border: 1px solid var(--border-dim);
  border-radius: 0.1875rem;
  overflow: hidden;
  width: fit-content;
}
.char-toggle-btn {
  font-family: var(--font-ui);
  font-size: 0.85rem;
  padding: 0.45rem 1rem;
  background: var(--bg-raised);
  color: var(--text-faint);
  border: none;
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.char-toggle-btn + .char-toggle-btn { border-left: 1px solid var(--border-dim); }
.char-toggle-btn.active {
  background: var(--amber-dim);
  color: var(--bg);
  font-weight: 600;
}
.char-toggle-btn:disabled { opacity: 0.5; cursor: not-allowed; }

.char-toggle-caption {
  font-family: var(--font-ui);
  font-size: 0.75rem;
  color: var(--text-dim);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  white-space: nowrap;
}
.char-toggle-row-sm .char-toggle-btn-sm {
  padding: 0.3rem 0.65rem;
  font-size: 0.78rem;
}

/* ── Languages: sublabel + polyglot toggle stacked underneath ─────── */
.lang-line {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.5rem;
}
.lang-line .char-sublabel { margin-bottom: 0; }
.polyglot-inline {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  cursor: help;
}
