/*
 * Site styles. There is no CSS framework and no build step — this file is
 * served exactly as written, so everything the site needs is here or in the
 * site's own additions below.
 *
 * ---------------------------------------------------------------------------
 * FLUID TYPE & SPACE SCALE
 *
 * Every size below is derived from the six anchor numbers in --u-*. Change an
 * anchor and the whole scale moves with it, in proportion. That is the point:
 * retuning a site is editing six numbers, not auditing every value in the file.
 *
 * Each step is a clamp() between its value at the minimum viewport and its
 * value at the maximum, so text and spacing scale smoothly with the viewport
 * instead of jumping at breakpoints. No media queries are needed for sizing.
 *
 * TO RETUNE FOR THIS SITE (see refs/design/DESIGN.md):
 *   --u-min-ratio / --u-max-ratio   how dramatic the jump between sizes is.
 *                                   1.2 (minor third) reads calm and even;
 *                                   1.333 (perfect fourth) reads confident;
 *                                   above ~1.4 gets shouty for a practice site.
 *   --u-min-font / --u-max-font     base body size at each end, in px.
 *   --u-min-vw / --u-max-vw         the viewport range the scale spans.
 *
 * A larger max-ratio with the same min-ratio gives a site that is restrained on
 * a phone and expressive on a desktop, which usually suits a hero-led page.
 */
:root {
    /* --- Anchors: the dial for this site ------------------------------- */
    --u-min-vw: 320;
    --u-max-vw: 1240;
    --u-min-font: 16;
    --u-max-font: 18;
    --u-min-ratio: 1.2;
    --u-max-ratio: 1.25;
    /* Space unit (rem) at each end. Every --space-* step and pair is a fixed
     * multiple of it, so these two knobs move the whole spacing rhythm at once. */
    --u-space-min: 1;
    --u-space-max: 1.25;

    /* --- Derivation. Not usually edited by hand. ----------------------- */
    /* Slope and intercept of the line between the two anchor viewports,
     * expressed so each step can be written as clamp(min, calc(...), max). */
    --u-vw-range: calc(var(--u-max-vw) - var(--u-min-vw));

    /* Type steps, in rem at each anchor. Each step multiplies the previous
     * one by the ratio, so the relationship between sizes is fixed even as the
     * absolute values move. */
    --u-min-0: calc(var(--u-min-font) / 16);
    --u-max-0: calc(var(--u-max-font) / 16);

    --u-min--2: calc(var(--u-min-0) / var(--u-min-ratio) / var(--u-min-ratio));
    --u-max--2: calc(var(--u-max-0) / var(--u-max-ratio) / var(--u-max-ratio));
    --u-min--1: calc(var(--u-min-0) / var(--u-min-ratio));
    --u-max--1: calc(var(--u-max-0) / var(--u-max-ratio));
    --u-min-1: calc(var(--u-min-0) * var(--u-min-ratio));
    --u-max-1: calc(var(--u-max-0) * var(--u-max-ratio));
    --u-min-2: calc(var(--u-min-1) * var(--u-min-ratio));
    --u-max-2: calc(var(--u-max-1) * var(--u-max-ratio));
    --u-min-3: calc(var(--u-min-2) * var(--u-min-ratio));
    --u-max-3: calc(var(--u-max-2) * var(--u-max-ratio));
    --u-min-4: calc(var(--u-min-3) * var(--u-min-ratio));
    --u-max-4: calc(var(--u-max-3) * var(--u-max-ratio));
    --u-min-5: calc(var(--u-min-4) * var(--u-min-ratio));
    --u-max-5: calc(var(--u-max-4) * var(--u-max-ratio));
    /* Display extensions, still the same geometric chain: a site never needs
     * to invent a bigger heading step. */
    --u-min-6: calc(var(--u-min-5) * var(--u-min-ratio));
    --u-max-6: calc(var(--u-max-5) * var(--u-max-ratio));
    --u-min-7: calc(var(--u-min-6) * var(--u-min-ratio));
    --u-max-7: calc(var(--u-max-6) * var(--u-max-ratio));
    --u-min-8: calc(var(--u-min-7) * var(--u-min-ratio));
    --u-max-8: calc(var(--u-max-7) * var(--u-max-ratio));

    /* --- Type scale ---------------------------------------------------- */
    /* step--2 fine print · step-0 body · step-2/3 section headings ·
     * step-4/5 hero display. Use these, not raw px. */
    --step--2: clamp(calc(var(--u-min--2) * 1rem), calc(var(--u-min--2) * 1rem + (var(--u-max--2) - var(--u-min--2)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max--2) * 1rem));
    --step--1: clamp(calc(var(--u-min--1) * 1rem), calc(var(--u-min--1) * 1rem + (var(--u-max--1) - var(--u-min--1)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max--1) * 1rem));
    --step-0: clamp(calc(var(--u-min-0) * 1rem), calc(var(--u-min-0) * 1rem + (var(--u-max-0) - var(--u-min-0)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-0) * 1rem));
    --step-1: clamp(calc(var(--u-min-1) * 1rem), calc(var(--u-min-1) * 1rem + (var(--u-max-1) - var(--u-min-1)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-1) * 1rem));
    --step-2: clamp(calc(var(--u-min-2) * 1rem), calc(var(--u-min-2) * 1rem + (var(--u-max-2) - var(--u-min-2)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-2) * 1rem));
    --step-3: clamp(calc(var(--u-min-3) * 1rem), calc(var(--u-min-3) * 1rem + (var(--u-max-3) - var(--u-min-3)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-3) * 1rem));
    --step-4: clamp(calc(var(--u-min-4) * 1rem), calc(var(--u-min-4) * 1rem + (var(--u-max-4) - var(--u-min-4)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-4) * 1rem));
    --step-5: clamp(calc(var(--u-min-5) * 1rem), calc(var(--u-min-5) * 1rem + (var(--u-max-5) - var(--u-min-5)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-5) * 1rem));
    --step-6: clamp(calc(var(--u-min-6) * 1rem), calc(var(--u-min-6) * 1rem + (var(--u-max-6) - var(--u-min-6)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-6) * 1rem));
    --step-7: clamp(calc(var(--u-min-7) * 1rem), calc(var(--u-min-7) * 1rem + (var(--u-max-7) - var(--u-min-7)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-7) * 1rem));
    --step-8: clamp(calc(var(--u-min-8) * 1rem), calc(var(--u-min-8) * 1rem + (var(--u-max-8) - var(--u-min-8)) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-max-8) * 1rem));

    /* --- Weight -------------------------------------------------------- */
    /* Named by the CSS value, not by a word. "bold" is a claim about how a
     * typeface renders; 700 is what you actually asked for, and two faces
     * disagree about which of their cuts reads as bold.
     *
     * THREE WEIGHTS, DELIBERATELY. Body, emphasis, headline — that is the
     * whole system, and it is expressed by which tokens exist rather than by
     * a rule asking politely. Adding --weight-800 needs a reason: the face
     * has a visibly distinct heavy cut AND 700 alone is not creating enough
     * contrast. If 700 and 800 render identically on screen, that is not one.
     * A flat hierarchy is almost always a spacing or size problem, not a
     * weight problem. */
    --weight-400: 400;  /* body */
    --weight-600: 600;  /* nav, card emphasis, eyebrows */
    --weight-700: 700;  /* headlines, CTAs */

    /* --- Leading ------------------------------------------------------- */
    /* A ladder rather than a derived scale, so it is t-shirt sized like
     * --space-* rather than numbered like --step-*. Tightest to loosest.
     *
     * The relationship worth holding: line-height falls as type size rises.
     * Display type at body leading looks unset; body copy at display leading
     * is unreadable. Pair --leading-xs with --step-4/5 and --leading-l with
     * --step-0. */
    --leading-xs: 1.05;   /* display, very large headlines */
    --leading-s: 1.18;     /* headings */
    --leading-m: 1.3;    /* subheadings, ledes, card copy */
    --leading-l: 1.5;     /* body copy */
    --leading-xl: 1.6;   /* long-form and small print, which need more air */

    /* --- Tracking ------------------------------------------------------ */
    /* Same shape: a ladder, tightest to loosest, in em so it scales with
     * whatever size it is applied to.
     *
     * The relationship: tracking tightens as size grows, and ALL-CAPS always
     * needs opening up — uppercase at 0 tracking reads cramped at any size.
     * Pair --tracking-xs with --step-4/5, --tracking-m with body, and
     * --tracking-l or --tracking-xl with any text-transform: uppercase. */
    --tracking-xs: -0.02em;  /* large display */
    --tracking-s: -0.01em;   /* headings */
    --tracking-m: 0;         /* body — the default, stated so it can be reset to */
    --tracking-l: 0.04em;    /* small caps-ish, buttons */
    --tracking-xl: 0.08em;   /* eyebrows and other all-caps runs */

    /* --- Space scale --------------------------------------------------- */
    /* Multiples of the space unit (--u-space-min / --u-space-max) rather than
     * the type ratio, so spacing stays predictable while type can be as
     * dramatic as the site needs. DO NOT redeclare these per site: tune the
     * --u-* knobs above and every step and pair follows. */
    --space-3xs: clamp(calc(var(--u-space-min) * 0.25rem), calc(var(--u-space-min) * 0.25rem + (var(--u-space-max) * 0.3 - var(--u-space-min) * 0.25) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 0.3rem));
    --space-2xs: clamp(calc(var(--u-space-min) * 0.5rem), calc(var(--u-space-min) * 0.5rem + (var(--u-space-max) * 0.5 - var(--u-space-min) * 0.5) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 0.5rem));
    --space-xs: clamp(calc(var(--u-space-min) * 0.75rem), calc(var(--u-space-min) * 0.75rem + (var(--u-space-max) * 0.75 - var(--u-space-min) * 0.75) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 0.75rem));
    --space-s: clamp(calc(var(--u-space-min) * 1rem), calc(var(--u-space-min) * 1rem + (var(--u-space-max) * 1 - var(--u-space-min) * 1) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 1rem));
    --space-m: clamp(calc(var(--u-space-min) * 1.5rem), calc(var(--u-space-min) * 1.5rem + (var(--u-space-max) * 1.5 - var(--u-space-min) * 1.5) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 1.5rem));
    --space-l: clamp(calc(var(--u-space-min) * 2rem), calc(var(--u-space-min) * 2rem + (var(--u-space-max) * 2 - var(--u-space-min) * 2) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 2rem));
    --space-xl: clamp(calc(var(--u-space-min) * 3rem), calc(var(--u-space-min) * 3rem + (var(--u-space-max) * 3 - var(--u-space-min) * 3) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 3rem));
    --space-2xl: clamp(calc(var(--u-space-min) * 4rem), calc(var(--u-space-min) * 4rem + (var(--u-space-max) * 4 - var(--u-space-min) * 4) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 4rem));
    --space-3xl: clamp(calc(var(--u-space-min) * 6rem), calc(var(--u-space-min) * 6rem + (var(--u-space-max) * 6 - var(--u-space-min) * 6) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 6rem));
    --space-4xl: clamp(calc(var(--u-space-min) * 8rem), calc(var(--u-space-min) * 8rem + (var(--u-space-max) * 8 - var(--u-space-min) * 8) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 8rem));

    /* --- Space pairs --------------------------------------------------- */
    /* A pair moves from the SMALLER step on a phone to the LARGER one on a
     * desktop, so the gap changes step rather than merely scaling. This is what
     * replaces per-breakpoint section padding: --space-l-2xl is roughly the old
     * "40-48px mobile, 80-96px desktop" rule, expressed once. */
    --space-2xs-xs: clamp(calc(var(--u-space-min) * 0.5rem), calc(var(--u-space-min) * 0.5rem + (var(--u-space-max) * 0.75 - var(--u-space-min) * 0.5) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 0.75rem));
    --space-xs-s: clamp(calc(var(--u-space-min) * 0.75rem), calc(var(--u-space-min) * 0.75rem + (var(--u-space-max) * 1 - var(--u-space-min) * 0.75) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 1rem));
    --space-s-m: clamp(calc(var(--u-space-min) * 1rem), calc(var(--u-space-min) * 1rem + (var(--u-space-max) * 1.5 - var(--u-space-min) * 1) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 1.5rem));
    --space-m-l: clamp(calc(var(--u-space-min) * 1.5rem), calc(var(--u-space-min) * 1.5rem + (var(--u-space-max) * 2 - var(--u-space-min) * 1.5) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 2rem));
    --space-l-xl: clamp(calc(var(--u-space-min) * 2rem), calc(var(--u-space-min) * 2rem + (var(--u-space-max) * 3 - var(--u-space-min) * 2) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 3rem));
    --space-xl-2xl: clamp(calc(var(--u-space-min) * 3rem), calc(var(--u-space-min) * 3rem + (var(--u-space-max) * 4 - var(--u-space-min) * 3) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 4rem));
    --space-l-2xl: clamp(calc(var(--u-space-min) * 2rem), calc(var(--u-space-min) * 2rem + (var(--u-space-max) * 4 - var(--u-space-min) * 2) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 4rem));
    --space-s-l: clamp(calc(var(--u-space-min) * 1.125rem), calc(var(--u-space-min) * 1.125rem + (var(--u-space-max) * 2 - var(--u-space-min) * 1.125) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 2rem));  /* skip-a-step: grid gutter */
    --space-2xl-3xl: clamp(calc(var(--u-space-min) * 4rem), calc(var(--u-space-min) * 4rem + (var(--u-space-max) * 6 - var(--u-space-min) * 4) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 6rem));
    --space-3xl-4xl: clamp(calc(var(--u-space-min) * 6rem), calc(var(--u-space-min) * 6rem + (var(--u-space-max) * 8 - var(--u-space-min) * 6) * (100vw - var(--u-min-vw) * 1px) / var(--u-vw-range) * 16), calc(var(--u-space-max) * 8rem));

    /* --- Measure ------------------------------------------------------- */
    --measure: 65ch;        /* body copy */
    --measure-tight: 45ch;  /* card and caption copy */

    /* =====================================================================
     * COLOUR
     *
     * Three anchors drive the whole palette. Change them to match the
     * practice; everything else follows. See refs/design/DESIGN.md.
     *
     * That is the default path, and most sites never go past it. Underneath,
     * the palette is layered so a site can take more control WITHOUT hand-
     * writing hex values, which is what a migrated site needs:
     *
     *   1. Anchors        the three below. Tune these first.
     *   2. Per-role       --chroma-secondary, --l-tertiary and friends. A
     *                     brand's second colour is a designer's pick, not a
     *                     rotation of the first, so each role carries its own
     *                     hue, chroma and lightness, defaulting to the anchors.
     *   3. Neutrals       --hue-neutral, --chroma-ink, --chroma-ground. Greys
     *                     are their own decision -- see the block below.
     *   4. Polarity       --scheme. One number flips light/dark.
     *
     * Derive WITHIN a role, declare ACROSS roles. This is the same split
     * Bootstrap 5.3 makes (mix() generates each scale; the base of each theme
     * colour is declared) and the opposite of deriving everything from one
     * hue, which cannot express a real brand pair.
     *
     *   --palette-hue         the practice's brand hue, 0-360.
     *                         Roughly: 25 terracotta · 60 ochre · 145 green
     *                         · 195 teal · 240 blue · 275 violet · 340 rose
     *   --palette-chroma      how saturated the brand reads. OKLCH chroma is
     *                         NOT 0-1 — it runs about 0-0.37 in sRGB, and
     *                         above ~0.15 a surface colour starts to shout.
     *                         0.04 muted · 0.09 confident · 0.14 vivid
     *   --palette-secondary-shift
     *                         degrees from the primary to the secondary.
     *                         150-180 gives a complement; 30-60 an analogous
     *                         neighbour that reads calmer.
     * ===================================================================== */
    --palette-hue: 195;
    --palette-chroma: 0.09;
    --palette-secondary-shift: 150;

    --hue-primary: var(--palette-hue);
    --hue-secondary: calc(var(--palette-hue) + var(--palette-secondary-shift));

    /* Secondary and tertiary each carry their OWN chroma and lightness, not
     * the primary's. They default to it, so a site built from this template
     * still tunes with the three numbers above and renders identically.
     *
     * The override exists because a brand's second colour is often a designer's
     * choice rather than a systematic partner: on a migrated site the secondary
     * was measured at 3.6x the primary's chroma and 0.26 lighter in OKLCH
     * (deep forest green against warm terracotta). One shared chroma and one
     * shared lightness cannot express that pair, and forcing it produced a
     * washed-out grey-green beside a dusty mauve.
     *
     * This is the same concession the feedback colours below already make --
     * each of those carries its own chroma because "yellows need more to read
     * as yellow, reds less before they turn fluorescent". Brand colours want
     * the same latitude. */
    --chroma-secondary: var(--palette-chroma);
    --l-secondary: var(--l-solid);

    /* Tertiary: a third brand colour, typically doing button/CTA work, that is
     * neither a tint of the primary nor semantic. Practices routinely have one
     * ("Button Brown", "Morning Orange"). Defaults to an analogous neighbour of
     * the primary so it is harmless when unused. */
    --palette-tertiary-shift: 30;
    --hue-tertiary: calc(var(--palette-hue) + var(--palette-tertiary-shift));
    --chroma-tertiary: var(--palette-chroma);
    --l-tertiary: var(--l-solid);

    /* --- Neutrals: their own hue, not the brand's ---------------------
     *
     * --hue-neutral defaults to the brand hue, so a site that sets nothing
     * keeps the "greys feel of a piece with the accent" behaviour. But it is
     * a SEPARATE dial, because tying greys to the brand hue is not what any
     * mature system does and not what real practices choose:
     *
     *   - Tailwind ships five grey families (slate/gray/zinc/neutral/stone)
     *     precisely so the temperature of the greys is a decision.
     *   - Bootstrap keeps $gray independent of $theme-colors.
     *   - daisyUI declares base-100/200/300 per theme.
     *
     * And measured on our own migrated sites: both chose warm grounds at hue
     * 80-94 despite green brands at 145 and 166 -- roughly 80 degrees off the
     * brand. A green practice does not want green text, and at the default
     * hue 195 the old derivation gave --ink-strong an R-to-B spread of 17,
     * i.e. a visibly blue-black rather than a black.
     *
     * Set --hue-neutral to taste: the brand hue for a tinted-grey scheme, a
     * warm 70-90 for a settled off-black, or leave chroma at 0 for a true
     * neutral. --chroma-ink and --chroma-ground are separate because ink
     * carries tint better than a large ground does -- the same chroma that
     * reads as "warm grey" in a heading reads as "the wrong white" across a
     * full-bleed background. */
    /* +80 deg off the brand, which is what the previous code already did for
     * --ink-strong alone, and what both migrated practices independently
     * chose for their grounds (warm 80-94 against green brands at 145/166).
     * It defaults to the brand hue so that adding this dial changes nothing on
     * an existing site; the interesting values are elsewhere:
     *
     *   var(--palette-hue)              greys tinted toward the brand (default)
     *   calc(var(--palette-hue) + 80)   the offset real practices tend to pick
     *   70-90                           a warm, settled off-black
     *   with --chroma-ink: 0            a true neutral, no hue at all
     */
    --hue-neutral: var(--palette-hue);
    --chroma-ink: 0.012;    /* text. 0 = true grey; 0.03 = clearly tinted */
    --chroma-ground: calc(0.004 + 0.008 * (1 - var(--scheme)));  /* page background */
    --chroma-surface: calc(0.000 + 0.014 * (1 - var(--scheme))); /* raised surfaces */
    --chroma-border: calc(0.008 + 0.007 * (1 - var(--scheme)));  /* rules and outlines */
    /* Grounds carry MORE tint when dark and less when light: 0.014 across a
     * near-black reads as a warm dark, the same 0.014 across a near-white
     * reads as a colour cast. The old code expressed this by declaring the
     * light and dark neutrals separately; here it rides on --scheme. */

    /* Feedback hues are FIXED and do not follow the brand. A danger colour
     * that rotates with the practice's hue stops reading as danger — the
     * entire value of a semantic colour is that it means the same thing on
     * every site. Only the brand colours above derive from --palette-hue. */
    --hue-success: 145;
    --hue-warning: 75;
    --hue-danger: 27;
    --hue-info: 240;

    /* Lightness ramp. Dark mode overrides these below rather than declaring a
     * second palette — in OKLCH, dark mode is largely an inversion of these
     * four numbers. */
    --l-solid: 0.55;   /* solid fills: buttons, badges */
    --l-hover: 0.48;   /* one step darker for hover */
    --l-light: 0.66;   /* one step lighter: gradient partner for --primary */
    --l-muted: 0.92;   /* a touch stronger than pale, for wash gradients */
    --l-pale: 0.96;    /* tinted backgrounds */
    --l-on-solid: 0.99;/* text on a solid fill */

    /* --- Polarity -----------------------------------------------------
     *
     * --scheme is the one number that says which way round the site runs:
     * 1 = dark ink on a light ground (the norm), 0 = light ink on a dark
     * ground. Every neutral below is written as "light value, plus the
     * distance to its dark counterpart, times (1 - scheme)", so flipping the
     * one number inverts the whole set consistently.
     *
     * This is why the dark-mode block further down only sets --scheme and the
     * three brand-lightness values, instead of re-declaring eight neutrals
     * with a second set of hand-picked literals. Two hand-maintained sets
     * drift: the old block never declared --ink-strong at all, so headings
     * stayed at lightness 0.18 -- dark text on a dark ground.
     *
     * A site that should ALWAYS render dark sets --scheme: 0 here and deletes
     * the media query. A site that should never flip deletes the query alone. */
    --scheme: 1;
    color-scheme: light;

    /* Neutral lightness, light-mode value first, dark-mode value second.
     * Edit these to shift contrast; they are dials, not literals buried in
     * the colour definitions. */
    --l-ink-strong: calc(0.18 + 0.79 * (1 - var(--scheme)));
    --l-ink:        calc(0.25 + 0.70 * (1 - var(--scheme)));
    --l-ink-mid:    calc(0.45 + 0.35 * (1 - var(--scheme)));
    --l-ink-soft:   calc(0.54 + 0.12 * (1 - var(--scheme)));
    --l-bg:         calc(0.99 - 0.81 * (1 - var(--scheme)));
    --l-surface:    calc(1.00 - 0.78 * (1 - var(--scheme)));
    --l-border:     calc(0.90 - 0.58 * (1 - var(--scheme)));
    --l-border-strong: calc(0.82 - 0.40 * (1 - var(--scheme)));

    /* Brand */
    --primary: oklch(var(--l-primary, var(--l-solid)) var(--palette-chroma) var(--hue-primary));
    --primary-hover: oklch(var(--l-hover) var(--palette-chroma) var(--hue-primary));
    --primary-light: oklch(var(--l-light) var(--palette-chroma) var(--hue-primary));
    --primary-muted: oklch(var(--l-muted) calc(var(--palette-chroma) * 0.35) var(--hue-primary));
    /* Chroma falls as lightness rises — a pale tint at full chroma reads
     * muddy rather than tinted. */
    --primary-pale: oklch(var(--l-pale) calc(var(--palette-chroma) * 0.25) var(--hue-primary));
    --on-primary: oklch(var(--l-on-solid) 0 0);

    --secondary: oklch(var(--l-secondary) var(--chroma-secondary) var(--hue-secondary));
    --secondary-hover: oklch(calc(var(--l-secondary) - 0.07) var(--chroma-secondary) var(--hue-secondary));
    --secondary-light: oklch(calc(var(--l-secondary) + 0.11) var(--chroma-secondary) var(--hue-secondary));
    --secondary-pale: oklch(var(--l-pale) calc(var(--chroma-secondary) * 0.25) var(--hue-secondary));
    --on-secondary: oklch(var(--l-on-solid) 0 0);

    /* Tertiary, same shape as the two above. */
    --tertiary: oklch(var(--l-tertiary) var(--chroma-tertiary) var(--hue-tertiary));
    --tertiary-hover: oklch(calc(var(--l-tertiary) - 0.07) var(--chroma-tertiary) var(--hue-tertiary));
    --tertiary-pale: oklch(var(--l-pale) calc(var(--chroma-tertiary) * 0.25) var(--hue-tertiary));
    --on-tertiary: oklch(var(--l-on-solid) 0 0);

    /* Aliases for the older names in DESIGN.md, so existing markup and any
     * site copied from an earlier template keep working. */
    --accent: var(--primary);
    --accent-dark: var(--primary-hover);
    --accent-pale: var(--primary-pale);

    /* Feedback. Chroma is per-hue: yellows need more to read as yellow, reds
     * less before they turn fluorescent. */
    --success: oklch(calc(var(--l-solid) - 0.03) 0.13 var(--hue-success));
    --success-pale: oklch(var(--l-pale) 0.03 var(--hue-success));
    --warning: oklch(0.75 0.14 var(--hue-warning));
    --warning-pale: oklch(var(--l-pale) 0.04 var(--hue-warning));
    --danger: oklch(var(--l-solid) 0.17 var(--hue-danger));
    --danger-pale: oklch(var(--l-pale) 0.03 var(--hue-danger));
    --info: oklch(var(--l-solid) 0.11 var(--hue-info));
    --info-pale: oklch(var(--l-pale) 0.03 var(--hue-info));

    /* Neutrals. DESIGN.md asked in prose for "a teal practice and a navy
     * practice want different --ink warmth"; --hue-neutral is that, made a
     * dial instead of a fixed derivation from the brand.
     *
     * Hue and chroma come from the --hue-neutral / --chroma-*
     * dials above, lightness from the --l-* dials, so all three are tunable
     * without editing any of these lines. Ink chroma tapers as text gets
     * lighter, and grounds use the lower --chroma-ground throughout. */
    --ink-strong: oklch(var(--l-ink-strong) calc(var(--chroma-ink) * 2.5) calc(var(--hue-neutral) + 80));  /* headings, dark surfaces */
    --ink: oklch(var(--l-ink) calc(var(--chroma-ink) * 1.25) var(--hue-neutral));
    --ink-mid: oklch(var(--l-ink-mid) var(--chroma-ink) var(--hue-neutral));
    --ink-soft: oklch(var(--l-ink-soft) calc(var(--chroma-ink) * 0.833) var(--hue-neutral));
    --bg: oklch(var(--l-bg) var(--chroma-ground) var(--hue-ground, var(--hue-neutral)));   /* --hue-ground: a per-site dial for a ground warmer or cooler than the greys */
    --surface: oklch(var(--l-surface) var(--chroma-surface) var(--hue-neutral));
    --border: oklch(var(--l-border) var(--chroma-border) var(--hue-neutral));
    --border-strong: oklch(var(--l-border-strong) calc(var(--chroma-border) * 1.25) var(--hue-neutral));

    /* Paired foreground for each ground, the way daisyUI's -content and
     * Bootstrap's -emphasis work. Use --on-bg rather than reaching for --ink
     * directly when the ground itself might be flipped. */
    --on-bg: var(--ink);
    --on-surface: var(--ink);

    /* --- Grid ---------------------------------------------------------- */
    /* Deliberately minimal: the container and gutter are fluid, placement is
     * left to each layout. Use .u-container and .u-grid below. */
    --grid-max-width: 77.5rem;
    --grid-gutter: var(--space-s-l);
    --grid-columns: 12;

    /* --- Radius -------------------------------------------------------- */
    /* Named by intent rather than by number, so a change of scale does not
     * mean auditing every --radius-3 in the stylesheet. */
    --radius-xs: 0.25rem;   /* tags, inline chips */
    --radius-s: 0.5rem;     /* buttons, inputs */
    --radius-m: 0.75rem;    /* cards */
    --radius-l: 1.25rem;    /* panels, modals, hero media */
    --radius-round: 50%;    /* avatars */
    --radius-pill: 999px;   /* pills, badges */

    /* --- Border widths ------------------------------------------------- */
    --border-thin: 1px;
    --border-medium: 2px;
    --border-thick: 4px;    /* accent rules, active states */

    /* --- Shadows ------------------------------------------------------- */
    /* Two knobs drive every shadow. --shadow-color takes the brand hue so a
     * raised card reads as part of this practice rather than as generic grey;
     * --shadow-strength is what dark mode adjusts, because a shadow on a dark
     * background needs MORE opacity to be seen, not less. */
    --shadow-color: var(--hue-primary, 220) 20% 15%;
    --shadow-strength: 1%;

    --shadow-s:
        0 1px 2px -1px hsl(var(--shadow-color) / calc(var(--shadow-strength) + 9%));
    --shadow-m:
        0 3px 5px -2px hsl(var(--shadow-color) / calc(var(--shadow-strength) + 3%)),
        0 7px 14px -5px hsl(var(--shadow-color) / calc(var(--shadow-strength) + 5%));
    --shadow-l:
        0 -1px 3px 0 hsl(var(--shadow-color) / calc(var(--shadow-strength) + 2%)),
        0 6px 12px -3px hsl(var(--shadow-color) / calc(var(--shadow-strength) + 3%)),
        0 15px 30px -6px hsl(var(--shadow-color) / calc(var(--shadow-strength) + 5%));

    --shadow-inner-s: inset 0 1px 2px 0 hsl(var(--shadow-color) / calc(var(--shadow-strength) + 6%));
    --shadow-inner-m: inset 0 2px 6px 0 hsl(var(--shadow-color) / calc(var(--shadow-strength) + 9%));

    /* --- Layers -------------------------------------------------------- */
    /* Six values, so z-index is never invented at the call site. */
    --layer-behind: -1;    /* decorative washes sitting behind content */
    --layer-base: 1;
    --layer-raised: 2;      /* hover cards, sticky rows */
    --layer-nav: 3;         /* sticky header */
    --layer-overlay: 4;     /* dropdowns, popovers */
    --layer-modal: 5;       /* dialogs and their backdrop */
    --layer-top: 2147483647;/* skip links, live-region alerts */

    /* --- Motion -------------------------------------------------------- */
    --duration-fast: 120ms;   /* hover, focus */
    --duration-base: 220ms;   /* most transitions */
    --duration-slow: 400ms;   /* entrances */
    --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
    --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
    --reveal-distance: 1.5rem;

    /* Typefaces. Set these per site; everything else references them. */
    --font-body: system-ui, -apple-system, 'Segoe UI', sans-serif;
    --font-heading: var(--font-body);   /* override for a display face */
}

/*
 * Dark mode. In OKLCH this is mostly an inversion of the lightness ramp
 * rather than a second palette — the hues and chroma above are unchanged.
 *
 * Two things are not simple inversions and are set explicitly:
 *   - the accent gets LIGHTER (0.68, not 0.55), because a mid-lightness
 *     accent loses contrast against a dark background;
 *   - --shadow-strength rises, because a shadow on a dark surface needs more
 *     opacity to be visible at all.
 *
 * Delete this block for a site that should only ever render light.
 */
/* Atherton Clinic renders light only, as live does: the dark-scheme block that
 * lived here is deleted (the template's own instruction for a light-only site)
 * and color-scheme is pinned beside --scheme, so UA widgets match. */

/* ═══════════════════════════════════════════════════════════════════════
 * RESET
 *
 * Josh Comeau's Custom CSS Reset (joshwcomeau.com/css/custom-css-reset/),
 * lightly adapted. Normalises browser defaults so the base layer below is
 * building on the same ground in every browser. Leave this alone; make
 * design decisions in the base layer and the tokens above it.
 * ═══════════════════════════════════════════════════════════════════════ */

*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; }

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

body {
    -webkit-font-smoothing: antialiased;
    line-height: 1.5;
}

/* Media is block-level and never overflows its container. */
img, picture, video, canvas, svg {
    display: block;
    max-width: 100%;
}

/* Form controls inherit typography rather than using browser chrome. */
:where(input, button, textarea, select) { font: inherit; }   /* zero specificity: "Form controls" below must win */

/* Long words and URLs wrap instead of forcing a horizontal scrollbar. */
p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }

/* A new stacking context on the root, so app-level layers cannot escape. */
#root, #__next { isolation: isolate; }

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════
 * ELEMENT BASE LAYER
 *
 * Bare elements are styled here so a page is correct with no classes at
 * all. Without this, an unclassed <h2> falls back to the browser default
 * and whoever writes the page patches it with an inline style — which is
 * how a site ends up with a different heading treatment per page.
 *
 * Every heading has a matching .h1-.h6 class. Use the ELEMENT for document
 * structure (SEO, screen readers, outline) and the CLASS for appearance,
 * so an <h1> can look like an eyebrow without lying about the hierarchy:
 *
 *     <h1 class="h4">Still the page's real heading, just smaller</h1>
 *
 * Sites override these; they are a floor, not a straitjacket.
 * ═══════════════════════════════════════════════════════════════════════ */

body {
    font-family: var(--font-body);
    font-size: var(--step-0);
    font-weight: var(--weight-400);
    line-height: var(--leading-l);
    color: var(--ink);
    background: var(--bg);
}

/* Headings ─────────────────────────────────────────────────────────────
 * Margins are top-heavy on purpose: a heading belongs to what follows it,
 * so the space above is larger than the space below. */
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
    margin: var(--space-l) 0 var(--space-s);
    font-family: var(--font-heading);
    font-weight: var(--weight-700);
    line-height: var(--leading-s);
    letter-spacing: var(--tracking-xs);
    color: var(--ink-strong);
    text-wrap: balance;
}

:where(h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6) + * {
    margin-top: 0;
}

/* A heading opening its container needs no space above it. */
:where(h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6):first-child {
    margin-top: 0;
}

h1, .h1 { font-size: var(--step-4); }
h2, .h2 { font-size: var(--step-3); }
h3, .h3 { font-size: var(--step-2); }
h4, .h4 { font-size: var(--step-1); }
h5, .h5 { font-size: var(--step-1); line-height: var(--leading-m); }
h6, .h6 {
    font-size: var(--step-0);
    line-height: var(--leading-m);
    letter-spacing: var(--tracking-m);
    text-transform: uppercase;
}

/* A highlighted phrase inside a heading. One mechanism, not three. */
:where(h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6) em {
    font-style: italic;
    color: var(--primary);
}

/* Text ─────────────────────────────────────────────────────────────── */
p, ul, ol, dl, blockquote, figure, table, pre {
    margin: 0 0 var(--space-m);
}

/*
 * Line length is a container's job, not every paragraph's — capping each <p>
 * leaves text hugging the left of any column already sized for reading.
 * Use .measure (or set a width on the container) where prose needs it.
 */
.measure { max-width: var(--measure); }
.measure-tight { max-width: var(--measure-tight); }

/* Opening paragraph: larger and looser than body copy. */
.lede {
    font-size: var(--step-1);
    line-height: var(--leading-m);
    color: var(--ink-mid);
}

/* Small label above a heading. */
.eyebrow {
    display: block;
    margin-bottom: var(--space-2xs);
    font-size: var(--step--1);
    font-weight: var(--weight-600);
    letter-spacing: var(--tracking-l);
    text-transform: uppercase;
    color: var(--primary);
}

small, .text-small { font-size: var(--step--1); }

strong, b { font-weight: var(--weight-700); }

a {
    color: var(--primary);
    text-decoration-thickness: 1px;
    text-underline-offset: 0.15em;
    transition: color var(--duration-fast) var(--ease-out);
}
a:hover { color: var(--primary-hover); }


ul, ol { padding-left: var(--space-m); }

/*
 * List spacing applies to PROSE lists only. Navigation, button groups and
 * card grids are lists too, and flow margins on those knock flex/grid items
 * out of alignment (the site header) or balloon the spacing (the footer).
 *
 * Presence of a class is not the test — a footer nav is a nav whether or not
 * anyone put a class on it — so navigation context opts out explicitly.
 */
:where(ul, ol) > li { margin-bottom: var(--space-2xs); }
:where(ul, ol) > li:last-child { margin-bottom: 0; }

nav ul, nav ol,
header ul, header ol,
footer ul, footer ol,
menu {
    margin: 0;
    padding-left: 0;
    list-style: none;
}

nav li, header li, footer li, menu li {
    margin-bottom: 0;
}

/* A list explicitly used for layout carries no bullets, indent or margin. */
:where(ul, ol)[class] {
    margin: 0;
    padding-left: 0;
    list-style: none;
}

:where(ul, ol)[class] > li { margin-bottom: 0; }

blockquote {
    padding-left: var(--space-m);
    border-left: var(--border-thick) solid var(--primary-pale);
    color: var(--ink-mid);
    font-style: italic;
}

hr {
    height: 0;
    margin: var(--space-l) 0;
    border: 0;
    border-top: var(--border-thin) solid var(--border);
}

code, kbd, samp, pre {
    font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
    font-size: 0.9em;
}

/* Media ────────────────────────────────────────────────────────────────
 * Images are rounded by default. The square-photo bug on Wellbrook was an
 * <img> with no radius sitting beside cards that had one. */
img, picture, video, canvas, svg {
    height: auto;
}

/*
 * Logos, icons and inline SVG are not photographs — a background plate and a
 * radius are wrong for them, and show up as a white box on a dark footer.
 */
img[class*="logo"], img[class*="icon"], .logo img, svg {
    border-radius: 0;
    background: none;
}

/* Opt out where a radius is wrong: full-bleed art, decorative crops. */
img.is-flush, .is-flush img { border-radius: 0; background: none; }

figure { margin-inline: 0; }

figcaption {
    margin-top: var(--space-2xs);
    font-size: var(--step--1);
    color: var(--ink-soft);
}

/* Tables ───────────────────────────────────────────────────────────── */
table {
    width: 100%;
    border-collapse: collapse;
    text-align: left;
}

th, td {
    padding: var(--space-2xs) var(--space-xs);
    border-bottom: var(--border-thin) solid var(--border);
    vertical-align: top;
}

th {
    font-weight: var(--weight-600);
    color: var(--ink-strong);
}

tbody tr:last-child :where(th, td) { border-bottom: 0; }

/* Forms ────────────────────────────────────────────────────────────── */
/* ═══ Form controls & focus ═══ form-controls:begin ══════════════════════
 * A text field's look, and every focus ring on the site, are set ONCE,
 * here: by the --field-* and --focus-ring* tokens and a few base rules.
 * Every text-like control on the site (contact, search, careers, booking,
 * anything mediflare.js or Connect writes) inherits it, so they match by
 * construction.
 *
 * - This section is copied VERBATIM from _template and never edited in a
 *   site: check-system.sh fails the site if its copy differs by a character.
 *   A site differs only in TOKEN VALUES, set in the site layer's own :root,
 *   below this section (a later :root wins over the defaults here).
 * - Never restyle a control inside a component. A component rule may place
 *   a field (grid, margin, width) but never sets its border, radius,
 *   background or height -- check-system.sh fails the site if one does.
 * - Fields and buttons share ONE corner, --control-radius: set it in the
 *   site layer's :root and both follow. Never set --field-radius
 *   (check-system.sh fails it), except to 0 in underline mode below;
 *   pill buttons mean pill fields.
 * - The base rules are at zero specificity (:where), so any token change
 *   reaches every field and nothing here outranks a deliberate override.
 * - ONE focus ring per site, on links, buttons and fields alike: an outline
 *   in --focus-ring at --focus-ring-w. No other rule sets a focus outline,
 *   colour or box-shadow (check-system.sh fails one); outline-offset may be
 *   adjusted where a ring would be clipped.
 * - Underline-only fields: set --field-border-w: 0,
 *   --field-border-bottom: var(--border-thin) solid <colour> and
 *   --field-radius: 0 (an underline has no corners to share; a rounded one
 *   curves at its ends, and buttons keep --control-radius); optionally
 *   --field-focus-border-bottom: var(--focus-ring-w) solid var(--focus-ring)
 *   so the underline thickens with the ring. No extra rules. Underline
 *   mode is the only time a site sets --field-radius, and check-system.sh
 *   then requires the 0.
 * - Dark panels and bands: the container re-sets the tokens for its
 *   descendants, never the rules. Tokens defined here are resolved on :root,
 *   so re-set the leaf values, not the ones they derive from:
 *     .band--dark {
 *         --focus-ring: var(--surface);
 *         --field-bg: transparent;
 *         --field-ink: var(--on-primary);
 *         --field-border: var(--on-primary);
 *         --field-placeholder: color-mix(in oklab, var(--on-primary) 70%, transparent);
 *     }
 *   --focus-ring must reach >= 3:1 against every ground it is drawn on.
 * The guard finds this section by the begin/end markers; keep both.
 * ═══════════════════════════════════════════════════════════════════════ */

:root {
    --field-h: var(--target-min);                 /* the single-line height: exact, never below the 44px target */
    --field-textarea-h: calc(var(--field-h) * 3); /* the textarea's minimum height */
    --field-pad-block: var(--space-2xs);          /* textarea only; a one-line field centres its text in --field-h */
    --field-pad-inline: var(--space-xs);
    --field-font-size: max(var(--step-0), 1rem);  /* never below 16px, or iOS zooms the page on focus */
    --field-leading: var(--leading-m);
    --field-weight: var(--weight-400);            /* one weight wherever the field sits */
    --field-radius: var(--control-radius);        /* = the .btn radius, by construction; never set it */
    --field-textarea-radius: min(var(--field-radius), var(--radius-l));   /* a pill textarea is a capsule; cap it */
    --field-bg: var(--surface);
    --field-ink: var(--ink);
    --field-border-w: var(--border-thin);
    --field-border: var(--border-strong);
    --field-border-hover: var(--ink-soft);
    --field-placeholder: var(--ink-soft);
    /* Unset by default, so they follow --field-border-w/--field-border:
     * --field-border-bottom          the resting bottom edge (underline mode)
     * --field-focus-border-bottom    the bottom edge while focused
     * --field-focus-outline          the field's ring; leave it to the default */
    --focus-ring: var(--primary);                 /* >= 3:1 against --bg, --field-bg and every ground it lands on */
    --focus-ring-w: var(--border-medium);         /* >= --field-border-w, so the ring covers the border */
}

/* THE focus ring: every interactive element, always. Fields refine the
 * offset and radius below; nothing else sets a focus outline. */
:focus-visible {
    outline: var(--focus-ring-w) solid var(--focus-ring);
    outline-offset: 2px;
    border-radius: var(--radius-xs);
}

label {
    display: block;
    margin-bottom: var(--space-3xs);
    font-size: var(--step--1);
    font-weight: var(--weight-600);
    color: var(--ink-strong);
}

/* THE base rule. Every text-like control: text, email, tel, search, number,
 * date, url, password, select and textarea -- not checkboxes, radios,
 * ranges, files or button-type inputs. */
:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=image],[type=hidden]), select, textarea) {
    --_field-radius: var(--field-radius);
    appearance: none;
    box-sizing: border-box;
    width: 100%;
    height: var(--field-h);
    min-height: var(--field-h);
    padding: 0 var(--field-pad-inline);
    font: inherit;
    font-size: var(--field-font-size);
    font-weight: var(--field-weight);
    line-height: var(--field-leading);
    color: var(--field-ink);
    background-color: var(--field-bg);
    border: var(--field-border-w) solid var(--field-border);
    border-bottom: var(--field-border-bottom, var(--field-border-w) solid var(--field-border));
    border-radius: var(--_field-radius);
    box-shadow: none;
    transition: border-color var(--duration-fast) var(--ease-out);
}

:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=image],[type=hidden]), select, textarea):hover {
    border-color: var(--field-border-hover);
}

/* One edge on focus. The offset pulls the ring in by the border's width, so
 * it is drawn ON the border (covering it) rather than outside it; the border
 * and shadow are held at rest so nothing draws a second edge. Specificity
 * 0,1,0 and later than the global :focus-visible, so it wins over that one
 * (whose offset and radius suit links, not fields). In underline mode the
 * bottom edge may take --field-focus-border-bottom as well. */
:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=image],[type=hidden]), select, textarea):focus {
    border-color: var(--field-border);
    border-bottom: var(--field-border-bottom, var(--field-border-w) solid var(--field-border));
    box-shadow: none;
    outline: none;
}
:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=image],[type=hidden]), select, textarea):focus-visible {
    outline: var(--field-focus-outline, var(--focus-ring-w) solid var(--focus-ring));
    outline-offset: calc(var(--field-border-w) * -1);
    border-bottom: var(--field-focus-border-bottom, var(--field-border-bottom, var(--field-border-w) solid var(--field-border)));
    border-radius: var(--_field-radius);
}

:where(textarea) {
    --_field-radius: var(--field-textarea-radius);
    height: auto;
    min-height: var(--field-textarea-h);
    padding-block: var(--field-pad-block);
    resize: vertical;
}

/* The chevron is one conic-gradient wedge in --field-ink: tokens only, no
 * image, so it recolours with the palette and the scheme. (Two half-square
 * linear gradients leave a seam where they meet.) */
:where(select) {
    padding-inline-end: calc(var(--field-pad-inline) * 2 + var(--space-xs));
    background-image: conic-gradient(from -45deg at 50% 100%, var(--field-ink) 90deg, transparent 0);
    background-position: calc(100% - var(--field-pad-inline)) 50%;
    background-size: calc(var(--space-3xs) * 2.5) calc(var(--space-3xs) * 1.25);
    background-repeat: no-repeat;
    cursor: pointer;
}
:where(select[multiple], select[size]) { height: auto; padding-block: var(--field-pad-block); padding-inline-end: var(--field-pad-inline); background-image: none; }

:where(input, textarea)::placeholder { color: var(--field-placeholder); opacity: 1; }

/* The browser's own clear (x) in a search box, redrawn as a mask so it takes
 * --field-ink instead of the browser's grey. */
:where(input[type=search])::-webkit-search-cancel-button {
    -webkit-appearance: none;
    appearance: none;
    inline-size: 1em;
    block-size: 1em;
    cursor: pointer;
    background-color: var(--field-ink);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 4l8 8M12 4l-8 8' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 4l8 8M12 4l-8 8' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat;
}

input[type="checkbox"], input[type="radio"] { accent-color: var(--primary); }

fieldset { margin: 0 0 var(--space-m); padding: 0; border: 0; }

/* ═══ form-controls:end (Form controls & focus) ═════════════════════════ */

/*
 * A bare <button> is usually a UI affordance — a menu toggle, a dropdown
 * trigger — not a visual button, so it gets a reset rather than a look.
 * Add .btn when you want one that looks like a button.
 */
button {
    font: inherit;
    color: inherit;
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
}

/* Buttons ──────────────────────────────────────────────────────────────
 * .btn is opt-in — put it on a <button> or an <a> that should look like a
 * button. Variants change colour, sizes change scale. A bare <button> is
 * reset above, not styled, because most of them are menu and dropdown
 * triggers rather than visual buttons. */
.btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-3xs);
    padding: var(--space-2xs) var(--space-s);
    font-family: inherit;
    font-size: var(--step--1);
    font-weight: var(--weight-600);
    line-height: var(--leading-s);
    text-align: center;
    text-decoration: none;
    white-space: nowrap;
    min-block-size: var(--target-min);   /* 44px tap target, every size and variant */
    cursor: pointer;
    border: var(--border-thin) solid transparent;
    border-radius: var(--control-radius);   /* shared with every field; set --control-radius, not this */
    transition: background var(--duration-fast) var(--ease-out),
                border-color var(--duration-fast) var(--ease-out),
                color var(--duration-fast) var(--ease-out);
}

.btn--primary {
    background: var(--primary);
    color: var(--on-primary);
}
.btn--primary:hover { background: var(--primary-hover); color: var(--on-primary); }

.btn--secondary {
    background: transparent;
    border-color: var(--primary);
    color: var(--primary);
}
.btn--secondary:hover { background: var(--primary-pale); color: var(--primary-hover); }

.btn--ghost {
    background: transparent;
    color: var(--ink-mid);
}
.btn--ghost:hover { background: var(--primary-pale); color: var(--primary); }

.btn--sm { padding: var(--space-3xs) var(--space-xs); font-size: var(--step--2); }
.btn--lg { padding: var(--space-xs) var(--space-m); font-size: var(--step-0); }

/*
 * ON A DARK GROUND
 *
 * Variants above assume a light background. On a dark or brand-coloured
 * section they invert: the solid button goes white, the outline picks up a
 * translucent white edge. Put .on-dark on the button or any ancestor.
 */
.on-dark .btn--primary,
.btn--primary.on-dark {
    background: var(--surface);
    color: var(--primary);
}

.on-dark .btn--primary:hover,
.btn--primary.on-dark:hover {
    background: var(--surface);
    color: var(--primary-hover);
}

.on-dark .btn--secondary,
.btn--secondary.on-dark {
    color: var(--on-primary);
    border-color: color-mix(in oklab, var(--on-primary) 40%, transparent);
}

.on-dark .btn--secondary:hover,
.btn--secondary.on-dark:hover {
    background: color-mix(in oklab, var(--on-primary) 12%, transparent);
    color: var(--on-primary);
}

.btn[disabled], .btn[aria-disabled="true"] {
    opacity: 0.5;
    cursor: not-allowed;
}

/* Media frames ────────────────────────────────────────────────────────
 * A frame for an embed — map, video or photo — so the child fills a box of
 * known proportion instead of the element's natural size.
 *
 * The ratio, radius and any framing are DEFAULTS. Change them in this file
 * to suit the design; they are here so a frame is never unstyled, not to
 * fix how it should look. */
.media-frame {
    aspect-ratio: 4 / 3;
    overflow: hidden;
    border-radius: var(--radius-m);
    background: var(--surface);
}

.media-frame > :where(iframe, img, video) {
    width: 100%;
    height: 100%;
    border: 0;
    display: block;
    object-fit: cover;
    border-radius: 0;
}

.media-frame--square { aspect-ratio: 1; }
.media-frame--wide { aspect-ratio: 16 / 9; }

/* Cards ────────────────────────────────────────────────────────────────
 * Deliberately minimal — a surface with a radius. Sites compose their own
 * card variants on top; modelling every one here would be guesswork. */
.card {
    padding: var(--space-m);
    background: var(--surface);
    border: var(--border-thin) solid var(--border);
    border-radius: var(--radius-m);
}

/* Utility ──────────────────────────────────────────────────────────── */
.visually-hidden, .sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

/*
 * Grid utilities. .u-container centres and pads; .u-grid lays out. Placement
 * within the grid is each layout's business — see refs/design/layouts.md.
 */
.u-container {
    max-width: var(--grid-max-width);
    margin-inline: auto;
    padding-inline: var(--grid-gutter);
}

.u-grid {
    display: grid;
    gap: var(--grid-gutter);
}

/*
 * Section rhythm. EVERY band on a page should be a .section — this is what
 * gives a page its vertical breathing room, and it is the single most
 * repeated review comment when it is missed ("this section is lacking top
 * and bottom padding", raised three separate times on one site).
 *
 * It is a class rather than a bare `section` selector because bands are not
 * always <section> elements, and because a band that deliberately runs flush
 * to its neighbour needs to say so out loud via --flush.
 *
 * Do not hand-roll the padding. --space-l-2xl is the site-wide "40px phone /
 * 80px desktop" step, already a clamp; a bespoke value breaks the rhythm.
 *
 * Verify with bandpad.mjs, which measures the real rendered ink gap between
 * adjacent bands and fails under 40px.
 */
.section { padding-block: var(--space-l-2xl); }
.section--tight { padding-block: var(--space-l); }
.section--flush { padding-block: 0; }

/* A centred intro (eyebrow + heading + standfirst) above a band's content. */
.section__head {
    max-width: 46rem;
    margin-inline: auto;
    text-align: center;
}

/*
 * Scroll entrance.
 *
 * Native scroll-driven animation — no library, no IntersectionObserver, no
 * JS. Add .reveal for a plain fade, or one of the directional modifiers.
 *
 * WHY THE WHOLE BLOCK IS INSIDE prefers-reduced-motion: a reveal implemented
 * as `opacity: 0` plus an animation leaves reduced-motion users staring at
 * invisible content when the animation never runs. Scoping the rule means
 * they simply get the content, with no trap to fall into.
 *
 * Safari and Firefox do not support animation-timeline yet, so content there
 * is simply visible. That is the correct failure for a practice site: no
 * entrance effect is always better than content that never arrives.
 */
@media (prefers-reduced-motion: no-preference) {
    .reveal {
        animation: reveal linear both;
        animation-timeline: view();
        animation-range: entry 0% cover 30%;
    }

    .reveal--up { --reveal-from: translateY(var(--reveal-distance)); }
    .reveal--down { --reveal-from: translateY(calc(var(--reveal-distance) * -1)); }
    .reveal--left { --reveal-from: translateX(var(--reveal-distance)); }
    .reveal--right { --reveal-from: translateX(calc(var(--reveal-distance) * -1)); }
}

@keyframes reveal {
    from {
        opacity: 0;
        transform: var(--reveal-from, none);
    }
}

/*
 * Doctor avatar fallback
 * Shows a gradient + person silhouette when no photo exists.
 * The <img> has onerror="this.style.display='none'" which hides
 * the broken image, revealing this CSS background underneath.
 *
 * Derived from the site's own --accent so a missing photo reads as part of
 * this practice rather than as a stray swatch. Define --accent in :root above.
 */
.doctor-avatar {
    position: relative;
    aspect-ratio: 4 / 5;
    overflow: hidden;
    border-radius: 0.5rem;
    background: linear-gradient(135deg,
        color-mix(in oklab, var(--primary) 85%, black),
        var(--primary));
    display: flex;
    align-items: center;
    justify-content: center;
}

.doctor-avatar::after {
    content: "";
    position: absolute;
    width: 40%;
    height: 40%;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='white' stroke-width='1.5'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
}

.doctor-avatar img {
    position: relative;
    z-index: var(--layer-base);
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/*
 * Mediflare footer logo — dark/light variants.
 * Default: inverted (white text) for dark footers.
 * Add .footer-light to <footer> for light backgrounds.
 */
.mf-logo-light { display: none; }
.mf-logo-dark { display: inline; }
.footer-light .mf-logo-light { display: inline; }
.footer-light .mf-logo-dark { display: none; }

/* Hours: prevent time strings from breaking between number and am/pm */
.hours-table td:last-child,
.footer__hours-row span {
    white-space: nowrap;
}
/* ── 404 ──────────────────────────────────────────────────────────────
 * Served for any unmatched path, so it stands alone: say what happened, then
 * offer the way back rather than leaving a dead end.
 *
 * Written against the template's own tokens (step, space, leading, tracking,
 * weight), which every site in the fleet defines, rather than this site's
 * extensions - a 404 that silently loses its layout because one variable is
 * spelt differently is worse than one that is slightly plainer. The numeral
 * is the exception: it takes this site's display step, as the hero headline. */
.notfound {
    padding-block: var(--space-3xl) var(--space-2xl);
    text-align: center;
}
.notfound__inner { max-width: 46rem; margin-inline: auto; }

/* Decorative, aria-hidden in the markup - the <h1> carries the meaning. Sized
 * large but kept at a legible contrast: a very pale numeral fails WCAG even
 * when it is ornamental. */
.notfound__code {
    font-size: var(--step-8);   /* the site's display step, as the hero headline */
    font-weight: var(--weight-700);
    line-height: var(--leading-2xs);
    margin: 0 0 var(--space-2xs);
    opacity: 0.55;
}
.notfound h1 { margin-top: 0; }
.notfound__lede { font-size: var(--step-1); line-height: var(--leading-l); margin-inline: auto; max-width: 40rem; }

.notfound__actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-s);
    justify-content: center;
    margin-top: var(--space-l);
}

.notfound__links {
    margin-top: var(--space-xl);
    padding-top: var(--space-l);
    border-top: var(--border-thin) solid currentColor;
    /* The rule is a hairline of the surrounding ink rather than a named border
     * token, so it works whatever the site's palette is. */
    border-color: color-mix(in oklab, currentColor 22%, transparent);
}
.notfound__links-title {
    font-size: var(--step-0);
    text-transform: uppercase;
    letter-spacing: var(--tracking-xl);
    margin: 0 0 var(--space-s);
}
.notfound__links ul {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2xs) var(--space-l);
    justify-content: center;
}
.notfound__links a {
    display: inline-block;
    min-height: 24px;   /* WCAG 2.5.8 target size */
    line-height: var(--leading-l);
    font-weight: var(--weight-600);
}
/* ═══════════════════════════════════════════════════════════════════════
 * ATHERTON CLINIC — site layer
 *
 * Everything above this line is the shared template. Everything below
 * retunes it to the practice's own design, transcribed from the WordPress
 * site at www.athertonclinic.com.au on 2026-09-08. Values are measured,
 * not chosen. Two conventions worth knowing before editing:
 *
 *  - The source sets its root font-size fluidly (12px + 0.3125vw: 16.5px at
 *    1440, 13.2px at 390) and sizes every piece of type in rem. Here every
 *    size is a template --step-*, and the whole ramp is tuned only by the
 *    eight --u-* knobs at the top of :root below (fit in their comment).
 *  - Paddings and gaps are fixed pixels on the source, on a 10/20/30/40/60/
 *    80/120px rhythm. Here they are --space-* steps, pairs or named sums of
 *    them, exact at 1440 and 20% tighter on a phone. Box sizes (logos, discs,
 *    photo heights, column widths) stay fixed pixels.
 * ═══════════════════════════════════════════════════════════════════════ */

:root {
    /* --- Scale knobs ------------------------------------------------------
     * The template's scale block at the top of the file is verbatim
     * (_template 14c51d0); these eight numbers are the whole of this site's
     * type and space tuning. Never redeclare or invent a --step-* or --space-*.
     *
     * Type. Body is the owner's 16 -> 18px (2026-09-18; live's 13.2 / 16.5
     * read too small). The ratios are a least-squares fit, in log terms at
     * 1440 and 390 together, of the generated steps to the reviewed ramp
     * (live's measured headings, live's ladder lifted with the body below
     * them), weighted by the square root of how many elements use each size:
     * count-weighting lets the 130-odd small labels drag the hero down onto
     * the section-title step (-16%). Fit, px at 1440 (390), before -> step:
     *   powered-by 14.3 (13.5) -> step--2 13.4 (12.5)
     *   footer legal, labels, pills 16.1 (14.7) -> step--1 15.5 (14.2)
     *   body 18 (16) -> step-0 18 (16) exact
     *   nav, tagline, roles 20.2 (17.4) -> step-1 20.9 (18.1)
     *   sub-heads, helpline numbers 22.6 (18.9) -> step-1 20.9 (18.1)
     *     (live 20.6 before the body lift); large lede 21.6 -> step-1
     *   eyebrows, card titles 25.3 (20.6) -> step-2 24.2 (20.4) (live 24.7)
     *   visit kicker, legal h3 28.4 (22.4) -> step-3 28.1 (23.1)
     *   small titles, legal h5 31.8 (24.3) -> step-4 32.6 (26.1)
     *   legal h2/h4 38.1 (29.2) -> step-5 37.8 (29.5)
     *   band titles, legal page title 42.9 (32.8) -> step-6 43.9 (33.3)
     *   section titles 49.6 (37.9) -> step-7 50.9 (37.6)
     *   hero titles 57.8 (44.3) -> step-8 59.0 (42.5)
     * Every size kept its own step except the sub-heads, which now share
     * step-1 with the nav (one step under the eyebrows, as before).
     *
     * Space. Live's 10/20/30/40/60/80/120px desktop rhythm is the template
     * ladder on a 1.25rem unit exactly, so 1440 is unchanged; --u-space-min
     * is 0.8 of it (owner decision 2026-10-03: spacing scales although live's
     * is flat), so a phone is 20% tighter: 2xs 8, s 16, m 24, l 32, xl 48. */
    --u-min-vw: 390;
    --u-max-vw: 1440;
    --u-min-font: 16;
    --u-max-font: 18;
    --u-min-ratio: 1.13;
    --u-max-ratio: 1.16;
    --u-space-min: 1;
    --u-space-max: 1.25;

    /* --- Palette (Elementor kit 6) ---------------------------------------
     * Every value is an exact OKLCH conversion of live's kit hex, verified by
     * painting it to a canvas. The build's first conversions painted up to 21
     * units off (navy as 13,33,95 against live's 2,33,97; the call button's
     * yellow as 246,217,132 against 252,221,111).
     *
     * The core colours ARE the template's roles, set on its dials, so every
     * template component (focus rings, .btn--primary/--secondary, the pale
     * and hover variants) paints in the brand rather than the template's teal:
     *   primary   = navy    #022161  headings, footer ground, icon discs
     *   secondary = blue    #3373BD  eyebrows, sub-headings, rules, ticks
     *   tertiary  = yellow  #FCDD6F  the "Please Call" button
     *   --bg = cream #FBF8F3 (page ground), --ink = #373E49 (body text) and
     *   --surface = white, all on the neutral dials.
     * The ground is warm and the ink cool, so they cannot share one neutral
     * hue: --hue-neutral carries the ink's (and with it the greys'), and
     * --hue-ground, a per-site dial on the template's --bg, the cream's. */
    --palette-hue: 261.80;
    --palette-chroma: 0.1192;
    --l-primary: 0.2764;
    --palette-secondary-shift: -7.76;   /* 254.04 */
    --chroma-secondary: 0.1328;
    --l-secondary: 0.5509;
    --palette-tertiary-shift: -167.97;  /* 93.83 */
    --chroma-tertiary: 0.1337;
    --l-tertiary: 0.9020;
    --hue-neutral: 259.40;
    --chroma-ink: 0.017;                /* --ink = 1.25x = 0.0213 */
    --l-ink: 0.3618;
    --hue-ground: 80.72;
    --chroma-ground: 0.0074;
    --l-bg: 0.9801;
    --l-on-solid: 1;                    /* live's text on navy is #fff */
    /* Live sets its headings in navy. The template's derived heading ink
     * (--hue-neutral + 80) would land on a wine-black with this cool ink hue,
     * so any heading the site layer does not colour itself (the 404, the
     * unlinked template pages) takes the primary instead. */
    --ink-strong: var(--primary);
    /* The two blue tints no role can derive. */
    --sky: oklch(0.8622 0.0418 240.44);    /* #BAD6EB header band, quick strip, helpline band */
    --pale: oklch(0.9391 0.0195 252.88);   /* #E2ECF8 card fill, alternate bands */
    /* The names the site's CLAUDE.md documents, kept as aliases of the roles
     * so anything written against them still resolves. The rules below use
     * the roles themselves. (--ink is the template's own role name.) */
    --navy: var(--primary);
    --blue: var(--secondary);
    --yellow: var(--tertiary);
    --cream: var(--bg);
    --white: var(--surface);

    /* --- Type --- */
    --font-heading: "DM Serif Text", Georgia, serif;
    --font-body: "DM Sans", "Segoe UI", sans-serif;
    --font-accent: "Manrope", "DM Sans", sans-serif;

    /* Live sets five weights: DM Sans 500 on the nav and ledes, Manrope 800
     * on the pills, large buttons and helpline numbers. */
    --weight-500: 500;
    --weight-800: 800;

    /* Leading: live's own ladder. xs and s are retuned (xs was unused; s moves
     * 1.18 -> 1.2); the rest are extensions: 2xs 1.0 (buttons, helplines), sm
     * 1.25 and ml 1.4, each between the two steps it is named for (band
     * titles; card titles and FAQ questions), and 2xl 1.7 (the pull quote). */
    --leading-2xs: 1;
    --leading-xs: 1.15;
    --leading-s: 1.2;
    --leading-sm: 1.25;
    --leading-ml: 1.4;
    --leading-2xl: 1.7;

    /* Tracking: s is retuned to live's -0.012em (it was unused; it also
     * carries the helpline numbers' -0.3px); ml, between m and l, is the
     * buttons' 0.02em. */
    --tracking-s: -0.012em;
    --tracking-ml: 0.02em;

    /* Live's card and menu-button radius is 10px, not the template's 12. */
    --radius-m: 0.625rem;

    /* Live's 240px that clears the visit card and opens the policies band:
     * two --space-3xl (240 at 1440, 192 on a phone). */
    --band-clear: calc(var(--space-3xl) + var(--space-3xl));
    /* The half-leading trims the source puts on every eyebrow, section title
     * and hero/footer lede, so the stacked widgets sit near live's measured
     * offsets. Live's px, then the steps (px at 1440 / 390): eyebrow
     * -1 0 -4 (3xs: -6 / -4), title -8 (2xs: -10 / -8), lede -21 (s: -20 /
     * -16), and the -25px widget offset on the hero title and both logos
     * (s + 3xs: -26 / -20). */
    --trim-eyebrow: -1px 0 calc(-1 * var(--space-3xs));
    --trim-title: calc(-1 * var(--space-2xs));
    --trim-lede: calc(-1 * var(--space-s));
    --trim-widget: calc(-1 * (var(--space-s) + var(--space-3xs)));
    /* Live's icon disc: 50px, with a 25px glyph. */
    --disc: 50px;
    --disc-glyph: 25px;

    --shell-w: 1350px;

    /* Touch target: the hamburger's 44px, named for the search controls (2026-10-05). */
    --target-min: 2.75rem;

    /* Form fields (owner, 2026-10-05): every text control -- contact form,
     * search -- is the contact field: the pill of every button (one corner,
     * --control-radius: live's Book/CTA pill, .btn), on white with
     * a pale blue edge, its height one body-leading line with --space-xs above
     * and below; the textarea takes half a 44px control as its corner. Focus
     * is ONE 2px blue ring laid over the edge. Tokens only; see Form controls. */
    --control-radius: var(--radius-pill);
    --field-h: calc(var(--step-0) * var(--field-leading) + var(--space-xs) * 2 + var(--border-thin) * 2);   /* 50px at 390, 59px at 1440 */
    --field-textarea-h: 8rem;
    --field-leading: var(--leading-l);   /* body copy's 1.5, as the fields always had */
    --field-pad-block: var(--space-xs);
    --field-pad-inline: var(--space-s);
    --field-textarea-radius: calc(var(--target-min) / 2);
    --field-border: color-mix(in srgb, var(--secondary) 35%, transparent);
    --field-border-hover: var(--field-border);
    --focus-ring: var(--secondary);   /* ONE ring (owner, 2026-10-06), links, buttons and fields: blue clears 3:1 on every ground -- 4.58 cream, 4.85 white, 4.06 pale, 3.21 header blue, 3.11 navy footer -- so no container overrides */
}

/* The source's fluid root is NOT reproduced: the scale's steps are already
   fluid, so a fluid root underneath them scales every size twice. The same
   fluidity, fitted to live, lives once in the scale knobs above. */
html { font-size: 100%; }

/* Site link colour. --primary is navy now the palette is on the template's
 * dials, so this restates the template's own link colour; it stays because it
 * also holds the HOVER at navy (the template's would go to --primary-hover).
 * Sits first in the site layer so every component rule below outranks it. */
a { color: var(--primary); }
a:hover, a:focus-visible { color: var(--primary); }
/* Owner request 2026-09-18: in-copy links carry no underline at rest. They are
 * navy on grey ink and set at 600, so colour is not the only cue (WCAG 1.4.1);
 * the underline comes back on hover and keyboard focus. */
.quick a, .contact__item a, .policy a, .legal__body a, .prose a, .faq__body a { font-weight: var(--weight-600); text-decoration: none; }
.quick a:hover, .quick a:focus-visible, .contact__item a:hover, .contact__item a:focus-visible, .policy a:hover, .policy a:focus-visible,
.legal__body a:hover, .legal__body a:focus-visible, .prose a:hover, .prose a:focus-visible, .faq__body a:hover, .faq__body a:focus-visible { text-decoration: underline; }
.footer-logo, .footer-powered a, .site-logo { text-decoration: none; }

body {
    font-family: var(--font-body);
    font-size: var(--step-0);
    line-height: var(--leading-l);
    color: var(--ink);
    background: var(--bg);
}

/* The template tints every <img> with --surface and rounds it; this site's photos carry their own radius and no ground. */
img { background: none; border-radius: 0; }
h1, h2, h3, h4, h5, h6 { letter-spacing: normal; text-wrap: wrap; overflow-wrap: normal; }

.skip-link { position: absolute; top: -100px; left: 0; z-index: var(--layer-top); padding: var(--space-3xs) var(--space-2xs); background: var(--surface); color: var(--primary); }
.skip-link:focus { top: 0; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* ── Shared pieces ────────────────────────────────────────────────── */
.shell { max-width: var(--shell-w); margin-inline: auto; }
.band { position: relative; padding-inline: var(--space-l); background: var(--bg); }
.band__inner { padding: var(--space-3xl) 0; }
p { margin: 0; }
p, li, td { line-height: var(--leading-l); }

.eyebrow {
    margin: var(--trim-eyebrow);
    font-family: var(--font-body);
    font-size: var(--step-2);
    font-weight: var(--weight-700);
    line-height: var(--leading-l);
    color: var(--secondary);
}
.title {
    margin: 0;
    font-family: var(--font-heading);
    font-size: var(--step-7);
    font-weight: var(--weight-600);
    line-height: var(--leading-s);
    color: var(--primary);
}
.title--sm { font-size: var(--step-4); line-height: var(--leading-m); }
.lede { margin: 0; font-family: var(--font-accent); font-size: var(--step-0); font-weight: var(--weight-500); line-height: var(--leading-xl); color: var(--ink); }
.section-head { display: flex; flex-direction: column; align-items: flex-start; gap: 0; }   /* the source stacks widgets at gap 0; their own margins set the rhythm */
.section-head .eyebrow { margin: var(--trim-eyebrow); }
.section-head--center { align-items: center; text-align: center; }
.section-head--center .lede { max-width: 620px; }
.section-head .title { margin: var(--space-2xs) 0 var(--trim-title); }
.section-head .lede { margin: var(--space-m) 0 0; }
.section-head .title { max-width: 1213px; }
/* Live serves an older DM Serif Text cut that sets ~2% narrower than the current
 * Google Fonts release, so this heading fits one line there and wraps here.
 * Tracking it back in on this heading only keeps the source's single line:
 * --tracking-xs (display) since the title moved to step-7 (50.9px at 1440,
 * live 49.5), which --tracking-s no longer held to 1213px. */
.band--options .section-head .title { letter-spacing: var(--tracking-xs); }
.rule { width: 100%; height: var(--border-thin); margin: var(--space-xl) 0 var(--space-xl); padding: 0; border: 0; background: var(--secondary); }   /* the source's divider block is 96px tall: a 1px rule with 60/60 around it */
.prose p { margin: 0 0 var(--space-s); color: var(--ink); }
.prose p:last-child { margin-bottom: 0; }
.prose a { color: var(--primary); font-weight: var(--weight-500); }
.note { color: var(--ink); }

/* The search component's Search and Close buttons are this button (with
 * .btn--pill below), not a copy of it. */
.btn,
.mf-search__submit,
.mf-search-overlay__close {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2xs);
    padding: var(--space-xs) var(--space-m);
    border: 0;
    border-radius: var(--control-radius);
    background: var(--tertiary);
    font-family: var(--font-body);
    font-size: var(--step-0);
    font-weight: var(--weight-700);
    line-height: var(--leading-l);
    text-transform: uppercase;
    letter-spacing: var(--tracking-ml);
    text-decoration: none;
    color: var(--ink);
    transition: background 0.25s ease-out, color 0.25s ease-out;
}
button.btn, button.nav-link, .mf-search__submit, .mf-search-overlay__close { -webkit-appearance: none; appearance: none; }   /* iOS Safari native button chrome */
/* One hover for every button on the site: yellow -> navy, label and icon go
 * white (17:1 on navy). Doubled class so it outranks the template's
 * a:hover and its .btn--primary/.btn--secondary hovers, which used to
 * give three different results depending on the element. */
.btn.btn:hover, .btn.btn:focus-visible,
.mf-search__submit:hover, .mf-search__submit:focus-visible,
.mf-search-overlay__close:hover, .mf-search-overlay__close:focus-visible { background: var(--primary); color: var(--on-primary); }
.btn__icon { width: 16px; height: 16px; fill: currentColor; flex: none; }
/* Small pill, from the owner's patient-forms reference. 44px keeps the touch target. */
.btn--pill, .mf-search__submit, .mf-search-overlay__close { min-height: 44px; padding: var(--space-3xs) var(--space-s); font-family: var(--font-accent); font-size: var(--step--1); font-weight: var(--weight-800); line-height: var(--leading-2xs); }
.btn--lg { padding: var(--space-s) var(--space-l); font-family: var(--font-accent); font-size: var(--step--1); font-weight: var(--weight-800); line-height: var(--leading-2xs); }
.btn--lg .btn__icon { width: 15px; height: 15px; }

.link-arrow { display: inline-flex; align-items: center; gap: var(--space-3xs); font-weight: var(--weight-600); color: var(--primary); text-decoration: none; }   /* deviation: live's blue on cream is 4.4:1 at this size */
.link-arrow__icon { width: 16px; height: 16px; fill: currentColor; }
.link-arrow:hover span, .link-arrow:focus-visible span { text-decoration: underline; }

/* Icon lists: the source's check list (15px navy tick) and dot list (8px blue dot). */
.ticklist, .dotlist { list-style: none; margin: 0; padding: 0; }
.ticklist li { display: flex; align-items: flex-start; padding-bottom: var(--space-3xs); }
.ticklist li + li { margin-top: var(--space-3xs); }
.ticklist li:last-child { padding-bottom: 0; }
.ticklist__icon { flex: none; width: 15px; height: 15px; margin: var(--space-3xs) var(--space-3xs) 0 0; fill: var(--secondary); }   /* owner reference: ticks are the mid blue (#3C73BB sampled), not navy. Decorative, aria-hidden */
.ticklist span { padding-left: var(--space-3xs); font-weight: var(--weight-500); }
.dotlist li { display: flex; align-items: center; padding-bottom: var(--space-3xs); }
.dotlist li + li { margin-top: var(--space-3xs); }
.dotlist__icon { flex: none; width: 8px; height: 8px; fill: var(--secondary); }
.dotlist span { padding-left: var(--space-2xs); font-family: var(--font-accent); font-size: var(--step-0); font-weight: var(--weight-700); line-height: var(--leading-xl); }
/* Sub-items nested under a tick item (Sexual Health): disc bullets, as live */
.ticklist__body { min-width: 0; }
.sublist { list-style: disc; margin: var(--space-3xs) 0 0; padding-left: var(--space-m); font-weight: var(--weight-500); }
.sublist li { display: list-item; padding: 0; }
.sublist li + li { margin-top: 0; }
.sublist li::marker { color: var(--secondary); }   /* matches the ticks it sits under */

/* ── Header ───────────────────────────────────────────────────────── */
.site-header { position: relative; z-index: var(--layer-nav); background: var(--sky); padding-inline: var(--space-l); }
.topbar {
    display: flex;
    align-items: center;
    gap: var(--space-s);
    width: min(100%, var(--shell-w));
    min-height: 121px;
    margin: 0 auto;
    padding: var(--space-s) 0;
}
.site-logo { display: block; flex: none; margin-left: var(--trim-widget); }
.site-logo img { display: block; width: 270px; height: auto; }
.primary-nav { flex: 1; display: flex; justify-content: center; }
.nav-list { display: flex; flex-wrap: nowrap; align-items: center; justify-content: center; margin: 0; padding: 0; list-style: none; }
.nav-list > li { position: relative; display: flex; }
.nav-link {
    display: inline-flex;
    align-items: center;
    margin: 0 var(--space-xs);
    padding: var(--space-3xs) 0;
    border: 0;
    background: none;
    font-family: var(--font-body);
    font-size: var(--step-1);
    font-weight: var(--weight-500);
    line-height: var(--leading-l);
    color: var(--primary);
    text-decoration: none;
    cursor: pointer;
    white-space: nowrap;
    min-block-size: var(--target-min);   /* the About / Patient Info toggles are buttons: 44px */
}
/* owner request: 1px rule between the top-level items (desktop row only) */
.nav-list > li + li::before { content: ""; align-self: center; width: var(--border-thin); height: 1.1em; background: var(--primary); opacity: 0.3; }
.nav-list > li:first-child .nav-link { margin-left: 0; }
.nav-list > li:last-child .nav-link { margin-right: 0; }
.nav-link:hover, .nav-link:focus-visible { color: var(--secondary); }
/* Owner request 2026-09-18: the active item is the site blue, as live. Blue on the
 * sky header is 3.21:1 - it passes as large text (bold, ~20px) on the full
 * header and is a documented brand override on the compact one. The 700 weight
 * stays so the current page is not marked by colour alone. A sub-page marks
 * its own link and its parent ("About", "Patient Info"). */
.nav-link.active, .nav-link[aria-current="page"], .has-children:has(.sub-menu a.active) > .nav-link { color: var(--secondary); font-weight: var(--weight-700); }
.sub-menu a.active, .sub-menu a[aria-current="page"] { color: var(--secondary); font-weight: var(--weight-700); }
.nav-caret { width: 13px; height: 13px; margin-left: var(--space-3xs); fill: currentColor; }
.sub-menu {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: var(--layer-overlay);
    display: none;
    min-width: max-content;
    margin: 0;
    padding: 0;
    list-style: none;
    background: var(--surface);
    border-radius: var(--radius-s);
    box-shadow: 0 10px 30px color-mix(in srgb, var(--primary) 14%, transparent);
}
.has-children:hover > .sub-menu, .has-children:focus-within > .sub-menu, .has-children.is-open > .sub-menu { display: block; }
.sub-menu a { display: block; padding: var(--space-2xs) var(--space-s); font-size: var(--step-0); font-weight: var(--weight-500); white-space: nowrap; color: var(--primary); text-decoration: none; }
.sub-menu a:hover, .sub-menu a:focus-visible { background: var(--pale); color: var(--secondary); }
.sub-menu li:first-child a { border-radius: var(--radius-s) var(--radius-s) 0 0; }
.sub-menu li:last-child a { border-radius: 0 0 var(--radius-s) var(--radius-s); }
.nav-cta { flex: none; }
/* Please Call shows the number on a desktop (owner, 2026-10-05): on a device
 * that hovers with a fine pointer, at the nav's widths, hovering or keyboard-
 * focusing the button swaps the label for {{phone_display}}. Both labels sit
 * in one grid cell, so the button is always as wide as the longer one and
 * nothing in the header moves. Phones and touch keep "Please Call" (a tap
 * dials), and there the number is not rendered at all, so it cannot widen
 * the button. The accessible name is the link's aria-label, which always
 * includes the number. A short fade, none under reduced motion. */
.nav-cta__number { display: none; }
@media (hover: hover) and (pointer: fine) and (min-width: 993px) {
    .nav-cta__labels { display: inline-grid; }
    .nav-cta__labels > span {
        grid-area: 1 / 1;
        text-align: center;
        transition: opacity var(--duration-fast) var(--ease-out), visibility var(--duration-fast) var(--ease-out);
    }
    .nav-cta__number { display: block; opacity: 0; visibility: hidden; }
    .nav-cta:hover .nav-cta__call, .nav-cta:focus-visible .nav-cta__call { opacity: 0; visibility: hidden; }
    .nav-cta:hover .nav-cta__number, .nav-cta:focus-visible .nav-cta__number { opacity: 1; visibility: visible; }
}
@media (prefers-reduced-motion: reduce) {
    .nav-cta__labels > span { transition: none; }
}
.nav-toggle, .site-search__open { display: none; }

/* ── Hero ─────────────────────────────────────────────────────────── */
.band--hero .band__inner { padding: var(--space-3xl) 0 var(--space-xl); }
.hero { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2xl); }
.hero__copy { display: flex; flex-direction: column; justify-content: center; gap: var(--space-l); padding: var(--space-l) 0; }
.hero__title {
    max-width: 558px;
    margin: var(--trim-widget) 0 var(--trim-title);
    font-family: var(--font-heading);
    font-size: var(--step-8);
    font-weight: var(--weight-600);
    line-height: var(--leading-s);
    color: var(--primary);
}
.hero__lede { max-width: 625px; margin: calc(-1 * var(--space-3xs)) 0 var(--trim-lede); font-family: var(--font-accent); font-size: var(--step-0); font-weight: var(--weight-500); line-height: var(--leading-xl); }
.hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-s); }
.hero__note { max-width: 475px; margin: calc(-1 * var(--space-s)) 0 var(--trim-lede); font-size: var(--step-0); color: var(--ink); }
.hero__photo { min-height: 543px; border-radius: var(--radius-l); background: var(--pale) url("/assets/images/hero-home.9790f309b9.webp") center / cover no-repeat; }

/* ── Quick facts strip ────────────────────────────────────────────── */
.band--quick .band__inner { padding: var(--space-l) 0 var(--space-3xl); }
.quick {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    margin: 0;
    padding: var(--space-xl) 0;
    list-style: none;
    background: var(--sky);
    border-radius: var(--radius-l);
    align-items: stretch;
}
.quick li { position: relative; display: flex; flex-direction: column; align-items: center; gap: var(--space-xs); padding: 0 var(--space-l); text-align: center; }
.quick li:last-child { padding: 0 var(--space-xl); }
.quick li + li::before { content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: var(--border-thin); background: var(--secondary); opacity: 0.35; }
.quick__icon { display: flex; align-items: center; justify-content: center; width: var(--disc); height: var(--disc); border-radius: var(--radius-round); background: var(--primary); }
.quick__icon svg { width: var(--disc-glyph); height: var(--disc-glyph); fill: var(--pale); }
.quick h2 { margin: var(--space-3xs) 0 0; font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-s); color: var(--primary); }
.quick p { margin: 0; }
.quick a { color: var(--primary); }

/* ── Consultation options ─────────────────────────────────────────── */
.band--options { background: var(--pale); }
.options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2xl); }

.band--options .lede { max-width: 1000px; }
.option { display: flex; flex-direction: column; gap: 0; }
.option__icon { display: block; }
.option__icon svg { display: block; width: 42px; height: 42px; fill: var(--primary); }
.option h3 { margin: var(--space-m) 0 var(--space-xs); font-family: var(--font-body); font-size: var(--step-1); font-weight: var(--weight-700); line-height: var(--leading-l); color: var(--secondary); }
.option p { margin: 0; font-size: var(--step-0); line-height: var(--leading-l); }

/* ── Team ─────────────────────────────────────────────────────────── */
.team { display: flex; gap: var(--space-s); }
.team__photos { display: flex; flex: 0 1 664px; gap: var(--space-m); min-width: 0; }   /* shrinkable: a fixed basis overflowed between 1025 and 1200 */
.team__photos img { display: block; flex: 1 1 0; width: 310px; min-width: 0; max-width: 310px; height: 525px; border-radius: var(--radius-m); object-fit: cover; }
.team__copy { display: flex; flex: 1 1 auto; min-width: 0; flex-direction: column; justify-content: center; gap: 0; padding-left: var(--space-2xl); }   /* the source stacks widgets at gap 0 inside a 525-tall row */
.team__copy .eyebrow { margin: var(--trim-eyebrow); }
.team__copy .title { margin: var(--space-2xs) 0 var(--trim-title); }
.team__copy .lede { margin: var(--space-m) 0 0; }
.team__copy .lede + .lede { margin-top: var(--space-s); }
.team__copy .title { max-width: 558px; }
.team__copy .lede { max-width: 586px; }
.team__names { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-s); margin-top: var(--space-s); padding: var(--space-2xs); }

/* ── Helpful contacts ─────────────────────────────────────────────── */
.band--help { background: var(--sky); }
.help { display: grid; grid-template-columns: 320px repeat(3, minmax(0, 1fr)); gap: var(--space-m) var(--space-xl); }
.help .title { grid-row: span 2; }
.help__item h3 { margin: var(--space-3xs) 0 var(--space-xs); font-size: var(--step-1); line-height: var(--leading-2xs); }
.help__item h3 a { font-family: var(--font-accent); font-size: var(--step-1); font-weight: var(--weight-800); line-height: var(--leading-2xs); letter-spacing: var(--tracking-s); color: var(--secondary); text-decoration: none; }
.help__item h3 a:hover, .help__item h3 a:focus-visible { text-decoration: underline; }
.help__item p { font-weight: var(--weight-600); }

/* ── Services ─────────────────────────────────────────────────────── */
.band--services .band__inner { padding: var(--space-2xl) 0; }
.services-head { display: flex; gap: 0; padding-bottom: var(--space-xl); }
.services-head__left .eyebrow { margin: var(--trim-eyebrow); }
.services-head__left .title { margin: var(--space-2xs) 0 var(--trim-title); }
.services-head__left { flex: 0 0 50%; display: flex; flex-direction: column; gap: 0; }
.services-head__left .title { max-width: 480px; }
.services-head__right { flex: 0 0 50%; display: flex; flex-direction: column; align-items: flex-end; gap: var(--space-s); padding-top: var(--space-m); }
.services-head__right .lede { width: 100%; }
.services-head__left .title--band { max-width: 600px; }
.services-head__left:has(.title--band) + .services-head__right .lede { text-align: right; }   /* services page, owner reference */
.svc-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-m); }
.svc-card { display: flex; flex-direction: column; gap: var(--space-m); padding: var(--space-l); background: var(--pale); border-radius: var(--radius-m); }   /* icon block 150 then the list 34 below, as live */
.svc-card__head { display: flex; flex-direction: column; }
.svc-card__icon { display: flex; align-items: center; justify-content: center; width: var(--disc); height: var(--disc); margin-bottom: var(--space-s); border-radius: var(--radius-round); background: var(--secondary); }
.svc-card__icon svg { width: var(--disc-glyph); height: var(--disc-glyph); fill: var(--pale); }
.svc-card__head h3 { margin: var(--space-3xs) 0 var(--space-xs); line-height: var(--leading-l); font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-l); color: var(--primary); }
.svc-card__head p { margin: 0; }

/* ── Accreditation ────────────────────────────────────────────────── */
.band--accred { padding-inline: 0; }
.accred { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: stretch; }
.accred__photo { min-height: 987px; border-radius: 0 var(--radius-l) var(--radius-l) 0; background: var(--pale) url("/assets/images/accred-bg.1d5d83195a.webp") center / cover no-repeat; }
.band--accred .accred { padding: var(--space-2xl) 0 var(--space-3xl); }
.accred__copy { display: flex; flex-direction: column; justify-content: center; gap: var(--space-s); min-width: 0; padding: var(--space-2xl-3xl); }   /* 129.6 at 1440, as live; it cannot hold that below ~1200 */
.accred__thumbs { display: flex; gap: var(--space-s); padding-bottom: var(--space-s); }
.accred__thumbs img { display: block; flex: 0 1 140px; width: 140px; min-width: 0; height: 140px; border-radius: var(--radius-l); object-fit: cover; }
.accred__copy .title { max-width: 382px; }
/* owner request: no underline on the AGPAL link. It is already bold, so it is
 * still told apart from the copy by more than colour; underline returns on
 * hover and keyboard focus. */
.accred__copy .prose a { font-weight: var(--weight-700); text-decoration: none; }
.accred__copy .prose a:hover, .accred__copy .prose a:focus-visible { text-decoration: underline; }
.accred__copy .eyebrow { margin-top: var(--space-2xs); }

/* ── Contact ──────────────────────────────────────────────────────── */
.band--contact { background: var(--pale); }
.band--contact .band__inner { padding: var(--space-3xl) 0 var(--space-3xl); }
.contact { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.contact__copy { display: flex; flex-direction: column; gap: var(--space-l); padding-right: var(--space-2xl); }
.contact__copy .lede { text-wrap: balance; }   /* owner request: details sit closer to the intro */
.contact__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); }
.contact__item { display: flex; flex-direction: column; }
.contact__item--hospital { grid-column: 1; grid-row: 2; margin-top: var(--space-s); }
.contact__icon { display: flex; align-items: center; justify-content: center; width: var(--disc); height: var(--disc); margin-bottom: var(--space-s); border-radius: var(--radius-round); background: var(--primary); }
.contact__icon svg { width: var(--disc-glyph); height: var(--disc-glyph); fill: var(--pale); }
.contact__item h3 { margin: 0 0 var(--space-2xs); font-family: var(--font-body); font-size: var(--step-1); font-weight: var(--weight-700); line-height: var(--leading-l); color: var(--secondary); }
.contact__item p, .contact__hours { margin: 0; }
.contact__item a { color: var(--primary); }
.contact__hours .hours-table, .contact__hours .hours-table tbody, .contact__hours .hours-table tr { display: block; margin: 0; padding: 0; border: 0; }
.contact__hours .hours-table td { display: block; padding: 0; border: 0; font-size: inherit; line-height: inherit; color: inherit; }
.contact__hours .hours-table td:first-child { font-weight: var(--weight-700); color: var(--primary); }
.contact__cta { grid-column: 2; grid-row: 2; align-self: end; }   /* owner request: button ends level with the Nearest Hospital block */
/* owner request: the map is exactly as tall as the copy beside it. The iframe is
 * taken out of flow so its own height cannot set the row; the copy does. */
.contact__map { position: relative; min-height: 420px; }
.contact__map iframe { position: absolute; inset: 0; display: block; width: 100%; height: 100%; border: 0; border-radius: var(--radius-l); }

/* ── Footer ───────────────────────────────────────────────────────── */
.site-footer { padding-inline: var(--space-l); background: var(--primary); color: var(--on-primary); }
.footer-inner { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); padding: var(--space-xl) 0; }
.footer-brand { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-m); }
.footer-logo { display: block; margin: var(--trim-widget) 0 0 calc(-1 * var(--space-xs)); }
.footer-logo img { display: block; width: 300px; height: auto; }
.footer-tagline { max-width: 520px; margin: calc(-1 * var(--space-3xs)) 0 var(--trim-lede); font-size: var(--step-1); color: var(--on-primary); }   /* live's 500px box; 520 keeps its two lines at step-1 (20.9px against live's 20.6) */
.footer-nav { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); padding-left: calc(var(--space-3xl) + var(--space-2xl) + var(--space-m)); }   /* live 227px; 230 at 1440 */
.footer-links { margin: 0; padding: 0; list-style: none; }
.footer-links li + li { margin-top: var(--space-3xs); }
.footer-links a { color: var(--on-primary); text-decoration: none; transition: color 0.2s ease-out; }
.footer-links a:hover, .footer-links a:focus-visible { color: var(--tertiary); text-decoration: none; }
.footer-bar { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: var(--space-xs); padding: var(--space-m) 0; border-top: var(--border-thin) solid color-mix(in srgb, var(--on-primary) 18%, transparent); }
.footer-legal { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2xs); margin: 0; padding: 0; list-style: none; font-size: var(--step--1); }
.footer-legal li + li::before { content: "|"; margin-right: var(--space-2xs); color: var(--pale); opacity: 0.5; }
.footer-legal a { color: var(--on-primary); text-decoration: none; transition: color 0.2s ease-out; }
.footer-legal a:hover, .footer-legal a:focus-visible { color: var(--tertiary); text-decoration: none; }
.footer-bar__right { display: flex; align-items: center; justify-content: flex-end; gap: var(--space-s); }
.footer-copy { margin: 0; font-size: var(--step--1); color: var(--pale); }
.footer-powered { display: flex; flex: none; align-items: center; gap: var(--space-2xs); padding: var(--space-2xs); }
.footer-powered p { margin: 0; font-size: var(--step--2); color: var(--bg); white-space: nowrap; }
.footer-powered img { display: block; width: 72px; height: auto; }


/* ══ Inner pages ═══════════════════════════════════════════════════════════
   Every measurement below is off live at 1440 (geo-pr/hp/sv/pf/hc.txt).      */

.title--hero { font-size: var(--step-8); line-height: var(--leading-xs); }
.title--md { font-size: var(--step-7); line-height: var(--leading-s); }
/* About pages, from the owner's reference screenshots (2026-09-18). The in-band
 * titles on /practice measure 43px in the reference (step-6, 43.9 at 1440)
 * against the .title's step-7 (50.9). */
.title--band { font-size: var(--step-6); line-height: var(--leading-sm); }
.split__copy .title--hero, .hpro-hero__copy .title--hero { max-width: 530px; }   /* three lines, as the reference */
.section-head--centre { align-items: center; text-align: center; }
.section-head--centre .lede { max-width: 610px; margin-inline: auto; }
/* Lede led in by a short rule (practice hero) */
.lede--ruled { --rule-w: 90px; position: relative; padding-left: calc(var(--rule-w) + var(--space-m)); }
.lede--ruled::before { content: ""; position: absolute; left: 0; top: 0.8em; width: var(--rule-w); height: var(--border-thin); background: var(--secondary); opacity: 0.5; }
/* Mission: "Why us" beside "We are committed to" */
.mission-cols { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 8fr); gap: var(--space-2xl); width: 100%; margin-top: var(--space-xl); }
.mission-cols .subhead, .split__copy .mission-cols .subhead { margin: 0 0 var(--space-s); }
.split__copy .mission-cols .lede, .split__copy .mission-cols .ticklist { margin: 0; }
.band--mission .title--band { max-width: 520px; }
/* Team and services: copy beside a single-column list */
.teamsvc-cols { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); width: 100%; margin-top: var(--space-l); }
.split__copy .teamsvc-cols .lede:first-child, .split__copy .teamsvc-cols .ticklist { margin-top: 0; }
/* Staggered curl: the panel rides --space-3xl above the photo, equal heights */
.curl--stagger .curl__copy { margin-bottom: var(--space-3xl); }
.curl--stagger .curl__photo { margin-top: var(--space-3xl); }
.curl--stagger .curl__photo img { aspect-ratio: 720 / 693; max-height: 693px; }   /* live holds the photo at 693 and crops, rather than scaling it */
.curl__copy .lede + .lede { margin-top: var(--space-s); }
.curl--faq.curl--stagger .curl__photo img { aspect-ratio: 833 / 962; max-height: none; }   /* the reference photo is 962 tall at a 833 half-width */
.curl--faq .curl__copy { justify-content: center; }
.curl--faq .curl__copy > * { width: 100%; max-width: 535px; }   /* reference FAQ column */
.curl--faq .curl__copy .title--band { max-width: 380px; }
.lede--lg { font-family: var(--font-body); font-size: var(--step-1); font-weight: 400; line-height: var(--leading-xl); }
.lede--accent { font-family: var(--font-accent); font-size: var(--step-0); font-weight: var(--weight-500); }
.subhead { margin: 0; font-family: var(--font-body); font-size: var(--step-2); font-weight: var(--weight-700); line-height: var(--leading-l); color: var(--secondary); }
.ticklist--two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3xs) var(--space-l); }

/* ── Two-column split (practice hero 625+625 gap 100, mission 833+417) ───── */
.band--split, .band--mission, .band--teamsvc, .band--cta { background: var(--bg); }
.band--mission { background: var(--pale); }
.band--teamsvc .band__inner { padding: var(--space-3xl) 0 var(--space-2xl); }
.split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2xl); align-items: center; }
.split--wide { grid-template-columns: minmax(0, 833px) minmax(0, 417px); }
.split--teamsvc { grid-template-columns: minmax(0, 543px) minmax(0, 707px); }
.split--svchero { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3xl); }
.svchero__actions { display: flex; align-items: center; gap: var(--space-l); width: 100%; margin-top: var(--space-l); }
.split__photo img { display: block; width: 100%; height: auto; border-radius: var(--radius-l); }
.split__copy { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-width: 0; }
.split__copy .eyebrow { margin: var(--trim-eyebrow); }
.split__copy .title { margin: var(--space-2xs) 0 var(--trim-title); }
.split__copy .lede { margin: var(--space-m) 0 0; }
.split__copy .lede + .lede { margin-top: var(--space-s); }
.split__copy .subhead { margin: var(--space-m) 0 calc(-1 * var(--space-3xs)); }
.split__copy .subhead:first-child { margin-top: 0; }
.split__copy .ticklist { margin: var(--space-s) 0 0; }
.split__copy .btn { margin-top: var(--space-l); }

/* ── Sky seam rule (practice band 2: 155 tall, pad 80/75) ────────────────── */
.band--seam { height: 155px; background: var(--sky); }
.band--seam--thin { height: 100px; }

/* ── Curled split band (720 | 720, radius on the inner edge) ─────────────── */
.band--curl, .band--formstrip, .band--visit, .band--docs { padding-inline: 0; }
.band--curl--rev { padding-block: var(--space-3xl); }
.curl--rev { align-items: start; }
.curl--rev .curl__photo img { height: 450px; object-fit: cover; }
.band--curl { background: var(--bg); }
.curl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: stretch; }
.curl__copy {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    gap: 0;
    min-width: 0;
    padding: var(--space-2xl-3xl);
}
.curl__copy--pale { background: var(--pale); border-radius: 0 var(--radius-l) var(--radius-l) 0; }
.curl--rev .curl__copy { border-radius: var(--radius-l) 0 0 var(--radius-l); }
.curl__copy .eyebrow { margin: var(--trim-eyebrow); }
.curl__copy .title { margin: var(--space-2xs) 0 var(--trim-title); }
.curl__copy .lede { margin: var(--space-m) 0 0; }
.curl__copy .btn { margin-top: var(--space-l); }
.curl__photo { min-width: 0; }
.curl__photo img { display: block; width: 100%; height: 100%; object-fit: cover; border-radius: var(--radius-l) 0 0 var(--radius-l); }
.curl--rev .curl__photo img { border-radius: 0 var(--radius-l) var(--radius-l) 0; }
.band--curl--hero .curl__photo img { border-radius: var(--radius-l) 0 0 var(--radius-l); }

/* ── Healthcare professionals ───────────────────────────────────────────── */
.band--hpro { background: var(--bg); }
.band--hpro .band__inner { padding: var(--space-3xl) 0 var(--space-2xl); }
.hpro-hero { display: grid; grid-template-columns: minmax(0, 750px) minmax(0, 500px); gap: var(--space-2xl); align-items: center; }
.hpro-hero__photo img { display: block; width: 100%; height: auto; aspect-ratio: 500 / 733; object-fit: cover; border-radius: var(--radius-l); }
.rule--tight { margin: var(--space-l) 0 var(--space-m); }
.rule--inline { flex: 1 1 0; min-width: 0; margin: 0; }
.hpro-hero__copy { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-width: 0; }
.hpro-hero__copy .eyebrow { margin: var(--trim-eyebrow); }
.hpro-hero__copy .title { margin: var(--space-2xs) 0 var(--trim-title); }
.hpro-hero__copy .lede { margin: var(--space-m) 0 0; }
.hpro-hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-s); margin-top: var(--space-l); }
.hpro-hero__quote {
    margin: 0;
    font-family: var(--font-body);
    font-size: var(--step-1);
    font-style: italic;
    font-weight: var(--weight-500);
    line-height: var(--leading-2xl);
    color: var(--primary);   /* deviation: live's blue measures 4.43:1 on cream, below AA */
    padding: 0;
    border: 0;   /* the reference sets the quote flush, with no accent bar */
}

.band--values { background: var(--bg); }
.band--values .band__inner { padding: var(--space-l) 0 var(--space-3xl); }
.values {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    margin: 0;
    padding: var(--space-xl) 0;
    background: var(--sky);
    border-radius: var(--radius-l);
    align-items: stretch;
}
.value { position: relative; display: flex; flex-direction: column; align-items: center; gap: var(--space-xs); padding: 0 var(--space-l); text-align: center; }
.value__icon { display: flex; align-items: center; justify-content: center; width: var(--disc); height: var(--disc); border-radius: var(--radius-round); background: var(--primary); }
.value__icon svg { width: var(--disc-glyph); height: var(--disc-glyph); fill: var(--pale); }
.value + .value::before { content: ""; position: absolute; top: 0; bottom: 0; left: 0; width: var(--border-thin); background: var(--secondary); opacity: 0.35; }
.value h2 { margin: var(--space-3xs) 0 0; font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-s); color: var(--primary); }
.value p { margin: 0; }

.band--practitioners { background: var(--pale); }
.band--practitioners .band__inner { display: flex; flex-direction: column; gap: var(--space-xl); padding: var(--space-3xl) 0; }
.prac-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2xl) 0; }
.prac { display: flex; flex-direction: column; align-items: center; gap: 0; text-align: center; }
.prac img { display: block; width: 150px; height: 150px; border-radius: var(--radius-round); object-fit: cover; }
.prac h3 { margin: var(--space-m) 0 var(--space-3xs); font-family: var(--font-heading); font-size: var(--step-1); font-weight: var(--weight-600); line-height: var(--leading-ml); color: var(--primary); }
.prac p { margin: 0; font-family: var(--font-body); font-size: var(--step-1); font-weight: var(--weight-600); color: var(--secondary); }

/* ── Services page ──────────────────────────────────────────────────────── */
.band--svchero { background: var(--bg); }
.band--svchero .band__inner { padding: var(--space-3xl) 0 var(--space-xl); }

.band--resources { background: var(--pale); }
.band--resources .band__inner { display: flex; flex-direction: column; gap: var(--space-xl); }
.resources { display: grid; grid-template-columns: minmax(0, 0.85fr) repeat(2, minmax(0, 1fr)); gap: var(--space-l); align-items: start; }   /* owner request: the two cards get ~445px so the Practice Policies description sets in two lines at 1440 */
.res-summary { display: flex; flex-direction: column; gap: var(--space-s); padding: var(--space-l); background: var(--bg); border-radius: var(--radius-l); }
.res-summary .subhead { font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-ml); color: var(--primary); }   /* owner request: same heading as Patient Forms / Practice Policies */
.res-summary .ticklist--two { grid-template-columns: minmax(0, 1fr); gap: var(--space-3xs); }
.res-cards { display: contents; }
.res-card { display: flex; flex-direction: column; align-items: center; gap: var(--space-xs); text-align: center; }
.res-card img { display: block; width: 300px; max-width: 100%; height: auto; border-radius: var(--radius-l); }
.res-card h3 { margin: 0; font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-ml); color: var(--primary); }
.res-card p { margin: 0; font-family: var(--font-accent); font-size: var(--step-0); font-weight: var(--weight-500); line-height: var(--leading-xl); text-wrap: balance; }
.res-card .btn { margin-top: var(--space-xs); }
/* Three-up only: the two cards share the row tracks (subgrid), so the description
 * row is as tall as the longer description and both buttons sit level directly
 * under it. The last track is 1fr so the taller summary card's extra height
 * lands below the buttons, not between the rows. Without subgrid support the
 * cards simply keep their own flex column. */
@media (min-width: 1025px) {
    @supports (grid-template-rows: subgrid) {
        .resources { grid-template-rows: auto auto auto 1fr; gap: 0 var(--space-l); }
        .res-summary { grid-row: 1 / span 4; }
        .res-card { display: grid; grid-row: 1 / span 4; grid-template-rows: subgrid; justify-items: center; align-items: start; gap: 0; }
        .res-card h3, .res-card p { margin-top: var(--space-xs); }
        .res-card .btn { margin-top: var(--space-s); }
    }
}

.band--visit { background: var(--bg); padding-block: var(--space-l) var(--band-clear); }
.visit { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: center; }
.visit__photo { position: relative; min-width: 0; }
.visit__photo img { display: block; width: 100%; height: auto; border-radius: 0 var(--radius-l) var(--radius-l) 0; }
.visit__card {
    position: absolute;
    right: 50px;
    bottom: -45px;
    display: flex;
    flex-direction: column;
    gap: var(--space-s);
    width: 360px;
    max-width: calc(100% - 100px);
    padding: var(--space-l);
    background: var(--sky);
    border-radius: var(--radius-l);
}
.visit__kicker { margin: 0; font-family: var(--font-heading); font-size: var(--step-3); font-weight: var(--weight-600); line-height: var(--leading-m); color: var(--primary); }
.visit__copy { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-width: 0; padding: var(--space-2xl-3xl); }
.visit .eyebrow { margin: var(--trim-eyebrow); }
.visit .title { margin: var(--space-2xs) 0 var(--trim-title); }
.visit .lede { margin: var(--space-m) 0 0; }
.visit .lede + .lede { margin-top: var(--space-2xs); }
.visit .btn { margin-top: var(--space-l); }

/* ── Practice policies ──────────────────────────────────────────────────── */
.band--pphero { background: var(--bg); }
.pphero { display: grid; grid-template-columns: minmax(0, 520px) minmax(0, 640px); gap: calc(var(--space-3xl) + var(--space-2xl)); align-items: center; }   /* owner reference: copy held to 640 beside a wide gutter */
.pphero__photo img { display: block; width: 100%; height: auto; border-radius: var(--radius-l); }
.pphero__copy { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-width: 0; }
.pphero__copy .eyebrow { margin: var(--trim-eyebrow); }
.pphero__copy .title { margin: var(--space-2xs) 0 var(--trim-title); }
.pphero__copy .lede { margin: var(--space-m) 0 0; }
.pphero__copy .lede + .lede { margin-top: var(--space-s); }
.pphero__copy .title--hero { max-width: 560px; }
.pphero__copy .btn { margin-top: var(--space-l); }

.faqs { display: flex; flex-direction: column; width: 100%; margin-top: var(--space-m); }
.faq { border-bottom: var(--border-thin) solid color-mix(in srgb, var(--secondary) 30%, transparent); }
.faq summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-s);
    padding: var(--space-s) 0;
    font-family: var(--font-heading);
    font-size: var(--step-1);
    font-weight: var(--weight-600);
    line-height: var(--leading-ml);
    color: var(--secondary);
    cursor: pointer;
    list-style: none;
}
.faq summary::-webkit-details-marker { display: none; }
.faq__icon { flex: none; width: 14px; height: 14px; fill: var(--secondary); }
.faq__icon--minus { display: none; }
.faq[open] .faq__icon--plus { display: none; }
.faq[open] .faq__icon--minus { display: block; }
.faq__body { padding: 0 0 var(--space-s); }
.faq__body p { margin: 0; }

.band--policies { background: var(--bg); }
.band--policies .band__inner { display: flex; flex-direction: column; gap: 0; padding: var(--band-clear) 0 var(--space-3xl); }
.pol-head { display: grid; grid-template-columns: minmax(0, 810px) minmax(0, 540px); gap: 0 var(--space-l); align-items: start; }
.pol-head__left { display: flex; flex-direction: column; align-items: flex-start; }
.pol-head__left .eyebrow { margin: var(--trim-eyebrow); }
.pol-head__left .title { margin: var(--space-2xs) 0 var(--trim-title); }
.pol-head__lede { padding-top: var(--space-3xs); }
.policies { display: grid; gap: var(--space-2xl); }
.policies--two { grid-template-columns: repeat(2, minmax(0, 625px)); }
.policies--three { grid-template-columns: repeat(3, minmax(0, 383px)); }
.band--policies .pol-head { margin-bottom: var(--space-xl); }
.band--policies .rule { margin: 0 0 var(--space-2xl); }
.band--policies .policies--two { margin-bottom: var(--space-2xl); }
.policy { display: flex; flex-direction: column; gap: var(--space-xs); }
.policy h3 { margin: 0; font-family: var(--font-body); font-size: var(--step-1); font-weight: var(--weight-700); line-height: var(--leading-l); color: var(--secondary); }
.policy p { margin: 0; }
.policy b, .policy strong { font-weight: var(--weight-700); }

/* ── Patient forms ──────────────────────────────────────────────────────── */
.band--curl--hero { background: var(--bg); padding-block: var(--space-3xl) var(--space-2xl); }
.band--curl--hero .curl__copy { padding-block: 0; }
.band--curl--hero .curl__copy .title--band { max-width: 480px; }
.band--curl--hero .curl__photo img { aspect-ratio: 833 / 600; object-fit: cover; }   /* owner reference: a landscape hero, not the full 720x610 */

.band--formstrip { background: var(--sky); }
.formstrip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-xl); padding: var(--space-2xl) var(--space-2xl); }
.form-card { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-s); }
.form-card__icon { display: flex; align-items: center; justify-content: center; width: var(--disc); height: var(--disc); border-radius: var(--radius-round); background: var(--primary); }
.form-card__icon svg { width: var(--disc-glyph); height: var(--disc-glyph); fill: var(--pale); }
.form-card h2 { margin: 0; font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-ml); color: var(--primary); }
.form-card p { margin: 0; flex: 1 1 auto; }
.form-card .btn, .doc-card .btn { margin-top: var(--space-2xs); }

.band--docs { background: var(--bg); padding: var(--space-3xl) calc(var(--space-3xl) + var(--space-xl)); }   /* live's 175px column inset; 180 at 1440 */
.band--docs--pale { background: var(--pale); }
.docs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2xl); align-items: center; }
.docs__copy { display: flex; flex-direction: column; gap: var(--space-m); padding: var(--space-l) 0; min-width: 0; }
.docs__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-m); }
.doc-card { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-xs); }
.doc-card h3 { margin: 0; font-family: var(--font-heading); font-size: var(--step-2); font-weight: var(--weight-600); line-height: var(--leading-ml); color: var(--primary); }
.doc-card p { margin: 0; flex: 1 1 auto; }
.docs__photo { min-width: 0; }
.docs__photo img { display: block; width: 100%; height: auto; aspect-ratio: 1000 / 1049; object-fit: cover; border-radius: var(--radius-l); }   /* owner reference: near-square, not the tall source */
.docs--photo-left .docs__photo { order: -1; }

/* ── Health info ────────────────────────────────────────────────────────── */
.band--hihero { background: var(--bg); }
.band--hihero .band__inner { padding: var(--space-3xl) 0 0; }
.hihero { display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-l); }
.hihero .eyebrow, .hihero .title, .hihero .lede { margin: 0; }
.hihero__photo { display: block; width: 100%; height: auto; border-radius: var(--radius-l); }
.band--hub { background: var(--bg); }
.band--hub .band__inner { padding: var(--space-l) 0; }

/* ── Contact ────────────────────────────────────────────────────────────── */
.band--chero { background: var(--bg); }
.chero { display: grid; grid-template-columns: minmax(0, 784px) minmax(0, 436px); gap: var(--space-xl); align-items: start; }
.chero__form { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-width: 0; }
.chero__form .lede { margin: var(--space-s) 0 0; text-wrap: balance; }
.cform { display: flex; flex-direction: column; gap: var(--space-s); width: 100%; margin-top: var(--space-l); }
.cform__row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-s); }
.cform__field { display: flex; flex-direction: column; gap: var(--space-3xs); min-width: 0; }
.cform__field label { font-family: var(--font-body); font-size: var(--step--1); font-weight: var(--weight-600); color: var(--primary); }
/* The fields' look (pill, pale blue edge, one blue focus ring) is the
 * --field-* tokens in :root, shared with the search field: see Form controls. */
.cform textarea { resize: vertical; }
.cform__submit { align-self: flex-start; }
.chero__details { display: flex; flex-direction: column; gap: var(--space-l); min-width: 0; }
/* Contact page, owner reference (2026-09-18): details in a centred pale card,
 * The form itself keeps the earlier boxed fields - the owner preferred them
 * to the reference's underline style. */
.chero__details--card { align-items: center; gap: var(--space-m); padding: var(--space-l) var(--space-m); border-radius: var(--radius-l); background: var(--pale); box-shadow: 0 6px 18px color-mix(in srgb, var(--primary) 6%, transparent); text-align: center; }
.chero__details--card .contact__item { align-items: center; }
.chero__details--card .contact__icon { margin-bottom: var(--space-xs); }
.chero__details--card .contact__hours, .chero__details--card .contact__hours .hours-table td { text-align: center; }
.chero__details--card .contact__hours .hours-table { width: 100%; }

.chero__details .contact__item h2 { margin: 0 0 var(--space-2xs); font-family: var(--font-body); font-size: var(--step-1); font-weight: var(--weight-700); line-height: var(--leading-l); color: var(--secondary); }

.band--cmap { background: var(--bg); }
.band--cmap .band__inner { padding: 0 0 var(--space-3xl); }
.cmap { width: 100%; border-radius: var(--radius-l); overflow: hidden; }
.cmap iframe { display: block; width: 100%; max-width: 100%; height: 440px; border: 0; }

/* ── Legal pages ────────────────────────────────────────────────────────── */
.band.band--legalhero { padding-inline: 0; background: var(--sky); }   /* doubled class: the phone/tablet .band padding otherwise insets the photo; full-bleed at every width */
.band--legalhero img { display: block; width: 100%; height: auto; aspect-ratio: 1667 / 850; object-fit: cover; }   /* owner reference: 850 tall at 1667, cropped rather than the full 3:2 */
/* Legal pages, owner reference 2026-09-18: the document sits in a cream card that
 * rides up over the photo, on a ground that runs from the header's sky blue down
 * into the footer's navy so the two meet without a seam. */
.band--legal { background: linear-gradient(180deg, var(--sky) 0, var(--sky) 12%, var(--primary) 100%); }
.band--legal .shell { max-width: 1290px; }
.band--legal .band__inner { display: flow-root; padding: 0 0 var(--space-3xl); }   /* flow-root: without it the card's negative margin collapses through and drags the whole gradient band up over the photo */
.legal { position: relative; z-index: var(--layer-base); max-width: none; margin-top: calc(-2 * var(--space-3xl)); padding: var(--space-2xl) calc(var(--space-2xl) + var(--space-s)) var(--space-3xl); border-radius: var(--radius-l); background: var(--bg); box-shadow: 0 10px 30px color-mix(in srgb, var(--primary) 8%, transparent); }   /* 1290 card less 2 x ~100 padding keeps the 1090 measure */
.legal > .title { font-size: var(--step-6); }
.legal__body h2 { margin: var(--space-l) 0 var(--space-xs); font-family: var(--font-heading); font-size: var(--step-5); font-weight: var(--weight-600); line-height: var(--leading-s); color: var(--primary); }
.legal__body h3 { margin: var(--space-m) 0 var(--space-2xs); font-family: var(--font-heading); font-size: var(--step-3); font-weight: var(--weight-600); line-height: var(--leading-m); color: var(--primary); }
.legal__body { margin-top: var(--space-l); }
.legal__body h4 { margin: var(--space-2xs) 0 var(--space-xs); font-family: var(--font-heading); font-size: var(--step-5); font-weight: var(--weight-600); line-height: var(--leading-s); color: var(--primary); }
.legal__body h5 { margin: var(--space-2xs) 0 var(--space-xs); font-family: var(--font-heading); font-size: var(--step-4); font-weight: var(--weight-600); line-height: var(--leading-m); color: var(--primary); }
.legal__body p { margin: 0 0 var(--space-xs); }
.legal__body ul, .legal__body ol { margin: 0 0 var(--space-xs); padding-left: var(--space-s); }
.legal__body li { margin-bottom: 0; }
.legal__body a { color: var(--primary); }

/* ── Tablet (the source's 1024 breakpoint) ────────────────────────── */
/* Keeps the desktop nav on one row between the hamburger and full width */
@media (max-width: 1280px) {
    .contact { grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr); }
    .contact__copy { padding-right: var(--space-l); }   /* with the wider column, keeps the contact intro to two lines on laptops */
    .site-header { padding-inline: var(--space-2xs); }
    .topbar { gap: var(--space-2xs); }
    .site-logo { margin-left: 0; }
    .site-logo img { width: 220px; }
    .nav-link { margin: 0 var(--space-2xs); font-size: var(--step-0); }
}

@media (max-width: 1024px) {
    /* Inner pages: live collapses every inner band to one column at 1024. */
    .split, .split--wide, .split--teamsvc, .hpro-hero, .pphero, .chero, .docs { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
    .split--photo-left .split__photo, .curl--rev .curl__photo { order: -1; }
    .curl, .visit { grid-template-columns: minmax(0, 1fr); }
    .visit__photo img { border-radius: var(--radius-l); }
    .visit__card { position: static; width: auto; max-width: none; margin-top: var(--space-s); }
    .visit__copy { padding: var(--space-l) 0 0; }
    .curl__copy--pale, .curl--rev .curl__copy { border-radius: var(--radius-l); }
    .curl__photo img, .curl--rev .curl__photo img, .band--curl--hero .curl__photo img { border-radius: var(--radius-l); }
    .band--curl .curl__photo { order: -1; }
    /* Owner request 2026-09-18: when a page HERO stacks, the copy leads and the
     * photo follows - as the homepage already did. Mid-page bands keep photo-first. */
    .band--split--hero .split__copy, .band--svchero .split__copy, .pphero__copy { order: -2; }
    .band--curl--hero .curl__photo { order: 0; }
    .values, .formstrip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .value:nth-child(odd)::before { display: none; }
    .values { gap: var(--space-l) 0; padding: var(--space-l) 0; }
    .formstrip { gap: var(--space-l); padding: var(--space-xl) var(--space-l); }
    .prac-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .resources { grid-template-columns: minmax(0, 1fr); }
    .policies { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
    .band--docs { padding: var(--space-2xl) var(--space-l); }
    .band--teamsvc .band__inner, .band--policies .band__inner { padding: var(--space-2xl) 0; }
    .band--visit .band__inner { padding: var(--space-l) 0 var(--space-3xl); }
    /* type override removed: the scale is fluid and carries this */
    /* type override removed: the scale is fluid and carries this */
    .site-header { padding-inline: var(--space-2xs); }
    .topbar { gap: var(--space-2xs); }
    .site-logo { margin-left: 0; }
    .site-logo img { width: 190px; }   /* headroom for the one-row nav down to the 993px hamburger */
    .nav-link { margin: 0 var(--space-2xs); font-size: var(--step-0); }
    .band { padding-inline: var(--space-m); }
    .band__inner, .band--hero .band__inner, .band--quick .band__inner, .band--services .band__inner, .band--contact .band__inner { padding: var(--space-2xl) 0; }
    .hero { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
    .hero__copy { padding: 0; gap: var(--space-m); }
    /* Desktop's negative margins are tuned against a --space-l gap. Against the
     * --space-m gap here they overshoot and the note ran into the call button. */
    .hero__title, .hero__lede, .hero__note { margin: 0; }
    .hero__photo { min-height: 420px; }
    .footer-bar { grid-template-columns: minmax(0, 1fr); }
    .footer-bar__right { justify-content: flex-start; }
    .pphero { gap: var(--space-l); }
    .legal { margin-top: calc(-1 * var(--space-3xl)); padding: var(--space-xl) var(--space-l); }
    .band--legalhero img { aspect-ratio: 16 / 9; }
    .band--curl--hero .curl__copy { padding: 0 var(--space-m) var(--space-l); }   /* stacked, copy first: clear the photo below, align with its inset */
    .pphero__copy .title--hero, .curl--faq .curl__copy .title--band, .band--curl--hero .curl__copy .title--band, .services-head__left .title--band { max-width: none; }
    .curl--faq .curl__copy > * { max-width: none; }
    .curl--faq.curl--stagger .curl__photo img { aspect-ratio: 4 / 3; }
    .services-head__left:has(.title--band) + .services-head__right .lede { text-align: left; }
    .docs--photo-left .docs__photo { order: 0; }
    .docs__photo img { aspect-ratio: 4 / 3; }
    .mission-cols, .teamsvc-cols { grid-template-columns: minmax(0, 1fr); gap: var(--space-m); }
    .mission-cols { margin-top: var(--space-l); }
    .curl--stagger .curl__copy { margin-bottom: 0; }
    .curl--stagger .curl__photo { margin-top: 0; }
    .split__copy .title--hero, .hpro-hero__copy .title--hero { max-width: none; }
    .hpro-hero__photo img { aspect-ratio: 4 / 3; }
    .prac-grid { gap: var(--space-xl) var(--space-s); }
    .pol-head { grid-template-columns: minmax(0, 1fr); gap: var(--space-m); }   /* two fixed columns overprinted the title on the lede below 1024 */
    .quick { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l) 0; padding: var(--space-l) 0; }
    .quick li:nth-child(odd)::before { display: none; }
    .quick li { padding: 0 var(--space-l); }
    .options { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); }
    .team { flex-direction: column; gap: var(--space-l); }
    .team__photos { flex: none; }
    .team__copy { padding-left: 0; }
    .help { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-l); }
    .help .title { grid-row: auto; grid-column: 1 / -1; }
    .services-head { flex-direction: column; gap: var(--space-m); padding-bottom: var(--space-l); }
    .services-head__left, .services-head__right { flex: none; }
    .services-head__right { align-items: flex-start; padding-top: 0; }
    .svc-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .accred { grid-template-columns: minmax(0, 1fr); }
    .accred__photo { min-height: 420px; border-radius: 0; }
    .accred__copy { padding: var(--space-xl) var(--space-m); }
    .contact { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
    .contact__copy { gap: var(--space-l); padding-right: 0; }
    .contact__map { min-height: 0; }
    .contact__map iframe { position: static; height: 450px; }
    .footer-inner { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); padding: var(--space-l) 0; }
    .footer-nav { padding-left: 0; }
    .site-footer { padding-inline: var(--space-m); }
}

/* ── Mobile (the source's 767 breakpoint) ─────────────────────────── */
/* Header collapses to the hamburger below 993px: six items, the logo and the
 * call button do not fit on one row any narrower. Same breakpoint as the
 * matchMedia in partials/scripts.html. */
@media (max-width: 992px) {
    .site-header { padding-inline: var(--space-s); }
    .topbar { flex-wrap: wrap; min-height: 65px; padding: var(--space-2xs) 0; }   /* lets the opened menu drop below the logo row */
    .site-logo img { width: 170px; }
    .nav-cta { margin-left: auto; padding: var(--space-2xs) var(--space-s); font-size: var(--step--1); }
    .nav-toggle,
    .site-search__open {   /* the search trigger is the same tile */
        -webkit-appearance: none;
        appearance: none;   /* so iOS Safari uses this radius rather than its own native button shape */
        display: inline-flex;
        flex: none;         /* never let the row squeeze it out of square */
        align-items: center;
        justify-content: center;
        width: 44px;
        height: 44px;       /* 44px touch target */
        aspect-ratio: 1;
        padding: 0;
        border: 0;
        border-radius: var(--radius-m);   /* owner request: a square with rounded corners, the site's 10px card radius - not a circle */
        background: var(--primary);
        color: var(--on-primary);
        cursor: pointer;
    }
    .nav-toggle svg, .site-search__open svg { width: 22px; height: 22px; fill: currentColor; }
    .nav-toggle__close { display: none; }
    .nav-toggle[aria-expanded="true"] .nav-toggle__open { display: none; }
    .nav-toggle[aria-expanded="true"] .nav-toggle__close { display: block; }
    .primary-nav { display: none; order: 4; flex: 0 0 100%; padding-bottom: var(--space-s); }   /* flex:1 zeroes the basis, so width:100% alone never took its own row */
    .primary-nav.is-open { display: flex; }
    .nav-list { flex-direction: column; width: 100%; }
    .nav-list > li { display: block; width: 100%; }
    .nav-list > li + li::before { display: none; }
    .nav-list > li.has-children { display: block; }
    .nav-link { justify-content: center; width: 100%; margin: 0; padding: var(--space-2xs) var(--space-s); }
    .sub-menu { position: static; box-shadow: none; border-radius: 0; background: var(--pale); }
    .has-children:hover > .sub-menu, .has-children:focus-within > .sub-menu { display: none; }
    .has-children.is-open > .sub-menu { display: block; }
    .sub-menu a { text-align: center; white-space: normal; }
}

/* Small phones: logo, call button, search and hamburger share one row.
 * 375-429: the call button keeps its "Please Call" label (the practice's
 * primary action) and gives up only its phone glyph and a step of side
 * padding, and the logo steps to 116px, so the row fits with the search tile
 * (9px spare at 375, measured 2026-10-05). Below 375 the button keeps its
 * glyph and accessible name and drops the visible label, at the full 44px. */
@media (max-width: 480px) {
    .site-logo img { width: 132px; }   /* 145 wrapped the row at 375 once the hamburger grew to its 44px target */
    .topbar { gap: var(--space-3xs); }
}
@media (min-width: 375px) and (max-width: 429px) {
    .site-logo img { width: 116px; }
    .nav-cta { padding-inline: var(--space-xs); }
    .nav-cta .btn__icon { display: none; }
}
@media (max-width: 374px) {
    .nav-cta { width: var(--target-min); height: var(--target-min); padding: 0; }
    .nav-cta span { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
}

@media (max-width: 767px) {

    .ticklist--two, .res-cards, .docs__grid, .cform__row { grid-template-columns: minmax(0, 1fr); }
    .values, .formstrip, .prac-grid { grid-template-columns: minmax(0, 1fr); }
    .curl__copy { padding: var(--space-l) var(--space-s); }
    .visit__copy { padding: var(--space-l) var(--space-s) 0; }
    .visit__card { margin-inline: var(--space-s); padding: var(--space-m); }
    .band--docs { padding: var(--space-xl) var(--space-s); }
    .docs__copy { padding: 0; }
    .value { padding: 0 var(--space-m); }
    .legal { margin-top: calc(-1 * var(--space-xl)); padding: var(--space-l) var(--space-s); }
    .legal__body h2 { font-size: var(--step-4); }
    .band--curl--hero .curl__copy { padding: 0 var(--space-s) var(--space-m); }
    .chero__form { align-items: center; text-align: center; }   /* owner request: contact page centred on phones */
    .chero__form .cform { text-align: left; }
    .chero__form .cform__submit { align-self: center; }
    .lede--ruled { padding-left: 0; }
    .lede--ruled::before { display: none; }
    .value + .value::before { display: none; }
    /* type override removed: the scale is fluid and carries this */
    /* type override removed: the scale is fluid and carries this */
    .band--seam { height: 90px; }
    .band--seam--thin { height: 60px; }
    .band { padding-inline: var(--space-s); }
    .band__inner, .band--hero .band__inner, .band--quick .band__inner, .band--services .band__inner, .band--contact .band__inner { padding: var(--space-xl) 0; }
    /* type override removed: the scale is fluid and carries this */
    .quick { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); padding: var(--space-l) 0; }
    .quick li + li::before { display: none; }
    .quick li { padding: 0 var(--space-s); }
    .options { grid-template-columns: minmax(0, 1fr); gap: var(--space-l); }
    .rule { margin: var(--space-l) 0; }
    .team__photos { gap: var(--space-xs); }
    .team__names { grid-template-columns: minmax(0, 1fr); gap: calc(2 * var(--space-3xs)); padding: 0; }   /* twice the step between items, so the two lists read as one */
    .help { grid-template-columns: minmax(0, 1fr); }
    .svc-grid { grid-template-columns: minmax(0, 1fr); }
    .svc-card { padding: var(--space-m) var(--space-s); gap: var(--space-m); }
    .svc-card__icon { margin-bottom: var(--space-xs); }
    .accred__copy { padding: var(--space-l) var(--space-s); }
    .accred__thumbs img { width: 100px; height: 100px; }
    .contact__grid { grid-template-columns: minmax(0, 1fr); }
    .contact__item--hospital, .contact__cta { grid-column: 1; grid-row: auto; }
    .contact__map iframe { height: 320px; }
    .site-footer { padding-inline: var(--space-s); }
    .footer-nav { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-m); }
    .footer-bar { grid-template-columns: minmax(0, 1fr); gap: var(--space-s); padding: var(--space-s) 0; }
    .footer-bar__right { flex-direction: column; align-items: flex-start; gap: var(--space-2xs); }
}

/* ── Entrance reveals ─────────────────────────────────────────────── */
/* Elements opt in with data-reveal="up|down|left|right|fade" and an optional
 * data-reveal-stagger="<ms>"; partials/scripts.html reveals them once, the
 * first time they enter the viewport, and never hides them again. Travel is
 * short on purpose — a nudge, not a slide. */
.js [data-reveal] {
    opacity: 0;
    transition: opacity 0.76s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0ms), transform 0.76s cubic-bezier(0.22, 1, 0.36, 1) var(--reveal-delay, 0ms);
    will-change: opacity, transform;
}
.js [data-reveal="up"]    { transform: translateY(26px); }
.js [data-reveal="down"]  { transform: translateY(-26px); }
.js [data-reveal="left"]  { transform: translateX(-18px); }
.js [data-reveal="right"] { transform: translateX(18px); }
.js [data-reveal="fade"]  { transform: none; }
.js [data-reveal][data-revealed] { opacity: 1; transform: none; }
.js [data-reveal][data-reveal-done] { will-change: auto; transition: none; }
@media (prefers-reduced-motion: reduce) {
    .js [data-reveal] { opacity: 1; transform: none; transition: none; }
}

/* ── Site search (2026-10-05) ─────────────────────────────────────────
 * mediflare.js writes the search box wherever the markup asks for one, as
 * plain HTML with mf-search__* class hooks and no styling; every rule here is
 * this site's, on its tokens. Two placements, swapping at the hamburger's own
 * breakpoint (992 / 993px), so no width shows both or neither:
 *
 *   desktop  .site-search: a navy magnifier between the nav and Please Call,
 *            opening a white panel like the sub-menus. The row has no room
 *            for a visible box; even the icon needs room made for it at
 *            993-1099 and 1281-1360 (see the end of this block).
 *   phones   .site-search__open: the hamburger's navy tile (it shares that
 *            rule), opening the full-screen overlay.
 *
 * The field is the site's pill, the shape of every button, on a white fill
 * with the contact fields' blue edge. Focus is ONE 2px blue ring laid over
 * that edge, as the contact form's own ring is blue. Search and Close are
 * .btn.btn--pill — see those rules.
 *
 * Style the overlay, the popup and the results ONLY through :not([hidden]).
 * Giving them a display of their own overrides the browser's
 * [hidden] { display: none } and they never close. */

/* The box, wherever it sits. */
.mf-search__form {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: var(--space-2xs);
    align-items: center;
}
.mf-search__status,
.mf-search__results { grid-column: 1 / -1; }
.mf-search__input { grid-column: 1 / -1; }
[data-mf-search-submit] .mf-search__input { grid-column: auto; }

/* Read out, not shown: the magnifier and the placeholder say what it is. */
.mf-search__label {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

/* The search field IS a contact-form field: its look is the --field-* tokens
 * (Form controls), never a rule here. */

.mf-search__status {
    margin: 0;
    padding-inline: var(--space-xs);   /* level with the result titles */
    font-size: var(--step--1);
    line-height: var(--leading-m);
    color: var(--ink);
}
.mf-search__status:empty { display: none; }

.mf-search__results { margin: 0; padding: 0; list-style: none; }
.mf-search__results:not([hidden]) {
    display: flex;
    flex-direction: column;
    gap: var(--space-3xs);
}
.mf-search__results .mf-search__link {
    display: block;
    padding: var(--space-2xs) var(--space-xs);
    color: var(--ink);
    text-decoration: none;
    overflow-wrap: anywhere;
    border-radius: var(--radius-m);
    transition: background var(--duration-fast) var(--ease-out);
}
.mf-search__results .mf-search__link:hover,
.mf-search__results .mf-search__link:focus-visible {
    color: var(--ink);
    text-decoration: none;
    background: var(--pale);
}
/* Inside a scrolling list an outset ring is clipped, so it sits inset. */
.mf-search__results .mf-search__link:focus-visible { outline-offset: calc(var(--border-medium) * -1); }

/* Titles in the site's navy serif; matches in the call button's yellow. */
.mf-search__title {
    display: block;
    font-family: var(--font-heading);
    font-weight: var(--weight-600);
    font-size: var(--step-1);
    line-height: var(--leading-s);
    color: var(--primary);
}
.mf-search__excerpt {
    display: block;
    margin-block-start: var(--space-3xs);
    font-size: var(--step--1);
    line-height: var(--leading-m);
    color: var(--ink);
}
.mf-search__excerpt mark {
    color: var(--ink);
    background: color-mix(in srgb, var(--tertiary) 70%, transparent);
    border-radius: var(--radius-xs);
}

/* Desktop: the magnifier between the nav and Please Call, and its panel. */
.site-search { display: none; position: relative; flex: none; }
@media (min-width: 993px) {
    .site-search { display: block; }
}
.site-search__toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    inline-size: var(--target-min);
    block-size: var(--target-min);
    list-style: none;
    color: var(--primary);
    border-radius: var(--radius-m);
    cursor: pointer;
    transition: color var(--duration-fast) var(--ease-out),
                background var(--duration-fast) var(--ease-out);
}
.site-search__toggle::-webkit-details-marker { display: none; }
.site-search__toggle svg { width: 20px; height: 20px; fill: currentColor; }
/* The nav links' own hover (blue), on the sub-menu items' pale tile. */
.site-search__toggle:hover,
.site-search[open] > .site-search__toggle { color: var(--secondary); background: var(--pale); }

.site-search__panel {
    position: absolute;
    inset-block-start: calc(100% + var(--space-2xs));
    inset-inline-end: 0;
    z-index: var(--layer-overlay);
    inline-size: min(var(--measure-tight), calc(100vw - 2 * var(--grid-gutter)));
    padding: var(--space-s);
    background: var(--surface);
    border-radius: var(--radius-m);
    box-shadow: 0 10px 30px color-mix(in srgb, var(--primary) 14%, transparent);   /* the sub-menus' shadow */
}
.site-search__panel .mf-search__form { row-gap: var(--space-xs); }
.site-search__panel .mf-search__results:not([hidden]) {
    max-block-size: 60dvh;
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* The overlay: full screen on the cream page ground. Close on its own row at
 * the top right (before the box, as the focus order runs), then the field and
 * Search, the status, and the results scrolling in the space left. Subgrid
 * puts the box's own children on this grid. */
.mf-search-overlay:not([hidden]) {
    position: fixed;
    inset: 0;
    z-index: var(--layer-modal);
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-rows: auto auto auto minmax(0, 1fr);
    gap: var(--space-s) var(--space-2xs);
    padding-block-start: max(var(--space-s), env(safe-area-inset-top));
    padding-inline: max(var(--space-s), env(safe-area-inset-left)) max(var(--space-s), env(safe-area-inset-right));
    background: var(--bg);
}
.mf-search-overlay__header {
    grid-column: 1 / -1;
    grid-row: 1;
    display: flex;
    justify-content: flex-end;
}
.mf-search--overlay,
.mf-search--overlay .mf-search__form {
    grid-column: 1 / -1;
    grid-row: 1 / -1;
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: subgrid;
    align-items: stretch;   /* the field and Search share one height */
}
.mf-search--overlay { grid-row: 2 / -1; }   /* below Close's row */
.mf-search--overlay .mf-search__input { grid-column: 1; grid-row: 1; }
.mf-search--overlay .mf-search__submit { grid-column: 2; grid-row: 1; }
.mf-search--overlay .mf-search__status { grid-column: 1 / -1; grid-row: 2; }
.mf-search--overlay .mf-search__results {
    grid-column: 1 / -1;
    grid-row: 3;
    min-block-size: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding-block-end: max(var(--space-s), env(safe-area-inset-bottom));
}

/* The phone tile's magnifier: the burger's tile, a lighter glyph than its
 * 22px lines, since the magnifier is a solid shape. */
@media (max-width: 992px) {
    .site-search__open svg { width: 18px; height: 18px; }
}

/* Room for the desktop magnifier. The nav is nowrap and centred in what the
 * logo and Please Call leave, and at two bands that space falls short of the
 * icon (measured 2026-10-05, with Please Call as wide as the phone number it
 * reveals on hover, which is the wider of its two labels):
 *   993-1099   The logo and Please Call keep the sizes they have just below,
 *              at 992 (170px logo, the compact call button), so the nav keeps
 *              its own spacing.
 *   1281-1360  The links' side margins take the compact header's step
 *              (--space-2xs); type, logo and button are untouched. */
@media (min-width: 993px) and (max-width: 1099px) {
    .site-logo img { width: 170px; }
    .nav-cta { padding: var(--space-2xs) var(--space-s); font-size: var(--step--1); }
}
@media (min-width: 1281px) and (max-width: 1360px) {
    .nav-link { margin: 0 var(--space-2xs); }
}

/* The phone/tablet row must not move when the menu opens (2026-10-05). The
 * topbar has a 65px minimum and centres a single line in it; once the open
 * menu adds a second line the first line shrank to its tallest item and every
 * button rose 2.5px. The logo now holds the first line at the full content
 * height (the 65px minimum less the bar's padding), open or closed. */
@media (max-width: 992px) {
    .site-logo { display: flex; align-items: center; min-height: calc(65px - 2 * var(--space-2xs)); }
}

/* Doctor photos come from the app (photo_url, #301), inside a .doctor-avatar box
 * that shows the fallback for a doctor without one. The box keeps the photo's own
 * size and shape, which .doctor-avatar would otherwise set. */
.prac .doctor-avatar { width: 150px; height: 150px; aspect-ratio: auto; border-radius: var(--radius-round); }
/* The fallback's gradient is for a doctor with no photo: under a photo it shows as
 * a hairline ring at the anti-aliased edge, so a box holding a photo has none. */
.doctor-avatar:has(img) { background: none; }
