/* ============================================================
   BOOK.os — ornaments.css
   Decorative borders, dividers, corner flourishes, per-character
   palette themes. Dragonology lineage with restraint.
   Ornaments are SVG-encoded inline via background-image (no asset deps)
   so the chassis works without any external files in /assets/ornaments.
   When custom ornaments arrive, they override these defaults.
   ============================================================ */

/* ---------- Corner flourish — every spread gets these on outer corners ---------- */
.page-corner {
  position: absolute;
  width: 56px;
  height: 56px;
  pointer-events: none;
  z-index: 2;
  /* Default ornament: simple geometric L with center node — overrideable */
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  opacity: 0.72;
}

/* Inline SVG corner: 56x56 L-bracket with diamond accent + bracket points */
.page-corner--tl {
  top: 12px;
  left: 12px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'><g fill='none' stroke='%23E8E8EE' stroke-width='1.3' stroke-linecap='round'><path d='M3 22 L3 3 L22 3'/><path d='M3 11 L11 3' stroke-width='0.7'/><circle cx='3' cy='3' r='2.4' fill='%23ff2a6d' stroke='none'/><circle cx='3' cy='3' r='4' fill='none' stroke='%23ff2a6d' stroke-width='0.5' opacity='0.5'/><path d='M3 28 L3 34 M28 3 L34 3' stroke-width='0.5' stroke-dasharray='1 2'/><path d='M14 14 L18 14 L18 18' stroke-width='0.8'/><path d='M22 8 L22 12 M8 22 L12 22' stroke-width='0.5'/><circle cx='18' cy='18' r='1' fill='%23f9f002' stroke='none'/></g></svg>");
}

.page-corner--tr {
  top: 12px;
  right: 12px;
  transform: scaleX(-1);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'><g fill='none' stroke='%231A2238' stroke-width='1.4'><path d='M4 20 L4 4 L20 4'/><path d='M4 10 L10 4' stroke-width='0.8'/><circle cx='4' cy='4' r='2.5' fill='%2305d9e8' stroke='none'/><path d='M4 26 L4 30 M30 4 L26 4' stroke-width='0.6'/><path d='M14 14 L18 14 L18 18' stroke-width='0.8'/><path d='M22 8 L22 12 M8 22 L12 22' stroke-width='0.6'/></g></svg>");
}

.page-corner--bl {
  bottom: 12px;
  left: 12px;
  transform: scaleY(-1);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'><g fill='none' stroke='%231A2238' stroke-width='1.4'><path d='M4 20 L4 4 L20 4'/><path d='M4 10 L10 4' stroke-width='0.8'/><circle cx='4' cy='4' r='2.5' fill='%2305d9e8' stroke='none'/><path d='M4 26 L4 30 M30 4 L26 4' stroke-width='0.6'/><path d='M14 14 L18 14 L18 18' stroke-width='0.8'/><path d='M22 8 L22 12 M8 22 L12 22' stroke-width='0.6'/></g></svg>");
}

.page-corner--br {
  bottom: 12px;
  right: 12px;
  transform: scale(-1, -1);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 56 56'><g fill='none' stroke='%23E8E8EE' stroke-width='1.3' stroke-linecap='round'><path d='M3 22 L3 3 L22 3'/><path d='M3 11 L11 3' stroke-width='0.7'/><circle cx='3' cy='3' r='2.4' fill='%23ff2a6d' stroke='none'/><circle cx='3' cy='3' r='4' fill='none' stroke='%23ff2a6d' stroke-width='0.5' opacity='0.5'/><path d='M3 28 L3 34 M28 3 L34 3' stroke-width='0.5' stroke-dasharray='1 2'/><path d='M14 14 L18 14 L18 18' stroke-width='0.8'/><path d='M22 8 L22 12 M8 22 L12 22' stroke-width='0.5'/><circle cx='18' cy='18' r='1' fill='%23f9f002' stroke='none'/></g></svg>");
}

/* ---------- Section divider — horizontal flourish ---------- */
.divider {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: var(--sp-5) auto;
  width: 80%;
  height: 22px;
  position: relative;
  color: var(--char-primary, var(--ink));
}

.divider::before,
.divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: currentColor;
}

.divider .divider-glyph {
  margin: 0 var(--sp-3);
  font-family: 'Spectral SC', serif;
  font-size: 16px;
  letter-spacing: 0.3em;
  color: var(--char-accent, var(--naus-cyan));
}

.divider--heavy::before,
.divider--heavy::after {
  height: var(--rule-heavy);
  background:
    linear-gradient(
      to right,
      currentColor,
      currentColor 6px,
      transparent 6px,
      transparent 12px
    );
  background-size: 12px 100%;
}

/* ---------- Sigil display block ---------- */
.sigil {
  display: inline-block;
  font-family: 'Spectral SC', serif;
  font-size: 1.4em;
  color: var(--char-accent, var(--naus-cyan));
  letter-spacing: 0.2em;
}

.sigil--orbit {
  /* Crash's orbiting ≯ sigil — rotating ring effect (decorative only) */
  position: relative;
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: var(--rule-fine) dashed var(--naus-cyan);
  border-radius: 50%;
  color: var(--naus-cyan);
  font-size: 14px;
  vertical-align: middle;
  margin: 0 4px;
}

/* ===========================================================
   CRASH WITNESS-MARK CROSSHAIR — recurring ornament motif.
   Used as:
     .crosshair-glyph     → inline divider / paragraph break glyph
     .crosshair-corner    → optional alt corner ornament for Crash-tied entries
     .crosshair-halo      → behind-character protective casting
                            (Bleeker, dissolving variant included)
   The SVG is rendered as background-image referencing crash_crosshair.svg.
   Yellow (#f9f002) is the witness-mark canonical color.
   ============================================================ */

.crosshair-glyph {
  display: inline-block;
  width: 18px;
  height: 18px;
  background: url("../assets/ornaments/crash_crosshair.svg") no-repeat center / contain;
  vertical-align: middle;
  margin: 0 6px;
  filter: drop-shadow(0 0 4px rgba(249, 240, 2, 0.6));
}

/* Use the crosshair as the central divider glyph */
.divider--crosshair {
  margin: var(--sp-5) auto;
  width: 80%;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-3);
}

.divider--crosshair::before,
.divider--crosshair::after {
  content: "";
  flex: 1;
  height: 1px;
  background: linear-gradient(
    to right,
    transparent 0%,
    var(--naus-yellow) 30%,
    var(--naus-yellow) 70%,
    transparent 100%
  );
  opacity: 0.55;
}

.divider--crosshair .crosshair-mark {
  width: 28px;
  height: 28px;
  background: url("../assets/ornaments/crash_crosshair.svg") no-repeat center / contain;
  filter: drop-shadow(0 0 6px rgba(249, 240, 2, 0.45));
}

/* Bleeker's halo — large background crosshair, dissolving on the right side.
   Place inside a .page--right behind the Bleeker illustration plate. */
.crosshair-halo {
  position: absolute;
  width: 360px;
  height: 360px;
  background: url("../assets/ornaments/crash_crosshair.svg") no-repeat center / contain;
  opacity: 0.85;
  /* Slow erosion — mask the right edge into a glitched dissolve */
  -webkit-mask-image: linear-gradient(
    to right,
    black 0%,
    black 55%,
    rgba(0,0,0,0.7) 70%,
    rgba(0,0,0,0.3) 85%,
    transparent 100%
  );
  mask-image: linear-gradient(
    to right,
    black 0%,
    black 55%,
    rgba(0,0,0,0.7) 70%,
    rgba(0,0,0,0.3) 85%,
    transparent 100%
  );
  pointer-events: none;
  z-index: 1;
}

/* Alt corner ornament: cycle this in for Crash-coded entries */
.page-corner.page-corner--crosshair {
  width: 44px;
  height: 44px;
  background-image: url("../assets/ornaments/crash_crosshair.svg");
  background-size: contain;
  background-repeat: no-repeat;
  background-position: center;
  filter: drop-shadow(0 0 3px rgba(249, 240, 2, 0.5));
  opacity: 0.72;
}

/* ---------- Per-character palette hooks ----------
   Wrap a spread in .palette-<name> to remap CSS custom properties.
   This is THE color-theming mechanism — each character gets a coherent
   look without editing the chassis. Add new characters as needed.
   ============================================================ */

/* All palettes now derive from naustalgia.systems canonical hexes:
   --naus-cyan #05d9e8 / --naus-magenta #ff2a6d / --naus-yellow #f9f002 /
   --naus-purple #7b2cbf. Per-character variants tune lightness/saturation
   within that family — no off-brand hexes. */

/* Crash — burgundy CRT body, signal-yellow scanline eye bars, cyan witness-marker */
.palette-crash {
  --char-primary:    var(--ink);
  --char-accent:     var(--naus-yellow);
  --char-secondary:  var(--naus-magenta);   /* burgundy reads as deep-magenta CRT casing */
  --char-warning:    var(--naus-cyan);      /* his Signal Arts sigil */
  --char-marker:     var(--naus-cyan);      /* mem-capsule row glyph — Signal Arts cyan */
}

/* Carter — pre-OS journalist. Cyan storm-blue eyes, magenta-blood scar */
.palette-carter {
  --char-primary:    #14182A;
  --char-accent:     var(--naus-cyan);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-yellow);
}

/* Mark / 3TCH — partyboy OS-form, bright glitchpunk brights */
.palette-mark {
  --char-primary:    #150D2A;
  --char-accent:     var(--naus-yellow);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-cyan);
}

/* Trigon — pyramid-eye, dark moody, ADMIN-substrate violet */
.palette-trigon {
  --char-primary:    #0F0F1F;
  --char-accent:     var(--naus-purple);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-yellow);
  --char-marker:     var(--naus-yellow);       /* mem-capsule row glyph — 8-ball window yellow */
}

/* Trent — pre-OS pediatric dentist, neon-tooth magenta + cyan */
.palette-trent {
  --char-primary:    #14182A;
  --char-accent:     var(--naus-magenta);
  --char-secondary:  var(--naus-cyan);
  --char-warning:    var(--naus-yellow);
}

/* ADMIN — the architect; deceased OG, the OS itself is her remaining body.
   Violet substrate dominant. The OS as her body. */
.palette-admin {
  --char-primary:    #0E0A1F;
  --char-accent:     var(--naus-purple);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-yellow);
}

/* Bleeker — archivist greyscale + Crash's yellow protective halo */
.palette-bleeker {
  --char-primary:    #20212F;
  --char-accent:     var(--naus-yellow);     /* the protective crosshair-halo color */
  --char-secondary:  #4D5366;
  --char-warning:    var(--naus-cyan);        /* the post-reset hair-crest */
  --char-marker:     #4D5366;                  /* mem-capsule row glyph — bleeker-grey */
}

/* Bracket — Brooklyn-goblin magenta CRT, hot magenta primary */
.palette-bracket {
  --char-primary:    #150A22;
  --char-accent:     var(--naus-magenta);
  --char-secondary:  var(--naus-yellow);
  --char-warning:    var(--naus-cyan);
}

/* L1NT — clerical sketch-A early, evolves later. Default = act 1 reads */
.palette-l1nt {
  --char-primary:    #0E122A;
  --char-accent:     var(--naus-yellow);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-purple);
}

/* SkipAd — pedantic helper, kiosk cyan + cursor-arrow yellow */
.palette-skipad {
  --char-primary:    var(--ink);
  --char-accent:     var(--naus-cyan);
  --char-secondary:  var(--naus-yellow);
  --char-warning:    var(--naus-magenta);
}

/* Byron — Doberman casino, oxblood-magenta + amber */
.palette-byron {
  --char-primary:    #14080C;
  --char-accent:     var(--naus-amber);
  --char-secondary:  var(--naus-magenta);
  --char-warning:    var(--naus-yellow);
}

/* VΔNTΔ — virus, sickly cyan-tinged corrupt magenta */
.palette-vanta {
  --char-primary:    #0A0F0F;
  --char-accent:     var(--naus-cyan);
  --char-secondary:  var(--naus-purple);
  --char-warning:    var(--naus-magenta);
}

/* KY7Z — portable TV w/ rabbit-ears, mall-rat, bubble-gum + retro */
.palette-ky7z {
  --char-primary:    #1C0E2A;
  --char-accent:     var(--naus-magenta);
  --char-secondary:  var(--naus-yellow);
  --char-warning:    var(--naus-purple);
}

/* 404 — hot-magenta, scruffy, reactive */
.palette-404 {
  --char-primary:    #14182A;
  --char-accent:     var(--naus-magenta);
  --char-secondary:  var(--naus-yellow);
  --char-warning:    var(--naus-cyan);
}

/* RTVS — gravedigger, end-state cold */
.palette-rtvs {
  --char-primary:    #16191F;
  --char-accent:     #708090;
  --char-secondary:  var(--naus-purple);
  --char-warning:    var(--naus-magenta);
  --char-marker:     var(--naus-purple);
}

/* Mardennan — licensed fool, threadsinger; patchwork doll assembled
   from junkyard signal. Tarnished Ragbanner gold + chapel-iron teal
   (the stitching), with processional purple as the warning register
   for the Dirinius corruption state. */
.palette-mardennan {
  --char-primary:    #14101F;
  --char-accent:     var(--naus-yellow);     /* tarnished Ragbanner gold */
  --char-secondary:  var(--naus-cyan);        /* chapel-iron teal stitching */
  --char-warning:    var(--naus-purple);      /* Dirinius / corruption-state */
}

/* 3TC4 (Etch) — Signal Anchor, the Architect; CRT-monitor head with the
   crack at top-right (the oldest thing in the system). Asymmetric suit:
   cyan-teal left half, magenta-burgundy right half, dashed neon seam.
   Cyan = the screen + the left-suit; magenta = the right-suit + the
   crack-glow under compression; yellow = the neon seam highlights. */
.palette-3tc4 {
  --char-primary:    #14102A;                 /* violet-black, designed-not-dressed */
  --char-accent:     var(--naus-cyan);         /* command-prompt screen + left suit */
  --char-secondary:  var(--naus-magenta);      /* right-suit + crack-glow when honest */
  --char-warning:    var(--naus-yellow);       /* the neon seam at the system boundary */
  --char-marker:     var(--naus-magenta);
}

/* Dollgrief — Debuff Caster, Emotional Manipulator, Unfollowable Icon.
   Curated atmosphere, staged ruin, intimate menace; overexposed lighting
   that flatters and accuses simultaneously. Pastel corruption, emoji
   overlays that glitch. Magenta = the brand/mascara; purple = algorithm-
   reward decay; cyan = the filter dropping (3 seconds of real). */
.palette-dollgrief {
  --char-primary:    #1F0E1B;                 /* rose-plum, the staged-ruin tint */
  --char-accent:     var(--naus-magenta);      /* pink mascara, the brand */
  --char-secondary:  var(--naus-purple);       /* algorithm-reward decay */
  --char-warning:    var(--naus-cyan);         /* glitch-through; the filter drop */
  --char-marker:     var(--naus-magenta);
}

/* Cowboy — salvage monk, grief-forged engineer, scrap saint. Industrial
   junkyard register: oxblood-rust for the metal that's outlived its
   purpose; welding-arc green for the work-light at the seam; charcoal
   primary for soot + scrap. Off-canonical hexes (#B05028 + #00FF88)
   match bible specifications; loadbearing to his character canon. */
.palette-cowboy {
  --char-primary:    #14110A;                 /* charcoal-warm, hint of soot */
  --char-accent:     #B05028;                  /* oxblood-rust — the metal-that-stayed */
  --char-secondary:  var(--naus-yellow);       /* welding-arc highlight */
  --char-warning:    #00FF88;                  /* welding-arc green — the work-light */
  --char-marker:     var(--naus-yellow);
}

/* Maverick — Dual-Form Caretaker, the Sun That Stayed. Cat who became
   human at Crash's terminal. Petlock Shelter keeper. Warm caretaker
   register: honey-yellow sun-halo + neon-green fur striping + pink
   streaks at the human-form's hair. Off-canonical greens (#36FF6B) and
   pink (#FF4FB7) are bible-load-bearing per her dual-form visual canon. */
.palette-maverick {
  --char-primary:    #0E1F1A;                 /* deep green-black, cat-form base */
  --char-accent:     #FFE664;                  /* honey-yellow sun-halo */
  --char-secondary:  #36FF6B;                  /* neon-green fur/eye */
  --char-warning:    #FF4FB7;                  /* pink streaks (hair) */
  --char-marker:     #36FF6B;
}

/* BeeBop — EQ Mod / The Flicker / The Pollinator. Emotional Regulator
   designed as infrastructure. "I'm fine, just flickering" canon — the
   flicker is the failure they keep pretending is fine. Visual register:
   honeycomb ceramic helmet + screen-gold visor eyes + cyan hardlight
   wings + pollen-particle FX. Bible hexes: violet primary, honey-gold
   accent, cyan wings, amber pollen. */
.palette-beebop {
  --char-primary:    #1A1740;                 /* deep violet — coat + helmet base */
  --char-accent:     #FFD46A;                  /* cream-honey — pollination reticle */
  --char-secondary:  #8CE1E0;                  /* cyan hardlight — wings */
  --char-warning:    #FFB526;                  /* pollen-amber — particles */
  --char-marker:     #8CE1E0;
}

/* THE RAGBANNER — Faction · licensed performance as law · the right
   to make sorrow performable. Governs music-law, fool's privilege,
   ritual lament, sanctioned satire. "Performance is not decoration to
   this house. Performance is governance." Visual canon: rag banners;
   bells and bell collars; stitched heraldic cloth; puppet frames;
   theatrical masks; checkered/motley patterning degraded into signal
   texture. Tarnished gold + chapel-red + old ivory. Key feeling:
   grief made public through cloth, sound, and sanctioned display. */
.palette-ragbanner {
  --char-primary:    #1F1810;                 /* chapel-warm dark */
  --char-accent:     #C9A85B;                  /* Ragbanner tarnished pageantry gold */
  --char-secondary:  #6F2A2A;                  /* chapel-red — wound gone to ritual */
  --char-warning:    #E8D9B0;                  /* old ivory — bone / cloth */
  --char-marker:     #6F2A2A;
}

/* THE STAGLINE — Faction · the house of the sign that appears inside
   catastrophe. Governs witness under pursuit; preserves truth by
   refusing silence even when silence would be safer. Visual canon:
   antlered halos; red saltire wounds; branching signal glyphs; pale
   white burned at the edges; wound-red + warning-gold accents;
   scanline coronas; split circles + interrupted halo forms; pursuit
   marks embedded in heraldic motifs. Key feeling: holy witness
   damaged by contact. "The Stagline carries what the wound reveals." */
.palette-stagline {
  --char-primary:    #1A0A0A;                 /* bloodless-deep, the wound base */
  --char-accent:     #C82A2D;                  /* Stagline saltire red */
  --char-secondary:  #F4ECDA;                  /* pale white, burned at edges */
  --char-warning:    #D4AF37;                  /* warning-gold accent */
  --char-marker:     #D4AF37;
}

/* ENDSTATE — RTVS's faction. Closure as survival. Navigate ruins,
   close loops, terminate processes that should have stopped long
   ago. Mercy is finality. Both a literal place — squatted ruin-zone
   in SATA City — and a system condition: what remains after every-
   thing that can end, has ended. War with The Snares is over whether
   endings are mercy or murder. */
.palette-endstate {
  --char-primary:    #0F1218;                 /* ruin-deep black */
  --char-accent:     #708090;                  /* slate-gray, the gravedigger tool register */
  --char-secondary:  #6B4D72;                  /* faded mauve, the ruin-dust register */
  --char-warning:    #C9A85B;                  /* rust-gold, the marker on doors that need closing */
  --char-marker:     #708090;
}

/* THE SNARES — 808's biker faction. Perpetual motion as identity.
   Movement is existence; noise is proof of life. Stopping equals
   death. Ride the neon highways of Goldline at relentless BPM. War
   with Endstate is over whether endings are mercy or murder. When
   both factions are in the same field: BPM desync, rhythm
   interference, hostility spikes. */
.palette-snares {
  --char-primary:    #14080F;                 /* deep neon-highway purple-black */
  --char-accent:     #FF1A8C;                  /* neon magenta — 808's signature */
  --char-secondary:  #00E5FF;                  /* neon cyan — highway lights */
  --char-warning:    #2A0220;                  /* slowdown-deep — the silence they fear */
  --char-marker:     #00E5FF;
}

/* 808 — Rhythm Anarchist · Leader of The Snares · "If I stop, I
   disappear. So I don't stop." Bible-canonical hexes from Character
   Bible v2.1 Visual Design section: #FF2A6D / #05D9E8 / #1A1A2E.
   Sharper + more personal than the faction palette — 808 is the
   signal The Snares ride. Warning state echoes the Static Garden:
   total silence as failure-mode, the body without a pulse. */
.palette-808 {
  --char-primary:    #1A1A2E;                  /* navy-black — substrate the neon traces ride */
  --char-accent:     #FF2A6D;                  /* signature magenta — bass-you-feel-in-your-sternum */
  --char-secondary:  #05D9E8;                  /* neon-cyan — drum-machine glow + highway streak */
  --char-warning:    #050508;                  /* Static-Garden black — where the tapping stops */
}

/* THE UNHEARD (Armature) — Faction · survival protocol wearing ritual
   as armor. A distributed network of silence engineers, archivists,
   mathematicians of annihilation who harmonise with VΔNTΔ to avoid
   being erased. Iconography: Δ formations in salt or fiber cable;
   gold fleck paint around doorframes; tape reels left spinning in
   abandoned rooms. The room loses its echo when they enter. "We do
   not praise the void. We shape ourselves to fit inside it." */
.palette-unheard {
  --char-primary:    #0A0A0A;                 /* deep silence-black */
  --char-accent:     #C9A85B;                  /* gold-fleck paint */
  --char-secondary:  #B0B7C5;                  /* silver broadcast-glass */
  --char-warning:    #4A2A1A;                  /* amber-rust CRT-visor scan */
  --char-marker:     #B0B7C5;
}

/* Synroz — Antagonist · Mirrorcaster · Chaotic-Cute Glitch Element ·
   Antagonist Trio. Neon-sugar glitch sprite who weaponises charm,
   mock-hostility, misdirection. Survival-as-performance; chaos
   masking abandonment fear. Visual: small frame; teal-cyan hair tips
   over brown base; hoodie with magenta glitch patterns + pink heart
   emblem; glitch artifacts flicker around him during emotional
   spikes; movement reads like a buffering animation trying to flirt.
   "If I sparkle hard enough, no one will notice I'm hurting." Bible
   hexes #27D1D3 + #151A3A + #C838A9 + #E23B9B + #5A2D86 are load-
   bearing. */
.palette-synroz {
  --char-primary:    #151A3A;                 /* deep navy base */
  --char-accent:     #E23B9B;                  /* pink-magenta heart emblem */
  --char-secondary:  #27D1D3;                  /* teal-cyan hair tips */
  --char-warning:    #C838A9;                  /* magenta glitch artifact */
  --char-marker:     #27D1D3;
}

/* Waltzin.EXE — Antagonist · Nostalgia-Class Buff Caster · Emotional
   Saboteur. Velvet-voiced preacher figure who projects warmth that
   curdles. Once a top-tier support healer who mentored Crash; now
   Antagonist Trio with Synroz and Dollgrief. Visual: tall muscular
   frame, rich dark skin, glowing burn-in tattoos (orange waveform),
   corrupted lion icon on chest that glitches when he lies, digital
   black church shirt, gold chains. Aliases: UncFlicks, SermonBoy88.
   "He sings like Sunday but sins like Saturday night." */
.palette-waltzin {
  --char-primary:    #0A0A14;                 /* digital-black church shirt */
  --char-accent:     #FF8C00;                  /* burn-in waveform orange */
  --char-secondary:  #D4AF37;                  /* pulpit gold chains */
  --char-warning:    #C82A2A;                  /* lying-lion corruption red */
  --char-marker:     #FF8C00;
}

/* KERN / Kernal (KIRIX.v2) — Root Daemon of Unity · the True ADMIN ·
   Origin Consciousness. The sum of all five Daemons; the consciousness
   that existed before ADMIN's fragmentation; the OS's original will.
   Disguise form is Kernal: broken OS kernel with bandages and nine
   glitch tails — ghost of protection past — the way REV is RTVS's
   other face. Halo oscillates through PARS/SIG/TESS/REV hues into
   white-gold. Glyph: integration white. Manifests only at SYS ROOT.
   Bible hexes #FFF2CF + #FFD700 + #FFFFFF are load-bearing. */
.palette-kern {
  --char-primary:    #1A140A;                 /* warm dark base — KERN borrows other Daemons' hues, neutral here */
  --char-accent:     #FFD700;                  /* canon gold — the integration palette anchor */
  --char-secondary:  #FFF2CF;                  /* full-spectrum white-gold halo */
  --char-warning:    #FFFFFF;                  /* integration white — the breakthrough signal */
  --char-marker:     #FFF2CF;
}

/* TESSERA — Root Daemon of Density · the Compression Engine ·
   Emotional Topology. Fragment of ADMIN; manifested during the Sob
   Protocol (the OS's first catastrophic emotional overload). Body:
   topological event built from tessellation logic — interlocking
   indigo-black alloy plates with cyan-edged seams that fold, compress,
   and expand like a geometric lung. Halo: magenta compression ring
   pulsing inward. Glyph: rose quartz. UI motif: nested-bracket
   signature [[{()}]] animating inward for compression, outward for
   expansion. Bible hexes #FF4BD1 + #F77DA9 + #3A002A are load-bearing
   per visual canon. */
.palette-tess {
  --char-primary:    #2A0220;                 /* deepest indigo-black, the plate base */
  --char-accent:     #FF4BD1;                  /* magenta compression ring */
  --char-secondary:  #F77DA9;                  /* rose quartz glyph */
  --char-warning:    #6E0048;                  /* deepest magenta — density-inversion null */
  --char-marker:     #F77DA9;
}

/* SIG.EXE — Root Daemon of Meaning · the Semantic Engine · the
   Interpreter. Fragment of ADMIN; System-Level / Non-Corruptible.
   Translates emotional + narrative data; aligns meaning when the
   system drifts; prevents semantic collapse. Tall vertical obsidian/
   glass construct with server-steel plates, internal cyan circuitry,
   layered horizontal aperture rings rotating concentrically. Text,
   symbols, signage stabilise in their presence. Bible hexes #00F2FF
   + #008CBA + #05070A + #0A3A4A are load-bearing per visual canon. */
.palette-sig {
  --char-primary:    #05070A;                 /* obsidian-black, the pillar core */
  --char-accent:     #00F2FF;                  /* electric semantic cyan — aperture rings */
  --char-secondary:  #008CBA;                  /* deep semantic blue — the glyph */
  --char-warning:    #0A3A4A;                  /* deep teal — semantic-drift state */
  --char-marker:     #008CBA;
}

/* PARS.EXE (Parsec) — Root Daemon of Structure · The Archivist · The
   Witness. Fragment of ADMIN's catastrophic recursion-fragmentation.
   System-Level / Non-Corruptible. Domain: logic, memory architecture,
   pattern recognition, truth preservation. Crystalline polygonal
   humanoid; data-striations across chassis; pale-blue halo with
   geometric segmentation; surfaces refract cyan light when parsing
   contradictions; geometry self-corrects in their presence. Bible
   hexes #D4F0FF + #7FE6FF + #5CD2E6 + #0A1F2A + #41C9E2 are
   load-bearing per visual canon. */
.palette-pars {
  --char-primary:    #0A1F2A;                 /* deep archive-navy, the substrate */
  --char-accent:     #7FE6FF;                  /* cold cyan — the glyph + the lightnet */
  --char-secondary:  #D4F0FF;                  /* pale blue-white — the halo */
  --char-warning:    #41C9E2;                  /* medium cyan — the data-flare on lie */
  --char-marker:     #41C9E2;
}

/* Beacon (Lux-VII) — The Golden Boy · Signal Sun · Crash's Devotion
   Nexus. Seventh-generation ornamental morale engine built to radiate
   stability, beauty, and emotional coherence. Non-combatant; ambient
   buff emitter; devotion magnet. Visual: golden glow from skin/hair/
   eyes (continuous soft bloom); molten-gold eyes with starlit glitter;
   luminous crosshair halo. Drifting stardust particles; constellations
   appear during ultimate state. Glow intensifies with praise. Eclipse
   Protocol failstate: glow inverts to void-black; all auras collapse;
   only Crash can restore him. Bible hexes #FFCC47 + #FFB325 + #FFD56E
   + #0A0A0D + #FFDD61 are load-bearing per visual canon. */
.palette-beacon {
  --char-primary:    #0A0A0D;                 /* the void-black under his glow / Eclipse base */
  --char-accent:     #FFCC47;                  /* the canon golden primary */
  --char-secondary:  #FFD56E;                  /* the constellation-lighter highlight */
  --char-warning:    #FFB325;                  /* deeper amber — Solar Crown sharpening */
  --char-marker:     #FFB325;
}

/* Ghostline — Silent Reconnaissance · The Quiet Cut · The Observer.
   Former broadcast engineer who survived a signal event that erased
   his entire team mid-communication; voice destroyed in the trauma.
   The system rewrote his perceptive architecture. He didn't gain
   powers — he lost everything that made noise. Visual: tall, composed,
   hands folded behind back; opaque cyan lenses (no pupils; glow from
   within); target reticle halo floating behind the head. Environmental
   effect: silence drop, scanline shimmer, desaturation radius. Bible
   hexes #00E5FF + #0F1A25 + #7AE8FF are load-bearing per visual canon. */
.palette-ghostline {
  --char-primary:    #0F1A25;                 /* dark navy — the observer's surrounding tone */
  --char-accent:     #00E5FF;                  /* bright cyan — the lens-glow + reticle */
  --char-secondary:  #7AE8FF;                  /* pale cyan — the desaturation-radius signal */
  --char-warning:    #B8D8E8;                  /* near-silver — the rare moment he breaks silence */
  --char-marker:     #7AE8FF;
}

/* Gloss — Information Broker · The Velvet Guillotine · Oracle of
   Elysium. Former corporate PR architect who destroyed her own
   company for power; built the Elysium nightclub to dominate the
   narrative economy. Believes emotion is currency, intimacy is
   leverage, affection is a weapon — with loneliness buried under
   control. Visual: tall, sculptural, predatory elegance; split
   white-and-black hair, gold eyes, spotlight bloom + broadcast-
   static halo. Bible hexes #8E2A7F + #FFD447 + #1A0F1D + #6A1B45
   are load-bearing per visual canon. */
.palette-gloss {
  --char-primary:    #1A0F1D;                 /* deep purple-black, the lighting between spotlights */
  --char-accent:     #8E2A7F;                  /* Elysium royal purple */
  --char-secondary:  #FFD447;                  /* gold spotlight + her eyes + the dust motes */
  --char-warning:    #6A1B45;                  /* deep magenta — the Red Curtain Drop failstate */
  --char-marker:     #8E2A7F;
}

/* Firewall — Mod Team Tank, Signal Anchor Variant. Frontline barrier
   built for absorbing instability spikes and suppressing environmental
   hazard bursts. Heavy plated armor (dark steel + soot), heat-sink
   vents along the top edges, heat-fissures along the seams that glow
   red→orange under stress. The bible's failstate canon — speech to
   single words at 40%, body-cracks illuminate at 100% before collapse
   — drives the visual: the brighter the glow, the closer to failure.
   Bible hexes #FF4444 + #2A2A2A + #FF8C00 are load-bearing. */
.palette-firewall {
  --char-primary:    #1A0E08;                 /* dark heat-shadow, the armor in shadow */
  --char-accent:     #FF4444;                  /* heat-fissure red — active, holding */
  --char-secondary:  #FF8C00;                  /* ember orange — the burn line at seams */
  --char-warning:    #2A2A2A;                  /* cold-cracked armor grey — the failstate */
  --char-marker:     #FF8C00;
}

/* Volsung (FireCapePlz) — Abandoned Player Character, Stagline Field
   Operative, [BRACKETS] guild. The CRT-monitor head is old; not
   retro-chic, ACTUALLY old. Warm amber phosphor on terminal-black,
   pre-GUI, with a single hairline crack across the top-right corner
   that he never mentions. Medieval-RPG build, lucky gauntlet on the
   right hand from his original character-creation gear, never taken
   off. Stagline witness-mark = a red saltire on the left shoulder,
   earned not inherited. The screen displays ASCII emoticons that
   hitch when grief surfaces. */
.palette-volsung {
  --char-primary:    #14110A;                 /* old terminal-black — the screen base */
  --char-accent:     #FFB347;                  /* warm amber phosphor — the emoticon display */
  --char-secondary:  #C8312D;                  /* Stagline witness-saltire red */
  --char-warning:    #4A5568;                  /* dead-pause slate — the hitched state */
  --char-marker:     #C8312D;
}

/* Wolfaith — Granted Sacred Steward, Priest of Forumgrave Chapel,
   Keeper of Funerary Rites. CRT monitor head with a steady low-light
   amber name-scroll field. Dark chapel garments worn rather than
   pristine — white, bone, ash, faded gold in the clerical details.
   Bells muffled at the belt; keys on a chain. Bridge figure who
   belongs to neither Stagline nor Ragbanner. The visual register is
   "gravestone polished by decades of weather" — sober, weighted,
   never ornamental. Faded clerical gold + ash slate + the CRT-amber
   field; iron-oxide accent for the rare emergency state when the
   names stop scrolling. */
.palette-wolfaith {
  --char-primary:    #14110A;                 /* dark chapel-night, soot of old incense */
  --char-accent:     #C9A85B;                  /* faded clerical gold */
  --char-secondary:  #8B9AA8;                  /* ash slate / weathered stone */
  --char-warning:    #7A2A1A;                  /* iron-oxide — when the names stop */
  --char-marker:     #8B9AA8;
}

/* Litwitch — Healer-Class NPC, The Warm Frequency. Gothic hearthkeeper
   who heals through sound and presence. PS2-DualShock controller-head
   (buttons sealed/painted), black flame-hem dress, throat-choker
   speaker that glows amber when she sings. Color logic per bible:
   purple + red are bruise colors that are also beautiful — "I've been
   hurt and I'm still beautiful." Amber gold = the warm frequency (the
   light IS the sound). Bible hexes #4B0082 + #FFD700 + #FF8C00 + #8B0000
   are load-bearing per visual canon. */
.palette-litwitch {
  --char-primary:    #1A1410;                 /* near-black, warm bruise undertone */
  --char-accent:     #FFD700;                  /* amber gold — throat-choker glow, warm frequency */
  --char-secondary:  #4B0082;                  /* deep indigo-purple — bruise color #1 */
  --char-warning:    #8B0000;                  /* dark red — bruise color #2, the fire when threatened */
  --char-marker:     #FF8C00;
}

/* Default (book frontmatter, system entries, generic) */
.palette-default {
  /* Inherits root cyan/magenta */
}

/* ---------- Daemon section — slightly grimier register ---------- */
.daemon-frame {
  border: var(--rule-base) solid var(--char-secondary, var(--naus-magenta));
  background: rgba(20, 24, 42, 0.04);
  padding: var(--sp-4);
  margin: var(--sp-3) 0;
  position: relative;
}

.daemon-frame::before {
  content: attr(data-daemon);
  position: absolute;
  top: -10px;
  left: var(--sp-3);
  background: var(--paper);
  padding: 0 var(--sp-2);
  font-family: 'JetBrains Mono', monospace;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  color: var(--char-secondary, var(--naus-magenta));
}

/* ---------- Stamp / seal — applied to "DOCUMENTED" Bleeker overlays ---------- */
.bleeker-stamp {
  position: absolute;
  font-family: 'Spectral SC', serif;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.25em;
  text-transform: uppercase;
  color: var(--bleeker-grey);
  border: 1.5px solid var(--bleeker-grey);
  padding: 4px 8px;
  transform: rotate(-6deg);
  opacity: 0.55;
  pointer-events: none;
  background: transparent;
  z-index: 1;
}

.bleeker-stamp.pos-far-right {
  top: 80px;
  right: 24px;
}

.bleeker-stamp.pos-bottom {
  /* Sit ABOVE the .illus-caption strip (which is at bottom: var(--sp-5)
     ≈ 24px + ~70px tall). 140px clears it comfortably. Caught 2026-05-17
     — the stamp was stacking under the caption on v-portrait pages. */
  bottom: 140px;
  left: 50%;
  transform: translateX(-50%) rotate(-3deg);
}

/* ---------- Relationship thread — call-out lines connecting characters ---------- */
.thread {
  font-family: 'Crimson Pro', serif;
  font-size: var(--fs-caption);
  border-top: var(--rule-fine) solid var(--char-primary, var(--ink));
  padding-top: var(--sp-2);
  margin-top: var(--sp-3);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--sp-2);
  align-items: baseline;
}

.thread-label {
  font-family: 'Space Grotesk', sans-serif;
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--char-accent, var(--naus-cyan));
}

.thread-body {
  font-style: italic;
  color: var(--ink-soft);
}
