/**
 * Print/PDF styling for Workshop pages.
 *
 * This file has two consumers:
 *
 * 1. The real browser print stylesheet — enqueued in functions.php with
 *    `media: 'print'`, so browsers only load/apply it when the user
 *    actually prints a page (Ctrl+P), same as any other print stylesheet.
 * 2. The Workshop "Download overview" PDF — read directly (see
 *    torii_get_workshop_overview_pdf_css() in inc/workshop-overview-pdf.php)
 *    and appended after the theme's normal component CSS, then handed to
 *    Dompdf with Options::setDefaultMediaType('print'). Rules here aren't
 *    wrapped in @media print because that context is already established by
 *    each consumer (the <link media="print"> attribute for browsers, the
 *    Dompdf option for the PDF) — the media attribute/option is what gates
 *    *when* this file's rules apply, not anything inside the file itself.
 *
 * Component base styles (grid, flexbox, mask-image, clip-path, box-shadow)
 * rely on features Dompdf can't render, so most rules below exist to
 * simplify a component back down to layout Dompdf handles reliably
 * (block flow, floats, borders) rather than to restyle it — the same
 * simplification also happens to make sense for a printed page, which has
 * no hover/JS interaction either.
 */

/* ---------------------------------------------------------------------
 * base.css — global reset + typography baseline
 * ------------------------------------------------------------------- */

/*
 * Dompdf doesn't support box-shadow, CSS masks, or clip-path reliably —
 * left alone they render as stray artifacts (a soft shadow can show up as
 * a solid stray curved outline instead of being skipped). Reset them
 * globally rather than chasing every component that happens to use one;
 * component-specific sections below still layer their own overrides for
 * layout (grid/flexbox), this just guarantees no leftover decorative
 * effect slips through unnoticed on a newly added component.
 *
 * The margin/alignment reset in the same rule overrides every component
 * rule below (and anything from theme.json's global styles or the
 * component CSS this file is appended after) that centres content via
 * `margin: 0 auto`/`text-align: center` — e.g. the workshop
 * quotation/testimonial carousels, the separator rule below, or any
 * block-level "wide"/alignment setting. `!important` is what makes a
 * bare `*` selector here win regardless of source order against those
 * more specific class selectors — not this rule's position in the file.
 * Floats (the header logo/photo row, the options table's two-column
 * layout) aren't affected, since they don't position via horizontal
 * margins.
 */
* {
	box-shadow: none !important;
	mask-image: none !important;
	-webkit-mask-image: none !important;
	clip-path: none !important;
	margin-left: 0 !important;
	margin-right: 0 !important;
	text-align: left !important;
}

/*
 * The theme's real fonts (Poppins for body copy, Urbanist for headings —
 * see torii_get_workshop_overview_pdf_font_css() in
 * inc/workshop-overview-pdf.php, which embeds them as base64 TrueType data
 * URIs, the only font format Dompdf's @font-face support accepts) are used
 * here to match the live site. 'DejaVu Sans' stays as a final fallback
 * (Dompdf's own bundled Unicode-safe sans font, unlike "Helvetica" which
 * only covers Latin-1/WinAnsi) in case a character isn't covered by
 * Poppins/Urbanist — without it a missing glyph silently renders as a "?"
 * box instead of falling through to a font that does have it.
 *
 * Every font-size in this file (here and on individual components further
 * down — .faq-accordion__question, .stat-card__number, etc.) is a `pt`
 * value from one deliberate scale: 9/11/12/13/16/22pt. Component sizes
 * copied straight from the live site's own `px` values (tuned for
 * on-screen viewing, not a printed page) read as wildly inconsistent next
 * to each other once printed — most strikingly .stat-card__number at a
 * literal 32px worked out to 24pt, bigger than this page's own <h1>
 * (22pt). Any new font-size added here should fit this same scale rather
 * than transplanting a screen pixel value directly.
 */
body {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-size: 11pt;
	line-height: 1.3;
	color: #2a2637;

	/*
	 * Global styles (wp_get_global_stylesheet(), included by
	 * torii_get_workshop_overview_pdf_css()) sets `body { background:
	 * var(--page-background-color) }`, which theme.json defaults to
	 * --wp--preset--color--neutral-500 unless the real front-end <body> has
	 * one of a few page-template classes setting it to white — classes this
	 * PDF's plain <body> never has. Override back to no fill rather than
	 * carrying that unintended tint into the printed page.
	 */
	background: none;
	padding-left: 48px;
	padding-right: 48px;
}

/*
 * Core's own block-library CSS (border/width/spacing for
 * .wp-block-separator) isn't part of this PDF's stylesheet at all — only
 * theme.json's global styles (color) and this theme's own component CSS
 * are concatenated, neither of which carries the separator's base
 * structural rules. Without them a plain <hr> falls back to Dompdf's own
 * UA-default styling (a thick inset 3D groove) instead of the thin
 * currentColor rule the site actually shows.
 */
hr,
.wp-block-separator {
	border: none;
	border-bottom: 1px solid currentcolor;
	color: #d9d3c9;
	height: 0;
	margin: 12pt 0;
}

h1,
h2,
h3,
h4 {
	font-family: Urbanist, 'DejaVu Sans', sans-serif;
	font-weight: 700;
	color: #2a2637;
	margin: 0 0 6pt;
}

/*
 * Dompdf's own default stylesheet sets `b, strong { font-weight: bolder }` —
 * a *relative* keyword, not an absolute weight. Nested inside an
 * already-bold ancestor (any of the h1-h4 above at 700, or the many 600
 * elements elsewhere in this file — `.stat-card__caption`, tick-list
 * `<strong>` lead-ins, etc.), "bolder" resolves to a weight one step up
 * (900 inside a 700 heading, 700 inside a 600 body element) that this
 * file's embedded Urbanist/Poppins @font-face rules
 * (torii_get_workshop_overview_pdf_font_css()) don't necessarily define —
 * Poppins only embeds 400/600, no 700 at all. Unlike a browser, Dompdf
 * doesn't fall through the rest of the `font-family` stack (DejaVu Sans,
 * sans-serif) when a requested weight has no match within a family it does
 * have *a* registered face for — it drops straight to its own built-in
 * default (confirmed via direct Dompdf renders: Times-Bold for a bare
 * `strong, b { font-weight: 700 }` inside an h4, Helvetica-Bold for that
 * same flat 700 inside Poppins body copy since Poppins has no 700 face
 * either) — which is what was actually causing headings like `<h4>
 * <strong>What happens when X</strong></h4>` (a pattern several Workshop
 * posts' "outcomes" heading uses, redundantly bolding text already bold via
 * the h4 rule above) and bold lead-ins inside tick lists to render in a
 * plain serif/sans fallback instead of the theme's own fonts.
 *
 * Rather than one flat weight, this pins `bolder` to whichever weight is
 * actually embedded for the font family in play: 600 as the default
 * (matches both Poppins-600 and Urbanist-600, so it's safe anywhere outside
 * a heading), overridden to 700 specifically inside h1-h4 (matches
 * Urbanist-700, the same weight those headings' own text already renders
 * at, so a `<strong>`-wrapped heading like the pattern above doesn't end up
 * visibly lighter than a plain one). Both tiers confirmed via direct
 * Dompdf renders of the real heading and tick-list markup.
 */
strong,
b {
	font-weight: 600;
}

h1 strong,
h1 b,
h2 strong,
h2 b,
h3 strong,
h3 b,
h4 strong,
h4 b {
	font-weight: 700;
}

h1 {
	font-size: 22pt;
	line-height: 1.15;
}

h2 {
	font-size: 16pt;
	line-height: 1.2;
	margin-top: 14pt;
}

h3,
h4 {
	font-size: 13pt;
	line-height: 1.2;
	margin-top: 10pt;
}

p {
	margin: 0 0 6pt;
}

a {
	color: #2a2637;
}

ul,
ol {
	margin: 0 0 6pt;
	padding-left: 16pt;
}

/* Space consecutive tab-section groups out so sections read as distinct
   blocks instead of running straight into each other. */
.workshop-tab-section {
	margin-bottom: 12pt;
	padding-bottom: 12pt;
	border-bottom: 1px solid #eee7df;
}

.workshop-tab-section:last-of-type {
	border-bottom: none;
}

/*
 * The "Footer" wrapper (patterns/tabs-workshop.php) carries WordPress's own
 * `has-neutral-500-background-color has-background` utility classes rather
 * than a plain component rule — `wp_get_global_stylesheet()` (included by
 * torii_get_workshop_overview_pdf_css()) emits those with `!important`
 * (same as the `has-*-font-size` classes handled further down), so a
 * non-`!important` override here would lose regardless of source order.
 */
.workshop-section-break-out {
	background: none !important;
}

/*
 * assets/css/components/workshop-section-break-out.css breaks this section
 * out to the true viewport edges on the live site (`width: 100vw;
 * margin-left/right: calc(50% - 50vw);`) so its background can bleed full
 * width despite being nested several `layout: constrained` groups deep.
 * `vw` has no meaningful equivalent on a fixed PDF page — Dompdf resolves
 * it against some notion of viewport width that isn't this page's own
 * content box, so the section ends up wider than the page and its content
 * runs off the edge instead of wrapping to it. That compound selector
 * (`.wp-block-group.workshop-section-break-out`) is more specific than a
 * bare `.workshop-section-break-out`, so matching it exactly is what
 * actually wins here — same specificity trap as `.stat-card__caption`
 * further down this file.
 */
.wp-block-group.workshop-section-break-out {
	width: auto;
	margin-left: 0;
	margin-right: 0;
	padding-block: 24px;
}

/*
 * WordPress's own global styles (wp_get_global_stylesheet(), from
 * theme.json's `useRootPaddingAwareAlignments`/layout support) both
 * auto-centre *and* cap the width of every non-aligned direct child of a
 * `.is-layout-constrained` element via a selector shaped like:
 *   .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {
 *       max-width: var(--wp--style--global--content-size);
 *       margin-left: auto !important;
 *       margin-right: auto !important;
 *   }
 * `:where()` contributes zero specificity, so that selector's real
 * specificity is just the one `.is-layout-constrained` class — higher than
 * the bare `*` this file's blanket left-align reset (near the top of this
 * file) uses, so it was winning over that reset despite `!important` on
 * both sides (equal specificity/`!important` resolves by source order, but
 * here the specificities aren't actually equal). Matching the exact
 * selector shape is what actually wins the tie. `max-width` isn't
 * `!important` on WordPress's side, but overridden here too (also with
 * `!important`, for the same specificity-matching reason) so content
 * fills the full printable page width instead of clamping to the site's
 * `--wp--style--global--content-size` (tuned for a browser viewport, not
 * an A4 page).
 */
.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)) {
	max-width: none !important;
	margin-left: 0 !important;
	margin-right: 0 !important;
}

/*
 * A second, separate WordPress global-styles mechanism from the same
 * `useRootPaddingAwareAlignments` system: any element WordPress decides
 * needs the root inset gets a `has-global-padding` class directly in the
 * saved markup, with `wp_get_global_stylesheet()` emitting
 * `.has-global-padding { padding-right: var(--wp--style--root--padding-right)
 * !important; padding-left: var(--wp--style--root--padding-left) !important; }`
 * — 24px a side. Both `.workshop-tab-section` itself *and* nested wrapper
 * groups inside it (e.g. patterns/workshop-product-intro.php's
 * `.text-component.product-intro__intro`) can carry this class at once,
 * stacking to 48px on whichever tab happens to nest one — the actual
 * cause of one tab's intro heading/paragraphs sitting more indented than
 * every other tab's content, which has no reason to vary tab-to-tab.
 */
.has-global-padding {
	padding-left: 0 !important;
	padding-right: 0 !important;
}

/* The "Download overview" button lives inside the very PDF it downloads —
   showing it in the rendered PDF/print output would be a link to itself.
   Same reasoning as .book-a-call/.contact-form-panel further down: hide the
   interactive control rather than trying to reproduce it. */
.product-intro__intro .wp-block-buttons {
	display: none;
}

/* ---------------------------------------------------------------------
 * book-a-call.css
 * ------------------------------------------------------------------- */

/* Fixed floating widget, not page content — hide it entirely rather than
   trying to reproduce its mask-cutout shape. Never actually part of the
   .workshop-tab-section content the PDF renders, but still hidden here for
   real browser printing of any page it appears on. */
.book-a-call {
	display: none;
}

/* ---------------------------------------------------------------------
 * contact-cta-panel.css
 * ------------------------------------------------------------------- */

/* Same reasoning as cta-photo-overlay.css below — drop the fillet cutouts
   (clip-path / mask-image, unsupported by Dompdf) and the fixed absolute
   positioning tuned for the on-screen panel, and fall back to plain
   stacked content. */
.contact-cta {
	background-color: #b9bdff;
	padding: 32px;
	display: block;
}

.contact-cta::before {
	display: none;
}

.contact-cta__text {
	max-width: none;
}

.contact-cta__details {
	max-width: none;
	padding-top: 16px;
}

/* ---------------------------------------------------------------------
 * contact-form.css
 * ------------------------------------------------------------------- */

/* An interactive form has nothing useful to show on paper (or in Dompdf,
   which doesn't execute the CF7 submit JS anyway). Hide it rather than
   trying to reproduce input fields. */
.contact-form-panel {
	display: none;
}

/* ---------------------------------------------------------------------
 * cta-photo-overlay.css
 * ------------------------------------------------------------------- */

/* Keep the circular photo (border-radius + overflow:hidden crops fine
   without JS or masks) but drop the decorative white blob and its two
   clip-path fillets behind it — Dompdf doesn't rasterize clip-path, so
   left alone it would show as a stray unclipped white box. */
.call-to-action {
	background-color: #b9bdff;
	padding: 32px;
	min-height: 0;
}

.call-to-action__overlay,
.call-to-action__overlay::before,
.call-to-action__overlay::after {
	display: none;
}

.call-to-action__photo {
	position: static;
	width: 100px;
	height: 100px;
	margin-bottom: 16px;
	border: 2px solid #2a2637;
}

/* ---------------------------------------------------------------------
 * faq.css
 * ------------------------------------------------------------------- */

/*
 * Answers are normally revealed by faq.js toggling
 * .faq-accordion__item--active, which never runs for Dompdf (no JS) and
 * isn't useful on a printed page either. Force every panel open and drop
 * the grid, mask cutout and absolute-positioned arrow — Dompdf doesn't
 * support CSS Grid or mask-image, so this section stays CSS 2.1-safe.
 */
.faq-accordion {
	display: block;
}

.faq-accordion__item {
	position: static;
	background-color: #f8f3ed;
	border-radius: 8px 8px 0 8px;
	margin-bottom: 8px;
	page-break-inside: avoid;
}

.faq-accordion__item::before {
	display: none;
}

.faq-accordion__header {
	display: block;
	padding: 8px 14px;
}

.faq-accordion__question {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-weight: 600;
	font-size: 12pt;
	color: #2a2637;
}

.faq-accordion__arrow {
	display: none;
}

.faq-accordion__panel {
	max-height: none;
	overflow: visible;
}

.faq-accordion__answer {
	padding: 0 14px 8px;
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-size: 11pt;
	color: #2a2637;
}

/* ---------------------------------------------------------------------
 * photo-callout.css
 * ------------------------------------------------------------------- */

/* Drop the mask-image corner cutout (unsupported by Dompdf, would
   otherwise show as an unclipped rectangular photo) in favour of a plain
   rounded-corner crop, and let the caption sit below the photo in normal
   flow instead of overlaid on top of it. */
.photo-callout__image {
	height: auto;
	max-height: 320px;
	border-radius: 12px;
	mask-image: none;
	-webkit-mask-image: none;
}

.photo-callout__text {
	position: static;
	width: auto;
	height: auto;
	max-width: none;
	padding: 12px 0 0;
}

.photo-callout__text p {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-size: 12pt;
	color: #2a2637;
}

/*
 * `.text-component` itself is `display: flex` on the live site
 * (assets/css/components/workshop-text-component.css) — this file
 * previously assumed Dompdf's lack of flexbox support meant it "falls back
 * to block" on its own with no override needed, but that's not what
 * actually happens: left as `flex`, `.text-component` doesn't reliably
 * behave like a block box — most visibly, `clear` on
 * `.programme-info > .text-component` below (needed because several
 * Workshop posts nest a `.text-component` — e.g. the "What you'll learn &
 * do" block — directly *inside* `.programme-info`, beside the floated
 * `.programme-info__item`s) silently had no effect until this explicit
 * reset was added, confirmed via a direct Dompdf render both ways. Placed
 * here, ahead of `.programme-info > .text-component`'s own higher
 * specificity further down, to satisfy stylelint's no-descending-specificity
 * check.
 */
.text-component {
	display: block;
}

/* ---------------------------------------------------------------------
 * programme-info.css
 * ------------------------------------------------------------------- */

/*
 * .programme-info__icon centres its icon with `display:flex;
 * align-items:center; justify-content:center;` — unsupported by Dompdf, so
 * without an override the icon (converted from inline <svg> to <img> by
 * torii_convert_inline_svg_to_img(), see inc/workshop-overview-pdf.php)
 * just sits at its default inline position inside the circle instead of
 * centred. `line-height` equal to the circle's own height + `vertical-align:
 * middle` is the pre-flexbox way to centre an inline image inside a
 * fixed-height box — reliable CSS 2.1, not a flex substitute.
 *
 * `float` was tried here first and made things dramatically worse —
 * Dompdf's float implementation (particularly combined with an
 * `overflow: hidden` clearfix) corrupted layout well beyond this
 * component, overlapping unrelated content further down the page.
 * `inline-block` + `vertical-align: middle` (no floats) fixed that, and
 * positions the icon+text row correctly, but `line-height`/`vertical-align`
 * centering only reliably centres text in Dompdf — for a replaced element
 * like the icon's own `<img>`, it stayed pinned to the circle's top-left
 * instead of centring. `position: absolute` with fixed pixel offsets is
 * the technique already used successfully elsewhere in this file (e.g.
 * `.call-to-action__photo`) precisely because Dompdf handles it reliably
 * where more dynamic centring methods don't — forcing the icon to a fixed
 * 16×16 display size (they're natively ~15-18px, close enough that the
 * difference isn't visible) makes centring it inside the 30px circle a
 * fixed, exact `(30 - 16) / 2 = 7px` offset from each edge, rather than
 * something that has to be computed per-icon. `top`/`left` are used
 * instead of margin so this doesn't collide with the blanket
 * `margin-left/right: 0 !important` reset near the top of this file.
 */
.programme-info {
	display: block;
}

.programme-info::after {
	content: '';
	display: block;
	clear: both;
}

.programme-info__label {
	display: block;
	font-weight: 600;
	margin-bottom: 8pt;
}

.programme-info__item {
	display: block;
	float: left;
	padding-right: 24pt;
	margin-bottom: 8pt;
	page-break-inside: avoid;
}

.programme-info__icon {
	display: inline-block;
	vertical-align: middle;
	position: relative;
	width: 30px;
	height: 30px;
	border-radius: 24px;
	background-color: #d0e995;
}

.programme-info__icon img {
	position: absolute;
	top: 7px;
	left: 7px;
	width: 16px;
	height: 16px;
}

.programme-info__text {
	display: inline-block;
	vertical-align: middle;
	padding-left: 10px;
}

/*
 * Every Workshop post nests the block that follows the "We recommend" icons
 * (a `.text-component`, e.g. "What you'll learn & do") directly *inside*
 * `.programme-info`, alongside the floated `.programme-info__item`s, rather
 * than as a sibling after it. The `.programme-info::after` clearfix above
 * only clears the floats for the purpose of `.programme-info`'s own auto
 * height — it doesn't stop a normal-flow sibling that comes *before* that
 * pseudo-element from wrapping into the remaining space beside the floats
 * instead of dropping below them, which is what was squeezing that block
 * into a half-width column next to the icons instead of running full width
 * underneath. A `:not(.programme-info__item)` selector would express this
 * more generally, but Dompdf's CSS selector parser has no `:not()` support
 * at all (confirmed directly against the installed dompdf/dompdf source —
 * unlike `:has()` elsewhere in this file, which at least degrades to being
 * silently dropped, `:not()` isn't recognised as invalid at parse time
 * either, so a rule using it just never took effect, confirmed via a direct
 * Dompdf render). Targeting the actual class name that appears here on
 * every currently-published Workshop is the version that actually works.
 */
.programme-info > .text-component {
	clear: both;
}

/* ---------------------------------------------------------------------
 * stat-cards.css
 * ------------------------------------------------------------------- */

/*
 * The notched SVG background shapes and absolutely-positioned
 * number/caption/logo overlays don't survive Dompdf (no background-image
 * shape support worth relying on, and stacking absolute text over an
 * un-rendered shape reads as broken). Fall back to a plain bordered block
 * with normal document flow — stays CSS 2.1-safe (no custom properties,
 * no container queries).
 *
 * `.stat-pair` itself is `display: flex` on the live site
 * (assets/css/components/workshop-text-component.css), sitting the
 * .stat-card beside its .text-component — unsupported by Dompdf, and not
 * wanted on the page/PDF anyway, so it's dropped back to block here to
 * stack the card above its text instead of side by side.
 */
.stat-pair {
	display: block;
	margin-bottom: 12pt;
}

.stat-pair > .text-component {
	flex: none;
	margin-block-start: 0;
}

/*
 * Solid brand-primary card with one squared-off corner, standing in for
 * the screen version's notch cutout (an actual notch needs a mask/clip
 * Dompdf can't render) — close enough to the site's stat-card silhouette
 * to read as the same component, built from a plain background colour
 * and border-radius Dompdf renders reliably.
 */
.stat-card {
	width: auto;
	height: auto !important;
	background-color: #b9bdff;
	border-radius: 20px 20px 20px 4px;
	padding: 14px;
	margin-bottom: 10px;
	page-break-inside: avoid;
}

.stat-pair > .stat-card {
	margin-bottom: 8pt;
}

.stat-pair .stat-card--v4,
.stat-pair .stat-card--v5,
.stat-pair .stat-card--v6 {
	background-image: none;
}

/*
 * .stat-card's own children (.stat-card__number-wrap + .stat-card__caption
 * on the v4 shape, .stat-card__logo + .stat-card__quote-wrap on v5/v6) stack
 * vertically on the live site via flexbox, unsupported by Dompdf. Same
 * inline-block + vertical-align technique as .programme-info__icon/__text
 * above puts them side by side instead — reliable CSS 2.1, no flex needed.
 */
.stat-card > * {
	display: inline-block;
	vertical-align: middle;
}

/*
 * `.stat-pair .stat-card__caption` (assets/css/components/stat-cards.css)
 * is a compound selector with higher specificity than a bare
 * `.stat-card__caption` — the live `1rem` value beats this rule regardless
 * of source order unless matched here too. Matching that compound
 * selector is what actually wins the tie.
 *
 * `margin-left` (rather than the old `margin-top`) spaces
 * .stat-card__caption from .stat-card__number-wrap now that both sit
 * inline via `.stat-card > *` above — it's the second child in the v4
 * shape. Bundled into .stat-card__logo too even though .stat-card__logo is
 * the *first* child on v5/v6 (so the margin has no visible effect there)
 * to keep one rule instead of splitting an otherwise-identical declaration
 * block in two.
 */
.stat-card__caption,
.stat-pair .stat-card__caption {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-weight: 600;
	font-size: 9pt;
	color: #2a2637;
	line-height: 1.2;
	margin-left: 10px;
}

/*
 * Full width (rather than the inline-block `.stat-card > *` above) so the
 * logo takes its own line and .stat-card__quote-wrap wraps underneath it
 * instead of sitting beside it. The live rule (stat-cards.css) sets
 * `position: absolute` on .stat-card__logo — its `position: static` reset
 * has to land in this *same* rule rather than a separate one further down
 * (like .stat-card__number-wrap/.stat-card__caption below do): Dompdf
 * doesn't reliably pick up a `display: block` that lands in a different
 * rule than the `position: absolute → static` override, even though both
 * rules match with identical specificity and this one comes later in
 * source order — confirmed by rendering both ways through Dompdf directly.
 * Verified as still needed against the currently installed dompdf/dompdf
 * version; worth re-checking against Dompdf's changelog on a future
 * version bump in case this gets fixed upstream.
 */
.stat-card__logo {
	position: static;
	left: auto;
	top: auto;
	display: block;
	width: 100%;
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-weight: 600;
	color: #2a2637;
	line-height: 1.2;
	max-width: none;
}

/*
 * Matches the specificity of the base .stat-pair .stat-card__number-wrap
 * / .stat-pair .stat-card__caption rules being overridden here — a bare
 * .stat-card__number-wrap selector loses to those compound ones
 * regardless of source order, since media blocks don't add specificity.
 * Same trap as the font-size override further up, applied here for
 * position/dimensions instead.
 */
.stat-pair .stat-card__number-wrap,
.stat-pair .stat-card__number-wrap--v5,
.stat-pair .stat-card__caption,
.stat-pair .stat-card__caption--v5 {
	position: static;
	left: auto;
	top: auto;
	width: auto;
	max-width: none;
}

.stat-card__number {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-weight: 700;
	font-size: 20pt;
	line-height: 1.2;
	color: #2a2637;
}

.stat-card__quote-wrap {
	position: static;
	width: auto;
	height: auto;
	padding: 0;
	margin-top: 8px;
}

.stat-card__quote,
.stat-card__attribution {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-size: 11pt;
	color: #2a2637;
}

/* ---------------------------------------------------------------------
 * testimonials.css
 * ------------------------------------------------------------------- */

/*
 * Unlike workshop-quotations.css below, the testimonial carousel is hidden
 * outright rather than unrolled into stacked cards — it's excluded from the
 * PDF/print output entirely (product decision), not just simplified for
 * Dompdf. `!important` matches the specificity fight `.testimonial--carousel`
 * used to need against `.is-active`'s own `display: flex` from the live
 * carousel styles.
 */
.testimonial-carousel {
	display: none !important;
}

/*
 * Hiding the carousel above leaves its wrapping `.workshop-tab-section`
 * (the "Testimonials" tab, when that's all it holds) with nothing in it but
 * its own `border-bottom` section divider — a stray horizontal rule with no
 * content around it. Two different techniques cover this file's two
 * consumers, since neither alone reaches both:
 *
 * - `torii_get_workshop_overview_pdf_css()` (inc/workshop-overview-pdf.php)
 *   actually removes `.testimonial-carousel` from the DOM for the PDF
 *   export (unlike this file's own `display: none`, which only hides it
 *   visually and leaves the element in place), so `.workshop-tab-section`
 *   becomes genuinely empty there — `:empty` (implemented in Dompdf as "no
 *   element children and no non-whitespace text", so the whitespace text
 *   nodes WordPress's block markup leaves behind don't defeat it) catches
 *   that case.
 * - The live front-end page a browser prints via Ctrl+P never goes through
 *   that PHP removal — `.testimonial-carousel` is still in the DOM there,
 *   just CSS-hidden, so `:empty` never matches. `:has()` reaches into the
 *   DOM to check for that hidden child directly instead. Dompdf's CSS
 *   selector parser has no `:has()` support at all (confirmed directly
 *   against the installed dompdf/dompdf source) and returns null for it,
 *   which drops just this one selector rather than erroring out the whole
 *   rule/stylesheet — safe to ship even though it does nothing for Dompdf.
 */
.workshop-tab-section:empty,
.workshop-tab-section:has(> .testimonial-carousel:only-child) {
	display: none;
}

/* ---------------------------------------------------------------------
 * workshop-options.css
 * ------------------------------------------------------------------- */

/* Rows and their label/values are flexbox, unsupported by Dompdf. Falls
   back to a simple two-column table-like block layout using floats
   instead, which Dompdf handles reliably. */
.workshop-options-row {
	display: block;
}

.workshop-options {
	background: none;
	padding: 0;
}

.workshop-options__label {
	font-size: 11pt;
}

.workshop-table__row {
	display: table;
	width: 100%;
	padding: 15px 0;
	page-break-inside: avoid;
}

.workshop-table__label {
	display: table-cell;
	vertical-align: top;
	width: 115pt;
	font-size: 11pt;
}

.workshop-table__label p {
	display: inline-block;
	vertical-align: middle;
	margin: 0;
	padding-left: 10px;
}

.workshop-table__values {
	display: table-cell;
	vertical-align: top;
}

.workshop-table__value {
	display: inline;
	font-size: 11pt;
}

.workshop-table__value:not(:last-child)::after {
	content: ' | ';
}

/* ---------------------------------------------------------------------
 * workshop-quotations.css
 * ------------------------------------------------------------------- */

/*
 * Only the first quotation should appear in the PDF, not every quotation —
 * matches the same `.is-active` class render.php already puts on the first
 * slide server-side (`0 === $slide_index`), so no "first item" tracking is
 * needed here. The base `.workshop-quotation--carousel { display: none; }`
 * rule from the live CSS already hides every other slide and needs no
 * print override (`display: none` is one of the few things Dompdf renders
 * exactly like a browser); only `.is-active`'s `display: flex` (unsupported
 * by Dompdf) needs swapping for `block`, and the carousel chrome
 * (arrows/dots), meaningless without workshop-quotations.js, is dropped.
 */
.workshop-quotation-carousel {
	display: block;
}

.workshop-quotation-carousel__slides {
	display: block;
}

.workshop-quotation-carousel__arrow,
.workshop-quotation-carousel__pagination {
	display: none;
}

.workshop-quotation--carousel.is-active {
	display: block !important;
	max-width: 100%;
	page-break-inside: avoid;
}

.workshop-quotation__text {
	font-family: Urbanist, 'DejaVu Sans', sans-serif;
	font-weight: 600;
	font-size: 12pt;
	line-height: 1.25;
	color: #2a2637;
	margin-bottom: 6px;
}

.workshop-quotation__attribution {
	font-family: Poppins, 'DejaVu Sans', sans-serif;
	font-size: 9pt;
}

.workshop-quotation__name,
.workshop-quotation__role {
	font-size: 10pt;
	color: #2a2637;
}

/* ---------------------------------------------------------------------
 * workshop-text-component.css
 * ------------------------------------------------------------------- */

/* box-shadow renders unreliably in Dompdf (shows as a stray curved line
   tracing part of the photo instead of a soft shadow) — swap it for a
   plain border. The image collage's absolute two-photo overlap also isn't
   worth the layout risk on a printed page, so stack both photos in normal
   flow instead. */
.text-component__image {
	box-shadow: none;
	border: 1px solid #2a2637;
}

.text-component--with-image {
	flex-direction: column;
}

.text-component__image-collage {
	position: static;
	width: auto;
	height: auto;
}

.text-component__image--back,
.text-component__image--front {
	position: static;
	width: auto;
	height: 260px;
	margin-bottom: 16px;
}

/*
 * The `display: block` reset above drops the live flexbox's `gap` spacing
 * between children — replace with a margin on each child so
 * paragraphs/headings/lists don't run together.
 */
.text-component > * {
	margin-bottom: 8pt;
}

.text-component > *:last-child {
	margin-bottom: 0;
}

/*
 * The tick's background-image checkmark (data URI on an absolutely
 * positioned ::before) doesn't reliably paint in Dompdf, and swapping it
 * for a text-content/inline-block ::before didn't hold up either — both
 * showed correctly on a page that had no break in the middle of the
 * list, but a ::before pseudo-element that lands right at a page
 * boundary gets redrawn at the top-left of the next page instead of
 * staying attached to its `<li>`. Rather than chase a third
 * pseudo-element workaround, use a real list marker instead — Dompdf's
 * pagination treats native `list-style` bullets as a first-class case it
 * splits correctly, unlike a synthesised pseudo-element box. Loses the
 * exact tick-in-a-circle artwork, but a coloured disc marker still reads
 * as "this is a benefits list" and never drifts.
 */
.wp-block-list.is-style-tick {
	display: block;
	list-style: disc;
	padding-left: 20px;
}

.wp-block-list.is-style-tick > li {
	position: static;
	padding-left: 4px;
	margin-bottom: 5pt;
	color: #2a2637;

	/*
	 * The live rule this overrides (assets/css/components/workshop-text-component.css)
	 * sets `font-size: 1.125rem` (18px/13.5pt) — bigger than this file's
	 * 11pt body copy and never neutralised here before, so benefit/tick
	 * lists (a common pattern in Workshop tab content) rendered noticeably
	 * larger than surrounding paragraphs. Matches plain body text instead,
	 * consistent with every other non-heading element on this file's scale.
	 */
	font-size: 11pt;
	line-height: 1.3;
}

.wp-block-list.is-style-tick > li::before {
	content: none;
}

/* Same reasoning as .wp-block-list.is-style-tick above — the arrow's
   background-image ::before marker doesn't survive Dompdf/page-break
   rendering either, so fall back to the same native disc marker
   treatment. */
.wp-block-list.is-style-arrow {
	display: block;
	list-style: disc;
	padding-left: 20px;
}

.wp-block-list.is-style-arrow > li {
	position: static;
	padding-left: 4px;
	margin-bottom: 5pt;
	color: #2a2637;
	font-size: 11pt;
	line-height: 1.3;
}

.wp-block-list.is-style-arrow > li::before {
	content: none;
}

/* ---------------------------------------------------------------------
 * WordPress preset font-size utility classes
 * ------------------------------------------------------------------- */

/*
 * When an editor picks a named size (e.g. "Body Large") from a block's own
 * Typography panel — common on lead paragraphs and bullet lists an editor
 * wants to stand out — WordPress adds a `has-{slug}-font-size` class and
 * `wp_get_global_stylesheet()` (included by
 * torii_get_workshop_overview_pdf_css(), appended *before* this file)
 * emits a matching rule with `!important`, specifically so it reliably
 * beats block/theme defaults. That also means it beats every font-size
 * this file sets above, `!important` or not, regardless of which comes
 * later in the stylesheet — the live site's `body-large`/`heading-1`
 * pixel sizes (tuned for on-screen viewing) end up in the PDF completely
 * unscaled, next to text using this file's deliberate pt scale. Only a
 * matching `!important` override, one per theme.json font size preset
 * (assets/fonts.css.../theme.json `settings.typography.fontSizes`), can
 * win here — mapped onto the same 9/11/12/13/16/20/22pt scale documented
 * near the top of this file.
 */
.has-body-copy-font-size {
	font-size: 11pt !important;
}

.has-body-large-font-size {
	font-size: 12pt !important;
}

.has-heading-4-font-size {
	font-size: 13pt !important;
}

.has-heading-3-font-size {
	font-size: 16pt !important;
}

.has-heading-2-font-size {
	font-size: 20pt !important;
}

.has-heading-1-font-size {
	font-size: 22pt !important;
}
