/*
Theme Name: VidhiGurukul
Theme URI: https://vidhigurukul.com
Description: VidhiGurukul child theme -- "Reviewed in Green" (brand spec
  docs/superpowers/specs/2026-09-11-vidhi-brand-identity.md, s.3). Ink #17201C on
  a green-grey paper #F4F7F5, one accent (review green #0B6B4F), Anek Devanagari
  display + IBM Plex Sans body + Literata for the document, all self-hosted.
  8px spacing ramp, radius <= 2px, no shadows anywhere, light and dark themes.
Author: VidhiGurukul
Template: twentytwentyfive
Version: 1.0.0
Requires at least: 6.7
Tested up to: 7.1
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: vidhigurukul
*/

/* ------------------------------------------------------------------
   SELF-HOSTED FONTS (brand spec 2026-09-11, s.1 and s.3.2). Every file is
   in this theme's own assets/fonts/, built by scripts/build-fonts.py from
   the OFL masters (licences beside them). No request leaves for a font CDN.
   - Latin files carry the Latin subset only and declare its range, so the
     Rupee sign is never looked for in them.
   - "Vidhi Rupee" is U+20B9 alone, subset from IBM Plex Sans Devanagari; it
     heads every stack and downloads only on a page that prints a price.
   - IBM Plex Sans Devanagari is declared with the Devanagari blocks only, so
     a page with no Devanagari text never fetches it. The marks are inline
     SVG outlines and never ask for it either.
   ------------------------------------------------------------------ */
@font-face {
	font-family: "Vidhi Rupee";
	src: url("assets/fonts/rupee-400.woff2") format("woff2");
	font-weight: 400; font-style: normal; font-display: swap;
	unicode-range: U+20B9;
}
@font-face {
	font-family: "Vidhi Rupee";
	src: url("assets/fonts/rupee-600.woff2") format("woff2");
	font-weight: 500 800; font-style: normal; font-display: swap;
	unicode-range: U+20B9;
}
@font-face {
	font-family: "Anek Devanagari";
	src: url("assets/fonts/anek-devanagari-latin-600-700.woff2") format("woff2");
	font-weight: 600 700; font-style: normal; font-stretch: 100%; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "IBM Plex Sans";
	src: url("assets/fonts/ibm-plex-sans-latin-400.woff2") format("woff2");
	font-weight: 400; font-style: normal; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "IBM Plex Sans";
	src: url("assets/fonts/ibm-plex-sans-latin-400-italic.woff2") format("woff2");
	font-weight: 400; font-style: italic; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "IBM Plex Sans";
	src: url("assets/fonts/ibm-plex-sans-latin-600.woff2") format("woff2");
	font-weight: 600; font-style: normal; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "IBM Plex Sans Devanagari";
	src: url("assets/fonts/ibm-plex-sans-devanagari-400.woff2") format("woff2");
	font-weight: 400; font-style: normal; font-display: swap;
	unicode-range: U+0900-097F, U+1CD0-1CFF, U+A8E0-A8FF;
}
@font-face {
	font-family: "IBM Plex Sans Devanagari";
	src: url("assets/fonts/ibm-plex-sans-devanagari-600.woff2") format("woff2");
	font-weight: 500 800; font-style: normal; font-display: swap;
	unicode-range: U+0900-097F, U+1CD0-1CFF, U+A8E0-A8FF;
}
@font-face {
	font-family: "Literata";
	src: url("assets/fonts/literata-latin-400.woff2") format("woff2");
	font-weight: 400; font-style: normal; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "Literata";
	src: url("assets/fonts/literata-latin-600.woff2") format("woff2");
	font-weight: 600; font-style: normal; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: "IBM Plex Mono";
	src: url("assets/fonts/ibm-plex-mono-latin-400.woff2") format("woff2");
	font-weight: 400; font-style: normal; font-display: swap;
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2190-2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ------------------------------------------------------------------
   TOKENS (brand spec s.3.1, values verbatim). Light is the default; the
   dark block below redefines the same names and nothing else, so every
   component follows the theme without a second rule.
   ------------------------------------------------------------------ */
:root {
	color-scheme: light dark;

	--paper: #F4F7F5;          /* page ground (green-grey, not cream) */
	--page: #FFFFFF;           /* the document specimen's sheet */
	--ink: #17201C;            /* text, 15.45:1 on paper */
	--muted: #56605B;          /* secondary text, 6.05:1 */
	--green: #0B6B4F;          /* buttons, links, annotations, the review stroke */
	--on-green: #FFFFFF;       /* text on a green fill, 6.50:1 */
	--green-deep: #083F30;     /* full-bleed commitments band ground */
	--on-deep: #F4F7F5;        /* text on green-deep: paper, 11.04:1 */
	--tint: #E2EFE7;           /* annotation balloons, selected state */
	--strike: #6B736F;         /* deleted words in a specimen, always line-through */
	--rule: #D5DDD8;           /* decorative dividers only */
	--control-border: #767676; /* form controls only */
	--error: var(--error);          /* form validation only -- the one semantic colour */

	--vidg-s0: 4px;
	--vidg-s1: 8px;
	--vidg-s2: 16px;
	--vidg-s3: 24px;
	--vidg-s4: 40px;
	--vidg-s5: 64px;
	--vidg-s6: 96px;
	--vidg-s7: 128px;

	--vidg-t-label: 13px;
	--vidg-t-tiny: 13px;
	--vidg-t-small: 14px;
	--vidg-t-doc: 16px;
	--vidg-t-base: 17px;
	--vidg-t-lead: 21px;
	--vidg-t-task: 24px;
	--vidg-t-3: 21px;
	--vidg-t-2: 27px;
	--vidg-t-1: 34px;
	--vidg-t-display: 52px;

	--vidg-radius: 2px;
	--vidg-measure: 68ch;
	--vidg-measure-aside: 60ch;

	/* "Vidhi Rupee" covers U+20B9 only and heads every stack (see above). */
	--display: "Vidhi Rupee", "Anek Devanagari", "IBM Plex Sans Devanagari", system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
	--sans: "Vidhi Rupee", "IBM Plex Sans", "IBM Plex Sans Devanagari", system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
	--doc: "Vidhi Rupee", Literata, "Iowan Old Style", "Palatino Linotype", serif;
	--mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
@media (min-width: 782px) {
	:root { --vidg-t-base: 18px; --vidg-t-2: 33px; --vidg-t-1: 52px; }
}

/* Dark theme: spec s.3.1 "Dark" column, verbatim. Ground-colour text on the
   light dark-mode green (10.23:1), ink on the dark green-deep (12.53:1). */
@media (prefers-color-scheme: dark) {
	:root {
		--paper: #0E1512;
		--page: #16201B;
		--ink: #E5ECE8;
		--muted: #9FB0A8;
		--green: #6BD4A8;
		--on-green: #0E1512;
		--green-deep: #0A2C22;
		--on-deep: #E5ECE8;
		--tint: #173628;
		--strike: #7E8C86;
		--rule: #24302A;
		--control-border: #8B9A93;
		--error: #F2A5A5;
	}
}

/* theme.json's presets are re-pointed at the tokens, so WordPress's own
   global styles (body ground, links, core buttons) switch theme with them.
   :root:root outranks the global-styles :root rule whatever the load order. */
:root:root {
	--wp--preset--color--base: var(--paper);
	--wp--preset--color--contrast: var(--ink);
	--wp--preset--color--accent-1: var(--green);
	--wp--preset--color--accent-2: var(--tint);
	--wp--preset--color--accent-3: var(--green-deep);
	--wp--preset--color--accent-4: var(--muted);
	--wp--preset--color--accent-5: var(--page);
	--wp--preset--color--accent-6: var(--rule);
	--wp--preset--color--paper: var(--paper);
	--wp--preset--color--page: var(--page);
	--wp--preset--color--ink: var(--ink);
	--wp--preset--color--muted: var(--muted);
	--wp--preset--color--green: var(--green);
	--wp--preset--color--on-green: var(--on-green);
	--wp--preset--color--green-deep: var(--green-deep);
	--wp--preset--color--tint: var(--tint);
	--wp--preset--color--strike: var(--strike);
	--wp--preset--color--rule: var(--rule);
	--wp--preset--color--control-border: var(--control-border);
}

html { -webkit-text-size-adjust: 100%; }

body {
	background: var(--paper);
	color: var(--ink);
	font-family: var(--sans);
	font-size: var(--vidg-t-base);
	font-weight: 400;
	line-height: 1.6;
	margin: 0;
}

h1, h2, h3, h4, h5, h6, .vidg-display {
	font-family: var(--display);
	font-weight: 600;
	line-height: 1.15;
	letter-spacing: -0.01em;
	margin: 0 0 var(--vidg-s3);
}
h1 { font-weight: 700; line-height: 1.08; }
main h2, .vidg-section h2 { font-size: var(--vidg-t-2); }
main h3, .vidg-section h3 { font-size: var(--vidg-t-3); }

/* Links are the review green, underlined; the hover lifts the underline. */
a { color: var(--green); text-underline-offset: 0.18em; text-decoration-thickness: 1px; }
a:hover { text-decoration-thickness: 2px; }

/* The document voice (spec s.3.2): Literata, 16px, on the white page. */
.vidg-doc { font-family: var(--doc); font-size: var(--vidg-t-doc); }
code, kbd, samp, .vidg-mono { font-family: var(--mono); }

/* Labels: 13px, 600, uppercase, +0.06em (spec s.3.2). */
.vidg-label {
	font-family: var(--sans); font-size: var(--vidg-t-label); font-weight: 600;
	letter-spacing: 0.06em; text-transform: uppercase;
}

/* Every hour count, price and date is set in tabular figures so a column
   of them lines up and a changed digit does not reflow the line. */
.vidg-num, .vidg-spec-strip, .vidg-spec, .vidg-spec dd, time, .vidg-price,
.vidg-hours, table {
	font-variant-numeric: tabular-nums;
	font-feature-settings: "tnum" 1;
}
/* Figures are set in Anek Devanagari (spec s.3.2) where they stand alone. */
.vidg-num, .vidg-price, .vidg-hours { font-family: var(--display); font-weight: 600; }

/* H1: 52px desktop / 34 mobile (spec s.3.2). --vidg-t-1 carries both
   values via the breakpoint on :root. Scoped to main/section so it outranks
   the global-styles `h1{}` rule regardless of stylesheet order. */
main h1, .vidg-section h1, .vidg-hero h1 { font-size: var(--vidg-t-1); }

/* HARD CAP. The review calls this the single biggest typographic fix. */
.vidg-prose { max-width: var(--vidg-measure); }
.vidg-prose > * { max-width: var(--vidg-measure); }
/* I10 follow-up: a browser-default trailing <p>/<div> margin-bottom was
   adding ~18px on top of the section's own exact 96/64 rhythm wherever a
   section's last child was .vidg-prose (measured via a live DOM probe
   after the padding fix: most section-to-H2 gaps read exactly 96px, two
   read 114px, traced to this). */
.vidg-prose > *:last-child { margin-bottom: 0; }
.vidg-aside { max-width: var(--vidg-measure-aside); }
.vidg-prose p, .vidg-prose li, .vidg-prose dd, .vidg-prose blockquote { line-height: 1.6; }
.vidg-lede, .vidg-hero-sub { font-size: 19px; line-height: 1.45; max-width: var(--vidg-measure); }
@media (min-width: 782px) { .vidg-lede, .vidg-hero-sub { font-size: var(--vidg-t-lead); line-height: 1.4; } }

.vidg-wrap { max-width: 720px; margin-inline: auto; padding-inline: var(--vidg-s3); }
.vidg-wrap-wide { max-width: 1080px; margin-inline: auto; padding-inline: var(--vidg-s3); }

/* Section rhythm: 96 desktop / 64 mobile. Review I10: `padding-block` used
   to put the FULL rhythm value on BOTH the top and the bottom of every
   section, so two adjacent sections summed to double the spec (measured
   216-241px desktop / 152-177px mobile against 96/64) -- on top of which
   the parent theme's own global blockGap (theme.json styles.spacing.
   blockGap: 24px) adds a further WP-managed margin-top to this and every
   other top-level block sibling. Bottom-only padding gives exactly ONE
   rhythm gap between two .vidg-section elements; margin-block:0 kills the
   inherited blockGap; the first child inside a section (the eyebrow or the
   H2 itself) is a second possible source of a stacked top margin, so it is
   zeroed explicitly rather than trusted to have none.
   The FIRST section on a page is the exception: it sits directly under the
   header rule, so a full 64px of air above the eyebrow buys nothing and
   costs a phone reader most of what they can see before scrolling. Every
   page template's <main> wraps exactly one top-level block (see
   theme/templates/*.html), so `main > .vidg-section:first-child` reliably
   catches that first section on EVERY page -- the compliance pages and
   /courses/, which render as a single top-level .vidg-section with no #top
   id, not only the homepage/course-detail pages that already used #top. */
.vidg-section { padding-top: 0; padding-bottom: var(--vidg-s5); margin-block: 0; }
.vidg-section#top, main > .vidg-section:first-child { padding-top: var(--vidg-s3); }
.vidg-section > *:first-child { margin-top: 0; }
/* Review m7 (course-page rhythm still uneven at 1440: 121/137/41/121/163px
   against the 96/64 spec): the same class of bug I10 already found and
   fixed once, for .vidg-prose specifically ("a browser-default trailing
   <p>/<div> margin-bottom was adding ~18px on top of the section's own
   exact rhythm"). .vidg-section's padding-bottom is a fixed box-model
   value and cannot itself vary -- an UNEVEN gap after it can only come from
   an un-zeroed trailing margin on whatever the section's actual last child
   is, and several of this page's own components (.vidg-faculty-card,
   .vidg-two-col, .vidg-syllabus + its trailing footnote paragraph,
   .vidg-unsettled) are not .vidg-prose, so I10's fix never reached them.
   Generalised here to every section's last child, not only prose ones --
   this also closes the deficit side (the syllabus footnote "sticking to"
   Prerequisites): if it or any future section's true last element ever
   carried a stray bottom margin either direction, it no longer can. */
.vidg-section > *:last-child { margin-bottom: 0; }
@media (min-width: 782px) {
	.vidg-section { padding-bottom: var(--vidg-s6); }
	.vidg-section#top, main > .vidg-section:first-child { padding-top: var(--vidg-s5); }
}

/* Green is the reviewer's pen: links, buttons, annotations, labels and the
   one review stroke. A section heading is not one of those, so it carries
   no green rule -- it is separated by space alone. */
.vidg-section-title {
	font-size: var(--vidg-t-2);
	margin-bottom: var(--vidg-s4);
}
.vidg-eyebrow {
	font-family: var(--sans);
	font-size: var(--vidg-t-label);
	font-weight: 600;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--green);
	margin: 0 0 var(--vidg-s2);
}

/* ------------------------------------------------------------------ HEADER */
.vidg-header {
	border-bottom: 1px solid var(--rule);
	background: var(--paper);
}
/* Review R3 m4 residual: measured 141px at 375 (target ~110-120). Row-gap
   (the space between row 1 -- logo+button -- and row 2's wrapped nav) and
   block padding were the two contributors the >=44px tap-target floors
   (m4's own earlier fix, .vidg-nav/.vidg-header-login below) do not touch:
   12px padding-block and an 8px row-gap, restored to their larger,
   original values once the header actually has room (>=900px, n5 below)
   to sit as one row instead of two. column-gap (the space between the
   logo and the button on row 1) is untouched -- the review never
   flagged it.

   Review R4 m4 (chunk U3a): 12px padding-block still measured 125px at
   375, above the R3 target of <=120 -- the two 44px tap-target floors
   below (.vidg-nav, .vidg-header-login) leave padding-block as the one
   remaining lever that does not undercut either. 4px off top and bottom
   (12px -> 8px) is the fix's own suggested amount. */
.vidg-header-inner {
	max-width: 1080px; margin-inline: auto; padding: 8px var(--vidg-s3);
	display: flex; flex-wrap: wrap; row-gap: 8px; column-gap: var(--vidg-s3);
	align-items: center; justify-content: space-between;
}
/* Same 900px breakpoint as n5's grid switch below -- once the header is a
   single row, row-gap is moot and the larger block padding applies. */
@media (min-width: 900px) { .vidg-header-inner { padding-block: var(--vidg-s3); row-gap: var(--vidg-s2); } }

/* Review R3 n1: on /for-teams/ at 375 the 185px-wide "Tell us about your
   team" label cannot sit beside the logo, so the header grows a third row
   (measured 197px, 24% of the first screen) instead of wrapping cleanly
   like every other page's shorter "Get notified"/"Student login" text.
   The identical call to action already sits in the hero, on the first
   screen, about 300px below -- so the header copy is hidden here rather
   than shortened; `.vidg-for-teams-page` is the body class
   vidg-blocks.php's body_class filter already emits for this page. */
@media (max-width: 599px) {
	.vidg-for-teams-page .vidg-header-login { display: none; }
}

/* The lockup is inline SVG outlines (brand spec s.4); these classes paint
   it from the tokens, so it turns over with the theme. */
.vidg-wordmark { display: inline-flex; color: var(--ink); text-decoration: none; line-height: 0; }
.vidg-wordmark .vidg-lockup { display: block; height: 40px; width: auto; }
@media (min-width: 782px) { .vidg-wordmark .vidg-lockup { height: 48px; } }
.vidg-lockup-mark { fill: var(--green); }
.vidg-lockup-stroke { stroke: var(--green); }
.vidg-lockup-word, .vidg-lockup-deva { fill: var(--ink); }
.vidg-wordmark-text {
	font-family: var(--display); font-weight: 700; font-size: var(--vidg-t-lead);
	line-height: 1.2; letter-spacing: -0.01em;
}
/* Chunk B1: nav dropped from four labels to three (Courses / How a cohort
   runs / About -- Contact moved to the footer) and a separate "Student
   login" button was added.
   Review R3 n5 (was flex `order`, which reshuffles PAINT order only --
   sequential Tab navigation always follows DOM order regardless, so a
   layout whose visual order does not match source order leaves a
   backward Tab step at whichever breakpoint the two disagree; the old
   wordmark/nav/button source order was Tab-correct at >=782px but not
   below it). vidg_ui_header() (vidg-ui.php) now emits wordmark, button,
   nav -- already the correct reading order for the <900px stacked
   layout below (row 1: logo, button; row 2: nav -- no `order` needed,
   nav's own width:100% forces its own row regardless of source
   position). At >=900px (the same breakpoint N2 uses for the hero)
   grid-template-areas places the source-earlier button AFTER nav
   visually without moving either in the DOM, the one mechanism that can
   do that. Nav's own internal spacing (three labels, 16px gaps, 13px
   text under 400px) is unchanged from chunk A. */
/* Review m4: the nav row itself gets an explicit floor so wrapped lines
   never render shorter than their own links' tap target. */
.vidg-nav { display: flex; flex-wrap: wrap; align-items: center; gap: var(--vidg-s1) var(--vidg-s2); min-height: 44px; }
@media (max-width: 899px) { .vidg-nav { width: 100%; justify-content: space-between; } }
@media (min-width: 900px) {
	.vidg-header-inner {
		display: grid; grid-template-columns: auto 1fr auto;
		grid-template-areas: "logo nav btn"; align-items: center;
	}
	.vidg-wordmark { grid-area: logo; }
	.vidg-nav { grid-area: nav; gap: var(--vidg-s3); }
	.vidg-header-login { grid-area: btn; }
}
/* Review m4 (was Minor 5, PARTLY): min-height:44px alone should have been a
   44px floor on the CONTENT box, but this element has no box-sizing:
   border-box, so the 8px block padding was ADDED on top of whatever the
   text's own line-height produced -- measured 39px, not the 44+16=60px
   that combination implies, and the review's own re-measurement after R1a's
   fix still read short of 44. Dropping the padding entirely and relying on
   min-height alone (with flex centring, so the text position doesn't need
   the padding to look right) makes 44px the actual, guaranteed floor
   instead of a number two other properties could undercut. */
.vidg-nav a {
	color: var(--ink); text-decoration: none; font-size: var(--vidg-t-small);
	font-weight: 600; letter-spacing: 0.02em;
	border-bottom: 2px solid transparent;
	display: inline-flex; align-items: center; min-height: 44px;
}
.vidg-nav a:hover, .vidg-nav a:focus-visible { border-bottom-color: var(--green); }
/* After the base rule on purpose: same specificity, so order decides. */
@media (max-width: 399px) { .vidg-nav a { font-size: var(--vidg-t-label); letter-spacing: 0; } }

/* Student login: a button, not a nav link -- outlined in green (not the
   solid CTA fill, so it never competes with the hero's primary button),
   compact enough to sit beside the lockup on a 360px phone.
   Review m4: measured 35px tall -- padding-only sizing (8px block + a
   ~17px text line-height + a 1px border each side). Same fix as the nav
   links above: an explicit min-height with flex centring, no block
   padding relied on for size. */
.vidg-header-login {
	display: inline-flex; align-items: center; justify-content: center; white-space: nowrap; flex-shrink: 0;
	min-height: 44px; padding-block: 0; padding-inline: var(--vidg-s2);
	border: 1px solid var(--green); border-radius: var(--vidg-radius);
	color: var(--green); background: transparent;
	font-family: var(--sans); font-weight: 600; font-size: var(--vidg-t-small);
	text-decoration: none; line-height: 1.2;
}
.vidg-header-login:hover, .vidg-header-login:focus-visible {
	background: var(--green); color: var(--on-green);
}
@media (max-width: 359px) { .vidg-header-login { padding-inline: var(--vidg-s1); font-size: var(--vidg-t-label); } }

/* ------------------------------------------------------------------ FOOTER */
/* Review R3 m7 residual: this margin-top:96px was a SECOND source of the
   same space the last section on every page already provides via its own
   padding-bottom (.vidg-section's general 96px/64px rhythm rule, near the
   top of this file) -- the two stacked to 192px (1440) / 160px (375) of
   empty paper before the footer rule, against the site's own accepted
   96/64 band elsewhere. Every page template ends its <main> in a
   .vidg-section (the compliance pages, /courses/, /for-teams/ and every
   course page all confirmed by reading their render functions), so that
   padding-bottom alone is already the correct, page-type-agnostic 96/64 --
   this rule no longer adds a second, unconditional one on top of it. */
.vidg-footer {
	border-top: 1px solid var(--rule);
	background: var(--page);
	font-size: var(--vidg-t-small);
}
/* Review R3 m7 residual, part 2 (found in THIS session's own live
   verification, not the review's own measurement): removing
   .vidg-footer's own margin-top above closed one of two sources but left
   24px of gap unaccounted for -- the semantic <footer> element itself
   (every template's `wp:template-part {"slug":"footer","tagName":
   "footer"}`, theme/templates/*.html) carries its OWN margin-top:24px,
   the SAME root-level `:where(.is-layout-flow) > * + *` block-gap that
   caused .vidg-commitments' margin-top above, just applied one level up
   (between <main> and <footer> as siblings of the template's own flow
   root, rather than between .vidg-commitments and its own siblings
   inside <main>). Same fix, same reasoning: `:where()` is always zero
   specificity, so this plain element selector beats it regardless of
   source order. */
footer.wp-block-template-part { margin-top: 0; }
.vidg-footer-inner {
	max-width: 1080px; margin-inline: auto; padding: var(--vidg-s5) var(--vidg-s3);
	display: grid; gap: var(--vidg-s4);
}
/* Five columns (chunk B1, extended by benchmark M5/chunk U4: Courses /
   About+How a cohort runs / compliance / Seller / Contact -- "Seller" is
   the new column, the compact proprietor/GSTIN/address block that used to
   live only on the homepage). 2x2(+1) from 560px so the compliance list --
   five links, one of them two words -- never has to squeeze into a
   quarter of a 782px row; full 1x5 only once there is genuinely a
   fifth-width to spare. */
@media (min-width: 560px) { .vidg-footer-inner { grid-template-columns: 1fr 1fr; } }
@media (min-width: 900px) { .vidg-footer-inner { grid-template-columns: repeat(5, 1fr); } }
/* Minor 1: was `.vidg-footer h2` -- these are link-list labels, not
   headings (the markup now uses a styled <p> inside a <nav aria-label>). */
.vidg-footer-label {
	font-family: var(--sans); font-size: var(--vidg-t-tiny); font-weight: 600;
	letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted);
	margin: 0 0 var(--vidg-s2);
}
.vidg-footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--vidg-s1); }
/* Review Minor 5: measured at 18px tall -- min-height plus vertical
   centring, not a bigger font, since the footer's compact size is
   otherwise deliberate. */
.vidg-footer ul li { min-height: 32px; display: flex; align-items: center; }
.vidg-footer a { color: var(--ink); }
/* Review Minor 6: this used to ALSO carry `max-width:
   var(--vidg-measure-aside)` (~60ch, narrower than the 1080px wrapper),
   so `margin-inline:auto` centred that narrower box inside the wrapper
   -- x=468px on the live page, aligned to no footer column. Dropping the
   second max-width leaves this box the same 1080px, centred wrapper as
   .vidg-footer-inner, so its text starts flush at the same inset column
   1 starts at, instead of floating in the middle. */
.vidg-footer-note {
	max-width: 1080px; margin-inline: auto; padding: 0 var(--vidg-s3) var(--vidg-s5);
	color: var(--muted);
}

/* ------------------------------------------------------------------ HERO */
.vidg-hero { padding-block: var(--vidg-s4) var(--vidg-s5); }
@media (min-width: 782px) { .vidg-hero { padding-block: var(--vidg-s5) var(--vidg-s6); } }

/* Chunk B2 (spec s.3.4 item 2): split hero. One column on a phone -- the
   specimen (DOM order: after the copy) stacks below the text, satisfying
   "mobile: sheet below the text" without a separate mobile-only markup. */
.vidg-hero-grid { display: grid; gap: var(--vidg-s5); }
@media (min-width: 900px) {
	.vidg-hero-grid { grid-template-columns: minmax(0, 1fr) minmax(300px, 420px); align-items: start; gap: var(--vidg-s6); }
}
.vidg-hero-copy { min-width: 0; }
.vidg-hero-notify { margin-top: var(--vidg-s4); }

/* Review N2 (WCAG 2.4.3, Level A -- was I1's mobile reorder, R1b's
   display:contents + CSS `order` implementation of it). That mechanism
   changed the VISUAL order without changing the DOM order, so a keyboard
   Tab sequence and a screen reader both still followed the old DOM order
   -- button, then form, then back up to the specimen. There is no
   display:contents+order fix for reading order; only DOM order fixes
   reading order, so vidg-sections.php's vidg_section_hero() and
   course-detail.php's vidg_course_fold() now emit their children in the
   real mobile order already (H1, support/title/hours/outcome, specimen,
   actions, form) -- at <900px that is simply the grid's default single
   column with no CSS reorder of any kind.
   At >=900px, grid-template-areas place the specimen as its own right-hand
   column while the DOM order above is untouched; the desktop focus order
   (left copy -> right specimen -> further left copy) is fine because the
   specimen is visibly its own column, exactly the case the review carves
   out as acceptable. Two different hero shapes share .vidg-hero-grid, so
   they get their own area names: .vidg-hero-home is the homepage hero
   (H1, .vidg-hero-sub, .vidg-specimen, .vidg-actions, .vidg-hero-notify);
   the course-page fold (.vidg-hero.vidg-section) has its own four
   left-column pieces plus a fold visual that is EITHER the specimen OR the
   document-checklist preview (never both), so both selectors share the
   same "spec" area. /for-teams/'s hero uses neither class, so it keeps the
   grid's plain two-box auto-placement (copy block, specimen) -- its mobile
   stacking was never the defect the review measured. */
@media (min-width: 900px) {
	/* The actual CSS grid container is .vidg-hero-grid (a DIV nested
	   inside the .vidg-hero-home/.vidg-hero.vidg-section SECTION) --
	   grid-template-areas has to be set on the grid container itself, not
	   on its ancestor, or it silently computes to `none` and every child's
	   grid-area falls back to auto-placement (confirmed live: this exact
	   mistake shipped once and produced a stacked, overlapping hero at
	   1440 before being caught in this same verification pass). */
	.vidg-hero-home .vidg-hero-grid {
		grid-template-areas:
			"h1   spec"
			"sub  spec"
			"act  spec"
			"form spec";
	}
	.vidg-hero-home h1 { grid-area: h1; }
	.vidg-hero-home .vidg-hero-sub { grid-area: sub; }
	.vidg-hero-home .vidg-specimen { grid-area: spec; }
	.vidg-hero-home .vidg-actions { grid-area: act; }
	.vidg-hero-home .vidg-hero-notify { grid-area: form; }

	.vidg-hero.vidg-section .vidg-hero-grid {
		grid-template-areas:
			"h1    spec"
			"title spec"
			"hours spec"
			"leave spec"
			"form  spec";
	}
	.vidg-hero.vidg-section h1 { grid-area: h1; }
	.vidg-hero.vidg-section .vidg-course-official-title { grid-area: title; }
	.vidg-hero.vidg-section .vidg-course-hours { grid-area: hours; }
	.vidg-hero.vidg-section .vidg-course-first-outcome { grid-area: leave; }
	/* Benchmark C3 (chunk U2): the fold visual is now the miniature PLUS
	   the full specimen, one wrapper (.vidg-course-visual,
	   vidg_course_fold_visual(), templates/course-detail.php) so the grid
	   still sees exactly one child for the "spec" area -- were the
	   miniature a separate flat child of .vidg-hero-grid instead, it
	   would have no grid-area of its own and fall into implicit
	   auto-placement, overlapping the named areas above. .vidg-fold-checklist
	   is dead CSS (no PHP call site emits it since review N6 replaced the
	   checklist preview with a specimen for every course) and is dropped
	   from this selector rather than carried forward unused. */
	.vidg-hero.vidg-section .vidg-course-visual { grid-area: spec; }
	.vidg-hero.vidg-section .vidg-hero-notify { grid-area: form; }
}

/* Review N3: at <900px the previous mechanism (display:contents, deleted by
   N2) stacked the grid's own row-gap ON TOP OF each child's own
   multi-purpose margin (an H1's 24px section-heading margin, a bare <p>'s
   browser default, .vidg-actions' 40px margin-top, .vidg-hero-notify's own
   40px margin-top) -- measured 80-110px between every element, with the
   form landing at y 1,429-1,573, about 1.8 screens down with no button
   anywhere on the first screen.
   `row-gap:0` on the two hero shapes N2 restructured makes each child's own
   margin-bottom the ONLY source of space to what follows (grid items never
   collapse adjacent margins the way normal-flow siblings do, so there is no
   double-counting to guard against); each margin-top is zeroed so nothing
   the child brings from its OWN base rule (e.g. .vidg-actions' 40px, used
   elsewhere) adds a second gap on top of the previous element's
   margin-bottom. Values are the review's own, not re-derived: expected
   result is `/` 's form at about y 1,150 and a course page's at about
   y 1,250 -- every hero gap here is 24px or less. Desktop (>=900px) is
   untouched: the specimen is a separate column there, so this compact
   mobile rhythm does not apply.

   Review R3 C1 (Critical): the `row-gap:0` two lines below used to target
   `.vidg-hero-home, .vidg-hero.vidg-section` -- the outer <SECTION>, an
   ANCESTOR of the actual `display:grid` element, `.vidg-hero-grid` (a DIV
   nested inside it). Setting row-gap on a non-grid ancestor does nothing;
   the grid's own `gap:var(--vidg-s5)` (64px) / `gap:var(--vidg-s6)` (96px,
   >=900px) kept computing on `.vidg-hero-grid` itself the whole time. This
   is the SAME ancestor-vs-container mistake fix-up a53e47ca already
   corrected once for `grid-template-areas` on this exact element pair (see
   the comment above the >=900px area rules). At <900px this left N3
   "fixed" only in the child-margin values (which shipped exactly as
   specified) while the grid's own 64px row-gap still stacked on top of
   them, measuring 80-110px per gap instead of <=24. At >=900px it was
   worse: N2 flattened the homepage/course-fold copy from one grid item
   into several (h1, sub/title/hours/outcome, actions/form), so the 96px
   `gap` (never zeroed anywhere at this width before) fell BETWEEN every
   one of those newly-separate items -- 136-176px voids, and the desktop
   form pushed to y 849-945 (`/`) / 945 (course pages), off the first
   screen entirely.

   Fix: row-gap:0 on `.vidg-hero-grid` itself (unscoped by width, so it
   applies at every breakpoint -- specificity (0,2,0) beats the base
   `.vidg-hero-grid{gap:...}` rule's (0,1,0) regardless of source order),
   plus the additive column-gap the two-column layout still needs restated
   the same way (`.vidg-hero-grid` already sets `column-gap` via `gap`'s
   shorthand at >=900px; row-gap:0 here only zeroes the ROW axis, leaving
   the >=900px column-gap between the copy and the specimen untouched).
   At >=900px, `grid-template-rows: auto ... 1fr` on each hero's grid
   container replaces the row COUNT `grid-template-areas` already implies,
   so any spare height the specimen column contributes lands in the final
   1fr track after the form, never redistributed as extra space between
   copy lines; explicit per-child margins (mirroring the <900px values
   above, at desktop's own scale) become the only vertical rhythm inside
   the left column, the same "no other numeric source of space" principle
   N3's fix already established for mobile. */
.vidg-hero-home .vidg-hero-grid,
.vidg-hero.vidg-section .vidg-hero-grid { row-gap: 0; }

@media (min-width: 900px) {
	.vidg-hero-home .vidg-hero-grid { grid-template-rows: auto auto auto 1fr; }
	.vidg-hero.vidg-section .vidg-hero-grid { grid-template-rows: auto auto auto auto 1fr; }
	.vidg-hero-home h1 { margin-bottom: 24px; }
	.vidg-hero-home .vidg-hero-sub { margin: 0 0 32px; }
	.vidg-hero-home .vidg-actions { margin: 0 0 40px; }
	.vidg-hero-home .vidg-hero-notify { margin-top: 0; }
	.vidg-hero.vidg-section h1 { margin-bottom: 16px; }
	.vidg-hero.vidg-section .vidg-course-official-title,
	.vidg-hero.vidg-section .vidg-course-hours { margin: 0 0 8px; }
	.vidg-hero.vidg-section .vidg-course-first-outcome { margin: 0 0 32px; }
	.vidg-hero.vidg-section .vidg-hero-notify { margin-top: 0; }
}

@media (max-width: 899px) {
	.vidg-hero-home h1 { margin-bottom: 16px; }
	.vidg-hero-home .vidg-hero-sub { margin: 0 0 24px; }
	.vidg-hero-home .vidg-specimen { margin-bottom: 24px; }
	.vidg-hero-home .vidg-actions { margin-top: 0; margin-bottom: 24px; }
	.vidg-hero-home .vidg-hero-notify { margin-top: 0; }

	.vidg-hero.vidg-section h1 { margin-bottom: 8px; }
	.vidg-hero.vidg-section .vidg-course-official-title { margin-bottom: 8px; }
	.vidg-hero.vidg-section .vidg-course-hours { margin-bottom: 16px; }
	.vidg-hero.vidg-section .vidg-course-first-outcome { margin-bottom: 16px; }
	.vidg-hero.vidg-section .vidg-course-visual { margin-top: 0; margin-bottom: 16px; }
	.vidg-hero.vidg-section .vidg-hero-notify { margin-top: 0; }
}

/* Residual from round 5 (U3c outcome, this chunk's own brief item 6):
   Contracts' e-mail form measured y 1,443 at 375, 43px over the <=1,400
   target -- the one course whose default-visible specimen carries TWO
   Added blocks (clauses 15.2 and 15.3; see vidg-course-specimens.php's own
   comment on why both qualify under the sentence-boundary rule). Two
   mobile-only trims, neither touching a single word of the legally
   checked clause or note text:
    - the two margins just above (course-first-outcome, course-visual)
      drop from 24px to 16px, saving 16px total -- these apply on EVERY
      course page, so a course with no Added block (Arbitration, DPDP)
      only gets 16px more headroom against this same budget, never less;
    - .vidg-added-block's own N2-ruled 8px margin (round-5 ruling, see
      this file's own comment on that rule) is tightened further, but
      ONLY below 900px -- N2's 8px stands unchanged at every width this
      chunk does not touch (>=900px), so nothing about that ruling's own
      number is reopened, only extended with a narrower, mobile-specific
      case a two-Added-block clause needs and a one-Added-block clause
      (Employment, Corporate) does not strictly require. */
@media (max-width: 899px) {
	.vidg-added-block { margin: 4px 0; }
	.vidg-specimen-notes { margin-top: var(--vidg-s2); padding-top: var(--vidg-s2); gap: var(--vidg-s1); }
}

/* The review stroke (spec s.3.3.2): at most once per page, under this
   hero's key phrase. Decorative only -- the SVG itself carries
   aria-hidden -- so no focus ring, no hit target, nothing but colour. */
.vidg-review-phrase { position: relative; display: inline-block; }
.vidg-review-stroke {
	position: absolute; left: 0; right: 0; bottom: -0.16em;
	width: 100%; height: 0.32em; overflow: visible; pointer-events: none;
}
.vidg-review-stroke path { stroke: var(--green); }

/* --------------------------------------------------- SPECIMEN MINIATURE */
/* Benchmark C3 (chunk U2): a small typeset "cover" of a course's own
   specimen sheet, heading its tile (home + /courses/, vidg_task_tile()),
   the For Teams course list (vidg_teams_course_tile()) and the course's
   own hero (vidg_course_fold_visual(), wrapped with the full specimen in
   .vidg-course-visual). Literata (var(--doc), the document voice) on
   --page, a green left rule standing in for "this has been marked up",
   and one short marked phrase in --green rather than the full ins/del
   diff -- deliberately not a byte-for-byte shrink of the real specimen,
   which the notes/toggle markup would make illegible at this size.
   Inline HTML/CSS from the site's own fonts, exactly like the OG image --
   no <img>, nothing generated at request time, no stock photograph.
   Always aria-hidden (vidg_specimen_miniature()'s own comment says why);
   the real specimen is never more than the tile's own link away. */
.vidg-specimen-mini {
	border: 1px solid var(--rule); border-left: 3px solid var(--green); border-radius: var(--vidg-radius);
	background: var(--page); padding: 10px 12px; box-shadow: none;
}
.vidg-specimen-mini-num {
	margin: 0 0 4px; font-family: var(--sans); font-size: 11px; font-weight: 700;
	letter-spacing: 0.04em; color: var(--muted);
}
.vidg-specimen-mini-text {
	margin: 0; font-family: var(--doc); font-size: 13px; line-height: 1.5; color: var(--ink);
	display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;
}
/* Review I2 (chunk U3b): raised from 2 to 4 lines -- the excerpt is now
   generated to START at the specimen's first change
   (vidg_specimen_mini_excerpt(), mu-plugins/vidg-course-specimens.php), so
   the green (or, now, struck-through) span sits near the top of the text.
   3 (the review's own "clamp at 3 lines where 2 would hide every green
   span" instruction, taken as a floor, not a ceiling) still clipped the
   green on three of five courses at this tile's REAL measured width
   (223px at 1440 -- narrower than assumed) once the excerpt generator was
   fixed to keep the excerpt CONTIGUOUS with the clause rather than
   skipping across a long deletion (see vidg_specimen_mini_excerpt()'s own
   comment on why skipping was tried and reverted). 4 lines fits every one
   of today's five specimens at both 1440 and 375, verified live via
   vidhigurukul-U3b-shots/probe.js's own rendered-geometry check. */
.vidg-specimen-mini-mark { color: var(--green); text-decoration: underline; text-decoration-thickness: 1.5px; text-underline-offset: 0.14em; }
/* Review I2 (chunk U3b): the miniature now also shows the clause's own
   <del> text (never rendered here before) -- "keep that course's own
   ins/del spans exactly" -- struck through, same convention as the full
   specimen's own .vidg-clause del (style.css, below). */
.vidg-specimen-mini-del { color: var(--strike); text-decoration: line-through; }
/* Review m2 (chunk U3a): measured only 8px (the tile's own flex `gap`
   alone) between the miniature's bottom edge and the heading below it --
   under the tile's own 16-24px rhythm every other pair of elements here
   keeps. An explicit margin restores it without touching the flex `gap`
   itself, which still does its job spacing every OTHER pair of tile
   children. */
.vidg-tile-link > .vidg-specimen-mini { margin-bottom: var(--vidg-s2); }
/* Review I1 (chunk U3a): the course hero no longer emits a miniature
   (templates/course-detail.php's vidg_course_fold_visual()) -- the rule
   that spaced it from the full specimen below it is dropped as dead CSS
   rather than kept for a selector nothing matches any more. */
.vidg-course-visual { min-width: 0; }

/* --------------------------------------------------------- HERO SPECIMEN */
/* Spec s.3.3.1 / s.3.5: a clause on a white --page sheet, 1px rule, no
   radius, no shadow, Literata 16px (via .vidg-clause -> .vidg-doc rules
   above). Deletions in --strike with line-through; insertions
   green-underlined; margin notes in Plex Sans italic, green, numbered and
   linked both ways. */
.vidg-specimen { min-width: 0; }
.vidg-specimen-head {
	display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
	gap: var(--vidg-s2); margin-bottom: var(--vidg-s2);
}
.vidg-specimen-label {
	font-family: var(--sans); font-size: var(--vidg-t-label); font-weight: 600;
	letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); margin: 0;
}
.vidg-specimen-toggles { display: flex; flex-wrap: wrap; gap: var(--vidg-s1); }
/* Review R3 n4: measured 36px tall (8px block padding + a ~20px text
   line-height) at 375, below the 44px floor the site's other controls
   meet (.vidg-nav a, .vidg-header-login, m4). min-height + flex centring
   is the same fix already used for those -- an explicit floor the padding
   alone cannot undercut. */
.vidg-specimen-toggle {
	font-family: var(--sans); font-weight: 600; font-size: var(--vidg-t-small);
	color: var(--green); background: transparent; border: 1px solid var(--green);
	border-radius: var(--vidg-radius); padding: var(--vidg-s1) var(--vidg-s2); cursor: pointer;
	display: inline-flex; align-items: center; min-height: 44px;
}
/* Benchmark H6: the draft/review toggle is a real two-button group now
   (vidg-sections.php, vidg_hero_specimen()), each carrying aria-pressed as
   its ONE state channel -- the button whose data-vidg-view-btn matches the
   panel currently showing gets the fill. The notes-disclosure toggle keeps
   aria-expanded, which doubles as the correct selector for ITS fill. */
.vidg-specimen-toggle:hover, .vidg-specimen-toggle:focus-visible,
.vidg-specimen-toggle[aria-pressed="true"],
.vidg-specimen-toggle[aria-expanded="true"] { background: var(--green); color: var(--on-green); }
/* Review m1 (chunk U3a): the notes-disclosure toggle shared the general
   [aria-expanded="true"] fill above, so when expanded it turned the same
   solid green as the PRESSED Learner's-draft/Reviewed segment -- two
   different kinds of control both reading as "selected". The disclosure
   is not a pressed state, it is a reveal; it stays outlined in both
   states, and only its label (set by vidg-specimen.js) carries which
   state it is in. Higher specificity than the shared rule above so it
   wins regardless of source order; :hover/:focus-visible still fill, same
   as every other .vidg-specimen-toggle. */
.vidg-specimen-toggle.vidg-notes-toggle[aria-expanded="true"] { background: transparent; color: var(--green); }

/* Benchmark H6: notes 2-3 ship `hidden`, with a toggle to reveal them, at
   EVERY width now -- the review's own compact mobile state used to be
   force-overridden at >=900px (all three notes always shown, the toggle
   hidden), which the benchmark names as the exact "desktop and mobile
   behave differently" defect to fix. No width-scoped override here means
   there is nothing left to keep them apart. */

/* "The sheet: --page ground, 1px rule, no radius, no shadow." Radius and
   shadow are set to 0/none explicitly rather than inheriting
   --vidg-radius, because this component's radius is spec'd as zero even
   though most of the site's bordered boxes use the 2px token. */
.vidg-specimen-sheet {
	background: var(--page); border: 1px solid var(--rule); border-radius: 0;
	box-shadow: none; padding: var(--vidg-s3);
}
@media (min-width: 782px) { .vidg-specimen-sheet { padding: var(--vidg-s4); } }

/* Entrance fade on the panel a toggle click reveals. The site-wide
   `@media (prefers-reduced-motion: reduce)` rule near the bottom of this
   file already forces `animation: none !important` on everything,
   including this one, so "no transition under prefers-reduced-motion" is
   satisfied by that single existing rule rather than a second check here. */
.vidg-specimen-view.vidg-fade-in { animation: vidg-specimen-fade 0.2s ease; }
@keyframes vidg-specimen-fade { from { opacity: 0; } to { opacity: 1; } }

.vidg-clause { font-family: var(--doc); font-size: var(--vidg-t-doc); line-height: 1.7; margin: 0; max-width: none; }
.vidg-clause ins { color: var(--green); text-decoration: underline; text-decoration-thickness: 1.5px; text-underline-offset: 0.14em; }
.vidg-clause del { color: var(--strike); text-decoration: line-through; }
/* Review I3 (chunk U3b), spec §3.3 extension, restructured by review N1
   (Critical) and N2 (chunk U3c): a qualifying inserted passage
   (vidg_added_passage_open()/close(), mu-plugins/vidg-course-specimens.php)
   renders in --ink with NO underline and a 2px --green left margin bar --
   but the block-level element carrying that bar is now `.vidg-added-block`,
   the WRAPPER around the `<ins>` and its own trailing `<sup>` footnote
   reference (where one exists), not the `<ins>` itself. N1: when the bar
   sat on the `<ins>` alone, its own trailing `<sup>` was a bare sibling of
   a block-level element -- which, in ordinary CSS flow, starts a fresh
   line box, landing the reference alone on its own line or leading
   straight into the next sentence (two statutory notes visibly annotating
   the wrong sentence). Moving the wrapper one level up so it contains the
   `<sup>` too puts the reference back in normal inline flow at the end of
   the passage's own last line. N2: the margin either side is now 8px, was
   16, and the left padding (between the bar and the text) is also 8px, was
   16 -- U3b's own 16px margins plus the label's own line (below) cost
   Contracts/Corporate/Employment 83-137px of the CR1 layout budget U3a had
   just won; see vidhigurukul-U3a-report.md's own CR1 table and this
   chunk's probe, which now asserts against it directly. Employment's own
   default-visible Added block (a 39-word sentence) still measures over
   U3a's own pre-Added-block 727px budget even after both cuts -- see this
   chunk's own report for why a passage this long, block-styled per N3's
   own sentence-boundary rule, cannot fully return to a number set before
   the Added-block feature existed. */
.vidg-added-block {
	display: block; border-left: 2px solid var(--green); padding-left: var(--vidg-s1);
	margin: var(--vidg-s1) 0;
}
.vidg-clause ins.vidg-ins-added { display: inline; color: var(--ink); text-decoration: none; }
/* N2(b): a RUN-IN label on the passage's own first line, not a line of its
   own -- U3b's `display:block` label plus its own margin-bottom was one of
   N1's own orphan-line contributors (nothing on the block's first line to
   share it with). Still 13px Plex, aria-hidden, green. */
.vidg-added-label {
	display: inline; font-family: var(--sans); font-size: 13px; font-weight: 700;
	color: var(--green); text-transform: uppercase; letter-spacing: 0.06em; margin-right: 0.5em;
}

/* A plain bold, underlined digit -- not a circle badge. A circle built
   from padding + border-radius:50% is only round when the box is square;
   this one (asymmetric padding around a narrow glyph) rendered as a thin
   ellipse that read as a paper-plane icon rather than a numeral once
   screenshotted at real size, so the shape is dropped rather than fixed. */
.vidg-note-mark { line-height: 0; }
.vidg-note-mark a {
	font-family: var(--sans); font-size: 12px; font-weight: 700; color: var(--green);
	text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 2px;
}
.vidg-note-mark a:hover, .vidg-note-mark a:focus-visible { background: var(--tint); }

.vidg-specimen-notes {
	list-style: none; margin: var(--vidg-s3) 0 0; padding-top: var(--vidg-s3);
	border-top: 1px solid var(--rule); display: grid; gap: var(--vidg-s2);
}
.vidg-specimen-notes li {
	font-family: var(--sans); font-style: italic; font-size: var(--vidg-t-small);
	color: var(--green); line-height: 1.55;
}
.vidg-specimen-notes li a { font-style: normal; font-weight: 700; color: var(--green); text-decoration: none; margin-right: 6px; }
.vidg-specimen-notes li a:hover, .vidg-specimen-notes li a:focus-visible { text-decoration: underline; }

.vidg-specimen-sign { margin: var(--vidg-s3) 0 0; font-family: var(--sans); font-size: var(--vidg-t-small); color: var(--muted); }

.vidg-actions { display: flex; flex-wrap: wrap; gap: var(--vidg-s2); margin-top: var(--vidg-s4); align-items: center; }

/* Benchmark H1 (chunk U1): the guarantee row under the notify form's own
   submit button (vidg_guarantee_row(), vidg-sections.php). Same small,
   muted treatment as .vidg-notify-small, its own class so it can be found
   and tuned separately from that component's many other call sites. */
.vidg-guarantee-row { font-size: var(--vidg-t-small); color: var(--muted); margin: var(--vidg-s2) 0 0; }
.vidg-guarantee-row a { font-weight: 600; }

/* Benchmark H2: the small "How we use your e-mail" link inside the
   consent label's own <span> -- deliberately a touch smaller than the
   consent sentence around it, per the brief's own "small link" wording. */
.vidg-consent-privacy { font-size: var(--vidg-t-tiny); font-weight: 600; margin-left: 2px; white-space: nowrap; }

/* Buttons. Green fill, white text (ground-colour text in dark), radius 2px,
   no shadow. Hover inverts to ink-on-paper: no colour outside the palette. */
.vidg-btn, .wp-element-button {
	display: inline-block; padding: var(--vidg-s2) var(--vidg-s3);
	background: var(--green); color: var(--on-green);
	font-weight: 600; font-size: var(--vidg-t-base); text-decoration: none;
	border: 1px solid var(--green); border-radius: var(--vidg-radius); cursor: pointer;
	font-family: var(--sans); line-height: 1.4; box-shadow: none;
}
.vidg-btn:hover, .vidg-btn:focus-visible,
.wp-element-button:hover, .wp-element-button:focus-visible { background: var(--ink); border-color: var(--ink); color: var(--paper); }
.vidg-btn-quiet {
	background: transparent; color: var(--ink); border-color: var(--control-border);
}
.vidg-btn-quiet:hover, .vidg-btn-quiet:focus-visible { background: transparent; color: var(--ink); border-color: var(--ink); }

/* ------------------------------------------------------------ TASK TILES */
/* Benchmark M1 (chunk U4): the "I work as..." index above the tiles --
   plain rows of prose with inline links, DELIBERATELY not styled as chips,
   pills, buttons or a tab strip (spec s.3.4 item 3 forbids filter chips
   under nine courses; this is cross-reference prose, not a filter). A 1px
   top rule between rows is the only separation device, matching the FAQ's
   own <details> rule (style.css, .vidg-faq details) rather than inventing
   a second list treatment. */
.vidg-workas-list { list-style: none; margin: var(--vidg-s3) 0 0; padding: 0; max-width: var(--vidg-measure); }
.vidg-workas-list li { padding: var(--vidg-s2) 0; border-top: 1px solid var(--rule); }
.vidg-workas-list li:first-child { border-top: none; padding-top: 0; }
.vidg-workas-list strong { color: var(--ink); }

/* Spec s.3.6: task phrase, official title, law area, "You leave with"
   (verbatim), hours, "For" (three roles), link -- one tile per course,
   the whole tile a single <a> so it is one tab stop. 3 columns desktop,
   1 mobile. Review I8/I9: this is now the ONE tile anatomy the homepage
   grid, the /courses/ catalogue grid and the For Teams sixth card all
   share (templates/catalogue.php's own vidg-card/vidg-card-grid classes,
   used only there before, are retired in the same change) -- uniform
   3-column grid, no wide/spanning cell. */
.vidg-tile-grid { display: grid; gap: var(--vidg-s3); list-style: none; margin: 0; padding: 0; grid-template-columns: 1fr; }
@media (min-width: 900px) {
	.vidg-tile-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--vidg-s4); }
}
/* Review m9: /for-teams/'s "The five courses" grid has five tiles in the
   site's standard 3-column layout, leaving row two's third cell empty at
   1440. A grid can't centre a short last row on its own; flexbox can --
   `justify-content:center` centres EACH wrapped line independently, so row
   one (three tiles, filling the row) is unaffected and row two (two tiles)
   centres instead of sitting flush left against a visible gap. The
   flex-basis reproduces the same three-column width the grid rule above
   computes, so this reads as the same grid, not a different layout. */
@media (min-width: 900px) {
	.vidg-tile-grid-orphan { display: flex; flex-wrap: wrap; justify-content: center; }
	.vidg-tile-grid-orphan > li { flex: 0 1 calc((100% - 2 * var(--vidg-s4)) / 3); }
}
/* Review m6: this used to be the ONE <a> wrapping an entire tile's every
   line, so its accessible name was the whole card read out -- 60-90 words,
   including "Not for:" -- which meets M11's aim (distinct link names) by
   accident but is unusable in a links list. It is now a plain <div> (the
   box, border, hover state); only the task-phrase/title heading
   (.vidg-tile-heading-link, below) is a real <a>, and a stretched ::after
   on that link keeps the whole card clickable exactly as before -- the
   standard "card as link" pattern with one honestly-named link per card. */
.vidg-tile-link {
	position: relative;
	display: flex; flex-direction: column; gap: var(--vidg-s1); height: 100%; box-sizing: border-box;
	padding: var(--vidg-s3); border: 1px solid var(--rule); border-radius: var(--vidg-radius);
	background: var(--paper); color: var(--ink); box-shadow: none;
}
@media (min-width: 782px) { .vidg-tile-link { padding: var(--vidg-s4); } }
/* :hover on the box fires for the mouse over any part of the card already
   (hover bubbles from the stretched link's own hit area up through its
   ancestors); :has() picks up the keyboard-focus case, since the focused
   element is now a descendant <a>, not the box itself. Both degrade
   gracefully in a browser without :has() support -- the link's own global
   focus ring (a:focus-visible, further down this file) still shows either
   way, this only loses the bonus border colour. */
.vidg-tile-link:hover, .vidg-tile-link:has(.vidg-tile-heading-link:focus-visible) { border-color: var(--green); }
.vidg-tile-heading-link { color: inherit; text-decoration: none; }
.vidg-tile-heading-link::after { content: ""; position: absolute; inset: 0; }
.vidg-tile-task { font-family: var(--display); font-weight: 600; font-size: var(--vidg-t-task); line-height: 1.25; margin: 0; }
.vidg-tile-task .vidg-tile-heading-link,
.vidg-tile-title .vidg-tile-heading-link { color: inherit; font: inherit; }
.vidg-tile-title { font-family: var(--sans); font-size: 15px; color: var(--muted); margin: 0; }
.vidg-tile-area {
	font-family: var(--sans); font-size: var(--vidg-t-label); font-weight: 600;
	letter-spacing: 0.06em; text-transform: uppercase; color: var(--green); margin: 0;
}
.vidg-tile-leave, .vidg-tile-for, .vidg-tile-not-for { font-size: var(--vidg-t-small); margin: 0; }
.vidg-tile-hours {
	font-family: var(--display); font-weight: 600; font-size: var(--vidg-t-base);
	font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; margin: 0;
}
.vidg-tile-cta { margin-top: auto; padding-top: var(--vidg-s2); font-weight: 600; color: var(--green); }

/* Review N5 (optional half): the For Teams tile now carries real content
   (vidg_for_teams_tile(), vidg-teams.php) -- a --tint ground marks it as a
   different KIND of card (an organisation offer, not a sixth course) rather
   than another --paper card that happens to say "For Teams". */
.vidg-tile-teams .vidg-tile-link { background: var(--tint); }

/* ------------------------------------------------- COURSE PAGE SPEC BLOCK */
.vidg-spec {
	margin: var(--vidg-s3) 0 0; padding: var(--vidg-s3);
	border: 1px solid var(--rule); border-radius: var(--vidg-radius);
	/* Two columns even on the narrowest phone. One column made this block
	   six rows tall and pushed the buyer's first question below the fold,
	   which is the one thing the review says it must never do. */
	display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--vidg-s2) var(--vidg-s3); background: var(--page);
}
@media (min-width: 640px) { .vidg-spec { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--vidg-s2) var(--vidg-s4); } }
/* Review R3 n9: at 1440 the refund strip's middle label ("AFTER CLASS 1,
   BEFORE CLASS 2 BEGINS") wraps to two lines, so its "Full refund" sat
   ~21px below column 1's identical "Full refund" -- each `<div>` is an
   independent grid item with its own internal block flow, so a taller dt
   in one column pushes that column's dd down with no shared row track to
   align it against its row-mates. `dl.vidg-spec` has exactly two real
   instances (this refund strip, /for-teams/'s Fees/Law degree/Faculty
   row), neither of which uses `.vidg-spec-wide` (dead CSS -- no PHP call
   site emits it), so a subgrid applied to every `.vidg-spec > div` is safe
   for both. grid-template-rows:auto auto gives the parent exactly the two
   row tracks a dt/dd pair needs; each child then opts into THOSE tracks
   (rather than making its own) via subgrid, so the tallest dt in the row
   sets row 1's height for every column and every dd lines up in row 2. */
@media (min-width: 640px) {
	.vidg-spec { grid-template-rows: auto auto; }
	.vidg-spec > div { display: grid; grid-row: span 2; grid-template-rows: subgrid; }
}
.vidg-spec div { min-width: 0; }
.vidg-spec dt {
	font-size: var(--vidg-t-tiny); font-weight: 600; letter-spacing: 0.08em;
	text-transform: uppercase; color: var(--muted); margin-bottom: 2px;
}
.vidg-spec dd { margin: 0; font-size: var(--vidg-t-base); font-weight: 600; }
.vidg-spec dd small { display: block; font-weight: 400; font-size: var(--vidg-t-small); color: var(--muted); }
/* The prerequisite is a sentence, not a value: it spans the grid and drops
   to body weight so it does not shout alongside "36 hours". */
.vidg-spec .vidg-spec-wide { grid-column: 1 / -1; border-top: 1px solid var(--rule); padding-top: var(--vidg-s2); }
.vidg-spec .vidg-spec-wide dd { font-weight: 400; font-size: var(--vidg-t-small); max-width: var(--vidg-measure); }

/* Review N8: dl.vidg-spec is the site's three-item FACT STRIP (the refund
   page's rule summary; /for-teams/'s Fees/Law degree/Faculty row) -- the
   base rule above computes two ~126.5px columns for exactly three items at
   this width, so the third item's row has an empty, ragged second column
   and the refund page's longest label ("From class 2 -- No change-of-mind
   refund...") wraps to five lines alone. A single column with a rule
   between rows reads as a short list, not a broken table, at the width
   this component actually needs to work at. */
@media (max-width: 599px) {
	dl.vidg-spec { grid-template-columns: 1fr; gap: 0; }
	dl.vidg-spec > div { padding-block: var(--vidg-s2); border-top: 1px solid var(--rule); }
	dl.vidg-spec > div:first-child { border-top: 0; padding-top: 0; }
	dl.vidg-spec > div:last-child { padding-bottom: 0; }
}

/* --------------------------------------------------------- COURSE FOLD */
/* Chunk C (brief step 1): the course page's own split fold, reusing
   .vidg-hero-grid (the homepage hero's two-column/900px rule) rather than
   declaring a second, near-identical grid. Left column carries, in DOM
   order (so it is also the mobile order): task-phrase H1, official title,
   hours, the first "What you leave with" item, the notify form. */
.vidg-course-official-title { font-family: var(--sans); color: var(--muted); font-size: var(--vidg-t-lead); margin: 0 0 var(--vidg-s2); }
/* Review N4 (chunk U3c): this row used to also carry .vidg-num, which
   opted the WHOLE row into Anek Devanagari 600 tabular figures -- measured
   at 3 lines at 1440 and 5 (136px) at 375, the heaviest text in the first
   screen after the H1. It is now set in Plex Sans itself; .vidg-num is
   scoped to the two literal figures only (48, 15), via that class's own
   existing font-family/tabular-nums rule (near the top of this file, "spec
   §3.2... where they stand alone"). */
.vidg-course-hours { font-family: var(--sans); font-size: 15px; font-weight: 600; line-height: 1.5; margin: 0 0 var(--vidg-s3); }
/* The separator itself, never a bare glyph glued between two implode()'d
   strings (measured at 0px advance in the served Anek stack, review N4) --
   real margin either side, in Plex, aria-hidden (decorative only; the
   items themselves are the content a screen reader needs). */
.vidg-course-hours .vidg-sep { font-family: var(--sans); font-weight: 400; margin-inline: 0.35em; color: var(--muted); }
.vidg-course-first-outcome {
	display: flex; align-items: flex-start; gap: var(--vidg-s1);
	margin: 0 0 var(--vidg-s4); max-width: var(--vidg-measure-aside);
}
.vidg-course-first-outcome .vidg-doc-glyph { flex: none; margin-top: 3px; }

/* The fold's right-column preview (arbitration: the specimen, reused
   as-is; every other course: a document-checklist preview). */
.vidg-fold-checklist {
	border: 1px solid var(--rule); border-radius: var(--vidg-radius);
	background: var(--page); padding: var(--vidg-s3); min-width: 0; box-shadow: none;
}
@media (min-width: 782px) { .vidg-fold-checklist { padding: var(--vidg-s4); } }

/* ----------------------------------------------------- DOCUMENT CHECKLIST */
/* "What you leave with", rendered as a document glyph + text per item
   (brief step 2), used both in full (the body section) and as a preview
   (the fold's right column). */
.vidg-doc-checklist { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--vidg-s2); max-width: var(--vidg-measure); }
.vidg-doc-checklist li { display: flex; align-items: flex-start; gap: var(--vidg-s2); }
.vidg-doc-glyph { flex: none; width: 18px; height: 18px; margin-top: 2px; }
.vidg-doc-glyph path { stroke: var(--green); }

/* ------------------------------------------------------- FACULTY CARD */
/* Brief step 2 / brand spec s.9.1: "Lead faculty -- named before enrolment
   opens", with the course's discipline. No name, no photo, no shadow. */
.vidg-faculty-card {
	border: 1px solid var(--rule); border-radius: var(--vidg-radius);
	background: var(--page); padding: var(--vidg-s3); box-shadow: none; max-width: var(--vidg-measure-aside);
}
@media (min-width: 782px) { .vidg-faculty-card { padding: var(--vidg-s4); } }
/* Review m3 (chunk U3b): a two-column grid -- a left column reserved for a
   photo and a name (vidg_course_faculty(), templates/catalogue.php),
   everything else in a right column -- so that supplying real faculty
   later changes this card's CONTENT, not its layout. Single column on
   mobile (the photo/name block stacks above the body), matching
   .vidg-two-col's own 782px breakpoint elsewhere on this page. */
.vidg-faculty-grid { display: grid; gap: var(--vidg-s3); }
@media (min-width: 782px) { .vidg-faculty-grid { grid-template-columns: 88px 1fr; align-items: start; } }
.vidg-faculty-photo-col { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
/* Empty chrome, not a placeholder image -- this brand's catalogue already
   carries a hard "no icon set, no illustration" rule (templates/
   catalogue.php's own header comment); a generic silhouette here would be
   exactly that. A bordered slot says "a photo goes here" without drawing
   one. */
/* Review m2 (chunk U3c): a bordered dashed box read as a broken image or a
   CMS drop zone -- filled with the brand's own वि monogram instead
   (--green on --tint), no dashed border, same 88x88 footprint so a real
   photo (vidg_course_faculty()) replaces this element's content only,
   never its layout. */
.vidg-faculty-photo-slot {
	width: 88px; height: 88px; border-radius: var(--vidg-radius); background: var(--tint);
	display: flex; align-items: center; justify-content: center;
}
.vidg-faculty-photo-mono { font-family: var(--display); font-size: 32px; font-weight: 700; color: var(--green); line-height: 1; }
.vidg-faculty-photo { width: 88px; height: 88px; object-fit: cover; border-radius: var(--vidg-radius); display: block; }
.vidg-faculty-name { margin: 0; font-weight: 600; color: var(--ink); font-size: 15px; }
.vidg-faculty-body { min-width: 0; }
.vidg-faculty-line { margin: 0; font-weight: 600; }
.vidg-faculty-credentials { list-style: none; margin: var(--vidg-s2) 0 0; padding: 0; display: grid; gap: 4px; color: var(--ink); font-size: 15px; }
/* Review m3: "Teaches and reviews" was a single muted 14px run-on line;
   it is now a labelled <ul> of module titles WITH their hours, in --ink
   at 15px (the review's own acceptance wording) -- only the hours stay
   --muted, still at 15px so no muted text in the card falls under 15px. */
.vidg-faculty-modules-label { margin: var(--vidg-s2) 0 6px; font-weight: 600; color: var(--ink); font-size: 15px; }
.vidg-faculty-modules { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.vidg-faculty-modules li { display: flex; justify-content: space-between; gap: var(--vidg-s2); color: var(--ink); font-size: 15px; }
.vidg-faculty-modules .vidg-num { color: var(--muted); font-size: 15px; white-space: nowrap; }
/* Benchmark H3 (chunk U1): the closing "before you can pay" line.
   Review m3: bumped from the site's 14px --vidg-t-small to 15px -- the
   review's own acceptance test is "no muted text below 15px in the card". */
.vidg-faculty-note { margin: var(--vidg-s2) 0 0; font-weight: 400; color: var(--muted); font-size: 15px; }

/* ------------------------------------------------------ FOR / NOT FOR */
.vidg-two-col { display: grid; gap: var(--vidg-s3); }
@media (min-width: 782px) { .vidg-two-col { grid-template-columns: 1fr 1fr; gap: var(--vidg-s4); } }
.vidg-two-col > div {
	border: 1px solid var(--rule); border-radius: var(--vidg-radius); padding: var(--vidg-s3);
}
.vidg-two-col h3 { font-size: var(--vidg-t-lead); }
.vidg-two-col ul { margin: 0; padding-left: 1.1em; display: grid; gap: var(--vidg-s1); }

/* ------------------------------------------------------------- SYLLABUS */
.vidg-syllabus { display: grid; gap: var(--vidg-s1); }
.vidg-syllabus details {
	border: 1px solid var(--rule); border-radius: var(--vidg-radius); background: var(--paper);
}
.vidg-syllabus summary {
	cursor: pointer; padding: var(--vidg-s2) var(--vidg-s3); font-weight: 600;
	display: grid; grid-template-columns: 1fr auto auto; gap: var(--vidg-s2) var(--vidg-s3);
	align-items: baseline; list-style: none;
}
/* A flex/grid <summary> loses its native disclosure triangle in every
   browser, which leaves six identical boxes that give a reader no reason to
   think they open. The +/- is that affordance, put back by hand. */
.vidg-syllabus summary::-webkit-details-marker { display: none; }
.vidg-syllabus summary::after {
	content: "+"; color: var(--green); font-weight: 700; font-size: var(--vidg-t-lead);
	line-height: 1; justify-self: end;
}
.vidg-syllabus details[open] > summary::after { content: "\2013"; }
.vidg-syllabus summary .vidg-num { font-weight: 400; color: var(--muted); font-size: var(--vidg-t-small); white-space: nowrap; }
.vidg-syllabus .vidg-syllabus-body { padding: 0 var(--vidg-s3) var(--vidg-s3); max-width: var(--vidg-measure); }
.vidg-syllabus ul { margin: 0; padding-left: 1.1em; display: grid; gap: 4px; }

/* --------------------------------------------------------- COMMITMENTS */
/* Full-bleed on green-deep with paper text (spec s.3.4 item 5). */
.vidg-commitments { background: var(--green-deep); color: var(--on-deep); }
/* Review R3 m7 residual: measured margin-top:24px on this element with no
   rule of this theme's own setting it -- <main class="wp-block-group"> has
   layout:{"type":"default"} (theme/templates/*.html), and core's global
   styles give every `.is-layout-flow` container's block-gap as
   `:where(.is-layout-flow) > * + *` between its top-level children.
   `:where()` always carries zero specificity, so a plain class selector
   like this one -- (0,1,0) -- beats it outright regardless of source
   order; no !important needed. This pushed the space above the band to
   120/88 instead of the accepted 96/64 rhythm (N1, above). */
.vidg-commitments { margin-block-start: 0; }
.vidg-commitments .vidg-section-title, .vidg-commitments h2 { color: var(--on-deep); }
.vidg-commitments a { color: var(--on-deep); }

/* Review N1 (Critical, regression from R1a's I10 fix): the markup is
   <section class="vidg-commitments"><div class="vidg-section ...">...</div></section>
   -- the inner .vidg-section's OWN padding-top:0/padding-bottom:96/64 (the
   general section rhythm rule above) already gives the band's BOTTOM its
   96/64 of green padding before the colour changes back, and gives the
   band's TOP nothing at all, because "first child of main" is the only
   exception that rule carves out. The band is never that: it always has a
   section before it. The fix is two more rules, not a change to the
   general one (which every other section on the site still needs
   untouched): the child .vidg-section gets its OWN top padding (green,
   inside the band, above the H2), and the NEXT section -- the sibling
   AFTER .vidg-commitments closes, back on --paper -- gets top padding of
   its own, because a section immediately following a full-bleed colour
   change cannot borrow the previous section's bottom padding the way two
   consecutive --paper sections do (that padding is on the wrong side of
   the colour edge to read as space at all).
   Acceptance: band top -> H2 = 96/64, band bottom -> next H2 = 96/64, on
   all four templates ("/"' , "/courses/", both course-page shapes), both
   themes. */
.vidg-commitments > .vidg-section { padding-top: var(--vidg-s5); }
.vidg-commitments + .vidg-section { padding-top: var(--vidg-s5); }
@media (min-width: 782px) {
	.vidg-commitments > .vidg-section { padding-top: var(--vidg-s6); }
	.vidg-commitments + .vidg-section { padding-top: var(--vidg-s6); }
}
/* Review Minor 10: in dark mode --green-deep (#0A2C22) separates only
   weakly from the #0E1512 ground. Light mode is unaffected -- there the
   same band sits against --paper (#F4F7F5), which the review never
   flagged. */
@media (prefers-color-scheme: dark) {
	.vidg-commitments { border-block: 1px solid var(--rule); }
}
.vidg-commitment-grid { display: grid; gap: var(--vidg-s4); list-style: none; margin: 0; padding: 0; }
@media (min-width: 900px) { .vidg-commitment-grid { grid-template-columns: repeat(3, 1fr); } }
.vidg-commitment-grid h3 { color: var(--on-deep); font-size: var(--vidg-t-lead); }
.vidg-commitment-grid p { max-width: var(--vidg-measure-aside); }
.vidg-band-sand { background: var(--tint); }

/* --------------------------------------------------------- NOTIFY FORM */
.vidg-notify {
	border: 1px solid var(--rule); border-radius: var(--vidg-radius); padding: var(--vidg-s3);
	max-width: var(--vidg-measure); background: var(--paper);
}
.vidg-notify.vidg-notify-onink { background: transparent; border-color: var(--on-deep); }
.vidg-notify label { display: block; font-weight: 600; font-size: var(--vidg-t-small); margin-bottom: var(--vidg-s1); }
.vidg-notify input[type="email"] {
	width: 100%; box-sizing: border-box; padding: var(--vidg-s2);
	border: 1px solid var(--control-border); border-radius: var(--vidg-radius); font: inherit;
	font-size: var(--vidg-t-base); background: var(--page); color: var(--ink);
}
.vidg-notify input[type="email"]:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
/* Review I3: `.vidg-notify label { display:block; font-weight:600; ... }`
   above has the SAME specificity as a bare `.vidg-consent` rule (both
   class+type = (0,1,1)) and used to win the tie by source order, which is
   why this label ran 3-5 lines at weight 600 with the text wrapping under
   the checkbox instead of beside it. `label.vidg-consent` matches that
   specificity exactly and, declared after, wins deterministically in both
   the notify form and the For Teams form. */
label.vidg-consent {
	display: grid; grid-template-columns: 24px 1fr; gap: var(--vidg-s1);
	align-items: start; font-weight: 400; font-size: 15px; margin-top: var(--vidg-s2);
}
label.vidg-consent span { max-width: var(--vidg-measure-aside); }

/* ---------------------------------------------------- CUSTOM CHECKBOXES/RADIOS */
/* Review m5: `accent-color` only paints a native control's CHECKED state --
   the UNCHECKED box stayed the browser/OS's own default fill, which in dark
   mode is a plain grey square that ignores accent-color entirely (measured
   live on the consent checkbox and, per the same finding, the For Teams
   form's team-size radios and courses-of-interest checkboxes).
   appearance:none removes the native control altogether, so every state --
   unchecked, checked, and focus (the existing global :focus-visible rule
   still applies, unchanged) -- is drawn from the theme's own tokens. */
input[type="checkbox"], input[type="radio"] {
	appearance: none; -webkit-appearance: none; margin: 0;
	width: 20px; height: 20px; flex: none; box-sizing: border-box;
	border: 1px solid var(--control-border); border-radius: var(--vidg-radius);
	background: var(--paper);
	display: inline-grid; place-content: center;
}
input[type="radio"] { border-radius: 50%; }
input[type="checkbox"]:checked, input[type="radio"]:checked {
	background: var(--green); border-color: var(--green);
}
/* A paper-coloured tick, drawn from a rotated two-sided border rather than
   an image asset -- crisp at any zoom, no extra request, themes with the
   token like every other mark on the site. */
input[type="checkbox"]:checked::before {
	content: ""; width: 10px; height: 6px;
	border-left: 2px solid var(--paper); border-bottom: 2px solid var(--paper);
	transform: rotate(-45deg) translateY(-1px);
}
input[type="radio"]:checked::before {
	content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--paper);
}
.vidg-notify .vidg-btn { margin-top: var(--vidg-s2); }
.vidg-notify-small { font-size: var(--vidg-t-small); color: var(--muted); margin: var(--vidg-s2) 0 0; }
.vidg-notify-onink .vidg-notify-small { color: var(--on-deep); }
/* Semantic colour is used for form validation and for nothing else. */
.vidg-form-error { color: var(--error); font-size: var(--vidg-t-small); margin: var(--vidg-s2) 0 0; font-weight: 600; }
.vidg-form-ok { color: var(--green); font-size: var(--vidg-t-small); margin: var(--vidg-s2) 0 0; font-weight: 600; }
.vidg-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

/* ------------------------------------------------------- STICKY MOBILE BAR */
/* Review m3: measured 91px tall (16px block padding + a 58px .vidg-btn),
   about 11% of a 812px viewport -- on first load it cut the fold's own
   first-outcome line in half. 10px block padding + a 44px button (the
   site's own comfortable tap-target floor, matching .vidg-nav a and the
   header button elsewhere) gives a 64px bar instead. */
.vidg-sticky {
	position: fixed; inset-inline: 0; bottom: 0; z-index: 40;
	background: var(--paper); color: var(--ink); border-top: 1px solid var(--control-border);
	display: flex; align-items: center; justify-content: space-between;
	gap: var(--vidg-s2); padding: 10px var(--vidg-s3);
	font-size: var(--vidg-t-small);
}
.vidg-sticky a {
	color: var(--on-green); background: var(--green); border-color: var(--green);
	display: inline-flex; align-items: center; justify-content: center;
	min-height: 44px; padding-block: 0;
	/* Benchmark H4 (chunk U1) fix-up: `.vidg-num` below is flex:1 1 auto, so
	   once the bar's own two flex children stop fitting the fixed 375px
	   bar (measured live: they do, once the text carries both the hours and
	   the cohort status), the default flex-shrink:1 this button inherited
	   let IT shrink too -- squeezing "Notify me" narrower than its own
	   single-line width and wrapping it to two lines, which grew the bar to
	   ~70px, past R3's fixed 64px. flex-shrink:0 + white-space:nowrap keep
	   this button at its natural single-line size always; `.vidg-num`'s own
	   overflow:hidden/ellipsis (below) is the ONLY thing that gives. */
	flex-shrink: 0; white-space: nowrap;
}
.vidg-sticky a:hover, .vidg-sticky a:focus-visible { background: var(--ink); border-color: var(--ink); color: var(--paper); }
/* The bar's text is a sentence ("40 teaching hours"), not a figure standing
   alone: it stays in Plex. In Anek the middle dot sits tight against the
   next word and the space reads as missing. */
/* Benchmark H4 (chunk U1): the bar's text now carries the hours AND the
   cohort status ("40 hours -- Not yet scheduled") -- longer than the hours
   figure alone R3's 64px bar height was measured against. Rather than
   letting a long combination wrap to a second line (which would grow the
   bar past the fixed 64px R3's scroll-padding-bottom/body padding-bottom
   are set to -- see the WCAG 2.4.11 comment below), the text clips with an
   ellipsis and stays single-line at every width: the bar's own height, and
   every protection keyed to it, is unchanged by this copy change. */
.vidg-sticky .vidg-num {
	font-family: var(--sans); font-weight: 600;
	flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* Review I6 (chunk U3a): at the primary width (measured on a 375 iPhone
   viewport, the site's own no-scroll floor is 320) the combined text
   ("48 hours -- Not yet scheduled") clipped to an ellipsis mid-word --
   the one word the bar exists to state. Below 400px the hours prefix
   (course-detail.php's own `.vidg-sticky-hours` span) is dropped
   entirely, leaving the status alone; it has room to sit on one line
   without an ellipsis at 320-399px. From 400px up both parts show,
   exactly as before this fix -- the bar's own height (below) is
   untouched either way. */
@media (max-width: 399px) { .vidg-sticky-hours { display: none; } }
@media (min-width: 782px) { .vidg-sticky { display: none; } }
/* Review Minor 3: hidden (JS, vidg-sticky.js) while any notify form is on
   screen, so it never sits over the hero e-mail field on first load. */
.vidg-sticky[hidden] { display: none; }
body.vidg-has-sticky { padding-bottom: 64px; } /* review m3: the bar is now 64px, not 91px */
@media (min-width: 782px) { body.vidg-has-sticky { padding-bottom: 0; } }

/* Review R3 I1 (WCAG 2.2 SC 2.4.11 Focus Not Obscured (Minimum), Level AA):
   with `scroll-padding-bottom` left at its default (auto), the browser
   scrolls a newly-focused element flush to the viewport's own bottom
   edge -- directly under this fixed bar, which sat over 8 of 59 Tab stops
   per course page (3 of them entirely hidden). `vidg-has-sticky` is the
   SAME body class is_singular('vidg_course') already emits
   (vidg-blocks.php's body_class filter) for the bar's own padding-bottom
   above, so nothing new needs detecting.
   scroll-padding only takes effect on the element that is actually the
   document's scrolling box -- in standards mode (every page on this site)
   that is the root <html> element, not <body>, so the selector below
   reads the class off body via :has() rather than declaring the property
   on body directly, where it would silently do nothing. This is a
   plain :has()-based selector for the SCROLL-PADDING TARGET only; it is
   not the ":has() to detect whether the bar exists" pattern the body-class
   emission above was deliberately written to avoid. 84px = the bar's own
   67px plus 17px of breathing room, matching the review's own figure. */
@media (max-width: 899px) {
	:root:has(body.vidg-has-sticky) { scroll-padding-bottom: 84px; }
}

/* --------------------------------------------------------- UNSETTLED BOX */
.vidg-unsettled {
	/* Review I13: was the only dark-ink-bordered container on the site;
	   --rule is the system's own decorative-divider colour. */
	border: 1px solid var(--rule); border-radius: var(--vidg-radius); padding: var(--vidg-s3);
	max-width: var(--vidg-measure); background: var(--paper);
}
.vidg-unsettled h2, .vidg-unsettled h3 { font-size: var(--vidg-t-lead); margin-bottom: var(--vidg-s2); }
.vidg-unsettled ul { margin: 0; padding-left: 1.1em; display: grid; gap: var(--vidg-s2); }

/* A fact the operator has not supplied. It is rendered as an honest policy
   sentence in ordinary prose -- never a bracketed build token -- and carries a
   data attribute + HTML comment so the outstanding list stays greppable.
   Styled quietly on purpose: it is a commitment, not a warning. */
.vidg-fact-note { font-style: normal; color: var(--ink); }

/* ------------------------------------------------------------------ FAQ */
.vidg-faq { display: grid; gap: var(--vidg-s1); max-width: var(--vidg-measure); }
.vidg-faq details { border: 1px solid var(--rule); border-radius: var(--vidg-radius); }
.vidg-faq summary { cursor: pointer; padding: var(--vidg-s2) var(--vidg-s3); font-weight: 600; }
.vidg-faq .vidg-faq-body { padding: 0 var(--vidg-s3) var(--vidg-s3); }

/* ------------------------------------------------------- LEGAL / PROSE */
/* Review round-1's unruled Gemini-derived minor, ruled ACCEPT this round:
   the compliance-page column measured 720px / ~81 characters a line
   (type.txt) against the 68ch spec. `.vidg-legal` is always the SAME
   element as `.vidg-prose` (vidg_block_legal_page(): one div, class=
   "vidg-prose vidg-legal"), which already carries max-width:var(--vidg-
   measure) -- so this second, explicit rule on `.vidg-legal` alone is
   belt-and-braces against the exact width ever depending on which of the
   two classes' rule happens to be declared later, rather than leaving it
   to a cascade tie a future edit could quietly flip. */
.vidg-legal { max-width: var(--vidg-measure); }
.vidg-legal h2 { font-size: var(--vidg-t-3); margin-top: var(--vidg-s5); }
.vidg-legal h3 { font-size: var(--vidg-t-lead); margin-top: var(--vidg-s4); }
.vidg-legal ul, .vidg-legal ol { max-width: var(--vidg-measure); padding-left: 1.2em; }
.vidg-legal li { margin-bottom: var(--vidg-s1); }
.vidg-legal dt { font-weight: 600; margin-top: var(--vidg-s2); }
.vidg-legal dd { margin: 0; }

/* Review R3 n3: at >=900px "Who we are" (vidg_section_who_we_are(),
   vidg-sections.php) becomes a two-column layout -- prose on the left,
   the seller and Grievance Officer `dl`s together on their own sheet to
   the right, on --page with a 1px --rule, no shadow, radius no greater
   than the site's own `--vidg-radius` floor (spec s.3's "no shadow,
   radius<=2" rule for every other sheet on the site -- the specimen's
   own .vidg-specimen-sheet uses the identical --page/--rule/no-shadow
   treatment). Below 900px `.vidg-who-grid` sets nothing (no `display`
   override), so the two `.vidg-prose` children stay in normal block flow
   and simply stack -- the single-column mobile rendering this section
   always had. */
/* Review m3 (chunk U3b review round-5): below 900px the two .vidg-prose
   blocks simply stacked in source order with no visible seam between
   them -- the seller/Grievance-Officer sheet read as a straight
   continuation of the first paragraph's prose, not its own card. The
   sheet's own border/padding/background are now unconditional (moved out
   of the >=900px query below), with a --vidg-s3 gap above it at every
   width; the query now only turns the SECTION into a two-column grid,
   where the gap comes from the grid's own `gap` instead. */
.vidg-who-sheet {
	background: var(--page); border: 1px solid var(--rule);
	border-radius: var(--vidg-radius); padding: var(--vidg-s3); margin-top: var(--vidg-s3);
}
@media (min-width: 900px) {
	.vidg-who-grid {
		display: grid; grid-template-columns: minmax(0, 564px) minmax(0, 1fr);
		align-items: start; gap: var(--vidg-s6);
	}
	.vidg-who-sheet { margin-top: 0; }
}
.vidg-policy-date, .vidg-counsel-review { color: var(--muted); font-size: var(--vidg-t-small); }
.vidg-counsel-review { margin-top: var(--vidg-s4); padding-top: var(--vidg-s2); border-top: 1px solid var(--rule); max-width: var(--vidg-measure); }
.vidg-not-open {
	border: 1px solid var(--ink); border-left: 4px solid var(--green);
	border-radius: var(--vidg-radius); padding: var(--vidg-s3); margin: var(--vidg-s3) 0 var(--vidg-s4);
	max-width: var(--vidg-measure); background: var(--page);
}
.vidg-not-open p { margin: 0 0 var(--vidg-s2); }
.vidg-not-open p:last-child { margin-bottom: 0; }
.vidg-not-open strong { font-weight: 700; }

/* Focus ring on every control: 2px, offset 2px, ink (which is the light
   ink in the dark theme). Spec s.1 accessibility floor. */
a:focus-visible, button:focus-visible, summary:focus-visible, input:focus-visible,
select:focus-visible, textarea:focus-visible, [tabindex]:focus-visible {
	outline: 2px solid var(--ink); outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
	*, *::before, *::after { animation: none !important; transition: none !important; scroll-behavior: auto !important; }
}

/* Nothing in this theme casts a shadow. Belt and braces against a parent
   or core default reintroducing the template tell. */
.vidg-spec, .vidg-notify, .vidg-unsettled, .vidg-two-col > div,
.vidg-syllabus details, .vidg-faq details, .vidg-specimen-sheet { box-shadow: none; }

/* ------------------------------------------------------------------
   COMPLIANCE-PAGE COMPONENTS. These classes used to be styled by an
   inline <style> block inside vidg_compliance_shell(); that block went
   when the shell moved onto the block template, so their rules live here
   with the rest of the system instead of being re-declared on five pages.
   ------------------------------------------------------------------ */
.vidg-compliance-page { max-width: 720px; margin-inline: auto; padding: var(--vidg-s5) var(--vidg-s3); }
.vidg-compliance-pending {
	border: 1px solid var(--ink); border-left: 4px solid var(--ink); border-radius: var(--vidg-radius);
	padding: var(--vidg-s3); margin: var(--vidg-s3) 0 var(--vidg-s4);
	max-width: var(--vidg-measure); background: var(--page);
}
.vidg-complaint-success {
	border: 1px solid var(--green); border-left: 4px solid var(--green); border-radius: var(--vidg-radius);
	padding: var(--vidg-s3); margin: var(--vidg-s3) 0; max-width: var(--vidg-measure);
}
.vidg-complaint-error {
	border: 1px solid var(--error); border-left: 4px solid var(--error); border-radius: var(--vidg-radius);
	padding: var(--vidg-s3); margin: var(--vidg-s3) 0; max-width: var(--vidg-measure);
}
.vidg-contact-block { max-width: var(--vidg-measure); }
.vidg-contact-block dt { font-weight: 600; margin-top: var(--vidg-s2); }
.vidg-contact-block dd { margin: 0; }
.vidg-complaint-form, .vidg-teams-form { max-width: var(--vidg-measure); display: grid; gap: var(--vidg-s2); }
.vidg-complaint-form label, .vidg-teams-form > p > label, .vidg-teams-form legend {
	font-weight: 600; font-size: var(--vidg-t-small);
}
.vidg-complaint-form input[type="text"],
.vidg-complaint-form input[type="email"],
.vidg-complaint-form textarea,
.vidg-complaint-form select,
.vidg-teams-form input[type="text"],
.vidg-teams-form input[type="email"],
.vidg-teams-form textarea {
	width: 100%; box-sizing: border-box; padding: var(--vidg-s2); font: inherit;
	font-size: var(--vidg-t-base); border: 1px solid var(--control-border); border-radius: var(--vidg-radius);
	background: var(--page); color: var(--ink);
}
.vidg-complaint-form button, .vidg-complaint-form input[type="submit"],
.vidg-teams-form button {
	justify-self: start; padding: var(--vidg-s2) var(--vidg-s3);
	background: var(--green); color: var(--on-green); border: 1px solid var(--green);
	border-radius: var(--vidg-radius); font-weight: 600; font-size: var(--vidg-t-base); cursor: pointer;
}
/* Team-size (radio) and courses-of-interest (checkbox) groups on
   /for-teams/: a plain fieldset, no border box (the site's forms use
   spacing, not a drawn box, to group controls -- see .vidg-consent). */
.vidg-teams-form fieldset { border: 0; padding: 0; margin: 0; display: grid; gap: var(--vidg-s1); }
.vidg-teams-form legend { padding: 0; margin-bottom: var(--vidg-s1); }
/* Review R3 n10 (adopted from Gemini's G-I1, corrected -- see the review):
   `align-items: center` centred the 20px box on the WHOLE label block, so
   on a two- or three-line course-title label the box sat 14-28px below
   the first line -- the opposite of the consent checkbox in the same form
   (label.vidg-consent, `grid`/`align-items:start`), which aligns to its
   own first line. On a one-line label (team-size radios) centring on the
   block and centring on the first line are the same thing, so that case
   is unaffected. */
.vidg-radio-option, .vidg-checkbox-option {
	display: flex; gap: var(--vidg-s2); align-items: flex-start; font-weight: 400; font-size: var(--vidg-t-base);
}
/* Review m5: sizing/appearance now comes from the shared
   input[type="checkbox"]/[type="radio"] rule above (20px, custom-drawn) --
   this rule only needs flex: 0 0 auto so the control never shrinks inside
   its flex row.
   Review n10: with align-items now flex-start (above), the 20px box would
   sit flush with the label's own top edge instead of centred on its first
   line; margin-top nudges it down by half the gap between the line box
   (1lh) and the 20px control, the same centring math align-items:center
   used to do for a single line.
   `font-size`/`line-height: inherit` first: form controls do not inherit
   font properties from the UA stylesheet (measured live, in two stages --
   the bare `<input>` first rendered at a 13.33px UA-default font-size
   with line-height:normal, giving 1lh ~15.3px on the INPUT itself and a
   NEGATIVE margin-top that put the box 6px too HIGH, the opposite
   direction from the bug this fix exists to close; `line-height:inherit`
   alone still measured 21.33px, not the label's 27.2px, because this
   site's global line-height is declared UNITLESS -- a bare `1.6`, not a
   px value -- and a unitless value inherits as that raw RATIO, applied to
   each element's OWN font-size, not as a fixed computed length. With the
   input still at its 13.33px UA font-size, 1.6*13.33=21.33, not 27.2).
   `1lh` always resolves against the element it is used ON, never an
   ancestor's, so both properties matter: `font-size:inherit` makes the
   input's own font-size match the label's (17px), and `line-height:
   inherit` then applies the SAME 1.6 ratio to that same 17px, giving
   1lh=27.2px, matching the label's own line box exactly. */
.vidg-radio-option input, .vidg-checkbox-option input {
	flex: 0 0 auto; font-size: inherit; line-height: inherit;
	margin-top: calc((1lh - 20px) / 2);
}

/* ------------------------------------------- HOW A COHORT RUNS (steps) */
/* Rendered as a 68ch numbered list rather than a 1080px card grid: the
   review asks that no two adjacent sections share a container width, and
   this section sits directly between two wide ones (the task tiles above,
   the commitments band below). Spec s.3.4 item 4: a real sequence, so
   numbered -- the big digit is decorative (aria-hidden) because the <ol>
   itself already gives the order to assistive tech. */
.vidg-cohort-steps { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--vidg-s4); max-width: var(--vidg-measure); }
.vidg-cohort-steps li { display: grid; grid-template-columns: auto 1fr; gap: var(--vidg-s3); align-items: baseline; }
.vidg-step-num {
	font-family: var(--display); font-weight: 700; color: var(--green); line-height: 1;
	font-size: var(--vidg-t-2); font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; margin: 0;
}
.vidg-cohort-steps h3 { font-size: var(--vidg-t-lead); margin: 0 0 var(--vidg-s1); }
.vidg-cohort-steps p { margin: 0; }

/* Benchmark H5 (chunk U1): the arbitration specimen's own clause, at one of
   three states, illustrating steps 2-4 (vidg_cohort_step_clause_html(),
   vidg-sections.php). A smaller, plainer version of .vidg-specimen-sheet's
   own --page/1px-rule/no-shadow treatment -- this is an illustration beside
   the step's prose, not the full annotated sheet the hero/fold already
   show elsewhere on the very same page. */
.vidg-step-clause {
	margin: var(--vidg-s2) 0 0; padding: var(--vidg-s2); background: var(--page);
	border: 1px solid var(--rule); border-radius: 0; max-width: var(--vidg-measure-aside); box-shadow: none;
}
.vidg-step-clause .vidg-clause { font-size: var(--vidg-t-small); line-height: 1.6; }

/* Minor m4 (chunk U5, round 6): a way in to /specimen-clause-pack/, which
   was 6,656px at 1440 with no jump list. Plain text links, wrapped, rule-
   separated the same way "I work as..." is a prose list rather than
   chips (spec s.3.4 no-filter-chips lock) -- no border-radius, no pill
   background, no button styling; this is navigation, not a filter. */
.vidg-pack-jump ul {
	list-style: none; margin: var(--vidg-s2) 0 0; padding: 0;
	display: flex; flex-wrap: wrap; gap: var(--vidg-s1) var(--vidg-s3);
}
.vidg-pack-jump a { font-family: var(--sans); font-size: var(--vidg-t-small); font-weight: 600; }

/* U6a (review round 7 C3): the learner's draft thread on /my-drafts/ --
   draft -> review -> redraft -> final review, in order, under one state line. */
.vidg-thread { list-style: none; margin: var(--vidg-s3) 0 0; padding: 0; }
.vidg-thread-step { border-left: 2px solid var(--rule); padding: 0 0 var(--vidg-s3) var(--vidg-s3); margin: 0; }
.vidg-thread-review { border-left-color: var(--green); }
.vidg-thread-step h3 { margin: 0 0 var(--vidg-s1); font-size: var(--vidg-t-base); }
.vidg-thread-meta { margin: 0 0 var(--vidg-s2); font-size: var(--vidg-t-small); color: var(--muted); }
.vidg-thread-text summary { cursor: pointer; font-family: var(--sans); font-size: var(--vidg-t-small); color: var(--green); }
.vidg-thread-body { margin-top: var(--vidg-s2); white-space: normal; }
.vidg-thread-state { font-weight: 600; }
.vidg-redraft { margin-top: var(--vidg-s3); }

/* U6b (review round 7, C4/I4/I5/m1/m5/m10): the logged-in review surfaces.
   The learner's returned review is set as the public specimens are (same
   sheet, same toggle, same notes, the same signature); the queue reads as
   words and stacks into cards under 600px; every control is full width and
   drawn from the theme's own tokens in both themes. */
.vidg-review-sheet { margin: 0 0 var(--vidg-s3); }
.vidg-review-sheet .vidg-clause + .vidg-clause { margin-top: var(--vidg-s2); }
.vidg-review-summary { margin-top: var(--vidg-s3); padding-top: var(--vidg-s3); border-top: 1px solid var(--rule); }
.vidg-review-summary p { margin: 0; max-width: var(--vidg-measure); }
.vidg-review-summary .vidg-review-summary-label {
	font-family: var(--sans); font-size: 13px; font-weight: 600; text-transform: uppercase;
	letter-spacing: 0.06em; color: var(--muted); margin-bottom: var(--vidg-s1);
}
.vidg-specimen-notes .vidg-note-num { font-style: normal; font-weight: 700; margin-right: 6px; }
.vidg-review-rubric { margin: var(--vidg-s3) 0; }

/* Controls on the draft, redraft, certificate and marking forms. */
.vidg-my-drafts textarea, .vidg-my-drafts input[type="text"],
.vidg-review-queue textarea, .vidg-review-queue input[type="text"], .vidg-review-queue select {
	display: block; width: 100%; max-width: 100%; box-sizing: border-box; padding: var(--vidg-s2);
	border: 1px solid var(--control-border); border-radius: var(--vidg-radius);
	background: var(--page); color: var(--ink); font: inherit; font-size: var(--vidg-t-base);
}
.vidg-my-drafts textarea, .vidg-review-queue textarea.vidg-marked-text {
	font-family: var(--doc); font-size: var(--vidg-t-doc); line-height: 1.7; min-height: 16em;
}
.vidg-review-queue textarea.vidg-marked-text { min-height: 30em; }
.vidg-my-drafts label.vidg-attest {
	display: grid; grid-template-columns: 24px 1fr; gap: var(--vidg-s1); align-items: start;
	margin: var(--vidg-s2) 0; font-size: 15px; max-width: var(--vidg-measure);
}
.vidg-my-drafts .vidg-btn, .vidg-review-queue .vidg-actions .vidg-btn { margin-top: var(--vidg-s1); }
.vidg-field-label { display: block; font-weight: 600; font-size: var(--vidg-t-small); margin-bottom: var(--vidg-s1); }
.vidg-help { font-size: var(--vidg-t-small); color: var(--muted); max-width: var(--vidg-measure); margin: 0 0 var(--vidg-s2); }
.vidg-muted { color: var(--muted); font-weight: 400; }
.vidg-submit-msg:not(:empty) { margin-top: var(--vidg-s2); font-weight: 600; }
.vidg-cert-panel .vidg-cert-name-input { margin-bottom: var(--vidg-s2); max-width: 32rem; }

/* m5: the brief list is a list of sections, not bullets. */
ul.vidg-brief-list { list-style: none; margin: 0; padding: 0; }
.vidg-brief-row + .vidg-brief-row { margin-top: var(--vidg-s5, 48px); padding-top: var(--vidg-s4); border-top: 1px solid var(--rule); }

/* I4: the review queue. */
.vidg-queue-intro { max-width: var(--vidg-measure); color: var(--muted); font-size: var(--vidg-t-small); }
.vidg-queue-table { width: 100%; border-collapse: collapse; font-size: var(--vidg-t-small); }
.vidg-queue-table th {
	text-align: left; font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em;
	color: var(--muted); border-bottom: 1px solid var(--rule); padding: var(--vidg-s1) var(--vidg-s2) var(--vidg-s1) 0;
}
.vidg-queue-table td { vertical-align: top; padding: var(--vidg-s2) var(--vidg-s2) var(--vidg-s2) 0; border-bottom: 1px solid var(--rule); }
.vidg-queue-brief { display: block; font-weight: 600; font-size: var(--vidg-t-base); }
.vidg-queue-course { display: block; color: var(--muted); }
.vidg-queue-action { text-align: right; white-space: nowrap; }
.vidg-queue-action .vidg-btn { padding: var(--vidg-s1) var(--vidg-s3); }
.vidg-draft-body > td { padding: var(--vidg-s3) 0 var(--vidg-s5, 48px); }
.vidg-review-queue .screen-reader-text {
	position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0;
}
@media (max-width: 599px) {
	.vidg-queue-table, .vidg-queue-table tbody, .vidg-queue-table tr, .vidg-queue-table td { display: block; width: 100%; box-sizing: border-box; }
	.vidg-queue-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
	.vidg-queue-row { border: 1px solid var(--rule); border-radius: var(--vidg-radius); padding: var(--vidg-s2); margin-top: var(--vidg-s2); background: var(--page); }
	.vidg-queue-row td { border: 0; padding: 2px 0; display: grid; grid-template-columns: 7.5em 1fr; gap: var(--vidg-s1); }
	.vidg-queue-row td::before { content: attr(data-label); font-size: 13px; font-weight: 600; color: var(--muted); }
	.vidg-queue-row td.vidg-queue-action { display: block; text-align: left; padding-top: var(--vidg-s2); }
	.vidg-queue-row td.vidg-queue-action::before { content: none; }
	.vidg-queue-action .vidg-btn { width: 100%; }
	.vidg-draft-body > td { padding: var(--vidg-s2) 0 var(--vidg-s4); }
}

/* I5: the marking form -- full width, the draft in its own face, line breaks kept. */
.vidg-mark-section { margin: 0 0 var(--vidg-s4); }
.vidg-mark-section h3 { font-size: var(--vidg-t-base); margin: 0 0 var(--vidg-s1); }
.vidg-original {
	white-space: pre-wrap; font-family: var(--doc); font-size: var(--vidg-t-doc); line-height: 1.7;
	background: var(--page); border: 1px solid var(--rule); padding: var(--vidg-s3); max-width: none;
}
.vidg-notes-builder { list-style: decimal; margin: 0 0 var(--vidg-s2); padding-left: 1.5em; display: grid; gap: var(--vidg-s2); }
.vidg-note-row { display: grid; grid-template-columns: 1fr; gap: var(--vidg-s1); }
/* U7 (review round 8, m-e): the note is a multi-line field across most of the
   column; the phrase sits above it; the weight select is wide enough for "Consider". */
@media (min-width: 900px) {
	.vidg-note-row { grid-template-columns: 1fr 10em auto; align-items: start; }
	.vidg-note-row .vidg-note-quote { grid-column: 1 / -1; }
}
.vidg-review-queue textarea.vidg-note-body { min-height: 4.5em; resize: vertical; }
.vidg-note-row select { width: 100%; }
.vidg-remove-note { font: inherit; font-size: var(--vidg-t-small); background: transparent; color: var(--green); border: 0; text-decoration: underline; cursor: pointer; justify-self: start; }
.vidg-rubric-form { display: grid; gap: var(--vidg-s2); grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); }
.vidg-rubric-item span { display: block; font-weight: 600; font-size: var(--vidg-t-small); margin-bottom: var(--vidg-s1); }
.vidg-preview-box { min-height: 4em; }

/* U6b (review round 7): a signed-in learner's header held six links and wrapped
   to two rows at 375. Under 600px it keeps Courses, My classes and My drafts;
   About / How a cohort runs / For Teams are all repeated in the footer. */
@media (max-width: 599px) { .vidg-nav-learner .vidg-nav-public { display: none; } }

/* U6b (review round 7, I3): on the plain page template the H1 sat ~4px under
   the header rule. It now clears it by the section rhythm's own step. */
main.vidg-section:has(> .wp-block-post-title:first-child),
main.vidg-section:has(> h1:first-child) { padding-top: var(--vidg-s4); }

/* U7 (review round 8, N4): the dashboard's "Your drafts" block -- each brief's one
   state, a returned review flagged in words (the flag is an outlined label, never
   green text: green means only "the reviewer changed this" on a marked sheet, and
   here it is a status, so it takes the ink colour with a rule). */
.vidg-dashboard-drafts { margin: var(--vidg-s3) 0; }
.vidg-dashboard-drafts h3 { font-size: var(--vidg-t-base); margin: 0 0 var(--vidg-s1); }
ul.vidg-dash-drafts { list-style: none; margin: 0 0 var(--vidg-s2); padding: 0; }
.vidg-dash-draft { padding: var(--vidg-s2) 0; border-top: 1px solid var(--rule); }
.vidg-dash-draft:last-child { border-bottom: 1px solid var(--rule); }
.vidg-dash-draft-title { font-weight: 600; }
.vidg-dash-flag {
	display: inline-block; margin-left: var(--vidg-s1); padding: 0 6px; font-size: 13px; font-weight: 600;
	text-transform: uppercase; letter-spacing: 0.06em; border: 1px solid var(--ink); border-radius: var(--vidg-radius);
	color: var(--ink); vertical-align: 2px;
}
.vidg-dash-draft-line { display: block; color: var(--muted); font-size: var(--vidg-t-small); margin: 2px 0 var(--vidg-s1); }
.vidg-dash-draft-link { font-weight: 600; }

/* U7 (review round 8, I11): /verify/ is a page of the site now -- header, footer,
   type, both schemes -- so it needs only its card, badge and form. */
.vidg-verify-card { border: 1px solid var(--green); border-radius: var(--vidg-radius); padding: var(--vidg-s3); margin: var(--vidg-s3) 0; }
.vidg-verify-card .badge {
	display: inline-block; padding: 3px 10px; border-radius: var(--vidg-radius); font-family: var(--sans);
	font-size: 13px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
}
.vidg-verify-card .badge.valid { background: var(--green); color: var(--on-green); }
.vidg-verify-card .badge.invalid { background: transparent; color: var(--muted); border: 1px solid var(--rule); }
.vidg-verify-card dl { margin: var(--vidg-s2) 0 0; }
.vidg-verify-card dt { font-family: var(--sans); font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); margin-top: var(--vidg-s2); }
.vidg-verify-card dd { margin: 2px 0 0; }
.vidg-verify .honesty { margin-top: var(--vidg-s3); padding-top: var(--vidg-s2); border-top: 1px solid var(--rule); font-size: var(--vidg-t-small); color: var(--muted); }
.vidg-verify-again { font-size: var(--vidg-t-base); margin-top: var(--vidg-s4); }
.vidg-verify-row { display: flex; flex-wrap: wrap; gap: var(--vidg-s2); align-items: center; }
.vidg-verify-row input[type="text"] {
	flex: 1 1 16rem; min-width: 0; padding: var(--vidg-s2); font: inherit; background: var(--page); color: var(--ink);
	border: 1px solid var(--control-border); border-radius: var(--vidg-radius);
}

/* U7 (review round 8, m-b): the certificate panel's buttons used to touch the next
   brief's heading. */
.vidg-cert-panel:not(:empty) { margin-bottom: var(--vidg-s5, 48px); }
