@charset "UTF-8";/* blockwright edit v2025-10-28-01 */
@layer theme-base {
  :root {
    /* breakpoints & rails are aliases; values defined in settings.custom */
    --bp-sm: var(--wp--custom--layout--breakpoints--sm);
    --bp-md: var(--wp--custom--layout--breakpoints--md);
    --bp-lg: var(--wp--custom--layout--breakpoints--lg);
    --bp-xl: var(--wp--custom--layout--breakpoints--xl);
    --rail-content-md: var(--wp--custom--layout--rail--content-md);
    --rail-content-lg: var(--wp--custom--layout--rail--content-lg);
    --rail-wide-md: var(--wp--custom--layout--rail--wide-md);
    --rail-wide-lg: var(--wp--custom--layout--rail--wide-lg);
  }
  /* Site chrome: neutralize any legacy inset shadows (borders now in template parts) */
  .wp-site-blocks > header,
  .wp-site-blocks > footer {
    box-shadow: none !important;
  }
}
/* === Header/Footer edge-to-edge override ===
   WordPress Core applies `margin-left: auto !important; margin-right: auto !important`
   to children of .is-layout-constrained that aren't .alignfull/.alignleft/.alignright.

   This override ensures alignfull outer groups in headers/footers stay edge-to-edge,
   whether their layout is flow (is-layout-flow) or constrained (is-layout-constrained) -
   e.g. header-standard/footer-simple use a constrained alignfull outer group, and a
   builder can switch any part's inner group to Full width.

   Both need the override because the page's own constrained layout applies margins.
*/
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-flow,
.wp-site-blocks > footer > .wp-block-group.alignfull.is-layout-flow,
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-constrained,
.wp-site-blocks > footer > .wp-block-group.alignfull.is-layout-constrained {
  margin-left: 0 !important;
  margin-right: 0 !important;
  margin-inline-start: 0 !important;
  margin-inline-end: 0 !important;
  max-width: none !important;
}

/* Inner alignfull children of full-width headers/footers also need the override */
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-flow .wp-block-group.alignfull,
.wp-site-blocks > footer > .wp-block-group.alignfull.is-layout-flow .wp-block-group.alignfull {
  margin-left: 0 !important;
  margin-right: 0 !important;
  margin-inline-start: 0 !important;
  margin-inline-end: 0 !important;
  max-width: none !important;
}

/* === Sticky header enablement ===
   WordPress's Position: Sticky control lands on the GROUP inside the header
   template part, not on the <header> wrapper. That group's containing block is
   then the <header>, which is the same height as the group - so the sticky has
   zero room to travel and unsticks the instant the page scrolls (it looks like
   sticky "isn't working"). Collapsing the wrapper's box with display:contents
   re-homes the sticky group's containing block to the page (.wp-site-blocks),
   so it stays pinned through the full scroll. Scoped with :has() so it only
   applies when a sticky child is actually present; ordinary headers are
   untouched. The <header> wrapper carries no box of its own (background and
   padding live on the inner group), so removing its box is visually inert, and
   display:contents does not change selector matching, so the header rules below
   and the edge-to-edge overrides above still apply. */
.wp-site-blocks > header:has(> .is-position-sticky) {
  display: contents;
}

/* === Header layout row (token-driven) ===
   Structural only: give the header row a token-driven nav-bar min-height.
   Do NOT set justify-content / gap / flex-wrap here - each header pattern
   declares its own (Header + Header: Contact use space-between; Header:
   Centered uses a vertical, centered stack), and WordPress emits it natively.
   A blanket space-between + global block-gap here would override those, e.g.
   forcing Header: Centered off-center - the same trap that split the footer
   brand lockup (see _layout.scss note). Scoped narrowly to the header
   structure Gutenberg emits. */
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-constrained > .wp-block-group.is-layout-flex,
.wp-site-blocks > header > .wp-block-group.alignfull > .wp-block-group.is-layout-flex {
  min-height: var(--wp--custom--nav--bar-height, calc(var(--wp--custom--button--py, 0.75rem) * 2 + 1rem));
}

/* alignwide header rows: constrain to wideSize, centered (WP's constrained
   layout does this, but restate it so it wins against the flex-row rule). */
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-constrained > .wp-block-group.alignwide.is-layout-flex {
  max-inline-size: var(--wp--style--global--wide-size);
  margin-inline: auto;
}

.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-constrained > .wp-block-group.is-layout-flex > .wp-block-group,
.wp-site-blocks > header > .wp-block-group.alignfull > .wp-block-group.is-layout-flex > .wp-block-group {
  flex: 0 0 auto;
}

.wp-site-blocks > header .wp-block-navigation .wp-block-navigation-item .wp-block-navigation-item__content,
.wp-site-blocks > header .wp-block-navigation .wp-block-navigation-link {
  padding-inline: var(--wp--custom--nav--link--pad-inline, 0.75rem);
  padding-block: var(--wp--custom--nav--link--pad-block, 0.125rem);
  /* border-radius comes from assets/blocks/navigation.css (site-wide) */
}

/* Primary content wrappers take the token-driven root padding (the site gutter).
   Applies to main, constrained groups, and template parts. */
.wp-site-blocks > main,
.wp-site-blocks main,
.wp-site-blocks .wp-block-group.is-layout-constrained,
.wp-site-blocks div.wp-block-template-part {
  padding-inline-start: var(--wp--style--root--padding-left);
  padding-inline-end: var(--wp--style--root--padding-right);
}

div.wp-block-template-part,
.wp-site-blocks div.wp-block-template-part {
  box-sizing: border-box;
}

/* === Block overrides (production-facing blocks) ===
   Token-driven styling for code blocks and pullquotes, so site-wide instances
   match the style-guide specimens. Separators are governed entirely by
   theme.json (config/theme/blocks/core-separator.json) + WP's auto-generated
   color classes - no override needed here. */
/* Code blocks: lateral spacing. */
.wp-site-blocks pre.wp-block-code {
  margin-inline: var(--wp--preset--spacing--medium);
}

/* Pullquotes: block padding. */
figure.wp-block-pullquote {
  padding-top: var(--wp--preset--spacing--x-large);
  padding-bottom: var(--wp--preset--spacing--x-large);
}

/* Flex space-between groups in content: constrain to the reading width and
   centre (core otherwise leaves them at their alignment width). Scoped to main
   so header/footer rows keep their own full-width layout. */
.wp-site-blocks main .wp-block-group.is-content-justification-space-between.is-layout-flex {
  max-inline-size: var(--wp--style--global--content-size);
  margin-inline: auto;
  box-sizing: border-box;
}

/* Header/footer wide inner groups (layout:default outer, not constrained) use
   wideSize. !important overrides core's higher-specificity layout rule. */
.wp-site-blocks > header > .wp-block-group.alignfull.is-layout-flow .wp-block-group.alignwide,
.wp-site-blocks > footer > .wp-block-group.alignfull.is-layout-flow .wp-block-group.alignwide {
  max-inline-size: var(--wp--style--global--wide-size) !important;
  margin-inline-start: auto !important;
  margin-inline-end: auto !important;
}

/* tidy the title block inside the row */
.wp-site-blocks > header .wp-block-site-title {
  margin: 0;
  line-height: 1.2;
}

/* Header, page content, and footer sit flush. WordPress puts its root block-gap (medium)
   between the three top-level blocks via `:where(.wp-site-blocks) > *`; our full-bleed
   section bands carry their own top/bottom padding, so that gap only ever shows a strip of
   page background between colored bands (most visibly a dark CTA above the footer). Zero it
   at the two root seams only - block spacing INSIDE <main> is untouched. */
.wp-site-blocks > main,
.wp-site-blocks > footer {
  margin-block-start: 0;
}

/* Compact mobile header: below the sm breakpoint the one-line row (logo + hamburger +
   phone + CTA) overflows, so we shrink two things to keep it a single slim sticky row
   without burying the phone/CTA in the menu:
   1. Hide the site-title wordmark (the site-logo carries the name via alt text; the
      title is level:0, a <p>, so nothing is lost to assistive tech or heading structure).
   2. Turn the phone NUMBER (.bw-call, a tel: link) into the Dashicons handset glyph -
      the same tap-to-call link, just the number collapsed and the icon shown via ::before.
      The full number stays on desktop. Dashicons is core (enqueued front-end in inc/assets.php).
   Responsive show/hide is a theme CSS media query on purpose - WP 6.9 has no block-level
   device visibility (see wordpress-best-practices.md). */
/* The header phone link (number on desktop, handset on mobile) is an action, not body
   copy - no underline, matching the theme's nav links (textDecoration:none). */
.wp-site-blocks > header .bw-call a {
  text-decoration: none;
}

@media not all and (min-width: 480px) {
  .wp-site-blocks > header .wp-block-site-title {
    display: none;
  }
  /* collapse the number text, keep the link tappable, show the handset glyph */
  .wp-site-blocks > header .bw-call a {
    font-size: 0;
    display: inline-flex;
    padding: var(--wp--preset--spacing--xx-small);
  }
  .wp-site-blocks > header .bw-call a::before {
    font-family: dashicons; /* token-exempt: core Dashicons font family name */
    content: "\f525"; /* token-exempt: Dashicons "phone" (handset) glyph */
    font-size: var(--wp--preset--font-size--xxl); /* ~22-24px at mobile widths (icon is hidden on desktop) */
    line-height: 1;
  }
}
/* === Typography Rhythm: Section Spacing ===
   Give major section headings (H2) breathing room when they follow content.
   Subsection headings (H3/H4) get moderate spacing for clear hierarchy. */
/* H2 section headings: generous top margin for visual separation */
.wp-site-blocks :where(h2):not(:first-child),
.wp-site-blocks :where(.wp-block-heading[class*=h2]):not(:first-child) {
  margin-block-start: var(--wp--preset--spacing--x-large);
}

/* H3/H4 subsection headings: moderate spacing when following paragraphs/content */
.wp-site-blocks :where(h3, h4):not(:first-child),
.wp-site-blocks :where(.wp-block-heading[class*=h3], .wp-block-heading[class*=h4]):not(:first-child) {
  margin-block-start: var(--wp--preset--spacing--large);
}

/* Tighten spacing when headings directly follow other headings (ladder effect) */
.wp-site-blocks :where(h1, h2, h3, h4, h5, h6) + :where(h1, h2, h3, h4, h5, h6) {
  margin-block-start: var(--wp--preset--spacing--medium);
}
/* Blockwright modern card update v2025-10-21 */
/* Safety: ensure WP core button always shows pointer (in case missing elsewhere) */
.wp-block-button__link {
  cursor: pointer;
}

/* Scorecard header (flex, single row): reuse-safe for any title/ref length
   (issue 0010). The ref stays clean on one line and never shrinks; the TITLE
   COLUMN is the one that gives - min-width:0 lets it shrink below its content so
   the title wraps and yields space to the ref, which keeps its place at top-right
   instead of spilling. space-between holds title-left / ref-right; the header
   just grows taller when the title wraps. Was: both sides nowrap + ref no-shrink,
   which fit exactly one string length and overflowed on anything longer.
   The title column is the header's only child group (the ref is a <p>). */
.bw-scorecard-head > .wp-block-group {
  min-width: 0;
}

.bw-scorecard-ref {
  flex-shrink: 0;
  white-space: nowrap;
}

.bw-scorecard-title {
  min-width: 0;
  white-space: normal;
  overflow-wrap: break-word;
}

/* Status chip never breaks mid-word or shrinks - the row label wraps instead
   (matters at narrow/mobile widths). */
.bw-scorecard-chip {
  white-space: nowrap;
  flex-shrink: 0;
  /* Uniform-width status column: all chips share a min-width so their left edges
     line up into a clean status column (designer call). ch scales with the chip
     font across breakpoints; longer statuses grow past it. text-align centers the
     shorter labels within the shared width. */
  min-width: 8ch;
  text-align: center;
}

/* ...and the row LABEL is what gives: flex/min-width:0 lets it absorb the row's
   width and wrap its own text, so the chip stays on the row pinned right. Without
   it the label's content width + chip exceeds a narrow mobile column and the row
   (flex-wrap:wrap) drops the chip to its own line, where space-between left-aligns
   it - the mobile misalignment. Rows carry no class, so target the chip's sibling
   (the theme already uses :has() for the sticky header and stamp). */
.wp-block-group:has(> .bw-scorecard-chip) > p:not(.bw-scorecard-chip) {
  flex: 1 1 0;
  min-width: 0;
}

/* The resolved-card "Fixed" stamp lives in assets/blocks/group.css (loaded via
   wp_enqueue_block_style on core/group) so it renders in BOTH the front end and
   the editor iframe - enqueue_block_assets / a front-end-only bundle does not
   reach the post editor canvas. */
/*
 * Button appearance - the SINGLE source for Gutenberg block buttons (core/button,
 * plus the search/file block buttons). Token-driven; author overrides respected via
 * revert-layer. Base look + the three CTA variants (fill / accent / subtle) + hover /
 * active / disabled all live here.
 *
 * Related by design - NOT duplicates (see docs/styling-architecture.md):
 *   - theme.json elements.button - same tokens, for editor parity + the block controls.
 *   - _interactive.scss - the shared focus-ring + base transition baseline for ALL
 *     interactive controls, so buttons/links/inputs focus identically.
 *   - _forms.scss - native form submit/reset <input> buttons (form controls, amber CTA).
 */
:where(.wp-element-button,
.wp-block-button__link,
.wp-block-search__button,
.wp-block-file__button) {
  --_bg: var(--wp--custom--button--default--bg);
  --_bg-h: var(--wp--custom--button--default--bg-hover);
  --_bg-a: var(--wp--custom--button--default--bg-active);
  --_tx: var(--wp--custom--button--default--text);
  --_border: transparent;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--wp--custom--button--text-gap, 0.5ch);
  background: var(--_bg);
  color: var(--_tx);
  border: var(--wp--custom--border--width--thin, 1px) solid var(--_border);
  border-radius: var(--wp--custom--button--radius);
  padding-block: var(--wp--custom--button--py);
  padding-inline: var(--wp--custom--button--px);
  line-height: calc(var(--wp--custom--button--height, 2.5rem) - var(--wp--custom--border--width--thin, 1px) * 2);
  min-height: var(--wp--custom--button--height, 2.5rem);
  font-weight: var(--wp--custom--button--weight);
  font-size: var(--wp--custom--button--font-size);
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--wp--custom--motion--duration--fast) linear, border-color var(--wp--custom--motion--duration--fast) linear, transform var(--wp--custom--motion--duration--x-fast) var(--wp--custom--motion--easing--standard), filter var(--wp--custom--motion--duration--fast) linear;
}

/* Respect author overrides */
:where(.wp-element-button, .wp-block-button__link).has-background,
:where(.wp-element-button, .wp-block-button__link)[style*=background] {
  background: revert-layer;
  color: revert-layer;
}

:where(.wp-element-button, .wp-block-button__link).has-text-color,
:where(.wp-element-button, .wp-block-button__link)[style*=color] {
  color: revert-layer;
}

:where(.wp-element-button, .wp-block-button__link):hover {
  background: var(--_bg-h);
}

:where(.wp-element-button, .wp-block-button__link):active {
  background: var(--_bg-a);
  transform: translateY(var(--wp--custom--border--width--thin));
}

/* Focus ring: provided by the shared interactive baseline in _interactive.scss
   (identical tokens - link colour, form focus-width). Not redefined here. */
:where(.wp-element-button, .wp-block-button__link)[disabled],
:where(.wp-element-button, .wp-block-button__link).is-disabled,
:where(.wp-element-button, .wp-block-button__link)[aria-disabled=true] {
  opacity: 0.6;
  pointer-events: none;
}

/* ─────────────────────────────────────────────────────────────────────────────
   CTA VARIANTS - Marketing buttons with generous sizing and clear hierarchy
   ───────────────────────────────────────────────────────────────────────────── */
/* Shared CTA base - generous padding and prominent typography.
   is-style-outline is qualified with :not() so it out-specificities core's
   own outline padding rule (0,4,0) and takes the SAME box as the primary -
   fixes the size inversion (secondary must never be larger than primary). */
.wp-block-button.is-style-fill .wp-block-button__link,
.wp-block-button.is-style-accent .wp-block-button__link,
.wp-block-button.is-style-subtle .wp-block-button__link,
.wp-block-button.is-style-outline .wp-block-button__link:not(.has-background):not([style*=background]) {
  padding-block: var(--wp--custom--button--cta--py);
  padding-inline: var(--wp--custom--button--cta--px);
  border-radius: var(--wp--custom--button--cta--radius);
  font-weight: var(--wp--custom--button--cta--weight);
  font-size: var(--wp--custom--button--cta--font-size);
  min-height: calc(var(--wp--custom--button--cta--py) * 2 + var(--wp--custom--button--cta--font-size) * 1.2 + var(--wp--custom--border--width--thin, 1px) * 2);
  line-height: 1.2;
}

/* PRIMARY CTA (is-style-fill) - Solid background, highest emphasis */
.wp-block-button.is-style-fill .wp-block-button__link:not(.has-background):not([style*=background]) {
  --_bg: var(--wp--custom--button--primary--bg);
  --_bg-h: var(--wp--custom--button--primary--bg-hover);
  --_bg-a: var(--wp--custom--button--primary--bg-active);
  --_tx: var(--wp--custom--button--primary--text);
  --_border: transparent;
  background: var(--_bg);
  color: var(--_tx);
}

.wp-block-button.is-style-fill .wp-block-button__link:not(.has-background):not([style*=background]):hover {
  background: var(--wp--custom--button--primary--bg-hover);
}

.wp-block-button.is-style-fill .wp-block-button__link:not(.has-background):not([style*=background]):active {
  background: var(--wp--custom--button--primary--bg-active);
  transform: translateY(var(--wp--custom--border--width--thin));
}

/* ACCENT CTA (is-style-accent) - Soft accent tint, medium emphasis */
.wp-block-button.is-style-accent .wp-block-button__link:not(.has-background):not([style*=background]) {
  --_bg: var(--wp--custom--button--accent--bg);
  --_bg-h: var(--wp--custom--button--accent--bg-hover);
  --_bg-a: var(--wp--custom--button--accent--bg-active);
  --_tx: var(--wp--custom--button--accent--text);
  --_border: var(--wp--custom--button--accent--border);
  background: var(--_bg);
  color: var(--_tx);
  border-color: var(--_border);
}

.wp-block-button.is-style-accent .wp-block-button__link:not(.has-background):not([style*=background]):hover {
  background: var(--wp--custom--button--accent--bg-hover);
}

.wp-block-button.is-style-accent .wp-block-button__link:not(.has-background):not([style*=background]):active {
  background: var(--wp--custom--button--accent--bg-active);
  transform: translateY(var(--wp--custom--border--width--thin));
}

/* SUBTLE CTA (is-style-subtle) - Ghost: accent text only, no border, lowest emphasis */
.wp-block-button.is-style-subtle .wp-block-button__link:not(.has-background):not([style*=background]) {
  --_bg: var(--wp--custom--button--subtle--bg);
  --_bg-h: var(--wp--custom--button--subtle--bg-hover);
  --_bg-a: var(--wp--custom--button--subtle--bg-active);
  --_tx: var(--wp--custom--button--subtle--text);
  --_border: var(--wp--custom--button--subtle--border);
  background: var(--_bg);
  color: var(--_tx);
  border-color: var(--_border);
}

.wp-block-button.is-style-subtle .wp-block-button__link:not(.has-background):not([style*=background]):hover {
  background: var(--wp--custom--button--subtle--bg-hover);
}

.wp-block-button.is-style-subtle .wp-block-button__link:not(.has-background):not([style*=background]):active {
  background: var(--wp--custom--button--subtle--bg-active);
  transform: translateY(var(--wp--custom--border--width--thin));
}

/* OUTLINE (core "Outline" style) - themed as the accent secondary.
   Core leaves this transparent with a currentColor (neutral) 2px border, so it
   renders black/white in every colour scheme AND misses the CTA sizing above -
   the two defects Mark flagged. Re-point it at the subtle (accent-outline)
   tokens and a thin border so it reads gold, adapts per scheme, and sits at the
   same size as the primary. Selectors are :not()-qualified (0,5,0) to beat
   core's outline rules (0,4,0). This corrects already-placed buttons (they
   already carry .is-style-outline) with no pattern re-insert. */
.wp-block-button.is-style-outline .wp-block-button__link:not(.has-background):not([style*=background]) {
  --_bg: var(--wp--custom--button--outline--bg);
  --_bg-h: var(--wp--custom--button--outline--bg-hover);
  --_bg-a: var(--wp--custom--button--outline--bg-active);
  --_tx: var(--wp--custom--button--outline--text);
  --_border: var(--wp--custom--button--outline--border);
  background: var(--_bg);
  color: var(--_tx);
  border-color: var(--_border);
  border-width: var(--wp--custom--border--width--thin, 1px);
}

.wp-block-button.is-style-outline .wp-block-button__link:not(.has-background):not([style*=background]):hover {
  background: var(--wp--custom--button--outline--bg-hover);
}

.wp-block-button.is-style-outline .wp-block-button__link:not(.has-background):not([style*=background]):active {
  background: var(--wp--custom--button--outline--bg-active);
  transform: translateY(var(--wp--custom--border--width--thin));
}

body,
.wp-site-blocks {
  text-align: start;
}

:where(h1, h2, h3, h4, h5, h6, p, ul, ol, blockquote, figure) {
  text-align: inherit;
}

/* Layout & structure (moved from custom.css) */
input[type=text],
input[type=email],
input[type=url],
input[type=password],
input[type=search],
input[type=tel],
input[type=number],
input[type=date],
input[type=datetime-local],
input[type=month],
input[type=week],
input[type=time],
select,
textarea {
  min-height: var(--wp--custom--form--control-height);
  padding-inline: var(--wp--preset--spacing--x-small);
  border-radius: var(--wp--preset--border-radius--m);
  border-width: var(--wp--custom--border--width--thin);
  border-style: solid;
  border-color: var(--wp--preset--color--outline-1);
  background-color: var(--wp--preset--color--surface-1);
  color: var(--wp--preset--color--text-1);
  font-family: var(--wp--preset--font-family--body);
  font-size: var(--wp--preset--font-size--base);
  line-height: var(--wp--custom--typography--line-height-control);
}

input::placeholder,
textarea::placeholder {
  color: var(--wp--preset--color--text-2);
  opacity: 1;
}

input:focus,
select:focus,
textarea:focus,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  border-color: var(--wp--preset--color--focus);
  outline: var(--wp--custom--form--focus-width) solid var(--wp--preset--color--focus);
  outline-offset: var(--wp--preset--spacing--xxx-small);
}

input[type=checkbox],
input[type=radio] {
  accent-color: var(--wp--preset--color--link);
}

input[type=submit],
input[type=reset],
input[type=button],
button[type=submit],
button[type=reset] {
  min-height: var(--wp--custom--form--control-height);
  padding-block: var(--wp--preset--spacing--x-small);
  padding-inline: var(--wp--preset--spacing--small);
  border: var(--wp--custom--border--width--thin) solid transparent;
  border-radius: var(--wp--preset--border-radius--m);
  background-color: var(--wp--preset--color--link);
  color: var(--wp--preset--color--on-primary);
  font-family: var(--wp--preset--font-family--body);
  font-size: var(--wp--preset--font-size--base);
  font-weight: var(--wp--custom--button--weight);
  line-height: var(--wp--custom--typography--line-height-control);
  cursor: pointer;
}
input[type=submit]:hover,
input[type=reset]:hover,
input[type=button]:hover,
button[type=submit]:hover,
button[type=reset]:hover {
  background-color: var(--wp--preset--color--link-hover);
}
input[type=submit]:active,
input[type=reset]:active,
input[type=button]:active,
button[type=submit]:active,
button[type=reset]:active {
  background-color: var(--wp--preset--color--link-active);
}
input[type=submit]:focus-visible,
input[type=reset]:focus-visible,
input[type=button]:focus-visible,
button[type=submit]:focus-visible,
button[type=reset]:focus-visible {
  outline: var(--wp--custom--form--focus-width) solid var(--wp--preset--color--focus);
  outline-offset: var(--wp--preset--spacing--xxx-small);
}
input[type=submit][disabled], input[type=submit][aria-disabled=true],
input[type=reset][disabled],
input[type=reset][aria-disabled=true],
input[type=button][disabled],
input[type=button][aria-disabled=true],
button[type=submit][disabled],
button[type=submit][aria-disabled=true],
button[type=reset][disabled],
button[type=reset][aria-disabled=true] {
  opacity: 0.6;
  cursor: not-allowed;
}

/* Native form elements (moved from custom.css) */
:where(a,
button,
[role=button],
.wp-element-button,
input,
select,
textarea):focus-visible {
  outline: var(--wp--custom--form--focus-width) solid var(--wp--custom--form--focus-ring);
  outline-offset: var(--wp--preset--spacing--xx-small);
}

a {
  text-decoration-thickness: var(--wp--custom--border--width--thin);
  text-underline-offset: 0.15em;
  transition: color 0.15s ease, text-decoration-color 0.15s ease;
}

:where(h1, h2, h3, h4, h5, h6) {
  text-wrap: balance;
}

:where(p, li, dd, figcaption, blockquote) {
  text-wrap: pretty;
  overflow-wrap: normal;
}

:where(h1, h2, h3, h4, h5, h6)[id] {
  /* Clear the sticky header: its bar height plus a little breathing room, both tokens. */
  scroll-margin-top: calc(var(--wp--custom--nav--bar-height) + var(--wp--preset--spacing--medium));
}

:where(.wp-element-button,
.wp-block-button__link,
button,
input[type=submit],
input[type=button]) {
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

::selection {
  background-color: color-mix(in oklab, var(--wp--preset--color--text-1) 16%, transparent);
}

.bw-page-header {
  margin-bottom: var(--wp--preset--spacing--large);
  padding-bottom: var(--wp--preset--spacing--small);
  border-bottom: var(--wp--custom--border--width--thin, 1px) solid var(--wp--preset--color--divider);
}

.bw-page-header .wp-block-post-title {
  margin: 0;
  font-size: var(--wp--preset--font-size--xxl);
}

.wp-block-post-title a {
  color: var(--wp--preset--color--text-1);
  text-decoration: none;
}

.wp-block-post-title a:hover,
.wp-block-post-title a:focus {
  color: var(--wp--preset--color--link);
  text-decoration: underline;
}

p.has-text-2-color[style*="text-transform:uppercase"] {
  font-family: var(--wp--preset--font-family--mono);
}

.bw-stats .has-xxl-font-size {
  white-space: nowrap;
}

.bw-stats p {
  overflow-wrap: normal;
}

.alignleft {
  float: left;
  margin-inline-end: 1.5em;
  margin-block-end: 1em;
}

.alignright {
  float: right;
  margin-inline-start: 1.5em;
  margin-block-end: 1em;
}

.aligncenter {
  display: block;
  margin-inline: auto;
  margin-block-end: 1em;
}

.is-layout-constrained.alignfull > .alignleft {
  margin-inline-start: max(0px, (100% - var(--wp--style--global--content-size)) / 2);
}

.is-layout-constrained.alignfull > .alignright {
  margin-inline-end: max(0px, (100% - var(--wp--style--global--content-size)) / 2);
}

pre {
  max-width: 100%;
  overflow-x: auto;
}

.screen-reader-text {
  border: 0;
  clip-path: inset(50%);
  height: 1px; /* token-exempt: screen-reader-text clip idiom - a fixed a11y hiding technique, not a design value */
  width: 1px; /* token-exempt: screen-reader-text clip idiom */
  margin: -1px;
  padding: 0;
  overflow: hidden;
  position: absolute !important;
  white-space: nowrap;
  word-wrap: normal !important;
}

.screen-reader-text:focus {
  clip-path: none;
  height: auto;
  width: auto;
  margin: 0;
  padding: var(--wp--preset--spacing--x-small) var(--wp--preset--spacing--small);
  z-index: 100000;
  background-color: var(--wp--preset--color--surface-1);
  color: var(--wp--preset--color--text-1);
}

.wp-caption {
  max-width: min(100%, var(--wp--style--global--content-size)) !important;
}

.wp-caption img {
  height: auto;
}

.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
  padding-inline: var(--wp--preset--spacing--medium);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-close {
  top: var(--wp--preset--spacing--small);
  inset-inline-end: var(--wp--preset--spacing--small);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
  --navigation-layout-align: flex-start;
  --navigation-layout-justification-setting: flex-start;
}

.wp-caption-text,
.wp-element-caption,
figure.wp-block-image figcaption {
  font-size: var(--wp--preset--font-size--s);
  color: var(--wp--preset--color--text-2);
  text-align: center;
  margin-block-start: 0.5em;
}

.gallery {
  display: grid;
  gap: var(--wp--preset--spacing--small);
  margin-block: var(--wp--preset--spacing--medium);
  grid-template-columns: repeat(3, 1fr);
}

.gallery-columns-2 {
  grid-template-columns: repeat(2, 1fr);
}

.gallery-columns-4 {
  grid-template-columns: repeat(4, 1fr);
}

.gallery-columns-5 {
  grid-template-columns: repeat(5, 1fr);
}

.gallery-item {
  margin: 0;
}

.gallery img {
  width: 100%;
  height: auto;
  display: block;
}

.sticky {
  outline: var(--wp--custom--border--width--thin, 1px) solid var(--wp--preset--color--border-subtle);
  outline-offset: var(--wp--preset--spacing--x-small, 0.5rem);
  border-radius: var(--wp--preset--border-radius--m, 0.25rem);
}

@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;
  }
}
/* Focus/link styles (moved from custom.css) */
/* Navigation - kept in the GLOBAL bundle (nav is on every page, so lazy-loading buys nothing). Consolidated from the former assets/blocks/navigation.css. */
/* blockwright edit v2025-01-09 */
/* Container gap for nav items */
.wp-block-navigation .wp-block-navigation__container {
  gap: var(--wp--preset--spacing--small);
}

.wp-block-navigation .wp-block-navigation-link,
.wp-block-navigation .wp-block-navigation-item__content,
.wp-block-navigation .wp-block-navigation__submenu-icon {
  border-radius: var(--wp--custom--nav--link--radius);
}

.wp-block-navigation .wp-block-navigation__container a:focus-visible,
.wp-block-navigation .wp-block-navigation__container button:focus-visible,
.wp-block-navigation .wp-block-navigation__container .wp-block-navigation-item__content:focus-visible {
  outline: var(--wp--custom--nav--focus-ring--width) solid var(--wp--custom--nav--focus-ring--color);
  outline-offset: var(--wp--preset--spacing--xx-small);
}

.wp-block-navigation .current-menu-item > .wp-block-navigation-link,
.wp-block-navigation .current-menu-item > .wp-block-navigation-item__content,
.wp-block-navigation .current-menu-item > .wp-block-navigation-submenu__toggle,
.wp-block-navigation .current-menu-ancestor > .wp-block-navigation-link,
.wp-block-navigation .current-menu-ancestor > .wp-block-navigation-item__content,
.wp-block-navigation .current-menu-ancestor > .wp-block-navigation-submenu__toggle,
.wp-block-navigation .wp-block-navigation-link[aria-current] {
  background-color: var(--wp--custom--nav--link--current--bg);
  color: var(--wp--custom--nav--link--current--text);
}

.wp-block-navigation .wp-block-navigation__container button:hover,
.wp-block-navigation .wp-block-navigation__container button:focus-visible {
  background-color: var(--wp--custom--nav--link--hover--bg);
  color: var(--wp--custom--nav--link--hover--text);
}

/* === Header nav: custom collapse breakpoint ===
   Core flips the nav from hamburger to the inline horizontal menu at a fixed min-width
   of 600 (wp-includes/blocks/navigation/style.css) and there is NO editor/theme.json
   setting for it - the documented way to change it is a CSS media-query override. The
   "Header: Contact" part packs branding + phone + CTA + nav on one nowrap row, so the
   inline menu overflows the tablet band (roughly 600 to 1000 wide; verified 840 of
   content at a 768 viewport). Keep it collapsed to the overlay hamburger until `lg`
   (1024), where the full header is verified to fit, then let core's horizontal menu
   take over.
   These rules live in the UNLAYERED global bundle (not theme-base.css's @layer, which
   would lose to core's unlayered display rules) and are header-scoped, so they beat core
   by specificity + source order - no !important. The `:not(.is-menu-open)` gate mirrors
   core's own and is REQUIRED: without it, hiding the container also blocks the overlay
   from opening. */
@media not all and (min-width: 1024px) {
  .wp-site-blocks > header .wp-block-navigation__responsive-container-open:not(.always-shown) {
    display: flex;
  }
  .wp-site-blocks > header .wp-block-navigation__responsive-container:not(.hidden-by-default):not(.is-menu-open) {
    display: none;
  }
}
/* The hamburger toggle uses the gold accent whenever it shows (every collapsed width,
   not just the deep-mobile band), matching the header's other foreground icons (phone
   glyph, wp:icon blocks). Core hides this button at `lg` and up, so it is a no-op on
   desktop. */
.wp-site-blocks > header .wp-block-navigation__responsive-container-open {
  color: var(--wp--preset--color--primary);
}

/* Submenu dropdown container - must match core specificity (.has-child) */
.wp-block-navigation .has-child .wp-block-navigation__submenu-container {
  gap: var(--wp--preset--spacing--small);
  background-color: var(--wp--preset--color--surface-2);
  color: var(--wp--preset--color--text-1);
  border: var(--wp--custom--border--width--thin) solid var(--wp--preset--color--border-subtle);
  border-radius: var(--wp--preset--border-radius--m);
  box-shadow: var(--wp--custom--shadow--m);
}

/* Navigation - global (nav is on every page) */
/* src/styles/index.scss - Blockwright */
/* -------------------------------------------------------------------------- */
/* Vendor CSS includes                                                         */
/* -------------------------------------------------------------------------- */
/* Open Props runtime removed: values copied into Blockwright tokens. No runtime import. */
/* -------------------------------------------------------------------------- */
/* Root & base                                                                 */
/* -------------------------------------------------------------------------- */
:root {
  color-scheme: light dark;
}

html {
  /* scrollbar-gutter removed - was causing edge-to-edge layout issues */
}

body {
  margin: 0;
  background: var(--wp--preset--color--surface-1);
  color: var(--wp--preset--color--text-1, canvasText);
  /* Body font-family is owned by WordPress global styles (theme.json +
      style variations). Hardcoding it here would out-specify variations and
      stop them from changing the font - so it is intentionally omitted. */
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: clip; /* avoid subpixel horizontal jiggle */
}

/* Layout tokens derived from WP globals (with safe fallbacks) */
:root {
  --bw-gutter: clamp(
  	var(--wp--custom--layout--gutter-min),
  	3vw,
  	var(--wp--custom--layout--gutter-max)
  );
  --bw-adminbar: 0;
  /* Keep these defined so patterns/blocks using the WP vars remain predictable */
  --wp--style--root--padding-left: var(--bw-gutter);
  --wp--style--root--padding-right: var(--bw-gutter);
  /* Featured image aspect can be adjusted project-wide if desired */
  --bw-fi-aspect: 16 / 9;
}

body.admin-bar {
  --bw-adminbar: var(--wp--custom--layout--adminbar--desktop);
}

@media (max-width: 48.875rem) { /* token-exempt: fixed WP admin-bar breakpoint (782px), not a design token - media queries aren't expressible in theme.json */
  /* WP admin-bar mobile breakpoint (782px) */
  body.admin-bar {
    --bw-adminbar: var(--wp--custom--layout--adminbar--mobile);
  }
}
/* -------------------------------------------------------------------------- */
/* Page shell                                                                  */
/* -------------------------------------------------------------------------- */
/* IMPORTANT: Core already applies global padding to .wp-site-blocks when
   useRootPaddingAwareAlignments = true. Do NOT add our own side padding here
   or we get double gutters. */
/* (Removed the old padding-inline on .wp-site-blocks) */
/* Sticky footer: push footer to bottom on short pages */
.wp-site-blocks {
  min-height: calc(100svh - var(--bw-adminbar));
  display: flex;
  flex-direction: column;
}

/* Grow main to fill available space */
.wp-site-blocks > main,
.wp-site-blocks > main.wp-block-group {
  flex: 1 1 auto;
}

/* -------------------------------------------------------------------------- */
/* Header / Footer rows = clamp to content width                               */
/* -------------------------------------------------------------------------- */
/* Remove list padding blowout for post templates when global padding is active */
.wp-site-blocks > main.has-global-padding > ul.wp-block-post-template,
.wp-site-blocks > main.has-global-padding > ol.wp-block-post-template {
  list-style: none;
  padding-inline-start: 0;
  margin-left: calc(var(--wp--style--root--padding-left, 0) * -1);
  margin-right: calc(var(--wp--style--root--padding-right, 0) * -1);
}

/* -------------------------------------------------------------------------- */
/* Featured image (FI) polish                                                  */
/* -------------------------------------------------------------------------- */
/* If a FI block renders without an <img> (e.g., no thumbnail), collapse it */
.wp-block-post-featured-image:not(:has(img)) {
  display: none;
}

/* For real thumbnails: keep them tidy and modern by default */
.wp-block-post-featured-image img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: var(--bw-fi-aspect);
  object-fit: cover;
  border-radius: var(--wp--preset--border-radius--m, 0.5rem);
}

/* Button appearance lives in _buttons.scss (the single source); native form
   submit/reset buttons live in _forms.scss. A duplicate base-button block that
   re-declared the same button tokens used to sit here - removed in the button
   consolidation so there is one owner per button type. */
button {
  border: 0;
}