:root {
  /* chassis contract */
  --cx-fg: #01172e; --cx-bg: #ffffff; --cx-accent: #3e94ff; --cx-line: #dbdfe2;
  --cx-font-body: 'Chivo', sans-serif; --cx-font-display: 'Chivo', sans-serif;
  /* Type in rem (audit F53): identical at the default 16px, and it follows a visitor who set a larger
     default font size, which px ignored. The vw term only moves within the rem bounds. */
  --cx-body: clamp(1rem, 1.05vw, 1.125rem);
  --cx-h1: clamp(2.375rem, 6.4vw, 5.25rem); --cx-h2: clamp(1.75rem, 3.6vw, 3rem); --cx-h3: clamp(1.1875rem, 1.6vw, 1.5rem);
  --cx-gap: 24px; --cx-wrap: 1240px; --cx-measure: 32em;
  --sp-gutter: clamp(16px, 12px + 2.2vw, 64px);
  --sp-section-compact: clamp(32px, 20.11px + 3.0476vw, 64px);
  --sp-section-standard: clamp(48px, 30.17px + 4.5714vw, 96px);
  --sp-section-generous: clamp(64px, 40.23px + 6.0952vw, 128px);
  --sp-eyebrow: clamp(8px, 5.77px + 0.5714vw, 14px);
  --sp-head-intro: clamp(14px, 11.03px + 0.7619vw, 22px);
  --sp-intro-content: clamp(28px, 22.06px + 1.5238vw, 44px);
  --sp-para: clamp(14px, 12.51px + 0.381vw, 18px);
  --sp-text-buttons: clamp(22px, 19.03px + 0.7619vw, 30px);
  --sp-buttons: clamp(12px, 11.26px + 0.1905vw, 14px);
  --sp-card-gap: clamp(18px, 14.29px + 0.9524vw, 28px);
  --sp-card-inset: clamp(20px, 17.03px + 0.7619vw, 28px);
  --sp-columns: clamp(28px, 17.6px + 2.6667vw, 56px);
  --sp-caption: 10px;
  --sp-form-label: 7px;
  --sp-form-group: 22px;
  --cx-band: var(--sp-section-standard);
  --cx-radius: 8px; --cx-radius-media: 14px;
  --cx-head-h: 74px; --cx-bar-h: 64px;
  /* renderer */
  --r-accent: #3e94ff; --r-on-accent: #0b0f17;
  --r-ground: #ffffff; --r-ink: #01172e;
  --r-inverse-bg: #01172e; --r-inverse-fg: #ffffff; --r-inverse-muted: #9ea7b0; --r-inverse-line: #25374b; --r-inverse-accent: #3e94ff;
  --r-inverse-accent-text: #3e94ff;
  --r-display: 'Chivo', sans-serif; --r-body: 'Chivo', sans-serif;
  --r-display-weight: 800; --r-display-tracking: -0.01em;
  --r-eyebrow: .8125rem; --r-micro: .75rem;
  --r-case-display: none; --r-case-label: uppercase;
  --r-bg: #ffffff; --r-surface: #f5f6f7; --r-fg: #01172e; --r-muted: #626f7d; --r-line: #dbdfe2; --r-accent: #3e94ff; --r-on-accent: #0b0f17; --r-accent-text: #2c6fc0;
}
[data-theme="light"] {
  --r-bg: #ffffff; --r-surface: #f5f6f7; --r-fg: #01172e; --r-muted: #626f7d; --r-line: #dbdfe2; --r-accent: #3e94ff; --r-on-accent: #0b0f17; --r-accent-text: #2c6fc0;
}
[data-theme="dark"] {
  --r-bg: #01172e; --r-surface: #0b2036; --r-fg: #ffffff; --r-muted: #9ea7b0; --r-line: #25374b; --r-accent: #3e94ff; --r-on-accent: #0b0f17; --r-accent-text: #3e94ff;
}
[data-theme="brand"] {
  --r-bg: #01172e; --r-surface: #0b2036; --r-fg: #ffffff; --r-muted: #9ea7b0; --r-line: #25374b; --r-accent: #3e94ff; --r-on-accent: #0b0f17; --r-accent-text: #3e94ff;
}
[data-theme="accent"] {
  --r-bg: #3e94ff; --r-surface: #3e94ff; --r-fg: #0b0f17; --r-muted: #0b0f17; --r-line: #0b0f17; --r-accent-text: #0b0f17;
}

@font-face { font-family: 'Chivo'; font-style: normal; font-weight: 300 900; font-display: swap; src: url('/assets/fonts/chivo/chivo-300-900.woff2') format('woff2'); }


.r-cols-1, .r-cols-2, .r-cols-3, .r-cols-4 { display: grid; }
@media (max-width: 719px) { .r-cols-1, .r-cols-2, .r-cols-3, .r-cols-4 { grid-template-columns: minmax(0, 1fr); } }
@media (min-width: 720px) {
  .r-cols-1 { grid-template-columns: minmax(0, 1fr); }
  .r-cols-2, .r-cols-3, .r-cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* Three or nine cards in two columns leave a hole beside the last one (audit F46: measured on both
   sites between 720 and 999px). On that tier the odd last card takes the whole row, which reads as a
   choice; the bare half-row never did. */
@media (min-width: 720px) and (max-width: 999px) {
  .r-cols-3 > :last-child:nth-child(odd) { grid-column: 1 / -1; }
}
@media (min-width: 1000px) {
  .r-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  /* Four across, on ONE row. Four is a divisor like any other, and leaving it out of the list sent four
     steps into a two-by-two block that looked right and was not: a skin removes the right border from
     the LAST card because in a single row that edge is the section's own edge, and in two rows the last
     card sits at the right-hand end of the second row with its box left open. The idiom is the skin's
     to write; the row count is the renderer's to choose, and choosing two rows for four cards broke it. */
  .r-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
/* No divisor: a flex row whose last line grows into whatever is left, so there is never bare ground
   under the cards. Wider cards on the last line read as deliberate; a hole never does. */
.r-cols-fill { display: flex; flex-wrap: wrap; }
.r-cols-fill > * { flex: 1 1 320px; min-width: 0; }

/* ---- shared components (renderer) ---- */
.r-section { padding-block: var(--cx-band); background: var(--r-bg); color: var(--r-fg); }
/* Per-section density (spec section.density): the band is redefined on the section itself, so its own
   padding and anything inside that reads --cx-band move together. */
section[data-density="tight"] { --cx-band: var(--sp-section-compact); }
section[data-density="open"] { --cx-band: var(--sp-section-generous); }
/* One owner for the gap between two sections on the same ground (the owner's rule 3). Two full insets
   meet there with nothing to separate them, so the space reads as a hole rather than a pause: the second
   section starts at half its inset, and the seam is one and a half insets. A change of ground is its own
   separation and keeps both. Which joins share a ground is MEASURED after the skin is applied
   (studio/tools/seams.mjs marks them), because a skin paints its own grounds and the theme attribute
   cannot tell white from pale blue. */
.r-section[data-seam="joined"] { padding-top: calc(var(--cx-band) * .5); }
/* A flush section means its own content reaches the band's edges, not that the band has no
   rhythm: with padding-block 0 the services ledger sat at half the vertical space of every other
   section on the site and the page read as a different document. The band keeps the site's rhythm;
   what is flush is the content inside it. */
.r-section--flush { padding-block: var(--cx-section-pad, clamp(52px, 7vw, 100px)); }
.r-eyebrow { display: inline-flex; align-items: center; gap: 12px; margin: 0 0 var(--sp-eyebrow, 12px); font-size: var(--r-eyebrow); font-weight: 700; letter-spacing: .22em; text-transform: var(--r-case-label, uppercase); color: var(--r-accent-text); max-width: none; }
/* overflow hidden and flex none: skins draw the rule as an ::after, sometimes wider than the span, and
   it spilled over the first letters of the eyebrow on three builds. A pseudo now clips to the box. */
.r-eyebrow-rule { width: 28px; height: 2px; flex: none; overflow: hidden; background: var(--r-accent); }
/* The head group, one owner per gap: eyebrow to heading (the eyebrow's margin), heading to introduction
   (the heading's margin), introduction to the section's content (the head's margin). */
.r-head { margin-bottom: var(--sp-intro-content, clamp(32px, 4vw, 48px)); }
.r-head h2 { margin: 0 0 var(--sp-head-intro, .5em); }
.r-head > p:last-child, .r-head > .r-lead:last-child { margin-bottom: 0; }
.r-head h2 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); line-height: 1.02; color: var(--r-fg); }
.r-head--center { text-align: center; }
.r-head--center .r-eyebrow { justify-content: center; }
.r-head--center .r-eyebrow-rule { display: none; }
.r-head--center p { margin-inline: auto; }
.r-lead { font-size: 1.06em; color: var(--r-muted); }
/* line-height is declared because the same class lands on an <a> and on the form's <button>, and the
   two inherit differently: an anchor takes the body's, a button takes the UA's "normal". That is a 5px
   difference in height between the site's buttons and its submit, on every page that carries a form. */
.r-btn { line-height: 1.62; display: inline-flex; align-items: center; justify-content: center; gap: 10px; min-height: 48px; padding: 0 22px; border-radius: var(--cx-radius); font-size: 0.875rem; font-weight: 800; letter-spacing: .1em; text-transform: var(--r-case-label, uppercase); text-decoration: none; border: 2px solid transparent; transition: transform .2s ease, background .2s ease, color .2s ease; }
.r-btn--solid { background: var(--r-fg); color: var(--r-bg); }
.r-btn--solid:hover { transform: translateY(-1px); }
.r-btn--accent { background: var(--r-accent); color: var(--r-on-accent); }
.r-btn--ghost { background: transparent; color: var(--r-fg); border-color: var(--r-line); }
.r-btn--ghost:hover { border-color: var(--r-fg); }
.r-btn--outline { background: transparent; color: var(--r-fg); border-color: var(--r-fg); }
.r-btn--outline:hover { background: var(--r-fg); color: var(--r-bg); }
.r-btns { display: flex; flex-wrap: wrap; gap: var(--sp-buttons, 14px); }
/* Text to the button group it leads to: the group owns the gap, so the paragraph above gives up its own. */
:is(p, ul, ol):has(+ .r-btns) { margin-bottom: 0; }
:is(p, ul, ol) + .r-btns { margin-top: var(--sp-text-buttons, 24px); }
.r-placeholder { display: grid; place-items: center; min-height: 240px; height: 100%; background: repeating-linear-gradient(135deg, var(--r-surface) 0 12px, var(--r-bg) 12px 24px); border: 1px dashed var(--r-line); border-radius: var(--cx-radius-media); color: var(--r-muted); font-size: 0.875rem; text-align: center; padding: 24px; }
.r-placeholder span { max-width: 26ch; }
/* The shot description reads as a request, never as card copy (audit F16: five service cards showed
   "Pond Construction & Repair in progress, the crew and the equipment in frame" where copy would be).
   12px, the page gate's label floor is 11.5px; 11px here failed every page with a placeholder. */
.r-ph-k { display: block; margin-bottom: 4px; font-size: 0.75rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; }
.r-muted { color: var(--r-muted); }
.r-display { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); }
.r-grid { display: grid; gap: var(--cx-gap); }
.r-grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); }
.r-grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.r-grid--4 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); }
.r-hairline { border-top: 1px solid var(--r-line); }
/* Utility pages (404, privacy) have no variant CSS: give their links and footer the site's own colors,
   or a browser-default blue link sits on a dark ground and fails AA. */
.cx-util-head, .cx-util, .cx-foot { color: var(--r-fg); }
.cx-util-head a, .cx-util a, .cx-foot a { color: var(--r-fg); }
.cx-util-head .cx-brand { font-family: var(--r-display); font-weight: var(--r-display-weight); text-decoration: none; }
.cx-foot { color: var(--r-muted); border-top: 1px solid var(--r-line); }
.cx-foot address { font-style: normal; }
/* Below-the-fold sections skip layout and paint until they are near the viewport. Measured on the
   first answer key: the hero's largest paint went from 3.6s to 2.7s on a throttled phone (Lighthouse
   mobile 90 → 96) with no other change; the cost of a long page's first render was the delay. */
main > section:not(:first-child), main > div, footer { content-visibility: auto; contain-intrinsic-size: auto 700px; }
/* Focus: the chassis covers :focus-visible; programmatic focus (what the a11y gate does) must show too. */
a:focus, button:focus, input:focus, select:focus, textarea:focus, summary:focus { outline: 2px solid var(--r-accent); outline-offset: 2px; }
/* The tier motion pass (motion.md M2): a reveal on scroll. The hidden state exists only with JS on
   and only when motion is not reduced, so a crawler, a JS-off render and a reduced-motion visitor all
   get the finished page. Only opacity and transform animate. */
@media (prefers-reduced-motion: no-preference) {
  html.js .r-reveal { opacity: 0; transform: translateY(18px); transition: opacity .6s ease, transform .6s ease; }
  html.js .r-reveal.is-in { opacity: 1; transform: none; }
}
/* The phone bar's clearance under the first screen is NOT here any more: it is a floor (skin-normalize.mjs,
   floorsCss), loaded after the skin so a skin's own hero padding cannot remove it, and scoped to the one
   first screen that is sized to the viewport with the bar visible (the anchored hero between 641 and
   900px). A first version reserved it here on the first section AND on its wrap as a fallback; padding on
   two elements adds, so every phone page carried it twice (164px of dark hero under the stats on the
   third acceptance build, which the look read as content that failed to render). */
/* the mobile action bar: two cells, call and quote, opaque, above everything */
/* min-height, never height: under 200% text or a spacing override the labels wrap, and a fixed 64px clipped
   them. The safe-area inset keeps the bar above a phone's home indicator (the viewport carries
   viewport-fit=cover, without which the inset reads 0). With script the bar stays out of the way until the
   first section has scrolled off (owner ruling 2026-08-28): at rest it covered the hero's last line and
   doubled the hero's own two buttons on the first screen. Hidden means visibility:hidden too, so its links
   cannot take focus while nobody can see them. */
.cx-bar { position: fixed; inset: auto 0 0 0; z-index: 60; display: none; grid-template-columns: 1fr 1fr; min-height: var(--cx-bar-h); padding-bottom: env(safe-area-inset-bottom, 0px); background: var(--r-inverse-bg); color: var(--r-inverse-fg); border-top: 1px solid var(--r-inverse-line); transition: transform .2s ease, visibility .2s; }
.cx-bar a { text-decoration: none; font-weight: 800; letter-spacing: .08em; text-transform: var(--r-case-label, uppercase); font-size: 0.875rem; color: inherit; }
.cx-bar a + a { background: var(--r-accent); color: var(--r-on-accent); }
.cx-bar--one { grid-template-columns: 1fr; }
@media (max-width: 900px) { .cx-bar { display: grid; } html.js .cx-bar:not(.is-shown) { transform: translateY(100%); visibility: hidden; } }

/* ---- hero (shared) ---- */

.r-claim { position: relative; overflow: hidden; background: var(--r-bg); color: var(--r-fg); }
.r-claim-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 70%; }
.r-placeholder.r-claim-img { position: absolute; inset: 0; border-radius: 0; min-height: 0; height: 100%; place-items: start start; padding: 16px; }
.r-placeholder.r-claim-img span { background: color-mix(in srgb, var(--r-bg) 85%, transparent); padding: 8px 12px; border-radius: var(--cx-radius); text-align: left; }
/* A commanded placeholder carries its label in the top-left corner; on a narrow screen the copy starts under it. */
@media (max-width: 980px) { .r-claim:has(.r-placeholder.r-claim-img) .r-claim-in { padding-top: 104px; } }
.r-claim-copy { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }
.r-claim-eyebrow { margin-bottom: 18px; }
.r-claim-h1 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); font-size: clamp(2.625rem, 5.5vw, 4.25rem); line-height: 1.02; text-transform: var(--r-case-display, uppercase); color: var(--r-fg); margin: 0; max-width: 15ch; }
.r-claim-sub { font-size: clamp(1.0625rem, 1.4vw, 1.1875rem); line-height: 1.6; color: var(--r-muted); max-width: 54ch; margin: 22px 0 0; }
.r-claim-btns { margin-top: 30px; }
/* The stops hold near-full strength across the copy column and only then open onto the picture. The
   first cut thinned from 42% of the width, and the subhead's measure runs to about half of it, so
   the end of every line lay on the bright side of the ramp: 3.4:1 where body text needs 4.5. */
.r-claim-scrim { position: absolute; inset: 0; pointer-events: none; background: linear-gradient(100deg, color-mix(in srgb, var(--r-bg) 93%, transparent) 0%, color-mix(in srgb, var(--r-bg) 88%, transparent) 55%, color-mix(in srgb, var(--r-bg) 28%, transparent) 100%); }
/* The ramp runs left to right because the desktop layout puts the words on the left and lets the
   photograph's subject breathe on the right, where the scrim thins to a quarter. Below the stack
   point the copy is FULL WIDTH, so the end of every line lands on that quarter and sits on bare
   photograph: a grey paragraph over a skid steer and foliage, unreadable from about the middle of
   each line, on nine pages of the first acceptance build. Stacked, the ramp turns vertical instead:
   strong through the whole band of text, opening only below it where nothing is being read. */
@media (max-width: 980px) {
  .r-claim-scrim { background: linear-gradient(180deg, color-mix(in srgb, var(--r-bg) 93%, transparent) 0%, color-mix(in srgb, var(--r-bg) 90%, transparent) 62%, color-mix(in srgb, var(--r-bg) 62%, transparent) 100%); }
}
.r-claim-in { position: relative; z-index: 2; }

/* ---- header/solid-plain ---- */

.r-hdr--solid { background: var(--r-bg); color: var(--r-fg); box-shadow: 0 1px 0 var(--r-line), 0 8px 24px -20px rgba(0,0,0,.35); }
/* The markup carries the shared .r-hdr class, whose rules live with utility-sticky and are emitted only
   when that variant is used; on a solid-plain site the class had no rule at all (the css gate failed
   Test B for it). This variant's own base rule for it. */
.r-hdr.r-hdr--solid { z-index: 50; }
/* The desktop row does not wrap: the call to action stays at the far right of the header (owner's
   standing rule). The nav is the one thing that gives, by shrinking and then wrapping its own list. */
@media (min-width: 901px) {
  .r-hdr--solid .r-hdr-in { flex-wrap: nowrap; }
  .r-hdr--solid .r-hdr-brand, .r-hdr--solid .r-hdr-right { flex: 0 0 auto; }
  .r-hdr--solid .cx-nav { min-width: 0; }
  .r-hdr--solid .cx-nav ul { flex-wrap: wrap; row-gap: 0; justify-content: flex-end; }
}
.r-hdr--solid .r-hdr-in { display: flex; align-items: center; column-gap: clamp(16px, 3vw, 40px); row-gap: 8px; min-height: var(--cx-head-h); padding-block: 10px; flex-wrap: wrap; }
.r-hdr--solid .r-brand { text-decoration: none; color: inherit; font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: 1.375rem; }
.r-hdr--solid .r-brand-logo { height: 44px; width: auto; max-width: 200px; object-fit: contain; }
.r-hdr--solid .cx-nav { margin-inline: auto; }
.r-hdr--solid .cx-nav a { font-size: 0.875rem; font-weight: 600; color: var(--r-fg); padding: 6px 0; display: inline-flex; align-items: center; }
.r-hdr--solid .cx-nav a[aria-current="page"] { box-shadow: inset 0 -2px 0 var(--r-accent); }
.r-hdr--solid .cx-nav-tel { display: none; }
.r-hdr--solid .r-hdr-right { display: flex; align-items: center; gap: 18px; }
.r-hdr--solid .r-hdr-num { font-weight: 800; color: var(--r-fg); text-decoration: none; display: inline-flex; align-items: center; }
@media (max-width: 900px) {
  .r-hdr--solid .r-hdr-right { display: none; }
  .r-hdr--solid .cx-nav { margin: 0; border-top: 1px solid var(--r-line); padding-block: 8px; }
  .r-hdr--solid .cx-nav-tel { display: block; }
}

/* ---- footer/columns ---- */

.r-foot { background: var(--r-bg); color: var(--r-muted); padding-block: var(--cx-band) 0; border-top: 1px solid var(--r-line); }
.r-foot-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap: var(--sp-columns); padding-bottom: var(--cx-band); }
.r-foot-brand { grid-column: span 1; }
.r-foot-logo { height: 44px; width: auto; max-width: 200px; object-fit: contain; margin-bottom: 14px; }
.r-foot-word { font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: 1.5rem; color: var(--r-fg); text-transform: var(--r-case-display, uppercase); display: block; margin-bottom: 12px; }
.r-foot-tag { color: var(--r-fg); font-weight: 600; margin-bottom: 10px; }
/* The blurb sits INSIDE the brand block, so whatever a skin does to the brand name it did to the
   paragraph too: two different generated skins styled .r-foot-brand as the wordmark (display face,
   capitals) and a 143-character paragraph inherited both and ran four lines of Archivo Black caps.
   A declaration on the element beats anything it would inherit, so the paragraph states its own
   case and face; a skin that wants to style the blurb names it, and the page gate judges that. */
.r-foot-blurb { font-size: 0.9375rem; text-transform: none; letter-spacing: normal; font-family: var(--cx-font-body, inherit); font-weight: 400; line-height: 1.55; }
.cx-fh { font-size: var(--r-eyebrow); font-weight: 700; letter-spacing: .2em; text-transform: var(--r-case-label, uppercase); color: var(--r-fg); margin: 0 0 14px; }
.cx-fcol ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.cx-fcol a { color: var(--r-muted); text-decoration: none; }
.cx-fcol a:hover { color: var(--r-fg); }
.cx-fcol address { font-style: normal; line-height: 1.7; }
.cx-fcol p { margin: 10px 0 0; }
.r-foot-sub { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 12px 24px; padding-block: 18px; border-top: 1px solid var(--r-line); font-size: 0.875rem; }
.r-foot-sub p { margin: 0; }
.r-foot-sub a { color: inherit; }

/* ---- hero/split-paper ---- */

.r-paper { position: relative; overflow: hidden; }
.r-paper-grid { display: grid; grid-template-columns: 1fr 1fr; min-height: clamp(560px, 78vh, 800px); }
.r-paper-col { display: flex; align-items: center; }
.r-paper-in { width: 100%; padding: clamp(48px, 7vw, 96px) clamp(32px, 5vw, 72px) clamp(48px, 7vw, 96px) max(var(--cx-gap), calc(100% - var(--cx-wrap) / 2 + clamp(0px, 4vw, 56px))); }
.r-paper-eyebrow { margin-bottom: 22px; }
.r-paper-h1 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); font-size: clamp(2.5rem, 5.2vw, 4.75rem); line-height: 1.04; color: var(--r-fg); margin: 0 0 18px; max-width: 12ch; }
.r-paper-tag { font-family: var(--r-display); font-style: italic; font-weight: var(--r-display-weight); font-size: clamp(1.1875rem, 1.7vw, 1.5625rem); line-height: 1.4; color: var(--r-fg); margin: 0 0 18px; max-width: 30ch; }
.r-paper-body { font-size: clamp(1rem, 1.1vw, 1.125rem); line-height: 1.7; color: var(--r-muted); max-width: 48ch; margin: 0 0 30px; }
.r-paper-btns { flex-direction: column; align-items: flex-start; gap: 12px; }
.r-paper-btns .r-btn { min-width: 240px; }
.r-paper-media { position: relative; min-height: 420px; }
.r-paper-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 40%; }
.r-placeholder.r-paper-img { border-radius: 0; min-height: 0; }
@media (max-width: 900px) {
  .r-paper-grid { grid-template-columns: 1fr; min-height: 0; }
  .r-paper-in { padding: 56px var(--cx-gap) 48px; }
  .r-paper-h1 { max-width: none; }
  .r-paper-btns .r-btn { width: min(100%, 320px); }
  /* More air above the action on a phone. It reads better stacked, and it keeps the buttons off the
     fold line where the fixed bar would slice one in half. */
  .r-paper-btns { margin-top: 34px; gap: 14px; }
  /* the commanded gap, stacked under the words at a portrait height */
  .r-paper--ask .r-paper-media { min-height: 0; aspect-ratio: 4 / 3; }
  /* the recomposition: photo as the ground, a scrim over it, centered copy in the inverse ink */
  .r-paper--photo .r-paper-grid { position: relative; }
  .r-paper--photo .r-paper-media { position: absolute; inset: 0; min-height: 0; z-index: 0; }
  .r-paper--photo .r-paper-col { position: relative; z-index: 1; min-height: 620px; background-image: linear-gradient(180deg, color-mix(in srgb, var(--r-inverse-bg) 62%, transparent) 0%, color-mix(in srgb, var(--r-inverse-bg) 84%, transparent) 100%); color: var(--r-inverse-fg); text-align: center; }
  .r-paper--photo .r-paper-in { padding: 72px var(--cx-gap) 64px; }
  .r-paper--photo .r-paper-eyebrow { justify-content: center; color: var(--r-inverse-accent); }
  .r-paper--photo .r-paper-eyebrow .r-eyebrow-rule { display: none; }
  .r-paper--photo .r-paper-h1, .r-paper--photo .r-paper-tag { color: var(--r-inverse-fg); margin-inline: auto; }
  .r-paper--photo .r-paper-body { color: var(--r-inverse-fg); margin-inline: auto; }
  .r-paper--photo .r-paper-btns { align-items: center; }
  .r-paper--photo .r-btn--solid { background: var(--r-inverse-fg); color: var(--r-inverse-bg); }
  .r-paper--photo .r-btn--outline { color: var(--r-inverse-fg); border-color: var(--r-inverse-fg); }
}

/* ---- band/proof-strip ---- */

.r-proof { background: var(--r-bg); color: var(--r-fg); border-top: 1px solid var(--r-line); border-bottom: 1px solid var(--r-line); }
.r-proof-list { list-style: none; margin: 0; padding: 18px 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 14px 36px; font-size: 0.875rem; font-weight: 700; letter-spacing: .08em; text-transform: var(--r-case-label, uppercase); }
.r-proof-list li { display: inline-flex; align-items: center; gap: 10px; }
.r-proof-mark { width: 8px; height: 8px; background: var(--r-accent); transform: rotate(45deg); }

/* ---- services/price-cards ---- */

.r-pcards { position: relative; }
.r-pcards .r-head { max-width: 62ch; margin-inline: auto; }
.r-pcards .r-head .r-lead { margin-inline: auto; }
/* Columns from the card count (cardCols, audit F46): auto-fit put three packages into two and one. */
.r-pcards-grid { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-card-gap); }
.r-pcard { display: flex; flex-direction: column; background: var(--r-surface); color: var(--r-fg); border-radius: calc(var(--cx-radius-media) * .75); padding: var(--sp-card-inset); box-shadow: 0 24px 48px -28px color-mix(in srgb, var(--r-inverse-bg) 70%, transparent); }
.r-pcard-name { font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: 1.5rem; line-height: 1.15; margin: 0 0 10px; color: var(--r-fg); }
.r-pcard-desc { font-size: 1rem; line-height: 1.65; color: var(--r-muted); margin: 0; }
.r-pcard-foot { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px 16px; flex-wrap: wrap; margin-top: auto; padding-top: 18px; border-top: 1px solid var(--r-line); }
.r-pcard-desc + .r-pcard-foot { margin-top: 22px; }
.r-pcard-price { font-size: 0.875rem; font-weight: 700; letter-spacing: .1em; text-transform: var(--r-case-label, uppercase); color: var(--r-accent-text); line-height: 1.5; }
.r-pcard-kicker { display: block; font-size: var(--r-micro); font-weight: 700; letter-spacing: .16em; }
.r-pcard-dur { font-size: var(--r-micro); font-weight: 600; letter-spacing: .14em; text-transform: var(--r-case-label, uppercase); color: var(--r-muted); }
.r-pcards-more { text-align: center; margin: 44px 0 0; max-width: none; }
@media (max-width: 480px) { .r-pcard-foot { flex-direction: column; align-items: flex-start; } }

/* ---- gallery/grid ---- */

.r-gallery { position: relative; }
/* Columns from the photo COUNT (cardCols), not from the width: four photographs in a width-sized grid
   came out three and one, with 853px of the second row bare beside the last picture. A skin that lays
   the gallery out as a mosaic overrides this, which is the point of a default. */
.r-gallery-grid { list-style: none; margin: 0; padding: 0; gap: 12px; }
/* min-width: 0 and height: 100% are both load-bearing, and both are about a grid the SKIN writes.
   A skin that lays the gallery out as a mosaic writes repeat(6, 1fr), and 1fr means minmax(auto, 1fr):
   the auto minimum is the item's min-content width, which for a 1600px photograph inflates the track,
   so the tiles in one row came out 247px and 295px wide instead of equal. min-width: 0 on the item is
   what lets a track be the fraction it says it is. Then the cell: grid items stretch, so a tile beside
   a taller one is as tall as that one, and an image with only an aspect-ratio sits at the top of it
   with the rest of the cell empty. That was a 115px band of dead ground under the top-right photograph
   of the sixth build's gallery. The photograph fills the cell it is given and crops, which is what
   object-fit: cover is for; the aspect-ratio still sets the cell's shape when nothing stretches it. */
.r-tile { position: relative; overflow: hidden; border-radius: var(--cx-radius-media); min-width: 0; }
.r-tile-img { width: 100%; height: 100%; aspect-ratio: 4 / 3; object-fit: cover; transition: transform .5s ease; }
.r-tile:hover .r-tile-img { transform: scale(1.04); }
/* The scrim is opaque UNDER the text, not merely at the bottom edge: a two-line caption's first line
   sat where a transparent-to-.65 gradient was still see-through, unreadable over bright grass, and
   the eye flagged it on every skinned build. The gradient's transparent part is padding above the
   text; every line of the caption sits on at least 78% black, plus a shadow for the edges. */
/* On a 390px screen the tiles are two to a row, so each photograph is about 167px tall. A caption of
   two lines then covered 74% of it and a three-line caption 89%: the gallery stopped showing the
   work. The caption is capped at a share of the tile and clips with an ellipsis rather than growing
   over the picture, and the tile itself opens the full image so the detail is still reachable. */
.r-tile-open { position: absolute; inset: 0; z-index: 1; }
.r-tile-cap { position: absolute; inset: auto 0 0 0; padding: 34px 14px 12px; font-size: 0.875rem; font-weight: 600; color: #fff; text-shadow: 0 1px 2px rgba(0,0,0,.6); background: linear-gradient(180deg, transparent 0, rgba(0,0,0,.78) 24px, rgba(0,0,0,.86) 100%); }
.r-gallery-more { margin: 28px 0 0; max-width: none; }
/* One tile per row on a phone. Two columns made each photograph about 125px tall, so a two-line
   caption sitting on it covered two thirds of the picture and the gallery stopped showing the work.
   One column gives the photograph the width of the screen and the caption about a quarter of it. */
@media (max-width: 640px) { .r-gallery-grid { grid-template-columns: 1fr; } }

/* ---- split/sticky-reasons ---- */

.r-why { position: relative; }
.r-why-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap: var(--sp-columns); align-items: start; }
.r-why-rail { position: sticky; top: calc(var(--cx-head-h) + 30px); }
.r-why-rail .r-head { margin-bottom: 24px; }
.r-why-list { list-style: none; margin: 0; padding: 0; }
.r-why-row { display: grid; grid-template-columns: 34px 1fr; gap: 18px; padding: 22px 0; border-top: 1px solid var(--r-line); }
.r-why-row:last-child { border-bottom: 1px solid var(--r-line); }
.r-why-n { font-family: var(--r-display); font-size: 1.375rem; color: var(--r-accent-text); line-height: 1.2; }
.r-why-row h3 { font-size: 1.125rem; font-weight: 700; margin-bottom: 6px; }
.r-why-row p { font-size: 0.9375rem; color: var(--r-muted); margin: 0; }
@media (max-width: 900px) { .r-why-rail { position: static; } }

/* ---- reviews/mount-cards ---- */

.r-reviews { position: relative; }
.r-reviews-mount { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: var(--cx-gap); min-height: 120px; }
.r-reviews-mount:empty { min-height: 0; }
.r-reviews-note { text-align: center; color: var(--r-muted); margin: 24px auto 0; font-size: 0.9375rem; }
.r-reviews-links { display: flex; justify-content: center; gap: 14px; flex-wrap: wrap; margin: 24px 0 0; max-width: none; }

/* ---- content/faq ---- */

.r-faq { position: relative; }
.r-faq-in { max-width: 820px; }
.r-faq-list { border-top: 1px solid var(--r-line); }
.r-faq-item { border-bottom: 1px solid var(--r-line); }
.r-faq-item summary { list-style: none; cursor: pointer; padding: 18px 44px 18px 0; position: relative; min-height: 44px; display: flex; align-items: center; }
.r-faq-item summary::-webkit-details-marker { display: none; }
.r-faq-item summary::after { content: '+'; position: absolute; right: 8px; font-family: var(--r-display); font-size: 1.625rem; color: var(--r-accent-text); line-height: 1; }
.r-faq-item[open] summary::after { content: '\2212'; }
.r-faq-item h3 { font-size: 1.125rem; font-weight: 700; margin: 0; }
.r-faq-item p { color: var(--r-muted); padding-bottom: 18px; margin: 0; }

/* ---- band/cta ---- */

.r-ctaband, .r-ctaband--photo { position: relative; overflow: hidden; text-align: center; }
/* A scrim, not a ghost (audit F45): every site showed its closing photo grayscale at 18% opacity, the same
   washed-out band everywhere. The photo keeps its color and a layer of the section's own ground sits over
   it, dense enough that the heading and the buttons keep their contrast on the brightest pixel. */
.r-ctaband-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.r-ctaband--photo::before { content: ''; position: absolute; inset: 0; z-index: 1; background: color-mix(in srgb, var(--r-bg) 80%, transparent); }
.r-ctaband--left { text-align: left; }
.r-ctaband.r-ctaband--left .r-ctaband-in { justify-items: start; }
.r-ctaband.r-ctaband--left .r-btns { justify-content: flex-start; }
/* The outline button's edge is its boundary, so it carries full contrast (WCAG 1.4.11); a tinted edge on a
   bright brand ground failed it. */
.r-ctaband .r-btn--ghost { border-color: currentColor; }
/* One owner per gap (spacing rule 3): the grid adds nothing, each child's top margin is its gap, so a skin
   that sets one of them is the only thing setting it (a skin margin plus an 18px grid gap made 54px). */
.r-ctaband-in { position: relative; z-index: 2; display: grid; justify-items: center; gap: 0; }
.r-ctaband h2 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); text-transform: var(--r-case-display, uppercase); line-height: 1; max-width: 22ch; margin: 0; }
.r-ctaband .r-lead { margin: var(--sp-head-intro, 18px) 0 0; }
.r-ctaband .r-btns { justify-content: center; margin-top: var(--sp-text-buttons, 26px); }

/* ---- hero/photo-band ---- */

.r-claim--band .r-claim-in { padding-top: 68px; padding-bottom: 72px; }
.r-claim-copy--band { max-width: 780px; }
.r-claim-h1--band { font-size: clamp(2.375rem, 5vw, 3.5rem); max-width: 22ch; }
.r-claim--band .r-claim-sub { max-width: 62ch; }
@media (max-width: 640px) { .r-claim--band .r-claim-in { padding-top: 48px; padding-bottom: 56px; } }

/* ---- services/zigzag ---- */

.r-zig { position: relative; }
.r-zig-row { display: grid; grid-template-columns: 1fr 1fr; align-items: stretch; background: var(--r-bg); }
.r-zig-row--alt { background: var(--r-surface); }
.r-zig-media { position: relative; min-height: 420px; }
.r-zig-row--flip .r-zig-media { order: 2; }
.r-zig-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.r-placeholder.r-zig-img { position: absolute; inset: 0; border-radius: 0; border: 0; min-height: 0; height: 100%; }
.r-zig-text { display: flex; align-items: center; padding: 60px 52px; }
.r-zig-text-in { max-width: 560px; margin-right: auto; }
.r-zig-row--flip .r-zig-text-in { margin-right: 0; margin-left: auto; }
.r-zig-text h2 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); font-size: clamp(1.75rem, 3vw, 2.5rem); line-height: 1.02; text-transform: var(--r-case-display, uppercase); margin: 0 0 14px; }
.r-zig-text p { color: var(--r-muted); margin: 0; }
.r-zig-list { list-style: none; margin: 18px 0 0; padding: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 10px 20px; }
.r-zig-list li { position: relative; padding-left: 24px; font-size: 0.9375rem; line-height: 1.5; }
.r-zig-list li::before { content: '\2713'; position: absolute; left: 0; top: 0; color: var(--r-accent-text); font-weight: 700; }
.r-zig-link { display: inline-flex; align-items: center; gap: 8px; margin-top: 22px; min-height: 44px; color: var(--r-fg); text-decoration: none; font-size: 0.875rem; font-weight: 800; letter-spacing: .12em; text-transform: var(--r-case-label, uppercase); border-bottom: 2px solid var(--r-accent); }
.r-zig-link::after { content: '\2192'; }
.r-zig-cloud { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 10px; padding-block: var(--cx-band); }
.r-zig-cloud-label { width: 100%; text-align: center; font-size: var(--r-micro); font-weight: 700; letter-spacing: .2em; text-transform: var(--r-case-label, uppercase); color: var(--r-muted); margin-bottom: 6px; }
.r-zig-chip { display: inline-flex; align-items: center; min-height: 40px; padding: 0 16px; border: 1px solid var(--r-line); border-radius: 999px; color: var(--r-fg); text-decoration: none; font-size: 0.875rem; font-weight: 600; }
a.r-zig-chip:hover { border-color: var(--r-fg); }
.r-zig-chip--accent { background: color-mix(in srgb, var(--r-accent) 12%, var(--r-bg)); border-color: transparent; }
@media (max-width: 900px) {
  .r-zig-row { grid-template-columns: 1fr; }
  .r-zig-media, .r-zig-row--flip .r-zig-media { order: -1; min-height: 260px; }
  .r-zig-text { padding: 36px 24px 44px; }
  .r-zig-text-in, .r-zig-row--flip .r-zig-text-in { margin: 0; }
}
@media (max-width: 560px) { .r-zig-list { grid-template-columns: 1fr; } }

/* ---- split/text-photo-card ---- */

.r-split, .r-split--card { position: relative; }
.r-split-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); gap: var(--sp-columns); align-items: center; }
.r-split--flip .r-split-media { order: -1; }
.r-split-text .r-head { margin-bottom: 20px; }
.r-split-text p { font-size: 1.0625rem; line-height: 1.7; color: var(--r-muted); }
.r-textlink { display: inline-flex; align-items: center; gap: 10px; color: var(--r-fg); text-decoration: none; font-size: 0.875rem; font-weight: 800; letter-spacing: .14em; text-transform: var(--r-case-label, uppercase); border-bottom: 2px solid var(--r-accent); padding-bottom: 4px; min-height: 44px; }
.r-textlink::after { content: '\2192'; transition: transform .2s ease; }
.r-textlink:hover::after { transform: translateX(4px); }
.r-split-media { position: relative; }
.r-split-img { width: 100%; aspect-ratio: 4 / 3.4; object-fit: cover; }
.r-split-card { position: absolute; bottom: -22px; left: -22px; background: var(--r-inverse-bg); color: var(--r-inverse-fg); padding: var(--sp-card-inset); max-width: 230px; display: grid; gap: 8px; border-radius: var(--cx-radius); }
.r-split-card strong { font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: 1.125rem; text-transform: var(--r-case-label, uppercase); line-height: 1.05; }
.r-split-card span { font-size: 0.875rem; font-weight: 600; color: var(--r-inverse-muted); line-height: 1.5; }
@media (max-width: 640px) { .r-split-card { left: 12px; bottom: -16px; max-width: 70%; } .r-split-media { margin-bottom: 28px; } }

/* ---- split/heritage-numeral ---- */

.r-heritage { position: relative; background: var(--r-surface); }
.r-heritage-grid { display: grid; grid-template-columns: auto 1fr; gap: var(--sp-columns); align-items: stretch; }
.r-heritage-figure { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }
.r-heritage-value { display: inline-flex; align-items: flex-start; font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: clamp(6rem, 12vw, 10.625rem); line-height: .9; letter-spacing: -.01em; color: var(--r-fg); }
.r-heritage-suffix { color: var(--r-accent-text); font-size: .55em; line-height: 1; margin: .12em 0 0 4px; }
.r-heritage-cap { margin-top: 12px; font-size: var(--r-micro); font-weight: 700; letter-spacing: .18em; text-transform: var(--r-case-label, uppercase); color: var(--r-muted); }
.r-heritage-text { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }
.r-heritage-text h2 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); line-height: 1.02; text-transform: var(--r-case-display, uppercase); margin: 0 0 14px; }
.r-heritage-text .r-lead { max-width: 60ch; margin: 0 0 22px; }
.r-heritage-chips { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-wrap: wrap; gap: 10px; }
.r-heritage-chips li { display: inline-flex; align-items: center; gap: 8px; min-height: 38px; padding: 0 14px; border-radius: 999px; background: var(--r-bg); border: 1px solid var(--r-line); font-size: 0.875rem; font-weight: 600; line-height: 1.3; }
.r-heritage-check { color: var(--r-accent-text); font-weight: 700; }
.r-heritage-link { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; color: var(--r-fg); text-decoration: none; font-size: 0.875rem; font-weight: 800; letter-spacing: .14em; text-transform: var(--r-case-label, uppercase); border-bottom: 2px solid var(--r-accent); }
.r-heritage-link::after { content: '\2192'; transition: transform .2s ease; }
.r-heritage-link:hover::after { transform: translateX(4px); }
/* The numeral scales with the screen instead of sitting at a flat 96px, which is a third of the width
   of a small phone and, on a page whose hero runs four lines, pushed its own tracked label down into
   the fixed call bar: the bar's top edge crossed the label a pixel above its baseline and read as a
   line struck through the words. A viewport-relative cap keeps the numeral the largest thing on the
   page and gives the pair back the room it needs to clear the bar. */
@media (max-width: 760px) { .r-heritage-grid { grid-template-columns: 1fr; gap: 28px; } .r-heritage-value { font-size: min(6rem, 20vw); } }

/* ---- contact/split-form ---- */

.r-contact, .r-contact--split { position: relative; }
.r-contact-pitch { min-width: 0; }
.r-contact-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); gap: var(--sp-columns); align-items: start; }
.r-contact-tel { margin: 0 0 12px; max-width: none; }
.r-contact-num { font-family: var(--r-display); font-size: clamp(1.625rem, 3vw, 2.5rem); color: var(--r-fg); text-decoration: none; display: inline-flex; align-items: center; letter-spacing: .01em; }
.r-contact-addr { font-style: normal; color: var(--r-muted); line-height: 1.6; margin-bottom: 8px; }
.r-contact-hours { color: var(--r-muted); }
.r-contact-expect { list-style: none; margin: 22px 0 0; padding: 0; display: grid; gap: 10px; }
.r-contact-expect li { padding-left: 22px; position: relative; color: var(--r-muted); }
.r-contact-expect li::before { content: ''; position: absolute; left: 0; top: .7em; width: 10px; height: 2px; background: var(--r-accent); }
.r-contact-booking { margin-top: 28px; }
.r-contact-form { background: var(--r-surface); border: 1px solid var(--r-line); border-radius: var(--cx-radius-media); padding: clamp(20px, 3vw, 32px); }
.r-contact-form .cx-form { display: grid; gap: var(--sp-form-group, 22px); }
.r-contact-form .cx-form input, .r-contact-form .cx-form select, .r-contact-form .cx-form textarea { background: var(--r-bg); color: var(--r-fg); border-color: var(--r-line); }
.r-contact-form .cx-actions { margin: 6px 0 0; }
.booking-fallback { font-size: 0.875rem; color: var(--r-muted); }

/* ---- content/territories ---- */

.r-terr { position: relative; }
.r-terr-group + .r-terr-group { margin-top: clamp(40px, 6vw, 64px); }
.r-terr-group h2 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); line-height: 1.02; text-transform: var(--r-case-display, uppercase); margin: 0 0 24px; }
.r-terr-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: var(--sp-card-gap); align-items: stretch; }
.r-terr-card { background: var(--r-surface); border-left: 4px solid var(--r-inverse-bg); border-radius: 0 var(--cx-radius) var(--cx-radius) 0; padding: var(--sp-card-inset); }
.r-terr-group--accent .r-terr-card { background: color-mix(in srgb, var(--r-accent) 10%, var(--r-bg)); border-left-color: var(--r-accent-text); }
.r-terr-card h3 { font-family: var(--r-display); font-weight: var(--r-display-weight); letter-spacing: var(--r-display-tracking); font-size: 1.375rem; line-height: 1.1; text-transform: var(--r-case-display, uppercase); margin: 0 0 8px; }
.r-terr-card p { margin: 0; color: var(--r-muted); font-size: 0.9375rem; line-height: 1.6; max-width: none; }
.r-terr-fallback { text-align: center; margin: clamp(36px, 5vw, 56px) auto 0; max-width: 60ch; }
.r-terr-fallback a { color: var(--r-fg); font-weight: 700; }
.r-terr-tel { white-space: nowrap; }

/* ---- content/prose ---- */
.r-prose-in { max-width: var(--cx-measure); }
.r-prose-in .r-head { margin-bottom: 20px; }
.r-prose p { color: var(--r-muted); font-size: 1.0625rem; line-height: 1.7; }
.r-prose-cta { margin-top: 24px; }

/* ---- split/text-photo ---- */
.r-split-img--43 { aspect-ratio: 4 / 3; }

/* ---- process/ghost-numerals ---- */

/* Columns from the step COUNT (cardCols), not from the width: four steps in a width-sized grid came
   out three and one, with two thirds of the second row bare under the last step. */
.r-process-grid { list-style: none; margin: 0; padding: 0; gap: var(--sp-card-gap); }
.r-step { border: 1px solid var(--r-line); border-radius: var(--cx-radius-media); padding: 28px 26px 26px; background: var(--r-surface); }
.r-step-n { display: block; font-family: var(--r-display); font-size: 3.375rem; line-height: 1; margin-bottom: 18px; color: color-mix(in srgb, var(--r-fg) 10%, transparent); -webkit-text-stroke: 1px color-mix(in srgb, var(--r-accent) 45%, transparent); }
.r-step h3 { font-size: 1.25rem; font-weight: 700; }
.r-step p { font-size: 0.9375rem; color: var(--r-muted); margin: 0; }
.r-process .r-head--center .r-eyebrow { display: inline-flex; gap: 12px; }
.r-process .r-head--center .r-eyebrow::before, .r-process .r-head--center .r-eyebrow::after { content: ''; width: 28px; height: 2px; background: var(--r-accent); }

/* ---- process/circle-triad ---- */

.r-triad { position: relative; }
.r-triad .r-head { max-width: 62ch; margin-inline: auto; }
.r-triad .r-head .r-lead { margin-inline: auto; }
/* Columns from the step count (cardCols, audit F46): auto-fit put three steps into two and one between
   600 and 768px. */
.r-triad-grid { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-columns); }
.r-triad-step { display: flex; flex-direction: column; align-items: center; text-align: center; }
.r-triad-mark { display: grid; place-items: center; width: 72px; height: 72px; border-radius: 50%; background: var(--r-accent); color: var(--r-on-accent); margin-bottom: 22px; }
.r-triad-title { font-family: var(--r-display); font-weight: var(--r-display-weight); font-size: 1.5rem; line-height: 1.2; margin: 0 0 10px; color: var(--r-fg); }
.r-triad-text { font-size: 1rem; line-height: 1.65; color: var(--r-muted); max-width: 34ch; margin: 0; }



/* Responsive image wrappers must not participate in layout: <picture> is inline by
   default and wrapping a block <img> in one silently reflows the section around it. */
picture{display:contents}
