/* ═══════════════════════════════════════════════════════════
   WINDOWS 95 THEME
   Activate: add data-style="win95" to <html>.
   Owns its palette (the VGA 16), type scale and radius scale
   outright; only the class contract in base.css is shared.
   ═══════════════════════════════════════════════════════════

   CONTRAST RESOLUTION — read this first:
   Faithful Win95 wants a teal desktop (#008080) directly under
   body text, AND a silver chrome face (#c0c0c0) under every
   panel/control. Those two backgrounds are ~3x apart in relative
   luminance (teal L≈0.17, silver L≈0.53) — it is mathematically
   impossible for one flat --c-text/--c-muted value to clear
   4.5:1 against BOTH (light-enough-for-teal forces L≥0.94, which
   then fails on silver, and vice versa). So:
     - --c-text / --c-text-sub / --c-muted are "desktop" tokens:
       near-white, tuned to clear AA on --c-bg (the teal). They
       are what body copy, headings, and any loose page-level
       text (field labels/hints, breadcrumbs/page text) use.
     - Every component that paints its own --w95-face / sunken
       field background (buttons, cards, alerts, nav, tabs,
       inputs, pagination…) sets its OWN text colour explicitly
       via --w95-text-on-face / --w95-text-muted-on-face (dark
       ink in light mode, light ink in dark mode) instead of
       inheriting --c-text. Every such pairing is verified below.
   Dark mode has no such conflict: the near-black desktop
   (#0a1a1a) and dark-gray chrome (#2b2b2b) are close enough in
   luminance that a single light text ramp clears AA on both, so
   --c-text/--c-muted are reused as-is by every dark-mode surface.
   ═══════════════════════════════════════════════════════════ */

/* ── Win95 light ──
   Text/bg pairs verified (WCAG relative-luminance formula):
     white  #ffffff on teal   #008080  → 4.77:1  (--c-text)
     #fafafa       on teal    #008080  → 4.57:1  (--c-muted / --c-text-sub)
     black  #000000 on silver #c0c0c0  → 11.55:1 (--w95-text-on-face)
     #404040        on silver #c0c0c0  → 5.70:1  (--w95-text-muted-on-face)
     white  on navy #000080            → 16.0:1  (--c-on-accent)
   ── */
/* ── Win95 palette ── the dark half of the VGA 16. These are the actual
   system colours of the era, which is why the ink on them is white rather
   than the near-black every other theme uses. ── */
html[data-style='win95'] {
	--p-accent-1: #008080;
	--p-accent-2: #99005c;
	--p-accent-3: #6b6b00;
	--p-accent-4: #800080;
	--p-accent-5: #000080;
	--p-accent-6: #800000;
	--p-accent-7: #006100;
	--p-accent-8: #9c4200;
	--p-info: #000080;
	--p-success: #006100;
	--p-warn: #6b6b00;
	--p-danger: #800000;
	--p-on-accent: #ffffff;
	/* --c-text here is the DESKTOP token (white on teal), so blending an
	   accent toward it lightens it. That is correct for text sitting on the
	   teal desktop, so the ratio stays low; anything sitting on the silver
	   chrome face overrides the colour outright below. */
	--ink-mix: 22%;
	--w95-alert-info-dark: #6f9dff;

	/* 95 chrome was small, tight and unapologetically system-sized. */
	--t-h1: 1.6rem;
	--t-h2: 1.2rem;
	--t-h3: 1rem;
	--t-lh-display: 1.25;
	--t-lh-heading: 1.3;
	--t-lh-body: 1.45;
	--t-track-display: 0;
	--t-track-heading: 0;

	/* 95 had exactly one corner: none. --r-round is left alone — the radio
	   was the sole round control, and base already routes it through that
	   token. The universal rule below is a backstop for unstyled markup. */
	--r-xs: 0;
	--r-sm: 0;
	--r-md: 0;
	--r-lg: 0;
	--r-pill: 0;
}

html[data-style='win95'] {
	--c-bg: #008080;
	--c-surface: #c0c0c0;
	--c-border: #808080;
	--c-muted: #fafafa;
	--c-text: #ffffff;
	--c-text-sub: #fafafa;
	--c-dot: #006666;
	--c-nav-bg: #c0c0c0;
	--c-accent: #000080;
	--c-accent-2: #800000;
	--c-accent-3: #808000;
	/* Navy accent — white on #000080 is 16.0:1, no near-black trap here. */
	--c-on-accent: #ffffff;
	--c-grad-h1-from: var(--c-text);
	--c-grad-h1-mid: var(--c-text);
	--c-grad-h1-to: var(--c-text);

	/* Bevel system — the two-tone 3D border technique used everywhere
	   below: border-color: light dark dark light = raised,
	   border-color: dark light light dark = sunken (inverted). */
	--w95-face: #c0c0c0;
	--w95-light: #ffffff;
	--w95-dark: #808080;
	--w95-darker: #404040;
	--w95-field-bg: #ffffff;
	--w95-focus: #000000;
	--w95-text-on-face: #000000;
	--w95-text-muted-on-face: #404040;
	/* Hand-picked alert-title tints — the raw --p-* palette is tuned for
	   light/white surfaces and falls under 4.5:1 on silver (e.g. raw
	   --p-accent-5 on #c0c0c0 is only ~1.8:1), so these are darkened variants
	   of the same hues, individually checked against #c0c0c0. */
	--w95-alert-success: #004d1a; /* 5.56:1 on silver */
	--w95-alert-warn: #5c4700; /* 4.90:1 on silver */
	--w95-alert-error: #8b0000; /* 5.50:1 on silver */
}

/* ── Win95 dark ── "night" 95: near-black desktop, dark gray chrome.
   Both backgrounds are dark enough that one light text ramp clears
   AA on both — no split needed here.
     #f0f0f0 on #0a1a1a (bg)      → 15.7:1
     #f0f0f0 on #2b2b2b (surface) → 12.4:1
     #b0b0b0 on #0a1a1a (bg)      → 8.2:1  (--c-muted)
     #b0b0b0 on #2b2b2b (surface) → 6.5:1  (--c-muted)
     white   on #2a52be (accent)  → 6.9:1  (--c-on-accent)
   ── */
html[data-style='win95'][data-theme='dark'] {
	--c-bg: #0a1a1a;
	--c-surface: #2b2b2b;
	--c-border: #5a5a5a;
	--c-muted: #b0b0b0;
	--c-text: #f0f0f0;
	--c-text-sub: #c8c8c8;
	--c-dot: #143333;
	--c-nav-bg: #2b2b2b;
	--c-accent: #2a52be;
	--c-accent-2: #b23a3a;
	--c-accent-3: #b2b23a;
	--c-on-accent: #ffffff;
	--c-grad-h1-from: var(--c-text);
	--c-grad-h1-mid: var(--c-text);
	--c-grad-h1-to: var(--c-text);

	--w95-face: #2b2b2b;
	--w95-light: #ffffff;
	--w95-dark: #1a1a1a;
	--w95-darker: #000000;
	--w95-field-bg: #1a1a1a;
	--w95-focus: #ffffff;
	--w95-text-on-face: #f0f0f0;
	--w95-text-muted-on-face: #c8c8c8;
	--w95-alert-success: #4ee08a; /* 8.33:1 on #2b2b2b */
	--w95-alert-warn: #e8c547; /* 8.43:1 on #2b2b2b */
	--w95-alert-error: #ff6b6b; /* 5.10:1 on #2b2b2b */
}

/* ── Win95 dark (system preference) ── */
@media (prefers-color-scheme: dark) {
	html[data-style='win95']:not([data-theme]) {
		--c-bg: #0a1a1a;
		--c-surface: #2b2b2b;
		--c-border: #5a5a5a;
		--c-muted: #b0b0b0;
		--c-text: #f0f0f0;
		--c-text-sub: #c8c8c8;
		--c-dot: #143333;
		--c-nav-bg: #2b2b2b;
		--c-accent: #2a52be;
		--c-accent-2: #b23a3a;
		--c-accent-3: #b2b23a;
		--c-on-accent: #ffffff;
		--c-grad-h1-from: var(--c-text);
		--c-grad-h1-mid: var(--c-text);
		--c-grad-h1-to: var(--c-text);

		--w95-face: #2b2b2b;
		--w95-light: #ffffff;
		--w95-dark: #1a1a1a;
		--w95-darker: #000000;
		--w95-field-bg: #1a1a1a;
		--w95-focus: #ffffff;
		--w95-text-on-face: #f0f0f0;
		--w95-text-muted-on-face: #c8c8c8;
		--w95-alert-success: #4ee08a;
		--w95-alert-warn: #e8c547;
		--w95-alert-error: #ff6b6b;
	}
}

/* ══════════════════════════════════════════════════════════
   WIN95 STYLE OVERRIDES
   Applied to html[data-style='win95']
   ══════════════════════════════════════════════════════════ */

/* ── System font stack, crisp (not smoothed) rendering ── */
html[data-style='win95'] body {
	font-family: Tahoma, 'MS Sans Serif', 'Segoe UI', sans-serif;
	-webkit-font-smoothing: auto;
}

html[data-style='win95'] h1,
html[data-style='win95'] h2,
html[data-style='win95'] h3 {
	font-family: Tahoma, 'MS Sans Serif', 'Segoe UI', sans-serif;
	font-weight: 700;
}

/* ── Kill all border-radius — 95 has square corners everywhere ── */
html[data-style='win95'] *,
html[data-style='win95'] *::before,
html[data-style='win95'] *::after {
	border-radius: 0 !important;
}

/* ── Sanctioned exception: Win95 radio buttons were round.
   Higher specificity than the universal kill rule above beats it
   even though both carry !important. ── */
html[data-style='win95'] input.radio {
	border-radius: 50% !important;
}
html[data-style='win95'] .radio::before {
	border-radius: 50% !important;
}

/* ── Nav bar: opaque silver chrome, bevel bottom edge, no blur.
   Also reskins <nav class="breadcrumbs"> into a Win95-style path
   bar, which is why breadcrumb text below uses the face tokens. ── */
html[data-style='win95'] nav {
	backdrop-filter: none !important;
	-webkit-backdrop-filter: none !important;
	color: var(--w95-text-on-face);
}

/* ── Gradient headline flattened to solid ink ── */
html[data-style='win95'] .gradient-text {
	background: none !important;
	-webkit-background-clip: unset !important;
	-webkit-text-fill-color: var(--c-text) !important;
	background-clip: unset !important;
	font-weight: 700;
}

/* ── Hide ambient glow halos and the dot grid — 95 had no blur ── */
html[data-style='win95'] .halo,
html[data-style='win95'] .halo-drift-1,
html[data-style='win95'] .halo-drift-2,
html[data-style='win95'] .halo-drift-3,
html[data-style='win95'] .halo-drift-4 {
	display: none !important;
}
html[data-style='win95'] .dot-grid {
	background-image: none !important;
}
html[data-style='win95'] .effect-stage {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background: var(--w95-field-bg);
}
html[data-style='win95'] .effect-caption {
	color: var(--w95-text-on-face);
}

/* ── Cards — raised bevel panel with a navy title-bar
   strip (pure CSS ::before, no new markup) sitting in the card's
   existing top padding so it never overlaps the content below. ── */
html[data-style='win95'] .card {
	position: relative;
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	background: var(--w95-face);
	box-shadow:
		inset -1px -1px 0 var(--w95-dark),
		inset 1px 1px 0 var(--w95-face);
	color: var(--w95-text-on-face);
	transition: none;
	overflow: hidden;
}
html[data-style='win95'] .card::before {
	content: '';
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	height: 1.1rem;
	background: var(--card-color, var(--c-accent));
	border-bottom: 2px solid var(--w95-darker);
}
html[data-style='win95'] .card:hover {
	transform: none !important;
	box-shadow:
		inset -1px -1px 0 var(--w95-dark),
		inset 1px 1px 0 var(--w95-face) !important;
}
html[data-style='win95'] .card .card-text {
	color: var(--w95-text-muted-on-face);
}
/* The card's palette accent moves into the title-bar strip above — as
   TEXT on the chrome face the raw --p-* colours fail AA (e.g. purple on
   the dark face is ~2.7:1), so label and company sit on face tokens. */
html[data-style='win95'] .card .section-label {
	color: var(--w95-text-muted-on-face);
}
html[data-style='win95'] .card .card-subtitle {
	color: var(--w95-text-on-face);
}

/* ── Link cards — same raised bevel treatment, no lift on hover ── */
html[data-style='win95'] .link-card {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	background: var(--w95-face);
	box-shadow:
		inset -1px -1px 0 var(--w95-dark),
		inset 1px 1px 0 var(--w95-face);
	transition: none;
}
html[data-style='win95'] .link-card:hover {
	transform: none !important;
	box-shadow:
		inset -1px -1px 0 var(--w95-dark),
		inset 1px 1px 0 var(--w95-face) !important;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light) !important;
}
html[data-style='win95'] .link-card strong {
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .link-sub {
	color: var(--w95-text-muted-on-face);
}

/* ── Tag pills become square chips — solid navy by default, solid VGA
   palette fill for the variants. The fills are the dark half of the VGA
   16, so the ink on them is --p-on-accent (white), not near-black. ── */
html[data-style='win95'] .tag {
	background: var(--c-accent);
	color: var(--c-on-accent);
	border: 1px solid var(--w95-darker);
	font-weight: 700;
}
html[data-style='win95'] .tag-accent-1 {
	background: var(--p-accent-1);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-2 {
	background: var(--p-accent-2);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-3 {
	background: var(--p-accent-3);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-4 {
	background: var(--p-accent-4);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-5 {
	background: var(--p-accent-5);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-6 {
	background: var(--p-accent-6);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-7 {
	background: var(--p-accent-7);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}
html[data-style='win95'] .tag-accent-8 {
	background: var(--p-accent-8);
	color: var(--p-on-accent);
	border-color: var(--w95-darker);
}

/* ── Button system: raised gray bevel, pressed = sunken + 1px nudge ── */
html[data-style='win95'] .btn-primary,
html[data-style='win95'] .btn-outlined,
html[data-style='win95'] .btn-icon,
html[data-style='win95'] .theme-toggle {
	font-weight: 700;
	background: var(--w95-face);
	color: var(--w95-text-on-face);
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	box-shadow:
		inset -1px -1px 0 var(--w95-dark),
		inset 1px 1px 0 var(--w95-face);
}
/* Heavy outer ring = "this is the default button" in 95. A literal
   black ring (as classic 95 used) would vanish against the dark-mode
   chrome, so this uses the accent instead — it still reads as the
   emphasised action in both modes. */
html[data-style='win95'] .btn-primary {
	outline: 1px solid var(--c-accent);
	outline-offset: 2px;
}
html[data-style='win95'] .btn-primary:hover,
html[data-style='win95'] .btn-outlined:hover,
html[data-style='win95'] .btn-icon:hover,
html[data-style='win95'] .theme-toggle:hover {
	opacity: 1;
	color: var(--w95-text-on-face);
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	transform: none;
}
html[data-style='win95'] .btn-primary:active,
html[data-style='win95'] .btn-outlined:active,
html[data-style='win95'] .btn-icon:active {
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	box-shadow:
		inset 1px 1px 0 var(--w95-dark),
		inset -1px -1px 0 var(--w95-face);
	transform: translate(1px, 1px);
}
html[data-style='win95'] .btn-ghost {
	font-weight: 700;
}
html[data-style='win95'] .btn-ghost:hover {
	color: var(--c-text);
}

/* ══ Form controls ═══════════════════════════════════════════ */

html[data-style='win95'] .input,
html[data-style='win95'] .select {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background-color: var(--w95-field-bg);
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .input::placeholder {
	color: var(--w95-text-muted-on-face);
	opacity: 0.8;
}
html[data-style='win95'] .input:hover,
html[data-style='win95'] .select:hover {
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}
html[data-style='win95'] .input:disabled,
html[data-style='win95'] .select:disabled {
	background-color: var(--w95-face);
	color: var(--w95-text-muted-on-face);
}

/* Marching-ants focus ring, replacing the glow-ring base uses. Covers
   every control that shares base's color-mix glow pattern. */
html[data-style='win95'] .input:focus-visible,
html[data-style='win95'] .select:focus-visible,
html[data-style='win95'] .checkbox:focus-visible,
html[data-style='win95'] .radio:focus-visible,
html[data-style='win95'] .switch:focus-visible,
html[data-style='win95'] .tab:focus-visible,
html[data-style='win95'] .page:focus-visible {
	outline: 1px dotted var(--w95-focus);
	outline-offset: 2px;
	box-shadow: none;
}

/* ── Checkbox — sunken white/near-black well, black/light checkmark,
   never fully filled (classic 95 keeps the field colour when checked) ── */
html[data-style='win95'] .checkbox {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background: var(--w95-field-bg);
}
html[data-style='win95'] .checkbox::before {
	background: var(--w95-text-on-face);
}
html[data-style='win95'] .checkbox:checked {
	background: var(--w95-field-bg);
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}

/* ── Radio — sunken well (radius exception declared above), black/
   light dot fill, same "never filled" logic as the checkbox ── */
html[data-style='win95'] .radio {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background: var(--w95-field-bg);
}
html[data-style='win95'] .radio::before {
	background: var(--w95-text-on-face);
}
html[data-style='win95'] .radio:checked {
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}

/* ── Switch — a small raised bevel thumb sliding inside a sunken
   track; thumb turns navy when checked ── */
html[data-style='win95'] .switch {
	width: 2.5rem;
	height: 1.25rem;
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background: var(--w95-field-bg);
}
html[data-style='win95'] .switch::before {
	top: 0.125rem;
	left: 0.125rem;
	width: 0.85rem;
	height: 0.85rem;
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	background: var(--w95-face);
	box-shadow: none;
}
html[data-style='win95'] .switch:checked {
	background: var(--w95-field-bg);
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}
html[data-style='win95'] .switch:checked::before {
	/* 2.5rem track − 2×2px border − 0.85rem thumb − 2px gap each side
	   ⇒ 1.15rem of travel; 1.4rem would push the thumb past the bevel */
	transform: translateX(1.15rem);
	background: var(--c-accent);
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
}

/* ══ Feedback ═════════════════════════════════════════════════ */

/* ── Alert — plain raised gray panel (95 alerts had no colour
   coding beyond an icon); only .alert-title picks up a hand-tuned
   dark/light tint per variant, all individually AA-checked against
   --w95-face above. ── */
html[data-style='win95'] .alert {
	border-width: 2px;
	border-left-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light) !important;
	background: var(--w95-face) !important;
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .alert-info,
html[data-style='win95'] .alert-success,
html[data-style='win95'] .alert-warn,
html[data-style='win95'] .alert-error {
	background: var(--w95-face) !important;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light) !important;
}
html[data-style='win95'] .alert-title {
	color: var(--w95-text-on-face);
	font-weight: 700;
}
html[data-style='win95'] .alert-info .alert-title {
	color: var(--c-accent);
}
/* Navy on the dark chrome face is 2.06:1 — the light-mode tint cannot carry
   over, so dark mode gets its own lifted blue. */
html[data-style='win95'][data-theme='dark'] .alert-info .alert-title {
	color: var(--w95-alert-info-dark);
}
@media (prefers-color-scheme: dark) {
	html[data-style='win95']:not([data-theme]) .alert-info .alert-title {
		color: var(--w95-alert-info-dark);
	}
}

/* On the teal desktop the navy accent simply cannot function as a text
   colour — even blended almost to white it tops out near 3:1. So the accent
   kicker drops to the plain desktop ink; the accent still carries meaning
   everywhere it is a FILL (title bars, badges, the active page). */
html[data-style='win95'] .text-accent {
	color: var(--c-text);
}

/* The link-card glyph sits on the chrome face, not the desktop, so it takes
   the face ink rather than the desktop-tuned accent blend. */
html[data-style='win95'] .link-icon {
	color: var(--w95-text-on-face);
	background: color-mix(in srgb, var(--card-color, var(--c-accent)) 22%, var(--w95-field-bg));
}
html[data-style='win95'] .alert-success .alert-title {
	color: var(--w95-alert-success);
}
html[data-style='win95'] .alert-warn .alert-title {
	color: var(--w95-alert-warn);
}
html[data-style='win95'] .alert-error .alert-title {
	color: var(--w95-alert-error);
}

/* ── Badge — already solid navy by default (--c-accent/--c-on-accent);
   the variants fill with the VGA palette above and take this theme's
   white --p-on-accent. Corners are squared by the radius tokens; this
   just adds the hairline edge. ── */
html[data-style='win95'] .badge {
	border: 1px solid var(--w95-darker);
}

/* ── Progress — sunken track, segmented navy fill (repeating blocks,
   the "chunky" 95 progress bar) ── */
html[data-style='win95'] .progress {
	height: 1.1rem;
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	background: var(--w95-field-bg);
	padding: 2px;
}
/* Segmented "chunky" fill. base scales the bar with transform, which squashes
   its painted background along with it, so the 8px tile is pre-divided by the
   same factor — the 6px block / 2px gap rhythm then stays constant at every
   value instead of stretching as the bar fills. */
html[data-style='win95'] .progress-bar {
	background-image: repeating-linear-gradient(
		to right,
		var(--c-accent) 0,
		var(--c-accent) 75%,
		var(--w95-field-bg) 75%,
		var(--w95-field-bg) 100%
	);
	background-size: calc(8px / var(--progress, 1)) 100%;
}

/* ── Skeleton — flat sunken block, no shimmer at all (95 had no
   motion for placeholders, independent of prefers-reduced-motion) ── */
html[data-style='win95'] .skeleton {
	background: var(--w95-field-bg);
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}
html[data-style='win95'] .skeleton::after {
	display: none !important;
	animation: none !important;
}

/* ── Spinner — square 1px(2px)-border spinner; static ¾ arc under
   reduced motion, using the same tokens so it still reads correctly ── */
html[data-style='win95'] .spinner {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-darker);
	border-top-color: var(--c-accent);
}
@media (prefers-reduced-motion: reduce) {
	html[data-style='win95'] .spinner {
		animation: none;
		border-color: var(--c-accent);
		border-right-color: var(--w95-darker);
	}
}

/* ══ Navigation ═══════════════════════════════════════════════ */

/* ── Tabs — classic strip: raised tabs, active tab's bottom border
   matches the face colour so it visually merges into the content ── */
html[data-style='win95'] .tabs {
	gap: 0;
	border-bottom-width: 2px;
	border-bottom-style: solid;
	border-bottom-color: var(--w95-darker);
}
html[data-style='win95'] .tab {
	top: 2px;
	margin-right: 2px;
	padding: 0.5rem 1rem;
	border-width: 2px 2px 0 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) transparent var(--w95-light);
	background: var(--w95-face);
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .tab::after {
	display: none;
}
html[data-style='win95'] .tab:hover {
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .tab-active {
	top: 0;
	padding-top: calc(0.5rem + 2px);
	border-bottom-color: var(--w95-face);
	font-weight: 700;
}

/* ── Breadcrumbs — a raised silver path bar. The face background is
   set HERE, not assumed from the page: a bare <nav class="breadcrumbs">
   renders straight on the teal desktop, where the black on-face text
   would fail contrast without its own chrome under it. ── */
html[data-style='win95'] .breadcrumbs {
	padding: 0.4rem 0.75rem;
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	background: var(--w95-face);
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .breadcrumbs a {
	color: var(--w95-text-on-face);
	text-decoration: underline;
}
html[data-style='win95'] .breadcrumbs a:hover {
	color: var(--c-accent);
}
html[data-style='win95'] .breadcrumbs [aria-current='page'] {
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .breadcrumbs > * + *::before {
	color: var(--w95-text-muted-on-face);
}

/* ── Pagination — bevel buttons, active = sunken + navy fill ── */
html[data-style='win95'] .page {
	border-width: 2px;
	border-style: solid;
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	background: var(--w95-face);
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .page:hover {
	border-color: var(--w95-light) var(--w95-darker) var(--w95-darker) var(--w95-light);
	color: var(--w95-text-on-face);
}
html[data-style='win95'] .page:active {
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
}
html[data-style='win95'] .page-active,
html[data-style='win95'] .page-active:hover {
	background: var(--c-accent);
	border-color: var(--w95-darker) var(--w95-light) var(--w95-light) var(--w95-darker);
	color: var(--c-on-accent);
}
