/* ==========================================================================
   Vanity or Vice — BRAND LAYER
   assets/tokens/brand.css · adopted 14 September 2026

   Loads after tokens/semantic.css and before tokens/components.css. Never on
   Claire Elise Wellness requests: that publication does not load the Vanity
   token architecture at all, so nothing here can reach it.

   This file declares tokens. It does not chase components. Two earlier drafts
   of it tried to correct contrast by rebinding roles across a list of dark
   surfaces, and measuring the result at twelve templates showed why that does
   not work: a default that is right for one surface leaks onto the next one,
   and a card grid whose three cards carry three different grounds cannot be
   fixed by a rule that addresses the grid. Every correction that used to live
   here has been moved into the file that caused it —
     assets/editorial-visual-system.css  the dossier kicker, the moderate
                                          evidence tier, and the --evs-* token
                                          scope that left .vov-card with no
                                          background at all
     assets/vv-interior.css              --vvi-brass and the register links
   — which is the same discipline the width contract was fixed with. What is
   left below is the palette itself, plus the two corrections that genuinely
   belong to no single component.
   ========================================================================== */

:root {
	/* —— Depth at the dark end ————————————————————————————————
	   --palette-espresso, --palette-field and --palette-charcoal all resolved
	   to the same #0D0D0F, so a hero above a register band above a footer was
	   one continuous black rectangle with no edges in it. Two warm steps above
	   the field give those bands a boundary. Both still carry parchment above
	   15:1 (#191310 → 16.75:1, #221A16 → 15.59:1) and champagne above 10:1, so
	   nothing that reads on near-black stops reading on these. */
	--brand-espresso: #191310;
	--brand-charcoal: #221A16;
	--palette-espresso: var(--brand-espresso);
	--palette-charcoal: var(--brand-charcoal);

	/* —— The metal has two values ————————————————————————————
	   Champagne stays the metal and --color-accent-metal is deliberately
	   unchanged: it is correct on dark ground at 11.34:1 on near-black, and
	   every dark surface on this site is already using it well.

	   What champagne cannot do is sit on parchment, where it measures 1.56:1
	   against a 3:1 floor for large text. That was the value behind every
	   interior kicker and the moderate evidence-tier label, which is why they
	   read as absent rather than as understated. Antique brass is the
	   on-light value at 4.82:1 on parchment — enough for a 0.72rem uppercase
	   mono label to clear AA as small text, and still 3.67:1 if it ever lands
	   on near-black, so a missed case degrades to legible rather than to
	   invisible. Consumers ask for it by name; nothing inherits it by
	   accident. */
	--brand-brass: #86671C;
	--palette-brass: var(--brand-brass);
	--color-accent-metal-ink: var(--palette-brass);

	/* —— Rules belong to the warm ground ——————————————————————
	   The default hairline was --brand-laboratory-grey #B9BDC3, a cool
	   blue-grey drawn across warm parchment at 1.72:1. It stays in the palette
	   for clinical chrome; it is no longer what a border defaults to. */
	--color-border-rule: rgba(20, 18, 15, 0.22);
}

/* Dark bands get a parchment hairline instead of an ink one. Same list the
   interior skin uses for the metal, kept short on purpose. */
:is(.vv-hybrid, .vv-footer, .vv-hero, .vv-final, .vv-lookbooks,
	.vv-register-band, .vvr-strip, .vvx-hero, .vvx-latest, .vvx-note,
	.vovn-desk-handoff, .vov-cohort, .vovps-arrival, [data-surface="ink"]) {
	--color-border-rule: rgba(247, 244, 238, 0.24);
	--color-border-line: rgba(247, 244, 238, 0.16);

	/* —— Text tokens flip with the ground ————————————————————————
	   assets/tokens/hierarchy.css carries a bare
	     h1, h2, h3 { color: var(--color-text-primary) }
	   and a directly matched declaration beats an inherited one whatever the
	   source order. So a dark band that set only its own `color` had its
	   headings repainted in ink: on .vv-lookbooks that measured #0D0D0F on
	   #0D0D0F — 1.00:1, a heading present in the DOM and invisible on screen.

	   semantic.css already designed the way out for [data-surface="ink"]:
	   redefine the text tokens on the band so the bare heading rule resolves
	   to parchment by itself. This list is the same set of dark surfaces, so
	   it gets the same flip instead of another per-component !important.
	   The one-off corrections further down this file (.vov-cohort captions,
	   .vov-cta headings) were each this bug caught one element at a time;
	   they are now redundant, and harmless. */
	--color-text-primary: var(--color-text-on-dark);
	--color-text-quiet: var(--color-text-on-dark-muted);
}

/* ——————————————————————————————————————————————————————————————
   Two corrections that belong to no component.

   1. Captions inside the cohort plates. --palette-quiet (#5B5454) is a
      light-ground grey and the plate is near-black: measured 2.63:1 against
      4.5:1. The muted parchment the rest of the site uses on dark ground
      gives 12.5:1. The plate is generated by inc/cohort-thumb.php and has no
      stylesheet of its own, so the fix has nowhere else to live.
   —————————————————————————————————————————————————————————————— */
.vov-cohort :is(figcaption, .vov-cohort__caption) {
	color: var(--color-text-on-dark-muted);
}

/* 2. The closing call to action on the hub pages. .vov-cta sets an oxblood
      ground; its paragraphs correctly inherit parchment but its headline was
      still resolving to ink, measured at 1.40:1 — one element, one colour,
      and no component file owns it. */
.vov-cta :is(h2, h3) {
	color: var(--color-text-on-dark);
}
