/*
 * Site styles. There is 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.
 *
 * COLOUR, TYPE AND SPACE ARE DIALS (#426). The first section is Dials
 * (github.com/joops/dials), copied verbatim between its begin and end
 * markers. It works out every colour, text size, space size and
 * corner from a few values called dials. This site sets its own dials in ONE
 * short block straight after the section, "This site's dials", and that block
 * is the only place in the file where a colour or a scale value is typed.
 *
 *   - Change the look by changing a dial: --brand for the brand colour,
 *     --size-min/--size-max and --ratio-min/--ratio-max for the type scale,
 *     --leading-body for line height, --space-min/--space-max and
 *     --space-density for spacing, --radius-base for corners,
 *     --font-body/--font-heading for faces.
 *   - Everything else reads a token: --surface*, --text*, --border*, --link,
 *     --focus, --solid/--on-solid/--soft/--on-soft/--line (and the named
 *     groups --brand-*, --secondary-*, --tertiary-*, --success-* ...), --size-*,
 *     --leading, --space-*, --radius-*, --border-width-*. Never a hex, rgb(),
 *     hsl() or named colour, never a px/rem length, and never a typed line
 *     height, anywhere else. Weights and letter spacing are the site's own:
 *     a weight is a unitless number, letter spacing is in em.
 *   - The rules are in refs/design/DESIGN.md ("Dials"). Every dial, token
 *     and class is listed in the reference for the version in the section's
 *     first line: github.com/joops/dials/blob/v0.4.1/docs/tokens.md. A
 *     gradient, a wash or a quiet coloured border is a pattern built from
 *     tokens (that reference, "Patterns"), never a token of its own.
 *     check-system.sh holds the section to _template's copy word for word,
 *     and fails a raw colour outside the dials block.
 */

/* ═══ Dials ═══ dials:begin ═════════════════════════════════════════════
 * Dials v0.4.2, VERBATIM. Never edit anything between this marker and the
 * end marker: check-system.sh fails the site if its copy differs from
 * _template's by a word. Each marker appears once; never write either in
 * prose. Set dials in "This site's dials" below; an upgrade
 * of Dials is a template change plus a migration of every site.
 * ═══════════════════════════════════════════════════════════════════════ */
/*! Dials v0.4.2 | MIT | https://github.com/joops/dials */
/* Dials: an AI-first CSS framework. This file is dials-colour.css, then
   dials-scale.css, then the fallback for older browsers; dials-base.css is optional.
   Its defaults are the Default theme: the device's own faces, nothing to load.
   The Dials house theme is themes/dials.css.
*/
/* ============================================================
   Dials: colour (dials-colour.css)
   Dials: seven colours and a few numbers, the only typed values.
   Derived: surfaces, text, lines and groups, worked out live with
   color-mix() and relative colour, in light and dark.
   Groups: .is-{group} points the ungrouped tokens at a group.
   Dials live on :root (and :host); the derived chain is declared on
   :root, [data-dials] and :host, so setting a dial on any
   [data-dials] element re-derives every token inside it.
   Needs color-mix(), light-dark() and relative colour. Don't
   register these with @property: they must resolve where they're
   used, which is what makes .is-dark bands work.
   ============================================================ */
:root, :host {
  /* ---- Colour dials: any CSS colour, preferably HSL ---- */
  --brand:     hsl(221 83% 53%);  /* the main colour: links, focus, primary buttons */
  --secondary: hsl(262 52% 55%);  /* a second colour: highlights and secondary actions (was --accent) */
  --success:   hsl(142 64% 38%);  /* status: done, saved, live */
  --warning:   hsl(38 92% 50%);  /* status: check this */
  --danger:    hsl(0 72% 51%);  /* status: errors and destructive actions */
  --info:      hsl(199 89% 42%);  /* status: neutral news */
  --grey:      hsl(220 9% 50%);  /* the hue and strength of the tint in paper and ink */

  /* ---- Number dials ---- */
  --balance: 0;              /* 1: every fill at --fill-lightness, so they carry equal weight. 0: exactly as set */
  --fill-lightness: 0.52;    /* the shared OKLCH lightness used when --balance is 1 */
  --dark-lift: 0.06;         /* how much lighter the fills are in dark */
  --tint-strength: 10%;      /* how much colour goes into a soft tint */
  --tint-vividness: 1;       /* 1-3: how saturated soft tints are, for crisper pastels */
  --text-contrast: 0;        /* 0-30: strengthens body, muted and quiet text and strong borders, for paper and ink that sit close together */
  --white-text-until: 0.179; /* fills below this luminance get white text, above it black. 0.179 gives each fill whichever contrasts more; held between 0.175 and 0.18333, where both still give 4.5:1: black needs (L + 0.05) / 0.05 >= 4.5, so L >= 0.175; white needs 1.05 / (L + 0.05) >= 4.5, so L <= 1.05 / 4.5 - 0.05 = 0.18333 */

  /* ---- Paper and ink: near-white and near-black, tinted by --grey at these OKLCH lightnesses.
     To use exact colours instead, set --paper-light, --paper-dark, --ink-light and/or
     --ink-dark (unset by default) to any colour. ---- */
  --paper-lightness: 0.985;       /* page background in light */
  --paper-dark-lightness: 0.17;   /* page background in dark */
  --ink-lightness: 0.2;           /* strongest text in light */
  --ink-dark-lightness: 0.95;     /* strongest text in dark */
}

/* Follow the visitor's light or dark setting. To force one, set
   :root { color-scheme: light; } (or dark) after dials.css. */
:root { color-scheme: light dark; }

:root, [data-dials], :host {
  /* ---- Internal: paper, ink and the six fills, worked out from the dials ---- */
  --dl-paper-light: var(--paper-light, oklab(from var(--grey) var(--paper-lightness) calc(a * 0.12) calc(b * 0.12)));
  --dl-paper-dark:  var(--paper-dark,  oklab(from var(--grey) var(--paper-dark-lightness) calc(a * 0.15) calc(b * 0.15)));
  --dl-ink-light:   var(--ink-light,   oklab(from var(--grey) var(--ink-lightness) calc(a * 0.25) calc(b * 0.25)));
  --dl-ink-dark:    var(--ink-dark,    oklab(from var(--grey) var(--ink-dark-lightness) calc(a * 0.12) calc(b * 0.12)));
  --dl-paper: light-dark(var(--dl-paper-light), var(--dl-paper-dark));
  --dl-ink:   light-dark(var(--dl-ink-light), var(--dl-ink-dark));
  --dl-paper-grey: oklab(from var(--dl-paper) l 0 0);  /* paper without its tint: soft tints mix into this, so they keep their own hue */

  --dl-secondary-dial: var(--accent, var(--secondary));  /* --accent is --secondary's old name: while a site still sets it, it wins */
  --dl-brand-base:     oklab(from var(--brand)              calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-secondary-base: oklab(from var(--dl-secondary-dial)  calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-success-base:   oklab(from var(--success)            calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-warning-base:   oklab(from var(--warning)            calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-danger-base:    oklab(from var(--danger)             calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-info-base:      oklab(from var(--info)               calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
  --dl-brand:     light-dark(var(--dl-brand-base), oklab(from var(--dl-brand-base) calc(l + var(--dark-lift)) a b));
  --dl-secondary: light-dark(var(--dl-secondary-base), oklab(from var(--dl-secondary-base) calc(l + var(--dark-lift)) a b));
  --dl-success:   light-dark(var(--dl-success-base), oklab(from var(--dl-success-base) calc(l + var(--dark-lift)) a b));
  --dl-warning:   light-dark(var(--dl-warning-base), oklab(from var(--dl-warning-base) calc(l + var(--dark-lift)) a b));
  --dl-danger:    light-dark(var(--dl-danger-base), oklab(from var(--dl-danger-base) calc(l + var(--dark-lift)) a b));
  --dl-info:      light-dark(var(--dl-info-base), oklab(from var(--dl-info-base) calc(l + var(--dark-lift)) a b));

  /* ---- Surfaces ---- */
  --surface:         var(--dl-paper);                                            /* the page background */
  --surface-raised:  oklab(from var(--dl-paper) calc(l + 0.03) calc(a * 0.5) calc(b * 0.5));  /* cards, fields, popovers */
  --surface-lowered: color-mix(in oklab, var(--dl-ink) 4%, var(--dl-paper));     /* wells, table headers, quiet panels */
  --surface-sunken:  color-mix(in oklab, var(--dl-ink) 8%, var(--dl-paper));     /* code, inset areas, disabled fills */
  --surface-overlay: color-mix(in oklab, black 45%, transparent);                /* the scrim behind a dialog */

  /* ---- Text ---- */
  --text-strong:   var(--dl-ink);                                                                         /* headings, labels, emphasis */
  --text:          color-mix(in oklab, var(--dl-ink) calc(86% + var(--text-contrast) * 0.4%), var(--dl-paper));  /* body text */
  --text-muted:    color-mix(in oklab, var(--dl-ink) calc(70% + var(--text-contrast) * 1%), var(--dl-paper));    /* secondary text */
  --text-quiet:    color-mix(in oklab, var(--dl-ink) calc(64% + var(--text-contrast) * 1.2%), var(--dl-paper));  /* captions, dates, placeholders */
  --text-disabled: color-mix(in oklab, var(--dl-ink) 38%, var(--dl-paper));                                /* disabled controls: exempt from contrast rules */
  --link:          var(--brand-on-soft);                                                                  /* links: 4.5:1 on every surface */
  --link-hover:    light-dark(color(from var(--dl-brand-hover) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-brand-hover) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));  /* links on hover: a step stronger (the link 0.08 darker in OKLCH lightness in light, lighter in dark), and on to 7:1 if that's short */

  /* ---- Lines and effects ---- */
  --border-quiet:  color-mix(in oklab, var(--dl-ink) 7%, var(--dl-paper));   /* dividers that should barely show */
  --border:        color-mix(in oklab, var(--dl-ink) 13%, var(--dl-paper));  /* card and table borders: decorative */
  --border-strong: color-mix(in oklab, var(--dl-ink) calc(46% + var(--text-contrast) * 1%), var(--dl-paper));  /* field and control borders: 3:1 on surfaces */
  --focus:         var(--brand-on-soft);                                     /* the focus ring: opaque, 4.5:1 on surfaces */
  --selection:     color-mix(in oklab, var(--dl-brand) 22%, var(--dl-paper));  /* selected text background */
  --shadow-color:  light-dark(color-mix(in oklab, black 10%, transparent), color-mix(in oklab, black 45%, transparent));  /* the colour of shadows */
  --shadow-s: 0 1px 3px var(--shadow-color);    /* a slight lift: buttons, chips */
  --shadow-m: 0 4px 14px var(--shadow-color);   /* cards */
  --shadow-l: 0 12px 32px var(--shadow-color);  /* popovers, menus, dialogs */

  /* ---- Hover and pressed: the second half of a color-mix(), from Web Awesome.
     Use as color-mix(in oklch, var(--solid), var(--mix-hover)). The text colour's lightness is flipped
     in OKLab, keeping its a and b: grey text has no hue a browser will read back (Chrome 157 reads it
     as none, which paints pink), so this reads none. ---- */
  --mix-hover:  oklab(from currentColor calc(1 - l) a b) 12%;  /* hover: away from the text colour */
  --mix-active: oklab(from currentColor calc(1 - l) a b) 22%;  /* pressed: further still */

  /* ---- Groups: brand, secondary, neutral, success, warning, danger, info. Five roles each:
     solid      a solid fill
     on-solid   text on it: white or black, whichever contrasts more (its sRGB luminance, as painted, vs --white-text-until)
     soft       a tinted background: the colour, held at L 0.7 or lighter in light (0.6 or darker in dark), mixed in OKLab
                into paper with its own tint taken out, so a blue soft stays blue on cream paper. Its vividness scales
                the mix's a and b, never its chroma and hue: a tint is too pale to carry a hue a browser will read back
                (Chrome 157 reads it as none, which paints pink), so no colour here reads a hue from a mix or from paper
     on-soft    text on soft, and coloured text on the page: the fill, moved only as far as 4.5:1 needs
     line       borders, icons and large text (24px, or 18.66px bold, and up): the dial, moved only as far as 3:1 needs

     Coloured text and lines follow one rule: keep the colour, and move it only as far as its
     contrast target needs, on the least contrasting background it sits on: its own soft tint,
     --surface-lowered or --surface-raised (--surface always lies between them). Only its
     linear-light RGB is scaled, which keeps the channels' ratios, so hue and saturation stay
     (in dark, until a channel reaches 1).
     --link-hover is the same rule at 7:1, starting from the link a step stronger.
       Y   the colour's luminance, 0.2126 r + 0.7152 g + 0.0722 b in linear sRGB (clipped to sRGB first)
       Yb  that background's luminance, as painted (clipped to sRGB)
       T   the target, plus 0.1 headroom so painting in 8 bits can't round it under the line
       light: Yt = (Yb + 0.05) / (T + 0.1) - 0.05; scale r, g and b by min(1, Yt / Y)
       dark:  Yt = (T + 0.1) * (Yb + 0.05) - 0.05; scale r, g and b by max(1, Yt / Y), each capped
              at 1; if a capped channel leaves it short, mix towards white only as far as Yt needs:
              by (Yt - Y1) / (1 - Y1), where Y1 is the luminance after scaling
     A colour that already passes keeps its exact value. CSS works out a relative colour from
     one colour's channels only, so the steps carry their numbers in colours:
       --dl-surfaces-y       the luminance of --surface-lowered in green, of --surface-raised in blue
       --dl-{group}-under    plus the soft tint's in red, mixed 50/50: Yb is min(2r, 4g, 4b) in light, max in dark
       --dl-{group}-text,    the colour, mixed 50/50 with a black whose alpha is s Yt, where s is 3 in
       --dl-{group}-line,    light (Yt is at most 0.29 there) and 1 in dark: scaling it up means Firefox
       --dl-brand-hover      rounding a mix's alpha to three decimals costs a third as much. Mixing
                             premultiplies, so the mix has alpha a = (1 + s Yt) / 2 and channels c / 2a:
                             the colour's channels are r * 2a, and Yt is (2a - 1) / s
       on-soft, line, hover  unpack both and scale, as above ---- */
  --dl-surfaces-y: color-mix(in srgb-linear, color(from var(--surface-lowered) srgb-linear 0 calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0), color(from var(--surface-raised) srgb-linear 0 0 calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))));

--dl-brand-under: color-mix(in srgb-linear, color(from var(--brand-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-brand-text:  color-mix(in srgb-linear, color(from var(--dl-brand-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-brand-line:  color-mix(in srgb-linear, color(from var(--brand) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --brand-solid:    var(--dl-brand);
  --brand-on-solid: color(from var(--dl-brand) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --brand-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-brand) max(l, 0.7) a b), oklab(from var(--dl-brand) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --brand-on-soft:  light-dark(color(from var(--dl-brand-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-brand-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --brand-line:     light-dark(color(from var(--dl-brand-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-brand-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));

  --dl-secondary-under: color-mix(in srgb-linear, color(from var(--secondary-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-secondary-text:  color-mix(in srgb-linear, color(from var(--dl-secondary-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-secondary-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-secondary-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-secondary-line:  color-mix(in srgb-linear, color(from var(--dl-secondary-dial) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-secondary-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-secondary-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --secondary-solid:    var(--dl-secondary);
  --secondary-on-solid: color(from var(--dl-secondary) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --secondary-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-secondary) max(l, 0.7) a b), oklab(from var(--dl-secondary) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --secondary-on-soft:  light-dark(color(from var(--dl-secondary-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-secondary-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --secondary-line:     light-dark(color(from var(--dl-secondary-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-secondary-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));

  --neutral-solid:    var(--dl-ink);
  --neutral-on-solid: var(--dl-paper);
  --neutral-soft:     var(--surface-lowered);
  --neutral-on-soft:  var(--text);
  --neutral-line:     var(--border);

  --dl-success-under: color-mix(in srgb-linear, color(from var(--success-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-success-text:  color-mix(in srgb-linear, color(from var(--dl-success-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-success-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-success-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-success-line:  color-mix(in srgb-linear, color(from var(--success) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-success-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-success-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --success-solid:    var(--dl-success);
  --success-on-solid: color(from var(--dl-success) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --success-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-success) max(l, 0.7) a b), oklab(from var(--dl-success) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --success-on-soft:  light-dark(color(from var(--dl-success-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-success-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --success-line:     light-dark(color(from var(--dl-success-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-success-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));

  --dl-warning-under: color-mix(in srgb-linear, color(from var(--warning-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-warning-text:  color-mix(in srgb-linear, color(from var(--dl-warning-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-warning-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-warning-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-warning-line:  color-mix(in srgb-linear, color(from var(--warning) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-warning-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-warning-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --warning-solid:    var(--dl-warning);
  --warning-on-solid: color(from var(--dl-warning) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --warning-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-warning) max(l, 0.7) a b), oklab(from var(--dl-warning) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --warning-on-soft:  light-dark(color(from var(--dl-warning-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-warning-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --warning-line:     light-dark(color(from var(--dl-warning-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-warning-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));

  --dl-danger-under: color-mix(in srgb-linear, color(from var(--danger-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-danger-text:  color-mix(in srgb-linear, color(from var(--dl-danger-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-danger-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-danger-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-danger-line:  color-mix(in srgb-linear, color(from var(--danger) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-danger-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-danger-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --danger-solid:    var(--dl-danger);
  --danger-on-solid: color(from var(--dl-danger) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --danger-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-danger) max(l, 0.7) a b), oklab(from var(--dl-danger) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --danger-on-soft:  light-dark(color(from var(--dl-danger-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-danger-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --danger-line:     light-dark(color(from var(--dl-danger-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-danger-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));

  --dl-info-under: color-mix(in srgb-linear, color(from var(--info-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--dl-surfaces-y));
  --dl-info-text:  color-mix(in srgb-linear, color(from var(--dl-info-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-info-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--dl-info-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --dl-info-line:  color-mix(in srgb-linear, color(from var(--info) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-info-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--dl-info-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
  --info-solid:    var(--dl-info);
  --info-on-solid: color(from var(--dl-info) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
  --info-soft:     oklab(from color-mix(in oklab, light-dark(oklab(from var(--dl-info) max(l, 0.7) a b), oklab(from var(--dl-info) min(l, 0.6) a b)) var(--tint-strength), var(--dl-paper-grey)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
  --info-on-soft:  light-dark(color(from var(--dl-info-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-info-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --info-line:     light-dark(color(from var(--dl-info-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--dl-info-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
  --dl-brand-hover: color-mix(in srgb-linear, color(from light-dark(oklab(from var(--brand-on-soft) calc(l - 0.08) a b), oklab(from var(--brand-on-soft) calc(l + 0.08) a b)) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (7 + 0.1) - 0.05), 1))), color(from var(--dl-brand-under) srgb-linear 0 0 0 / calc(clamp(0, (7 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));

  /* ---- Ungrouped: components use these; .is-{group} points them at a group ---- */
  --solid:    var(--brand-solid);
  --on-solid: var(--brand-on-solid);
  --soft:     var(--brand-soft);
  --on-soft:  var(--brand-on-soft);
  --line:     var(--brand-line);

  /* ---- Deprecated: --accent's tokens, renamed --secondary-*. They still work; rename them ---- */
  --accent-solid:    var(--secondary-solid);     /* deprecated: use --secondary-solid */
  --accent-on-solid: var(--secondary-on-solid);  /* deprecated: use --secondary-on-solid */
  --accent-soft:     var(--secondary-soft);      /* deprecated: use --secondary-soft */
  --accent-on-soft:  var(--secondary-on-soft);   /* deprecated: use --secondary-on-soft */
  --accent-line:     var(--secondary-line);      /* deprecated: use --secondary-line */
}
.is-brand     { --solid: var(--brand-solid);     --on-solid: var(--brand-on-solid);     --soft: var(--brand-soft);     --on-soft: var(--brand-on-soft);     --line: var(--brand-line); }
.is-secondary { --solid: var(--secondary-solid); --on-solid: var(--secondary-on-solid); --soft: var(--secondary-soft); --on-soft: var(--secondary-on-soft); --line: var(--secondary-line); }
.is-neutral   { --solid: var(--neutral-solid);   --on-solid: var(--neutral-on-solid);   --soft: var(--neutral-soft);   --on-soft: var(--neutral-on-soft);   --line: var(--neutral-line); }
.is-success   { --solid: var(--success-solid);   --on-solid: var(--success-on-solid);   --soft: var(--success-soft);   --on-soft: var(--success-on-soft);   --line: var(--success-line); }
.is-warning   { --solid: var(--warning-solid);   --on-solid: var(--warning-on-solid);   --soft: var(--warning-soft);   --on-soft: var(--warning-on-soft);   --line: var(--warning-line); }
.is-danger    { --solid: var(--danger-solid);    --on-solid: var(--danger-on-solid);    --soft: var(--danger-soft);    --on-soft: var(--danger-on-soft);    --line: var(--danger-line); }
.is-info      { --solid: var(--info-solid);      --on-solid: var(--info-on-solid);      --soft: var(--info-soft);      --on-soft: var(--info-on-soft);      --line: var(--info-line); }
.is-accent    { --solid: var(--secondary-solid); --on-solid: var(--secondary-on-solid); --soft: var(--secondary-soft); --on-soft: var(--secondary-on-soft); --line: var(--secondary-line); }  /* deprecated: use .is-secondary */
/* A light or dark band: its own scheme, and its own background and text worked out in it */
.is-light { color-scheme: light; background-color: var(--surface); color: var(--text); }
.is-dark  { color-scheme: dark;  background-color: var(--surface); color: var(--text); }
/* ============================================================
   Dials: type and space (dials-scale.css)
   A few dials set every text size and every space size, the way
   Utopia (utopia.fyi) works them out, but the maths runs in the
   browser: change a dial and the whole scale follows. Leading is
   worked out the same way, for whatever size it's used at. This
   file sets no type on any element: only
   dials-base.css does that. Dials live on
   :root (and :host); the derived scale is declared on :root,
   [data-dials] and :host, so a dial set on a [data-dials] element
   re-derives the sizes inside it.
   ============================================================ */
:root, :host {
  /* ---- Dials ---- */
  --screen-min: 360;       /* the screen widths the scale runs between, in px */
  --screen-max: 1240;
  --size-min: 16;          /* body text at the narrowest and widest screens, in px */
  --size-max: 18;
  --ratio-min: 1.2;        /* each step is this much bigger than the last: 1.2 minor third, */
  --ratio-max: 1.25;       /* 1.25 major third, 1.333 perfect fourth, 1.5 fifth, 1.618 golden */
  --space-min: var(--size-min);  /* --space-s at each end, in px: follows body text */
  --space-max: var(--size-max);  /* size unless you set a number */
  --space-density: 1;      /* scales every space size: 0.8 compact, 1.25 roomy */
  --radius-base: 10;       /* corner radius of cards and fields, in px (a number, not a length) */

  /* Faces: set per site, and load them yourself (each theme file names its Google Fonts link) */
  --font-body: ui-sans-serif, system-ui, sans-serif;  /* body text and controls */
  --font-heading: ui-sans-serif, system-ui, sans-serif;  /* headings */
  --font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;  /* code, kbd, samp, pre */

  /* Border widths: every border and outline uses one of these */
  --border-width-s: 1px;   /* hairlines: cards, fields, tables */
  --border-width-m: 2px;   /* emphasis; outline offsets */
  --border-width-l: 3px;   /* focus rings, quote bars, active tabs */

  /* ---- Leading: one dial for the rhythm of the type ---- */
  /* --leading-body: 1.5;      line height at body size (--size-0), unitless. Every larger size keeps the same gap between lines, so it gets proportionally tighter; the space after paragraphs is one body line */
  /* --font-accent: var(--font-body);  a third face, for ledes, pull quotes or buttons; read it as var(--font-accent, var(--font-body)) */
}

:root, [data-dials], :host {
  /* ---- Internal: worked out from the dials, never edited by hand ---- */
  --dl-screen-range: calc(var(--screen-max) - var(--screen-min));
  --dl-fluid: calc((100vw - var(--screen-min) * 1px) / var(--dl-screen-range) * 16);  /* 0 at the narrowest, 16px at the widest */
  --dl-min-0: calc(var(--size-min) / 16);
  --dl-max-0: calc(var(--size-max) / 16);
  --dl-min--1: calc(var(--dl-min-0) / var(--ratio-min));
  --dl-max--1: calc(var(--dl-max-0) / var(--ratio-max));
  --dl-min--2: calc(var(--dl-min--1) / var(--ratio-min));
  --dl-max--2: calc(var(--dl-max--1) / var(--ratio-max));
  --dl-min-1: calc(var(--dl-min-0) * var(--ratio-min));
  --dl-max-1: calc(var(--dl-max-0) * var(--ratio-max));
  --dl-min-2: calc(var(--dl-min-1) * var(--ratio-min));
  --dl-max-2: calc(var(--dl-max-1) * var(--ratio-max));
  --dl-min-3: calc(var(--dl-min-2) * var(--ratio-min));
  --dl-max-3: calc(var(--dl-max-2) * var(--ratio-max));
  --dl-min-4: calc(var(--dl-min-3) * var(--ratio-min));
  --dl-max-4: calc(var(--dl-max-3) * var(--ratio-max));
  --dl-min-5: calc(var(--dl-min-4) * var(--ratio-min));
  --dl-max-5: calc(var(--dl-max-4) * var(--ratio-max));
  --dl-min-6: calc(var(--dl-min-5) * var(--ratio-min));
  --dl-max-6: calc(var(--dl-max-5) * var(--ratio-max));
  --dl-min-7: calc(var(--dl-min-6) * var(--ratio-min));
  --dl-max-7: calc(var(--dl-max-6) * var(--ratio-max));
  --dl-min-8: calc(var(--dl-min-7) * var(--ratio-min));
  --dl-max-8: calc(var(--dl-max-7) * var(--ratio-max));

  /* ---- Font sizes: --size-0 is body text; each number up or down is one step of the ratio,
     running in a straight line between its two ends ---- */
  --size--2: clamp(min(var(--dl-min--2), var(--dl-max--2)) * 1rem, var(--dl-min--2) * 1rem + (var(--dl-max--2) - var(--dl-min--2)) * var(--dl-fluid), max(var(--dl-min--2), var(--dl-max--2)) * 1rem);
  --size--1: clamp(min(var(--dl-min--1), var(--dl-max--1)) * 1rem, var(--dl-min--1) * 1rem + (var(--dl-max--1) - var(--dl-min--1)) * var(--dl-fluid), max(var(--dl-min--1), var(--dl-max--1)) * 1rem);
  --size-0: clamp(min(var(--dl-min-0), var(--dl-max-0)) * 1rem, var(--dl-min-0) * 1rem + (var(--dl-max-0) - var(--dl-min-0)) * var(--dl-fluid), max(var(--dl-min-0), var(--dl-max-0)) * 1rem);
  --size-1: clamp(min(var(--dl-min-1), var(--dl-max-1)) * 1rem, var(--dl-min-1) * 1rem + (var(--dl-max-1) - var(--dl-min-1)) * var(--dl-fluid), max(var(--dl-min-1), var(--dl-max-1)) * 1rem);
  --size-2: clamp(min(var(--dl-min-2), var(--dl-max-2)) * 1rem, var(--dl-min-2) * 1rem + (var(--dl-max-2) - var(--dl-min-2)) * var(--dl-fluid), max(var(--dl-min-2), var(--dl-max-2)) * 1rem);
  --size-3: clamp(min(var(--dl-min-3), var(--dl-max-3)) * 1rem, var(--dl-min-3) * 1rem + (var(--dl-max-3) - var(--dl-min-3)) * var(--dl-fluid), max(var(--dl-min-3), var(--dl-max-3)) * 1rem);
  --size-4: clamp(min(var(--dl-min-4), var(--dl-max-4)) * 1rem, var(--dl-min-4) * 1rem + (var(--dl-max-4) - var(--dl-min-4)) * var(--dl-fluid), max(var(--dl-min-4), var(--dl-max-4)) * 1rem);
  --size-5: clamp(min(var(--dl-min-5), var(--dl-max-5)) * 1rem, var(--dl-min-5) * 1rem + (var(--dl-max-5) - var(--dl-min-5)) * var(--dl-fluid), max(var(--dl-min-5), var(--dl-max-5)) * 1rem);
  --size-6: clamp(min(var(--dl-min-6), var(--dl-max-6)) * 1rem, var(--dl-min-6) * 1rem + (var(--dl-max-6) - var(--dl-min-6)) * var(--dl-fluid), max(var(--dl-min-6), var(--dl-max-6)) * 1rem);
  --size-7: clamp(min(var(--dl-min-7), var(--dl-max-7)) * 1rem, var(--dl-min-7) * 1rem + (var(--dl-max-7) - var(--dl-min-7)) * var(--dl-fluid), max(var(--dl-min-7), var(--dl-max-7)) * 1rem);  /* display type */
  --size-8: clamp(min(var(--dl-min-8), var(--dl-max-8)) * 1rem, var(--dl-min-8) * 1rem + (var(--dl-max-8) - var(--dl-min-8)) * var(--dl-fluid), max(var(--dl-min-8), var(--dl-max-8)) * 1rem);  /* display type: the top of the scale */

  /* ---- Leading: worked out for the size of the element it's used on ---- */
  /* --leading is a length: apply it on each element that sets a font size (dials-base.css applies it to every
     element), never on a wrapper for its children to inherit, where it would pass on one fixed length. */
  --dl-leading-body: var(--leading-body, 1.5);
  /* the body's gap between lines at every larger size (1em + the body gap), so bigger text gets proportionally
     tighter lines; smaller text keeps the body ratio; no size goes below 1.05 */
  --leading: max(1.05em, min(var(--dl-leading-body) * 1em, 1em + (var(--dl-leading-body) - 1) * var(--size-0)));  /* line height for the size it's on: the same gap between lines as body text at every larger size */
  --space-paragraph: calc(var(--dl-leading-body) * var(--size-0));  /* one body line: the space after paragraphs and other blocks; headings take two above and half below */

  /* ---- Space: multiples of the space base (Utopia's t-shirt sizes), times the density ---- */
  --dl-space-min: calc(var(--space-min) / 16 * var(--space-density));
  --dl-space-max: calc(var(--space-max) / 16 * var(--space-density));
  --space-3xs: clamp(calc(var(--dl-space-min) * 0.25rem), calc(var(--dl-space-min) * 0.25rem + (var(--dl-space-max) * 0.25 - var(--dl-space-min) * 0.25) * var(--dl-fluid)), calc(var(--dl-space-max) * 0.25rem));
  --space-2xs: clamp(calc(var(--dl-space-min) * 0.5rem), calc(var(--dl-space-min) * 0.5rem + (var(--dl-space-max) * 0.5 - var(--dl-space-min) * 0.5) * var(--dl-fluid)), calc(var(--dl-space-max) * 0.5rem));
  --space-xs: clamp(calc(var(--dl-space-min) * 0.75rem), calc(var(--dl-space-min) * 0.75rem + (var(--dl-space-max) * 0.75 - var(--dl-space-min) * 0.75) * var(--dl-fluid)), calc(var(--dl-space-max) * 0.75rem));
  --space-s: clamp(calc(var(--dl-space-min) * 1rem), calc(var(--dl-space-min) * 1rem + (var(--dl-space-max) * 1 - var(--dl-space-min) * 1) * var(--dl-fluid)), calc(var(--dl-space-max) * 1rem));
  --space-m: clamp(calc(var(--dl-space-min) * 1.5rem), calc(var(--dl-space-min) * 1.5rem + (var(--dl-space-max) * 1.5 - var(--dl-space-min) * 1.5) * var(--dl-fluid)), calc(var(--dl-space-max) * 1.5rem));
  --space-l: clamp(calc(var(--dl-space-min) * 2rem), calc(var(--dl-space-min) * 2rem + (var(--dl-space-max) * 2 - var(--dl-space-min) * 2) * var(--dl-fluid)), calc(var(--dl-space-max) * 2rem));
  --space-xl: clamp(calc(var(--dl-space-min) * 3rem), calc(var(--dl-space-min) * 3rem + (var(--dl-space-max) * 3 - var(--dl-space-min) * 3) * var(--dl-fluid)), calc(var(--dl-space-max) * 3rem));
  --space-2xl: clamp(calc(var(--dl-space-min) * 4rem), calc(var(--dl-space-min) * 4rem + (var(--dl-space-max) * 4 - var(--dl-space-min) * 4) * var(--dl-fluid)), calc(var(--dl-space-max) * 4rem));
  --space-3xl: clamp(calc(var(--dl-space-min) * 6rem), calc(var(--dl-space-min) * 6rem + (var(--dl-space-max) * 6 - var(--dl-space-min) * 6) * var(--dl-fluid)), calc(var(--dl-space-max) * 6rem));
  --space-4xl: clamp(calc(var(--dl-space-min) * 8rem), calc(var(--dl-space-min) * 8rem + (var(--dl-space-max) * 8 - var(--dl-space-min) * 8) * var(--dl-fluid)), calc(var(--dl-space-max) * 8rem));
  /* One-up pairs: small on phones, the next size up on desktops */
  --space-3xs-2xs: clamp(calc(var(--dl-space-min) * 0.25rem), calc(var(--dl-space-min) * 0.25rem + (var(--dl-space-max) * 0.5 - var(--dl-space-min) * 0.25) * var(--dl-fluid)), calc(var(--dl-space-max) * 0.5rem));
  --space-2xs-xs: clamp(calc(var(--dl-space-min) * 0.5rem), calc(var(--dl-space-min) * 0.5rem + (var(--dl-space-max) * 0.75 - var(--dl-space-min) * 0.5) * var(--dl-fluid)), calc(var(--dl-space-max) * 0.75rem));
  --space-xs-s: clamp(calc(var(--dl-space-min) * 0.75rem), calc(var(--dl-space-min) * 0.75rem + (var(--dl-space-max) * 1 - var(--dl-space-min) * 0.75) * var(--dl-fluid)), calc(var(--dl-space-max) * 1rem));
  --space-s-m: clamp(calc(var(--dl-space-min) * 1rem), calc(var(--dl-space-min) * 1rem + (var(--dl-space-max) * 1.5 - var(--dl-space-min) * 1) * var(--dl-fluid)), calc(var(--dl-space-max) * 1.5rem));
  --space-m-l: clamp(calc(var(--dl-space-min) * 1.5rem), calc(var(--dl-space-min) * 1.5rem + (var(--dl-space-max) * 2 - var(--dl-space-min) * 1.5) * var(--dl-fluid)), calc(var(--dl-space-max) * 2rem));
  --space-l-xl: clamp(calc(var(--dl-space-min) * 2rem), calc(var(--dl-space-min) * 2rem + (var(--dl-space-max) * 3 - var(--dl-space-min) * 2) * var(--dl-fluid)), calc(var(--dl-space-max) * 3rem));
  --space-xl-2xl: clamp(calc(var(--dl-space-min) * 3rem), calc(var(--dl-space-min) * 3rem + (var(--dl-space-max) * 4 - var(--dl-space-min) * 3) * var(--dl-fluid)), calc(var(--dl-space-max) * 4rem));
  --space-2xl-3xl: clamp(calc(var(--dl-space-min) * 4rem), calc(var(--dl-space-min) * 4rem + (var(--dl-space-max) * 6 - var(--dl-space-min) * 4) * var(--dl-fluid)), calc(var(--dl-space-max) * 6rem));
  --space-3xl-4xl: clamp(calc(var(--dl-space-min) * 6rem), calc(var(--dl-space-min) * 6rem + (var(--dl-space-max) * 8 - var(--dl-space-min) * 6) * var(--dl-fluid)), calc(var(--dl-space-max) * 8rem));
  /* Skip pairs, for gutters and section padding that need a bigger swing */
  --space-s-l: clamp(calc(var(--dl-space-min) * 1rem), calc(var(--dl-space-min) * 1rem + (var(--dl-space-max) * 2 - var(--dl-space-min) * 1) * var(--dl-fluid)), calc(var(--dl-space-max) * 2rem));
  --space-m-xl: clamp(calc(var(--dl-space-min) * 1.5rem), calc(var(--dl-space-min) * 1.5rem + (var(--dl-space-max) * 3 - var(--dl-space-min) * 1.5) * var(--dl-fluid)), calc(var(--dl-space-max) * 3rem));
  --space-l-2xl: clamp(calc(var(--dl-space-min) * 2rem), calc(var(--dl-space-min) * 2rem + (var(--dl-space-max) * 4 - var(--dl-space-min) * 2) * var(--dl-fluid)), calc(var(--dl-space-max) * 4rem));

  /* ---- Corners ---- */
  --radius-s: calc(var(--radius-base) * 0.5px);
  --radius-m: calc(var(--radius-base) * 1px);
  --radius-l: calc(var(--radius-base) * 1.6px);
  --radius-pill: 999px;
}
/* ============================================================
   Dials: the fallback (src/fallback.css, built into the end of dials.css)
   For browsers with color-mix() but without relative colour or
   light-dark(): Chrome and Edge 111-122, Safari 16.2-17, Firefox
   113-127. They can't work out the derived chain above, so this
   block works every public colour token out again from the same
   dials, with color-mix() alone. It comes after the chain and uses
   the same selectors, so it wins there; a site's own file, loaded
   after dials.css, still wins over it. It never sets a dial.
   Approximations, held to the same contrast as the chain (the
   contrast check's --fallback mode):
   - The page is light. .is-dark bands are dark, .is-light bands light.
   - Paper and ink come from --grey at fixed mixes, so the four
     lightness dials, --balance, --dark-lift, --tint-vividness and
     --text-contrast have no effect. --paper-light and friends do.
   - on-solid text can't follow the fill's luminance: each group has a
     fixed choice, and its fill is pulled a fixed amount towards the
     other end so the text keeps 4.5:1 in every Dials theme. White on
     brand, secondary, danger and info, whose fills are darkened; black
     on success, whose fill is lightened, and warning, as set.
   - Coloured text and lines can't move only as far as their target
     needs: on-soft is the dial mixed a fixed amount into ink (so --link
     and --focus too), line a smaller amount, and --link-hover further
     still. The amounts hold 4.5:1 and 3:1 on every surface and soft
     tint, for every theme and for extreme dials, so they over-shoot for
     most colours. Ink is near-black on a light page and near-white in an
     .is-dark band, so the same mix works in both.
   - No calc() and no percentages computed inside color-mix(): only
     literal percentages and dials that are one (--tint-strength).
   ============================================================ */
@supports not ((color: oklch(from red l c h)) and (color: light-dark(red, red))) {
  /* ---- Internal: the scheme switches, literal percentages a band can flip ---- */
  :root, :host, .is-light {
    color-scheme: light;
    --dl-fb-dark: 0%;     /* how much of the dark paper and ink to use */
    --dl-fb-raise: 38%;   /* how much white lifts --surface-raised */
    --dl-fb-shadow: 10%;  /* the strength of shadows */
  }
  .is-dark {
    color-scheme: dark;
    --dl-fb-dark: 100%;
    --dl-fb-raise: 4%;
    --dl-fb-shadow: 45%;
  }

  /* Bands are declared here too, so every token is worked out again in a band's own scheme */
  :root, [data-dials], :host, .is-light, .is-dark {
    /* ---- Internal: paper, ink and the six fills ---- */
    --dl-paper-light: var(--paper-light, color-mix(in oklab, var(--grey) 20%, white));
    --dl-paper-dark:  var(--paper-dark,  color-mix(in oklab, var(--grey) 30%, black));
    --dl-ink-light:   var(--ink-light,   color-mix(in oklab, var(--grey) 34%, black));
    --dl-ink-dark:    var(--ink-dark,    color-mix(in oklab, var(--grey) 17%, white));
    --dl-paper: color-mix(in oklab, var(--dl-paper-dark) var(--dl-fb-dark), var(--dl-paper-light));
    --dl-ink:   color-mix(in oklab, var(--dl-ink-dark) var(--dl-fb-dark), var(--dl-ink-light));
    --dl-brand:   color-mix(in oklab, var(--brand) 72%, black);
    --dl-secondary: color-mix(in oklab, var(--accent, var(--secondary)) 67%, black);
    --dl-success: color-mix(in oklab, var(--success) 85%, white);
    --dl-warning: var(--warning);
    --dl-danger:  color-mix(in oklab, var(--danger) 78%, black);
    --dl-info:    color-mix(in oklab, var(--info) 61%, black);

    /* ---- Surfaces ---- */
    --surface:         var(--dl-paper);
    --surface-raised:  color-mix(in oklab, white var(--dl-fb-raise), var(--dl-paper));
    --surface-lowered: color-mix(in oklab, var(--dl-ink) 4%, var(--dl-paper));
    --surface-sunken:  color-mix(in oklab, var(--dl-ink) 8%, var(--dl-paper));
    --surface-overlay: color-mix(in oklab, black 45%, transparent);

    /* ---- Text: a step stronger than the chain's defaults, to cover --text-contrast ---- */
    --text-strong:   var(--dl-ink);
    --text:          color-mix(in oklab, var(--dl-ink) 94%, var(--dl-paper));
    --text-muted:    color-mix(in oklab, var(--dl-ink) 89%, var(--dl-paper));
    --text-quiet:    color-mix(in oklab, var(--dl-ink) 86%, var(--dl-paper));
    --text-disabled: color-mix(in oklab, var(--dl-ink) 38%, var(--dl-paper));
    --link:          var(--brand-on-soft);
    --link-hover:    color-mix(in oklab, var(--brand) 20%, var(--dl-ink));

    /* ---- Lines and effects ---- */
    --border-quiet:  color-mix(in oklab, var(--dl-ink) 7%, var(--dl-paper));
    --border:        color-mix(in oklab, var(--dl-ink) 13%, var(--dl-paper));
    --border-strong: color-mix(in oklab, var(--dl-ink) 64%, var(--dl-paper));
    --focus:         var(--brand-on-soft);
    --selection:     color-mix(in oklab, var(--brand) 22%, var(--dl-paper));
    --shadow-color:  color-mix(in oklab, black var(--dl-fb-shadow), transparent);
    --shadow-s: 0 1px 3px var(--shadow-color);
    --shadow-m: 0 4px 14px var(--shadow-color);
    --shadow-l: 0 12px 32px var(--shadow-color);
    --mix-hover:  black 12%;
    --mix-active: black 22%;

    /* ---- Groups: soft mixed into paper, on-soft and line mixed towards ink ---- */
    --brand-solid:    var(--dl-brand);
    --brand-on-solid: white;
    --brand-soft:     color-mix(in oklab, var(--brand) var(--tint-strength), var(--dl-paper));
    --brand-on-soft:  color-mix(in oklab, var(--brand) 26%, var(--dl-ink));
    --brand-line:     color-mix(in oklab, var(--brand) 40%, var(--dl-ink));

    --secondary-solid:    var(--dl-secondary);
    --secondary-on-solid: white;
    --secondary-soft:     color-mix(in oklab, var(--accent, var(--secondary)) var(--tint-strength), var(--dl-paper));
    --secondary-on-soft:  color-mix(in oklab, var(--accent, var(--secondary)) 26%, var(--dl-ink));
    --secondary-line:     color-mix(in oklab, var(--accent, var(--secondary)) 40%, var(--dl-ink));

    --neutral-solid:    var(--dl-ink);
    --neutral-on-solid: var(--dl-paper);
    --neutral-soft:     var(--surface-lowered);
    --neutral-on-soft:  var(--text);
    --neutral-line:     var(--border);

    --success-solid:    var(--dl-success);
    --success-on-solid: black;
    --success-soft:     color-mix(in oklab, var(--success) var(--tint-strength), var(--dl-paper));
    --success-on-soft:  color-mix(in oklab, var(--success) 26%, var(--dl-ink));
    --success-line:     color-mix(in oklab, var(--success) 40%, var(--dl-ink));

    --warning-solid:    var(--dl-warning);
    --warning-on-solid: black;
    --warning-soft:     color-mix(in oklab, var(--warning) var(--tint-strength), var(--dl-paper));
    --warning-on-soft:  color-mix(in oklab, var(--warning) 26%, var(--dl-ink));
    --warning-line:     color-mix(in oklab, var(--warning) 40%, var(--dl-ink));

    --danger-solid:    var(--dl-danger);
    --danger-on-solid: white;
    --danger-soft:     color-mix(in oklab, var(--danger) var(--tint-strength), var(--dl-paper));
    --danger-on-soft:  color-mix(in oklab, var(--danger) 26%, var(--dl-ink));
    --danger-line:     color-mix(in oklab, var(--danger) 40%, var(--dl-ink));

    --info-solid:    var(--dl-info);
    --info-on-solid: white;
    --info-soft:     color-mix(in oklab, var(--info) var(--tint-strength), var(--dl-paper));
    --info-on-soft:  color-mix(in oklab, var(--info) 26%, var(--dl-ink));
    --info-line:     color-mix(in oklab, var(--info) 40%, var(--dl-ink));

    /* ---- Ungrouped ---- */
    --solid:    var(--brand-solid);
    --on-solid: var(--brand-on-solid);
    --soft:     var(--brand-soft);
    --on-soft:  var(--brand-on-soft);
    --line:     var(--brand-line);

    /* ---- Deprecated: the old names for the secondary group ---- */
    --accent-solid:    var(--secondary-solid);
    --accent-on-solid: var(--secondary-on-solid);
    --accent-soft:     var(--secondary-soft);
    --accent-on-soft:  var(--secondary-on-soft);
    --accent-line:     var(--secondary-line);
  }
  /* the group classes again, so they still win on a [data-dials] element or a band */
  .is-brand     { --solid: var(--brand-solid);     --on-solid: var(--brand-on-solid);     --soft: var(--brand-soft);     --on-soft: var(--brand-on-soft);     --line: var(--brand-line); }
  .is-secondary { --solid: var(--secondary-solid); --on-solid: var(--secondary-on-solid); --soft: var(--secondary-soft); --on-soft: var(--secondary-on-soft); --line: var(--secondary-line); }
  .is-neutral   { --solid: var(--neutral-solid);   --on-solid: var(--neutral-on-solid);   --soft: var(--neutral-soft);   --on-soft: var(--neutral-on-soft);   --line: var(--neutral-line); }
  .is-success   { --solid: var(--success-solid);   --on-solid: var(--success-on-solid);   --soft: var(--success-soft);   --on-soft: var(--success-on-soft);   --line: var(--success-line); }
  .is-warning   { --solid: var(--warning-solid);   --on-solid: var(--warning-on-solid);   --soft: var(--warning-soft);   --on-soft: var(--warning-on-soft);   --line: var(--warning-line); }
  .is-danger    { --solid: var(--danger-solid);    --on-solid: var(--danger-on-solid);    --soft: var(--danger-soft);    --on-soft: var(--danger-on-soft);    --line: var(--danger-line); }
  .is-info      { --solid: var(--info-solid);      --on-solid: var(--info-on-solid);      --soft: var(--info-soft);      --on-soft: var(--info-on-soft);      --line: var(--info-line); }
  .is-accent    { --solid: var(--secondary-solid); --on-solid: var(--secondary-on-solid); --soft: var(--secondary-soft); --on-soft: var(--secondary-on-soft); --line: var(--secondary-line); }
}
/* Generated by tools/fallback.mjs from dials.css (src/colour.css 192f968f0b78d4df): the defaults in
   the light scheme. Don't edit. The last resort, for browsers without color-mix() (Chrome and Edge
   before 111, Safari before 16.2, Firefox before 113, all 2022 or older): they can't work anything
   out, so every colour token is flat and they get the house colours, light only. Colour dials have no
   effect there; type and space work as normal. */
@supports not (color: color-mix(in srgb, red, blue)) {
  :root, [data-dials], :host, .is-light, .is-dark {
    color-scheme: light;
    --surface: #f9fafc;
    --surface-raised: #feffff;
    --surface-lowered: #eef0f2;
    --surface-sunken: #e4e5e7;
    --surface-overlay: rgb(0 0 0 / 45%);
    --text-strong: #151619;
    --text: #2f3033;
    --text-muted: #505154;
    --text-quiet: #5d5e61;
    --text-disabled: #999a9d;
    --link: #2362e9;
    --link-hover: #0743c2;
    --border-quiet: #e7e8ea;
    --border: #d7d8db;
    --border-strong: #86878a;
    --focus: #2362e9;
    --selection: #c9dbfc;
    --shadow-color: rgb(0 0 0 / 10%);
    --shadow-s: 0 1px 3px rgb(0 0 0 / 10%);
    --shadow-m: 0 4px 14px rgb(0 0 0 / 10%);
    --shadow-l: 0 12px 32px rgb(0 0 0 / 10%);
    --mix-hover: black 12%;
    --mix-active: black 22%;
    --brand-solid: #2463eb;
    --brand-on-solid: #ffffff;
    --brand-soft: #e9f1ff;
    --brand-on-soft: #2362e9;
    --brand-line: #2463eb;
    --secondary-solid: #7c51c8;
    --secondary-on-solid: #ffffff;
    --secondary-soft: #f1eefc;
    --secondary-on-soft: #7c51c8;
    --secondary-line: #7c51c8;
    --neutral-solid: #151619;
    --neutral-on-solid: #f9fafc;
    --neutral-soft: #eef0f2;
    --neutral-on-soft: #2f3033;
    --neutral-line: #d7d8db;
    --success-solid: #239f50;
    --success-on-solid: #000000;
    --success-soft: #eaf4eb;
    --success-on-soft: #197c3d;
    --success-line: #229c4f;
    --warning-solid: #f59f0a;
    --warning-on-solid: #000000;
    --warning-soft: #faf1e7;
    --warning-on-soft: #976003;
    --warning-line: #bd7906;
    --danger-solid: #dc2828;
    --danger-on-solid: #ffffff;
    --danger-soft: #ffece9;
    --danger-on-soft: #d02525;
    --danger-line: #dc2828;
    --info-solid: #0c8eca;
    --info-on-solid: #000000;
    --info-soft: #e9f2f9;
    --info-on-soft: #0773a4;
    --info-line: #0c8eca;
    --accent-solid: #7c51c8;
    --accent-on-solid: #ffffff;
    --accent-soft: #f1eefc;
    --accent-on-soft: #7c51c8;
    --accent-line: #7c51c8;
  }
}
/* ═══ dials:end (Dials) ═════════════════════════════════════════════════ */

/* ═══ This site's dials ═════════════════════════════════════════════════
 * The ONLY place a colour or a scale value is typed. A site differs from
 * another in these values and nowhere else. The values below reproduce the
 * template's look before Dials (its --palette-*, --hue-* and --l-* dials);
 * change them to match the practice.
 *
 * Colours are HSL, which is the easiest to reason about ("the same teal, a
 * bit darker"); any CSS colour works, so a brand's own hex can go straight
 * into --brand. Dials works the rest out in OKLCH, and keeps every text
 * colour at 4.5:1 and every control border and focus ring at 3:1, in light
 * and dark.
 * ═══════════════════════════════════════════════════════════════════════ */
/* Cairns West Medical Centre: the logo's green and blue, a sky blue for decoration, Crimson Pro and Figtree.
 * Carried over from the signed-off offer preview (built on Dials v0.4.0), which typed only these dials. */
:root {
    /* Logo green #6C946C (hsl 120 16% 50%), deepened to 42% lightness so white text on its fill passes 4.5:1 */
    --brand: hsl(120 16% 42%);
    /* Logo blue #5078B4 (hsl 216 40% 51%), deepened to 49% so white text on its fill passes 4.5:1 */
    --secondary: hsl(216 40% 49%);
    /* The logo's wordmark green #2C482C, the template's third group (not used on the homepage) */
    --tertiary: hsl(120 24% 23%);
    --tertiary-is-light: 0%;
    /* A green-leaning grey: paper reads as a soft leaf-white, dark bands as deep forest */
    --grey: hsl(115 14% 45%);
    /* Paper a touch below white, so raised cards lift off it; ink near the logo's wordmark green */
    --paper-lightness: 0.972;
    --ink-lightness: 0.24;

    /* Type: Crimson Pro for headings, Figtree (a friendly sans) for reading; loaded in each page's head */
    --font-heading: "Crimson Pro", Georgia, serif;
    --font-body: "Figtree", ui-sans-serif, system-ui, sans-serif;
    --font-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
    --size-min: 17;
    --size-max: 19;
    /* A wide ratio at the top so the hero headline can be truly big */
    --ratio-min: 1.2;
    --ratio-max: 1.3;
    --leading-body: 1.55;
    --space-min: 16;
    --space-max: 22;
    /* Soft, generous corners; the leaf frames take theirs from the logo instead */
    --radius-base: 16;
}

/* ── The colour scheme ────────────────────────────────────────────────────
 * The page follows the device's light or dark setting: Dials' own
 * color-scheme: light dark (mf-websites#431). The visitor can override it
 * with the switcher in partials/header.html, which sets <html
 * data-scheme="light|dark"> (none = match the device); partials/
 * scheme-head.html applies a stored choice before first paint.
 *
 * Only where Dials can draw a dark page, under Dials' own condition:
 * elsewhere (Dials' fallback) the page is always light, the switcher stays
 * hidden, and a forced dark scheme would only darken the browser's own
 * controls on a light page.
 *
 * A site that should only ever be light (or dark) sets color-scheme on :root
 * in its dials block instead, and deletes the switcher and the scheme-head
 * include: a visitor must not be offered a choice the site does not honour. */
@supports (color: oklch(from red l c h)) and (color: light-dark(red, red)) {
    :root[data-scheme="light"] { color-scheme: light; }
    :root[data-scheme="dark"] { color-scheme: dark; }
}

/* ── The tertiary group ───────────────────────────────────────────────────
 * A third brand colour, typically doing button and CTA work, that is neither
 * a tint of the brand nor a status colour (practices routinely have one:
 * "Button Brown", "Morning Orange"). Dials has no third brand group, so the
 * template adds one with the same five roles, worked out the way Dials v0.2.0
 * works out its own groups (each formula is Dials' brand formula with the
 * tertiary colour in it), from public tokens only. Set --tertiary above;
 * never set these. class="is-tertiary" points --solid and friends at it,
 * like .is-secondary. Declared on bands too, so a band's group follows the
 * band's own scheme.
 *
 *   --tertiary-on-soft  the fill, moved only as far as 4.5:1 needs on the
 *                       least contrasting of its soft tint, --surface-lowered
 *                       and --surface-raised; a colour that passes is kept
 *   --tertiary-line     the dial, moved only as far as 3:1 needs, the same way
 *
 * Dials carries the numbers those two need in its internal --dl-* plumbing,
 * which nothing outside Dials may read, so the template works the same
 * numbers out again from public tokens in its own --tpl-* properties: the
 * luminance of --surface-lowered and --surface-raised (Dials' --dl-surfaces-y)
 * and of the soft tint, and the colour carrying its target. They are the
 * template's plumbing: never use or set a --tpl-* property anywhere else. */
:root, [data-dials], .is-light, .is-dark {
    --tpl-tertiary-base:  oklab(from var(--tertiary) calc(l + (var(--fill-lightness) - l) * var(--balance)) a b);
    --tertiary-solid:     light-dark(var(--tpl-tertiary-base), oklab(from var(--tpl-tertiary-base) calc(l + var(--dark-lift)) a b));
    --tertiary-on-solid:  color(from var(--tertiary-solid) srgb-linear calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) calc(clamp(0, (clamp(0.175, var(--white-text-until), 0.18333) - (0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))) * 1000000, 1)) / 1);
    --tertiary-soft:      oklab(from color-mix(in oklab, light-dark(oklab(from var(--tertiary-solid) max(l, 0.7) a b), oklab(from var(--tertiary-solid) min(l, 0.6) a b)) var(--tint-strength), oklab(from var(--surface) l 0 0)) l calc(a * var(--tint-vividness)) calc(b * var(--tint-vividness)));
    --tpl-surfaces-y:     color-mix(in srgb-linear, color(from var(--surface-lowered) srgb-linear 0 calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0), color(from var(--surface-raised) srgb-linear 0 0 calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1))));
    --tpl-tertiary-under: color-mix(in srgb-linear, color(from var(--tertiary-soft) srgb-linear calc(0.2126 * clamp(0, r, 1) + 0.7152 * clamp(0, g, 1) + 0.0722 * clamp(0, b, 1)) 0 0), var(--tpl-surfaces-y));
    --tpl-tertiary-text:  color-mix(in srgb-linear, color(from var(--tpl-tertiary-base) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--tpl-tertiary-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (4.5 + 0.1) - 0.05), 1))), color(from var(--tpl-tertiary-under) srgb-linear 0 0 0 / calc(clamp(0, (4.5 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
    --tpl-tertiary-line:  color-mix(in srgb-linear, color(from var(--tertiary) srgb-linear clamp(0, r, 1) clamp(0, g, 1) clamp(0, b, 1) / 1), light-dark(color(from var(--tpl-tertiary-under) srgb-linear 0 0 0 / calc(clamp(0, 3 * ((min(2 * r, 4 * g, 4 * b) + 0.05) / (3 + 0.1) - 0.05), 1))), color(from var(--tpl-tertiary-under) srgb-linear 0 0 0 / calc(clamp(0, (3 + 0.1) * (max(2 * r, 4 * g, 4 * b) + 0.05) - 0.05, 1)))));
    --tertiary-on-soft:   light-dark(color(from var(--tpl-tertiary-text) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--tpl-tertiary-text) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
    --tertiary-line:      light-dark(color(from var(--tpl-tertiary-line) srgb-linear calc(r * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(g * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) calc(b * 2 * alpha * min(1, (2 * alpha - 1) / 3 / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / 1), color(from color(from var(--tpl-tertiary-line) srgb-linear min(1, r * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, g * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) min(1, b * 2 * alpha * max(1, (2 * alpha - 1) / max(0.000001, 2 * alpha * (0.2126 * r + 0.7152 * g + 0.0722 * b)))) / alpha) srgb-linear calc(r + (1 - r) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(g + (1 - g) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) calc(b + (1 - b) * clamp(0, (2 * alpha - 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)) / max(0.000001, 1 - (0.2126 * r + 0.7152 * g + 0.0722 * b)), 1)) / 1));
}
.is-tertiary { --solid: var(--tertiary-solid); --on-solid: var(--tertiary-on-solid); --soft: var(--tertiary-soft); --on-soft: var(--tertiary-on-soft); --line: var(--tertiary-line); }
/* The tertiary group in older browsers: without relative colour or
 * light-dark() (iOS 16 and 17, Safari before 18, Chrome and Edge before 123,
 * Firefox before 128) the derivation above cannot be worked out, and Dials'
 * own fallback covers only Dials' groups. So, the way Dials' fallback does
 * its groups, under the same condition and with the same selectors as the
 * derivation: the five roles again with color-mix(in oklab, ...) alone, from
 * --tertiary and the paper (--surface) and ink (--text-strong) Dials'
 * fallback has already worked out. As in Dials v0.2.0's fallback, on-soft is
 * the colour mixed 26% into ink and the line 40% into ink; neither can move
 * only as far as it needs there, so both over-shoot for most colours.
 *
 * Text on the fill can't follow the fill's luminance there, so, as in Dials'
 * fallback, it is a fixed choice with the fill moved to suit it. Dials fixes
 * the choice per group (white on --brand pulled 72% towards black, black on
 * --warning as set); the tertiary is whatever colour the site gives it, so
 * the site fixes it with --tertiary-is-light in its dials block, a literal
 * percentage like Dials' own fallback switches: 0% (the default) is white on
 * the fill pulled 72% towards black, as Dials does --brand; 100% is black on
 * --tertiary as set, as Dials does --warning. A light --tertiary at 0% gets
 * white on a mid fill below 4.5:1, a dark one at 100% black on a dark fill:
 * check-contrast.mjs --fallback says which a site needs. */
@supports not ((color: oklch(from red l c h)) and (color: light-dark(red, red))) {
    :root, [data-dials], .is-light, .is-dark {
        --tertiary-solid:    color-mix(in oklab, var(--tertiary) var(--tertiary-is-light, 0%), color-mix(in oklab, var(--tertiary) 72%, black));
        --tertiary-on-solid: color-mix(in oklab, black var(--tertiary-is-light, 0%), white);
        --tertiary-soft:     color-mix(in oklab, var(--tertiary) var(--tint-strength), var(--surface));
        --tertiary-on-soft:  color-mix(in oklab, var(--tertiary) 26%, var(--text-strong));
        --tertiary-line:     color-mix(in oklab, var(--tertiary) 40%, var(--text-strong));
    }
}

/* ── The template's own tokens ────────────────────────────────────────────
 * What Dials does not cover: the measure, the grid, the shared control
 * corner, the tap target, layers and motion. None of them is a colour, a text
 * size or a space size. Line height is Dials' --leading; weights and letter
 * spacing are written on the elements that use them, as plain numbers and em
 * (the template's old --leading-*, --tracking-* and --weight-* are in "Old
 * names" below). */
:root {
    /* --- Weight -------------------------------------------------------- */
    /* THREE WEIGHTS, DELIBERATELY: 400 body, 600 emphasis (nav, labels,
     * buttons, eyebrows, strong) and 700 headline. A fourth needs a reason:
     * the face has a visibly distinct cut AND the three are not creating
     * enough contrast. A flat hierarchy is almost always a spacing or size
     * problem, not a weight problem. */

    /* --- Measure ------------------------------------------------------- */
    --measure: 65ch;                 /* body copy, where a container asks for it (.measure) */
    --measure-tight: 45ch;           /* card and caption copy */

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

    /* --- Corners beyond Dials' three ----------------------------------- */
    --radius-xs: calc(var(--radius-base) * 0.333px);  /* tags, inline chips, the focus ring: a third of --radius-m, so it follows --radius-base */
    --radius-round: 50%;                   /* avatars */
    --control-radius: var(--radius-s);     /* buttons AND fields: a site sets this once, both follow */

    /* --- Touch targets ------------------------------------------------- */
    /* The smallest box a finger hits reliably: 44px (WCAG 2.5.5, Apple's
     * HIG). A fixed dimension rather than spacing, so it does not scale. */
    --target-min: 2.75rem;

    /* --- Inset shadows, from Dials' --shadow-color ------------------------ */
    --shadow-inner-s: inset 0 1px 2px 0 var(--shadow-color);
    --shadow-inner-m: inset 0 2px 6px 0 var(--shadow-color);

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

/* ═══ Old names ═══ aliases:begin ═══════════════════════════════════════
 * The template's token names before Dials (#426), each pointing at the Dials
 * token that replaces it, so markup, the Form controls section and any site
 * layer written against them keep working until #427 migrates the live
 * sites. NEVER use one in new work: use the name on the right. Delete this
 * whole block (down to aliases:end) once nothing reads any of them.
 *
 * Declared on [data-dials] and the .is-light/.is-dark bands as well as
 * :root, so a re-themed scope's or a band's aliases follow its own dials and
 * scheme, as Dials' own tokens do (its fallback works them out again there). Names Dials took over with a new meaning are NOT
 * here: --surface is now the PAGE (the old raised --surface is
 * --surface-raised), --secondary is the second brand colour's dial (it used
 * to be its fill: that is --secondary-solid), --accent is that dial's old
 * Dials name (deprecated in Dials v0.2.0: never set it), --success/--warning/
 * --danger/--info/--tertiary are dials (the fill is --success-solid ...), and --border, --border-strong, --space-*,
 * --radius-s/m/l, --shadow-* and --font-* are Dials' own. The --u-*,
 * --palette-*, --hue-*, --chroma-*, --l-* and --scheme dials are gone: set
 * the Dials dials instead. */
:root, [data-dials], .is-light, .is-dark {
    --primary: var(--brand-solid);
    --primary-hover: light-dark(oklab(from var(--brand-solid) calc(l - 0.07) a b), oklab(from var(--brand-solid) calc(l + 0.07) a b));
    --primary-light: oklab(from var(--brand-solid) calc(l + 0.11) a b);
    --primary-muted: color-mix(in oklab, var(--brand-solid) 15%, var(--surface));
    --primary-pale: var(--brand-soft);
    --on-primary: var(--brand-on-solid);
    --secondary-hover: light-dark(oklab(from var(--secondary-solid) calc(l - 0.07) a b), oklab(from var(--secondary-solid) calc(l + 0.07) a b));
    --secondary-light: oklab(from var(--secondary-solid) calc(l + 0.11) a b);
    --secondary-pale: var(--secondary-soft);
    --on-secondary: var(--secondary-on-solid);
    --tertiary-hover: light-dark(oklab(from var(--tertiary-solid) calc(l - 0.07) a b), oklab(from var(--tertiary-solid) calc(l + 0.07) a b));
    --tertiary-pale: var(--tertiary-soft);
    --on-tertiary: var(--tertiary-on-solid);
    --accent-dark: var(--primary-hover);
    --accent-pale: var(--brand-soft);
    --success-pale: var(--success-soft);
    --warning-pale: var(--warning-soft);
    --danger-pale: var(--danger-soft);
    --info-pale: var(--info-soft);
    --ink-strong: var(--text-strong);
    --ink: var(--text);
    --ink-mid: var(--text-muted);
    --ink-soft: var(--text-quiet);
    --bg: var(--surface);
    --on-bg: var(--text);
    --on-surface: var(--text);
    --step--2: var(--size--2);
    --step--1: var(--size--1);
    --step-0: var(--size-0);
    --step-1: var(--size-1);
    --step-2: var(--size-2);
    --step-3: var(--size-3);
    --step-4: var(--size-4);
    --step-5: var(--size-5);
    --step-6: var(--size-6);
    --step-7: var(--size-7);
    --step-8: var(--size-8);
    --border-thin: var(--border-width-s);
    --border-medium: var(--border-width-m);
    --border-thick: var(--border-width-l);

    /* The template's type ladder before Dials v0.3 (#436), FROZEN at its old
     * values, so a site layer written against it renders exactly as it did.
     * They do not follow Dials, and the template reads none of them: line
     * height is var(--leading), and weights and letter spacing are plain
     * values on each element. check-system.sh accepts these values only
     * exactly as written here. */
    --weight-400: 400;
    --weight-600: 600;
    --weight-700: 700;
    --leading-xs: 1.05;
    --leading-s: 1.18;
    --leading-m: 1.3;
    --leading-l: 1.5;
    --leading-xl: 1.6;
    --tracking-xs: -0.02em;
    --tracking-s: -0.01em;
    --tracking-m: 0;
    --tracking-l: 0.04em;
    --tracking-xl: 0.08em;
}
/* ═══ aliases:end (Old names) ═══════════════════════════════════════════ */

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

/* Skip link. craft.md requires one as the first element in <body>; without a
 * rule here it renders as a visible link above the header on every site. It is
 * off-screen until focused, then a real control with a visible focus ring. */
.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: var(--layer-top, 2147483647);
    padding: var(--space-xs) var(--space-s);
    background: var(--solid);
    color: var(--on-solid);
    text-decoration: none;
    border-radius: 0 0 var(--radius-xs) 0;
}
.skip-link:focus, .skip-link:focus-visible {
    left: 0;   /* the ring is the global one, in Form controls & focus */
}

* { margin: 0; }

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

body {
    -webkit-font-smoothing: antialiased;   /* line height: the base layer's body rule, from --leading-body */
}

/* 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(--size-0);
    font-weight: 400;
    line-height: var(--leading-body);   /* a number, so it inherits as one; --leading is a length */
    color: var(--text);
    background: var(--surface);
}

/* 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: 700;
    line-height: var(--leading);        /* for each heading's own size: on the heading, never inherited */
    color: var(--text-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;
}

/* Display headings tighten a little, more the larger they are; tune to the
 * face (one with optical sizes may need none). */
h1, .h1 { font-size: var(--size-5); letter-spacing: -0.025em; }
h2, .h2 { font-size: var(--size-4); letter-spacing: -0.02em; }
h3, .h3 { font-size: var(--size-3); letter-spacing: -0.015em; }
h4, .h4 { font-size: var(--size-2); letter-spacing: -0.01em; }
h5, .h5 { font-size: var(--size-1); }
h6, .h6 {
    font-size: var(--size-0);
    letter-spacing: 0.04em;   /* capitals */
    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(--on-soft);   /* coloured text on the page */
}

/* 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(--size-1);
    line-height: var(--leading);
    color: var(--text-muted);
}

/* Small label above a heading. */
.eyebrow {
    display: block;
    margin-bottom: var(--space-2xs);
    font-size: var(--size--1);
    font-weight: 600;
    line-height: var(--leading);
    letter-spacing: 0.04em;   /* capitals */
    text-transform: uppercase;
    color: var(--on-soft);
}

small, .text-small { font-size: var(--size--1); line-height: var(--leading); }

strong, b { font-weight: 600; }

a {
    color: var(--link);
    text-decoration-thickness: var(--border-width-s);
    text-underline-offset: 0.15em;
    transition: color var(--duration-fast) var(--ease-out);
}
a:hover { color: var(--link-hover); }

/* The focus ring lives in "Form controls & focus" below. */

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 {
    /* The quote bar is a quiet border in the group's colour: Dials' subtle
     * border pattern (tokens.md, "A subtle border in a group's colour"),
     * declared here rather than at :root so it follows an .is-* class on the
     * quote. --line itself is a strong 3:1 line since Dials v0.2.0; 30% of
     * it keeps the bar about as light as it was before (the pattern's
     * example is 40%: a step darker). Decoration: no contrast promised. */
    --quote-bar: color-mix(in oklab, var(--line) 30%, var(--border));
    padding-left: var(--space-m);
    border-left: var(--border-width-l) solid var(--quote-bar);
    color: var(--text-muted);
    font-style: italic;
}

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

code, kbd, samp, pre {
    font-family: var(--font-mono);
    font-size: 0.9em;
}

/* Media ────────────────────────────────────────────────────────────────
 * Images carry NO radius and NO background plate by default.
 *
 * They used to. `img { border-radius: var(--radius-m); background: var(--surface-raised) }`
 * was added to fix one square photo on Wellbrook, and it cost far more than it
 * saved: every migration since has had to undo it, because a faithful clone of a
 * customer's live site decides its own corners, and the background plate fills
 * the transparent areas of every PNG and SVG — a logo on a dark footer renders
 * as a solid block. Ten of the thirteen sites on this box carried an override
 * for it before it was removed.
 *
 * A radius is a design decision belonging to the site's own stylesheet, next to
 * the cards it should match. Use .is-rounded (below) or a site-layer rule; do
 * not put it back here. */
img, picture, video, canvas, svg {
    height: auto;
}

/* Opt in where a photo should match the radius of the cards around it. */
img.is-rounded, .is-rounded img { border-radius: var(--radius-m); }

figure { margin-inline: 0; }

figcaption {
    margin-top: var(--space-2xs);
    font-size: var(--size--1);
    line-height: var(--leading);
    color: var(--text-quiet);
}

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

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

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

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

/* ═══ 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 0px 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-width-s) solid <colour> and
 *   --field-radius: 0px (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 0px.
 * - Colours follow the band. The colour tokens are declared on the page
 *   AND on every .is-light/.is-dark band and [data-dials] scope, as Dials
 *   declares its own: a browser on Dials' fallback (no relative colour)
 *   works a token out once per scope, so declared on :root alone a field
 *   in a dark band kept the light page's border and ring. A site that
 *   changes a field COLOUR sets it on the same four selectors, after this
 *   section (:root, [data-dials], .is-light, .is-dark { --field-...: ... }),
 *   or a band keeps the default. Sizes are set on :root only.
 * - A panel on a ground that is not a Dials surface (a brand fill) re-sets
 *   the leaf colour tokens on the container, never the rules:
 *     .brand-panel {
 *         --focus-ring: var(--brand-on-solid);
 *         --field-border: var(--brand-on-solid);
 *     }
 *   --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(--size-0), 1rem);  /* never below 16px, or iOS zooms the page on focus */
    --field-leading: var(--leading);              /* Dials' leading, worked out at the field's own size */
    --field-weight: 400;                          /* one weight wherever the field sits */
    --field-label-weight: 600;                    /* the label's weight: the site's emphasis weight */
    --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-border-w: var(--border-width-s);
    /* 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-w: var(--border-width-m);        /* >= --field-border-w, so the ring covers the border */
}

/* The colours, on the bands too (see above). */
:root, [data-dials], .is-light, .is-dark {
    --field-bg: var(--surface-raised);            /* fields sit on the raised surface, as cards do */
    --field-ink: var(--text);
    --field-border: var(--border-strong);         /* Dials' control border: 3:1 on every surface */
    --field-border-hover: var(--text-quiet);
    --field-placeholder: var(--text-quiet);
    --focus-ring: var(--focus);                   /* Dials' focus ring: >= 3:1 on every surface, light and dark */
}

/* 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(--size--1);
    font-weight: var(--field-label-weight);
    line-height: var(--leading);
    color: var(--text-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(--brand-solid); }

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; every one is at least
 * --target-min (44px) tall, the tap target. 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(--size--1);
    font-weight: 600;
    line-height: var(--leading);        /* at each button size's own font size (.btn--sm, .btn--lg) */
    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-width-s) 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(--solid);
    color: var(--on-solid);
}
/* Hover and pressed mix the fill away from its text colour (Dials' --mix-*),
 * so they work on every group: <a class="btn btn--primary is-tertiary">. */
.btn--primary:hover { background: color-mix(in oklch, var(--solid), var(--mix-hover)); color: var(--on-solid); }
.btn--primary:active { background: color-mix(in oklch, var(--solid), var(--mix-active)); color: var(--on-solid); }

.btn--secondary {
    background: transparent;
    border-color: var(--solid);
    color: var(--on-soft);
}
.btn--secondary:hover { background: var(--soft); color: var(--on-soft); }

.btn--ghost {
    background: transparent;
    color: var(--text-muted);
}
.btn--ghost:hover { background: var(--soft); color: var(--on-soft); }

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

/*
 * ON A BRAND-COLOURED GROUND
 *
 * A dark band is class="is-dark" on the section: Dials works every token out
 * again in the dark scheme, so the buttons above need nothing more. On a band
 * painted with a brand fill (background: var(--solid)) they invert instead:
 * the solid button goes to the raised surface, the outline picks up a
 * translucent edge in the fill's text colour. Put .on-dark on the button or
 * any ancestor.
 */
.on-dark .btn--primary,
.btn--primary.on-dark {
    background: var(--surface-raised);
    color: var(--on-soft);
}

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

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

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

.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-raised);
}

.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-raised);
    border: var(--border-width-s) 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 gradient
 * is Dials' band pattern (tokens.md, "Gradients are patterns"): from one
 * fill to another, decoration only, so no text is ever set on it.
 * The <img> has onerror="this.style.display='none'" which hides
 * the broken image, revealing this CSS background underneath.
 *
 * Derived from the site's own brand fill so a missing photo reads as part of
 * this practice rather than as a stray swatch.
 */
:root, [data-dials], .is-light, .is-dark {
    --avatar-shade: color-mix(in oklab, var(--brand-solid) 85%, black);   /* the avatar gradient's darker end: the brand fill, a step darker. color-mix() rather than relative colour, so Dials' fallback browsers draw it too */
}

.doctor-avatar {
    position: relative;
    aspect-ratio: 4 / 5;
    overflow: hidden;
    border-radius: var(--radius-s);
    background: linear-gradient(135deg, var(--avatar-shade), var(--brand-solid));
    display: flex;
    align-items: center;
    justify-content: center;
}

/* The silhouette is an icon on the brand fill, so it is drawn in the fill's
 * own text colour, --brand-on-solid, through a mask (the shape only), and
 * keeps 3:1 in light and dark. A white silhouette fell to 2.8:1 on a dark
 * page, where the fill is lifted (mf-websites#431). */
.doctor-avatar::after {
    content: "";
    position: absolute;
    width: 40%;
    height: 40%;
    background-color: var(--brand-on-solid);
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='black' 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") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='black' 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") center / contain no-repeat;
}

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

/* ── Images on a dark ground: twins ──────────────────────────────────────
 * Photos need nothing in dark. A logo or drawing made for a light ground
 * (dark lettering, a dark line) fades into a dark one, so it gets a
 * dark-ground TWIN: the same artwork with its dark parts made pale. Both go
 * in the markup, and CSS shows the one that suits the ground it sits on:
 *
 *     <img class="show-in-light" src="assets/images/logo.webp" alt="…">
 *     <img class="show-in-dark" src="assets/images/logo-dark.webp" alt="…" loading="lazy">
 *
 * The ground is the nearest .is-dark or .is-light band, else the page: dark
 * when the visitor chose Dark, or chose nothing on a dark device, and only
 * where Dials can draw a dark page. The other twin is display: none, so it
 * is out of the accessibility tree and, with loading="lazy", never fetched
 * until it is shown. Give both the same alt.
 *
 * These rules only ever HIDE, so each twin keeps whatever display the site
 * gives it. Never make a dark twin with filter: invert() or hue-rotate():
 * they turn the practice's colours into other colours (an all-white
 * knockout, brightness(0) invert(1), only where the practice's brand allows
 * one). On a band painted with a brand fill (.on-dark), put only the twin
 * that suits that fill. */
.is-dark .show-in-light:not(.is-dark .is-light *),
.is-light .show-in-dark:not(.is-light .is-dark *) { display: none; }

@supports not ((color: oklch(from red l c h)) and (color: light-dark(red, red))) {
    .show-in-dark:not(:is(.is-light, .is-dark) *) { display: none; }
}

@supports (color: oklch(from red l c h)) and (color: light-dark(red, red)) {
    :root[data-scheme="light"] .show-in-dark:not(:is(.is-light, .is-dark) *),
    :root[data-scheme="dark"] .show-in-light:not(:is(.is-light, .is-dark) *) { display: none; }

    @media not all and (prefers-color-scheme: dark) {
        :root:not([data-scheme]) .show-in-dark:not(:is(.is-light, .is-dark) *) { display: none; }
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme]) .show-in-light:not(:is(.is-light, .is-dark) *) { display: none; }
    }
}

/* The "Powered by Mediflare" logo in the footer is a pair of twins
 * (partials/footer.html), so it follows the footer's ground: a plain footer,
 * light or dark with the page, or a footer band (class="is-dark"). */
.powered-by img { display: inline; }

/* 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.
 *
 * Deliberately written against fallbacks rather than this site's own token
 * names - every site in the fleet has a different vocabulary, and a 404 that
 * silently loses its layout because one variable is spelt differently is
 * worse than one that is slightly plainer. */
.notfound {
    padding-block: var(--space-3xl) var(--space-2xl);
    text-align: center;
}
.notfound__inner { max-width: 46rem; margin-inline: auto; }
.notfound__code {
    font-size: var(--size-5);
    font-weight: 700;
    line-height: var(--leading);
    letter-spacing: -0.025em;
    margin: 0 0 var(--space-2xs);
    opacity: 0.55;
}
.notfound h1 { margin-top: 0; }
.notfound__lede { font-size: var(--size-1); line-height: var(--leading); 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-width-s) solid currentColor;
    border-color: color-mix(in oklab, currentColor 22%, transparent);
}
.notfound__links-title {
    font-size: var(--size-0);
    text-transform: uppercase;
    letter-spacing: 0.04em;   /* capitals */
    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);
    font-weight: 600;
}

/* ── Site search ──────────────────────────────────────────────────────
 * mediflare.js writes the search box wherever the markup asks for one, as
 * plain HTML with stable mf-search__* classes and NO styling. This is a
 * neutral base on the tokens above, so a new site inherits its own palette
 * and can restyle any of it freely in the site layer.
 *
 * The default (partials/header.html) is ONE overlay at every width, opened
 * by .search-trigger: a button drawn as a search field (magnifier and
 * "Search…") from 768px up, a 44px magnifier below. From 768px up the
 * overlay is a centred card over a dimmed page; below, it fills the screen.
 * The alternatives (an icon <details> panel, a visible header box with a
 * dropdown) are documented in /srv/sites/CLAUDE.md ("Site search"); the
 * dropdown's base is kept below because mediflare.js writes its hooks.
 *
 * Style the overlay and the dropdown popup ONLY through :not([hidden]).
 * Giving them a display of their own overrides the browser's
 * [hidden] { display: none }, and they then never close. */

/* The box, wherever it sits. LAYOUT ONLY: the field's look is the base rule
 * in "Form controls" above, exactly like every other field on the site. Do
 * not give .mf-search__input a border, radius, background or height here or
 * in the site layer -- change the --field-* tokens instead. */
.mf-search__form {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: var(--space-2xs);
    align-items: center;
}

.mf-search__label,
.mf-search__status,
.mf-search__results,
.mf-search__popup { grid-column: 1 / -1; }

.mf-search__label { margin-bottom: 0; }

/* Without a Search button the field takes the whole row. */
.mf-search__input { grid-column: 1 / -1; }
[data-mf-search-submit] .mf-search__input { grid-column: auto; }

.mf-search__submit {
    min-block-size: var(--field-h);   /* the field's height, so the row lines up */
    padding: 0 var(--space-s);
    font-weight: 600;
    line-height: var(--leading);
    color: var(--on-solid);
    background: var(--solid);
    border-radius: var(--control-radius);   /* the field beside it has the same corner */
    transition: background var(--duration-fast) var(--ease-out);
}
.mf-search__submit:hover { background: color-mix(in oklch, var(--solid), var(--mix-hover)); }

.mf-search__status {
    margin: 0;
    font-size: var(--size--1);
    line-height: var(--leading);
    color: var(--text-muted);
}
.mf-search__status:empty { display: none; }

.mf-search__results:not([hidden]) {
    display: flex;
    flex-direction: column;
    gap: var(--space-3xs);
}

.mf-search__link {
    display: block;
    padding: var(--space-2xs) var(--space-xs);
    border-radius: var(--radius-s);
    color: var(--text);
    text-decoration: none;
    overflow-wrap: anywhere;
    transition: background var(--duration-fast) var(--ease-out);
}
.mf-search__link:hover,
.mf-search__link:focus-visible {
    color: var(--on-soft);
    background: var(--soft);
}
/* Inside a scrolling list an outset ring is clipped, so it sits inset. */
.mf-search__link:focus-visible { outline-offset: calc(var(--border-width-m) * -1); }

.mf-search__title {
    display: block;
    font-weight: 700;
    line-height: var(--leading);
    color: var(--text-strong);
}

.mf-search__excerpt {
    display: block;
    margin-top: var(--space-3xs);
    font-size: var(--size--1);
    line-height: var(--leading);
    color: var(--text-muted);
}

.mf-search__excerpt mark {
    color: var(--text-strong);
    background: var(--selection);
    border-radius: var(--radius-xs);
}

/* In the header and the overlay the label is read out, not shown: the
 * placeholder says what the field is. Hidden visually, never removed. */
.mf-search--dropdown .mf-search__label,
.mf-search--overlay .mf-search__label {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
}

.mf-search__popup .mf-search__results:not([hidden]) {
    max-block-size: 60dvh;
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* The trigger, drawn as a search field: its border, background and corner
 * are the --field-* tokens, so it matches every field on the site. It is a
 * button, so its focus ring is the global one; only the offset moves onto
 * its border, as a field's does. The ellipsis is drawn, not spoken.
 *
 * In a tight header band shorten it rather than let it wrap the nav, the
 * booking button or the logo: drop the ellipsis (content: none) and step
 * the padding down, or use the 44px magnifier below. The header's height
 * must not change. */
.search-trigger {
    display: inline-flex;
    flex: none;
    align-items: center;
    gap: var(--space-2xs);
    min-inline-size: calc(var(--target-min) * 4);
    min-block-size: var(--field-h);
    padding: 0 var(--space-m) 0 var(--field-pad-inline);
    font-size: var(--size--1);
    line-height: var(--leading);
    white-space: nowrap;
    color: var(--text-muted);
    background: var(--field-bg);
    border: var(--field-border-w) solid var(--field-border);
    border-radius: var(--field-radius);
    cursor: pointer;
    transition: color var(--duration-fast) var(--ease-out),
                border-color var(--duration-fast) var(--ease-out),
                background var(--duration-fast) var(--ease-out);
}
.search-trigger svg { flex: none; }
.search-trigger__text::after { content: "…" / ""; }
.search-trigger:hover { border-color: var(--field-border-hover); }
.search-trigger:focus-visible { outline-offset: calc(var(--field-border-w) * -1); }

/* Phones: a 44px magnifier. The word stays as its name, hidden visually. */
@media (max-width: 767px) {
    .search-trigger {
        justify-content: center;
        min-inline-size: var(--target-min);
        min-block-size: var(--target-min);
        padding: 0;
        background: none;
        border-color: transparent;
        border-radius: var(--radius-s);
    }
    .search-trigger:hover {
        color: var(--on-soft);
        background: var(--soft);
        border-color: transparent;
    }
    .search-trigger__text {
        position: absolute;
        width: 1px;
        height: 1px;
        margin: -1px;
        padding: 0;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
    }
}

/* Alternative: a visible box whose results float beneath it. */
.mf-search--dropdown { position: relative; }

.mf-search__popup:not([hidden]) {
    position: absolute;
    inset-block-start: calc(100% + var(--space-3xs));
    inset-inline-end: 0;
    z-index: var(--layer-overlay);
    display: flex;
    flex-direction: column;
    gap: var(--space-2xs);
    inline-size: max(100%, min(var(--measure-tight), calc(100vw - 2 * var(--grid-gutter))));
    padding: var(--space-xs);
    background: var(--surface-raised);
    border: var(--border-width-s) solid var(--border);
    border-radius: var(--radius-m);
    box-shadow: var(--shadow-l);
}

/* The overlay. Phones: full screen. One row holds Close, the field and Search (Close
 * first, matching the focus order); the results scroll below it, within the
 * overlay. The page behind is locked by mediflare.js itself. Subgrid puts
 * the box's own children on the overlay's grid, so the results run the full
 * width rather than only under the field. */
.mf-search-overlay:not([hidden]) {
    position: fixed;
    inset: 0;
    z-index: var(--layer-modal);
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    grid-template-rows: auto auto minmax(0, 1fr);
    gap: var(--space-xs) var(--space-2xs);
    padding-block-start: max(var(--space-xs), 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(--surface);
}

.mf-search-overlay__header { display: contents; }

.mf-search-overlay__close {
    grid-column: 1;
    grid-row: 1;
    align-self: stretch;
    position: relative;
    z-index: var(--layer-base);   /* above the box, which spans this cell too */
    min-inline-size: var(--target-min);
    min-block-size: var(--target-min);
    padding-inline: var(--space-2xs);
    font-weight: 600;
    color: var(--text-muted);
    border-radius: var(--radius-s);
}
.mf-search-overlay__close:hover { color: var(--on-soft); background: var(--soft); }

.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;
    gap: normal;            /* the overlay's own gap; a different subgrid gap pads the edge row and pushes Search 2px past the field */
    align-items: stretch;   /* Close, the field and Search share one height */
}

.mf-search--overlay .mf-search__input { grid-column: 2; grid-row: 1; }
.mf-search--overlay .mf-search__submit { grid-column: 3; 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;
    align-self: stretch;
    min-block-size: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    padding-block-end: max(var(--space-s), env(safe-area-inset-bottom));
}

/* From 768px up the same overlay is a centred card (the DocSearch pattern),
 * offset from the top rather than vertically centred, so it grows downward
 * with its results up to max-block-size, past which they scroll inside it.
 * A press on the dimmed page closes it (mediflare.js, #249).
 *
 * Stacking: the backdrop is body::after at --layer-modal, above the sticky
 * header (--layer-nav) and any dropdown (--layer-overlay). The card sits one
 * above it: body::after follows the overlay in tree order, so at an equal
 * z-index it would paint over the card. */
@media (min-width: 768px) {
    .mf-search-overlay:not([hidden]) {
        inset: var(--space-2xl) 0 auto;
        z-index: calc(var(--layer-modal) + 1);
        inline-size: calc(100% - 2 * var(--space-m));
        max-inline-size: calc(var(--grid-max-width) / 2);
        max-block-size: calc(100dvh - 2 * var(--space-2xl));
        margin-inline: auto;
        padding: var(--space-s);
        background: var(--surface-raised);
        border-radius: var(--radius-l);
        box-shadow: var(--shadow-l);
    }

    .mf-search--overlay .mf-search__results { padding-block-end: 0; }

    html[data-mf-search-overlay="open"] body::after {
        content: "";
        position: fixed;
        inset: 0;
        z-index: var(--layer-modal);
        background: var(--surface-overlay);
        -webkit-backdrop-filter: blur(var(--space-3xs));
        backdrop-filter: blur(var(--space-3xs));
    }
}

/* Opening is a short fade and settle; closing is immediate, and under
 * reduced motion there is no animation at all. */
@media (min-width: 768px) and (prefers-reduced-motion: no-preference) {
    .mf-search-overlay:not([hidden]) { animation: search-card-in var(--duration-base) var(--ease-out); }
    html[data-mf-search-overlay="open"] body::after { animation: search-backdrop-in var(--duration-base) var(--ease-out); }
}

@keyframes search-card-in { from { opacity: 0; transform: scale(0.98); } }
@keyframes search-backdrop-in { from { opacity: 0; } }

/* ── Colour scheme switcher: UNSTYLED, each site styles it ───────────────
 * Light, Dark or Match device (mf-websites#431), in partials/header.html:
 * a labelled group of three buttons, the current one aria-pressed="true".
 * Its script sits beside it in the header; partials/scheme-head.html, in
 * every page's <head>, applies a stored choice before first paint.
 *
 * What follows is the MINIMUM to make it usable and accessible: every
 * button a 44px target with a visible border, the pressed one filled and
 * bold (not by colour alone), the global focus ring. It is deliberately
 * plain. EVERY SITE STYLES IT to suit its header, in the site's own part
 * of this file, from tokens: replace these rules rather than adding to them.
 * Icons, a compact icon button that opens the group as a menu (the script
 * supports one: see the comment in partials/header.html), its place in the
 * header and in the mobile menu are all the site's to decide. What must
 * survive any styling:
 *   - the hiding rule below keeps winning: the switcher shows ONLY where
 *     the head script set data-scheme-ui, i.e. where the browser can draw a
 *     dark page (relative colour and light-dark(), Dials' condition) and
 *     scripts run. Never give it a display rule that outranks it;
 *   - a visible label or an accessible name for the group, aria-pressed on
 *     each choice, a 44px target, the global focus ring (never a focus rule
 *     of its own), and the pressed state shown by more than colour. */
.scheme {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3xs);
}

:root:not([data-scheme-ui]) [data-scheme-switcher] { display: none; }

.scheme__label {
    margin: 0;
    font-size: var(--size--1);
    line-height: var(--leading);
    color: var(--text-muted);
}

.scheme__option {
    min-block-size: var(--target-min);
    padding-inline: var(--space-xs);
    font-size: var(--size--1);
    line-height: var(--leading);
    color: var(--text);
    background: none;
    border: var(--border-width-s) solid var(--border-strong);
    border-radius: var(--control-radius);
}

.scheme__option[aria-pressed="true"] {
    font-weight: 600;
    color: var(--on-soft);
    background: var(--soft);
    border-color: var(--line);
}

/* ── Connect widgets on a dark page ──────────────────────────────────────
 * The Your Health hub and the newsletter sign-up are drawn by the Connect
 * widget (connect.mediflare.cloud) in its own light colours, and it does not
 * follow the page's scheme: on a dark page its tabs and labels inherit pale
 * text on its own white cards. So the widgets stay light, always: the light
 * scheme and ink inside them, and on a dark page a light panel behind them,
 * drawn as a spread shadow so the layout does not move (proven on Wellbrook,
 * mf-websites#427). Put them on the page or a light band, never inside an
 * .is-dark band. Connect's chat and request windows draw their own colours
 * and need nothing. */
#mediflare-yourhealth-hub,
.mediflare-yourhealth-newsletter-signup {
    color-scheme: light;
    color: var(--text);
}

@supports (color: oklch(from red l c h)) and (color: light-dark(red, red)) {
    :root[data-scheme="dark"] :is(#mediflare-yourhealth-hub, .mediflare-yourhealth-newsletter-signup):not(:empty) {
        background: var(--surface);
        border-radius: var(--radius-m);
        box-shadow: 0 0 0 var(--space-s) var(--surface);
    }

    @media (prefers-color-scheme: dark) {
        :root:not([data-scheme="light"]) :is(#mediflare-yourhealth-hub, .mediflare-yourhealth-newsletter-signup):not(:empty) {
            background: var(--surface);
            border-radius: var(--radius-m);
            box-shadow: 0 0 0 var(--space-s) var(--surface);
        }
    }
}

/* ═══ Cairns West Medical Centre: the site layer ═════════════════════════
 * The offer preview's design ("The people of Cairns West", signed off 8 Nov 2026), rebuilt on the template:
 * every value is a Dials token or a site token below. Homepage, header and footer first; inner pages follow.
 * Fixed dimensions marked "geometry" are frame sizes, not spacing. */

:root {
  /* House colour: a light sky blue from the logo's blue, for the leaf shapes behind photos; decoration only, never
     behind text. Derived from the --secondary dial (the offer typed it as hsl(212 58% 76%) light, hsl(214 34% 44%) dark:
     these land on the same OKLCH values). Dark scheme: a deeper, quieter blue so it doesn't glare. */
  --sky: light-dark(oklch(from var(--secondary) 0.795 calc(c * 0.63) calc(h - 6)), oklch(from var(--secondary) 0.522 calc(c * 0.76) calc(h - 3)));
  /* Buttons and fields share one corner (the template's --control-radius): pill buttons, so pill fields.
     Set here, after the template's own tokens block, which declares its default. */
  --control-radius: var(--radius-pill);
  /* the leaf from the logo: two opposite corners round, two stay pointed (frame geometry) */
  --leaf: 50% 0 50% 0;
  --leaf-flip: 0 50% 0 50%;
  /* the leaf on small UI (nav states, buttons, options, badges, tags): a FIXED radius from the radius scale, so every
     leaf in a group has the same curve whatever its width. The % leaves above are for photo frames only. */
  --leaf-ui: var(--radius-l) 0 var(--radius-l) 0;
  --leaf-ui-flip: 0 var(--radius-l) 0 var(--radius-l);
  /* a card that echoes the leaf: big radius on two corners, a small one on the others */
  --leaf-card: var(--radius-l) var(--radius-s) var(--radius-l) var(--radius-s);
  --leaf-card-flip: var(--radius-s) var(--radius-l) var(--radius-s) var(--radius-l);
  /* the leaf on a big photo: a large FIXED radius on two opposite corners, so a whole photo loses only its corner tips */
  /* the leaf on a hero photo: round FIXED corners, so a tall photo isn't cut to an ellipse */
  --leaf-photo: calc(var(--radius-l) * 7) 0 calc(var(--radius-l) * 7) 0;
  --leaf-photo-flip: 0 calc(var(--radius-l) * 7) 0 calc(var(--radius-l) * 7);
  --leaf-wide: calc(var(--radius-l) * 4) var(--radius-s) calc(var(--radius-l) * 4) var(--radius-s);
  /* the sky blue, softened for big background shapes */
  --sky-wash: color-mix(in oklab, var(--sky) 60%, var(--surface));
  /* a hint of green for large background shapes */
  --leaf-wash: color-mix(in oklab, var(--brand-solid) 30%, var(--surface));
  /* the logo's own mark, traced from the real logo (asymmetric: the second leaf smaller and lower), as a mask
     for photo frames (frame geometry). The shape sits wholly inside its box, so it is never cut to a straight edge. */
  /* the content width */
  --content: 1350px;
  /* the template's container at the design's width: .u-container and .wrap draw the same box */
  --grid-max-width: calc(var(--content) + 2 * var(--space-m-xl));
  --grid-gutter: var(--space-m-xl);
}

/* ---------- base ---------- */
body {
  margin: 0;
  background: var(--surface);
  color: var(--text);
  font-family: var(--font-body);
  font-size: var(--size-0);
  line-height: var(--leading);
  -webkit-font-smoothing: antialiased;
}
img { display: block; max-inline-size: 100%; block-size: auto; }
a { color: var(--link); text-underline-offset: var(--border-width-l); }
a:hover { color: var(--link-hover); }
h1, h2, h3 {
  font-family: var(--font-heading);
  color: var(--text-strong);
  margin: 0;
  font-weight: 700;
  text-wrap: balance;
  letter-spacing: normal;
}
p { margin: 0; }
figure { margin: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }

.wrap {
  inline-size: 100%;
  max-inline-size: calc(var(--content) + 2 * var(--space-m-xl));
  margin-inline: auto;
  padding-inline: var(--space-m-xl);
}

.skip {
  position: absolute; inset-inline-start: var(--space-s); inset-block-start: calc(-1 * var(--space-3xl));
  background: var(--brand-solid); color: var(--brand-on-solid);
  padding: var(--space-xs) var(--space-s); border-radius: var(--radius-m); z-index: var(--layer-top);
}
.skip:focus { inset-block-start: var(--space-s); }

.icon {
  font-family: "Material Symbols Rounded";
  font-weight: normal; font-style: normal;
  font-size: 1.25em; /* icon glyph geometry: scales with the text it sits in */
  line-height: 1;
  font-variation-settings: "FILL" 1, "wght" 500, "GRAD" 0, "opsz" 24;
  display: inline-block;
  white-space: nowrap; word-wrap: normal; direction: ltr;
  -webkit-font-feature-settings: "liga"; font-feature-settings: "liga";
  vertical-align: -0.22em;
  inline-size: 1em; overflow: hidden;
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2xs);
  font-family: var(--font-body); font-weight: 700;
  font-size: var(--size-0); line-height: var(--leading);
  padding: var(--space-xs) var(--space-m);
  border-radius: var(--control-radius);
  text-decoration: none;
  border: var(--border-width-m) solid transparent;
  min-block-size: var(--target-min);
  transition: transform .2s ease, box-shadow .2s ease, background-color .2s ease;
}
.btn-solid { background: var(--solid); color: var(--on-solid); box-shadow: var(--shadow-s); }
.btn-solid:hover {
  /* hover: the fill shifted away from its text colour */
  background: color-mix(in oklab, var(--solid), var(--mix-hover));
  color: var(--on-solid); transform: translateY(calc(-1 * var(--space-3xs))); box-shadow: var(--shadow-m);
}
.btn-outline { background: transparent; color: var(--on-soft); border-color: var(--line); }
.btn-outline:hover { background: var(--soft); color: var(--on-soft); }
.btn-big { font-size: var(--size-1); line-height: var(--leading); padding: var(--space-s) var(--space-m); }
.btn-wide { inline-size: 100%; }

.text-link {
  display: inline-flex; align-items: center; gap: var(--space-3xs);
  font-weight: 700; color: var(--on-soft); text-decoration: none;
  padding-block: var(--space-xs);
  border-block-end: var(--border-width-m) solid var(--line);
}
.text-link:hover { color: var(--on-soft); gap: var(--space-xs); }

.eyebrow {
  display: inline-flex; align-items: center; gap: var(--space-2xs);
  font-size: var(--size--1); line-height: var(--leading); font-weight: 700;
  color: var(--brand-on-soft); background: var(--brand-soft);
  padding: var(--space-3xs) var(--space-s) var(--space-3xs) var(--space-xs);
  border-radius: var(--leaf-card);
  text-transform: none; letter-spacing: normal; margin: 0;
}
.eyebrow-plain { background: transparent; padding: 0; }

/* ---------- header ---------- */
.site-header {
  position: relative; z-index: var(--layer-nav);
  background: var(--surface);
  border-block-end: var(--border-width-s) solid var(--border);
  box-shadow: var(--shadow-s);
}
.header-row {
  display: flex; align-items: center; gap: var(--space-s);
  padding-block: var(--space-xs);
}
.brand-link { flex: none; display: block; padding-block: var(--space-2xs); }
.brand-link img {
  inline-size: 260px; /* logo geometry */
  mix-blend-mode: multiply; /* lets the logo's white JPEG ground take the paper colour */
}
.nav { margin-inline-start: auto; }
.nav ul { display: flex; gap: 0; }
.nav a {
  display: block; text-decoration: none;
  font-weight: 600; font-size: var(--size--1); line-height: var(--leading);
  color: var(--text-strong);
  padding: var(--space-xs) var(--space-s);
  border-radius: var(--leaf-ui); /* one shape in every state */
  transition: background-color .2s ease;
}
.nav a:hover { background: var(--surface-lowered); color: var(--text-strong); }
.nav a[aria-current="page"] {
  background: var(--brand-solid); color: var(--brand-on-solid);
  border-radius: var(--leaf-ui);
}
.header-book { flex: none; }

/* ---------- header sub-menus ---------- */
.nav .has-sub { position: relative; }
.nav-parent { display: flex; align-items: center; }
.nav-desktop .nav-parent > a { padding-inline-end: var(--space-3xs); }
.sub-toggle {
  display: grid; place-items: center;
  inline-size: var(--space-m); block-size: var(--space-l);
  padding: 0; border: 0; background: transparent; color: var(--text-strong);
  border-radius: var(--leaf-ui); cursor: pointer;
}
.sub-toggle:hover { background: var(--surface-lowered); }
.sub-toggle .icon { font-size: var(--size-0); transition: transform .2s ease; }
.has-sub.is-open .sub-toggle .icon { transform: rotate(180deg); }
/* a parent whose child page is open */
.nav a[aria-current="true"] { background: var(--brand-soft); color: var(--brand-on-soft); }
/* desktop: the parent link and its chevron share one leaf, so hover and the current state cover both */
.nav-desktop .nav-parent {
  border-radius: var(--leaf-ui); padding-inline-end: var(--space-3xs);
  transition: border-radius .2s ease, background-color .2s ease;
}
.nav-desktop .nav-parent > a, .nav-desktop .nav-parent > .sub-toggle,
.nav-desktop .nav-parent > a:hover, .nav-desktop .nav-parent > .sub-toggle:hover { background: transparent; border-radius: var(--leaf-ui); color: inherit; }
.nav-desktop .nav-parent { color: var(--text-strong); }
.nav-desktop .nav-parent:hover, .nav-desktop .has-sub.is-open > .nav-parent { background: var(--surface-lowered); border-radius: var(--leaf-ui-flip); }
.nav-desktop .nav-parent:has(> a[aria-current="true"]) { background: var(--brand-soft); color: var(--brand-on-soft); }
.nav-desktop .nav-parent:has(> a[aria-current="page"]) { background: var(--brand-solid); color: var(--brand-on-solid); border-radius: var(--leaf-ui); }
/* the panel: closed until hover, keyboard focus inside, or the chevron (no script needed for the first two) */
.nav-desktop .sub {
  display: none;
  position: absolute; z-index: var(--layer-overlay);
  inset-block-start: 100%; inset-inline-start: 0;
  min-inline-size: max-content;
  flex-direction: column; gap: var(--space-3xs);
  background: var(--surface-raised); color: var(--text);
  border: var(--border-width-s) solid var(--border);
  border-radius: var(--leaf-card);
  box-shadow: var(--shadow-l);
  padding: var(--space-2xs);
}
.nav-desktop .has-sub:is(:hover, :focus-within, .is-open):not(.is-dismissed) > .sub { display: flex; }
.nav .sub a { font-size: var(--size--1); line-height: var(--leading); min-block-size: 44px; /* tap target */ display: flex; align-items: center; }
/* the phone menu: children always shown, indented under their parent */
.nav-phone .sub {
  display: grid; gap: var(--space-3xs);
  margin: var(--space-3xs) 0 var(--space-2xs) var(--space-s);
  padding-inline-start: var(--space-s);
  border-inline-start: var(--border-width-m) solid var(--border);
}


/* ---------- hero ---------- */
.hero { position: relative; padding-block: var(--space-xl) 0; overflow-x: clip; }
.hero-grid {
  display: grid; grid-template-columns: 1fr 1fr; /* Crimson Pro is narrow enough for an even split */ gap: var(--space-xl);
  align-items: center;
}
.hero-copy { display: grid; gap: var(--space-m); justify-items: start; padding-block-end: var(--space-3xl); }
.hero h1 {
  font-size: var(--size-6); line-height: var(--leading);
  letter-spacing: -0.015em; font-weight: 700;
}
.lede { font-size: var(--size-1); line-height: var(--leading); color: var(--text); max-inline-size: 40ch; }
.actions { display: flex; flex-wrap: wrap; gap: var(--space-s); padding-block-start: var(--space-2xs); }

.collage { position: relative; align-self: stretch; }
.collage-photos {
  position: relative;
  aspect-ratio: 1 / 0.98; /* frame geometry */
}
.ph { position: absolute; overflow: hidden; box-shadow: var(--shadow-l); }
.ph img { inline-size: 100%; block-size: 100%; object-fit: cover; }
/* The hero collage as first composed, with one change: the small photo sits bottom-right, not top-left, so it
   covers no face (the staff photo's faces run across its middle; its bottom-right is navy uniform and desk).
   The timber and green leaves are mirrored with it, so the pair keeps its diagonal. */
.ph-main {
  inset: 2% 0 16% 12%;
  border-radius: var(--leaf);
  animation: rise .9s cubic-bezier(.2,.7,.2,1) both;
}
.ph-main img { object-position: 50% 28%; }
.ph-second {
  inline-size: 38%; aspect-ratio: 1;
  inset-inline-end: 0; inset-block-end: 0;
  border-radius: var(--leaf-flip);
  border: var(--space-2xs) solid var(--surface);
  animation: rise 1s .15s cubic-bezier(.2,.7,.2,1) both;
}
.ph-second img { object-position: 55% 62%; }
.leaf-blob { position: absolute; }
.leaf-blob-timber {
  inline-size: 44%; aspect-ratio: 1;
  inset-inline-start: -8%; inset-block-start: 2%;
  background: var(--sky-wash);
  border-radius: var(--leaf-flip);
}
.leaf-blob-green {
  inline-size: 30%; aspect-ratio: 1;
  inset-inline-end: -8%; inset-block-end: 28%;
  background: var(--leaf-wash);
  border-radius: var(--leaf);
}

@keyframes rise { from { transform: translateY(var(--space-l)) rotate(-1deg); } to { transform: none; } }

/* the floating hours card: rides over the photos and the seam into the green band */
.hours-card {
  position: absolute; z-index: var(--layer-raised);
  inset-inline-start: calc(-1 * var(--space-l));
  inset-block-end: calc(-1 * var(--space-2xl));
  inline-size: 66%;
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card);
  box-shadow: var(--shadow-l);
  padding: var(--space-m);
  display: grid; gap: var(--space-s);
  border-block-start: var(--space-3xs) solid var(--brand-line);
}
.hours-card h2 {
  font-size: var(--size-2); line-height: var(--leading);
  display: flex; align-items: center; gap: var(--space-2xs);
}
.hours-card h2 .icon { color: var(--brand-line); }
.hours { margin: 0; display: grid; gap: var(--space-3xs); }
.hours div {
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: 0 var(--space-s);
  border-block-end: var(--border-width-s) dashed var(--border);
  padding-block: var(--space-3xs);
}
.hours dt { font-weight: 600; color: var(--text-strong); }
.hours dd { margin: 0; font-variant-numeric: tabular-nums; }
.hours-note { font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }

/* ---------- facts: a green block with a curved top edge ---------- */
.facts {
  position: relative;
  background: var(--solid); color: var(--on-solid);
  padding-block: calc(var(--space-3xl) + var(--space-xl)) var(--space-2xl);
  /* an uneven curve along the top edge (frame geometry) */
  border-start-start-radius: 70% 8vw;
  border-start-end-radius: 30% 3vw;
  margin-block-start: calc(-1 * var(--space-2xl));
}
.facts h2 {
  color: var(--on-solid);
  font-size: var(--size-4); line-height: var(--leading);
  max-inline-size: 22ch;
  margin-block-end: var(--space-l);
}
.fact-list {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--space-m);
}
.fact-list li {
  display: grid; align-content: start; gap: var(--space-2xs);
  padding-inline-start: var(--space-s);
  border-inline-start: var(--border-width-m) solid color-mix(in oklab, var(--on-solid) 35%, transparent);
}
.fact-list strong { font-size: var(--size-1); line-height: var(--leading); font-family: var(--font-heading); font-weight: 700; }
.fact-list span:not(.icon):not(.fact-badge) { font-size: var(--size--1); line-height: var(--leading); }
.fact-badge {
  display: grid; place-items: center;
  inline-size: var(--space-2xl); aspect-ratio: 1;
  background: var(--on-solid); color: var(--solid);
  border-radius: var(--leaf-ui);
  margin-block-end: var(--space-2xs);
}
.fact-list li:nth-child(even) .fact-badge { border-radius: var(--leaf-ui-flip); }
.fact-badge .icon { font-size: var(--size-3); }
.facts-more { margin-block-start: var(--space-l); }
.facts-more a { color: var(--on-solid); font-weight: 700; text-decoration: none; display: inline-flex; gap: var(--space-2xs); align-items: center; padding-block: var(--space-xs); border-block-end: var(--border-width-m) solid currentColor; }
.facts-more a:hover { color: var(--on-solid); gap: var(--space-s); }

/* ---------- doctors ---------- */
.doctors { padding-block: var(--space-3xl) var(--space-2xl); }
.section-head {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-l);
  align-items: end; margin-block-end: var(--space-xl);
}
.section-head h2 { font-size: var(--size-6); line-height: var(--leading); letter-spacing: -0.015em; margin-block-start: var(--space-2xs); }
.section-intro { color: var(--text-muted); max-inline-size: 44ch; justify-self: end; }
.doc-grid {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: var(--space-xl) var(--space-m);
}
.doc {
  display: grid; align-content: start; gap: var(--space-2xs);
  transition: transform .25s ease;
}
.doc:hover { transform: translateY(calc(-1 * var(--space-2xs))); }
.doc-photo {
  position: relative;
  inline-size: 78%; aspect-ratio: 1;
  margin-block-end: var(--space-s);
  border-radius: var(--leaf);
  overflow: hidden;
  background: var(--leaf-wash);
  box-shadow: var(--shadow-m);
}
.doc-cell:nth-child(even) .doc-photo { border-radius: var(--leaf-flip); }
/* an offset leaf behind each photo (owner, 2026-11-08): the frame's own shape, shifted down and right, alternating the
   sky blue and the green wash across the grid. It sits on .doc (the photo clips its own overflow), so it lifts with the card. */
.doc { position: relative; isolation: isolate; }
.doc::before {
  content: ""; position: absolute; z-index: var(--layer-behind);
  inset-block-start: var(--space-s); inset-inline-start: var(--space-s);
  inline-size: 78%; aspect-ratio: 1;
  border-radius: var(--leaf);
  background: var(--sky);
}
.doc-cell:nth-child(even) .doc::before { border-radius: var(--leaf-flip); background: color-mix(in oklab, var(--brand-solid) 50%, var(--surface)); }
.doc:has(.doc-photo-small)::before { max-inline-size: 276px; }
.doc-photo img { inline-size: 100%; block-size: 100%; object-fit: cover; object-position: 50% 25%; }
/* Dr Rebecca Elliott's photo is only 276px: never show it larger than it is */
.doc-photo-small { max-inline-size: 276px; }
.doc h3 { font-size: var(--size-2); line-height: var(--leading); }
.doc-role { font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.doc-human { font-size: var(--size--1); line-height: var(--leading); color: var(--text); font-style: italic; }
.tags { display: flex; flex-wrap: wrap; gap: var(--space-3xs); margin-block-start: var(--space-2xs); }
.tags li {
  font-size: var(--size--1); line-height: var(--leading); font-weight: 600;
  background: var(--brand-soft); color: var(--brand-on-soft);
  padding: var(--space-3xs) var(--space-xs);
  border-radius: var(--radius-pill);
}
.doctors-foot {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-l);
  margin-block-start: var(--space-2xl);
  padding-block-start: var(--space-l);
  border-block-start: var(--border-width-s) solid var(--border);
}

/* ---------- people: blue-tinted, big overlapping photos ---------- */
.people {
  background: var(--soft); color: var(--text);
  padding-block: var(--space-3xl);
  border-start-start-radius: 30% 4vw;
  border-start-end-radius: 70% 7vw;
  position: relative;
}
.people-title {
  font-size: var(--size-6); line-height: var(--leading); letter-spacing: -0.015em;
  max-inline-size: 18ch; margin-block-end: var(--space-2xl);
}
.people-row {
  display: grid; grid-template-columns: 7fr 5fr; gap: var(--space-2xl);
  align-items: center; margin-block-end: var(--space-3xl);
}
.people-row-flip { grid-template-columns: 5fr 7fr; }
.people-row-flip .people-photos { order: 2; }
.people-photos { position: relative; aspect-ratio: 1 / 0.78; /* frame geometry */ }
.ph-nurses-big {
  inset: 0 36% 0 0; border-radius: var(--leaf);
}
.ph-nurses-big img { object-position: 50% 30%; }
.ph-kids {
  inline-size: 46%; aspect-ratio: 4 / 3;
  inset-inline-end: 0; inset-block-end: 6%;
  border-radius: var(--leaf-flip);
  border: var(--space-2xs) solid var(--surface);
}
.ph-admin { inset: 0 0 22% 4%; border-radius: var(--leaf-flip); }
.ph-desk {
  inline-size: 60%; aspect-ratio: 16 / 7;
  inset-inline-start: 0; inset-block-end: 0;
  border-radius: var(--leaf);
  border: var(--space-2xs) solid var(--surface);
}
.people-photos::before {
  /* a leaf of the logo blue behind the photos */
  content: ""; position: absolute;
  inset: 12% -4% -6% 22%;
  background: var(--secondary-solid, var(--secondary));
  border-radius: var(--leaf);
  opacity: .9;
}
/* the second row alternates to the logo green (owner, 2026-11-08): nurses blue, reception green */
.people-row-flip .people-photos::before { inset: -6% 20% 14% -4%; border-radius: var(--leaf-flip); background: var(--brand-solid); }
.people-text { display: grid; gap: var(--space-s); }
.people-text h3 {
  font-size: var(--size-3); line-height: var(--leading);
  display: flex; align-items: center; gap: var(--space-xs);
}
.people-text h3 .icon { color: var(--line); }
.people-text .names {
  font-family: var(--font-heading);
  font-size: var(--size-2); line-height: var(--leading); font-style: italic;
  color: var(--on-soft);
}
.people-text p:not(.names) { max-inline-size: 46ch; }
/* the reception row is the green one, so its icon and names take the brand green, not the band's secondary blue */
.people-row-flip .people-text h3 .icon { color: var(--brand-line); }
.people-row-flip .people-text .names { color: var(--brand-on-soft); }

.allied {
  display: grid; grid-template-columns: auto 1fr; gap: var(--space-xl);
  align-items: center;
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card);
  padding: var(--space-l) var(--space-xl);
  box-shadow: var(--shadow-m);
}
.allied-photo {
  inline-size: 240px; aspect-ratio: 1; /* frame geometry */
  border-radius: var(--leaf); overflow: hidden;
}
.allied-photo img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.allied-text { display: grid; gap: var(--space-s); justify-items: start; }
.allied-kicker { font-weight: 700; color: var(--secondary-on-soft); font-size: var(--size--1); line-height: var(--leading); }
.allied h3 { font-size: var(--size-4); line-height: var(--leading); }
.allied-text > p:not(.allied-kicker) { max-inline-size: 70ch; }
.tags-on-raised li { background: var(--secondary-soft); color: var(--secondary-on-soft); }

/* ---------- footer ---------- */
.site-footer {
  /* deep forest: the dark band's surface with a little of the logo green mixed in */
  --forest: color-mix(in oklab, var(--brand-solid) 22%, var(--surface));
  background: var(--forest); color: var(--text);
  padding-block: var(--space-2xl) var(--space-l);
}
.footer-urgent {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-m);
  align-items: center;
  padding-block-end: var(--space-xl);
  border-block-end: var(--border-width-s) solid var(--border);
}
.urgent-item { display: flex; gap: var(--space-s); align-items: center; }
.urgent-item > .icon {
  font-size: var(--size-3); flex: none;
  display: grid; place-items: center;
  inline-size: var(--space-2xl); block-size: var(--space-2xl);
  border-radius: var(--leaf-ui);
  background: var(--brand-soft); color: var(--brand-on-soft);
  vertical-align: 0;
}
.urgent-000 > .icon { background: var(--danger-solid); color: var(--danger-on-solid); }
.urgent-item div { display: grid; }
.urgent-item strong { font-family: var(--font-heading); font-size: var(--size-2); line-height: var(--leading); color: var(--text-strong); font-weight: 700; }
.urgent-item a { font-weight: 700; font-size: var(--size-1); line-height: var(--leading); }
.footer-grid {
  display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: var(--space-l);
  padding-block: var(--space-xl);
}
.footer-col { display: grid; gap: var(--space-xs); align-content: start; }
.footer-col h2 { font-size: var(--size-1); line-height: var(--leading); }
.footer-col ul { display: grid; gap: var(--space-3xs); }
/* on the forest mix, --link is not guaranteed: footer links are strong text with a brand underline */
.site-footer a { color: var(--text-strong); text-decoration-color: var(--brand-line); text-decoration-thickness: var(--border-width-m); }
.site-footer a:hover { color: var(--text-strong); text-decoration-color: currentColor; }
.footer-col ul a { display: inline-block; padding-block: var(--space-3xs); }
address { font-style: normal; }
.footer-name { font-family: var(--font-heading); font-size: var(--size-3); line-height: var(--leading); color: var(--text-strong); font-weight: 700; }
.quiet { color: var(--text-muted); font-size: var(--size--1); line-height: var(--leading); }
.footer-col ul.social { display: flex; gap: var(--space-s); }
.footer-hours { margin: 0; display: grid; gap: var(--space-3xs); }
.footer-hours div { display: grid; }
.footer-hours dt { font-weight: 600; color: var(--text-strong); }
.footer-hours dd { margin: 0; }
.footer-base {
  display: flex; justify-content: space-between; flex-wrap: wrap; gap: var(--space-s);
  border-block-start: var(--border-width-s) solid var(--border);
  padding-block-start: var(--space-m);
  font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted);
}
.footer-base ul { display: flex; gap: var(--space-m); }
.footer-base a { color: var(--text-strong); display: inline-block; padding-block: var(--space-3xs); }


/* the booking card's three kinds of visit */
.visit-types { display: flex; flex-wrap: wrap; gap: var(--space-2xs); }
.visit-types li {
  display: inline-flex; align-items: center; gap: var(--space-3xs);
  font-weight: 600; font-size: var(--size--1); line-height: var(--leading);
  background: var(--brand-soft); color: var(--brand-on-soft);
  padding: var(--space-3xs) var(--space-xs); border-radius: var(--radius-pill);
}
.urgent-item span a { font-size: inherit; }

/* ---------- services grid ---------- */
.services-band { padding-block: var(--space-3xl) var(--space-2xl); }
.svc-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-m); }
.svc {
  position: relative; block-size: 100%;
  display: grid; align-content: start; gap: var(--space-2xs);
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card);
  padding: var(--space-m) var(--space-m) var(--space-l);
  text-decoration: none;
  box-shadow: var(--shadow-s);
  transition: transform .25s ease, box-shadow .25s ease;
}
.svc:hover { color: var(--text); transform: translateY(calc(-1 * var(--space-2xs))); box-shadow: var(--shadow-m); }
.svc-badge {
  display: grid; place-items: center;
  inline-size: var(--space-2xl); aspect-ratio: 1;
  background: var(--brand-solid); color: var(--brand-on-solid);
  border-radius: var(--leaf-ui);
  margin-block-end: var(--space-2xs);
}
.svc-grid li:nth-child(even) .svc-badge { border-radius: var(--leaf-ui-flip); background: var(--secondary-solid); color: var(--secondary-on-solid); }
.svc-badge .icon { font-size: var(--size-3); }
.svc-name { font-family: var(--font-heading); font-weight: 700; font-size: var(--size-2); line-height: var(--leading); color: var(--text-strong); }
.svc-blurb { font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.svc-more { position: absolute; inset-inline-end: var(--space-m); inset-block-start: var(--space-m); color: var(--brand-line); transition: transform .2s ease; }
.svc:hover .svc-more { transform: translateX(var(--space-3xs)); }

/* ---------- new patients + telehealth ---------- */
.welcome-band { padding-block: var(--space-3xl); }
.welcome-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--space-l); align-items: center; }
.welcome-card {
  display: grid; gap: var(--space-s); justify-items: start;
  padding: var(--space-l);
  border-radius: var(--leaf-card);
}
.welcome-new { background: var(--surface-raised); color: var(--text); box-shadow: var(--shadow-m); }
.welcome-tele { background: var(--soft); color: var(--text); }
.welcome-card h2 { font-size: var(--size-2); line-height: var(--leading); display: flex; gap: var(--space-xs); align-items: center; }
.welcome-card h2 .icon { color: var(--line); }
.welcome-photo { aspect-ratio: 1 / 1.1; overflow: hidden; border-radius: var(--leaf); box-shadow: var(--shadow-l); }
.welcome-photo img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.doc-links { display: grid; gap: var(--space-3xs); }
.doc-links a { display: inline-flex; gap: var(--space-xs); align-items: center; font-weight: 600; padding-block: var(--space-3xs); }
.doc-links .icon { color: var(--brand-line); }


/* ---------- inner page heroes: one system, four layouts (see page_hero in _build/common.py) ---------- */
.page-hero { padding-block: var(--space-xl) var(--space-2xl); overflow-x: clip; }
.page-hero-copy { display: grid; gap: var(--space-s); justify-items: start; align-content: start; }
.page-hero h1 { font-size: var(--size-6); line-height: var(--leading); letter-spacing: -0.015em; }
.page-hero .lede { max-inline-size: 46ch; }

/* 1. split: text beside one leaf-framed photo; the frame takes the photo's own shape (set inline) */
.page-hero-grid { display: grid; grid-template-columns: 6fr 5fr; gap: var(--space-xl); align-items: center; }
.page-hero-art { position: relative; max-block-size: 640px; justify-self: center; inline-size: 100%; }
.page-hero-art::before {
  /* a timber leaf behind the photo */
  content: ""; position: absolute; inset: 42% -6% -5% 52%;
  background: var(--sky-wash); border-radius: var(--leaf-flip);
}
.ph-hero-main { inset: 0 4% 0 6%; border-radius: var(--leaf-photo); animation: rise .9s cubic-bezier(.2,.7,.2,1) both; }
.hero-split.is-flip .page-hero-grid { grid-template-columns: 5fr 6fr; }
.hero-split.is-flip .page-hero-art { order: -1; }
.hero-split.is-flip .page-hero-art::before { inset: -5% 52% 42% -6%; background: var(--leaf-wash); }
.hero-split.is-flip .ph-hero-main { border-radius: var(--leaf-photo-flip); }
/* a portrait frame is narrower, so it doesn't run the hero past the fold */
.page-hero-art[style*="aspect-ratio: 0."] { max-inline-size: 480px; }
.ph-hero-main img[src$="examination-room.jpg"] { object-position: 50% 55%; }

/* 2. wide: the headline and lede side by side, over one whole wide photo */
.hero-wide { padding-block-end: var(--space-xl); }
.hero-wide-head { display: grid; grid-template-columns: 7fr 5fr; gap: var(--space-xl); align-items: start; margin-block-end: var(--space-l); }
.hero-wide-head .lede { font-size: var(--size-1); }
.hero-wide-photo {
  position: relative; margin: 0;
  border-radius: var(--leaf-wide); overflow: hidden; box-shadow: var(--shadow-l);
  animation: rise .9s cubic-bezier(.2,.7,.2,1) both;
}
.hero-wide-photo img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.hero-wide .wrap { position: relative; }
.hero-wide .wrap::after {
  /* a timber batten line under the photo: the building's own detail */
  content: ""; display: block; block-size: var(--space-xs); margin-block-start: var(--space-s);
  inline-size: 38%; margin-inline-start: auto;
  background: repeating-linear-gradient(90deg, var(--sky) 0 var(--space-xs), transparent var(--space-xs) var(--space-s));
  border-radius: var(--radius-s);
}

/* 3. strip: a row of whole photos at one height (each item grows by its own aspect ratio) */
.hero-strip .page-hero-copy { margin-block-end: var(--space-l); }
.hero-strip .page-hero-copy .lede { max-inline-size: 60ch; }
.hero-strip-photos { list-style: none; margin: 0; padding: 0; display: flex; gap: var(--space-s); position: relative; }
.hero-strip-photos::before {
  /* a green leaf wash behind the lower half of the strip */
  content: ""; position: absolute; inset: 40% -4% -8% 30%; z-index: var(--layer-behind);
  background: var(--leaf-wash); border-radius: var(--leaf-wide);
}
.hero-strip-photos li { flex: var(--ar) 1 0; aspect-ratio: var(--ar); min-inline-size: 0; overflow: hidden; border-radius: var(--leaf-card); box-shadow: var(--shadow-l); animation: rise .9s cubic-bezier(.2,.7,.2,1) both; }
.hero-strip-photos li:nth-child(even) { border-radius: var(--leaf-card-flip); animation-delay: .12s; }
.hero-strip-photos img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.hero-strip { isolation: isolate; }

/* 4. text-led: no photo; the logo's leaf, the sky blue and a logo-blue leaf as the picture */
.hero-text { background: color-mix(in oklab, var(--brand-solid) 7%, var(--surface)); border-block-end: var(--border-width-m) solid var(--border-quiet); }
.hero-text-grid { display: grid; grid-template-columns: 8fr 4fr; gap: var(--space-xl); align-items: center; }
.hero-text h1 { font-size: var(--size-7); }
.hero-text-art { position: relative; aspect-ratio: 1 / 0.9; }
.hero-text-art span { position: absolute; display: block; }
.hero-text-art .leaf-big { inset: 0 0 18% 22%; background: var(--leaf-wash); border-radius: var(--leaf); }
.hero-text-art .leaf-timber {
  inset: 46% 46% 0 4%; border-radius: var(--leaf-flip);
  background: repeating-linear-gradient(90deg, var(--sky) 0 var(--space-2xs), var(--sky-wash) var(--space-2xs) var(--space-xs));
}
.hero-text-art .leaf-blue { inset: 10% 6% 70% 70%; background: var(--secondary-solid, var(--secondary)); border-radius: var(--leaf); opacity: .85; }

/* the breadcrumb takes the eyebrow's place and style on a sub-page: "Services / Counselling" */
.crumbs ol { list-style: none; margin: 0; flex-wrap: wrap; }
.crumbs li { display: inline-flex; align-items: center; }
.crumbs a { color: var(--brand-on-soft); text-decoration-color: var(--brand-line); text-underline-offset: var(--border-width-l); }
.crumbs a:hover { color: var(--brand-on-soft); text-decoration-thickness: var(--border-width-m); }
.crumb-sep { margin-inline: var(--space-2xs); font-weight: 400; }

/* ---------- generic content bands ---------- */
.band { padding-block: var(--space-2xl) var(--space-2xl); }
.band-lowered, .services-band {
  /* a quiet band: the lowered surface with a little leaf green, so it stays distinct from the page in dark too */
  --quiet-band: color-mix(in oklab, var(--brand-solid) 9%, var(--surface-lowered));
  background: var(--quiet-band); color: var(--text);
}
/* on the green-tinted quiet band, coloured link text is not guaranteed: use strong text with a brand underline */
.services-band .section-intro a, .services-band .eyebrow-plain, .services-band .band-head a,
.band-lowered .prose > p a, .band-lowered .band-head a, .band-lowered .after-grid a {
  color: var(--text-strong); text-decoration-color: var(--brand-line); text-decoration-thickness: var(--border-width-m);
}
.band-soft { background: var(--soft); color: var(--text); }
.band-solid { background: var(--solid); color: var(--on-solid); }
.band-solid h2, .band-solid h3 { color: var(--on-solid); }
.band-dark { background: var(--surface); color: var(--text); }
.band-curve { border-start-start-radius: 60% 5vw; border-start-end-radius: 40% 2vw; }
.band-head { display: grid; gap: var(--space-xs); margin-block-end: var(--space-l); max-inline-size: 60ch; }
.band-head h2, .prose h2 { font-size: var(--size-5); line-height: var(--leading); letter-spacing: -0.015em; }
.band-head p { color: var(--text-muted); }
.band-solid .band-head p { color: var(--on-solid); }
.prose { max-inline-size: 68ch; display: grid; gap: var(--space-s); }
.prose h3 { font-size: var(--size-2); line-height: var(--leading); margin-block-start: var(--space-s); }
.prose ul { display: grid; gap: var(--space-3xs); }
.split { display: grid; grid-template-columns: 7fr 5fr; gap: var(--space-2xl); align-items: start; }
.split-flip { grid-template-columns: 5fr 7fr; }
.split-media { position: relative; }
.split-media .leafy { aspect-ratio: 4 / 5; overflow: hidden; border-radius: var(--leaf); box-shadow: var(--shadow-l); }
.split-media .leafy img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.side-card {
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card); box-shadow: var(--shadow-m);
  padding: var(--space-l); display: grid; gap: var(--space-s); justify-items: start;
  border-block-start: var(--space-3xs) solid var(--brand-line);
}
.side-card h2, .side-card h3 { font-size: var(--size-2); line-height: var(--leading); display: flex; align-items: center; gap: var(--space-xs); }
.side-card h2 .icon, .side-card h3 .icon { color: var(--brand-line); }
.prose .chips { display: flex; }

/* lists with a filled tick */
.check-list { display: grid; gap: var(--space-2xs); }
.check-list li { position: relative; padding-inline-start: calc(var(--size-1) + var(--space-xs)); }
.check-list li::before {
  content: "check_circle";
  font-family: "Material Symbols Rounded"; font-variation-settings: "FILL" 1, "wght" 500;
  position: absolute; inset-inline-start: 0; inset-block-start: 0;
  font-size: var(--size-1); line-height: var(--leading);
  color: var(--line);
}
.band-solid .check-list li::before { color: var(--on-solid); }
.check-cols { grid-template-columns: repeat(2, 1fr); column-gap: var(--space-l); }

/* cards with an icon, for a list of services or steps */
.item-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-m); }
.item {
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card); padding: var(--space-m);
  display: grid; align-content: start; gap: var(--space-2xs);
  box-shadow: var(--shadow-s);
}
.item .icon-badge {
  display: grid; place-items: center; inline-size: var(--space-xl); aspect-ratio: 1;
  background: var(--soft); color: var(--on-soft); border-radius: var(--leaf-ui);
}
.item:nth-child(even) .icon-badge { border-radius: var(--leaf-ui-flip); }
.item .icon-badge .icon { font-size: var(--size-2); }
.item h3 { font-size: var(--size-1); line-height: var(--leading); }
.item p { font-size: var(--size--1); line-height: var(--leading); }

/* a band calling to book */
.cta-band { background: var(--solid); color: var(--on-solid); padding-block: var(--space-xl); border-start-start-radius: 40% 3vw; border-start-end-radius: 60% 5vw; }
.cta-row { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: var(--space-m); }
.cta-band h2 { color: var(--on-solid); font-size: var(--size-4); line-height: var(--leading); }
.cta-band p { max-inline-size: 56ch; }
.btn-on-solid { background: var(--on-solid); color: var(--solid); box-shadow: var(--shadow-m); }
.btn-on-solid:hover { background: var(--on-solid); color: var(--solid); transform: translateY(calc(-1 * var(--space-3xs))); }

/* ---------- doctors and staff ---------- */
.jump { display: flex; flex-wrap: wrap; gap: var(--space-2xs); }
.jump a {
  display: inline-flex; align-items: center; gap: var(--space-3xs);
  padding: var(--space-2xs) var(--space-s); border-radius: var(--leaf-ui);
  background: var(--surface-raised); color: var(--text-strong); text-decoration: none; font-weight: 600;
  box-shadow: var(--shadow-s);
}
.jump a:hover { background: var(--brand-solid); color: var(--brand-on-solid); }
.bio-list { display: grid; gap: var(--space-xl); }
.bio-list .bio + .bio { border-block-start: var(--border-width-s) solid var(--border); padding-block-start: var(--space-xl); }
.bio { display: grid; grid-template-columns: 300px 1fr; gap: var(--space-xl); align-items: start; scroll-margin-block-start: var(--space-l); }
.bio:nth-child(even) { grid-template-columns: 1fr 300px; }
.bio:nth-child(even) .bio-photo { order: 2; border-radius: var(--leaf-flip); }
.bio-photo { aspect-ratio: 1; overflow: hidden; border-radius: var(--leaf); box-shadow: var(--shadow-m); background: var(--leaf-wash); }
.bio-photo img { inline-size: 100%; block-size: 100%; object-fit: cover; object-position: 50% 25%; }
.bio-photo-small { max-inline-size: 276px; justify-self: center; inline-size: 100%; }
.bio-text { display: grid; gap: var(--space-s); justify-items: start; max-inline-size: 66ch; }
.bio-text h3 { font-size: var(--size-4); line-height: var(--leading); }
.bio-meta { color: var(--text-muted); font-size: var(--size--1); line-height: var(--leading); }
.bio-actions { display: flex; flex-wrap: wrap; gap: var(--space-s); align-items: center; }
.btn-quiet { background: var(--surface-raised); color: var(--on-soft); border-color: var(--line); padding-block: var(--space-2xs); }
.btn-quiet:hover { background: var(--soft); color: var(--on-soft); }
.staff-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-xl); align-items: start; }
.staff-card { display: grid; gap: var(--space-s); }
.staff-card .leafy { aspect-ratio: 4 / 3; overflow: hidden; border-radius: var(--leaf); box-shadow: var(--shadow-m); }
.staff-card:nth-child(even) .leafy { border-radius: var(--leaf-flip); }
.staff-card .leafy img { inline-size: 100%; block-size: 100%; object-fit: cover; object-position: 50% 30%; }
.staff-card h3 { font-size: var(--size-3); line-height: var(--leading); }

/* ---------- telehealth rooms, countries ---------- */
.room-list { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-xs); }
.room-list a {
  display: flex; align-items: center; gap: var(--space-xs);
  background: var(--surface-raised); color: var(--text-strong); text-decoration: none;
  padding: var(--space-xs) var(--space-s); border-radius: var(--leaf-ui);
  font-weight: 600; box-shadow: var(--shadow-s);
}
.room-list a:hover { background: var(--brand-solid); color: var(--brand-on-solid); }
.room-list img { inline-size: 44px; block-size: 44px; object-fit: cover; border-radius: var(--leaf-ui); flex: none; /* photo geometry */ }
.chips { display: flex; flex-wrap: wrap; gap: var(--space-2xs); }
.chips li {
  background: var(--surface-raised); color: var(--text-strong);
  padding: var(--space-3xs) var(--space-s); border-radius: var(--radius-pill);
  font-weight: 600; box-shadow: var(--shadow-s);
}

/* ---------- gallery ---------- */
.gallery { display: grid; grid-template-columns: 2fr 1fr 1fr; grid-template-rows: 1fr 1fr; gap: var(--space-s); block-size: 560px; /* frame geometry */ }
.gallery figure { overflow: hidden; border-radius: var(--leaf-card); position: relative; }
.gallery figure:first-child { grid-row: span 2; border-radius: var(--leaf); }
.gallery figure:nth-child(4) { border-radius: var(--leaf-flip); }
.gallery img { inline-size: 100%; block-size: 100%; object-fit: cover; }
.gallery figcaption {
  position: absolute; inset-inline-start: var(--space-xs); inset-block-end: var(--space-xs);
  background: var(--surface-raised); color: var(--text-strong);
  font-size: var(--size--1); line-height: var(--leading); font-weight: 600;
  padding: var(--space-3xs) var(--space-xs); border-radius: var(--radius-pill);
}
.gallery figure:first-child figcaption { inset-inline-start: 22%; }
.gallery figure:nth-child(4) figcaption { inset-inline-start: auto; inset-inline-end: var(--space-xs); }

/* ---------- values ---------- */
.values { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-m) var(--space-l); }
.values li { display: grid; gap: var(--space-3xs); padding-block-start: var(--space-s); border-block-start: var(--border-width-m) solid color-mix(in oklab, var(--on-solid) 40%, transparent); }
.values strong { font-family: var(--font-heading); font-size: var(--size-2); line-height: var(--leading); font-weight: 700; }

/* ---------- contact ---------- */
.contact-grid { display: grid; grid-template-columns: 5fr 6fr; gap: var(--space-2xl); align-items: start; }
.map-card { position: relative; display: block; text-decoration: none; color: var(--text); }
.map-card .leafy { aspect-ratio: 4 / 3; overflow: hidden; border-radius: var(--leaf); box-shadow: var(--shadow-l); }
.map-card .leafy img { inline-size: 100%; block-size: 100%; object-fit: cover; transition: transform .4s ease; }
.map-card:hover .leafy img { transform: scale(1.03); }
.map-card .btn { position: absolute; inset-inline-start: var(--space-m); inset-block-end: calc(-1 * var(--space-m)); }
.detail-list { display: grid; gap: var(--space-s); }
.detail-list li { display: grid; grid-template-columns: auto 1fr; gap: var(--space-s); align-items: start; }
.detail-list .icon { color: var(--brand-line); font-size: var(--size-2); margin-block-start: var(--space-3xs); }
.detail-list strong { display: block; color: var(--text-strong); }

.after-grid { margin-block-start: var(--space-l); }
.other-svc a .icon { color: var(--brand-line); }
.other-svc a:hover .icon { color: currentColor; }
.doc h3 a { color: var(--text-strong); text-decoration: none; }
.doc h3 a:hover { color: var(--link-hover); text-decoration: underline; }
.prose .btn { margin-block-start: var(--space-2xs); }
.detail-list .btn { display: inline-flex; margin-inline-start: 0; }

/* ---------- 404 ---------- */
.notfound { padding-block: var(--space-3xl); text-align: center; display: grid; justify-items: center; gap: var(--space-m); }
.notfound .big { font-family: var(--font-heading); font-size: var(--size-8); line-height: var(--leading); color: var(--brand-line); font-weight: 700; }
.notfound h1 { font-size: var(--size-5); line-height: var(--leading); }
.notfound .actions { justify-content: center; }


/* ---------- the colour scheme (template mf-websites#431) ---------- */
:root:not([data-scheme-ui]) [data-scheme-switcher] { display: none; }

/* ---------- header tools: colour scheme switcher, booking, phone menu ---------- */
.header-tools { display: flex; align-items: center; gap: var(--space-xs); flex: none; }
.scheme { position: relative; }
.scheme-toggle {
  display: grid; place-items: center;
  /* the same box as the square search trigger beside it */
  inline-size: var(--field-h); block-size: var(--field-h);
  border: var(--border-width-s) solid var(--border-strong);
  background: var(--surface-raised); color: var(--text-strong);
  border-radius: var(--leaf-ui);
  cursor: pointer;
  transition: background-color .2s ease, border-color .2s ease;
}
.scheme-toggle:hover, .scheme-toggle[aria-expanded="true"] { background: var(--brand-soft); color: var(--brand-on-soft); border-color: var(--brand-line); }
.scheme-toggle .icon { font-size: var(--size-1); color: var(--brand-line); }
.scheme-toggle:hover .icon, .scheme-toggle[aria-expanded="true"] .icon { color: currentColor; }
/* the toggle shows the current choice: a sun, a moon, or half and half for Match device */
.scheme-toggle .i-light, .scheme-toggle .i-dark { display: none; }
:root[data-scheme="light"] .scheme-toggle .i-light, :root[data-scheme="dark"] .scheme-toggle .i-dark { display: inline-block; }
:root[data-scheme="light"] .scheme-toggle .i-auto, :root[data-scheme="dark"] .scheme-toggle .i-auto { display: none; }
.scheme-menu:not([hidden]) {
  position: absolute; inset-block-start: calc(100% + var(--space-2xs)); inset-inline-end: 0; z-index: var(--layer-overlay);
  display: grid; gap: var(--space-3xs);
  min-inline-size: max-content;
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card);
  box-shadow: var(--shadow-l);
  border: var(--border-width-s) solid var(--border);
  padding: var(--space-xs);
}
.scheme__label {
  font-size: var(--size--1); line-height: var(--leading); font-weight: 700; color: var(--text-muted);
  padding: var(--space-3xs) var(--space-xs);
}
.scheme__option {
  display: flex; align-items: center; gap: var(--space-xs);
  font: inherit; font-weight: 600; font-size: var(--size--1); line-height: var(--leading);
  color: var(--text-strong); background: transparent;
  border: 0; border-radius: var(--leaf-ui);
  padding: var(--space-xs) var(--space-s);
  cursor: pointer; text-align: start;
}
.scheme__option .icon { color: var(--brand-line); }
.scheme__option:hover { background: var(--surface-lowered); }
.scheme__option[aria-pressed="true"] { background: var(--brand-solid); color: var(--brand-on-solid); }
.scheme__option[aria-pressed="true"] .icon { color: currentColor; }

/* the phone menu: a disclosure, so it opens with no script at all */
.phone-menu { display: none; }
.phone-menu summary {
  list-style: none; cursor: pointer;
  display: inline-flex; align-items: center; gap: var(--space-3xs);
  font-weight: 700; font-size: var(--size--1); line-height: var(--leading);
  color: var(--text-strong);
  padding: var(--space-2xs) var(--space-s);
  border: var(--border-width-s) solid var(--border-strong);
  border-radius: var(--leaf-ui);
  min-block-size: var(--field-h);
}
.phone-menu summary::-webkit-details-marker { display: none; }
.phone-menu summary .icon { font-size: var(--size-2); }
.phone-menu summary:hover { background: var(--brand-soft); color: var(--brand-on-soft); }
.phone-menu[open] summary { background: var(--brand-solid); color: var(--brand-on-solid); border-color: var(--brand-solid); }
.phone-panel {
  position: absolute; inset-inline: 0; inset-block-start: 100%; z-index: var(--layer-overlay);
  background: var(--surface-raised); color: var(--text);
  box-shadow: var(--shadow-l);
  border-block-start: var(--border-width-s) solid var(--border);
  padding: var(--space-s) var(--space-m-xl) var(--space-m);
  display: grid; gap: var(--space-m);
}
.nav-phone { margin: 0; }
.nav-phone ul { display: grid; gap: var(--space-3xs); }
.phone-book { display: none; justify-self: start; }
.nav-phone a { font-size: var(--size-0); padding: var(--space-xs) var(--space-s); }
.scheme-inline { display: flex; flex-wrap: wrap; gap: var(--space-2xs); align-items: center; border-block-start: var(--border-width-s) solid var(--border); padding-block-start: var(--space-s); }
.scheme-inline .scheme__label { flex-basis: 100%; padding-inline: 0; }
.scheme-inline .scheme__option { border: var(--border-width-s) solid var(--border-strong); }
.scheme-inline .scheme__option[aria-pressed="true"] { border-color: var(--brand-solid); }

.nav a { white-space: nowrap; }
@media (max-width: 1640px) {
  .brand-link img { inline-size: 220px; }
  .nav a { padding-inline: var(--space-xs); }
}
@media (max-width: 760px) {
  .brand-link img { inline-size: 190px; }
}
@media (max-width: 1380px) {
  .site-header { position: relative; }
  .nav-desktop, .scheme-desktop { display: none; }
  .phone-menu { display: block; }
  .header-row { flex-wrap: nowrap; justify-content: space-between; }
}

@media (max-width: 640px) {
  .form-card { padding: var(--space-m); }
  .header-tools .header-book { display: none; }
  .phone-book { display: inline-flex; }
}

/* ---------- site search (template default: one overlay, opened by a trigger drawn as a field) ---------- */
:root {
  }
.search-trigger {
  display: inline-flex; align-items: center; gap: var(--space-2xs);
  min-block-size: var(--field-h); min-inline-size: var(--field-h);
  padding-inline: var(--space-s) var(--space-l);
  font: inherit; font-size: var(--size--1); line-height: var(--leading); font-weight: 600;
  color: var(--text-muted);
  cursor: pointer; white-space: nowrap;
  transition: border-color .2s ease, background-color .2s ease;
}
.search-trigger .icon { color: var(--brand-line); font-size: var(--size-1); }
/* "Search…": the ellipsis is drawn, not spoken */
.search-trigger__text::after { content: "…"; }
.search-trigger:hover { border-color: var(--brand-line); background: var(--brand-soft); color: var(--brand-on-soft); }
.search-trigger:focus-visible { outline-offset: calc(var(--border-width-s) * -1); }

/* the overlay: a centred card over the page dimmed in ink; full screen on phones */
.mf-search-overlay:not([hidden]) {
  position: fixed; z-index: calc(var(--layer-modal) + 1);
  inset: var(--space-2xl) 0 auto;
  margin-inline: auto;
  inline-size: calc(100% - 2 * var(--space-m));
  max-inline-size: 640px; /* card geometry */
  max-block-size: calc(100dvh - 2 * var(--space-2xl));
  overflow-y: auto;
  display: grid; gap: var(--space-s); align-content: start;
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card);
  box-shadow: var(--shadow-l);
  border-block-start: var(--space-3xs) solid var(--brand-line);
  padding: var(--space-m);
}
html[data-mf-search-overlay="open"] body::after {
  /* the backdrop: the page dimmed in ink with a light blur (below the card: body::after follows it in tree order) */
  content: ""; position: fixed; inset: 0; z-index: var(--layer-modal);
  background: color-mix(in oklab, var(--neutral-solid) 50%, transparent);
  backdrop-filter: blur(3px);
}
.mf-search-overlay__header { display: flex; justify-content: flex-end; }
.mf-search-overlay__close {
  font: inherit; font-weight: 700; font-size: var(--size--1); line-height: var(--leading);
  min-block-size: 44px; padding-inline: var(--space-s);
  color: var(--on-soft); background: var(--soft);
  border: 0; border-radius: var(--leaf-ui); cursor: pointer;
}
.mf-search-overlay__close:hover { background: color-mix(in oklab, var(--soft), var(--mix-hover)); }

/* the box, wherever it sits: layout here, the field's look below with every other field */
.mf-search__form { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-2xs); align-items: center; }
.mf-search__label, .mf-search__status, .mf-search__results, .mf-search__popup { grid-column: 1 / -1; }
.mf-search__input { grid-column: 1 / -1; }
[data-mf-search-submit] .mf-search__input { grid-column: auto; }
.mf-search__submit {
  min-block-size: var(--field-h); padding: 0 var(--space-m);
  font: inherit; font-weight: 700; line-height: var(--leading);
  color: var(--brand-on-solid); background: var(--brand-solid);
  border: 0; border-radius: var(--control-radius); cursor: pointer;
}
.mf-search__submit:hover { background: color-mix(in oklab, var(--brand-solid), var(--mix-hover)); }
.mf-search__status { margin: 0; font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.mf-search__status:empty { display: none; }
.mf-search__results:not([hidden]) { display: flex; flex-direction: column; gap: var(--space-3xs); }
.mf-search__link {
  display: block; padding: var(--space-xs) var(--space-s);
  border-radius: var(--leaf-ui);
  color: var(--text); text-decoration: none; overflow-wrap: anywhere;
  transition: background-color .15s ease;
}
.mf-search__link:hover, .mf-search__link:focus-visible { color: var(--brand-on-soft); background: var(--brand-soft); }
.mf-search__link:focus-visible { outline-offset: calc(var(--border-width-m) * -1); }
.mf-search__title { display: block; font-family: var(--font-heading); font-weight: 700; font-size: var(--size-1); line-height: var(--leading); color: var(--text-strong); }
.mf-search__excerpt { display: block; margin-block-start: var(--space-3xs); font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.mf-search__excerpt mark { color: var(--text-strong); background: var(--selection); border-radius: var(--radius-s); }
.mf-search--dropdown .mf-search__label, .mf-search--overlay .mf-search__label {
  position: absolute; inline-size: 1px; block-size: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}

/* where the header is tight (beside the full nav, and on narrow screens) the trigger is a 44px magnifier square;
   its word stays for screen readers (clipped, not removed) */
@media (min-width: 1381px), (max-width: 900px) {
  .search-trigger { padding: 0; justify-content: center; inline-size: var(--field-h); }
  .search-trigger__text { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
}

/* on phones the search window fills the screen */
@media (max-width: 640px) {
  .mf-search-overlay:not([hidden]) { inset: 0; inline-size: auto; max-inline-size: none; max-block-size: none; block-size: 100dvh; border-radius: 0; box-shadow: none; }
}

.form-card {
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card); box-shadow: var(--shadow-m);
  padding: var(--space-l);
  border-block-start: var(--space-3xs) solid var(--brand-line);
  display: grid; gap: var(--space-s);
}
.form-card form { display: grid; gap: var(--space-s); justify-items: stretch; }
.form-card form > div { display: grid; gap: var(--space-3xs); }
.form-card label { font-weight: 700; color: var(--text-strong); font-size: var(--size--1); line-height: var(--leading); }

.form-card .btn { justify-self: start; }
[data-mf-feedback]:not([hidden]) {
  background: var(--brand-soft); color: var(--brand-on-soft);
  border-radius: var(--leaf-card); padding: var(--space-s) var(--space-m);
  font-weight: 600;
}

/* ---------- the leaf flips on hover and keyboard focus ----------
   At rest every interactive leaf is --leaf-ui; on hover and focus-visible it turns to the mirrored --leaf-ui-flip
   (the same fixed radius, never a square or % corner). Background, border and focus ring are all on the element itself,
   so they flip together. Only the radius animates, briefly; reduced motion turns it off (see the end of this file). */
:is(.nav a, .sub-toggle, .jump a, .scheme-toggle, .scheme__option, .phone-menu summary, .mf-search-overlay__close, .room-list a, .mf-search__link) {
  transition: border-radius .2s ease, background-color .2s ease, border-color .2s ease, color .2s ease;
}
:is(.nav a, .sub-toggle, .jump a, .scheme-toggle, .scheme__option, .phone-menu summary, .mf-search-overlay__close, .room-list a, .mf-search__link):is(:hover, :focus-visible),
.scheme-toggle[aria-expanded="true"] {
  border-radius: var(--leaf-ui-flip);
}
/* the current page, the chosen scheme and the open menu stay at rest, as they did before */
.nav a[aria-current="page"], .scheme .scheme__option[aria-pressed="true"], .phone-menu[open] summary { border-radius: var(--leaf-ui); }

/* ---------- fees ---------- */
.fee-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-m); }
.fee-grid-2 { grid-template-columns: repeat(2, 1fr); max-inline-size: 900px; /* card geometry */ }
.fee-card {
  display: grid; align-content: start; gap: var(--space-s);
  background: var(--surface-raised); color: var(--text);
  border-radius: var(--leaf-card); box-shadow: var(--shadow-s);
  padding: var(--space-m);
}
.fee-head { display: grid; grid-template-columns: auto 1fr; gap: var(--space-s); align-items: start; }
.fee-card .icon-badge {
  display: grid; place-items: center; inline-size: var(--space-xl); aspect-ratio: 1;
  background: var(--soft); color: var(--on-soft); border-radius: var(--leaf-ui);
}
.fee-card .icon-badge .icon { font-size: var(--size-2); }
.fee-card h3 { font-size: var(--size-2); line-height: var(--leading); }
.fee-what { font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.fee-lines { margin: 0; display: grid; }
.fee-lines div {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-s);
  padding-block: var(--space-2xs);
  border-block-end: var(--border-width-s) dashed var(--border);
}
.fee-lines dt { color: var(--text); }
.fee-lines dd { margin: 0; font-variant-numeric: tabular-nums; font-weight: 600; color: var(--text-strong); white-space: nowrap; }
.fee-lines .fee-net {
  display: grid; justify-content: stretch; gap: 0;
  border-block-end: 0; margin-block-start: var(--space-2xs);
  padding: var(--space-xs) var(--space-s);
  background: var(--brand-soft); color: var(--brand-on-soft);
  border-radius: var(--leaf-ui);
}
.fee-lines .fee-net dt { color: var(--brand-on-soft); font-weight: 700; }
.fee-lines .fee-net dd { color: var(--brand-on-soft); font-family: var(--font-heading); font-weight: 700; font-size: var(--size-2); line-height: var(--leading); }
.split-even { grid-template-columns: 1fr 1fr; }
.prose h3:has(.icon) { display: flex; align-items: center; gap: var(--space-xs); }
.prose h3 .icon { color: var(--line); }
.tiers { margin: 0; display: grid; border-radius: var(--leaf-card); overflow: hidden; border: var(--border-width-s) solid var(--border); }
.tiers div { display: flex; justify-content: space-between; gap: var(--space-s); padding: var(--space-xs) var(--space-s); background: var(--surface-raised); color: var(--text); }
.tiers div + div { border-block-start: var(--border-width-s) solid var(--border); }
.tiers dt { color: var(--text); }
.tiers dd { margin: 0; font-weight: 700; color: var(--text-strong); text-align: end; }
.fee-link-card {
  display: grid; grid-template-columns: auto 1fr auto; gap: var(--space-s); align-items: center;
  background: var(--surface-raised); color: var(--text); text-decoration: none;
  border-radius: var(--leaf-card); box-shadow: var(--shadow-m);
  padding: var(--space-m);
  border-block-start: var(--space-3xs) solid var(--brand-line);
  transition: transform .2s ease;
}
.fee-link-card:hover { color: var(--text); transform: translateY(calc(-1 * var(--space-3xs))); }
.fee-link-card .icon-badge { display: grid; place-items: center; inline-size: var(--space-xl); aspect-ratio: 1; background: var(--brand-solid); color: var(--brand-on-solid); border-radius: var(--leaf-ui); }
.fee-link-card strong { display: block; font-family: var(--font-heading); font-weight: 700; font-size: var(--size-2); line-height: var(--leading); color: var(--text-strong); }
.fee-link-card > span:nth-child(2) > span { font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
.fee-link-card > .icon { color: var(--brand-line); }
@media (max-width: 1020px) { .fee-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .fee-grid, .fee-grid-2 { grid-template-columns: 1fr; } }

/* ---------- responsive ---------- */
/* one step down for the big headlines where their column is narrow (still needed with Crimson Pro:
   without it the home hero runs to four lines at 1180 and "Manunda." is left alone at 1180 and 390) */
@media (max-width: 1180px) {
  .page-hero h1, .hero h1 { font-size: var(--size-5); }
  .hero-text h1 { font-size: var(--size-6); }
  .welcome-grid { grid-template-columns: 1fr 1fr; }
  .welcome-photo { display: none; }
}
@media (max-width: 1180px) {
  .fact-list { grid-template-columns: repeat(3, 1fr); }
  .fact-list li:nth-child(n+4) { grid-column: span 1; }
}
@media (max-width: 1180px) {
  .svc-grid { grid-template-columns: repeat(2, 1fr); }
  .room-list { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 1020px) {
  .split-even { grid-template-columns: 1fr; }
  .page-hero-grid, .split, .split-flip, .contact-grid, .staff-grid { grid-template-columns: 1fr; }
  .page-hero-art { max-inline-size: 560px; inline-size: 100%; justify-self: center; }
  .hero-split.is-flip .page-hero-grid { grid-template-columns: 1fr; }
  .hero-split.is-flip .page-hero-art { order: 0; }
  .hero-wide-head, .hero-text-grid { grid-template-columns: 1fr; }
  .hero-text-art { max-inline-size: 280px; justify-self: end; margin-block-start: calc(-1 * var(--space-l)); }
  .item-grid { grid-template-columns: repeat(2, 1fr); }
  .values { grid-template-columns: repeat(2, 1fr); }
  .bio, .bio:nth-child(even) { grid-template-columns: 220px 1fr; }
  .bio:nth-child(even) .bio-photo { order: 0; }
  .gallery { block-size: 420px; }
  .hero-grid { grid-template-columns: 1fr; }
  .hero-copy { padding-block-end: 0; }
  .hours-card { position: relative; inset: auto; inline-size: auto; max-inline-size: 60ch; margin-block-start: calc(-1 * var(--space-s)); margin-inline: var(--space-s); }
  .doc-grid { grid-template-columns: repeat(2, 1fr); }
  .section-head { grid-template-columns: 1fr; }
  .section-intro { justify-self: start; }
  .people-row, .people-row-flip { grid-template-columns: 1fr; }
  .people-row-flip .people-photos { order: 0; }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .footer-urgent { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  /* the strip wraps: the first photo full width, the rest share a row at one height */
  .hero-strip-photos { flex-wrap: wrap; gap: var(--space-xs); }
  .hero-strip-photos li:first-child { flex-basis: 100%; }
  .hero-text h1 { font-size: var(--size-5); }
  .hero-text-art { display: none; }
  /* a wide photo runs edge to edge on a phone, so it stays large enough to read */
  .hero-wide-photo { margin-inline: calc(-1 * var(--space-m-xl)); border-radius: 0; }
  .svc-grid, .item-grid, .values, .room-list, .welcome-grid, .check-cols { grid-template-columns: 1fr; }
  .bio, .bio:nth-child(even) { grid-template-columns: 1fr; gap: var(--space-m); }
  .bio-photo { max-inline-size: 240px; }
  .gallery { grid-template-columns: 1fr 1fr; grid-template-rows: auto; block-size: auto; }
  .gallery figure { aspect-ratio: 1; }
  .gallery figure:first-child { grid-column: span 2; grid-row: auto; aspect-ratio: 4 / 3; }
  .welcome-card { padding: var(--space-m); }
  .cta-band .btn, .cta-band .reveal-wrap { inline-size: 100%; } /* the reveal wrapper passes the full width through */
  .item { grid-template-columns: auto 1fr; column-gap: var(--space-s); padding: var(--space-s) var(--space-m); }
  .item .icon-badge { grid-row: span 2; }
  .svc { grid-template-columns: auto 1fr; column-gap: var(--space-s); padding: var(--space-s) var(--space-m); }
  .svc-badge { grid-row: span 2; margin: 0; inline-size: var(--space-xl); }
  .svc-badge .icon { font-size: var(--size-2); }
  .svc-name { font-size: var(--size-1); padding-inline-end: var(--space-l); }
  .svc-more { inset-block-start: var(--space-s); }
  .header-row { gap: var(--space-xs); }
  .brand-link img { inline-size: 168px; }
  .header-book { padding: var(--space-2xs) var(--space-s); font-size: var(--size--1); }
  .fact-list { grid-template-columns: 1fr; gap: var(--space-s); }
  .fact-list li { grid-template-columns: auto 1fr; column-gap: var(--space-s); row-gap: 0; border-inline-start: 0; padding-inline-start: 0; }
  .fact-badge { grid-row: span 2; margin: 0; inline-size: var(--space-xl); }
  .fact-badge .icon { font-size: var(--size-2); }
  .doc-grid { grid-template-columns: 1fr; gap: var(--space-l); }
  .doc { grid-template-columns: 120px /* photo geometry */ 1fr; column-gap: var(--space-s); align-items: start; }
  .doc > :not(.doc-photo) { grid-column: 2; }
  .doc-photo { grid-row: 1 / span 5; inline-size: 100%; margin: 0; }
  .doc::before { inline-size: 120px /* photo geometry */; inset-block-start: var(--space-2xs); inset-inline-start: var(--space-2xs); }
  .doc h3 { font-size: var(--size-1); }
  .hours-card { padding: var(--space-m); }
  .allied { grid-template-columns: 1fr; padding: var(--space-m); }
  .allied-photo { inline-size: 160px; }
  .footer-grid { grid-template-columns: 1fr; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

/* Search overlay close: an × icon. The button's text "Close" stays as its accessible name. */
.mf-search-overlay__close { font-size: 0; inline-size: 44px; block-size: 44px; min-block-size: 0; padding: 0; display: inline-grid; place-items: center; }
.mf-search-overlay__close::before { content: ""; inline-size: 20px; block-size: 20px; background: currentColor; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 6l12 12M18 6L6 18' stroke='black' stroke-width='2.5' 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 24 24'%3E%3Cpath d='M6 6l12 12M18 6L6 18' stroke='black' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E") center / contain no-repeat; }

/* Contact map: a static map drawn from OpenStreetMap (tools/map/render.py) in this site's colours. */
.map-band h2 { margin-block-end: var(--space-s); }
.map-link { display: block; position: relative; border-radius: var(--leaf-card); overflow: hidden; outline-offset: 4px; }
.map-link img { display: block; inline-size: 100%; block-size: auto; aspect-ratio: 2 / 1; object-fit: cover; }
.map-cta { position: absolute; inset-inline-start: var(--space-s); inset-block-end: var(--space-s); padding: var(--space-2xs) var(--space-s); border-radius: var(--radius-pill); background: var(--brand-solid); color: var(--brand-on-solid); font-weight: 700; }
.map-link:hover .map-cta { background: color-mix(in oklab, var(--brand-solid), var(--mix-hover)); }
@media (max-width: 40rem) { .map-link img { aspect-ratio: 1 / 1; } }
.map-credit { margin-block-start: var(--space-2xs); font-size: var(--size--1); color: var(--text-muted, inherit); }

/* ---------- bulk billing doctor (Dr Anthony Abubo, 2026-11-08) ---------- */
/* a quiet leaf-shaped label on his card and profile: the secondary (logo blue) soft tint, so it stands apart from the green interest tags */
.bb-label {
  display: inline-flex; align-items: center; gap: var(--space-3xs); inline-size: fit-content;
  margin-block: var(--space-3xs) 0; padding: var(--space-3xs) var(--space-xs);
  font-size: var(--size--1); line-height: var(--leading); font-weight: 700;
  background: var(--secondary-soft); color: var(--secondary-on-soft);
  border: var(--border-width-s) solid var(--secondary-line);
  border-radius: var(--leaf-ui);
}
.bb-label .icon { font-size: 1.2em; }

/* the same fact as a short note in the billing copy */
.bb-note {
  display: flex; align-items: flex-start; gap: var(--space-xs);
  padding: var(--space-xs) var(--space-s);
  background: var(--secondary-soft); color: var(--secondary-on-soft);
  border-inline-start: var(--border-width-m) solid var(--secondary-line);
  border-radius: var(--leaf-card);
}
.bb-note .icon { font-size: 1.3em; flex: none; }

/* ---------- template integration ---------- */
/* lists in the site's own components carry no prose spacing (the base layer's li margin is for prose) */
:where(.nav, .fact-list, .svc-grid, .doc-grid, .tags, .visit-types, .doc-links, .footer-col, .footer-base, .social) li { margin: 0; }
/* the doctor photo frame doubles as the template's avatar fallback: its gradient and person icon show when the app has no photo */
.doc-photo.doctor-avatar { aspect-ratio: 1; border-radius: var(--leaf); }
.doc-cell:nth-child(even) .doc-photo.doctor-avatar { border-radius: var(--leaf-flip); }
/* the photos come from the app at up to 1000px; no frame grows past 300px, so the smallest (276px) is barely scaled */
.doc-photo, .doc::before { max-inline-size: 300px; /* photo geometry */ }
.allied-photo.doctor-avatar { aspect-ratio: 1; border-radius: var(--leaf); }
.allied .tags li { background: var(--secondary-soft); color: var(--secondary-on-soft); }
/* the interest tags arrive from the app as one comma-separated line: a script turns them into pills, and without it they read as text */
p.tags { display: block; font-size: var(--size--1); line-height: var(--leading); color: var(--text-muted); }
/* "Powered by Mediflare", in the footer's base row */
.footer-base .powered-by { display: flex; align-items: center; gap: var(--space-2xs); margin: 0; }
.footer-base .powered-by img { inline-size: 96px; /* logo geometry */ block-size: auto; }
.footer-base .powered-by a { padding-block: 0; }
/* a practitioner's bio from the app is plain text, paragraphs separated by blank lines */
.bio-body { white-space: pre-line; }
/* the website privacy policy and terms (the template's text): long prose, so smaller section headings, real bullets */
.legal h2 { font-size: var(--size-3); line-height: var(--leading); margin-block-start: var(--space-l); }
.legal h3 { font-size: var(--size-1); line-height: var(--leading); margin-block-start: var(--space-s); }
.legal ul { list-style: disc; padding-inline-start: var(--space-m); display: grid; gap: var(--space-3xs); }
.legal li { margin: 0; }
/* long URLs in the legal text break rather than widen the column on phones */
.legal { overflow-wrap: anywhere; }
.legal > * { min-inline-size: 0; }
/* on the green-tinted quiet band, coloured link text is not guaranteed (4.12:1): the design's rule for that band, extended
   to the legal text, whose links sit deeper than the band rule's .prose > p a */
.band-lowered .legal a { color: var(--text-strong); text-decoration-color: var(--brand-line); text-decoration-thickness: var(--border-width-m); }
/* a doctor's booking button names them, so it may wrap (the template's .btn is nowrap; long names widened the card on phones) */
.bio-actions .btn { white-space: normal; text-align: start; }
.bio-text { min-inline-size: 0; }
.legal p, .legal ul, .legal address { margin-block-end: var(--space-xs); }
/* a doctor's own billing (app#2279): the engine can only test that billing_type is set, not its value, so the label
   carries the key in data-billing and is shown for bulk_billing only. The markup also has the hidden attribute, so without
   this stylesheet nothing shows; the label's own display rule above would otherwise override [hidden]. */
.bb-label:not([data-billing="bulk_billing"]) { display: none; }
/* a practitioner with no photo prints an empty src in the telehealth rooms list (no nested {{#if}} in the engine): hide it */
.room-list img[src=""] { display: none; }
/* curved bands: the top corners curve into the band above, whose colour must show there, not the page's. The band above
   grows by the curve's depth (a transparent border, which its own background fills, so its spacing is unchanged), and the
   curved band is pulled up over it by the same amount and painted on top: the visible gap between the two bands' content
   is what it was. The depth covers the deepest top curve (5vw) of .band-curve and .cta-band. */
:root { --curve-depth: 5vw; }
:is(.band-curve, .cta-band) { position: relative; z-index: var(--layer-base); margin-block-start: calc(-1 * var(--curve-depth)); }
:has(+ :is(.band-curve, .cta-band)) { border-block-end: var(--curve-depth) solid transparent; }
/* opening hours note under the footer list */
.footer-hours-note { color: var(--text-muted); font-size: var(--size--1); line-height: var(--leading); }
