/* ─────────────────────────────────────────────────────────────────────────
   Caveat — self-hosted handwriting webfont for marginalia
   Source: Google Fonts / Open Font License
   Variable font (weight axis 400–700), latin subset, ~75KB
   ───────────────────────────────────────────────────────────────────────── */

@font-face {
  font-family: 'Caveat';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('/static/fonts/caveat/caveat-latin-variable.woff2') format('woff2-variations');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122;
}

/**
 * SciprogFi — Declassified Document Register
 *
 * Implements the "declassified" aesthetic vocabulary from the muriel skill.
 * See: ~/Documents/dev/muriel/plugins/muriel/skills/compose/vocabularies/declassified.md
 *
 * Activates on any element carrying `[data-declassified]`. The document body
 * inside is forced into a paper-substrate register regardless of the
 * surrounding era CSS — declassified documents are stable artifacts; the
 * world's relationship to them changes (era), not the document itself.
 *
 * Provenance variants override paratext + aging defaults via [data-provenance].
 * Aging tiers are author-set via [data-aging] (0 fresh, 1 used, 2 archival).
 *
 * 8:1 contrast minimum verified for every text role on every aging tier.
 */

/* ─────────────────────────────────────────────────────────────────────────
   Tokens — scoped to the declassified surface so no global leak
   ───────────────────────────────────────────────────────────────────────── */

[data-declassified] {
  /* Paper substrate */
  --decl-paper:        #f9f5e8;   /* fresh — Tier 0 */
  --decl-paper-edge:   #ebe4cc;   /* edge wear color */
  --decl-paper-grain-opacity: 0.04;

  /* Ink */
  --decl-ink:          #1a1a1a;   /* body text — 14:1 on Tier-0 paper */
  --decl-ink-faint:    #3d3d3b;   /* meta — 8.6:1 on Tier-0 paper */
  --decl-rule:         #1a1a1a;

  /* Classification — deep red on cream */
  --decl-class-bg:     #f4ead2;
  --decl-class-fg:     #5a0c0c;   /* 9:1 on banner bg */
  --decl-class-rule:   #5a0c0c;

  /* Decl stamp overstrike */
  --decl-stamp-fg:     #5a0c0c;

  /* Redaction (government-at-creation) */
  --decl-redact-bar:   #0a0a0a;
  --decl-redact-code:  #1a1a1a;   /* exemption code in margin */

  /* Marginalia hands */
  --decl-pen-red:      #7a0e14;   /* 8.3:1 on Tier-0 paper */
  --decl-pen-blue:     #1c3a6e;   /* 9.1:1 on Tier-0 paper */
  --decl-pen-pencil:   #3d3d3b;   /* 8.6:1 on Tier-0 paper */
  --decl-strike:       #7a0e14;

  /* Geometry */
  --decl-page-pad-x:   clamp(1.5rem, 4vw, 3rem);
  --decl-page-pad-y:   clamp(1rem, 2.5vw, 2rem);
  --decl-bar-h:        1.05em;
  --decl-banner-h:     1.6rem;

  /* Typography — declassified docs are typewriter / official report */
  --decl-font-body:    "Courier New", "SF Mono", "Liberation Mono", monospace;
  --decl-font-meta:    "SF Mono", "Courier New", monospace;
  --decl-font-marginalia: 'Caveat', "Bradley Hand", "Marker Felt", "Segoe Print", cursive;
}

/* ── Aging tiers — author opts in via data-aging on the wrapper ───────── */

[data-declassified][data-aging="1"] {
  --decl-paper:        #f5ebd0;          /* lum 0.79 — 14.7:1 with #1a1a1a ink */
  --decl-paper-edge:   #e2d5a5;
  --decl-grain-alpha:  0.05;
  --decl-ink:          #181818;
  --decl-ink-faint:    #353533;
}

[data-declassified][data-aging="2"] {
  --decl-paper:        #f0e2bf;          /* lum 0.74 — 13.5:1 with #131313 ink */
  --decl-paper-edge:   #d6c290;
  --decl-grain-alpha:  0.07;
  --decl-ink:          #131313;
  --decl-ink-faint:    #2c2c2a;
  --decl-pen-red:      #6b0c12;
  --decl-pen-blue:     #182f59;
}

/* ─────────────────────────────────────────────────────────────────────────
   Page surface — overrides surrounding era CSS within the wrapper only
   ───────────────────────────────────────────────────────────────────────── */

[data-declassified] {
  position: relative;
  background-color: var(--decl-paper);   /* solid paper — no blend, text contrast preserved */
  color: var(--decl-ink);
  padding: var(--decl-page-pad-y) var(--decl-page-pad-x);
  margin: 2rem auto;
  max-width: 48rem;
  font-family: var(--decl-font-body);
  font-size: 1rem;
  line-height: 1.6;
  border: 1px solid var(--decl-paper-edge);
  box-shadow:
    0 1px 0 rgba(0,0,0,0.04),
    0 8px 24px rgba(0,0,0,0.18);
  --decl-grain-alpha: 0;                 /* tier-0 default — overridden per tier */
}

/* Decorative grain — isolated layer ABOVE paper but BELOW text (z-index 0).
   Text sits on .declass-body / .declass-banner / etc. which are z-index 1+.
   Low alpha keeps the texture as suggestion, not as multiply-darkening. */
[data-declassified]::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  opacity: var(--decl-grain-alpha);
  background-image:
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='320' height='320'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='3' seed='9'/><feColorMatrix values='0 0 0 0 0.4  0 0 0 0 0.3  0 0 0 0 0.15  0 0 0 1 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  background-size: 320px 320px;
  mix-blend-mode: multiply;
}

/* All direct children of the page surface lift above the grain layer. */
[data-declassified] > * {
  position: relative;
  z-index: 1;
}

/* Tier-2 adds a subtle edge-only browning so the page reads as old without
   tinting the central reading area. Pulled in via ::after, low alpha. */
[data-declassified][data-aging="2"]::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background:
    radial-gradient(ellipse at top left,     transparent 70%, rgba(120,90,30,0.10) 100%),
    radial-gradient(ellipse at bottom right, transparent 70%, rgba(120,90,30,0.08) 100%),
    radial-gradient(ellipse at top right,    transparent 80%, rgba(120,90,30,0.05) 100%);
  mix-blend-mode: multiply;
}

/* ─────────────────────────────────────────────────────────────────────────
   Classification banners — top + bottom
   ───────────────────────────────────────────────────────────────────────── */

.declass-banner {
  display: block;
  width: 100%;
  background: var(--decl-class-bg);
  color: var(--decl-class-fg);
  border-top: 2px solid var(--decl-class-rule);
  border-bottom: 2px solid var(--decl-class-rule);
  font-family: var(--decl-font-meta);
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-align: center;
  padding: 0.45rem 0.5rem;
  margin: 0 0 1.2rem 0;
  text-transform: uppercase;
  user-select: none;
}
.declass-banner--bottom { margin: 1.5rem 0 0 0; }

/* When original classification is cancelled (declassified), strike through */
.declass-banner--cancelled {
  position: relative;
}
.declass-banner--cancelled::after {
  content: "";
  position: absolute;
  left: 6%; right: 6%;
  top: 50%;
  height: 2px;
  background: var(--decl-class-fg);
  transform: rotate(-1.5deg);
  opacity: 0.85;
}

/* ─────────────────────────────────────────────────────────────────────────
   Case-file header — top metadata strip
   ───────────────────────────────────────────────────────────────────────── */

.declass-casefile {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: baseline;
  gap: 0.5rem 1.5rem;
  font-family: var(--decl-font-meta);
  font-size: 0.85rem;
  color: var(--decl-ink-faint);
  margin: 0 0 1rem 0;
  padding: 0 0 0.5rem 0;
  border-bottom: 1px dashed var(--decl-paper-edge);
}
.declass-casefile-id     { font-weight: 700; letter-spacing: 0.05em; color: var(--decl-ink); }
.declass-casefile-agency { font-weight: 600; }
.declass-casefile-pages  { letter-spacing: 0.05em; }
.declass-casefile-subject {
  flex: 1 1 100%;
  font-style: italic;
  color: var(--decl-ink);
  margin-top: 0.2rem;
}

/* ─────────────────────────────────────────────────────────────────────────
   Declassification stamp — diagonal red overprint, top-right corner
   ───────────────────────────────────────────────────────────────────────── */

.declass-stamp {
  position: absolute;
  top: clamp(2rem, 6vw, 4rem);
  right: clamp(0.5rem, 3vw, 2rem);
  transform: rotate(-12deg);
  pointer-events: none;
  font-family: var(--decl-font-meta);
  text-align: center;
  color: var(--decl-stamp-fg);
  border: 3px double var(--decl-stamp-fg);
  padding: 0.35rem 0.9rem;
  background: rgba(249, 245, 232, 0.65);
  z-index: 2;
}
.declass-stamp-line {
  display: block;
  font-weight: 900;
  font-size: 1.05rem;
  letter-spacing: 0.18em;
  line-height: 1.1;
  text-transform: uppercase;
}
.declass-stamp-meta {
  display: block;
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  margin-top: 0.15rem;
  opacity: 0.92;
}

/* On leaked docs (no decl stamp), nothing renders. CSS shouldn't draw it. */
[data-provenance="leak"] .declass-stamp,
[data-provenance="open"] .declass-stamp { display: none; }

/* ─────────────────────────────────────────────────────────────────────────
   Body content — the text itself
   ───────────────────────────────────────────────────────────────────────── */

[data-declassified] .declass-body {
  font-family: var(--decl-font-body);
  font-size: 1rem;
  line-height: 1.7;
  color: var(--decl-ink);
}
[data-declassified] .declass-body p { margin: 0 0 1rem 0; }
[data-declassified] .declass-body h1,
[data-declassified] .declass-body h2,
[data-declassified] .declass-body h3 {
  font-family: var(--decl-font-meta);
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--decl-ink);
  text-transform: uppercase;
  margin: 1.5rem 0 0.6rem 0;
}
[data-declassified] .declass-body h1 { font-size: 1.25rem; border-bottom: 1px solid var(--decl-rule); padding-bottom: 0.3rem; }
[data-declassified] .declass-body h2 { font-size: 1.1rem; }
[data-declassified] .declass-body h3 { font-size: 1rem; letter-spacing: 0.04em; }
[data-declassified] .declass-body a { color: var(--decl-pen-blue); text-decoration: underline; text-decoration-style: dotted; }
[data-declassified] .declass-body a:hover { text-decoration-style: solid; }
[data-declassified] .declass-body blockquote {
  border-left: 3px double var(--decl-rule);
  padding: 0 0 0 1rem;
  margin: 1rem 0;
  color: var(--decl-ink);
}
[data-declassified] .declass-body code {
  background: rgba(0,0,0,0.06);
  padding: 0 0.25em;
  border-radius: 2px;
}

/* Figure / figcaption — base.css uses --sf-muted (50% black) for captions,
   which fails 8:1 against the cream paper. Inside declassified, captions
   are paratext (legends and figure captions on government documents are
   primary, not decoration) so promote color + size to body-readable. */
[data-declassified] figure {
  margin: 1.2rem 0;
}
[data-declassified] figure[data-viz] figcaption,
[data-declassified] figcaption {
  color: var(--decl-ink) !important;
  font-family: var(--decl-font-body);
  font-size: 0.92rem;
  font-style: normal;
  font-weight: 500;
  line-height: 1.55;
  letter-spacing: 0;
  max-width: none;
  margin-top: 0.6rem;
  padding-top: 0.5rem;
  border-top: 1px solid var(--decl-paper-edge);
}
[data-declassified] figcaption em {
  font-style: italic;
  color: var(--decl-ink);
}
[data-declassified] figure[data-viz].viz-lead figcaption {
  font-size: 0.95rem;
}
/* Override any era-CSS table that tints the figure border very light */
[data-declassified] figure[data-viz] {
  border-color: var(--decl-paper-edge);
  background: rgba(255, 255, 255, 0.4);
}

/* ─────────────────────────────────────────────────────────────────────────
   Redaction (government-at-creation) — distinct from .redacted (Clean Net)
   ───────────────────────────────────────────────────────────────────────── */

.redact {
  display: inline-block;
  background: var(--decl-redact-bar);
  color: transparent;
  user-select: none;
  vertical-align: baseline;
  height: var(--decl-bar-h);
  line-height: var(--decl-bar-h);
  padding: 0 0.15em;
  margin: 0 0.05em;
  border-radius: 1px;
  position: relative;
}
.redact[data-exemption]::after {
  content: " " attr(data-exemption);
  position: absolute;
  right: 0;
  bottom: -1.05rem;
  font-family: var(--decl-font-meta);
  font-size: 0.7rem;
  font-weight: 700;
  color: var(--decl-redact-code);
  letter-spacing: 0.04em;
  white-space: nowrap;
  background: var(--decl-paper);
  padding: 0 0.2em;
  border-radius: 2px;
}

/* Whole-paragraph redaction — for blocks of removed content */
.redact-block {
  display: block;
  background: var(--decl-redact-bar);
  color: transparent;
  user-select: none;
  margin: 0.8rem 0;
  padding: 0.6rem 0.8rem;
  min-height: 4em;
  position: relative;
  border-radius: 1px;
}
.redact-block[data-exemption]::after {
  content: attr(data-exemption);
  position: absolute;
  right: 0.5rem;
  bottom: -1.1rem;
  font-family: var(--decl-font-meta);
  font-size: 0.7rem;
  font-weight: 700;
  color: var(--decl-redact-code);
  letter-spacing: 0.04em;
  background: var(--decl-paper);
  padding: 0 0.25em;
}

/* ─────────────────────────────────────────────────────────────────────────
   Typewriter strikethrough — original-author edit at issue
   ───────────────────────────────────────────────────────────────────────── */

.declass-strike {
  position: relative;
  color: var(--decl-ink);
}
.declass-strike::before {
  content: "";
  position: absolute;
  left: -0.05em; right: -0.05em;
  top: 50%;
  height: 1.5px;
  background: var(--decl-strike);
  transform: translateY(-1px);
}

/* ─────────────────────────────────────────────────────────────────────────
   Marginalia — handwritten margin notes
   ───────────────────────────────────────────────────────────────────────── */

.marginalia {
  display: block;
  margin: 1rem 0 1rem 1.5rem;
  padding: 0.4rem 0.6rem;
  font-family: var(--decl-font-marginalia);
  font-size: 1.35rem;       /* Caveat reads smaller; bump up vs body */
  line-height: 1.45;
  position: relative;
  max-width: 28em;
  /* Ink-into-paper interaction — soft multiply against grain layer */
  mix-blend-mode: multiply;
  /* Subtle ink bleed — half-pixel outward shadow gives glyphs density */
  text-shadow: 0 0 0.4px currentColor;
  /* SVG ink-roughening filter; <svg> defined in base.njk.
     Falls back to no filter if the inline svg fails to load. */
  filter: url(#decl-ink-bleed);
}
.marginalia[data-hand="red"] {
  color: var(--decl-pen-red);
  transform: rotate(-0.7deg);
  font-weight: 600;          /* red-pen tends thicker — analyst pressure */
}
.marginalia[data-hand="blue"] {
  color: var(--decl-pen-blue);
  transform: rotate(0.5deg);
  font-weight: 500;
}
.marginalia[data-hand="pencil"] {
  color: var(--decl-pen-pencil);
  transform: rotate(-0.4deg);
  font-size: 1.2rem;
  font-weight: 400;
  /* Pencil graphite has less ink-bleed, more granular texture */
  text-shadow: 0 0 0.2px currentColor;
}

/* Multi-marginalia variation — alternate rotation direction so two notes
   on the same page don't look like the same scribble template. */
.marginalia:nth-of-type(2n)[data-hand="red"]    { transform: rotate(0.5deg); }
.marginalia:nth-of-type(2n)[data-hand="blue"]   { transform: rotate(-0.3deg); }
.marginalia:nth-of-type(2n)[data-hand="pencil"] { transform: rotate(0.2deg); }
.marginalia:nth-of-type(3n)[data-hand="red"]    { transform: rotate(-0.4deg); }
.marginalia:nth-of-type(3n)[data-hand="blue"]   { transform: rotate(0.7deg); }

/* On larger viewports, float marginalia inside the right edge of the page.
   Don't extend beyond the article box — keeps notes readable on narrow
   layouts (like main containers with their own max-width). */
@media (min-width: 64rem) {
  [data-declassified] {
    max-width: 56rem;
  }
  .marginalia {
    float: right;
    clear: right;
    width: 14rem;
    margin: 0.2rem 0 1rem 1.5rem;
    padding: 0.5rem 0.7rem;
    border-left: 2px solid currentColor;
    background: rgba(255,255,255,0.55);
  }
}

/* Each hand carries an attribution caret — initials in parens after the note */
.marginalia .marginalia-attr {
  display: block;
  font-family: var(--decl-font-meta);
  font-size: 0.7rem;
  font-style: normal;
  letter-spacing: 0.06em;
  color: var(--decl-ink-faint);
  margin-top: 0.2rem;
  text-transform: uppercase;
}

/* ─────────────────────────────────────────────────────────────────────────
   Exemption legend — footer block
   ───────────────────────────────────────────────────────────────────────── */

.declass-legend {
  margin-top: 2rem;
  padding-top: 0.8rem;
  border-top: 2px solid var(--decl-rule);
  font-family: var(--decl-font-meta);
  font-size: 0.8rem;
  color: var(--decl-ink-faint);
}
.declass-legend-title {
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--decl-ink);
  margin: 0 0 0.4rem 0;
}
.declass-legend dl {
  margin: 0;
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0.15rem 0.8rem;
}
.declass-legend dt { font-weight: 700; color: var(--decl-ink); white-space: nowrap; }
.declass-legend dd { margin: 0; color: var(--decl-ink); }

/* ─────────────────────────────────────────────────────────────────────────
   Provenance variants — small overrides per release type
   ───────────────────────────────────────────────────────────────────────── */

/* LEAK — banner stays original-classification color (no decl stamp). */
[data-provenance="leak"] .declass-banner {
  background: #2a0808;
  color: #ffe0e0;       /* 12:1 on dark red */
  border-color: #ffe0e0;
}

/* SEIZURE — chain-of-custody overlay slants the case-file strip. */
[data-provenance="seizure"] .declass-casefile {
  border-bottom-style: solid;
  border-bottom-color: var(--decl-pen-red);
}
[data-provenance="seizure"] .declass-casefile::before {
  content: "EVIDENCE";
  font-family: var(--decl-font-meta);
  font-weight: 900;
  letter-spacing: 0.16em;
  color: var(--decl-pen-red);
  border: 2px solid var(--decl-pen-red);
  padding: 0.1rem 0.4rem;
  margin-right: 0.6rem;
}

/* DISCOVERY — archive paratext, no banner color (long-since declassified) */
[data-provenance="discovery"] .declass-banner--top {
  background: var(--decl-paper);
  color: var(--decl-ink-faint);
  border-color: var(--decl-paper-edge);
  font-weight: 600;
  letter-spacing: 0.12em;
}

/* OPEN — no banner, no stamp, no case-file id required. Manifesto register. */
[data-provenance="open"] .declass-banner,
[data-provenance="open"] .declass-stamp { display: none; }
[data-provenance="open"] .declass-casefile {
  border-bottom: 1px solid var(--decl-rule);
}

/* SEIZED-ANNOTATED — original document presented clean, paratext is overlay-only. */
[data-provenance="seized-annotated"] .declass-banner--top::before {
  content: "INTERCEPT REVIEW // ";
  color: var(--decl-pen-red);
}

/* ─────────────────────────────────────────────────────────────────────────
   Era integration — declassified should NOT inherit dark-mode era body bg
   ───────────────────────────────────────────────────────────────────────── */

.era-2031-2032 [data-declassified],
.era-2033-2034 [data-declassified],
.era-2035 [data-declassified] {
  /* Force paper register inside late-era surfaces */
  filter: none;
}

/* Reduced motion / print — flatten transforms but keep colors */
@media (prefers-reduced-motion: reduce) {
  .marginalia { transform: none; }
  .declass-stamp { transform: rotate(-6deg); }
}

@media print {
  [data-declassified] {
    box-shadow: none;
    border: none;
    margin: 0;
    max-width: 100%;
  }
  .marginalia { float: none; margin: 0.6rem 0; transform: none; }
  .declass-stamp { transform: rotate(-8deg); }
}

/* ─────────────────────────────────────────────────────────────────────────
   ?plain=1 — diagnostic toggle. Strips the handwriting effects so the
   before/after of marginalia rendering can be compared in-browser without
   DevTools. Page paratext (banners, stamps, case-file) stays styled —
   only the marginalia ink/handwriting layer reverts to a plain register.
   ───────────────────────────────────────────────────────────────────────── */

.decl-plain .marginalia {
  font-family: var(--decl-font-meta) !important;
  font-size: 0.95rem !important;
  font-weight: 400 !important;
  filter: none !important;
  transform: none !important;
  mix-blend-mode: normal !important;
  text-shadow: none !important;
  background: rgba(255, 255, 255, 0.4);
  border-left: 2px solid currentColor;
}
.decl-plain .marginalia .hand-glyph {
  display: inline !important;
  transform: none !important;
}
.decl-plain .declass-stamp {
  transform: rotate(-8deg);  /* Stay angled, but no filter chain */
}
