/*
 * Academy chrome: the header navbar shadow and the footer.
 *
 * Unit C owns this file. Contract Addendum 10.
 *
 * WHAT THIS IS, AND WHY IT IS NOT A PORTED FILE
 * ---------------------------------------------
 * 8882 styles the academy chrome with two Oxygen-compiled stylesheets,
 * `uploads/oxygen/css/post-91.css` (the academy header, 9 rules) and
 * `uploads/oxygen/css/post-53.css` (the global footer, 81 rules). Those are ONE PAGE'S COMPILED
 * LAYOUT, named for Oxygen post IDs that mean nothing on this site and unregenerable here because
 * Oxygen is not installed. Shipping them would rebuild the platform dependency Addendum 7 existed
 * to remove, only on Oxygen instead of Divi, and it would fail the owner's "edits via Claude"
 * requirement, which needs readable CSS.
 *
 * So the rules that apply to OUR DOM are extracted here, readable, with the origin of each block
 * named. This is the opposite of the tailwind.css decision and deliberately so: Tailwind is a
 * design system, stable and regenerable and addressed by class name, so it ships byte-identical.
 *
 * WHAT WAS LEFT OUT, and why
 * --------------------------
 *   - `oxygen/css/global-settings.css` (25 KB). NOT PORTED. It carries the system-ui heading
 *     override the owner overruled in Addendum 4. Porting it would silently undo the Jost ruling.
 *   - The 28 `.breakdance .bde-wp-menu-53-{7,10,13,17}` rules from post-53.css. Every one either
 *     sets `--menu-hide-on-desktop`, which only Oxygen's awesome-menu.css reads, or an active-link
 *     colour already covered by the `.footer .breakdance-menu` rules below. Nothing in our DOM
 *     carries a `bde-wp-menu-53-N` class.
 *   - post-91.css's `.ph-fill` rule. No academy template uses a fill glyph, and the matching font
 *     is not shipped, so keeping the rule would only produce fallback boxes if someone used one.
 *   - The Oxygen per-template sheets (`post-124.css`, `post-124-defaults.css`, `post-121.css` and
 *     friends) belong to Units D and E, under this same extract-do-not-port rule.
 *
 * The `content: "\eNNN"` escapes below are safe HERE because this is a file on disk. Never move
 * them into post meta or Divi custom CSS: WordPress strips backslashes on save and the glyphs
 * would silently become empty.
 *
 * Load order matters. This sheet must come after tailwind.css, whose preflight resets lists,
 * margins and heading sizes that the footer rules then set.
 */

/* ---------------------------------------------------------------------------
 * Custom properties. From 8882 `oxygen/css/variables.css`, which declares 180.
 * Only the four the extracted rules actually reference are taken; a whole design
 * token set that nothing reads is dead weight and invites accidental coupling.
 *
 * Three still hold 8882's values verbatim. `--lm-midnight-blue` no longer does:
 * it carries an owner ruling and the reason is recorded on the declaration itself.
 * --------------------------------------------------------------------------- */
:root {
	/*
	 * OWNER RULING, contract Addendum 28 item 1 (Unit V1, 2026-08-25): the footer must be
	 * darker, from our own palette. 8882's value was #121948. GATE 1 EXCEPTION: the footer
	 * is deliberately darker than the reference. Do not "restore fidelity" here.
	 *
	 * Derived, not invented, and not a Tailwind utility: per Addendum 21 our tailwind.css is
	 * a purged copy of 8882's build, so `.bg-gray-900` is the only darker option that exists
	 * in it and it is a neutral, not our navy. Instead every channel of #121948 is scaled by
	 * 0.70:
	 *
	 *   #121948  rgb(18, 25, 72)  ->  #0D1232  rgb(13, 18, 50)
	 *
	 * A uniform channel scale is close to a pure lightness change, but 8-bit ROUNDING moves hue and
	 * saturation slightly. Measured on the SHIPPED colour: hsl(231.892, 58.730%, 12.16%).
	 * CORRECTED 2026-08-25: the original comment claimed "preserved to the decimal" at
	 * hsl(232.2, 60.0%), computed on the UNROUNDED rgb(12.6, 17.5, 50.4), not on the
	 * #0D1232 actually shipped. The colour is right; the claimed precision was not. So the
	 * brand hue is untouched and only the value moves. The name still fits: it is the same
	 * midnight blue, later at night.
	 *
	 * Contrast against the footer's own foregrounds all IMPROVES (measured, Unit V1):
	 *   #fff headings / hover / social glyphs      16.69:1 -> 18.27:1
	 *   rgba(255,255,255,.85) body and links       12.26:1 -> 13.27:1
	 *   (figures re-measured on the shipped #0D1232; the originals were computed on the
	 *    unrounded value and read ~0.05 high. Every ratio still improves.)
	 *   rgba(255,255,255,.78) brand paragraph      10.48:1 -> 11.28:1
	 *   rgba(255,255,255,.70) bottom row and links  8.66:1 ->  9.24:1
	 *   #fff glyph on the .social pill             13.41:1 -> 15.00:1
	 * The only figure that falls is the hairline `.bottom` border at
	 * rgba(255,255,255,.15), 1.57:1 -> 1.54:1. It is decoration, not information, and 3:1
	 * was already out of reach at 8882's value.
	 *
	 * `.footer { background }` below is the ONLY consumer of this property on the whole site
	 * (verified by grep across wp-content), so nothing else moves when it changes.
	 */
	--lm-midnight-blue: #0D1232;
	--duration-fast: 120ms;
	--ease-standard: cubic-bezier(0.2, 0, 0.2, 1);
	--leading-normal: 1.5;
}

/* ---------------------------------------------------------------------------
 * Header. From post-91.css.
 *
 * The navbar itself is Tailwind, in templates/header.php, so only the scrolled
 * state needs CSS. Unit C's academy-behaviour.js adds `scrolling` to #navbar
 * above scrollY 50, matching 8882 exactly, and this is what that class paints.
 * --------------------------------------------------------------------------- */
#navbar.scrolling {
	-webkit-backdrop-filter: blur(16px);
	backdrop-filter: blur(16px);
	background: rgba(255, 255, 255, 0.7);
	box-shadow:
		0 0 0 1px rgba(17, 24, 39, 0.10),
		0 2px 2px -1px rgba(17, 24, 39, 0.05),
		0 4px 4px -2px rgba(17, 24, 39, 0.05),
		0 8px 8px -4px rgba(17, 24, 39, 0.05),
		0 0 3px 7px rgba(17, 24, 39, 0.05);
}

/* ---------------------------------------------------------------------------
 * Phosphor icon font. From post-91.css.
 *
 * The faces are declared in uploads/credit-applications/fonts.css, which is
 * first-party and ported whole (Addendum 10). These are the rules that turn an
 * <i class="ph ph-linkedin-logo"> into a glyph. The five logos are exactly the
 * five the footer social row uses.
 * --------------------------------------------------------------------------- */
.ph {
	font-family: "Phosphor" !important;
	speak: never;
	font-style: normal;
	font-weight: 400;
	font-variant: normal;
	text-transform: none;
	line-height: 1;
	letter-spacing: 0;
	font-feature-settings: "liga";
	font-variant-ligatures: discretionary-ligatures;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

.ph.ph-facebook-logo:before  { content: "\e226"; }
.ph.ph-instagram-logo:before { content: "\e2d0"; }
.ph.ph-linkedin-logo:before  { content: "\e2ee"; }
.ph.ph-x-logo:before         { content: "\e4bc"; }
.ph.ph-youtube-logo:before   { content: "\e4fc"; }

/* ---------------------------------------------------------------------------
 * Footer shell. `.footer .row` is from post-91.css; everything else in this
 * section is from post-53.css.
 * --------------------------------------------------------------------------- */
.footer .row {
	max-width: 1520px;
	margin-inline: auto;
	padding-inline: clamp(16px, 4vw, 40px);
}

.footer {
	background: var(--lm-midnight-blue);
	color: rgba(255, 255, 255, 0.85);
	padding-block: 56px 28px;
	font-size: 14px;
}

.footer .grid {
	display: grid;
	gap: 32px 24px;
	grid-template-columns: 1fr 1fr;
}

.footer .grid .brand {
	grid-column: 1 / -1;
}

@media (min-width: 768px) {
	.footer .grid {
		grid-template-columns: 2fr 1fr 1fr 1fr;
	}
	.footer .grid .brand {
		grid-column: auto;
	}
}

@media (min-width: 1280px) {
	.footer .grid {
		grid-template-columns: 1.6fr 1fr 1fr 1fr;
	}
}

.footer h5 {
	color: #fff;
	margin: 0 0 14px;
	font-size: 13px;
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
}

.footer ul {
	list-style: none;
	padding: 0;
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.footer a {
	color: rgba(255, 255, 255, 0.85);
	transition: color var(--duration-fast) var(--ease-standard);
}

.footer a:hover {
	color: #fff;
	text-decoration: underline;
	text-underline-offset: 3px;
}

/* ---------------------------------------------------------------------------
 * Footer brand column. From post-53.css.
 * --------------------------------------------------------------------------- */
.footer .brand .wordmark {
	display: flex;
	align-items: center;
	gap: 10px;
}

.footer .brand .wordmark img {
	height: 32px;
	width: auto;
}

.footer .brand p {
	margin: 14px 0 18px;
	max-width: 36ch;
	line-height: 1.55;
	color: rgba(255, 255, 255, 0.78);
}

.footer .brand .social {
	display: flex;
	gap: 10px;
}

.footer .brand .social a {
	width: 36px;
	height: 36px;
	border-radius: 50%;
	background: rgba(255, 255, 255, 0.08);
	display: grid;
	place-items: center;
}

.footer .brand .social a:hover {
	background: rgba(255, 255, 255, 0.16);
}

.footer .brand .social .ph {
	font-size: 18px;
	color: #fff;
}

/* ---------------------------------------------------------------------------
 * Footer link menus. From post-53.css.
 *
 * The `breakdance-menu` class names are load-bearing, not decoration: they are
 * what these rules key on, and templates/footer.php reproduces them for exactly
 * that reason (Addendum 8: the classes are the design). The `nav ul` and
 * `ul.menu` alternates are 8882's own belt and braces, kept so the selector
 * lists diff clean against the source.
 * --------------------------------------------------------------------------- */
.footer .breakdance-menu ul,
.footer nav ul,
.footer ul.menu,
.footer .breakdance-menu .breakdance-menu-list {
	list-style: none;
	padding: 0;
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 10px;
}

.footer .breakdance-menu li,
.footer nav li,
.footer ul.menu li,
.footer .breakdance-menu .breakdance-menu-list > li {
	margin: 0;
	padding: 0;
}

.footer .breakdance-menu a,
.footer nav a,
.footer ul.menu a {
	color: rgba(255, 255, 255, 0.85);
	font-weight: 400;
	transition: color var(--duration-fast) var(--ease-standard);
}

.footer .breakdance-menu a:hover,
.footer nav a:hover,
.footer ul.menu a:hover {
	color: #fff;
	text-decoration: underline;
	text-underline-offset: 3px;
}

.footer .breakdance-menu a.breakdance-menu-link {
	color: rgba(255, 255, 255, 0.85);
	font-weight: 400;
	font-size: 14px;
	line-height: var(--leading-normal, 1.5);
	padding: 0;
	transition: color var(--duration-fast) var(--ease-standard);
}

.footer .breakdance-menu a.breakdance-menu-link:hover {
	color: #fff;
	text-decoration: underline;
	text-underline-offset: 3px;
}

.footer .breakdance-menu .breakdance-menu-item--active a.breakdance-menu-link,
.footer .breakdance-menu .breakdance-menu-item--active:hover a.breakdance-menu-link {
	color: #fff;
}

/* Oxygen's own mobile toggle is hidden by post-53.css, which is why
 * templates/footer.php drops the button altogether. Kept so that markup copied
 * straight from 8882 still behaves. */
.footer .breakdance-menu-toggle {
	display: none;
}

/* ---------------------------------------------------------------------------
 * Footer bottom row. From post-53.css. The legal menu is the one that runs
 * horizontally.
 * --------------------------------------------------------------------------- */
.footer .bottom {
	border-top: 1px solid rgba(255, 255, 255, 0.15);
	margin-top: 36px;
	padding-top: 20px;
	display: flex;
	justify-content: space-between;
	flex-wrap: wrap;
	gap: 12px;
	font-size: 12.5px;
	color: rgba(255, 255, 255, 0.7);
}

.footer .bottom a {
	color: rgba(255, 255, 255, 0.7);
}

.footer .bottom .breakdance-menu .breakdance-menu-list {
	flex-direction: row;
	gap: 18px;
}

.footer .bottom .breakdance-menu a.breakdance-menu-link {
	color: rgba(255, 255, 255, 0.7);
	font-size: 12.5px;
}

.footer .bottom .breakdance-menu a.breakdance-menu-link:hover {
	color: #fff;
}

/* ---------------------------------------------------------------------------
 * Skip link, visible on focus. From 8882's
 * `oxygen/plugin/themeless/normalize.min.css`, rule `.oxy-skip-link:focus`.
 *
 * ACCESSIBILITY, not decoration. A skip link that never becomes visible cannot
 * be used by a sighted keyboard user, so this is a real regression against the
 * reference rather than a styling difference. Unit F's Navigator found it; the
 * fix belongs here because templates/header.php is closed.
 *
 * Our markup uses Tailwind's `sr-only` where 8882 uses `.oxy-skip-link`, so the
 * declarations below are the ones needed to undo `sr-only` on focus. Values are
 * the COMPUTED values measured on 8882 with a real Tab keypress, not the source
 * text: 8882's rule reads them from `--bde-*` custom properties that come from
 * Oxygen's global-settings.css, which contract Addendum 10 forbids porting.
 *
 *   8882 focused:  201x54 at 10,10 · padding 15px 20px · background #fff
 *                  colour rgb(17,24,39) · z-index 100000 · radius 10px
 *                  box-shadow rgba(0,0,0,.4) 0 0 4px 2px · font-weight 700
 *
 * `a.sr-only:focus` is 0,2,1 against Tailwind's `.sr-only` at 0,1,0, so it wins
 * without !important. It is deliberately scoped to an anchor: the header's
 * `<span class="sr-only">` logo label is not focusable and must stay hidden.
 * --------------------------------------------------------------------------- */
a.sr-only:focus {
	position: absolute;
	top: 10px;
	left: 10px;
	z-index: 100000;
	width: auto;
	height: auto;
	margin: 0;
	padding: 15px 20px;
	overflow: visible;
	clip: auto;
	clip-path: none;
	white-space: normal;
	border-radius: 10px;
	background: #fff;
	color: rgb(17, 24, 39);
	box-shadow: 0 0 4px 2px rgba(0, 0, 0, 0.4);
	font-size: 1em;
	font-weight: 700;
	text-decoration: none;
}

/* ---------------------------------------------------------------------------
 * Base colours extracted from 8882 `uploads/oxygen/css/global-settings.css`.
 *
 * APPLIED BY THE ORCHESTRATOR, 2026-08-25, during an agent outage. Unit C owns
 * this file; this block is queued for Navigator review (contract Addendum 17).
 *
 * Addenda 10 and 12 excluded global-settings.css wholesale because it carries a
 * heading font-family override the owner overruled in favour of Jost. That was
 * right about the font and too blunt as a blanket exclusion: the same file also
 * carries three base colour declarations academy needs. Without them the page
 * ground is pure white, so the archives' white card panel is invisible.
 *
 * Colours only. The font-family override stays excluded. #111827 is rgb(17,24,39),
 * the heading colour already measured on 8882 in Spike S, so this is consistent
 * with what we knew and does not conflict with the Jost ruling.
 * ------------------------------------------------------------------------- */
body {
	background-color: #f9fafb;
	color: #374151;
}

h1, h2, h3, h4, h5, h6 {
	color: #111827;
}

/* ---------------------------------------------------------------------------
 * Hub hero: the "Read Now" button keeps its content width from `lg` up.
 *
 * Owner ruling (contract Addendum 20) made this button always visible instead of
 * revealing it on hover, which moved it from `position:absolute` into normal
 * flow. A flex column child then stretches across the whole 550px text column,
 * so "always visible" would have quietly become "always full width". 8882 showed
 * it at 134px of content width when it revealed it, and that is the size the
 * owner asked to keep.
 *
 * This is CSS rather than a utility class because `self-start` and `w-fit` are
 * NOT in the compiled tailwind.css, which is byte-identical to 8882 and cannot
 * be regenerated. A utility that is absent from the build is a silent no-op.
 *
 * Below `lg` the button stays full width, matching 8882 at that breakpoint.
 * --------------------------------------------------------------------------- */
@media (min-width: 1024px) {
	.group\/hero-card button {
		align-self: flex-start;
	}
}

/*
 * Hub hero: hold the scrim dark across the text column (contrast, 2026-09-04).
 *
 * THE DEFECT, measured on production. The hero card carries
 * `bg-gradient-to-r from-sky-900/90 via-sky-900/70 to-sky-900/50` and `text-white`. The overlay
 * thins to 50% on the right, the near-white page ground shows through, and white text lands on
 * rgb(130,162,181):
 *
 *     alpha .90 left    7.25:1  pass
 *     alpha .70 middle  4.32:1  FAILS WCAG AA body (4.5:1)
 *     alpha .50 right   2.70:1  FAILS even large-text AA (3:1)
 *
 * The text column runs to about 55% of the card, so the heading and the description sit in the
 * failing half. This holds the scrim at .95 -> .88 across that column (8.29:1 -> 6.92:1) and
 * only then lightens to .62 behind the white book cover, where nothing is written. The design
 * intent, a left-to-right lightening toward the card, is preserved.
 *
 * WHY THIS IS CSS AND NOT A CLASS CHANGE. The utilities that would express it,
 * `from-sky-900/95`, `via-sky-900/88`, `to-sky-900/62`, are NOT in the compiled build:
 * `uploads/ezy-experiences/css/tailwind.css` is purged, and a utility that is not already in
 * use does not exist. Swapping the classes in Partials.php would silently remove the gradient
 * altogether, which is worse than the defect. See .claude/guides/TRAPS.md.
 *
 * The class is doubled for (0,2,0) so this wins regardless of stylesheet order.
 */
.group\/hero-card.group\/hero-card {
	background-image: linear-gradient(
		to right,
		rgba( 12, 74, 110, 0.95 ) 0%,
		rgba( 12, 74, 110, 0.88 ) 55%,
		rgba( 12, 74, 110, 0.62 ) 100%
	);
}
