/* =========================================================================
   CNZ Athlete Registration UI — v1.6.4
   v1.6.4 — .cnz-reg-removed-athlete: the hub notice shown when an athlete this
            account registered is no longer on the roster (plugin v0.21.13).
            Third block in the portal's amber "needs awareness" family, drawn at
            PAGE level rather than card level. See the EOF block.
   ---
   CNZ Athlete Registration UI — v1.6.2
   v1.6.2 — Portal art-direction pass (Kit, 2026-07-25): ONE CTA rail + ONE
            button geometry in the attention band, and the hub event card
            reduced to a single label/value grid. See the EOF block.
   ---
   CNZ Athlete Registration UI — v1.6.1
   v1.6.1 — Event card meta rows (label + value) are a real two-column grid, so
            a value that wraps stays in its own column instead of running back
            under the label. Needed by the entry-limit row that plugin v0.19.0
            adds to those rows ("Entry limit  40 athletes in the event · …").
            Also .cnz-reg-eventcard--muted: an open event nobody on the account
            can enter is now shown greyed rather than hidden.
   ---
   CNZ Athlete Registration UI — v1.5.0
   v1.5.0 — Phase E2-B event entries: the portal "Events open for entry"
            section (per-athlete combo checkboxes, price labels, live total),
            per-card "Event entries" list, entered-combo chips. See EOF block.
   ---
   CNZ Athlete Registration UI — v1.4.4
   v1.4.4 — Athlete photo corner badge is now the represented COUNTRY FLAG
            (.cnz-reg-photo__flag--<iso2>, theme flags/<iso2>.svg from the MIT
            flag-icons set) instead of the CNZ fern — works for every nationality,
            not just NZ. See EOF block.
   ---
   CNZ Athlete Registration UI — v1.4.3
   Styles the front-end shortcodes from the cnz-registrations plugin:
     [cnz_athlete_registration]  [cnz_my_registration]  [cnz_club_verification]
   plus the WooCommerce order-received (registration confirmation) page.
   Reuses the theme design tokens and the .cnz-badge / .cnz-callout components
   already defined in custom.css.

   v1.4.3 — Phase E1: athlete photo control on the portal (.cnz-reg-photo) and
            the derived age-category chip next to the athlete name
            (.cnz-reg-category). See EOF block.
            Portal athlete-card redesign (2026-07-07): two-column member-card
            layout — larger 170px photo (.cnz-reg-card__media) on the LEFT, name
            + summary (.cnz-reg-card__body) on the RIGHT, stacking on mobile;
            rounded-square photo frame; camera-icon hover overlay replacing the
            old "ADD PHOTO" ribbon; a specificity fix so the hidden no-JS
            .cnz-reg-photo__save button stays hidden; and the NZ placeholder
            watermark is now the real CNZ silver-fern logo mark
            (assets/images/cnz-logo-no-text.png, layered via
            .cnz-reg-photo__button--nz). See EOF block.
            Athlete-avatar redesign (2026-07-07): the frame is now PORTRAIT
            (170px wide, 4:5 tall) to hold the new torso-up athlete figure the
            plugin emits (black CNZ singlet, silver-fern chest emblem). The empty
            tile uses a soft top-to-bottom green-tint wash, and the CNZ silver
            fern is no longer a centered stamp — it's blown up LARGE and bled off
            the bottom-right corner, then dissolved toward the figure with a
            diagonal gradient mask so it reads as a dynamic graphic element.
            Uploaded photos still fill the portrait frame via object-fit: cover.
            Photo help (format/size + consent) moved behind a small ⓘ info
            button (.cnz-reg-photo__info / __tip) so it stops repeating as long
            text under every athlete card; the tip shows on hover + focus-within
            (touch-friendly).
            Placeholder art is now gender-keyed CNZ climbing-athlete illustrations
            (assets/images/cnz-athlete-placeholder-{male,female}.jpg) set as the
            background of .cnz-reg-photo__placeholder--{male,female}; the earlier
            inline-SVG figure + full-frame silver-fern watermark were retired.
            NZ athletes instead get a small CNZ fern corner badge
            (.cnz-reg-photo__button--nz ::before white chip + ::after fern) that
            works over both the placeholder and an uploaded photo.
   v1.4.2 — Group G interstitial: batch list rows, quiet-destructive remove
            pill (.cnz-reg-remove-link, also on portal cards), and the
            checkout-matching "Back to my registrations" link (see EOF block).
   v1.4.0 — Consent disclosures: calm, consistent body text + lists inside every
            registration <details> (Obligations of Competitors + privacy statement),
            so the long consent copy reads like the rest of the form.
   v1.3.0 — Group C UX polish: collapsible "Details on file" (.cnz-reg-details) +
            privacy statement (.cnz-reg-privacy), help/submit notes (.cnz-reg-help,
            .cnz-reg-submit-note), disabled "same as" checkbox cue.
   v1.2.9 — Compact dialing-code control: flag + code button (.cnz-cc-btn) with a
            full-country-name listbox dropdown (.cnz-cc-list); native select hidden.
   v1.2.8 — Phone control: dialing-code dropdown + number on one row (.cnz-reg-phone).
   v1.2.4 — Previous seasons empty-state line under athlete cards.
   v1.2.3 — register page Log in secondary CTA: anchor .cnz-btn-plain + CTA wrap.
   v1.2.2 — My Registration season history table + change-request toggle spacing.
   v1.2.1 — form control styles also apply under .cnz-reg-myreg (My Registration
   login front door uses that wrapper, not .cnz-reg-form).
   v1.2.0 — order-confirmation page: CNZ thank-you panel layout and a tidy,
   theme-aligned payment summary table (replaces WooCommerce's clunky default).
   v1.1.0 — per-field validation UX: inline error messages at each field, red
   highlight on invalid controls, required (*) markers, stronger error summary,
   and focus/disabled button states. Mirrors the contact-form error pattern.
   ========================================================================= */

.cnz-reg-form,
.cnz-reg-myreg,
.cnz-reg-verify { margin: 1.5rem 0; }

.cnz-hidden { display: none !important; }

/* ---- Form sections --------------------------------------------------- */
.cnz-reg-section {
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 4px;
	padding: 1rem 1.5rem 1.5rem;
	margin: 0 0 1.5rem;
}
.cnz-reg-section > legend {
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	font-size: 0.9rem;
	padding: 0 0.5rem;
}

/* ---- Field grid ------------------------------------------------------ */
.cnz-reg-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 1rem 1.25rem;
}
@media (max-width: 600px) {
	.cnz-reg-grid { grid-template-columns: 1fr; }
}

.cnz-reg-field { margin: 0; }
.cnz-reg-field > label {
	display: block;
	font-weight: 600;
	font-size: 0.875rem;
	letter-spacing: 0.02em;
	margin-bottom: 0.25rem;
	color: var(--wp--preset--color--primary, #000);
}
.cnz-reg-field .optional {
	font-weight: 400;
	color: var(--wp--preset--color--tertiary, #666);
}
/* Required marker — distinct from .optional. */
.cnz-reg-field .required,
:is(.cnz-reg-form, .cnz-reg-myreg) .required {
	color: #b3261e;
	font-weight: 700;
	margin-left: 0.15rem;
}

:is(.cnz-reg-form, .cnz-reg-myreg) input[type="text"],
:is(.cnz-reg-form, .cnz-reg-myreg) input[type="email"],
:is(.cnz-reg-form, .cnz-reg-myreg) input[type="tel"],
:is(.cnz-reg-form, .cnz-reg-myreg) input[type="date"],
:is(.cnz-reg-form, .cnz-reg-myreg) input[type="password"],
:is(.cnz-reg-form, .cnz-reg-myreg) select,
:is(.cnz-reg-form, .cnz-reg-myreg) textarea {
	width: 100%;
	padding: 0.65rem 0.8rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 2px;
	font: inherit;
	background: var(--wp--preset--color--base, #fff);
	color: var(--wp--preset--color--primary, #000);
	box-sizing: border-box;
}
:is(.cnz-reg-form, .cnz-reg-myreg) input:focus,
:is(.cnz-reg-form, .cnz-reg-myreg) select:focus,
:is(.cnz-reg-form, .cnz-reg-myreg) textarea:focus {
	outline: 2px solid var(--wp--preset--color--accent, #008B45);
	outline-offset: 1px;
	border-color: var(--wp--preset--color--accent, #008B45);
}

/* ---- Checkboxes ------------------------------------------------------ */
.cnz-reg-check { margin: 0.85rem 0 0; }
.cnz-reg-check label {
	display: flex;
	gap: 0.6rem;
	align-items: flex-start;
	font-weight: 400;
	font-size: 0.95rem;
}
.cnz-reg-check input[type="checkbox"] { margin-top: 0.25rem; flex: 0 0 auto; }

.cnz-reg-note { color: var(--wp--preset--color--tertiary, #666); font-size: 0.95rem; }
.cnz-reg-actions { margin-top: 1.5rem; }

/* ---- Field-level validation ----------------------------------------- */
/* Inline message shown directly beneath the offending field. */
.cnz-reg-field-error {
	display: block;
	margin-top: 0.35rem;
	font-size: 0.8rem;
	font-weight: 600;
	line-height: 1.4;
	color: #b3261e;
}
/* Red highlight on the invalid control itself. */
:is(.cnz-reg-form, .cnz-reg-myreg) input[aria-invalid="true"],
:is(.cnz-reg-form, .cnz-reg-myreg) select[aria-invalid="true"],
:is(.cnz-reg-form, .cnz-reg-myreg) textarea[aria-invalid="true"] {
	border-color: #b3261e;
	background: #fff8f7;
}
:is(.cnz-reg-form, .cnz-reg-myreg) input[aria-invalid="true"]:focus,
:is(.cnz-reg-form, .cnz-reg-myreg) select[aria-invalid="true"]:focus,
:is(.cnz-reg-form, .cnz-reg-myreg) textarea[aria-invalid="true"]:focus {
	outline-color: #b3261e;
	border-color: #b3261e;
}
:is(.cnz-reg-form, .cnz-reg-myreg) input[type="checkbox"][aria-invalid="true"] {
	outline: 2px solid #b3261e;
	outline-offset: 2px;
}
/* Tint the label of an invalid field where :has() is supported (progressive). */
.cnz-reg-field:has([aria-invalid="true"]) > label { color: #b3261e; }
.cnz-reg-check:has([aria-invalid="true"]) { color: #b3261e; }

/* ---- Error summary --------------------------------------------------- */
.cnz-reg-errors {
	border-left-color: #b3261e !important;
	background: #fdecea;
	color: #5b1410;
}
.cnz-reg-errors h4 { margin-top: 0; color: #5b1410; }
.cnz-reg-errors ul { margin: 0.5rem 0 0; padding-left: 1.25rem; }
.cnz-reg-errors li { margin: 0.2rem 0; }
.cnz-reg-errors a {
	color: #5b1410;
	text-decoration: underline;
	font-weight: 600;
}
.cnz-reg-errors a:hover,
.cnz-reg-errors a:focus { color: #b3261e; }

/* ---- Buttons --------------------------------------------------------- */
button.cnz-btn-accent,
a.cnz-btn-accent {
	display: inline-block;
	background: var(--wp--preset--color--accent, #008B45);
	color: #fff;
	border: 2px solid var(--wp--preset--color--accent, #008B45);
	padding: 0.7rem 1.75rem;
	font-size: 0.85rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	border-radius: 2px;
	cursor: pointer;
	text-decoration: none;
	transition: background 0.15s ease, color 0.15s ease;
}
button.cnz-btn-accent:hover,
a.cnz-btn-accent:hover { background: #006B35; color: #fff; }
button.cnz-btn-accent:focus-visible,
a.cnz-btn-accent:focus-visible,
button.cnz-btn-plain:focus-visible,
a.cnz-btn-plain:focus-visible {
	outline: 3px solid var(--wp--preset--color--accent, #008B45);
	outline-offset: 2px;
}
button.cnz-btn-accent:disabled,
button.cnz-btn-accent[aria-busy="true"] {
	opacity: 0.6;
	cursor: progress;
}

button.cnz-btn-plain,
a.cnz-btn-plain {
	display: inline-block;
	background: transparent;
	color: var(--wp--preset--color--primary, #000);
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	padding: 0.7rem 1.25rem;
	font-size: 0.85rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	border-radius: 2px;
	cursor: pointer;
	text-decoration: none;
	transition: background 0.15s ease;
}
button.cnz-btn-plain:hover,
a.cnz-btn-plain:hover { background: var(--wp--preset--color--base-alt, #F5F5F5); }

/* Secondary CTA box: "Log in" above the create-account form (register page),
   and "Create an account" below the login form (portal front door, v1.3.0). */
.cnz-reg-login-cta-wrap {
	margin: 0 0 1.5rem;
	padding: 1rem 1.25rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 4px;
	background: var(--wp--preset--color--base-alt, #F5F5F5);
}
.cnz-reg-login-cta-wrap .cnz-reg-note { margin: 0; }
.cnz-reg-login-cta-wrap .cnz-reg-actions { margin-top: 0.75rem; }
/* In the portal front door the CTA sits BELOW the login panel, so flip the
   margin to separate it from the form above rather than the content below. */
.cnz-reg-login .cnz-reg-login-cta-wrap { margin: 1.5rem 0 0; }

/* ---- My Registration cards ------------------------------------------ */
.cnz-reg-card h3 { margin-top: 0; }
.cnz-reg-summary { width: 100%; border-collapse: collapse; margin: 0.5rem 0 1rem; }
.cnz-reg-summary th {
	text-align: left;
	width: 40%;
	padding: 0.4rem 0.75rem 0.4rem 0;
	color: var(--wp--preset--color--tertiary, #666);
	font-weight: 600;
	vertical-align: top;
}
.cnz-reg-summary td { padding: 0.4rem 0; }

/* Prior-season history beneath the active-season summary card. */
.cnz-reg-history {
	margin: 1.25rem 0 0;
	padding-top: 1rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-history h4 {
	margin: 0 0 0.75rem;
	font-size: 0.9rem;
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: 0.04em;
}
.cnz-reg-history-empty {
	margin: 0;
	font-size: 0.9rem;
	color: var(--wp--preset--color--tertiary, #666);
}
.cnz-reg-history-table { margin-bottom: 0; }
.cnz-reg-history-table th,
.cnz-reg-history-table td {
	padding: 0.5rem 0.75rem 0.5rem 0;
	vertical-align: middle;
}
.cnz-reg-history-table thead th {
	font-size: 0.75rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--tertiary, #666);
	font-weight: 600;
	border-bottom: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
@media (max-width: 600px) {
	.cnz-reg-history-table thead { display: none; }
	.cnz-reg-history-table tr {
		display: block;
		padding: 0.75rem 0;
		border-bottom: 1px solid var(--wp--preset--color--border, #E0E0E0);
	}
	.cnz-reg-history-table td {
		display: block;
		padding: 0.2rem 0;
	}
	.cnz-reg-history-table td::before {
		content: attr(data-label);
		display: block;
		font-size: 0.75rem;
		text-transform: uppercase;
		letter-spacing: 0.04em;
		color: var(--wp--preset--color--tertiary, #666);
		font-weight: 600;
		margin-bottom: 0.15rem;
	}
}

.cnz-reg-change-request,
.cnz-reg-details,
.cnz-reg-obligations,
.cnz-reg-privacy { margin: 1rem 0 0; }

/* ---- Disclosure toggles (shared, v1.3.0) ----------------------------- */
/* One calm pattern for every registration <details> (athlete details, privacy
   statement, request a change, account edit): a rotating chevron carries the
   open/close affordance, so the label stays a quiet near-black heading instead
   of a stack of bold green links. Green is reserved for the caret + hover. */
.cnz-reg-disclosure > summary {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	cursor: pointer;
	list-style: none;
	font-weight: 600;
	font-size: 1rem;
	text-transform: none;
	letter-spacing: 0;
	color: var(--wp--preset--color--primary, #111);
	transition: color 0.15s ease;
}
.cnz-reg-disclosure > summary::-webkit-details-marker { display: none; }
.cnz-reg-disclosure > summary::before {
	content: "";
	flex: none;
	width: 0.4em;
	height: 0.4em;
	margin-bottom: 0.1em;          /* optical centring of the rotated square */
	border-right: 2px solid var(--wp--preset--color--accent, #008B45);
	border-bottom: 2px solid var(--wp--preset--color--accent, #008B45);
	transform: rotate(-45deg);     /* points right when closed */
	transition: transform 0.15s ease;
}
.cnz-reg-disclosure[open] > summary::before {
	margin-bottom: 0;
	transform: rotate(45deg);      /* points down when open */
}
.cnz-reg-disclosure > summary:hover,
.cnz-reg-disclosure > summary:focus-visible { color: var(--wp--preset--color--accent, #008B45); }
.cnz-reg-disclosure[open] > summary { margin-bottom: 0.75rem; }
.cnz-reg-details .cnz-reg-summary { margin-bottom: 0.5rem; }
.cnz-reg-details .cnz-reg-note { margin: 0.25rem 0 0; }

/* Disclosure body: the long consent copy (Obligations, privacy statement) reads
   as calm, slightly-muted body text matching the rest of the form, with tidy
   lists — not the theme's default (larger, looser) paragraph/list styling. */
.cnz-reg-disclosure > :not(summary) {
	font-size: 0.95rem;
	line-height: 1.55;
	color: var(--wp--preset--color--contrast, #333);
}
.cnz-reg-disclosure > p { margin: 0 0 0.75rem; }
.cnz-reg-disclosure > p:last-child { margin-bottom: 0; }
.cnz-reg-disclosure > ul {
	margin: 0 0 0.75rem;
	padding-left: 1.25rem;
	list-style: disc;
}
.cnz-reg-disclosure > ul:last-child { margin-bottom: 0; }
.cnz-reg-disclosure > ul > li { margin: 0 0 0.4rem; }
.cnz-reg-disclosure > ul > li:last-child { margin-bottom: 0; }
.cnz-reg-disclosure a { color: var(--wp--preset--color--accent, #008B45); }

/* ---- Help + submit reassurance notes (v1.3.0) ------------------------ */
.cnz-reg-help { margin-top: 1.5rem; }
.cnz-reg-submit-note { margin-top: 0.5rem; }

/* Disabled "same as" checkbox (athlete phone empty) reads as inactive. */
.cnz-reg-check input[type="checkbox"]:disabled { cursor: not-allowed; }
.cnz-reg-check:has(input[type="checkbox"]:disabled) label { opacity: 0.55; cursor: not-allowed; }

/* ---- Club verification page ------------------------------------------
   Art-direction pass 2026-07-27. The page was one undifferentiated table of
   every claim ever made — 135 rows in the sandbox, all carrying both buttons
   whatever their state, so the work never visibly shrank and a wall of accent
   green made no row more urgent than any other. It's now two zones (what needs
   an answer / what's been answered, the latter collapsed) with a running count.
   ---------------------------------------------------------------------- */
.cnz-reg-verify__lead { max-width: 60ch; margin: 0 0 0.6rem; }
.cnz-reg-verify__progress {
	margin: 0 0 1.5rem;
	font-size: 1.05rem;
	color: var(--wp--preset--color--contrast, #1A1A1A);
}
.cnz-reg-verify__zone { margin: 0 0 2rem; }
.cnz-reg-verify__heading {
	font-size: 1.1rem;
	font-weight: 700;
	margin: 0 0 0.75rem;
	padding-top: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--contrast-3, #eee);
}
.cnz-reg-verify__done { margin: 0 0 2rem; }
.cnz-reg-verify__done > summary { font-weight: 600; }
.cnz-reg-verify__done .cnz-reg-verify-table { margin-top: 1rem; }
.cnz-reg-verify__help { margin-top: 2rem; }

/* A club rejection, explained to the account holder. Amber (the "needs
   awareness" tone used by the entries-close pill), never red — this is a
   mix-up being sorted, not a failure on their part. */
.cnz-reg-clubcheck {
	margin: 1rem 0 0;
	/* Same rail + gap as .cnz-reg-changes__group--pending, the other 3px amber
	   informational block in the portal (Kit, 2026-07-27 — the text was sitting
	   flush against the rule). Any accent-railed block here carries its own
	   padding; .cnz-callout supplies none on this page. */
	padding: 0.75rem 0.9rem 0.8rem 1rem;
	border-left: 3px solid #985A1C;
}
.cnz-reg-clubcheck p { margin: 0 0 0.6rem; max-width: 62ch; }
.cnz-reg-clubcheck p:last-child { margin-bottom: 0; }

.cnz-reg-verify-table { width: 100%; }
/* Row rhythm (round 2, Kit 2026-07-27: "the text is a bit too close to each
   other"). A 100-row decision list is read by scanning names down the left, so
   each row needs to be a visibly separate block: real vertical padding, a hair
   line between rows, and every cell top-aligned so a two-line name doesn't drag
   its neighbours out of alignment. */
.cnz-reg-verify-table th,
.cnz-reg-verify-table td {
	vertical-align: top;
	padding: 1rem 1rem 1rem 0;
	line-height: 1.45;
}
.cnz-reg-verify-table td:last-child,
.cnz-reg-verify-table th:last-child { padding-right: 0; }
.cnz-reg-verify-table tbody tr + tr > td { border-top: 1px solid var(--wp--preset--color--border, #E0E0E0); }
/* Column widths, or the browser hands the name column the least room and the
   climber's name wraps INTO the age beside it — exactly what Kit saw. The name
   gets the space; age and the buttons take only what they need. */
.cnz-reg-verify-table th:nth-child(1) { width: 28%; }
.cnz-reg-verify-table th:nth-child(2) { width: 1%; }
.cnz-reg-verify-table th:last-child   { width: 1%; }
.cnz-reg-verify-table td:first-child { font-weight: 600; text-wrap: pretty; }
/* "Senior (41)" is one atomic value — never break it across lines. */
.cnz-reg-verify-table td:nth-child(2),
.cnz-reg-verify-table td:last-child { white-space: nowrap; }
.cnz-reg-verify-table thead th {
	font-size: 0.75rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--tertiary, #666);
	font-weight: 600;
}
.cnz-reg-verify-actions { display: inline-flex; gap: 0.5rem; margin: 0; }
/* Yes/No are a matched pair: same width, so the eye lands on the same target
   on every row rather than re-measuring per name. */
.cnz-reg-verify-actions button { min-width: 4.5rem; text-align: center; }
/* "No" stays quiet — it mails CNZ, drops the climber to the non-member entry
   rate and changes their own portal, so it must never be the easy mis-tap. */
.cnz-reg-verify-reject { color: var(--wp--preset--color--tertiary, #666); }
.cnz-reg-verify-reject:hover,
.cnz-reg-verify-reject:focus-visible { color: #9A2222; border-color: #9A2222; }

/* "Competing in": a bare <ul> in a table cell inherits the theme's bulleted
   body list and reads as prose beside the other cells. */
.cnz-reg-verify-events { vertical-align: top; }
.cnz-reg-verify-events__list {
	margin: 0;
	padding: 0;
	list-style: none;
	color: var(--wp--preset--color--contrast-2, #444);
}
/* Several competitions stack; give them their own rhythm so two entries read as
   two lines rather than one run-on, and cap the visual weight at three.
   line-height MUST be inherited: the theme's list styles set 1.6 on li, which
   left the first entry sitting a pixel below the name and age beside it (these
   cells are top-aligned, so any line-height difference shows up as a baseline
   offset — measured, not guessed). */
/* Specificity: a bare `line-height: inherit` on the li loses to the theme's own
   list rule, leaving the first entry a pixel below its row-mates. Scoped to the
   table and stated as the same value the cells use. */
.cnz-reg-verify-table .cnz-reg-verify-events__list li {
	margin: 0 0 0.35rem;
	text-wrap: pretty;
	line-height: 1.45;
}
.cnz-reg-verify-table .cnz-reg-verify-events__list li:last-child { margin-bottom: 0; }
.cnz-reg-verify-events__more { color: var(--wp--preset--color--tertiary, #666); font-style: italic; }

@media (max-width: 782px) {
	.cnz-reg-verify-table thead { display: none; }
	.cnz-reg-verify-table tr {
		display: block;
		padding: 0.9rem 0;
		border-bottom: 1px solid var(--wp--preset--color--border, #E0E0E0);
	}
	.cnz-reg-verify-table td { display: block; padding: 0.2rem 0; }
	.cnz-reg-verify-table td::before {
		content: attr(data-label);
		display: block;
		font-size: 0.75rem;
		text-transform: uppercase;
		letter-spacing: 0.04em;
		color: var(--wp--preset--color--tertiary, #666);
		font-weight: 600;
		margin-bottom: 0.15rem;
	}
	.cnz-reg-verify-table td { padding: 0.25rem 0; white-space: normal; }
	.cnz-reg-verify-table tbody tr + tr > td { border-top: 0; }
	/* The climber's name is the row's heading once the table stacks. */
	.cnz-reg-verify-table td:first-child { font-size: 1.05rem; font-weight: 700; }
	.cnz-reg-verify-table td:first-child::before { display: none; }
	.cnz-reg-verify-actions { margin-top: 0.35rem; }
	.cnz-reg-verify-actions button { min-width: 5.5rem; }
}


/* ---- Login form ------------------------------------------------------ */
.cnz-reg-login form { margin-top: 1rem; }
.cnz-reg-login label { font-weight: 600; }
/* ---- Account chooser + login + club note ---------------------------- */
.cnz-reg-account-choice { margin: 1.5rem 0; }
.cnz-reg-choice-buttons { display: flex; flex-wrap: wrap; gap: 0.75rem; margin: 0.5rem 0 0; }
.cnz-reg-login-panel { margin: 1.5rem 0; }
.cnz-reg-login-panel h3 { margin-top: 0; }
.cnz-reg-back {
	background: none;
	border: 0;
	padding: 0;
	margin-top: 0.5rem;
	color: var(--wp--preset--color--accent, #008B45);
	font: inherit;
	font-weight: 600;
	cursor: pointer;
	text-decoration: underline;
}
.cnz-reg-logout { margin-left: 0.5rem; }
.cnz-reg-club-note { margin-top: 1rem; }
:is(.cnz-reg-form, .cnz-reg-myreg) input[readonly] {
	background: var(--wp--preset--color--base-alt, #F5F5F5);
	color: var(--wp--preset--color--primary, #000);
	opacity: 0.85;
}
.cnz-reg-hint { display: block; margin-top: 0.25rem; font-size: 0.8rem; color: var(--wp--preset--color--tertiary, #666); }

/* ---- Order-received (registration confirmation) page ----------------- */
/* WooCommerce status block: the "Thank you — you're registered" heading
   and the welcome line. */
.wc-block-order-confirmation-status { margin: 0 0 2rem; }
.wc-block-order-confirmation-status h1 { margin: 0 0 0.5rem; }
.wc-block-order-confirmation-status p { font-size: 1.1rem; margin: 0; max-width: 60ch; }

/* CNZ confirmation panel (athlete number, what happens next, actions). */
.cnz-reg-thankyou { margin: 0 0 2rem; }
.cnz-reg-thankyou .cnz-reg-card { margin: 0 0 1.5rem; }
.cnz-reg-thankyou .cnz-reg-card h3 { margin: 0 0 0.75rem; }
.cnz-reg-thankyou .cnz-callout h4 { margin: 0 0 0.5rem; }
.cnz-reg-thankyou .cnz-callout ul { margin: 0; padding-left: 1.25rem; }
.cnz-reg-thankyou .cnz-callout li { margin: 0.35rem 0; }
/* Competitions open for entry, on the confirmation page (2026-07-27). The
   section heading rule that separates it on the hub is right here too, but the
   card must not inherit the hub's 2.5rem top margin twice over. */
.cnz-reg-thankyou-events { margin-top: 2rem; }
.cnz-reg-thankyou-events .cnz-reg-events__heading { margin-top: 0; }
.cnz-reg-thankyou-events .cnz-reg-note { margin-top: 0.9rem; }

.cnz-reg-thankyou .cnz-reg-actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.85rem 1.25rem;
	margin-top: 1.5rem;
}

/* Payment summary heading + WooCommerce summary list + totals table. */
.cnz-reg-payment-heading {
	font-size: 0.9rem;
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	margin: 0 0 0.75rem;
	padding-bottom: 0.5rem;
	border-bottom: 2px solid var(--wp--preset--color--primary, #000);
}

.wc-block-order-confirmation-summary-list {
	list-style: none;
	margin: 0 0 1.5rem;
	padding: 1rem 1.25rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 4px;
	background: var(--wp--preset--color--base-alt, #F5F5F5);
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
	gap: 0.6rem 1.5rem;
}
.wc-block-order-confirmation-summary-list-item { margin: 0; }
.wc-block-order-confirmation-summary-list-item__key {
	display: block;
	font-size: 0.75rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--tertiary, #666);
}
.wc-block-order-confirmation-summary-list-item__value { font-weight: 700; }

.wc-block-order-confirmation-totals__table {
	width: 100%;
	border-collapse: collapse;
	margin: 0;
}
.wc-block-order-confirmation-totals__table th,
.wc-block-order-confirmation-totals__table td {
	padding: 0.65rem 0.5rem;
	border-bottom: 1px solid var(--wp--preset--color--border, #E0E0E0);
	text-align: left;
	vertical-align: top;
}
.wc-block-order-confirmation-totals__table thead th {
	font-size: 0.75rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--tertiary, #666);
}
.wc-block-order-confirmation-totals__total { text-align: right; white-space: nowrap; }
.wc-block-order-confirmation-totals__table thead .wc-block-order-confirmation-totals__total { text-align: right; }
.wc-block-order-confirmation-totals__table tfoot th { font-weight: 600; text-align: left; }
.wc-block-order-confirmation-totals__table tfoot tr:last-child th,
.wc-block-order-confirmation-totals__table tfoot tr:last-child td {
	font-size: 1.1rem;
	font-weight: 800;
	border-bottom: 0;
}
.product-quantity { color: var(--wp--preset--color--tertiary, #666); font-weight: 600; }

/* =========================================================================
   v1.2.5 — My Registration dashboard redesign
   Each athlete becomes a real bordered card so its status, season history
   and the "Request a change" disclosure read as one unit (fixes the
   orphaned-control + clutter problems). The page-level "Register another
   athlete" CTA is demoted to an outline button and set apart from the
   card stack; account editing is a quiet disclosure pinned to the bottom.
   All scoped under .cnz-reg-myreg so the order-confirmation .cnz-reg-card
   panel is untouched.
   ========================================================================= */
.cnz-reg-myreg .cnz-reg-card {
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 6px;
	background: var(--wp--preset--color--base, #fff);
	padding: 1.5rem 1.5rem 1.75rem;
	margin: 0 0 2.5rem;            /* largest gap on the page = between athletes */
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
}
.cnz-reg-myreg .cnz-reg-card > h3 {
	margin: 0 0 0.85rem;
	font-size: 1.25rem;
	line-height: 1.2;
}

/* Status badge + athlete number are the hero data inside a card. */
.cnz-reg-myreg .cnz-reg-card .cnz-badge { font-size: 0.8rem; padding: 0.32em 0.7em; }
.cnz-reg-myreg .cnz-reg-card .cnz-reg-summary td strong { font-size: 1.05rem; }

/* Previous seasons: indented, rail-marked child of the card. */
/* (round 3) Previous seasons is an ordinary card sub-section — the left
   border is reserved for the two page-level blocks (outstanding + sheet). */

/* Page-level secondary action, divided from the athlete cards. */
.cnz-reg-add-athlete { margin: 0 0 2rem; }

/* Account editing: quiet disclosure pinned to the bottom (summary styling comes
   from the shared .cnz-reg-disclosure pattern above). */
.cnz-reg-myreg .cnz-reg-account-edit {
	margin-top: 1rem;
	padding-top: 1.5rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}

/* =========================================================================
   Change requests section (v1.4.1)
   One grouped zone per athlete card: pending requests shown inline (amber),
   resolved history behind a counted disclosure, then the Request-a-change form.
   Replaces the old free-floating .cnz-reg-pending-changes + the two adjacent
   disclosures, which read as cramped fragments.
   ========================================================================= */
.cnz-reg-myreg .cnz-reg-changes {
	margin-top: 1.5rem;
	padding-top: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-changes__heading {
	margin: 0 0 0.85rem;
	font-size: 1.05rem;
	line-height: 1.2;
}
.cnz-reg-changes__group { margin: 0 0 1rem; }
.cnz-reg-changes__group-label {
	margin: 0 0 0.5rem;
	font-size: 0.75rem;
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--wp--preset--color--tertiary, #666);
}
/* Pending = amber-railed, the one thing still needing CNZ action. */
.cnz-reg-changes__group--pending {
	padding: 0.75rem 0.9rem 0.8rem 1rem;
	border-left: 3px solid var(--wp--preset--color--warning, #C77D2C);
	background: rgba(199, 125, 44, 0.06);
	border-radius: 0 4px 4px 0;
}
.cnz-reg-changes__group--pending .cnz-reg-changes__group-label { color: #985A1C; }
.cnz-reg-changes__item { margin: 0 0 0.7rem; }
.cnz-reg-changes__item:last-child { margin-bottom: 0; }
.cnz-reg-changes__row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 0.6rem;
	margin: 0;
	font-size: 0.95rem;
}
.cnz-reg-changes__field { color: var(--wp--preset--color--tertiary, #666); }
.cnz-reg-changes__row .cnz-badge { flex: 0 0 auto; }
.cnz-reg-changes__date {
	margin: 0.3rem 0 0;
	font-size: 0.82rem;
	color: var(--wp--preset--color--tertiary, #666);
}
/* CNZ's decision note can run long — its own full-width, readable block (kept
   distinct from the row so a paragraph of explanation doesn't crowd the badge). */
.cnz-reg-changes__note {
	margin: 0.5rem 0 0;
	padding: 0.6rem 0.8rem;
	background: var(--wp--preset--color--base-alt, #F5F5F5);
	border-left: 3px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 0 4px 4px 0;
}
.cnz-reg-changes__note-label {
	display: block;
	margin-bottom: 0.15rem;
	font-size: 0.7rem;
	font-weight: 800;
	text-transform: uppercase;
	letter-spacing: 0.05em;
	color: var(--wp--preset--color--tertiary, #666);
}
.cnz-reg-changes__note-text {
	margin: 0;
	font-size: 0.9rem;
	line-height: 1.5;
	white-space: pre-line;            /* keep any line breaks CNZ typed */
}
.cnz-reg-changes__contact {
	margin: 0.45rem 0 0;
	font-size: 0.82rem;
	color: var(--wp--preset--color--tertiary, #666);
}

/* History disclosure + the request form sit flush inside the section — no own
   rails/dividers, so the whole zone reads as one block. */
.cnz-reg-myreg .cnz-reg-changes__history { margin: 0 0 1rem; }
.cnz-reg-myreg .cnz-reg-changes__history > .cnz-reg-changes__group { margin-bottom: 0; }
.cnz-reg-myreg .cnz-reg-changes .cnz-reg-change-request {
	margin: 0;
	padding: 0;
	border: 0;
}
/* "Request a change" reads as a button (an action), not a third chevron
   disclosure stacked under Athlete details + Past requests — that was chevron
   overload. Still a <details> so it works without JS (the summary toggles the
   form); the summary is just styled like .cnz-btn-plain and drops the marker. */
.cnz-reg-change-toggle {
	display: inline-block;
	background: transparent;
	color: var(--wp--preset--color--primary, #000);
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	padding: 0.7rem 1.25rem;
	font-size: 0.85rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	border-radius: 2px;
	cursor: pointer;
	list-style: none;
	transition: background 0.15s ease;
}
.cnz-reg-change-toggle::-webkit-details-marker { display: none; }
.cnz-reg-change-toggle::marker { content: ""; }
.cnz-reg-change-toggle:hover { background: var(--wp--preset--color--base-alt, #F5F5F5); }
.cnz-reg-change-toggle:focus-visible {
	outline: 3px solid var(--wp--preset--color--accent, #008B45);
	outline-offset: 2px;
}
.cnz-reg-change-request[open] .cnz-reg-change-toggle { margin-bottom: 0.85rem; }

/* Change-request status badges: amber pending / accent-green applied / grey
   declined — built on the shared .cnz-badge base in custom-vX.css. */
.cnz-badge--pending {
	background-color: rgba(199, 125, 44, 0.16);
	color: #985A1C;
}
.cnz-badge--ok {
	background-color: var(--wp--preset--color--base-alt, #F5F5F5);
	color: var(--wp--preset--color--accent, #008B45);
	border: 1px solid var(--wp--preset--color--accent, #008B45);
}
.cnz-badge--muted {
	background-color: var(--wp--preset--color--border, #E0E0E0);
	color: var(--wp--preset--color--secondary, #555);
}

/* ---- Phone (dialing code + number on one row) ----------------------- */
/* The plugin wraps a dialing-code control + national-number <input> in
   .cnz-reg-phone; the global control rule sets inputs/selects to width:100%, so
   we lay them side by side and let the number field take the remaining space. */
.cnz-reg-phone { display: flex; gap: 0.5rem; align-items: stretch; }
.cnz-reg-phone .cnz-reg-phone-num { flex: 1 1 auto; min-width: 0; }
.cnz-reg-phone .cnz-cc { position: relative; flex: 0 0 auto; }
/* No-JS fallback: the bare native <select> (kept narrow). */
.cnz-reg-phone .cnz-reg-phone-cc { width: auto; flex: 0 0 auto; max-width: 12rem; }

/* Enhanced compact dialing-code control (JS on): a button showing just the flag
   + code, and a listbox dropdown showing full country names. The native <select>
   is hidden but stays in the DOM as the submitted value. */
.cnz-cc-native { display: none; }
.cnz-cc-btn {
	display: inline-flex;
	align-items: center;
	gap: 0.35rem;
	height: 100%;
	padding: 0.65rem 0.7rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 2px;
	background: var(--wp--preset--color--base, #fff);
	color: var(--wp--preset--color--primary, #000);
	font: inherit;
	line-height: 1;
	white-space: nowrap;
	cursor: pointer;
}
.cnz-cc-btn::after {
	content: "";
	width: 0;
	height: 0;
	margin-left: 0.15rem;
	border-left: 0.3rem solid transparent;
	border-right: 0.3rem solid transparent;
	border-top: 0.35rem solid currentColor;
	opacity: 0.55;
}
.cnz-cc-btn:focus-visible {
	outline: 2px solid var(--wp--preset--color--accent, #008B45);
	outline-offset: 1px;
	border-color: var(--wp--preset--color--accent, #008B45);
}
.cnz-cc-list {
	position: absolute;
	z-index: 60;
	top: calc(100% + 3px);
	left: 0;
	margin: 0;
	padding: 0.25rem 0;
	list-style: none;
	min-width: 15rem;
	max-height: 16rem;
	overflow-y: auto;
	background: var(--wp--preset--color--base, #fff);
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 4px;
	box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
	display: none;
}
.cnz-cc-list.cnz-cc-open { display: block; }
.cnz-cc-opt {
	padding: 0.4rem 0.85rem;
	white-space: nowrap;
	cursor: pointer;
	font-size: 0.95rem;
}
.cnz-cc-opt.is-active { background: var(--wp--preset--color--base-alt, #F5F5F5); }
.cnz-cc-opt.is-selected { font-weight: 700; }
@media (max-width: 30rem) {
	.cnz-reg-phone { flex-wrap: wrap; }
	.cnz-reg-phone .cnz-reg-phone-cc { width: 100%; max-width: none; }
	.cnz-cc-list { min-width: min(15rem, 80vw); }
}

/* =========================================================================
   v1.4.2 — Group G interstitial + remove controls
   ========================================================================= */

/* "Back to my registrations" escape hatch on the post-submit interstitial —
   the SAME pattern as the checkout/order-pay one, duplicated here because the
   registration pages don't load that stylesheet. KEEP IN SYNC with
   .cnz-checkout-back in woocommerce-v1.0.1.css (and vice versa). */
.cnz-reg-form .cnz-checkout-back {
	margin: 0 0 1.5rem;
	font-size: 0.95rem;
}

.cnz-reg-form .cnz-checkout-back a {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	font-weight: 600;
	text-decoration: none;
	color: var(--wp--preset--color--accent, #008b45);
}

.cnz-reg-form .cnz-checkout-back a:hover,
.cnz-reg-form .cnz-checkout-back a:focus-visible {
	text-decoration: underline;
}

.cnz-reg-form .cnz-checkout-back__arrow {
	font-size: 1.1em;
	line-height: 1;
}

/* Interstitial batch list: the remove control stacks DIRECTLY beneath its
   athlete's name (space-between pushed it to the far edge of the content
   column, breaking the association — art-director review 2026-07-05). */
.cnz-reg-added-batch { margin: 1.25rem 0 0; }
.cnz-reg-added-batch h4 { margin: 0 0 0.25rem; }

.cnz-reg-added-list {
	list-style: none;
	margin: 0;
	padding: 0;
}

.cnz-reg-added-list li {
	display: block;
	padding: 0.6rem 0;
	border-bottom: 1px solid #ececec;
}

.cnz-reg-added-name {
	display: block;
	font-weight: 600;
}

.cnz-reg-added-total {
	margin: 0.6rem 0 0;
	text-align: right;
}

/* Destructive-tertiary remove control (interstitial rows + portal cards): the
   quietest thing on the card — a muted grey text link that turns red only on
   hover/focus. Deliberately NOT a member of the square button family, so it
   can never read as a third CTA next to the accent Pay / Complete-payment
   buttons (art-director review 2026-07-05: the earlier bordered pill both
   clashed with the 2px-radius buttons and invited accidental clicks). */
a.cnz-reg-remove-link {
	display: inline-block;
	padding: 0;
	border: 0;
	background: none;
	font-size: 0.9rem; /* matches .cnz-reg-pay-link so action pairs align (round 3) */
	font-weight: 500;
	line-height: 1.5;
	color: var(--wp--preset--color--tertiary, #666);
	text-decoration: underline;
	text-underline-offset: 2px;
	text-decoration-color: #c9c9c9;
}

a.cnz-reg-remove-link:hover,
a.cnz-reg-remove-link:focus-visible {
	color: #9b2c2c;
	text-decoration-color: currentColor;
}

.cnz-reg-added-list a.cnz-reg-remove-link { margin-top: 0.15rem; }

/* Portal card: the remove link sits right under Complete payment (Kit's call
   2026-07-05, overriding the bottom-of-card placement — there it was too hard
   to find). The text-link styling keeps it subordinate to the accent button. */
.cnz-reg-remove-row { margin: 0.6rem 0 0; }

/* Interstitial actions: stack Pay-now / Add-another full-width on phones. */
@media (max-width: 480px) {
	.cnz-reg-added-actions a.cnz-btn-accent,
	.cnz-reg-added-actions a.cnz-btn-plain {
		display: block;
		text-align: center;
	}

	.cnz-reg-added-actions a + a { margin-top: 0.6rem; }
}

/* ---- Phase E1: athlete photo avatar + eligible-category chips ------------ */
/* Redesigned 2026-07-07 as a two-column member card: photo LEFT, details RIGHT. */

/* Card head is the two-column region: photo (media) beside name + summary (body).
   The details / season-history / change-request disclosures render full-width
   below it, outside this flex row. */
.cnz-reg-card__head {
	display: flex;
	align-items: flex-start;
	gap: 1.25rem;
	margin-bottom: 0.75rem;
}
.cnz-reg-card__media {
	flex: 0 0 auto;
}
.cnz-reg-card__body {
	flex: 1 1 auto;
	min-width: 0; /* let the summary table shrink instead of overflowing */
}
.cnz-reg-card__name {
	margin: 0 0 0.6rem;
}

/* Photo control. The frame is a <label> for a hidden file input, so clicking
   it (photo or placeholder) opens the picker; onchange auto-submits. */
.cnz-reg-photo {
	margin: 0;
}
.cnz-reg-photo__form { margin: 0; }
.cnz-reg-photo__file {
	position: absolute;
	width: 1px; height: 1px;
	padding: 0; margin: -1px; border: 0;
	clip: rect(0 0 0 0); overflow: hidden;
}
/* Larger PORTRAIT frame (4:5) — reads as a sports-federation member photo,
   not a chat avatar. Holds the torso-up athlete figure the plugin emits. */
.cnz-reg-photo__button {
	position: relative;
	display: block;
	width: 170px;
	height: 212px; /* 4:5 portrait */
	border-radius: 8px;
	overflow: hidden;
	cursor: pointer;
	background: var(--wp--preset--color--base-alt, #F5F5F5);
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.cnz-reg-photo__button:hover,
.cnz-reg-photo__file:focus-visible + .cnz-reg-photo__button {
	border-color: var(--wp--preset--color--accent, #008B45);
	box-shadow: 0 0 0 3px rgba(0, 139, 69, 0.14);
}
.cnz-reg-photo__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
/* Default placeholder: a CNZ climbing-athlete illustration (gender-keyed),
   filling the frame. The images carry their own light background. */
.cnz-reg-photo__placeholder {
	display: block;
	width: 100%;
	height: 100%;
	background: #F3F4F3 no-repeat center top / cover;
}
.cnz-reg-photo__placeholder--female {
	background-image: url("../images/cnz-athlete-placeholder-female.jpg");
}
.cnz-reg-photo__placeholder--male {
	background-image: url("../images/cnz-athlete-placeholder-male.jpg");
}
.cnz-reg-photo__button--empty { background: #F3F4F3; }

/* Country flag corner badge — the athlete's represented nationality, on both the
   placeholder and an uploaded photo. A crisp hairline + drop shadow lifts it off
   any photo. The per-country background images (theme flags/<iso2>.svg, from the
   MIT-licensed flag-icons set) are only fetched by the browser for flags actually
   shown on the page. */
.cnz-reg-photo__flag {
	position: absolute;
	right: 6px;
	bottom: 6px;
	z-index: 3;
	width: 26px;
	height: 19.5px; /* 4:3 */
	border-radius: 3px;
	background: #fff no-repeat center / cover;
	box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.14), 0 1px 3px rgba(0, 0, 0, 0.32);
	pointer-events: none;
}
.cnz-reg-photo__flag--nz { background-image: url("../images/flags/nz.svg"); }
.cnz-reg-photo__flag--as { background-image: url("../images/flags/as.svg"); }
.cnz-reg-photo__flag--au { background-image: url("../images/flags/au.svg"); }
.cnz-reg-photo__flag--at { background-image: url("../images/flags/at.svg"); }
.cnz-reg-photo__flag--be { background-image: url("../images/flags/be.svg"); }
.cnz-reg-photo__flag--br { background-image: url("../images/flags/br.svg"); }
.cnz-reg-photo__flag--ca { background-image: url("../images/flags/ca.svg"); }
.cnz-reg-photo__flag--cn { background-image: url("../images/flags/cn.svg"); }
.cnz-reg-photo__flag--ck { background-image: url("../images/flags/ck.svg"); }
.cnz-reg-photo__flag--cz { background-image: url("../images/flags/cz.svg"); }
.cnz-reg-photo__flag--fj { background-image: url("../images/flags/fj.svg"); }
.cnz-reg-photo__flag--fr { background-image: url("../images/flags/fr.svg"); }
.cnz-reg-photo__flag--pf { background-image: url("../images/flags/pf.svg"); }
.cnz-reg-photo__flag--de { background-image: url("../images/flags/de.svg"); }
.cnz-reg-photo__flag--gb { background-image: url("../images/flags/gb.svg"); }
.cnz-reg-photo__flag--in { background-image: url("../images/flags/in.svg"); }
.cnz-reg-photo__flag--id { background-image: url("../images/flags/id.svg"); }
.cnz-reg-photo__flag--it { background-image: url("../images/flags/it.svg"); }
.cnz-reg-photo__flag--jp { background-image: url("../images/flags/jp.svg"); }
.cnz-reg-photo__flag--ki { background-image: url("../images/flags/ki.svg"); }
.cnz-reg-photo__flag--mh { background-image: url("../images/flags/mh.svg"); }
.cnz-reg-photo__flag--fm { background-image: url("../images/flags/fm.svg"); }
.cnz-reg-photo__flag--nr { background-image: url("../images/flags/nr.svg"); }
.cnz-reg-photo__flag--nl { background-image: url("../images/flags/nl.svg"); }
.cnz-reg-photo__flag--nc { background-image: url("../images/flags/nc.svg"); }
.cnz-reg-photo__flag--nu { background-image: url("../images/flags/nu.svg"); }
.cnz-reg-photo__flag--no { background-image: url("../images/flags/no.svg"); }
.cnz-reg-photo__flag--pw { background-image: url("../images/flags/pw.svg"); }
.cnz-reg-photo__flag--pg { background-image: url("../images/flags/pg.svg"); }
.cnz-reg-photo__flag--pl { background-image: url("../images/flags/pl.svg"); }
.cnz-reg-photo__flag--ws { background-image: url("../images/flags/ws.svg"); }
.cnz-reg-photo__flag--sg { background-image: url("../images/flags/sg.svg"); }
.cnz-reg-photo__flag--si { background-image: url("../images/flags/si.svg"); }
.cnz-reg-photo__flag--sb { background-image: url("../images/flags/sb.svg"); }
.cnz-reg-photo__flag--za { background-image: url("../images/flags/za.svg"); }
.cnz-reg-photo__flag--kr { background-image: url("../images/flags/kr.svg"); }
.cnz-reg-photo__flag--es { background-image: url("../images/flags/es.svg"); }
.cnz-reg-photo__flag--se { background-image: url("../images/flags/se.svg"); }
.cnz-reg-photo__flag--ch { background-image: url("../images/flags/ch.svg"); }
.cnz-reg-photo__flag--tk { background-image: url("../images/flags/tk.svg"); }
.cnz-reg-photo__flag--to { background-image: url("../images/flags/to.svg"); }
.cnz-reg-photo__flag--tv { background-image: url("../images/flags/tv.svg"); }
.cnz-reg-photo__flag--us { background-image: url("../images/flags/us.svg"); }
.cnz-reg-photo__flag--vu { background-image: url("../images/flags/vu.svg"); }


/* Hover/focus overlay: a subtle scrim with a camera glyph + short label,
   replacing the old dark "ADD PHOTO" ribbon. Fades in on hover/focus. */
.cnz-reg-photo__overlay {
	position: absolute;
	inset: 0;
	z-index: 2; /* above the figure + fern watermark */
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 0.25rem;
	color: #fff;
	background: rgba(0, 0, 0, 0.42);
	opacity: 0;
	transition: opacity 0.15s ease;
}
.cnz-reg-photo__cam {
	width: 28px;
	height: 28px;
	display: block;
}
.cnz-reg-photo__overlay-text {
	font-size: 0.66rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.05em;
}
.cnz-reg-photo__button:hover .cnz-reg-photo__overlay,
.cnz-reg-photo__file:focus-visible + .cnz-reg-photo__button .cnz-reg-photo__overlay {
	opacity: 1;
}
/* No photo yet: keep a gentle always-on cue (lighter scrim so the themed
   placeholder still shows through), stronger on hover per the rule above. */
.cnz-reg-photo__button--empty .cnz-reg-photo__overlay {
	opacity: 1;
	background: linear-gradient(to top, rgba(0, 0, 0, 0.34), rgba(0, 0, 0, 0.06) 55%, transparent);
	justify-content: flex-end;
	padding-bottom: 0.55rem;
}

/* Requirements + consent are tucked behind a small ⓘ info button (avoids the
   long help text repeating under every athlete's photo). The tip shows on hover
   AND focus-within, so it also works on touch (tapping the button focuses it). */
.cnz-reg-photo__help {
	position: relative;
	display: inline-block;
	margin: 0.5rem 0 0;
}
.cnz-reg-photo__info {
	width: 20px;
	height: 20px;
	padding: 0;
	border-radius: 50%;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	background: var(--wp--preset--color--base, #fff);
	color: var(--wp--preset--color--tertiary, #666);
	font: italic 700 0.78rem/1 Georgia, "Times New Roman", serif;
	cursor: pointer;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: border-color 0.15s ease, color 0.15s ease;
}
.cnz-reg-photo__info:hover,
.cnz-reg-photo__info:focus-visible {
	border-color: var(--wp--preset--color--accent, #008B45);
	color: var(--wp--preset--color--accent, #008B45);
}
.cnz-reg-photo__tip {
	display: none;
	position: absolute;
	left: 0;
	top: calc(100% + 6px);
	z-index: 5;
	width: 210px;
	padding: 0.6rem 0.7rem;
	border-radius: 6px;
	background: #1c1c1c;
	color: #fff;
	font-size: 0.72rem;
	line-height: 1.4;
	box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.cnz-reg-photo__tip-line { display: block; }
.cnz-reg-photo__tip-line + .cnz-reg-photo__tip-line { margin-top: 0.35rem; }
.cnz-reg-photo__help:hover .cnz-reg-photo__tip,
.cnz-reg-photo__help:focus-within .cnz-reg-photo__tip { display: block; }
.cnz-reg-photo__save { margin-top: 0.4rem; }
/* Bug fix: the shared `button.cnz-btn-plain { display:inline-block }` rule
   overrode the [hidden] attribute (UA `display:none` loses on specificity),
   so the no-JS "Save photo" fallback showed even with JS on. Re-hide it. */
.cnz-reg-photo__save[hidden] { display: none; }
.cnz-reg-photo__remove { margin: 0.5rem 0 0; }

/* Eligible-category chips in the athlete-card summary (near season/status/club).
   .cnz-badge--muted colours come from the change-request block above. */
.cnz-reg-categories { line-height: 1.9; }
.cnz-reg-category {
	display: inline-block;
	margin: 0 0.25rem 0.2rem 0;
	font-size: 0.72rem;
	font-weight: 600;
	text-transform: none;
}

/* Stack the card on narrow screens: photo above the details. */
@media (max-width: 600px) {
	.cnz-reg-card__head {
		flex-direction: column;
		align-items: center;
		text-align: center;
		gap: 1rem;
	}
	.cnz-reg-card__body { width: 100%; }
	.cnz-reg-photo__button { width: 150px; height: 188px; } /* keep 4:5 portrait */
	.cnz-reg-photo__consent { max-width: none; }
	/* Left-align the summary table again once it spans the full width. */
	.cnz-reg-card__body .cnz-reg-summary { text-align: left; }
}

/* =========================================================================
   v1.5.0 — Phase E2-B: event entries on the portal
   Markup from cnz-registrations includes/event-portal.php. The section
   reuses .cnz-event-card / .cnz-callout / .cnz-badge / .cnz-btn-accent;
   everything below is the entry-specific layout.
   ====================================================================== */

.cnz-reg-events { margin-top: 2.5rem; }
.cnz-reg-events__heading { margin-bottom: 1rem; }

.cnz-reg-event__title { margin: 0 0 0.25rem; }
.cnz-reg-event__meta {
	display: flex;
	flex-wrap: wrap;
	gap: 0.35rem 1.1rem;
	margin: 0 0 1rem;
	font-size: 0.85rem;
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-event__close { font-weight: 600; }
.cnz-reg-event__link { white-space: nowrap; }

/* One athlete's block inside an event form. */
.cnz-reg-entry-athlete {
	margin: 0 0 1.25rem;
	padding: 1rem 1.15rem 1.05rem;
	border: 1px solid var(--wp--preset--color--contrast-3, #ddd);
	border-radius: 8px;
}
fieldset.cnz-reg-entry-athlete { min-inline-size: 0; }
/* The block header (athlete name + category chips). On a fieldset the legend
   would otherwise sit ON the border — float it back into normal flow. */
.cnz-reg-entry-athlete__name {
	float: left;
	width: 100%;
	font-weight: 700;
	font-size: 1.02rem;
	padding: 0 0 0.55rem;
	margin: 0 0 0.75rem;
	border-bottom: 1px solid var(--wp--preset--color--contrast-3, #eee);
}
.cnz-reg-entry-athlete__name + * { clear: both; }
p.cnz-reg-entry-athlete__name { float: none; }
.cnz-reg-entry-athlete__cats {
	display: inline-flex;
	flex-wrap: wrap;
	gap: 0.3rem;
	margin-left: 0.4rem;
	vertical-align: middle;
}
.cnz-reg-entry-athlete--ineligible {
	background: var(--wp--preset--color--base-2, #f6f6f6);
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-entry-athlete--ineligible .cnz-reg-note { margin: 0; }

/* Already-entered chips + the block pricing line. */
.cnz-reg-entry-athlete__entered {
	margin: 0.2rem 0 0.7rem;
	font-size: 0.8rem;
	line-height: 2;
}
.cnz-reg-entry-athlete__entered .cnz-badge {
	margin-right: 0.3rem;
	text-transform: none;
	font-weight: 600;
}
.cnz-reg-entry-athlete__pricing {
	margin: 0.35rem 0 0.65rem;
	font-size: 0.82rem;
	color: var(--wp--preset--color--contrast-2, #555);
}

/* A combo row: checkbox + label left, price right. */
.cnz-reg-combo {
	display: flex;
	align-items: baseline;
	gap: 0.55rem;
	padding: 0.3rem 0.2rem;
	border-radius: 4px;
	cursor: pointer;
}
.cnz-reg-combo:hover { background: var(--wp--preset--color--base-2, #f6f6f6); }
.cnz-reg-combo__input { flex: none; }
.cnz-reg-combo__label { flex: 1 1 auto; }
.cnz-reg-combo__price {
	flex: none;
	font-size: 0.82rem;
	font-variant-numeric: tabular-nums;
	color: var(--wp--preset--color--contrast-2, #555);
	white-space: nowrap;
}
/* Locked out by an exclusive selection (Para). */
.cnz-reg-combo.is-locked {
	opacity: 0.45;
	cursor: not-allowed;
}

.cnz-reg-entry-sex-field { max-width: 320px; margin-top: 0.75rem; }

/* Form footer: message + submit (the live total rides on the button, so
   there's no doubt what the button pays for). */
.cnz-reg-entryform__msg { margin: 0.5rem 0 0; }
.cnz-reg-entryform__actions {
	margin: 1.1rem 0 0.25rem;
	padding-top: 0.9rem;
	border-top: 1px solid var(--wp--preset--color--contrast-3, #ddd);
}
.cnz-reg-entry-total__amount {
	margin-left: 0.45rem;
	font-variant-numeric: tabular-nums;
}

/* Per-athlete-card "Event entries" list. */
.cnz-reg-entries {
	margin-top: 1.5rem;
	padding-top: 1rem;
	border-top: 1px solid var(--wp--preset--color--contrast-3, #eee);
}
.cnz-reg-entries__heading { margin: 0 0 0.6rem; }
.cnz-reg-entries-table td .cnz-reg-pay-link,
.cnz-reg-entries-table td .cnz-reg-remove-link {
	display: inline-block;
	margin: 0 0.9rem 0 0;
}
.cnz-reg-entries-table td .cnz-badge { margin-right: 0.75rem; }
.cnz-reg-entries-table .cnz-badge { text-transform: none; font-weight: 600; }
/* The ONE shared inline pay/change affordance (quiet link — the accent Pay
   button lives only in the outstanding-payments panel). */
.cnz-reg-pay-link {
	display: inline-block;
	margin-left: 0.5rem;
	font-size: 0.9rem;
	font-weight: 600;
	line-height: 1.5;
	color: var(--wp--preset--color--accent, #008B45);
	white-space: nowrap;
}
.cnz-reg-note .cnz-reg-pay-link,
.cnz-reg-entry-athlete__pay .cnz-reg-pay-link { margin-left: 0; }

@media (max-width: 600px) {
	.cnz-reg-event__meta { flex-direction: column; gap: 0.15rem; }
	.cnz-reg-combo { flex-wrap: wrap; }
	.cnz-reg-combo__price { flex-basis: 100%; padding-left: 1.6rem; }
}

/* =========================================================================
   E2-B inspection round (designer pass 2026-07-10): outstanding-payments
   panel, "sheet" event card, member-card event nudges, locked entries,
   club-pending pricing note.
   ====================================================================== */

/* Outstanding payments — the one home for accent Pay CTAs. */
.cnz-reg-outstanding {
	margin: 1.25rem 0 2rem;
	padding: 1.1rem 1.4rem;
	border-left: 4px solid var(--wp--preset--color--accent, #008B45);
}
.cnz-reg-outstanding__heading { margin: 0 0 0.8rem; font-size: 1.05rem; }
.cnz-reg-outstanding__item + .cnz-reg-outstanding__item {
	padding-top: 0.6rem;
	border-top: 1px solid var(--wp--preset--color--contrast-3, #e3e3e3);
}
.cnz-reg-outstanding__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: 0.6rem;
}
.cnz-reg-outstanding__item {
	display: flex;
	align-items: center;
	gap: 0.75rem;
	flex-wrap: wrap;
}
.cnz-reg-outstanding__label { flex: 1 1 auto; }
.cnz-reg-outstanding__amount {
	font-variant-numeric: tabular-nums;
	font-weight: 700;
	white-space: nowrap;
}

/* Event card as a page-level "sheet", not a member-card peer. */
.cnz-reg-event--sheet {
	border-top: 3px solid var(--wp--preset--color--accent, #008B45);
	padding: 1.5rem;
}
.cnz-reg-event__eyebrow {
	margin: 0 0 0.15rem;
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-event__lead {
	margin: 0 0 1rem;
	font-size: 0.85rem;
	color: var(--wp--preset--color--contrast-2, #555);
}

/* "Enter <event> →" nudge on the member card. */
.cnz-reg-card__event-cta {
	margin: 0.5rem 0 0;
	font-size: 0.85rem;
	font-weight: 600;
}

/* Locked (paid) entry block: chips + request-a-change only, no inputs. */
.cnz-reg-entry-athlete--entered {
	background: var(--wp--preset--color--base-2, #f6f6f6);
}
.cnz-reg-entry-athlete--entered .cnz-reg-note { margin: 0.4rem 0 0; }
.cnz-reg-entry-athlete__pay { margin: 0.35rem 0 0.2rem; }

/* Non-member rate only because the club hasn't verified yet — warn, softly. */
@media (max-width: 600px) {
	.cnz-reg-outstanding__item .cnz-btn-accent {
		flex-basis: 100%;
		text-align: center;
	}
}

/* Layout polish round 2 (2026-07-10): page rhythm + spacing fixes. */
.cnz-reg-section-heading,
.cnz-reg-events__heading {
	margin: 2.25rem 0 1rem;
	padding-top: 1.25rem;
	border-top: 1px solid var(--wp--preset--color--contrast-3, #eee);
}
.cnz-reg-myreg > .cnz-reg-section-heading:first-of-type { border-top: 0; padding-top: 0; }
.cnz-reg-entry-athlete__pricing { margin: 0.5rem 0 0.7rem; }
.cnz-reg-entry-athlete__pay { margin: 0.1rem 0 0.6rem; }

/* =========================================================================
   Round 3 (2026-07-10): consistency system.
   - Type scale: page-section headings 1.1rem/700; card sub-section headings
     0.95rem/700; body 1rem; meta 0.85rem contrast-2; fine print 0.78rem.
   - Accent left border: ONLY .cnz-reg-outstanding + .cnz-reg-event--sheet.
   - Action pairs: one .cnz-reg-action-row per card — primary quiet link +
     destructive link on one baseline; buttons only in the panel / form foot.
   ====================================================================== */

/* Type scale. */
.cnz-reg-section-heading,
.cnz-reg-events__heading,
.cnz-reg-outstanding__heading { font-size: 1.1rem; font-weight: 700; }
.cnz-reg-entries__heading,
.cnz-reg-changes__heading,
.cnz-reg-history h4 { font-size: 0.95rem; font-weight: 700; }
.cnz-reg-entry-athlete__name { font-size: 1rem; }
.cnz-reg-event__meta,
.cnz-reg-event__lead,
.cnz-reg-entry-athlete__pricing,
.cnz-reg-entry-athlete__entered,
.cnz-reg-combo__price,
.cnz-reg-card__event-cta { font-size: 0.85rem; }
.cnz-reg-event__eyebrow,
.cnz-reg-hint { font-size: 0.78rem; }
.cnz-reg-category { font-size: 0.75rem; }

/* One action row per card: primary quiet link + destructive, one baseline. */
.cnz-reg-action-row {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 0.4rem 1.5rem;
	margin: 0.9rem 0 0;
	padding-top: 0.75rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-action-row .cnz-reg-pay-link,
.cnz-reg-action-row .cnz-reg-remove-link { margin: 0; }

/* Disabled submit (nothing ticked yet). */
.cnz-reg-entryform button[type="submit"][disabled] {
	opacity: 0.45;
	cursor: not-allowed;
}

/* Change-request form: the select spans the grid like the text field. */
.cnz-reg-changeform select { width: 100%; }

/* =========================================================================
   Round 4 (2026-07-10, full HIG review): one card system, progressive
   disclosure. Accent green appears only as: the Pay/submit buttons, action
   links, and the event-sheet top rule.
   ====================================================================== */

/* The change-request form's --full fields actually span the grid (root cause
   of the mismatched field widths — no span rule existed on this page). */
.cnz-reg-myreg .cnz-reg-field--full { grid-column: 1 / -1; }

/* One card family: athlete cards and event sheets share chrome. */
.cnz-reg-myreg .cnz-reg-card,
.cnz-reg-event--sheet {
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
	padding: 1.5rem;
}
.cnz-reg-event--sheet { border-top: 3px solid var(--wp--preset--color--accent, #008B45); }
.cnz-reg-myreg .cnz-reg-card { margin-bottom: 2.5rem; }
.cnz-reg-card__name,
.cnz-reg-event__title { font-size: 1.15rem; font-weight: 700; }

/* Event-sheet header: stacked hierarchy, details link promoted right. */
.cnz-reg-event__head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	margin-bottom: 0.9rem;
}
.cnz-reg-event__head-main { min-width: 0; }
.cnz-reg-event__dates {
	margin: 0.2rem 0 0.45rem;
	font-size: 1rem;
	font-weight: 600;
}
.cnz-reg-event__close {
	display: inline-block;
	margin: 0 0 0.6rem;
	padding: 0.25em 0.7em;
	border-radius: 999px;
	background: rgba(199, 125, 44, 0.1);
	color: #985a1c;
	font-size: 0.78rem;
	font-weight: 600;
}
.cnz-reg-event__offer {
	margin: 0;
	font-size: 0.85rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2, #555);
}
/* Label + value in two real columns, so a value that wraps (a long category
   list, or the entry-limit row added in plugin v0.19.0) stays aligned under
   itself instead of running back under the label. */
.cnz-reg-event__offer-group {
	display: grid;
	grid-template-columns: 4.9rem 1fr;
	gap: 0 0.4rem;
	margin: 0 0 0.15rem;
}
.cnz-reg-event__offer-group strong {
	min-width: 0;
	margin-right: 0;
	color: inherit;
}
.cnz-reg-event__link {
	flex: none;
	padding: 0.4rem 0;
	font-size: 0.9rem;
	font-weight: 600;
	white-space: nowrap;
}

/* Data tables (entries, competition history): one table, not floating rows. */
.cnz-reg-entries-table {
	border-collapse: collapse;
	width: 100%;
	font-size: 0.95rem;
}
.cnz-reg-entries-table thead th {
	padding: 0 0.8rem 0.4rem 0;
	border-bottom: 2px solid var(--wp--preset--color--border, #E0E0E0);
	font-size: 0.72rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--wp--preset--color--tertiary, #666);
}
.cnz-reg-entries-table tbody td {
	padding: 0.8rem 0.8rem 0.8rem 0;
	border-bottom: 1px solid var(--wp--preset--color--border, #ECECEC);
	background: transparent;
}
.cnz-reg-entries-table tbody tr:last-child td { border-bottom: 0; }

/* Card footer: the folded zone (details / history / change requests). */
.cnz-reg-card__more {
	margin-top: 1.25rem;
	padding-top: 0.5rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-card__more > details > summary,
.cnz-reg-comp-history > summary { font-size: 0.95rem; font-weight: 700; }
.cnz-reg-comp-history .cnz-reg-history { border: 0; }

/* Footer utility bar: account + help as deliberate page chrome. */
.cnz-reg-footer {
	margin-top: 2.5rem;
	padding: 1.25rem 1.5rem;
	background: var(--wp--preset--color--base-2, #f6f6f6);
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 10px;
}
.cnz-reg-footer__heading { margin: 0 0 0.75rem; font-size: 0.95rem; font-weight: 700; }
.cnz-reg-footer .cnz-reg-account-edit { margin-top: 0; padding-top: 0; border-top: 0; }
.cnz-reg-footer .cnz-reg-help { margin: 0.75rem 0 0; }

@media (max-width: 600px) {
	.cnz-reg-event__head { flex-direction: column; gap: 0.25rem; }
	.cnz-reg-event__link { padding: 0.2rem 0 0.5rem; }
}

/* Round 4b: density/alignment fixes from Kit's screenshots. */

/* Card-front summary: tighter rows, fixed label column, single-line badge. */
.cnz-reg-card__body .cnz-reg-summary th { width: 9rem; }
.cnz-reg-card__body .cnz-reg-summary th,
.cnz-reg-card__body .cnz-reg-summary td { padding-top: 0.3rem; padding-bottom: 0.3rem; }
.cnz-reg-card__body .cnz-reg-summary .cnz-badge { font-size: 0.72rem; white-space: nowrap; }

/* Entries table: top-aligned cells; status = badge line + one quiet link row. */
.cnz-reg-entries-table tbody td { vertical-align: top; }
.cnz-reg-entries-table td .cnz-badge {
	display: inline-block;
	margin: 0 0.75rem 0.3rem 0;
}
@media (max-width: 480px) {
	/* Long status labels may wrap again on narrow phones. */
	.cnz-reg-card__body .cnz-reg-summary .cnz-badge { white-space: normal; }
}

/* Round 4c: sheet breathing room to match the card's rhythm; even table
   columns; no-JS anchor fallback keeps the form clear of the viewport top. */
.cnz-reg-event--sheet .cnz-reg-event__title { margin-bottom: 0.35rem; }
.cnz-reg-event__dates { margin-bottom: 0.65rem; }
.cnz-reg-event__close { margin-bottom: 0.85rem; }
.cnz-reg-event__offer-group { margin-bottom: 0.3rem; }
.cnz-reg-event--sheet .cnz-reg-event__lead { margin: 0.4rem 0 1.35rem; }
.cnz-reg-event--sheet .cnz-reg-entry-athlete {
	padding: 1.15rem 1.25rem;
	margin-bottom: 1.4rem;
}

.cnz-reg-entries-table thead th:nth-child(1) { width: 34%; }
.cnz-reg-entries-table thead th:nth-child(2) { width: 36%; }
.cnz-reg-entries-table thead th:nth-child(3) { width: 30%; }
.cnz-reg-entries-table td .cnz-badge { white-space: nowrap; }

.cnz-reg-change-request { scroll-margin-top: 5rem; }

/* =========================================================================
   v1.6.0 — Portal redesign (plugin v0.17.0): hub + focused views.
   The portal page is now a HUB (attention band, compact athlete cards,
   events strip) plus per-athlete and per-event views (?cnz_view=…). The
   chevron stack on athlete cards is gone — those sections render plainly
   on the athlete view. Markup: plugin my-registration.php / event-portal.php.
   ====================================================================== */

/* ---- Hub athlete cards (row-navigation pattern) ---------------------- */
.cnz-reg-hub-cards {
	display: flex;
	flex-direction: column;
	gap: 1rem;
	margin: 0 0 2rem;
}
.cnz-reg-myreg .cnz-reg-hubcard {
	position: relative;
	display: flex;
	align-items: center;
	gap: 1.1rem;
	margin: 0;
	padding: 1rem 1.25rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.cnz-reg-myreg .cnz-reg-hubcard:hover,
.cnz-reg-myreg .cnz-reg-hubcard:focus-within {
	border-color: var(--wp--preset--color--accent, #008B45);
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.cnz-reg-hubcard__avatar {
	position: relative;
	flex: 0 0 auto;
	width: 64px;
	height: 80px; /* same 4:5 portrait as the profile photo */
	border-radius: 6px;
	overflow: hidden;
	background: #F3F4F3;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-hubcard__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}
.cnz-reg-hubcard__avatar .cnz-reg-photo__placeholder { display: block; width: 100%; height: 100%; }
.cnz-reg-hubcard__avatar .cnz-reg-photo__flag {
	right: 3px;
	bottom: 3px;
	width: 18px;
	height: 13.5px;
}
.cnz-reg-hubcard__body { flex: 1 1 auto; min-width: 0; }
.cnz-reg-hubcard__name { margin: 0 0 0.3rem; font-size: 1.05rem; font-weight: 700; }
.cnz-reg-hubcard__name a { text-decoration: none; color: inherit; }
/* Stretched link: the whole card is the tap target (no JS). */
.cnz-reg-hubcard__link::after { content: ""; position: absolute; inset: 0; }
/* Anything else clickable inside must sit above the stretched link. */
.cnz-reg-hubcard__register { position: relative; z-index: 1; margin: 0.35rem 0 0; }
.cnz-reg-hubcard__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.35rem 0.7rem;
	margin: 0;
	font-size: 0.85rem;
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-hubcard__meta .cnz-badge { font-size: 0.72rem; white-space: nowrap; }
.cnz-reg-hubcard__number {
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	color: var(--wp--preset--color--primary, #000);
}
.cnz-reg-hubcard__chips { margin: 0.45rem 0 0; line-height: 1.9; font-size: 0.8rem; }
.cnz-reg-hubcard__chips .cnz-badge {
	text-transform: none;
	font-weight: 600;
	margin-right: 0.3rem;
	font-size: 0.72rem;
	white-space: nowrap;
}
.cnz-reg-hubcard__go {
	flex: 0 0 auto;
	font-size: 1.6rem;
	line-height: 1;
	color: var(--wp--preset--color--tertiary, #666);
}
@media (max-width: 480px) {
	.cnz-reg-myreg .cnz-reg-hubcard { padding: 0.85rem 1rem; gap: 0.85rem; }
	.cnz-reg-hubcard__avatar { width: 52px; height: 65px; }
	.cnz-reg-hubcard__chips .cnz-badge { white-space: normal; }
}

/* ---- Attention band: entries-open rows ------------------------------- */
/* Quiet bordered CTA beside the accent Pay buttons — same row layout. */
.cnz-reg-outstanding__enter { white-space: nowrap; }
@media (max-width: 600px) {
	.cnz-reg-outstanding__item .cnz-reg-outstanding__enter {
		flex-basis: 100%;
		text-align: center;
	}
}

/* ---- Hub events strip (compact cards, no forms) ---------------------- */
.cnz-reg-myreg .cnz-reg-eventcard {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 1rem;
	margin: 0 0 1rem;
	padding: 1.15rem 1.25rem;
	border: 1px solid var(--wp--preset--color--border, #E0E0E0);
	border-top: 3px solid var(--wp--preset--color--accent, #008B45);
	border-radius: 10px;
	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
/* Nobody on the account is entered or can enter (e.g. a kids-only event on an
   adult's hub, plugin v0.19.0): the card stays — vanishing read as "no such
   event" — but drops the accent rule and sits back visually. */
.cnz-reg-myreg .cnz-reg-eventcard--muted {
	border-top-color: var(--wp--preset--color--border, #E0E0E0);
	background: var(--wp--preset--color--base-2, #F7F7F7);
	box-shadow: none;
}
.cnz-reg-myreg .cnz-reg-eventcard--muted .cnz-reg-eventcard__title,
.cnz-reg-myreg .cnz-reg-eventcard--muted .cnz-reg-eventcard__dates {
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-eventcard__main { min-width: 0; }
.cnz-reg-eventcard__title { margin: 0 0 0.2rem; font-size: 1.05rem; font-weight: 700; }
.cnz-reg-eventcard__dates { margin: 0 0 0.5rem; font-size: 0.9rem; font-weight: 600; }
.cnz-reg-eventcard__states { margin: 0.55rem 0 0; line-height: 1.9; }
.cnz-reg-eventcard__states .cnz-badge {
	text-transform: none;
	font-weight: 600;
	margin-right: 0.3rem;
	font-size: 0.72rem;
}
.cnz-reg-eventcard__action { margin: 0; flex: none; }
@media (max-width: 600px) {
	.cnz-reg-myreg .cnz-reg-eventcard { flex-direction: column; }
	.cnz-reg-eventcard__action { width: 100%; }
	.cnz-reg-eventcard__action .cnz-btn-plain { display: block; text-align: center; }
}

/* ---- Back link (athlete + event views) ------------------------------- */
/* Same escape-hatch pattern as the interstitial/checkout. KEEP IN SYNC with
   .cnz-checkout-back in woocommerce-v1.0.1.css. */
.cnz-reg-myreg .cnz-checkout-back { margin: 0 0 1.5rem; font-size: 0.95rem; }
.cnz-reg-myreg .cnz-checkout-back a {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	font-weight: 600;
	text-decoration: none;
	color: var(--wp--preset--color--accent, #008b45);
}
.cnz-reg-myreg .cnz-checkout-back a:hover,
.cnz-reg-myreg .cnz-checkout-back a:focus-visible { text-decoration: underline; }
.cnz-reg-myreg .cnz-checkout-back__arrow { font-size: 1.1em; line-height: 1; }

/* ---- Athlete view (profile) ------------------------------------------ */
.cnz-reg-profile { margin: 0 0 2.5rem; }
.cnz-reg-profile__head {
	display: flex;
	align-items: flex-start;
	gap: 1.5rem;
}
.cnz-reg-profile__media { flex: 0 0 auto; }
.cnz-reg-profile__body { flex: 1 1 auto; min-width: 0; }
.cnz-reg-profile__name { margin: 0 0 0.6rem; font-size: 1.3rem; font-weight: 700; }
@media (max-width: 600px) {
	.cnz-reg-profile__head {
		flex-direction: column;
		align-items: center;
		text-align: center;
		gap: 1rem;
	}
	.cnz-reg-profile__body { width: 100%; }
	.cnz-reg-profile__body .cnz-reg-summary { text-align: left; }
}

/* Visible sections replace the chevron stack: one divider rhythm. */
.cnz-reg-block,
.cnz-reg-profile .cnz-reg-entries,
.cnz-reg-profile .cnz-reg-changes {
	margin-top: 1.75rem;
	padding-top: 1.4rem;
	border-top: 1px solid var(--wp--preset--color--border, #ECECEC);
}
.cnz-reg-block__heading,
.cnz-reg-profile .cnz-reg-entries__heading,
.cnz-reg-profile .cnz-reg-changes__heading {
	margin: 0 0 0.75rem;
	font-size: 1rem;
	font-weight: 700;
}
/* Sub-content inside sections keeps the smaller scale: the season-history
   heading was designed as an uppercase label inside a fold — now exposed on
   the athlete view, it must read as a quiet sub-label, not outweigh the
   "Competition history" section heading above it. */
.cnz-reg-profile .cnz-reg-history h4 {
	font-size: 0.78rem;
	font-weight: 700;
	color: var(--wp--preset--color--tertiary, #666);
}

/* ---- Surviving disclosures breathe when open ------------------------- */
/* (Account edit + Past requests + request-a-change form.) An opened fold no
   longer runs straight into the next control. */
.cnz-reg-myreg .cnz-reg-disclosure[open] { margin-bottom: 1.25rem; }
.cnz-reg-myreg .cnz-reg-changes__history[open] { margin-bottom: 1.25rem; }

/* ---- Change-request form: explicit actions --------------------------- */
.cnz-reg-changeform__actions {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 0.5rem 1.5rem;
}
a.cnz-reg-change-cancel {
	font-size: 0.9rem;
	font-weight: 600;
	color: var(--wp--preset--color--tertiary, #666);
	text-decoration: underline;
	text-underline-offset: 2px;
	text-decoration-color: #c9c9c9;
}
a.cnz-reg-change-cancel:hover,
a.cnz-reg-change-cancel:focus-visible {
	color: var(--wp--preset--color--primary, #000);
	text-decoration-color: currentColor;
}

/* ---- Event view ------------------------------------------------------- */
.cnz-reg-events--view { margin-top: 0.5rem; }
.cnz-reg-events--view .cnz-reg-event--sheet { margin-bottom: 0; }

/* ---- v1.6.0 round 2 (Kit's test feedback, 2026-07-24) ---------------- */

/* Hub anchor row: quiet section links under the signed-in line. */
.cnz-reg-toc {
	display: flex;
	flex-wrap: wrap;
	gap: 0.35rem 1.5rem;
	margin: 0 0 1.5rem;
	padding-bottom: 0.85rem;
	border-bottom: 1px solid var(--wp--preset--color--border, #ECECEC);
	font-size: 0.85rem;
}
.cnz-reg-toc a {
	font-weight: 600;
	text-decoration: none;
	color: var(--wp--preset--color--secondary, #555);
}
.cnz-reg-toc a:hover,
.cnz-reg-toc a:focus-visible {
	color: var(--wp--preset--color--accent, #008B45);
	text-decoration: underline;
}

/* Event card "For:" line — names as quiet text, not grey boxes. */
.cnz-reg-eventcard__for {
	margin: 0.55rem 0 0;
	font-size: 0.85rem;
	line-height: 1.6;
	color: var(--wp--preset--color--contrast-2, #555);
}
.cnz-reg-eventcard__for-label {
	margin-right: 0.25rem;
	font-weight: 700;
	font-size: 0.72rem;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--wp--preset--color--tertiary, #666);
}
.cnz-reg-eventcard__tick { color: var(--wp--preset--color--accent, #008B45); font-weight: 700; }
.cnz-reg-eventcard__seg--pending { color: #985A1C; }
.cnz-reg-eventcard__sep { color: var(--wp--preset--color--border, #C9C9C9); }

/* Event card action column: enter button + details link stacked. */
.cnz-reg-eventcard__action { display: flex; flex-direction: column; align-items: flex-end; gap: 0.4rem; }
.cnz-reg-eventcard__enter,
.cnz-reg-eventcard__details { margin: 0; }
@media (max-width: 600px) {
	.cnz-reg-eventcard__action { align-items: stretch; }
	.cnz-reg-eventcard__details { text-align: center; }
}

/* External-link glyph on "Event details" (opens the public event page). */
.cnz-reg-ext {
	margin-left: 0.25em;
	font-size: 0.85em;
	opacity: 0.75;
}

/* Competition history: the beyond-5-events fold. */
.cnz-reg-comp-history__more { margin-top: 0.75rem; }
.cnz-reg-comp-history__more > summary { font-size: 0.9rem; font-weight: 600; }

/* ---- v1.6.0 round 3 (Kit's test feedback, 2026-07-24) ---------------- */

/* The site header is FIXED (custom-vX.css .cnz-header-wrap), so anchor jumps
   need an offset or the section heading lands hidden underneath it — same
   treatment the change-request anchor already had (5rem). Covers the hub
   anchor row targets and the event-view athlete anchors. */
#cnz-athletes,
#cnz-events,
#cnz-help,
#cnz-account,
#cnz-outstanding,
.cnz-reg-entry-athlete { scroll-margin-top: 8rem; }

/* Signed-in line lives in the Account & help footer now (it read as stray
   content at the top of the page). */
.cnz-reg-footer__signedin { margin: 0 0 0.85rem; }

/* Event card: details link sits with the event facts in the body, not under
   the Enter button (there it read as a second action). */
.cnz-reg-eventcard__details { margin: 0.45rem 0 0; }
.cnz-reg-eventcard__details .cnz-reg-event__link { font-size: 0.85rem; }

/* =========================================================================
   v1.6.2 (2026-07-25) — portal art-direction pass.

   Two problems Kit reported:

   1. In the attention band the Pay and Enter buttons looked different AND sat
      in different places. The placement was a wrap accident: the row was a
      wrapping flex with a flex:1 label, so a long label (several athlete
      names) pushed the button onto its own left-aligned second line while a
      short label kept it on the right. The row is now a GRID — label | amount
      | action — so the action column is a rail every CTA lands on, and a long
      label wraps inside its own cell. The two buttons keep their two weights
      (filled = money, ghost = opportunity) but share one silhouette via
      .cnz-reg-cta: same padding, border width, radius and type size, so they
      read as one family. They are sized to their own labels and aligned by
      their RIGHT edge — a forced equal min-width made "Pay now" look inflated
      (Kit) without buying anything the shared right edge doesn't already give.

   2. The hub event card was overloaded — seven blocks at four sizes and four
      colours — and the athlete list used a type idiom (uppercase "FOR:" +
      a three-colour run-on sentence) found nowhere else on the card, sitting
      right under the label/value entry-limit row. Now the whole card body is
      ONE label/value grid: event facts, a rule, then a row per athlete state.
      The label column auto-sizes (max-content) so both zones align by
      construction — no hardcoded width to keep in sync (that's what the
      4.9rem in v1.6.1 was patching). The CTA moved into a foot action row
      beside "Event details", matching .cnz-reg-action-row on every other card.

   Retired by the plugin (v0.19.1) and now dead here: .cnz-reg-eventcard__for,
   __for-label, __seg, __seg--pending, __sep, __tick, __states, __action.
   ====================================================================== */

/* ---- One CTA family: two weights, one silhouette --------------------- */
/* Applied alongside .cnz-btn-accent / .cnz-btn-plain so the theme keeps
   owning the fills — only the geometry is normalised here. */
.cnz-reg-myreg .cnz-reg-cta {
	/* The theme's buttons are content-box, so a full-width mobile CTA would
	   otherwise overflow its container by its own padding + border. */
	box-sizing: border-box;
	padding: 0.62rem 1.2rem;
	border-width: 1px;
	border-radius: 2px;
	font-size: 0.8rem;
	text-align: center;
	white-space: nowrap;
}

/* ---- Attention band: one right-hand rail ---------------------------- */
.cnz-reg-outstanding__item {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto auto;
	align-items: center;
	column-gap: 1.75rem;
	row-gap: 0.6rem;
}
/* The button is the only shout in the band: the amount steps back from bold
   body size so it stops competing with it, and keeps clear air either side —
   butted against the last word of a wrapping label it read as part of the
   sentence (Kit, 2026-07-25). */
.cnz-reg-outstanding__amount {
	font-size: 0.95rem;
	font-weight: 600;
	text-align: right;
	font-variant-numeric: tabular-nums;
}
@media (max-width: 600px) {
	.cnz-reg-outstanding__item {
		grid-template-columns: minmax(0, 1fr) auto;
		column-gap: 1rem;
	}
	.cnz-reg-outstanding__item .cnz-reg-cta {
		grid-column: 1 / -1;
		width: 100%;
		/* Full width means the height is the whole tap target. */
		padding-top: 0.75rem;
		padding-bottom: 0.75rem;
	}
}

/* ---- Event card: one card, one grid, one action row ------------------ */
.cnz-reg-myreg .cnz-reg-eventcard { display: block; }

/* Every meta row shares ONE grid, so the label column is as wide as the
   widest label across the event facts AND the athlete-state rows. */
.cnz-reg-event__offer {
	display: grid;
	grid-template-columns: max-content minmax(0, 1fr);
	column-gap: 0.9rem;
	row-gap: 0.3rem;
	align-items: baseline;
}
.cnz-reg-event__offer-group { display: contents; }
.cnz-reg-event__offer-rule {
	grid-column: 1 / -1;
	height: 0;
	margin: 0.6rem 0 0.35rem;
	border: 0;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}

/* Athlete states: colour carries the STATE (on the label), never the names —
   down from four colours in the old "For:" sentence to two meaningful ones. */
.cnz-reg-event__state--pending strong { color: #985A1C; }
.cnz-reg-event__state--done strong { color: #006B35; }
.cnz-reg-event__state--muted strong,
.cnz-reg-event__state--muted span { color: var(--wp--preset--color--tertiary, #666); }

/* Foot action row: quiet link left, single button right — the same one-action
   zone pattern as .cnz-reg-action-row on athlete cards. */
.cnz-reg-eventcard__foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.6rem 1.5rem;
	margin: 1.15rem 0 0;
	padding-top: 0.9rem;
	border-top: 1px solid var(--wp--preset--color--border, #E0E0E0);
}
.cnz-reg-eventcard__foot .cnz-reg-eventcard__details { margin: 0; }
.cnz-reg-eventcard__enter { margin: 0 0 0 auto; }
@media (max-width: 600px) {
	.cnz-reg-eventcard__foot {
		flex-direction: column;
		align-items: stretch;
	}
	/* Link stays ABOVE the button: under it, it read as a second action. */
	.cnz-reg-eventcard__foot .cnz-reg-eventcard__details { text-align: center; }
	.cnz-reg-eventcard__enter { margin: 0; }
	.cnz-reg-eventcard__enter .cnz-reg-cta { display: block; width: 100%; }
}

/* =========================================================================
   v1.6.4 (2026-08-06) — "an athlete was removed from your account".

   AMBER, not red. Red in this stylesheet means exactly one thing — your input
   is invalid, fix it (.cnz-reg-errors, .cnz-reg-field-error, [aria-invalid],
   #b3261e). The reader here has done nothing wrong and there is nothing on this
   page for them to fix, so red would read as an accusation: the same mistake
   "Rejected by club" made before v0.20.0, and a dead end besides.

   But PAGE level, not the card level of the other two amber blocks
   (.cnz-reg-clubcheck nests in an athlete card, .cnz-reg-changes__group--pending
   in the change-requests section). This one can be the ONLY thing standing where
   a person's card used to be — it replaces the never-registered empty state —
   and when the registration is paid it carries a deadline: an off-roster athlete
   is left out of the entries export (v0.21.11), so they will not reach a start
   list. Drawn at .cnz-reg-clubcheck weight beside the 4px accent-railed
   .cnz-reg-outstanding, the more consequential message would be the quieter one
   on the page.

   So it takes the --pending recipe (amber rail + 6% wash + 0 4 4 0 radius) and
   the geometry of .cnz-reg-outstanding, the page-level band it sits above. Same
   hue as the other two, one step up in scale — NOT a third amber look. ONE
   treatment for paid and unpaid: the conditional money line already carries that
   difference, and two weights for one component is the fragmentation this
   release exists to remove.
   ====================================================================== */

.cnz-reg-removed-athlete {
	/* Margins + padding lifted from .cnz-reg-outstanding, so the two page-level
	   blocks sit on the same rhythm whichever of them renders. */
	margin: 1.25rem 0 2rem;
	padding: 1.1rem 1.4rem;
	/* #985A1C, not the --warning #C77D2C that --pending rails with: this is the
	   dense amber the theme uses for marks carrying text weight (the
	   .cnz-reg-clubcheck rail, the .cnz-badge--pending label), and the 6% wash is
	   the light one. Same pairing as --pending, the other way up — at 4px the
	   rail is a dense mark, not a wash. */
	border-left: 4px solid #985A1C;
	background: rgba(199, 125, 44, 0.06);
	border-radius: 0 4px 4px 0;
	/* It carries an id and this page's header is FIXED — every anchor target on
	   these pages has needed this (see the 8rem on the .cnz-reg-toc targets). */
	scroll-margin-top: 8rem;
}

/* A sentence-heading, not a noun phrase like "Needs your attention": the news IS
   the sentence, and splitting it into a label plus a body line would push the
   athlete's NAME out of the first thing read. Left in the default text colour —
   the rail already carries the tone, and this is the one line that must survive
   a glance, so it takes maximum contrast rather than amber-on-amber. Sized to
   the page-section scale (round 3: 1.1rem/700) so it reads as a peer of the
   attention band's heading, not as card furniture. */
.cnz-reg-removed-athlete__heading {
	margin: 0 0 0.5rem;
	font-size: 1.1rem;
	font-weight: 700;
	line-height: 1.25;
	text-wrap: pretty;   /* a wrapping name list must not strand one name alone */
}

.cnz-reg-removed-athlete p {
	margin: 0 0 0.55rem;
	max-width: 62ch;     /* same measure as .cnz-reg-clubcheck p */
}
.cnz-reg-removed-athlete p:last-child { margin-bottom: 0; }

/* The support address is the ONLY action in the block, and it is deliberately a
   link rather than a button: the attention band below owns this page's one
   accent, and a second CTA up here would compete with the money. Underline + 600
   so it still reads as the action against the wash. */
.cnz-reg-removed-athlete a {
	font-weight: 600;
	text-decoration: underline;
}

@media (max-width: 600px) {
	/* The 62ch measure never binds on a phone; the padding does. Give the text
	   back the room the rail and the desktop padding take. */
	.cnz-reg-removed-athlete { padding: 1rem 1rem 1.05rem; }
}
