/* =========================================================================
   CNZ Athlete Registration UI — v1.6.7
   v1.6.7 — Kit's v0.22.7 round: the answered table loses "Competing in" (it was
            squeezing that column to 106px against the work list's 222px), so
            the two tables are the same four columns and the answer column is
            pinned BY CLASS rather than by position. See the EOF block.
   ---
   CNZ Athlete Registration UI — v1.6.6
   v1.6.6 — The club verification page gets the styling it never had, and the
            portal's two message bands stop shouting over each other
            (plugin v0.22.7). Three classes the plugin has been emitting had NO
            rule in this file at all, and the Yes/No buttons were never the
            matched pair their own comment claimed. `.cnz-reg-clubcheck` is
            retired. See the EOF block.
   ---
   CNZ Athlete Registration UI — v1.6.5
   v1.6.5 — The rejection story, split into two bands with two lifetimes
            (plugin v0.22.5). `.cnz-reg-notice` is the page-level band the club
            fact and the money each get; `.cnz-badge--alert` and
            `.cnz-reg-entry-athlete--held` mark a held entry on the event view,
            which until now wore the same grey wash as a settled one. See the
            EOF block.
   ---
   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; }

/* v1.6.6 — "You've said no to N of these. CNZ is checking those…", stated ONCE
   under the summary. It used to be a paragraph repeated inside every rejected
   row's answer cell, where it had no rule at all (so it kept default margins
   under a 0.7rem badge) AND silently re-laid-out the table: this table is
   `table-layout: auto` with only three widths pinned, so a 68-character
   sentence's max-content demand swelled the answer column and stole width from
   "Competing in" — which is why the same column rendered at two widths in the
   two tables stacked on this page. Same pattern as the "Reviewed by CNZ"
   section, which already opens with a .cnz-reg-note line before its list. */
.cnz-reg-verify__done-note { margin: 0 0 1rem; max-width: 62ch; }

/* v1.6.6 — the trashed-athlete advisory ("CNZ is reviewing this record — your
   answer is still saved"). The plugin has emitted this class since v0.21.14
   with NO rule anywhere, and it is a <small> inside td:first-child — which is
   font-weight 600 on desktop and 1.05rem/700 once the table stacks. So a muted
   note inherited bold, at ~0.84rem/700 directly under the name on a phone.
   font-weight: 400 is the load-bearing declaration here. `display: block` lets
   the plugin drop its <br /> in a later pass; the two are not coupled. */
.cnz-reg-verify__pending {
	display: block;
	margin-top: 0.2rem;
	font-size: 0.8rem;
	font-weight: 400;
	line-height: 1.4;
	color: var(--wp--preset--color--tertiary, #666);
	text-wrap: pretty;
}

/* v1.6.6 — "Reviewed by CNZ" is a single tall column of names (eleven on
   staging's largest club, and it only grows), which pushes the section's own
   way out — "email us if that's wrong" — below all of them. */
.cnz-reg-verify__ruled { columns: 2; column-gap: 2rem; }
.cnz-reg-verify__ruled > li { break-inside: avoid; }
@media (max-width: 600px) {
	.cnz-reg-verify__ruled { columns: 1; }
}
/* The age beside each name. A club being told eight Smiths are no longer theirs
   has no way to tell them apart — on a page whose reject dialog warns that the
   commonest false rejection is a junior registered under their full legal
   name. */
.cnz-reg-verify__ruled-age {
	color: var(--wp--preset--color--tertiary, #666);
	font-size: 0.85rem;
}

/* RETIRED in v1.6.6: `.cnz-reg-clubcheck`, the card-level amber block that
   carried a club rejection to the account holder before v1.6.5 split it into
   `.cnz-reg-notice--club` and `--hold`. The plugin stopped emitting the class
   entirely in v0.22.7, so both this recipe and the compatibility rule near EOF
   are gone. Its reasoning survives where it was reused: the 3px amber rail is
   documented on `.cnz-reg-changes__group--pending`, and the 62ch measure and
   the amber-not-red rule on `.cnz-reg-notice`. */

.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%; }
/* v1.6.6 — the answer column, pinned BY CLASS rather than by position.
   Measured on staging: pinning it positionally did not work, because
   `width: 1%` is a floor for max-content and not a cap — "Competing in"
   rendered 222px in the work list and 106px here, i.e. the fifth column's
   fixed demand came out of the only column that wraps. The plugin now drops
   "Competing in" from the answered zone entirely (it is context for TAKING the
   decision, and that zone is the undo), so both tables are four columns and
   this rule keeps the badge column to its content while the climber's name
   takes the slack — 280px, measured. Stated on `th` only, like the four rules
   above: thead is display:none below 782px, so a th width cannot leak into the
   stacked layout. */
.cnz-reg-verify-table th.cnz-reg-verify__answer { width: 1%; }
.cnz-reg-verify-table .cnz-badge { white-space: nowrap; }
.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.
   ---
   v1.6.6 — AND THEY NEVER WERE, which is Kit's "buttons are of the different
   size". The theme's buttons are CONTENT-BOX, so the `min-width: 4.5rem` this
   rule used to carry sized the content box and each class then wrapped it in a
   different amount of chrome: .cnz-btn-accent adds 1.75rem padding either side
   plus a 2px border (60px), .cnz-btn-plain 1.25rem plus 1px (42px). Yes
   rendered at 132px against No's 114px in the work list, and the SAME Yes
   dropped to 114px inside the accordion where it is drawn plain. min-width
   cannot normalise two boxes with different chrome, so the geometry is
   normalised instead — .cnz-reg-verify-actions button now shares the
   .cnz-reg-cta recipe (see the v1.6.2 block near EOF), which makes min-width
   mean the whole button. The old 4.5rem here and the 5.5rem in the mobile block
   are both superseded by the single min-width stated there.

   THE WEIGHT DIFFERENCE STAYS. Work list = accent Yes / ghost No; answered list
   = ghost / ghost, where both controls are an undo rather than the primary
   action. Two buttons may differ in FILL; they may never differ in SIZE. */
/* "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; }
	/* v1.6.6 — no mobile min-width override any more. It used to restate 5.5rem
	   here, which on content-box buttons meant 148px vs 130px — the same 18px
	   mismatch, on a phone where the pair sits alone under a stacked label with
	   nothing else on the line to distract from it. One border-box min-width in
	   the .cnz-reg-cta block now covers both breakpoints. */
}


/* ---- 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.

   v1.6.6 — the club verification page's Yes/No pair joins this selector rather
   than getting a second copy of the recipe: two copies of a geometry rule is
   two places to drift, and this page had exactly the problem the rule was
   invented for. Nothing in the plugin's markup changed to make that work — the
   theme reaches those buttons unaided, which is why the fix could ship in
   either order. Dropping the accent's border from 2px to 1px is invisible:
   .cnz-btn-accent sets background and border to the same colour, so its border
   has never been a visible edge, only geometry that existed to match the ghost
   buttons elsewhere. */
.cnz-reg-myreg .cnz-reg-cta,
.cnz-reg-verify-actions button {
	/* 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;
}
/* ONE target width for the pair — and now that the box is border-box this is
   the whole button, so accent and plain land on the same rail in both zones and
   at both breakpoints. The attention band's CTAs deliberately do NOT take a
   min-width (a forced equal width made "Pay now" look inflated); here the
   labels are two and three characters, so without one the targets would be tiny
   and ragged down sixteen rows. */
.cnz-reg-verify-actions button { min-width: 5.5rem; }

/* ---- 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; }
}

/* =========================================================================
   v1.6.5 — THE REJECTION STORY: TWO BANDS, TWO LIFETIMES
   =========================================================================
   The portal was telling one component two records' stories. `.cnz-reg-clubcheck`
   carried the club fact, the amount owed, the pay instruction and the escape
   hatch in ONE block — gated on a flag only an admin undo ever clears, and set
   inside `.cnz-reg-profile__body`, the right-hand column of a flex row whose
   left column is the photo. So it could never end, and a three-paragraph
   advisory was being set in a column sized for a four-row key/value table.

   The split follows the one the admin side already made: the REGISTRATION owns
   the club decision, the ENTRY owns the money.

     --club      a FACT. Renders while true, no expiry, never dismissible.
     --hold      an EVENT with a price on it. One band per competition, because
                 the money is collected one order per event.
     --resolved  the same event, over. Dismissible, and self-expiring.

   Geometry is `.cnz-reg-removed-athlete`'s, deliberately: that block is the
   portal's other page-level "needs awareness" band and these must read as the
   same kind of thing at the same level, not as a fourth amber look.
   `.cnz-reg-removed-athlete` should ADOPT this base in a later pass — not this
   release, which already changes enough.
   ====================================================================== */

.cnz-reg-notice {
	margin: 1.25rem 0 2rem;
	padding: 1.1rem 1.4rem;
	border-left: 4px solid var(--wp--preset--color--border, #E0E0E0);
	border-radius: 0 4px 4px 0;
	/* The club band is an anchor target ("See event entries" jumps the other
	   way) and this page's header is FIXED. Every anchor target on these pages
	   has needed this. */
	scroll-margin-top: 8rem;
}

/* A SENTENCE CARRYING THE NEWS, not a noun-phrase label — the specific thing
   .cnz-reg-removed-athlete__heading documents and the specific thing to copy.
   "$50.00 to pay before Ella goes back on the start list" survives a glance;
   "Payment required" does not. Default text colour: the rail carries the tone,
   and this line takes maximum contrast. */
.cnz-reg-notice__heading {
	margin: 0 0 0.5rem;
	font-size: 1.1rem;
	font-weight: 700;
	line-height: 1.25;
	text-wrap: pretty;
}

.cnz-reg-notice p { margin: 0 0 0.55rem; max-width: 62ch; }
.cnz-reg-notice p:last-child { margin-bottom: 0; }
.cnz-reg-notice a { font-weight: 600; text-decoration: underline; }

/* v1.6.6 — a flex row, not a float context. See the dismiss rule below. */
.cnz-reg-notice__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0.6rem 1.25rem;
	margin: 0.85rem 0 0;
}

/* Dismiss is a quiet grey text link — NOT an ×. The theme has no × idiom and it
   is a poor tap target.
   ---
   v1.6.6 — but it is no longer floated right (Kit: *"is the dismiss button on
   Becky's page in the right place? It feels disconnected."*). It was: floating
   put a small grey link on the far side of a full-width band, metres from the
   sentence it belongs to, with a clearfix propping the box open behind it. The
   float was there so it could never crowd a pay link sharing the row — but the
   two can never share a row, because live states are not dismissible, so in
   practice it was ALWAYS alone and always stranded. It now sits in flow under
   the text it dismisses, and keeps the right-hand rail only if it ever does gain
   a sibling. */
.cnz-reg-notice__dismiss {
	margin-left: auto;
	font-weight: 400 !important;
	font-size: 0.9rem;
	color: var(--wp--preset--color--secondary, #555);
	text-decoration: underline;
}
.cnz-reg-notice__dismiss:only-child { margin-left: 0; }

/* Both live bands take the dense amber the theme uses for marks carrying text
   weight, with the light 6% wash — the same pairing as .cnz-reg-removed-athlete
   and .cnz-badge--pending. Amber for both money and club states is right: they
   are the same family of problem, and severity is carried by the rail, the wash
   and the ⚠ rather than by a second hue. RED STAYS RESERVED for "your input is
   invalid" — the member did nothing wrong, and telling them otherwise was the
   pre-v0.20.0 "Rejected by club" mistake. */
.cnz-reg-notice--club,
.cnz-reg-notice--hold {
	border-left-color: #985A1C;
	background: rgba(199, 125, 44, 0.06);
}

/* Resolved: good news should RECEDE. No wash, a neutral rail, and no accent —
   green here would spend the page's one accent on something already finished. */
.cnz-reg-notice--resolved {
	border-left-color: var(--wp--preset--color--border, #E0E0E0);
	background: none;
}

/* v1.6.6 — ONE SHOUT PER PAGE. Kit, on Nick Potter: *"there are two messages
   now. Looks too much."* They stay two — the club fact and the money have two
   lifetimes, and merging them is how the never-expiring message got built — but
   they must not be peers. While money is owed the club band is the CONTEXT for
   the money band: the hold band is the one with an amount and a button, so it
   keeps the amber, and this one drops to the resolved treatment. The plugin
   shortens its copy to a single sentence at the same time; the two halves are
   independent, so either can land first.

   NB `--context` follows `--club` in this file, so it wins on source order at
   equal specificity. Do not move it above the amber block. */
.cnz-reg-notice--club.cnz-reg-notice--context {
	border-left-color: var(--wp--preset--color--border, #E0E0E0);
	background: none;
}

/* RETIRED in v1.6.6: `.cnz-reg-notice.cnz-reg-clubcheck`, the one-release
   overlap rule that let plugin v0.22.5 land ahead of theme 1.7.38 without
   rendering an unstyled block. Both are live, and the plugin stopped emitting
   the alias in v0.22.7. */

/* A muted qualifier under the Club row's value: once the money is settled the
   club band retires, but the summary table now reads "Independent / no club"
   where a club used to be. This is the durable trace — one line, not a standing
   callout. */
.cnz-reg-summary__note {
	margin: 0.35rem 0 0;
	font-size: 0.85rem;
	color: var(--wp--preset--color--secondary, #555);
	max-width: 62ch;
}

@media (max-width: 600px) {
	.cnz-reg-notice { padding: 1rem 1rem 1.05rem; }
}

/* ---- The event view: a held block must LOOK like a problem ----------- */
/* It rendered `--entered` — the same grey wash as an ordinary locked paid entry
   — so the one state on that page costing a start-list place was the one that
   looked settled. Kit could not find it. Three weight tiers in one hue family:
   entered/paid is grey and quiet, awaiting payment is plain white and still
   actionable, on hold takes the rail and the wash. */
.cnz-reg-entry-athlete--held {
	border-left: 4px solid #985A1C;
	border-radius: 0 8px 8px 0;
	background: rgba(199, 125, 44, 0.06);
}

/* The amount, as a headline rather than buried mid-paragraph. */
.cnz-reg-entry-athlete__holdline {
	margin: 0 0 0.5rem;
	font-size: 1rem;
	font-weight: 700;
	line-height: 1.3;
	text-wrap: pretty;
}

/* THE STATE BADGE. `__name` is `float: left; width: 100%`, so a badge appended
   after the category chips drops onto its own line at narrow widths — which is
   fine, and better than crowding the name, but it must not look like a stray
   chip. Pushed to the right on one line where there is room, and allowed to
   fall in under the name where there is not. */
.cnz-reg-entry-athlete__state {
	float: right;
	margin-left: 0.5rem;
}
@media (max-width: 600px) {
	.cnz-reg-entry-athlete__state {
		float: none;
		display: inline-block;
		margin: 0.35rem 0 0;
	}
}

/* ⚠ On hold. The ⚠ is in the plugin's TEXT, not here: colour must never be the
   only carrier of a state, and it means the plugin release still says the right
   thing if it lands ahead of this stylesheet. Denser than --pending because it
   is the one badge that means "not competing". */
.cnz-badge--alert {
	background-color: rgba(199, 125, 44, 0.22);
	color: #985A1C;
	border: 1px solid #985A1C;
	font-weight: 700;
}

/* The entries section is an anchor target ("See event entries" in the club
   band), and the header is fixed. */
.cnz-reg-entries { scroll-margin-top: 8rem; }

/* =========================================================================
   v1.6.6 (2026-08-16) — THE CLUB VERIFICATION PAGE, AND ONE SHOUT PER PAGE
   =========================================================================
   Two areas, both from Kit testing v0.22.5 on staging, and one deletion.

   1. THE CLUB PAGE WAS NEVER FULLY STYLED. Three classes the plugin emits had
      no rule in this file at all — `.cnz-reg-verify-row__note` (since deleted
      from the plugin), `.cnz-reg-verify__pending`, `.cnz-reg-verify__ruled` —
      so each rendered at whatever the cascade handed it, which on a page of
      0.7rem badges and 0.75rem column heads is always too loud. The buttons
      were the opposite problem: styling that WAS written and did not do what
      its own comment said, because `min-width` on a content-box button sizes
      the content and each class adds a different amount of chrome. All of it
      is fixed in place above rather than in a block down here, because the
      next person to read those rules will read them there.

   2. THE PORTAL'S TWO BANDS WERE PEERS AND SHOULD NOT BE. v1.6.5 split one
      component into two records' stories, which was right and stays. What it
      did not settle was their relative weight while both are live: two amber
      bands, each with a bold sentence heading, on one page. The club fact now
      recedes to `--context` — neutral rail, no wash — for as long as there is
      money owed, which is exactly when the OTHER band is the actionable one.
      When nothing is owed the club band is alone on the page and keeps the
      amber, because then it IS the news.

      The same pass un-floated `.cnz-reg-notice__dismiss`. It was on the far
      side of a full-width band from the sentence it dismisses, propped by a
      clearfix, guarding against a collision that cannot happen (live states
      are not dismissible, so it is always the only control in its row).

   3. DELETED: `.cnz-reg-clubcheck` and its `.cnz-reg-notice.cnz-reg-clubcheck`
      compatibility rule. The plugin stopped emitting the class in v0.22.7.

   NB THE VERIFY TABLE STACKS AT 782px, NOT 600px. Anything tested by narrowing
   a window on this page has to cross that line, or the stacked layout — where
   the buttons sit alone under a `data-label` and the trashed-athlete note sits
   directly under a 1.05rem/700 name — is never seen at all.
   ====================================================================== */

/* =========================================================================
   v1.6.7 (2026-08-16) — Kit's round on v0.22.7
   =========================================================================
   1. THE ANSWERED TABLE WAS A COLUMN WIDER THAN THE WORK LIST, and paid for it
      out of the only column that wraps. Measured on staging: "Competing in"
      rendered **222px in the work list and 106px under the accordion**. The
      v1.6.6 attempt pinned the badge column positionally, which could not work
      — `width: 1%` is a FLOOR for max-content, not a cap, and the `nowrap` on
      the badge meant that column could give nothing back.

      The plugin now drops "Competing in" from the answered zone, so both
      tables are the same four columns and the climber's name takes the slack
      (280px, measured). Rejected alternatives: letting the badge wrap (two-line
      pills down the whole list, and it only recovered 143px of 222); pinning
      "Competing in" to a percentage (over-constrains a table whose other
      columns are content-sized, and still lands short).

   2. `.cnz-reg-verify__answer` is pinned BY CLASS. With both tables at four
      columns, `th:nth-child(n)` can no longer tell them apart — the work
      list's third column is "Competing in" and must stay fluid, the answered
      list's third is the badge and must not. A positional selector that has to
      guess which table it is in is a selector waiting to be wrong.

   3. The club band can be DISMISSED when nothing is owed (plugin v0.22.8).
      A rejection that cost nothing never produces a settlement, so the band had
      no way to end at all. It is still true, so it does not expire — it becomes
      dismissible, and the durable trace stays in `.cnz-reg-summary__note` under
      the Club row. Needs no rule of its own: `.cnz-reg-notice__dismiss` already
      sits in the action row, un-floated since v1.6.6.
   ====================================================================== */
