/* ---------------------------------------------------------------------------
   Veris overrides on the Advitex kit.

   Pages use the kit's own section markup (see scripts/kit-sections.mjs), so
   this file is deliberately small: it carries only what the kit does not
   provide, or what the work order overrides. An earlier version defined a
   full set of bespoke veris-* section components, which styled the interior
   pages from scratch and made them look consistent with each other but not
   like Advitex. Those rules are gone.

   --Primary is NOT set here. It is changed in the vendored
   assets/vendor/advitex/css/styles.css, where it is declared twice: once in
   :root and once scoped to .footer.style-3. Overriding it from this file
   would fix :root and leave the footer rendering Advitex blue, which is the
   trap the work order calls out. Three hard-coded box-shadows in the same
   file were changed in the same pass.
--------------------------------------------------------------------------- */

:root {
  /* Chris asked for rounded rectangles only. One scale, three steps. */
  --veris-radius-sm: 12px;
  --veris-radius-md: 16px;
  --veris-radius-lg: 20px;
}

/* ---- Image frames --------------------------------------------------------
   Every photograph is a rounded rectangle from the scale above (revision
   brief, Chris Kerr, 2026-10-09): interior photos through photoFrame()
   ("Interior photographs" below), article cards, team cards. The kit's
   organic blob frames were in use from 2026-10-01 until that brief; no
   page uses them now. Only a hard square corner on a photograph is out.
-------------------------------------------------------------------------- */

.veris-frame { border-radius: var(--veris-radius-md); overflow: hidden; }
.veris-frame img {
  border-radius: inherit;
  width: 100%; height: auto; display: block;
}
.veris-frame-sm { border-radius: var(--veris-radius-sm); }
.veris-frame-lg { border-radius: var(--veris-radius-lg); }

/* ---- Kit assets ----------------------------------------------------------
   The kit's stylesheet reaches its images by relative path, from
   assets/vendor/advitex/css/ into assets/vendor/advitex/images/. Of the files
   it names, one is shipped beside it for the homepage and two are not:

   images/item/shape-6.1.png      SHIPPED. The blob mask behind
                                  `.shape-img-bg img`; no page uses that
                                  frame since the 2026-10-09 revision brief.
   images/page-title/page-title-1.jpg
                                  NOT shipped: 170 KB of stock photography, and
                                  the work order bars stock from any source.
                                  The homepage hero supplies a Veris
                                  photograph instead (see "Homepage: hero").
   images/item/border.svg.html    NOT shipped: a 0-byte artefact of the demo
                                  capture that does not exist upstream either.
                                  The one rule that uses it is overridden here.
-------------------------------------------------------------------------- */

.form-newsletter.style-2 { background-image: none; }

/* ---- Header --------------------------------------------------------------
   The kit ships two headers: a .header-sticky copy that stays hidden until
   its JS reveals it on an upward scroll, and a static one that is what a
   visitor sees on arrival. Both are rendered. The nav is three levels deep
   where the kit styles two, so the third level gets an explicit flyout.
-------------------------------------------------------------------------- */

.site-logo img { max-height: 44px; width: auto; }

.navigation .submenu .has-child { position: relative; }
.navigation .submenu .has-child > .submenu { top: 0; left: 100%; margin-left: 2px; }
/* No marker inside the dropdowns, at Veris's request (2026-10-06): no dot
   before each item, and no icon after an item that opens a flyout (it read
   as a play button). The flyout still opens on hover. */
.navigation .has-child .submenu > li::before { content: none; display: none; }
.navigation .submenu .has-child > a { padding-right: 0; }
.navigation .submenu .has-child > a::after { content: none; display: none; }

/* ---- Footer --------------------------------------------------------------
   The kit hides <br> below 992px, which ran each office's street line into
   its city line. Each line is its own block instead.
-------------------------------------------------------------------------- */

.veris-offices { display: grid; gap: 22px; grid-template-columns: 1fr; }
@media (min-width: 576px) and (max-width: 991px) {
  .veris-offices { grid-template-columns: repeat(2, 1fr); }
}
.veris-office address { font-style: normal; display: flex; flex-direction: column; gap: 2px; margin: 0 0 6px; }
.veris-office address span { display: block; }
.veris-office-name { font-weight: 600; margin-bottom: 4px; }

/* Button labels live in a <span>: the kit colours .tf-btn span, not the
   anchor, so bare text inside .tf-btn inherits Bootstrap's link blue and
   renders about 1.15:1 against Veris blue. Backstop for any that slip through
   unwrapped. */
.tf-btn { color: #fff; }
.tf-btn.btn-white, .tf-btn.btn-white2 { color: var(--Primary); }

/* ---- Skip link (accessibility basics are in the definition of done) ------ */

/* ---- Focus visibility ----------------------------------------------------
   The kit has `a:focus, a:hover { outline: 0 }` (styles.css:839) and ships no
   replacement — there is no :focus-visible rule anywhere in it. Measured by
   tabbing the first 14 controls on /contact/: 11 had no visible focus cue at
   all, so a keyboard or switch user cannot see where they are, on all 136
   pages. "Accessibility basics intact" is in the definition of done.

   :focus-visible rather than :focus, so a mouse click does not draw a ring —
   which is presumably why the kit suppressed the default in the first place.
   outline rather than box-shadow, because .tf-btn sets overflow:hidden for its
   bg-effect and would clip an inset ring.

   The ring is Veris blue on light ground and white on the two dark contexts
   the site has: the style-1 hero and the primary-coloured footer. Blue on
   #1479bd would be invisible.
-------------------------------------------------------------------------- */

/* NOT :where(). :where() zeroes specificity, so the kit's `a:focus` (0,1,1)
   beat it and the ring never drew — the first attempt measured 16 of 16
   controls still bare. These selectors are (0,1,1), tying with the kit's rule,
   and veris.css loads after it. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
  /* Longhands, and outline-style explicitly. Chromium's UA :focus-visible rule
     is `outline: auto`, and the `auto` style keeps its own 1px two-tone
     rendering unless the style is overridden outright — a shorthand that only
     looked like it applied still measured 1px and drew a pale hairline. */
  outline-style: solid;
  outline-width: 3px;
  outline-color: var(--Primary);
  outline-offset: 2px;
  border-radius: 2px;
}
/* Only genuinely dark ground. An earlier version of this block also carried
   `#header-main:has(~ * .page-title.style-1)`, on the assumption that the
   header goes dark over the style-1 hero. It does not — the header paints
   white on every page, measured — so that selector matched the main nav and
   drew a WHITE ring on a WHITE bar. The ring was there and invisible, which is
   worse than the bare default it replaced. */
.page-title.style-1 :focus-visible,
.footer.style-3 :focus-visible {
  outline-color: #fff;
}
/* The skip link paints itself Veris blue, so its ring needs the light treatment
   whatever it sits over. */
.veris-skip-link:focus-visible { outline-color: #fff; outline-offset: -6px; }

.veris-skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 9999;
  /* 12px padding on an 18px line put this at 39px high. It is the first thing
     a keyboard or switch user reaches on all 136 pages, and 44px is the floor
     for a control someone has to hit deliberately. */
  padding: 14px 20px;
  min-height: 44px;
  display: inline-flex; align-items: center;
  background: var(--Primary); color: #fff;
  border-radius: 0 0 var(--veris-radius-sm) 0;
}
.veris-skip-link:focus { left: 0; }

/* ---- Horizontal bleed ----------------------------------------------------
   The kit deliberately bleeds the hero's team cluster past its container with
   `.page-title.style-1 .wrap-facts { margin-right: -39px }`. In the demo that
   sits inside a `.main-content` wrapper which contains it; this shell uses a
   bare <main>, so nothing clipped it and the page scrolled sideways by
   exactly those 39px at 1440.

   Clipping on <main> keeps the kit's intended bleed visible while stopping
   the scrollbar. `clip` rather than `hidden` because `hidden` makes the
   element a scroll container and would break position: sticky inside it.
-------------------------------------------------------------------------- */

main { overflow-x: clip; }
@supports not (overflow: clip) { main { overflow-x: hidden; } }
.page-title.style-1 .bot > * { min-width: 0; }

/* ---- Forms ---------------------------------------------------------------
   Markup and styling only until WO-2026-026. See docs/form-contract.md.

   Not on the homepage: its contact form is the kit's own, styled by the kit
   (borders on the fieldset, not the input), and these rules restyled it when
   the page moved onto this file. Zero-specificity `:where()`, as in Measure.
-------------------------------------------------------------------------- */

:where(body:not(.veris-home)) .form-contact fieldset { border: 0; padding: 0; margin: 0; }
:where(body:not(.veris-home)) .form-contact label { display: block; font-weight: 500; }
:where(body:not(.veris-home)) .form-contact input,
:where(body:not(.veris-home)) .form-contact select,
:where(body:not(.veris-home)) .form-contact textarea {
  width: 100%;
  padding: 13px 16px;
  border: 1px solid #d8e2ec;
  border-radius: var(--veris-radius-sm);
  background: #fff;
  font: inherit;
  color: #1b2b3d;
}
:where(body:not(.veris-home)) .form-contact input:focus,
:where(body:not(.veris-home)) .form-contact select:focus,
:where(body:not(.veris-home)) .form-contact textarea:focus {
  outline: 2px solid var(--Primary);
  outline-offset: 1px;
  border-color: var(--Primary);
}
:where(body:not(.veris-home)) .form-contact textarea { resize: vertical; min-height: 130px; }
/* Radio groups, where the live form asks a question as radio buttons: the
   legend reads like the other labels, and each radio is the kit's 20px box
   beside its option rather than a full-width text field. */
.form-contact .veris-radios legend { font-size: 14px; line-height: 20px; font-weight: 500; }
.form-contact .veris-radios label { display: flex; font-weight: 400; }
.form-contact .veris-radios input[type=radio] { width: 20px; height: 20px; padding: 0; flex: none; margin: 0; }

/* Spam traps: off-screen rather than display:none, which some bots skip. */
.veris-trap {
  position: absolute; left: -9999px; width: 1px; height: 1px;
  overflow: hidden;
}

/* The wired forms' status line (assets/js/veris-forms.js): empty until a
   submit, then "Sending...", the error or the success. role="alert". */
.veris-form-status:empty { display: none; }
.form-contact button[aria-disabled="true"] { opacity: .6; cursor: progress; }
.veris-form-status { padding: 12px 16px; border-left: 4px solid #627080; color: #1b2b3d; }
.veris-form-status.is-error { border-left-color: #a4262c; color: #a4262c; }
.veris-form-status.is-success { border-left-color: #1479bd; }
.veris-form-status.is-error .veris-inline-link { color: #a4262c; }

/* ---- Team grid -----------------------------------------------------------
   Bios are a <details> disclosure rather than the live site's modal: it works
   with JavaScript off, is keyboard reachable, and cannot open the wrong
   person's bio the way the live page's + links currently do.
-------------------------------------------------------------------------- */

/* team-image sizing, .title size and the group-label colour all live in the
   "Team headshots" and "Type scale" blocks below: this block's earlier copies
   of them were dead, overridden verbatim further down the same file. */
.team-item .title { margin-bottom: 8px; }
.veris-frame-md { border-radius: var(--veris-radius-md); }

.veris-bio-open {
  cursor: pointer; font-size: 14px; color: var(--Primary);
  padding: 6px 0; background: none; border: 0; text-align: left;
}
.veris-bio-open::after { content: " \203A"; }
.veris-bio-open:hover, .veris-bio-open:focus-visible { text-decoration: underline; }
.veris-bio-modal dl { margin: 8px 0 0; font-size: 14px; line-height: 1.55; }
.veris-bio-modal dt { font-weight: 600; color: #1b2b3d; margin-top: 10px; }
.veris-bio-modal dd { margin: 2px 0 0; color: #46566a; }

/* ---- Photography restored in task 10 -------------------------------------
   The live articles set their illustration beside the opening paragraphs
   (WordPress `alignright`). Floating it reproduces that without the float
   trapping the figure inside a list item, which is where the live markup
   puts it. It goes full width below the text column on a phone. */
.veris-post-figure {
  float: right;
  width: min(42%, 360px);
  margin: 6px 0 24px 32px;
}
.veris-post-figure img { width: 100%; height: auto; display: block; }
@media (max-width: 767px) {
  .veris-post-figure { float: none; width: 100%; margin: 0 0 28px; }
}

.veris-photo img { width: 100%; height: auto; display: block; }

/* ---- Article body --------------------------------------------------------
   The kit styles its own blog markup, not WordPress's. Post bodies come
   across as plain <p>, <ul> and <strong> with no kit classes on them, so
   without this they render at the browser default: no paragraph rhythm, no
   list indent, run-on <strong> lead-ins.
-------------------------------------------------------------------------- */

.veris-post-body { font-size: 17px; line-height: 1.75; color: var(--mono-gray-7, #4a5a6a); }
/* The kit has a global `p` rule, which is more specific than inheriting from
   the container: paragraphs came out at 15px while the <li>s under them
   inherited 17px, so a bullet list read larger than the sentence introducing
   it. Both are set explicitly. max-width keeps the measure near 75 characters
   rather than the ~120 an 932px column gives. */
.veris-post-body > p,
.veris-post-body li { font-size: 17px; line-height: 1.75; }
.veris-post-body > p { margin: 0 0 22px; max-width: 68ch; }
.veris-post-body h2,
.veris-post-body h3,
.veris-post-body h4 { margin: 40px 0 16px; color: #1b2b3d; clear: both; }
/* The kit's type scale is 64/48/40/36/32/24. An earlier round gave article
   bodies their own scale — 28/23/20 — so the 76 article pages, the biggest
   page type on the site, ran a parallel typographic system next to every other
   page. Measured against the demo: ten distinct heading sizes across the site
   where the kit uses six. h2 and h3 move onto the kit's steps. h4 stays at
   20px because the scale has no step below 24 and matching h3 would flatten
   the level rather than fix it. */
.veris-post-body h2 { font-size: 32px; line-height: 1.25; }
.veris-post-body h3 { font-size: 24px; line-height: 1.3; }
.veris-post-body h4 { font-size: 20px; line-height: 1.35; }
/* The shell renderer promotes a heading that skips a level (an article body
   that opens at <h3> or <h4> straight under the page <h1>) and marks it with
   the kit's class for the tag it had: <h2 class="h3">. Above 768px the size
   comes from the tag rules above, so they are restated for those classes;
   below it the kit's own `h3, .h3 { … !important }` already treats both
   alike. Same sizes, so the article reads exactly as it did. */
.veris-post-body .h3 { font-size: 24px; line-height: 1.3; }
.veris-post-body .h4 { font-size: 20px; line-height: 1.35; }
/* The article wrapper carries the kit's `single-post-content`, and the kit has
   `.single-post-content ul { display: grid; gap: 33px }` — meant for the demo's
   spaced feature list. Applied to prose bullets it put 45px between list items
   (33px grid gap plus the 12px li margin) against a 30px line, so every list in
   all 76 articles read as a stack of disconnected lines rather than a list.
   Prose lists go back to normal flow. */
.veris-post-body ul,
.veris-post-body ol { display: block; margin: 0 0 22px; padding-left: 24px; }
/* The kit clears list markers globally for its own nav and feature lists. */
/* The kit clears markers with `li { list-style: none }`. Setting the type on
   the UL does nothing, because the LI's own declaration wins — so the lists
   rendered as indented text with no bullets. The type has to go on the li. */
.veris-post-body ul > li { list-style-type: disc; }
.veris-post-body ol > li { list-style-type: decimal; }
.veris-post-body ul ul > li { list-style-type: circle; }
.veris-post-body li { display: list-item; }
.veris-post-body li { margin-bottom: 12px; }
.veris-post-body li > ul,
.veris-post-body li > ol { margin-top: 12px; }
/* Bold lead-ins open a point; they read as a run-on inline. */
.veris-post-body li > strong:first-child,
.veris-post-body li > em:first-child > strong { color: #1b2b3d; }
.veris-post-body a { color: var(--Primary); text-decoration: underline; }
.veris-post-body a:hover { text-decoration: none; }
.veris-post-body blockquote {
  margin: 28px 0; padding: 4px 0 4px 24px;
  border-left: 3px solid var(--Primary); color: #1b2b3d;
}
.veris-post-body img { max-width: 100%; height: auto; border-radius: var(--veris-radius-sm); }

/* Each live team modal shows a second, off-duty photograph beside the facts.
   The grid card shows the headshot; the expanded bio carries the other one. */
.veris-bio-photo { margin: 14px 0 16px; }
.veris-bio-photo img { width: 100%; height: auto; display: block; }

/* ---- Mobile menu button --------------------------------------------------
   The kit paints the burger as three `.mobile-button .burger span` bars in
   --Primary, sized against a 25x18 `.burger` whose own background is
   transparent. The shell emitted a single empty <span class="burger">, so
   those rules matched nothing and the control rendered as an invisible hit
   target on every page: it opened the menu correctly, but a phone visitor
   had nothing to tap. The three bars are now in the markup; this only keeps
   the element a square target and guarantees the bars have a colour even if
   --Primary is ever inherited away.
-------------------------------------------------------------------------- */

.mobile-button { color: var(--Primary); }
.mobile-button .burger { display: block; position: relative; width: 25px; height: 18px; }
.mobile-button .burger span { background: currentColor; }


/* ---- Counters ------------------------------------------------------------
   The kit sizes these with `.counter-item.style-default span { font-size:64px }`.
   That works because odometer.min.js rewraps the number into <span>s — but
   neither odometer.min.js nor counter.js is loaded here, so the number stayed
   a bare <div> at the inherited 15px while the "+" beside it rendered at 64px.
   Sizing the element itself makes the counter correct with no JS.

   Not on the homepage, which does load odometer.js and counter.js, so its
   numbers are already sized by the kit.
-------------------------------------------------------------------------- */

/* Set it on the container so the number and the "+" cannot drift apart,
   whichever child the kit happens to target at a given breakpoint. */
/* Match the kit's own two sizes for the "+" beside it: 64px, dropping to
   24px below 575px (which the kit sets with !important). With odometer
   running the number would be spans and would pick these up by itself. */
:where(body:not(.veris-home)) .counter-item.style-default .odometer { font-size: 64px; line-height: 72px; }
@media (max-width: 575px) {
  :where(body:not(.veris-home)) .counter-item.style-default .odometer { font-size: 24px !important; line-height: 32px; }
}

/* ===========================================================================
   Design-review pass. Everything below is a measured defect, not a preference.
   Each block records the number that failed and what it is now.
   =========================================================================== */

/* ---- Text contrast ------------------------------------------------------
   Measured across 20 pages at three viewports: 55 failures on /who-we-are/
   and 6 on the homepage.

   --Mono-gray-5 (#7e8995) is 3.56:1 on white and 3.29:1 on the tinted
   section background. It is the kit's colour for counter sub-copy, accordion
   titles and card captions - all body-sized, so all need 4.5:1. Only the
   TEXT class is redefined; the token keeps its value for borders and fills,
   where the kit's design intent is unaffected.

   --Primary (#1479bd) is 4.86:1 on white, which passes, but 4.45:1 on the
   tinted background, which does not. The brand blue is settled and is NOT
   changed: a slightly darker shade is used only for body-sized text on a
   tinted ground, which is where the failure is.
-------------------------------------------------------------------------- */

:root { --veris-ink-muted: #5f6a74; --veris-primary-text: #1868a6; }

.text_mono-gray-5 { color: var(--veris-ink-muted); }
.text_mono-gray-4 { color: var(--veris-ink-muted); }
/* `.section-service.bg-sub-color .title` was in this list and has been removed.
   It is a 32px card heading, not body-sized text: large text needs 3:1 and
   --Primary is 4.45:1 on the tint, so it never failed. The kit renders those
   titles near-black (h3 inherits var(--Black)) and the kit's `.link` is
   `color: inherit`, so darkening the heading turned every service card title
   on the homepage Veris blue where the Advitex benchmark has them black.
   Measured against the demo: ours rgb(24,104,166), demo rgb(0,0,0). The brief
   is explicit that Advitex wins on colour. */
.bg-sub-color .text_primary,
.veris-bio-open { color: var(--veris-primary-text); }

/* ---- Measure ------------------------------------------------------------
   Body copy measured at 117-157 characters per line on eight pages. The
   comfortable range is 45-75; past about 90 the eye loses the line return.
   The kit's own container is wider than its text ever should be, so the
   cap goes on the paragraph rather than on the column.

   NOT on the homepage, hence `:where(body:not(.veris-home))`. These caps were
   measured on interior markup; the homepage is the kit's own homepage with its
   own measure, signed off against the benchmark, and the caps re-flowed its
   headings, FAQ answers and testimonial lead when it moved onto this file.
   `:where()` carries zero specificity, so on the other 135 pages these rules
   cascade exactly as they did before the exclusion was added.
-------------------------------------------------------------------------- */

:where(body:not(.veris-home)) .section .description,
:where(body:not(.veris-home)) .text-with-img-2 .content .description,
:where(body:not(.veris-home)) .tf-box-icon p,
:where(body:not(.veris-home)) .counter-item .sub-heading,
:where(body:not(.veris-home)) .heading-section > .left > p,
:where(body:not(.veris-home)) .heading-section > p,
:where(body:not(.veris-home)) .form-contact > p,
:where(body:not(.veris-home)) .accordion-faqs-content p,
/* The contact band's lead. On most pages it sits in a col-lg-5 and is narrow
   by accident of the column; on /contact/ the same block is a col-lg-8 and ran
   to 932px, 104 characters a line. Capping the paragraph rather than the
   column is a no-op wherever the column is already narrower. */
:where(body:not(.veris-home)) .section-contact .content > p,
:where(body:not(.veris-home)) .section-testimonial .quote { max-width: 68ch; }
/* Testimonial quotes ran the full 1378px container - 153 characters a line,
   the widest text on the site and the copy most likely to be read closely. */
:where(body:not(.veris-home)) .section-testimonial .quote { margin-left: auto; margin-right: auto; }
:where(body:not(.veris-home)) .heading-section.text-center > p { margin-left: auto; margin-right: auto; }

/* ---- Tap targets --------------------------------------------------------
   Up to 50 controls per page measured under 40px tall on a phone: breadcrumb
   links at 26px, card title links at 20px, bio toggles at 26px. WCAG 2.5.8
   asks for 24px minimum and 44px is the comfortable target; these are padded
   to 44 without moving the text, so layout is unchanged.
-------------------------------------------------------------------------- */

@media (max-width: 991px) {
  .breadcrumb a, .breadcrumb li,
  .blog-article-item .title a,
  .team-item .title a,
  .veris-bio-open,
  .footer a { display: inline-flex; align-items: center; min-height: 44px; }
  /* The kit clamps the current crumb to one line with display:-webkit-box,
     which beats the inline-flex above, so its text sat at the top of the 44px
     row, 9px above the links beside it. It is not a link and needs no tap
     target; a 44px line box centres it and keeps the clamp. */
  .breadcrumb li:last-child { line-height: 44px; }
  .tf-box-icon .title a,
  .accordion-title,
  .section-contact .contact a { display: inline-flex; align-items: center; min-height: 44px; }

  /* Form controls and buttons sat at 36px. 44px is the comfortable target and
     costs nothing here: the fields are already full width. */
  .form-contact input,
  .form-contact select,
  .form-contact textarea { min-height: 44px; }
  .tf-btn { min-height: 44px; }
}

/* The credentials line on a team card is --Primary on the section's tinted
   ground: 4.49:1 against the 4.5 it needs. The team section sets that tint
   itself rather than carrying .bg-sub-color, so it needs naming directly. */
/* The kit sets `.text_primary { color: var(--Primary) !important }`, so the
   credentials line gets its own class rather than an !important fight. */
.veris-credentials { color: var(--veris-primary-text); }
/* A partner's departments, under their title (WO-2026-060 task 6;
   templates/team.json `department`, awaiting Veris's confirmation). Ink,
   600, so it reads as a label rather than another line of gray. */
.veris-team-department { margin-top: 4px; color: #1b2b3d; font-weight: 600; }

/* ---- Team cards ---------------------------------------------------------
   Every headshot is a 400x300 WordPress card export with the person's name,
   credentials and title set into the top-left AND the live site's modal "+"
   affordance set into the top-right. Neither is removable by cropping:

     frame 3:4  image 596x447  label ends 291  window 335 wide, max start 261
     frame 2:3  image 669x502  label ends 326  "+" starts 619
     frame 3:5  image 744x558  label ends 363  "+" starts 688

   At every aspect the two artifacts sit farther apart than the window is
   wide, so no object-position clears both. Cropping hard enough to clear the
   label alone (2:3 at 100%) pushes the subject off the left edge — a worse
   defect than the one it fixes, verified on all 47.

   So the image is shown WHOLE at its native 4:3. Nothing is sliced mid-word,
   no face is cut, and the "+" reads as the affordance it is. The name below
   it is still rendered as HTML: it is selectable, searchable and available to
   a screen reader, none of which is true of type baked into a JPEG.

   The real fix is an asset request, not CSS: 47 headshots re-exported from
   the originals at >=800px with no text burned in. The current sources are
   also being upscaled ~1.5x on desktop and ~3x on a retina phone.
-------------------------------------------------------------------------- */

/* 4:5 portraits (revision brief, Chris Kerr, 2026-10-09: "consistent 4:5
   portrait crops"), from Veris's text-free originals, each cut 640x800 on
   the face (assets/images/headshots/, 2026-10-13). The hover photos are
   landscape and cover-crop into the same frame. */
.team-item .team-image { aspect-ratio: 4 / 5; }
.team-item .team-image img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center;
}

/* ---- Team hover photo (WO-2026-051 task 4) --------------------------------
   Every live team card fades its headshot out on hover to show a second,
   off-duty photo behind it. Here that photo is a second <img> in the same
   rounded frame (alt="", aria-hidden: decorative), under the headshot; the
   headshot fades on hover over the photo itself (not the name, title or
   button under it: Larry, 2026-10-08) and on keyboard focus inside the card.
   Keyboard focus only (`:focus-visible`), not `:focus-within`: closing a
   bio dialog hands focus back to the "+" that opened it, and with
   :focus-within a mouse visitor was left looking at the second photo until
   they clicked elsewhere (Larry, 2026-10-13). Only cards that have one
   (`.veris-team-swap`, from templates/team.json hoverPhoto). */
.veris-team-swap .team-image .veris-team-hover { position: absolute; inset: 0; z-index: 0; }
/* The hover photos are landscape (about 4:3) and the frame is a 4:5
   portrait, so a centred crop kept the middle 60% and cut people off at the
   sides (Larry, 2026-10-13). Each is placed by hand in templates/team.json:
   `hoverPosition` slides the crop onto its subject where they fit
   (an inline object-position), and `hoverFit: "whole"` shows a photo too
   wide for any crop in full, on solid black (no blur: Larry). */
.veris-team-swap .team-image img.veris-team-hover-whole { object-fit: contain; background: #000; }
.veris-team-swap .team-image img:first-child { position: relative; z-index: 1; transition: opacity .4s ease; }
.veris-team-swap .team-image:hover img:first-child,
.veris-team-swap:has(:focus-visible) .team-image img:first-child { opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .veris-team-swap .team-image img:first-child { transition: none; }
}

/* The partner card's "+" (live .top-right-plus-link) opens the facts dialog. It used to sit
   exactly over a "+" printed in each old headshot file; the 4:5 portraits
   from the text-free originals have none, so it is a plain 28px circle 10px
   in from the frame's top-right corner, clear of the 12-16px rounded corner,
   with a 44px tap area anchored to that corner.
   overflow: visible is load-bearing (WO-2026-060 task 6). The kit gives
   every button `overflow-x: hidden; overflow-y: auto` (styles.css,
   "General"), and the 44px ::after tap area overflows the 28px circle, so
   the "+" was a scroll container with 6px to scroll: on Windows, where
   scrollbars take space and draw arrow buttons, a 17px scrollbar with an
   up and a down arrow covered most of the circle (Ashley's screenshot,
   email/ashley-13-plus-icon.png). viewport-check fails a "+" that scrolls. */
.team-item .team-image { position: relative; }
.veris-bio-plus {
  --d: 28px; --top: 10px; --right: 10px;
  overflow: visible;
  position: absolute; z-index: 3; top: var(--top); right: var(--right);
  width: var(--d); height: var(--d); padding: 0; border: 0; border-radius: 999px;
  display: grid; place-items: center;
  background: rgba(0,0,0,.65); color: #fff;
  font-size: calc(var(--d) * .72); line-height: 1; font-weight: 600; cursor: pointer;
}
.veris-bio-plus::after {
  content: ""; position: absolute;
  top: calc(-1 * var(--top)); right: calc(-1 * var(--right)); width: 44px; height: 44px;
}
.veris-bio-plus:hover { background: rgba(0,0,0,.82); }
.veris-bio-plus:focus-visible { outline: 2px solid #fff; outline-offset: 1px; box-shadow: 0 0 0 3px rgba(0,0,0,.65); }
/* A staff card's photo opens the same bio dialog as its "+" (WO-2026-060
   task 6): an extra pointer target, not a control. The "+" stays the one
   labelled, focusable control; keyboard users use it. assets/js/veris.js
   ("Team bios") wires the click. Partner photos link to their page. */
.team-image[data-veris-bio] { cursor: pointer; }

/* The kit's sm-col-2 starts at 576px, so every phone narrower than that got
   ONE column of 47 cards: /who-we-are/ measured 21,745px on a 390px screen,
   about 26 screens to scroll past a directory people come to for one name.
   Two columns on the narrow end is the same fix the kit applies one breakpoint
   up, and a headshot still lands at ~165px wide. */
@media (max-width: 575px) {
  .section-team .tf-grid-layout-sm {
    /* display:grid MUST be here too. The kit only turns .tf-grid-layout-sm
       into a grid at >=576px, so below that the element is a block and
       grid-template-columns is inert — a first attempt that set only the
       columns left the page at 21,792px and reported "3 columns", because
       getComputedStyle hands back the unused specified value. */
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 20px 16px;
  }
}

/* Department bands break a 9,000px wall of 47 identical portraits into
   groups someone can actually scan. */
/* Department headings (revision brief, 2026-10-09): Manrope 600, 31px on
   a desktop and 25px on a phone, dark ink; below the page title, clearly
   above the names. No counts. */
.veris-team-group + .veris-team-group { margin-top: 64px; }
.veris-team-group-label {
  margin: 0 0 24px; font-size: 31px; line-height: 1.25; font-weight: 600; color: #1b2b3d;
}
@media (max-width: 767px) {
  .veris-team-group + .veris-team-group { margin-top: 48px; }
  .veris-team-group-label { font-size: 25px; margin-bottom: 16px; }
}

/* ---- Interior page header ------------------------------------------------
   `.page-title.style-default` reserves room for a hero that interior pages do
   not have, leaving a measured 143px of dead space under every breadcrumb —
   on all 60 page-type URLs. Trimmed so the first real section starts where
   the eye expects it.
-------------------------------------------------------------------------- */

.page-title.style-default .content-inner { padding-bottom: 0; }
.page-title.style-default .breadcrumb { margin-bottom: 0; }
/* Round 1 cut this padding to 48px to kill "143px of dead space". That space
   was not dead — it is what the kit reserves for the page deck, which we were
   not rendering. Cutting it made every interior page open thin and abrupt and
   cost ~200px of the kit's rhythm seven times over. The deck is back (each
   page's own meta description, which is Veris's sentence), so the padding
   goes back to the kit's 133px. */
.page-title.style-default .veris-deck { max-width: 68ch; }
@media (min-width: 992px) { .page-title.style-default { padding-bottom: 133px; } }
@media (max-width: 991px) { .page-title.style-default { padding-bottom: 72px; } }

/* ---- Photo grids --------------------------------------------------------
   Photographs came through at their own aspect, so a row of three measured
   301 / 286 / 454px tall and read as ragged. A shared ratio makes the row a
   row. 4:3 is the shape most of the Veris library is already in, so it crops
   least.
-------------------------------------------------------------------------- */

.veris-photo .veris-frame { aspect-ratio: 4 / 3; }
.veris-photo .veris-frame img { width: 100%; height: 100%; object-fit: cover; }
.veris-photo figcaption { text-align: center; }

/* ---- Icon-less cards ----------------------------------------------------
   `.tf-box-icon style-1` is built around an icon and reserves 53px under the
   title for one. Used for text-only cards — office hours, service lists — it
   left a large hole and no containment, so three contact cards read as loose
   text floating on the section background. The kit already has the border as
   a hover state; showing it at rest is the kit's own treatment, not a new one.
-------------------------------------------------------------------------- */

/* The surface (tint, radius, padding, type) is card style 3, set once in
   "Cards, style 3" at the end of this file (WO-2026-056 task 1). */
.tf-box-icon.style-1:not(:has(.icon)) { height: 100%; }
.tf-box-icon.style-1:not(:has(.icon)) .title { margin-bottom: 12px; }
/* The kit caps this title at 295px (styles.css, >=768px) to sit beside the
   icon. With no icon the cap only wraps titles early: "Charleston / West
   Ashley" broke onto two lines with 48px of card still free. Side padding is
   24px, not 28px, so it fits on one line from 1440px up. */
.tf-box-icon.style-1:not(:has(.icon)) .title { max-width: none; }
/* Where a title wraps, the descriptions of a card row still start on one
   line: "Cards, style 3" at the end of this file gives every card row a
   shared title row (subgrid), whatever its column count. */
/* Office cards (/locations/): the office name is centred; the labelled
   details under it stay left-aligned (Larry, 2026-10-08). */
.tf-box-icon.style-1 > .title:first-child:has(> a[href^="/veris-cpa-"]) { text-align: center; }
.section-service .heading-section:not(:has(.tf-btn)) { margin-bottom: 56px; }

/* ---- Card thumbnails ----------------------------------------------------
   Card images kept their own aspect, so a row of four measured 188 / 223 /
   218 / 223px tall and the four titles landed at four different heights. A
   shared ratio aligns the row. 3:2 is the closest fit to the library, so it
   crops least.
-------------------------------------------------------------------------- */

.blog-article-item .article-thumb { display: block; aspect-ratio: 3 / 2; }
.blog-article-item .article-thumb img { width: 100%; height: 100%; object-fit: cover; }

/* ---- A single testimonial ------------------------------------------------
   The kit's testimonial band is a carousel built for several quotes. Pages
   carrying exactly one rendered it as a lone left-aligned 18px paragraph in
   a 333px band — it read as a layout error rather than as a client speaking.
   One quote is set as a pull quote instead.
-------------------------------------------------------------------------- */

/* The attribution is written name first, as the live site reads it
   ("Name, Role, Organisation"); the kit draws the role above the name.
   Reversing the column keeps the kit's order on screen. */
/* Markup and reading order are "Name, Org" as on the live site; column-reverse keeps the kit's visual order (org above name). */
.testimonial .box-user .content { display: flex; flex-direction: column-reverse; }

/* Centred, at the card's own quote size, 17px / 1.7 (WO-2026-056 task 1:
   a lone interior testimonial is a testimonial card, not a pull quote). */
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .quote {
  text-align: center; color: #1b2b3d;
}
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) {
  justify-content: center;
}
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .swiper-slide {
  text-align: center;
}
/* The attribution block is positioned for the carousel's left-aligned card;
   with a centred pull quote it was stranded at the bottom-left corner. */
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .swiper-slide > * {
  margin-left: auto; margin-right: auto;
}
/* The attribution is .box-user > .content (kit-sections testimonials()); this
   rule targeted the kit demo's .author, which the markup never had, so the
   name sat at the left under a centred quote (WO-2026-056 task 1). */
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .box-user { justify-content: center; }
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .box-user .content { align-items: center; }
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .box-user .content,
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .name,
.section-testimonial .swiper-wrapper:not(:has(.swiper-slide + .swiper-slide)) .position {
  text-align: center; float: none; width: auto;
}


/* ===========================================================================
   Design review round 2. Every item here is a defect the round-1 audit
   MISSED because its selectors were all scoped to `main` — so the header and
   the offcanvas nav, which is the entire mobile navigation, were never
   measured. The round-1 claims of "0 contrast failures" and "tap targets
   >=40px" were therefore false site-wide; they were true of `main` only.
   =========================================================================== */

/* ---- Header dropdown links ----------------------------------------------
   48 links per page at rgb(126,137,149) on white = 3.56:1 against the 4.5
   they need at 18px. The kit ships this colour; we ship the kit.
-------------------------------------------------------------------------- */

.navigation .has-child .submenu > li > a { color: var(--veris-ink-muted); }

/* The round-2 pass above fixed the SUBMENU links and left the six top-level
   ones — About, Services, Industries, Pricing, Resources, Careers — still on
   the kit's --Mono-gray-5 (#7e8995). Measured 3.56:1 on the header's white
   background against the 4.5 that 18px text needs, on all 136 pages, which is
   the primary navigation of the whole site failing AA. Desktop only: below the
   breakpoint this nav is replaced by the offcanvas, which round 2 did fix. */
.main-menu .navigation > li > a { color: var(--veris-ink-muted); }

/* ---- Mobile navigation controls -----------------------------------------
   Measured at 390: the hamburger is 25x18 with padding 0, and the offcanvas
   close button is 12x12. These are the primary mobile navigation controls on
   every page — the two most important targets on a phone were the two
   smallest. Padding grows the hit area without moving the glyph.
-------------------------------------------------------------------------- */

/* `display` is deliberately NOT set here. The kit hides this control with
   `.mobile-button { display: none }` and shows it only at its mobile
   breakpoint; setting a display value unconditionally here overrode that and
   left the hamburger visible beside the desktop menu at every width. The
   padding is harmless while hidden, so only the display belongs in the
   breakpoint below. */
.mobile-button {
  padding: 13px;
  margin: -13px;
}
.canvas-mb .close-menu,
.offcanvas .close-menu {
  min-width: 44px; min-height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
}
/* The offcanvas nav rows are `.tf-collapse-item`, measured at 15px tall —
   every top-level destination on a phone: About, Services, Industries,
   Pricing, Resources, Careers. */
#menu-mobile .tf-collapse-item,
#menu-mobile .menu-item > a,
#menu-mobile .sub-menu a {
  min-height: 44px;
  display: flex;
  align-items: center;
}

/* ---- My own contrast failure --------------------------------------------
   The department count badge added in round 1 is rgb(159,169,178) at 13px on
   the team section's #eaf4fb = 2.21:1. Not the kit's — mine.
-------------------------------------------------------------------------- */


/* ---- Article measure ----------------------------------------------------
   Round 1 capped `.veris-post-body > p` only, so lists ran at 92-95ch and
   started at a different left edge from the paragraphs above them: two
   measures and two margins inside one article, on all 76 posts.
-------------------------------------------------------------------------- */

.veris-post-body > ul,
.veris-post-body > ol,
.veris-post-body > blockquote,
.veris-post-body > h2,
.veris-post-body > h3,
.veris-post-body > h4 { max-width: 68ch; }

/* ---- Card title scale ---------------------------------------------------
   The kit runs a six-step scale (64/48/40/36/32/24) and sets card titles at
   32px via `<h5 class="title">`. Round 1 corrected the heading LEVEL to h3
   for document outline, which was right, but h3 also carries 40px — so card
   titles jumped a step, stopped fitting a 3-column grid, and were being
   truncated with an ellipsis. The level stays correct; the size goes back to
   the kit's.
-------------------------------------------------------------------------- */

/* line-height 40px, not 1.2. The kit's own value is 40px; 1.2 computed to
   38.4px and set the card titles 1.6px tighter than the benchmark. */
.tf-box-icon .title,
.tf-box-icon .title a { font-size: 32px; line-height: 40px; }

.blog-article-item .title,
.blog-article-item .title a { font-size: 24px; line-height: 1.3; }
.team-item .title,
.team-item .title a { font-size: 20px; line-height: 1.3; }
@media (max-width: 767px) {
  .tf-box-icon .title, .tf-box-icon .title a { font-size: 26px; }
  .blog-article-item .title, .blog-article-item .title a { font-size: 21px; }
}

/* Equal-height cards so a row does not go ragged (measured 502/474/502/474/502
   against the demo's uniform 506). */
.section-service .swiper-wrapper > .swiper-slide { display: flex; }
.section-service .swiper-wrapper > .swiper-slide > .tf-box-icon { width: 100%; }

/* ---- Post navigation ----------------------------------------------------
   Every article was a dead end: the rebuild dropped the live template's
   prev/next pair, leaving only three related cards and the back button.
-------------------------------------------------------------------------- */

.veris-post-nav {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px;
  border-top: 1px solid var(--Mono-gray-2); padding-top: 28px;
}
.veris-post-nav-item {
  display: flex; flex-direction: column; gap: 6px;
  padding: 16px 20px; border: 1px solid var(--Mono-gray-2);
  border-radius: var(--veris-radius-md);
  text-decoration: none; min-height: 44px;
}
.veris-post-nav-item:hover { border-color: var(--Primary); }
.veris-post-nav-item.next { text-align: right; }
.veris-post-nav-label {
  font-size: 12px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--veris-ink-muted);
}
.veris-post-nav-title { font-size: 17px; line-height: 1.35; color: #1b2b3d; }
@media (max-width: 575px) {
  .veris-post-nav { grid-template-columns: 1fr; }
  .veris-post-nav-item.next { text-align: left; }
  /* The empty placeholder for a missing neighbour holds the second column
     at two across; stacked, it was an empty row and a 16px gap under the
     one link, at the band's foot (WO-2026-056 task 1). */
  .veris-post-nav > span:empty { display: none; }
}

/* ---- Header over the dark hero ------------------------------------------
   The homepage is the only page whose header sits on `.page-title.style-1`,
   the dark navy hero. Veris-CPA-logo-Main.png is a dark-navy lockup built
   for a white ground: on the hero the wordmark is barely legible and "THE
   PROACTIVE CPA" disappears entirely. The burger has the same problem in
   --Primary on navy.

   No reversed logo asset exists in the library, so the single-colour mark is
   produced from the one we have. `brightness(0) invert(1)` flattens it to
   white, which is the standard reversed treatment for a two-tone lockup and
   is reversible the moment a proper white asset arrives — it is one
   declaration, not a new file.
-------------------------------------------------------------------------- */

body:has(.page-title.style-1) #header-main .site-logo img {
  filter: brightness(0) invert(1);
}
body:has(.page-title.style-1) #header-main .mobile-button { color: #fff; }

/* The sticky header reveals on an upward scroll over white content, so it
   keeps the normal lockup. */
body:has(.page-title.style-1) .header-sticky .site-logo img { filter: none; }

/* A diagram, chart or lockup is shown whole. The frame keeps the row's shared
   height so the grid still lines up, but the image sits inside it rather than
   being cropped to fill it. */
.veris-photo-diagram .veris-frame { background: #fff; }
.veris-photo-diagram .veris-frame img { object-fit: contain; }

/* ---- Header: logo / menu gap --------------------------------------------
   The logo and the nav pill sit in `.header-left`, a flex row the kit leaves
   with no gap, so the pill's left edge met the logo image's right edge exactly
   — measured 0px at every width on every page. The Veris lockup runs to the
   edge of its PNG with no built-in breathing room, where the kit's own demo
   logo had some, which is why this shows here and not in the benchmark.
-------------------------------------------------------------------------- */
#header-main .header-left,
.header-sticky .header-left {
  gap: 50px;
}

/* ---- Header: hamburger from 1379px down ---------------------------------
   The kit switches the desktop nav for the hamburger at 1190px. The desktop
   header needs a full-size logo (231) + 50 + the nav pill (797) + 50 + the
   call-to-action (221) + gutters (30) = 1,379px. Below that the flex row pays
   for the shortfall out of the logo, which is the squeeze this breakpoint
   exists to prevent (101x19 at 1200px before it was raised).

   It was 1,335px until Home joined every page's nav and the pill grew to
   797px. That left 0px between the pill and the call-to-action at 1336 on
   the homepage and 7px on interior pages, so the 50px gap below was added
   and this moved up by the same arithmetic. A gap on its own does not fix
   it: measured with the gap and the old breakpoint, the logo shrank to
   187px at 1336.

   This overrides only the two rules that matter; the kit keeps its own copy
   at 1190 and down, and the unrelated h1 and pricing rules in that media
   query are left where they are. `.header .support` is in the kit block too
   but no Veris page has that element, so it is not restated here.
-------------------------------------------------------------------------- */
@media (max-width: 1379px) {
  .main-menu { display: none; }
  .mobile-button { display: inline-flex; align-items: center; justify-content: center; }
}

/* ---- Header: menu / call-to-action gap ----------------------------------
   The same 50px as the logo/menu gap above, between the nav pill and the
   call-to-action. Desktop only: below the breakpoint the pill is hidden, and
   at 320px the gap would take 16px out of the logo for nothing.
-------------------------------------------------------------------------- */
@media (min-width: 1380px) {
  #header-main .header-inner-wrap,
  .header-sticky .header-inner-wrap { gap: 50px; }
}

/* ---- Contact band photo frame (WO-2026-060 task 1) ----------------------
   The band's photo is one of four (bandPhotoFor in kit-sections.mjs) of
   different proportions, so the frame is 4:3 and the photo cover-cropped
   into it, as photoFrame() does for interior photos: every band's frame is
   the same shape whichever photo it shows. */
.section-contact .veris-band-frame { aspect-ratio: 4 / 3; }
.section-contact .veris-band-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }

/* ---- Header: Client Portal (WO-2026-060 task 1) -------------------------
   The existing clients' login beside "Talk with a Proactive CPA", in both
   header copies and the mobile menu, as the secondary of the two: the kit's
   outline button (.btn-border.border-1, Veris blue ink on a blue rule, filled
   on hover), so the solid "Talk with a Proactive CPA" stays the primary
   action. The header row: the kit's 16px between the two. Under 768px the
   header has no room for it (logo + both buttons + burger is ~650px), and the
   phone visitor finds it in the open menu, beside the primary button. */
/* Ink: the kit's --Primary measured 4.06:1 on the interior header gradient
   at 1440 and 3.5:1 in the sticky header, under the 4.5:1 that 16px text
   needs, so the button takes the darker shade the in-text links use on
   tinted bands (5:1 and up on all three). Over the homepage hero it is white
   ink on a white rule, the way the logo turns white there (Primary measured
   2.7:1 on the hero still). Hover and keyboard focus fill it with its ink
   and turn the label to the other colour. viewport-check (18) measures the
   label against what is painted behind it. */
.tf-btn.veris-portal-btn {
  --veris-portal-ink: color-mix(in srgb, var(--Primary) 80%, #000);
  --veris-portal-fill-text: #fff;
  white-space: nowrap;
}
.tf-btn.btn-border.border-1.veris-portal-btn { border-color: var(--veris-portal-ink); }
.tf-btn.btn-border.border-1.veris-portal-btn span { color: var(--veris-portal-ink) !important; }
.tf-btn.btn-border.border-1.veris-portal-btn :is(.bg-effect) { background-color: var(--veris-portal-ink); }
.tf-btn.btn-border.border-1.veris-portal-btn:is(:hover, :focus-visible) {
  background-color: var(--veris-portal-ink); border-color: var(--veris-portal-ink);
}
.tf-btn.btn-border.border-1.veris-portal-btn:is(:hover, :focus-visible) span { color: var(--veris-portal-fill-text) !important; }
body:has(.page-title.style-1) #header-main .tf-btn.veris-portal-btn {
  --veris-portal-ink: #fff;
  --veris-portal-fill-text: color-mix(in srgb, var(--Primary) 80%, #000);
}
@media (max-width: 767px) {
  .header .veris-portal-btn { display: none; }
}
/* With the desktop nav (1380px up) the row had no room left: logo, pill,
   call-to-action and the two 50px gaps fill the capped container at every
   width (measured 0px spare at 1380, 1440, 1600 and 1920), so the button's
   161px (145 + the 16px gap) would come out of the logo, which flex shrank
   to a 15px sliver at 1440. It is paid for in spacing instead: the pill's
   items 20px apart instead of the kit's 40 (120px), the two gaps above 32px
   instead of 50 (36px), the button's sides 20px instead of 24 (8px). Nothing
   else in the header moves or changes size. */
@media (min-width: 1380px) {
  #header-main .header-inner-wrap,
  .header-sticky .header-inner-wrap,
  #header-main .header-left,
  .header-sticky .header-left { gap: 32px; }
  .header .main-menu .navigation { gap: 20px; }
  .header .veris-portal-btn { padding: 0 20px; }
}
#menu-mobile .veris-mb-ctas { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 24px; }
/* The kit gives the menu's nav `height: 100%` of the panel, which put the
   buttons under it at 834px on a 390x844 phone: below the fold, the bottom
   of "Talk with a Proactive CPA" already cut off. The nav takes its own
   height instead, so both buttons show under Careers when the menu opens. */
#menu-mobile .mb-canvas-content { height: auto; }


/* ---- Submenus: only the hovered item opens -------------------------------
   The kit opens submenus with `.navigation .has-child:hover .submenu` — a
   DESCENDANT combinator, so hovering a top-level item matched every submenu
   beneath it, not just its own. Hovering "About" therefore opened the About
   panel AND the nested "Locations" panel at the same time.

   Restated so a nested submenu closes unless its own parent is hovered. The
   closed-state values are the kit's own, read from
   `.navigation .has-child .submenu`.
-------------------------------------------------------------------------- */
.navigation .has-child:hover .has-child:not(:hover) > .submenu {
  margin-top: 30px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* ---- Interior pages: title to content ------------------------------------
   The page title's padding-bottom and the following section's padding-top
   stack, and on a white page that reads as a void rather than as spacing:
   measured 228px between the breadcrumb and the first visible content at
   1440px. The kit draws its own page title as a tinted hero band where that
   much room makes sense; here it does not.

   56 + 64 brings it to 93px, which is deliberate rather than empty. Scoped
   three ways: desktop only (mobile already sat at a reasonable 122-132px),
   `.style-default` only so the homepage's `.page-title.style-1` hero is
   untouched, and `+ *` so only the section directly after the title moves —
   the kit's spacing rhythm everywhere else is left alone.
-------------------------------------------------------------------------- */
@media (min-width: 992px) {
  .page-title.style-default { padding-bottom: 56px; }
  main.main-content > :first-child { padding-top: 64px; }
}


/* ---- Footer headings -----------------------------------------------------
   The kit marks its footer column headings <h6>; the shell marks them <h3>
   so the outline does not jump h2 -> h6. `.footer-heading` sets no font size
   of its own, so the TAG's size came through: 40px on every interior page at
   desktop and 18px on a phone, against the kit's 24px and 20px. The homepage
   port had already restated these for its own footer; with one shared footer
   they now apply everywhere. Measured off the kit's h6, and !important below
   768px because that is how the kit sets heading sizes by tag there.
-------------------------------------------------------------------------- */
#footer .footer-heading { font-size: 24px; line-height: 32px; }
@media (max-width: 767px) { #footer .footer-heading { font-size: 20px !important; line-height: 28px; } }


/* ===========================================================================
   Homepage.

   Until October 2026 index.html was a hand-copied mirror of the Advitex demo
   homepage that loaded the UNMODIFIED kit stylesheet plus a port file,
   assets/css/veris-home-port.css, and Veris content was ported into it one
   element at a time. Every section is Veris now, so the page joined the shell
   and the port file folded in here. Its rules that only restated something
   this file already did (the header gap, the hamburger breakpoint, the
   submenu fix, the burger tap target, the reversed logo, the offices grid,
   the honeypots, equal-height service cards) were dropped rather than
   duplicated, and so were its Veris-blue overrides, which the production
   stylesheet already carries.

   Everything below is scoped to `.veris-home`, the homepage's body class.
   Several of these selectors also match markup the interior pages use — the
   blog grid, the testimonial band, the contact form's select, the service
   cards — and unscoped they would have changed those pages too. Scoping keeps
   this block about the homepage and nothing else; verified by snapshotting
   the computed style of every element on all 135 interior pages before and
   after the fold.
   =========================================================================== */

/* ---- Hero ----------------------------------------------------------------
   The benchmark's hero is a full-bleed photograph. Ours had been rendering as
   a flat navy gradient, which is the single biggest reason the two homepages
   read differently — and it was a reasoned decision, not an accident: the
   kit's own hero image is 170KB of stock photography and the brief bars stock
   from any source, so a brand wash stood in "until a page supplies its own
   photograph". This supplies it.

   Who-We-Are-scaled.jpg, 2048x1152, Veris's own photograph of three of their
   people in the office. The other candidate, veris_cpa-1080p_38.jpeg, is a
   frame from the Veris video with the Veris logo burned into the middle of it,
   so a headline cannot sit over it.
-------------------------------------------------------------------------- */

.veris-home .page-title.style-1 {
  /* Navy under the photograph: if it fails to load, or loads slowly, the
     white headline and the team link still sit on a dark ground (review,
     "make image/video failure graceful"). viewport-check caught the gap: it
     read the link as white on white, which is what a failed photo shows. */
  background-color: #1b2b3d;
  background-image: url(/assets/images/Who-We-Are-scaled.jpg);
  background-size: cover;
  background-repeat: no-repeat;
  background-position: center;
}
/* A phone's hero is tall and narrow, so a centred crop of the 16:9 still
   kept slivers of the two women at the edges. Zoomed to 125% of the
   height and nudged right of centre, the man fills the frame cleanly
   (WO-2026-060 task 3, round 4); his face stays above the headline. */
@media (max-width: 575px) {
  .veris-home .page-title.style-1 { background-size: auto 125%; background-position: 50.7% 30%; }
}

/* The scrim (WO-2026-060 task 3, Chris Kerr's hero mockup, 2026-10-25). The
   headline and button sit at the bottom left of the video, so the scrim is
   shaped to them: a radial darkening anchored at the visible bottom-left
   corner (the hero's bottom edge less the 119px the content band overlaps
   it by), a low wash along the bottom, and a band along the top for the
   white logo and the white-ink "Client Portal" button over the bright
   ceiling (at .55 fading out by 200px the button's label measured 2.65:1 at
   1440, under the 4.5:1 viewport-check (18) holds it to; at .72, .62 by
   100px and clear by 220px it measures 6.6:1). The middle and right of the frame,
   where the faces are, stay clear. Not a box behind the text: the work
   order asks for a gradient. Measured with the headline hidden, against
   the still (Who-We-Are-scaled.jpg) and a frame of the video
   (veris_cpa-1080p_38.jpeg) at 390, 768, 1024, 1440 and 1920: white on the
   brightest pixel behind it is 5.9:1 or more, against the 3:1 large text
   needs. */
.veris-home .page-title.style-1::after {
  background:
    radial-gradient(farthest-side at 0 calc(100% - 119px),
      rgba(6, 14, 24, .78) 0%, rgba(6, 14, 24, .62) 45%, rgba(6, 14, 24, .30) 75%, rgba(6, 14, 24, 0) 100%),
    linear-gradient(0deg, rgba(6, 14, 24, .55) 0, rgba(6, 14, 24, .30) 32%, rgba(6, 14, 24, 0) 60%),
    linear-gradient(180deg, rgba(6, 14, 24, .72) 0, rgba(6, 14, 24, .62) 100px, rgba(6, 14, 24, 0) 220px);
}
/* A phone's headline runs nearly the full width, across the brightest
   middle of the frame, so the wash along the foot is deeper there. */
@media (max-width: 575px) {
  .veris-home .page-title.style-1::after {
    background:
      linear-gradient(0deg, rgba(6, 14, 24, .72) 0, rgba(6, 14, 24, .62) 38%, rgba(6, 14, 24, 0) 68%),
      linear-gradient(180deg, rgba(6, 14, 24, .55) 0, rgba(6, 14, 24, 0) 200px);
  }
}

/* ---- Hero video ----------------------------------------------------------
   assets/js/veris.js builds a Vimeo background iframe into
   `.veris-hero-media[data-vimeo]` only once it has confirmed Vimeo is
   reachable — a blocked request otherwise paints the browser's network-error
   page inside the hero, over the headline. So the photograph above is not a
   placeholder that gets replaced; it is the hero, and the video layers over it
   when it can. Visitors who block Vimeo, or who ask for reduced motion, make
   no request to it at all and simply keep the photograph.

   Z-ORDER MATTERS HERE. The scrim carries the whole contrast argument for the
   white type, and it was measured against the still. Moving footage varies in
   brightness, so the scrim has to sit ABOVE the video, not below it, or the
   measured ratios stop meaning anything the moment the iframe arrives.

     0  the photograph (background-image on .page-title.style-1)
     1  the video
     2  the scrim (.page-title.style-1::after)
     3  the content

   There used to be a blue wash on `.veris-hero-media::after`, the contrast
   treatment from when the hero was a flat gradient. It is gone: the scrim
   does that job now and is shaped to the text, and stacking both would
   double-darken the footage.
-------------------------------------------------------------------------- */

.veris-home .page-title.style-1 { position: relative; overflow: hidden; }
.veris-home .veris-hero-media {
  position: absolute; inset: 0; z-index: 1;
  overflow: hidden; pointer-events: none;
  container-type: size;
}
/* Cover the hero with the 16:9 video, edge to edge, header band included.
   The frame itself must stay exactly 16:9: Vimeo letterboxes inside any
   other shape. The old sizing (100vw x 56.25vw, min 100% x 177.78vh) gave a
   1600x1110 frame on a 1440-wide laptop, because the hero is taller than the
   viewport, and the letterbox left ~105px of still photograph above and below
   the footage, behind the header (Veris, 2026-10-06). Sized from the hero's
   own box instead (cq units): whichever of width or height is the binding
   side, the other follows at 16:9, so the video always overfills. */
.veris-home .veris-hero-media iframe {
  position: absolute; top: 50%; left: 50%;
  width: 100vw; height: 56.25vw;            /* fallback, no container units */
  min-height: 100%; min-width: 177.78vh;
  width: max(100cqw, 177.78cqh);
  height: max(100cqh, 56.25cqw);
  min-width: 0; min-height: 0;
  transform: translate(-50%, -50%);
  border: 0;
}
.veris-home .page-title.style-1::after { z-index: 2; }
.veris-home .page-title.style-1 > .content-inner { position: relative; z-index: 3; }

/* ---- About band ----------------------------------------------------------
   Ported: the kit's brand marquee, the text-with-img block and its circular
   photo frame, the rotating badge, and the three counters.
-------------------------------------------------------------------------- */

/* The kit's brand marquee carries Awards & Recognition: the award logos,
   gray until pointed at, from build-inputs/awards.json (WO-2026-051 task 6). */

/* ---- Contact ---------------------------------------------------------- */

/* The kit's contact form has no <select> — its demo form is four text fields —
   so nothing in the kit styles one, and the service dropdown rendered as a raw
   browser control: 23px tall against the inputs' 48px, square against their
   12px radius, grey against their white, and narrow enough that its label sat
   beside it instead of above.

   These are the kit's OWN input values, read off `#home-email` in the browser
   rather than guessed, so the select matches the fields around it exactly.
   The service field is load-bearing — docs/form-contract.md: a value matching
   none of the three strings sends the lead nowhere — so it must not be the one
   control that looks broken. */
.veris-home .form-contact fieldset select {
  display: block;
  width: 100%;
  height: 48px;
  padding: 12px 16px 15px 15px;
  border: 1px solid rgb(190, 197, 203);
  border-radius: 12px;
  background-color: #fff;
  font-size: 18px;
  font-family: inherit;
  color: #000;
  /* `appearance: none` removes the native arrow, so one is drawn back on.
     Inline SVG rather than a file: it is two strokes, and an extra request for
     a chevron is not worth it. */
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' fill='none'%3E%3Cpath d='M1 1l6 6 6-6' stroke='%23495A6A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 16px center;
  padding-right: 42px;
}

/* ---- Heading levels vs the kit's type scale --------------------------
   A correction to an assumption I stated confidently and did not test.

   I had been changing the kit's heading TAGS to fix document outline — its
   markup runs h1 -> h5 -> h6 by visual weight, not by structure — on the
   grounds that "the kit styles headings by class, so the level is free".
   That is true for `.h1` and for `.title` inside the service card. It is
   FALSE for `.footer-heading`, which sets no font-size at all, and the tag's
   own size comes through. Audited all five places I had changed a level:

     about band heading   h2 48px  where the kit's h1 gives 64px
     blog card title      h3 40px  where the kit's h5 gives 32px
     footer heading       h3 40px  where the kit's h6 gives 24px   (now global,
                                                                  see "Footer
                                                                  headings")
     service card title   h3 18px  where the kit's h5 gives 16px   (mobile)
     contact heading      h2 64px  = kit    (`.h1` carries the size)

   Four of five had drifted, two of them by 16px. The levels are right and
   stay; the kit's own sizes are restated here so the page renders as the
   benchmark does while the outline stays correct. Every number below was read
   off the kit's original tag in the browser at each breakpoint, not guessed.
-------------------------------------------------------------------------- */

/* About band heading — the kit's h1 */
.veris-home .section-about .text-with-img-1 .content .title { font-size: 64px; line-height: 72px; }
@media (max-width: 1199px) { .veris-home .section-about .text-with-img-1 .content .title { font-size: 53px; line-height: 61px; } }
@media (max-width:  991px) { .veris-home .section-about .text-with-img-1 .content .title { font-size: 40px; line-height: 48px; } }
@media (max-width:  767px) { .veris-home .section-about .text-with-img-1 .content .title { font-size: 37px; line-height: 45px; } }
@media (max-width:  575px) { .veris-home .section-about .text-with-img-1 .content .title { font-size: 24px; line-height: 32px; } }

/* Below 768px the kit forces heading sizes by TAG with !important —
   `h3, .h3 { font-size: 28px !important }` at 767 and `18px !important` at
   575 — so a class rule cannot win there however specific it is. That is why
   the desktop corrections above took and the mobile ones did not. The three
   rules below answer the kit's own !important in kind, scoped to exactly the
   elements whose tag I changed. Nothing else on the page is touched. */

/* The contact block's phone number: the kit marks it <h6>, it is an <h3> here
   under the section's h2. `.h6` carries the size above 768px, so only the
   small breakpoints need restating — the kit's h3 !important wins there and
   renders it 18px against the h6's 20px. */
@media (max-width: 767px) {
  .veris-home .section-contact .bot .content h3.h6 { font-size: 20px !important; line-height: 28px; }
}

/* The kit's scroll-to-top button sits 20px from the right edge, 55px square,
   and the footer's bottom bar puts its link flush to the same edge. Measured
   at 1440px: the button covers x1365-1420 and the Privacy Policy link runs
   x1319-1425, so 60px of a 106px link sits under it — a hit test found 10 of
   18 sampled points on the link unclickable. Clearing the button's width plus
   its gap gives the link back. The button is hidden below 768px, where the
   hit test already came back clean, so this is scoped above it. */
@media (min-width: 768px) {
  .veris-home #footer .footer-bottom .wrapper { padding-right: 80px; }
}

/* ===========================================================================
   Chris Kerr's website review, 2026-10-02. Each block names its item.
   =========================================================================== */

/* ---- Shadows (review, priority 3) -----------------------------------------
   Chris likes the current site's rounded white cards and softly shadowed
   partner photo. One restrained shadow, defined once, used where an element
   needs to lift off a clean background: cards, selected photos, testimonials
   and forms. Two layers: a wide, soft one for depth and a tight one so the
   edge reads on white. */
:root {
  --veris-shadow: 0 18px 40px -22px rgba(16, 39, 61, .28), 0 2px 8px rgba(16, 39, 61, .06);
}

/* ---- Pricing tool (review item 1) ---------------------------------------- */
.veris-pricing { display: grid; gap: 24px; max-width: 960px; margin: 0 auto; }
.veris-pricing-group {
  padding: 32px; /* surface: "Cards, style 3" */
}
.veris-pricing-group-title { font-size: 24px; line-height: 32px; margin: 0 0 8px; }
/* "Step 2: Add additional details": a heading between the step 1 card and the
   service cards, as on the live calculator, not a card of its own. */
.veris-pricing-step { font-size: 24px; line-height: 32px; margin: 16px 0 0; }
.veris-pricing-step[hidden] { display: none; }
.veris-pricing-note { font-size: 15px; color: var(--veris-ink-muted); margin: 0 0 20px; max-width: 68ch; }
.veris-pricing-q + .veris-pricing-q { margin-top: 24px; }
.veris-pricing fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.veris-pricing-label { display: block; font-weight: 500; color: #1b2b3d; margin-bottom: 10px; font-size: 17px; }
.veris-pricing-options { display: flex; flex-wrap: wrap; gap: 10px; }
.veris-pricing-option { position: relative; cursor: pointer; margin: 0; }
.veris-pricing-option input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.veris-pricing-option span {
  display: inline-flex; align-items: center; min-height: 44px; padding: 8px 18px;
  border: 1px solid var(--Mono-gray-2); border-radius: 999px; background: #fff;
  color: #1b2b3d; transition: background-color .2s, border-color .2s, color .2s;
}
.veris-pricing-option:hover span { border-color: var(--Primary); }
.veris-pricing-option input:checked + span { background: var(--Primary); border-color: var(--Primary); color: #fff; }
.veris-pricing-option input:focus-visible + span { outline: 3px solid var(--Primary); outline-offset: 2px; }
.veris-pricing-options.is-toggles .veris-pricing-option input:checked + span::before { content: "\2713\00a0"; }
.veris-pricing select {
  width: 100%; max-width: 480px; min-height: 48px; padding: 10px 42px 10px 16px;
  border: 1px solid #bec5cb; border-radius: 12px; background-color: #fff; font: inherit; color: #1b2b3d;
  appearance: none; -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='9' fill='none'%3E%3Cpath d='M1 1l6 6 6-6' stroke='%23495A6A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 16px center;
}
/* The running estimate. It used to be a full-width bar pinned to the bottom
   of the screen, 146px tall at 1440, over the question being answered.
   Larry, 2026-10-06: a slim bar instead, one line from 992px up (label,
   figure, what is left to answer, the button) at about half the height, and
   two lines below that with only the figure and the button. A sidebar beside
   the questions was built first and did not look right. The bar comes to
   rest after the last question, so it never hides the end of the form. */
.veris-pricing-total {
  position: sticky; z-index: 5;
  background: #101f30; color: #fff; border-radius: var(--veris-radius-lg);
  box-shadow: var(--veris-shadow);
  display: grid; align-items: center;
}
.veris-pricing-total p { margin: 0; color: #fff; }
.veris-pricing-total-label { font-size: 15px; letter-spacing: .08em; text-transform: uppercase; opacity: .85; }
.veris-pricing-total-value { font-size: 32px; line-height: 40px; font-weight: 600; }
.veris-pricing-total-hint { font-size: 14px; opacity: .85; }
.veris-pricing-total .tf-btn.btn-primary2 { background-color: #fff; justify-content: center; }
.veris-pricing-total .tf-btn.btn-primary2 span { color: #101f30; }
.veris-pricing-next-short { display: none; }
@media (min-width: 992px) {
  .veris-pricing-total {
    bottom: 16px; border-radius: 999px; padding: 12px 12px 12px 28px;
    grid-template-columns: auto auto minmax(0, 1fr) auto; gap: 0 16px;
  }
  .veris-pricing-total-label { font-size: 13px; white-space: nowrap; }
  .veris-pricing-total-value { font-size: 22px; line-height: 30px; white-space: nowrap; }
  .veris-pricing-total-hint { font-size: 13px; line-height: 18px; }
  /* Each part pinned to its column: with the figure hidden (a custom quote)
     the hint and the button slid one column left, and the button overran
     the bar's right edge. */
  .veris-pricing-total-label { grid-column: 1; }
  .veris-pricing-total-value { grid-column: 2; }
  .veris-pricing-total-hint { grid-column: 3; }
  .veris-pricing-total .veris-pricing-next { grid-column: 4; white-space: nowrap; }
}
@media (max-width: 991px) {
  .veris-pricing-total {
    /* Rounded all round and 8px off the screen edge, so it reads as the same
       card whether it is pinned or has come to rest after the questions. */
    bottom: 8px; margin: 0 -8px; border-radius: 16px;
    grid-template-columns: 1fr auto; gap: 0 12px; padding: 12px 16px;
  }
  .veris-pricing-total-label { font-size: 12px; grid-column: 1; }
  .veris-pricing-total-value { font-size: 20px; line-height: 28px; grid-column: 1; }
  /* Kept for screen readers (the bar is a live region), not on screen. */
  .veris-pricing-total-hint { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  .veris-pricing-next { grid-column: 2; grid-row: 1 / span 2; padding: 10px 18px; }
  .veris-pricing-next span:first-child { font-size: 15px; }
  .veris-pricing-total-label, .veris-pricing-total-value { white-space: nowrap; }
}
@media (max-width: 399px) {
  /* 360px wide, the full label pushed the figure onto two lines. */
  .veris-pricing-next-long { display: none; }
  .veris-pricing-next-short { display: inline; }
  .veris-pricing-total-value { font-size: 18px; }
}
@media (max-width: 359px) {
  .veris-pricing-total { padding: 10px 12px; gap: 0 8px; }
  .veris-pricing-total-label { font-size: 11px; letter-spacing: .04em; }
  .veris-pricing-total-value { font-size: 16px; }
  .veris-pricing-next { padding: 8px 12px; }
  .veris-pricing-next span:first-child { font-size: 14px; }
}
@media (max-width: 767px) {
  .veris-pricing-group { padding: 22px 18px; }
}

/* ---- Make a Payment (review item 3) -------------------------------------- */
.veris-pay-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; max-width: 880px; margin: 0 auto; }
.veris-pay-card {
  padding: 32px; display: flex; flex-direction: column; gap: 10px; align-items: flex-start; /* surface: "Cards, style 3" */
}
.veris-pay-card .tf-btn { margin-top: auto; }
.veris-pay-title { font-size: 24px; line-height: 32px; margin: 0; }
.veris-pay-fee { font-weight: 600; color: var(--veris-primary-text); margin: 0; }

/* ---- Homepage services (review item 10A and priority 3) -------------------
   Five narrow columns, links only on the titles, and small illustrations in
   large white capsules. Now: the three main service groups on one row and
   the two specialist services beneath, each card a single link to its page
   (photo, title and text), Veris photography, the review's soft shadow, and
   matching hover and keyboard-focus states. */
.veris-home .section-service .heading-section { margin-bottom: 56px; }
.veris-svc-grid { display: grid; gap: 24px; grid-template-columns: repeat(3, minmax(0, 1fr)); }
.veris-svc-specialist { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.veris-svc-subhead {
  margin: 48px 0 20px; font-size: 15px; letter-spacing: .09em; text-transform: uppercase;
  color: var(--veris-ink-muted);
}
.veris-svc-card {
  display: flex; flex-direction: column; height: 100%;
  background: #fff; border-radius: var(--veris-radius-lg); overflow: hidden;
  box-shadow: var(--veris-shadow); color: inherit; text-decoration: none;
  transition: transform .25s ease, box-shadow .25s ease;
}
.veris-svc-photo { aspect-ratio: 16 / 10; overflow: hidden; }
.veris-svc-specialist .veris-svc-photo { aspect-ratio: 21 / 9; }
.veris-svc-photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .4s ease; }
.veris-svc-body { padding: 24px 28px 28px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.veris-svc-title { font-size: 26px; line-height: 34px; margin: 0; color: #1b2b3d; }
.veris-svc-text { margin: 0; }
.veris-svc-more { margin-top: auto; padding-top: 6px; font-weight: 600; color: var(--veris-primary-text); }
.veris-svc-card:hover, .veris-svc-card:focus-visible {
  transform: translateY(-4px);
  box-shadow: 0 26px 50px -24px rgba(16, 39, 61, .38), 0 2px 8px rgba(16, 39, 61, .08);
}
.veris-svc-card:hover .veris-svc-photo img, .veris-svc-card:focus-visible .veris-svc-photo img { transform: scale(1.04); }
.veris-svc-card:hover .veris-svc-title, .veris-svc-card:focus-visible .veris-svc-title { color: var(--Primary); }
.veris-svc-card:focus-visible { outline: 3px solid var(--Primary); outline-offset: 3px; }
@media (max-width: 991px) {
  .veris-svc-grid, .veris-svc-specialist { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .veris-svc-main .veris-svc-card:last-child { grid-column: 1 / -1; }
  .veris-svc-main .veris-svc-card:last-child .veris-svc-photo { aspect-ratio: 21 / 9; }
}
@media (max-width: 575px) {
  .veris-svc-grid, .veris-svc-specialist { grid-template-columns: 1fr; }
  .veris-svc-main .veris-svc-card:last-child .veris-svc-photo,
  .veris-svc-specialist .veris-svc-photo { aspect-ratio: 16 / 10; }
  .veris-home .section-service .heading-section { margin-bottom: 32px; }
}
/* The kit sets h3 by TAG with !important below 768px (28px, then 18px below
   576px), so the card title answers in kind. */
@media (max-width: 767px) { .veris-svc-title { font-size: 24px !important; line-height: 32px; } }
@media (max-width: 575px) { .veris-svc-title { font-size: 22px !important; line-height: 30px; } }
@media (prefers-reduced-motion: reduce) {
  .veris-svc-card, .veris-svc-photo img { transition: none; }
  .veris-svc-card:hover, .veris-svc-card:focus-visible { transform: none; }
  .veris-svc-card:hover .veris-svc-photo img { transform: none; }
}

/* ---- Awards & Recognition (review item 8) ---------------------------------
   The kit's partner marquee under this heading, as in commit 4296552 (WO-2026-051
   task 6): white section, no band, no captions, and the kit's own gray-to-colour
   .partner.style-3 filter, untouched. templates/home.html; logos from
   build-inputs/awards.json. */
.veris-awards-title { font-size: 18px !important; line-height: 26px; letter-spacing: .1em; color: var(--veris-ink-muted); margin: 0; }
/* infinityslide.js writes the strip's height before the logos load, which
   clipped them; let the strip size to its logos. */
.veris-awards .infiniteslide_wrap { height: auto !important; }
/* The kit's strip runs edge to edge inside its container's 15px padding
   (15-1425px at 1440). The site's wider gutter (--veris-gutter, up to 98px)
   clipped ours to 98-1342px; give the strip the kit's extent back. */
.veris-awards { margin-left: calc(15px - var(--veris-gutter)); margin-right: calc(15px - var(--veris-gutter)); }
/* Below 768px the kit drops this heading's margin to 0 and clips its strip to
   83px, so its 38px-tall marks still sit about 41px under the heading. Our
   strip is clipped to 96px (below) around marks 80-88px tall, which leaves
   them 4-8px under the strip's top; 28px puts them 32-36px under the heading. */
@media (max-width: 767px) { .section-about.style-2 .veris-awards .heading-section { margin-bottom: 28px; } }
/* On a phone the 120px boxes left 25-35px of empty box under the marks
   (88px at most, centred). The kit clips its own strip to 83px here; ours
   stops at 96px with the strip centred in it, which still clears the tallest
   mark by 4px each side (check-home fails a mark the strip clips). */
@media (max-width: 767px) {
  .veris-awards .infiniteslide_wrap { height: 96px !important; display: flex; align-items: center; }
}

/* ---- Page gutters and alignment (review, priority 3) ----------------------
   Larry, 2026-10-06: 50px more on each side on a laptop, so the content
   column starts at 98px at 1440 (was 48) and scales down to the same 16px on
   a phone. The header keeps its own width above 1380px, where the full nav
   needs it, so there the logo sits left of the content edge; below that,
   with the hamburger showing, it takes the same gutter as the page.
   The page title joined the list when it moved into the banner
   (.wrap-page-header), which had left it 15px from the window edge.

   The kit's .tf-container is 1,726px wide with 15px of padding, so at 1440px
   every heading started 15px from the window edge. Content now sits in a
   centred 1,456px column with side margins that scale from 16px on a phone
   to 48px on a laptop and up, and the header and footer use the same column
   so their edges line up with the page.

   The header is the one constraint. With the desktop nav showing it needs
   1,349px of content width (logo 231 + 50 + nav 797 + 50 + CTA 221), so its
   padding grows only as far as that still fits: 15.5px at the 1,380px
   breakpoint, 45px at 1440, the full 48px from about 1,445px. Below the
   breakpoint the hamburger needs almost nothing, and the header takes the
   same margins as the page. */
:root { --veris-gutter: clamp(16px, calc(9vw - 32px), 98px); }
main .tf-container,
#footer .tf-container,
.wrap-page-header .page-title .tf-container {
  max-width: 1456px;
  padding-left: var(--veris-gutter);
  padding-right: var(--veris-gutter);
}
.header .tf-container {
  max-width: 1456px;
  padding-left: var(--veris-gutter);
  padding-right: var(--veris-gutter);
}
@media (min-width: 1380px) {
  .header .tf-container {
    padding-left: clamp(15px, calc((100vw - 1351px) / 2), 48px);
    padding-right: clamp(15px, calc((100vw - 1351px) / 2), 48px);
  }
}

/* ---- Footer: client path and social (review item 15) ---------------------- */
.veris-footer-clients { display: flex; flex-wrap: wrap; gap: 12px; }
.veris-social { list-style: none; margin: 0; padding: 0; display: flex; gap: 10px; }
.veris-social a {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: 50%;
  border: 1px solid var(--Mono-gray-2); color: #1b2b3d; font-size: 16px;
  transition: background-color .2s, color .2s, border-color .2s;
}
.veris-social a:hover { background: var(--Primary); border-color: var(--Primary); color: #fff; }

/* ---- Service levels and packages (review items 11-12) --------------------- */
.veris-tier-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 24px; }
.veris-tier {
  padding: 32px; display: flex; flex-direction: column; gap: 12px; /* surface: "Cards, style 3" */
}
.veris-tier-title { font-size: 28px; line-height: 36px; margin: 0; color: #1b2b3d; }
.veris-tier-tagline { margin: 0; font-weight: 600; color: var(--veris-primary-text); letter-spacing: .02em; }
.veris-tier p { margin: 0; }
.veris-tier-list { margin: 4px 0 0; padding-left: 20px; display: grid; gap: 8px; }
.veris-tier-list li { list-style: disc; color: #1b2b3d; }
.veris-tier-fit { margin-top: auto !important; padding-top: 12px; border-top: 1px solid var(--Mono-gray-2); font-size: 15px; color: var(--veris-ink-muted); }
@media (max-width: 767px) { .veris-tier-title { font-size: 24px !important; line-height: 32px; } }
@media (max-width: 575px) { .veris-tier-title { font-size: 22px !important; line-height: 30px; } }
.veris-pricing-band {
  max-width: 820px; margin: 0 auto; text-align: center; display: grid; gap: 16px;
  padding: 32px; /* surface: "Cards, style 3" */
}
.veris-pricing-band p { margin: 0 auto; max-width: 62ch; }

/* ---- Careers: open roles (review item 14) --------------------------------- */
.veris-job {
  max-width: 880px; margin: 0 auto; padding: 32px; /* surface: "Cards, style 3" */
  display: flex; flex-wrap: wrap; gap: 20px; align-items: center; justify-content: space-between;
}
.veris-job-title { font-size: 28px; line-height: 36px; margin: 0 0 6px; color: #1b2b3d; }
.veris-job-meta { margin: 0; color: var(--veris-ink-muted); }
.veris-job-status { margin: 6px 0 0; font-weight: 600; color: var(--veris-primary-text); }
@media (max-width: 767px) { .veris-job-title { font-size: 24px !important; line-height: 32px; } }
.form-contact input[type="file"] { padding: 10px 12px; }

/* ---- Mobile menu close button (review, priority 3) -------------------------
   The shell's close button was empty, so it rendered as a blank grey square.
   It now carries the kit's own close glyph, at a size and colour that read. */
.canvas-mb .close-menu { color: #1b2b3d; border-color: var(--Mono-gray-2); background: #fff; border-radius: 50%; }
.canvas-mb .close-menu i { font-size: 18px; line-height: 1; }
.canvas-mb .close-menu:hover { background: var(--Primary); border-color: var(--Primary); color: #fff; }

/* ---- Shadows on interior pages (review, priority 3) ------------------------
   The same restrained shadow as the homepage, on the elements Chris named:
   service cards (above, in "Icon-less cards"), testimonials, forms, and the
   main photograph beside a block of copy. Page backgrounds stay clean. */
/* Interior testimonial cards are card style 3 now (WO-2026-056 task 1):
   tinted, no shadow, at the end of this file. */
.section-contact .form-contact { box-shadow: var(--veris-shadow); }
.text-with-img-2 .veris-frame { box-shadow: var(--veris-shadow); }
.section-team .team-item .team-image { box-shadow: var(--veris-shadow); border-radius: var(--veris-radius-md); }

/* ---- Title-to-content gap (review, priority 3) -----------------------------
   On Audit & Assurance, Outsourced Accounting, Who We Are and every page that
   opens with copy beside a photograph, the kit's .text-with-img-2 .content
   adds 114px of top padding, an offset against the photo that, straight
   after the page title, read as a void: 207-250px from breadcrumb to the
   first words at 1440. Only that first section loses the offset, so the
   copy lines up with the top of its photograph and the page opens at the
   same ~93px as Industries and Contact. */
@media (min-width: 1200px) {
  main.main-content > .text-with-img-2:first-child .content { padding-top: 0; }
  main.main-content > .text-with-img-2:first-child .content > .description-1:first-child { margin-top: 0; }
}

/* ---- Homepage testimonials (review, priority 3) --------------------------- */
.veris-quote-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
.veris-quote {
  margin: 0; background: #fff; border-radius: var(--veris-radius-lg); box-shadow: var(--veris-shadow);
  padding: 28px; display: flex; flex-direction: column; gap: 18px;
}
.veris-quote blockquote { margin: 0; color: #1b2b3d; line-height: 1.6; }
.veris-quote figcaption { margin-top: auto; display: flex; flex-direction: column; gap: 2px; }
.veris-quote-name { font-weight: 600; color: #1b2b3d; }
.veris-quote-org { font-size: 14px; color: var(--veris-ink-muted); }
@media (max-width: 991px) { .veris-quote-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 575px) { .veris-quote-grid { grid-template-columns: 1fr; } }

/* ---- Team bios in a small modal (Veris, 2026-10-06) ------------------------
   "About <name>" opens a native <dialog>: centred, small, close button top
   right, page dimmed behind it. Replaces the hover panel, which floated over
   the cards below it and hid them while scrolling. */
.veris-bio-modal {
  width: min(460px, calc(100vw - 32px)); max-height: calc(100dvh - 48px);
  padding: 12px 20px 20px; border: 0; border-radius: var(--veris-radius-md);
  background: #fff; color: #1b2b3d; overflow-y: auto; text-align: left;
  box-shadow: 0 24px 50px -20px rgba(16,39,61,.35), 0 2px 8px rgba(16,39,61,.08);
}
.veris-bio-modal::backdrop { background: rgba(16,39,61,.45); }
.veris-bio-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-right: -12px; }
.veris-bio-close-form { margin: 0; flex: none; }
.veris-bio-close {
  width: 44px; height: 44px; display: grid; place-items: center;
  border: 0; border-radius: 999px; padding: 0;
  background: none; color: #1b2b3d; font-size: 28px; line-height: 1; cursor: pointer;
}
.veris-bio-close:hover, .veris-bio-close:focus-visible { background: #eef3f8; }
.veris-bio-name { font-size: 20px !important; line-height: 28px; margin: 0; }
.veris-bio-modal .veris-bio-photo { margin: 8px 0 4px; }
/* Whole photo, never cropped: the frame takes the photo's own shape. */
.veris-bio-modal .veris-bio-photo img { width: 100%; height: auto; max-height: none; object-fit: contain; }
@media (prefers-reduced-motion: no-preference) {
  .veris-bio-modal[open] { animation: veris-bio-in .18s ease-out; }
  @keyframes veris-bio-in { from { opacity: 0; transform: translateY(8px); } }
}
/* ---- Salary calculators modal on /clientforms/ (Larry, 2026-10-09) ---------
   The bio modal's frame, close button and backdrop, wider, with one card per
   calculator: the three inputs on the left, the results on the right (stacked
   on a phone), the salary in a Veris blue panel. */
/* It sits directly in <main>, so the section-spacing rule (main > * + *
   { padding-top: 80px }) would reach it; the doubled class outranks that. */
dialog.veris-bio-modal.veris-calc-modal { width: min(880px, calc(100vw - 32px)); padding: 16px 28px 28px; }
.veris-calc-title { margin: 0; color: #1b2b3d; font-size: 28px !important; line-height: 36px !important; }
.veris-calc-updated { margin: 0 0 16px; font-size: 14px; color: var(--veris-ink-muted); }
.veris-calc-directions {
  background: #eaf4fb; border-radius: var(--veris-radius-sm); padding: 16px 20px; margin-bottom: 24px;
}
.veris-calc-directions-title { margin: 0 0 6px; font-weight: 600; color: #1b2b3d; }
.veris-calc-directions ul { margin: 0; padding-left: 20px; list-style: disc; }
.veris-calc-directions li { list-style: disc; color: #3d4a57; font-size: 15px; line-height: 22px; }
.veris-calc-directions li + li { margin-top: 4px; }
.veris-calc-list { display: grid; gap: 20px; }
.veris-calc-card {
  border: 1px solid #d8e2ec; border-radius: var(--veris-radius-md); padding: 24px;
}
.veris-calc-name { font-size: 20px !important; line-height: 28px !important; margin: 0 0 16px; color: #1b2b3d; }
.veris-calc-grid { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 24px; align-items: start; }
.veris-calc-fields { display: grid; gap: 14px; }
.veris-calc-field label { display: block; font-weight: 500; font-size: 15px; line-height: 22px; color: #1b2b3d; margin-bottom: 6px; }
.veris-calc-input { position: relative; }
.veris-calc-input input {
  width: 100%; min-height: 48px; padding: 11px 16px; border: 1px solid #bec5cb;
  border-radius: var(--veris-radius-sm); background: #fff; font: inherit; color: #1b2b3d;
}
.veris-calc-input.is-money input { padding-left: 30px; }
.veris-calc-input.is-money span {
  position: absolute; left: 16px; top: 50%; transform: translateY(-50%); color: var(--veris-ink-muted); pointer-events: none;
}
.veris-calc-input input:focus { outline: 2px solid var(--Primary); outline-offset: 1px; border-color: var(--Primary); }
.veris-calc-input input[aria-invalid="true"] { border-color: #b3261e; outline-color: #b3261e; }
.veris-calc-results { display: grid; gap: 12px; margin: 0; }
.veris-calc-results > div { background: #eaf4fb; border-radius: var(--veris-radius-sm); padding: 14px 18px; }
.veris-calc-results dt { font-size: 14px; letter-spacing: .06em; text-transform: uppercase; color: #3d4a57; font-weight: 500; }
.veris-calc-results dd { margin: 2px 0 0; font-size: 22px; line-height: 30px; font-weight: 600; color: #1b2b3d; font-variant-numeric: tabular-nums; }
.veris-calc-results > .is-total { background: #101f30; }
.veris-calc-results > .is-total dt { color: #fff; opacity: .9; }
.veris-calc-results > .is-total dd { color: #fff; font-size: 28px; line-height: 36px; }
.veris-calc-actions { margin-top: 24px; display: flex; justify-content: flex-end; }
.veris-calc-reset { box-shadow: inset 0 0 0 1px var(--Primary); }
@media (max-width: 767px) {
  dialog.veris-bio-modal.veris-calc-modal { padding: 12px 16px 20px; }
  .veris-calc-title { font-size: 24px !important; line-height: 32px !important; }
  .veris-calc-card { padding: 18px 16px; }
  .veris-calc-grid { grid-template-columns: 1fr; gap: 16px; }
  .veris-calc-results > .is-total dd { font-size: 24px; line-height: 32px; }
}

/* ---- Client calculators: native pages (WO-2026-045 task 3) -----------------
   The same cards as the salary modal above, on each calculator's own page:
   one card per group of the spreadsheet, record-keeping fields in columns,
   hints under their labels, Print and Reset. The arithmetic and the
   hostname lock are assets/js/calculators.js. */
.veris-calc-directions.is-numbered li { list-style: none; }
.veris-calc-directions.is-numbered ul { padding-left: 0; }
.veris-calc-field select, .veris-calc-field textarea {
  width: 100%; min-height: 48px; padding: 11px 16px; border: 1px solid #bec5cb;
  border-radius: var(--veris-radius-sm); background: #fff; font: inherit; color: #1b2b3d;
}
.veris-calc-field textarea { min-height: 96px; resize: vertical; }
/* 16px in every field, so iOS Safari does not zoom the page on focus. */
.veris-calc-input input, .veris-calc-field select, .veris-calc-field textarea { font-size: 16px; }
.veris-calc-field select:focus, .veris-calc-field textarea:focus { outline: 2px solid var(--Primary); outline-offset: 1px; border-color: var(--Primary); }
.veris-calc-grid.is-single { grid-template-columns: minmax(0, 1fr); }
.veris-calc-fields.is-record { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); column-gap: 20px; }
.veris-calc-hint { margin: -2px 0 6px; font-size: 13px; line-height: 18px; color: var(--Mono-gray-7, #49525a); }
.veris-calc-results .veris-calc-hint { margin: 6px 0 0; }
.veris-calc-results > .is-total .veris-calc-hint { color: #fff; }
.veris-calc-results output { display: block; min-height: 30px; }
.veris-calc-notes { display: grid; gap: 10px; }
.veris-calc-note { margin: 0; font-size: 15px; line-height: 22px; color: #3d4a57; }
.veris-calc-comments { margin-top: 20px; }
.veris-calc-actions { gap: 12px; flex-wrap: wrap; }
.veris-calc-locked {
  margin: 0 0 20px; padding: 16px 20px; border-radius: var(--veris-radius-sm);
  background: #eaf4fb; color: #1b2b3d; font-weight: 500;
}
@media (max-width: 767px) {
  .veris-calc-fields.is-record { grid-template-columns: minmax(0, 1fr); }
}

/* Print: the calculator alone, on one page, from Chrome or Safari. Nothing
   here needs background printing or a Chrome-only feature: results print as
   outlined boxes in black on white, and the site's header, menus, banner
   crumbs, bands and footer are display:none. */
@media print {
  @page { margin: 10mm; }
  html, body { background: #fff !important; }
  .veris-skip-link, header, .header, footer, .footer, .offcanvas, .page-title .breadcrumb,
  .main-content > :not(.veris-calc-page), .veris-calc-actions, .veris-calc-updated,
  .veris-calc noscript { display: none !important; }
  .page-title { padding: 0 !important; margin: 0 0 6pt !important; background: none !important; }
  .page-title .heading { margin: 0 !important; }
  .page-title h1 { font-size: 16pt !important; line-height: 1.2 !important; margin: 0 !important; }
  .main-content.style-1 > .veris-calc-page { padding: 0 !important; margin: 0 !important; background: none !important; border-radius: 0 !important; box-shadow: none !important; }
  .veris-calc-page::before, .veris-calc-page::after { display: none !important; }
  .veris-calc-page .tf-container { max-width: none !important; width: auto !important; padding: 0 !important; }
  .veris-calc { font-size: 8.5pt; line-height: 1.25; color: #000; }
  .veris-calc-directions { background: none; border: 0.5pt solid #999; border-radius: 4pt; padding: 4pt 6pt; margin: 0 0 5pt; }
  .veris-calc-directions-title { margin: 0 0 1pt; font-size: 8.5pt; }
  .veris-calc-directions li { font-size: 8pt; line-height: 1.25; color: #000; margin: 0 !important; }
  .veris-calc-list { gap: 5pt; }
  .veris-calc-card { padding: 5pt 7pt; border: 0.5pt solid #999; border-radius: 4pt; break-inside: avoid; page-break-inside: avoid; }
  .veris-calc-name { font-size: 10pt !important; line-height: 1.2 !important; margin: 0 0 3pt; color: #000; }
  .veris-calc-grid { grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 8pt; }
  .veris-calc-grid.is-single { grid-template-columns: minmax(0, 1fr); }
  .veris-calc-fields { gap: 3pt; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 8pt; }
  .veris-calc-fields.is-record { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .veris-calc-field label { font-size: 8pt; line-height: 1.2; margin: 0 0 1pt; color: #000; }
  .veris-calc-hint, .veris-calc-results .veris-calc-hint { font-size: 7pt; line-height: 1.2; margin: 0 0 1pt; color: #333; }
  .veris-calc-input input, .veris-calc-field select, .veris-calc-field textarea {
    min-height: 0; height: auto; padding: 1pt 4pt; border: 0.5pt solid #777; border-radius: 2pt;
    font-size: 8.5pt; line-height: 1.3; background: #fff; color: #000;
  }
  .veris-calc-field textarea { min-height: 24pt; }
  .veris-calc-input.is-money input { padding-left: 10pt; }
  .veris-calc-input.is-money span { left: 4pt; color: #000; }
  .veris-calc-results { gap: 3pt; }
  .veris-calc-results > div, .veris-calc-results > .is-total { background: none; border: 0.5pt solid #999; border-radius: 3pt; padding: 2pt 5pt; }
  .veris-calc-results > .is-total { border: 1.5pt solid #000; }
  .veris-calc-results dt, .veris-calc-results > .is-total dt { font-size: 7pt; color: #000; opacity: 1; letter-spacing: .04em; }
  .veris-calc-results dd, .veris-calc-results > .is-total dd { font-size: 10pt; line-height: 1.25; color: #000; margin: 0; }
  .veris-calc-results > .is-total .veris-calc-hint { color: #000; }
  .veris-calc-results output { min-height: 0; }
  .veris-calc-note { font-size: 8pt; line-height: 1.25; color: #000; }
  .veris-calc-comments { margin-top: 5pt; }
  .veris-calc-locked { border: 0.5pt solid #999; background: none; }
  /* The salary modal on /clientforms/ prints the same way, alone. */
  body:has(dialog.veris-calc-modal[open]) > :not(main),
  body:has(dialog.veris-calc-modal[open]) .page-title,
  body:has(dialog.veris-calc-modal[open]) main > :not(dialog.veris-calc-modal) { display: none !important; }
  dialog.veris-bio-modal.veris-calc-modal[open] { position: static; width: auto; max-width: none; max-height: none; margin: 0; padding: 0; border: 0; box-shadow: none; overflow: visible; }
  dialog.veris-calc-modal::backdrop { display: none; }
  dialog.veris-calc-modal .veris-bio-close-form { display: none; }
  dialog.veris-calc-modal .veris-calc-title { font-size: 16pt !important; line-height: 1.2 !important; }
}

/* On the white footer a white button has no edge; outline it. */
.veris-footer-clients .tf-btn.btn-white { box-shadow: inset 0 0 0 1px var(--Primary); }

/* ---- Interior card titles on a phone (measured) ----------------------------
   veris.css sets these to 26px below 768px, but the kit forces h3 by TAG with
   !important (18px below 576px, 28px below 768px), so a 390px phone rendered
   card titles at 18px, barely above body text. Answered in kind, matching
   the homepage service cards. */
@media (max-width: 767px) { .tf-box-icon .title, .tf-box-icon .title a { font-size: 24px !important; line-height: 32px !important; } }
@media (max-width: 575px) { .tf-box-icon .title, .tf-box-icon .title a { font-size: 22px !important; line-height: 30px !important; } }

/* ---- Logo clear space in the mobile menu (review, priority 3) ---------------
   The offcanvas put the logo 10px from the screen edge. Same 20px the page
   gutter gives on a small phone, so the lockup keeps clear space on all sides. */
.canvas-mb .offcanvas-header { padding-left: 20px; padding-right: 20px; }
.veris-tier-cta { align-self: flex-start; margin-top: 8px; }

/* ---- Inner-page banner (Larry, 2026-10-05) ---------------------------------
   As on the Advitex inner pages: the static header and the page title share
   .wrap-page-header, the kit's light blue gradient band (scripts/
   build-page.mjs builds the wrapper), and <main> is the kit's white
   .main-content.style-1 whose 40px top corners round up over the band.
   The kit pulls the title's bottom edge 27px under the content to make that
   overlap; the padding above it is what is left of the 56px trim. */
.wrap-page-header { background: linear-gradient(90deg, #c7eaf1 0%, #e6f7fa 100%); }
.wrap-page-header + .canvas-mb + main.main-content,
main.main-content.style-1 { position: relative; z-index: 1; }
@media (min-width: 992px) { .wrap-page-header .page-title.style-default { padding-bottom: 96px; } }
@media (max-width: 991px) { .wrap-page-header .page-title.style-default { padding-bottom: 64px; } }
.wrap-page-header .page-title.style-default { margin-bottom: -27px; }
@media (max-width: 767px) { main.main-content.style-1 { border-radius: 24px 24px 0 0; } }

/* ---- Interior photographs (revision brief, Chris Kerr, 2026-10-09) --------
   kit-sections.mjs photoFrame(): a rounded rectangle, every photo cover-
   cropped to 4:3 so comparable sections match; no blob, no badge. The
   homepage's "V is here to help you" photo uses the same frame. */
.veris-intro-photo { margin-bottom: 0; }
.veris-intro-photo .left { display: block; }
.veris-photo-img {
  display: block; width: 100%; height: auto; aspect-ratio: 4 / 3;
  object-fit: cover; object-position: center; border-radius: 16px;
}
/* An illustration drawn wider than 4:3 (WHOLE_PHOTOS in kit-sections) is
   shown whole on its own white ground, never cropped through a figure. */
.veris-photo-img.veris-photo-whole { object-fit: contain; background: #fff; }
/* A button pair holds one row from 768px: the /construction/ hero pair
   needed 513px of a 512px row at 1200 and wrapped (Will, 2026-10-26: no
   stacked buttons). */
@media (min-width: 768px) { .veris-cta-row.flex-wrap { flex-wrap: nowrap !important; } }
@media (max-width: 1199px) { .veris-intro-photo { margin-top: 32px; } }
/* When the columns stack, a photograph that comes FIRST (textWithImg's
   flip) had the same 32px on top, so its band read 32px low (WO-2026-056
   task 1, band spacing). It takes the 32px under it instead. */
@media (max-width: 1199px) {
  .row > :first-child:not(:last-child) > .veris-intro-photo { margin-top: 0; margin-bottom: 32px; }
}
/* The same where the layout, not the DOM, puts the photo first: the kit's
   accordion-beside-a-photo (.section-process.style-1) orders its copy
   column after the photo under 992px (.left { order: 2 }), so the photo,
   second in the DOM, comes first and sat 32px low with the heading flush
   under it. */
@media (max-width: 991px) {
  .section-process.style-1 .row > .right > .veris-intro-photo { margin-top: 0; }
  /* padding, not the photo's margin: the column is the row's last child in
     the DOM, so the band-edge trim clears its children's bottom margins */
  .section-process.style-1 .row > .right { padding-bottom: 32px; }
}

/* ---- Section spacing (Larry, 2026-10-06) ---------------------------------
   The kit pads each section 60-122px on top and 110-168px underneath, so two
   sections in a row stood 230-290px apart on a laptop: "too much white
   space". One scale for the whole site instead, the homepage included:
   80px a side from 1200px (160px between sections), 64px on a tablet, 40px
   on a phone. The first section under a banner keeps its own top spacing
   (`* + *`), and sections the kit leaves unpadded (the interior quote band,
   `.pt-0`) stay that way.
   The scale is --veris-band-pad (defined with the bands, below). On every
   page but the homepage the bands then move the stacked edge's height
   from each band's top padding to its bottom, so the content sits centred
   between its rounded edge and the next band ("Band spacing, centred",
   WO-2026-056 task 1). The homepage keeps these values exactly. */
@media (min-width: 1200px) {
  .main-content > :not(.section-testimonial), .main-content > .section-testimonial.veris-quotes, .main-content > .section-testimonial.style-1 { padding-bottom: var(--veris-band-pad); }
  .main-content > * + :not(.section-testimonial), .main-content > * + .section-testimonial.veris-quotes, .main-content > * + .section-testimonial.style-1 { padding-top: var(--veris-band-pad); }
}
@media (min-width: 768px) and (max-width: 1199px) {
  .main-content > :not(.section-testimonial), .main-content > .section-testimonial.veris-quotes, .main-content > .section-testimonial.style-1 { padding-bottom: var(--veris-band-pad); }
  .main-content > * + :not(.section-testimonial), .main-content > * + .section-testimonial.veris-quotes, .main-content > * + .section-testimonial.style-1 { padding-top: var(--veris-band-pad); }
}
@media (max-width: 767px) {
  .main-content > :not(.section-testimonial), .main-content > .section-testimonial.veris-quotes, .main-content > .section-testimonial.style-1 { padding-bottom: var(--veris-band-pad); }
  .main-content > * + :not(.section-testimonial), .main-content > * + .section-testimonial.veris-quotes, .main-content > * + .section-testimonial.style-1 { padding-top: var(--veris-band-pad); }
}

/* Kit list inside the kit's style-7 card: the card sizes every <i> to its
   80px headline icon, which made each list tick as big as the card's icon.
   The list keeps its icons at text size, as it does everywhere else. */
.tf-box-icon.style-7 .list i { font-size: inherit; }

/* Interior testimonial band (.section-testimonial.style-1 from
   kit-sections testimonials()). The kit draws this style for its scrolling
   marquee and lays a 150px top and 200px bottom fade over it (::after and
   ::before, z-index 4) so quotes melt in and out. On a static carousel those
   fades sat over the heading, the ends of long quotes and the pagination
   bullets, which could not be clicked. The homepage no longer uses this
   style (its quotes are .veris-quotes), so the fades go for every page. */
.section-testimonial.style-1::before,
.section-testimonial.style-1::after { content: none; }
/* In the two-across testimonial carousel the quote lines up with its own
   attribution; the centred 68ch measure is for a lone pull quote. */
.section-testimonial .sw-layout .quote { margin-left: 0; padding-left: 0; padding-right: 0; }
/* Each card is as tall as its own quote: stretched to a long neighbour, a
   two-line quote sat in a box of empty space (Dr. Ann Marie Taylor on
   /charter-school-fiscal-management/; WO-2026-056 task 1). On a phone the
   carousel takes the height of the card showing (assets/js/veris.js,
   autoHeight). */
.section-testimonial .sw-layout .testimonial { height: auto; }
/* The kit's bordered organic frame draws its two outlines round the frame's
   box. With the photo inline, the box ran 75px below the photo and the two
   outlines bunched up under its bottom-left edge; as a block the photo is the
   box, and the outlines ring the photograph as in the kit. */

/* An office's facts on /locations/ (kit-sections boxIcons `facts`): each a
   label over its lines, as the live hub sets them, not one run-on line. */
.veris-facts { margin: 0; }
.veris-facts dt { font-weight: 500; color: var(--Mono-dark-9, #1b2b3d); margin-top: 12px; }
.veris-facts dt:first-child { margin-top: 0; }
.veris-facts dd { margin: 0; }

/* In-text links, opt-in. The generators put .veris-inline-link only on a
   link that sits inside running copy (linkify, the form note, a card's
   "Read The Article", an office's "More about this location"), so kit CTAs,
   phone rows, nav and card titles keep the kit's own look. Underlined, so it
   is never colour alone (WCAG 1.4.1). Brand blue on white (4.86:1); on a
   tinted band the blue darkens, derived from --Primary, to stay above 4.5:1
   (#1479bd on #eaf4fb is 4.49:1). viewport-check measures every one. */
a.link.veris-inline-link { color: var(--Primary); text-decoration: underline; text-underline-offset: 3px; }
:is(.bg-sub-color, .section-testimonial, .section-contact, .veris-band-blue) a.link.veris-inline-link {
  color: color-mix(in srgb, var(--Primary) 80%, #000);
}
/* A link standing alone on its line is a 24px tap target at least. */
p > a.link.veris-inline-link:only-child { display: inline-block; min-height: 24px; line-height: 24px; }
/* Cards stacked instead of swiped (benefits({ stack })): the kit grid only
   gaps from 768px, so below it the cards are spaced here. */
@media (max-width: 767px) { .veris-stack-item + .veris-stack-item { margin-top: 24px; } }

/* Homepage FAQ (WO-2026-051 task 5, scripts/home-faq.mjs). The kit's
   accordion trigger is an <a>; the FAQ's is a <button> inside an <h3>, so
   Space opens it as well as Enter. These make the button look exactly like
   the kit's anchor, and undo the kit's `.heading span { width: 33px }`,
   written for the number span, on the span that holds the question. */
.veris-faq .accordion-question { margin: 0; }
.veris-faq button.accordion-title {
  background: none; border: 0; padding: 0; margin: 0;
  color: inherit; font: inherit; letter-spacing: inherit; text-align: left;
}
.veris-faq .accordion-item.style-default .heading .title { width: auto; }
/* Keep the number its full width when a long question wraps on a phone. */
.veris-faq .heading .text_primary { flex-shrink: 0; }
/* Space between paragraphs of a multi-paragraph answer. */
.veris-faq .accordion-faqs-content p + p { margin-top: 12px; }

/* /contact/ keeps the header CTA's place but not the button, which would link
   the page to itself (scripts/build-page.mjs, HEADER_CTA). */
.veris-cta-placeholder { visibility: hidden; pointer-events: none; }

/* ---- Insights archive (WO-2026-045 task 4, Direction B) -------------------
   /news/: the intro, then one row per month, a 260px label column beside
   the month's posts two to a row. A one-post month keeps its card in the
   left column (the grid never stretches it). Under 1024px the label sits
   above the posts; under 768px the posts stack one per row. Each card is a
   single link; the frame takes the kit's .hover-image motion and nothing
   else moves. check-insights measures the widths, heights and radius. */
.veris-insights-intro { max-width: 640px; padding-bottom: 44px; }
.veris-insights-kicker {
  margin: 0 0 14px; color: var(--Primary);
  font: 600 14px/1.2 "Manrope", sans-serif; letter-spacing: .12em; text-transform: uppercase;
}
.veris-insights .veris-insights-title {
  margin: 0; color: var(--Black);
  font: 600 44px/1.14 "Manrope", sans-serif; letter-spacing: -.02em; text-wrap: balance;
}
.veris-insights-lede {
  margin: 18px 0 0; max-width: 640px; color: var(--Mono-gray-6);
  font-size: 17px; line-height: 1.65;
}
.veris-month {
  display: grid; grid-template-columns: 260px minmax(0, 1fr); column-gap: 48px;
  padding: 44px 0; border-top: 1px solid #e3e8ef;
}
.veris-month[hidden] { display: none; }
.veris-insights .veris-month-title {
  margin: 0; color: var(--Black);
  font: 600 34px/1.15 "Manrope", sans-serif; letter-spacing: -.02em;
  /* the kit forces h3/h4 sizes by tag with !important under 768px */
  font-size: 34px !important; line-height: 1.15 !important;
}
.veris-month-note { margin: 10px 0 0; color: var(--Mono-gray-6); font-size: 15px; line-height: 1.45; }
.veris-month-title:focus { outline: none; }
.veris-month-title:focus-visible { outline: 2px solid var(--Primary); outline-offset: 4px; border-radius: 4px; }
/* Cards in a pair row stretch to the row's height and "Read" sits at the
   card's foot, so it lines up across the row when one title wraps. */
.veris-month-grid {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 28px; row-gap: 44px; align-items: stretch;
}
.veris-insight {
  display: flex; flex-direction: column; align-items: flex-start;
  color: inherit; text-decoration: none; border-radius: var(--veris-radius-md);
}
.veris-insight > * { align-self: stretch; }
.veris-insight > .veris-insight-more { align-self: flex-start; }
.veris-insight:focus-visible { outline: 2px solid var(--Primary); outline-offset: 6px; }
.veris-insight .veris-insight-frame {
  display: block; height: 250px; border-radius: var(--veris-radius-md);
  background: var(--Mono-gray-1);
}
.veris-insight .veris-insight-frame img { display: block; border-radius: inherit; }
.veris-insights .veris-insight-title {
  margin: 22px 0 0; color: var(--Black);
  font: 500 23px/1.3 "Manrope", sans-serif; letter-spacing: -.01em;
  font-size: 23px !important; line-height: 1.3 !important; text-wrap: pretty;
}
.veris-insight-excerpt {
  margin: 10px 0 0; color: var(--Mono-gray-6); font-size: 15px; line-height: 1.65;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden;
}
.veris-insight-more {
  display: inline-block; margin-top: auto; padding-top: 14px; color: var(--Primary);
  font: 600 15px/1.2 "Manrope", sans-serif;
}
/* The button lines up with the cards' left edge, under the month list. The
   row ships hidden and veris.js shows it only while months remain hidden. */
.veris-insights-actions { display: flex; padding: 44px 0 0 308px; border-top: 1px solid #e3e8ef; }
.veris-insights-actions[hidden] { display: none; }
/* No zoom or sweep on the frame for visitors who ask for less motion. */
@media (prefers-reduced-motion: reduce) {
  .veris-insight.hover-image .article-thumb img,
  .veris-insight.hover-image:hover .article-thumb img { transition: none; transform: none; }
  .veris-insight.hover-image .article-thumb::after { content: none; }
}
@media (max-width: 1023px) {
  .veris-month { grid-template-columns: minmax(0, 1fr); row-gap: 44px; }
  .veris-insights-actions { padding-left: 0; }
}
@media (max-width: 767px) {
  .veris-insights .veris-insights-title { font-size: 32px; line-height: 1.15; }
  .veris-insights-lede { font-size: 16px; }
  .veris-insights-intro { padding-bottom: 36px; }
  /* Phone sizes measured off direction-b-390.png (1x): month 34px, card
     title 18px, row padding 44px (see CLAUDE.md, Insights archive). */
  .veris-month-note { margin-top: 8px; }
  .veris-month-grid { grid-template-columns: minmax(0, 1fr); row-gap: 28px; }
  .veris-insights .veris-insight-title { margin-top: 21px; font-size: 18px !important; }
  .veris-insight-more { padding-top: 10px; }
}

/* ---- Client forms hub (WO-2026-054, Larry's mockup C) ----------------------
   /clientforms/ as one tool: "Find a form" and its audience pills over a
   single bordered list of every form, the live browser note under it, and a
   sidebar (the team photo card) that stacks under the note below 992px: on a
   tablet the photo card lies on its side, and on a phone it stacks as the
   mockup's phone draws it. The navy count card under the photo card was
   removed (WO-2026-060 task 8, Brooke). Markup: formHub() in scripts/kit-sections.mjs.
   Everything here is scoped to .veris-forms. The pills are the kit's
   .nav-tabs-wrap.style-1 tabs (its shape and transition) sized to their
   labels; the pressed pill takes the kit's active fill. The type tag's text
   is the darker --Primary the site uses on tints: #1479bd on #e8f1fa is about
   4.2:1, under 4.5:1 at 12px. The kit forces h3 sizes with !important below
   768px, so the two h3 styles here answer in kind there. No entrance
   animation on the rows, and nothing moves under prefers-reduced-motion.
   Row sizes follow mockup C, overriding the work order text's 40px tile /
   18px title (Larry, 2026-10-12): measured off mockup-c.png (its desktop is
   a 1440 render shown at 0.75), the tile is 52px, its glyph 24px and the
   title 20px on a 28px line, the same on the phone mockup; the tags are 12px.
   The three are set once here. */
.veris-forms {
  --veris-forms-tile: 52px;
  --veris-forms-glyph: 24px;
  --veris-forms-title: 20px;
  --veris-forms-line: #dbe3ec;
  --veris-forms-ink: #172d43;
  --veris-forms-tint: #e8f1fa;
  --veris-forms-navy: #0f3f6a;
}
.veris-forms-grid {
  display: grid;
  grid-template-columns: minmax(0, 7fr) minmax(0, 3fr);
  /* 40px, not the work order text's 24px: mockup C draws the list 843px and
     the sidebar 361px with 40px between them at 1440 (30.5px at its 0.75
     scale), and mockup measurements win (Larry, 2026-10-12). */
  gap: 40px;
  align-items: start;
}
.veris-forms-main { min-width: 0; }

/* Heading left, pills right; the pills drop to their own row only when the
   two no longer fit side by side. */
/* Centred, not baseline-aligned: mockup C draws them centred, overriding the work order text (Larry, 2026-10-12). */
.veris-forms-head {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 16px 24px; margin-bottom: 20px;
}
.veris-forms .veris-forms-head .heading-title { margin: 0; font-size: 36px; line-height: 44px; color: var(--veris-forms-ink); }
/* The pill row scrolls sideways inside itself when it is wider than the
   screen (a phone); the page never does. Its 6px padding holds the focus
   ring (3px, 2px out) inside the scroll box, so the ring is never cut off;
   the matching negative margin keeps the pills on the column's edges. */
.veris-forms .veris-forms-filter {
  display: flex; flex-wrap: nowrap; gap: 8px;
  min-width: 0; max-width: calc(100% + 12px);
  overflow-x: auto; scrollbar-width: none;
  padding: 6px; margin: -6px;
}
.veris-forms .veris-forms-filter::-webkit-scrollbar { display: none; }
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill {
  flex: none; width: auto; gap: 8px;
  padding: 11px 16px; border: 1px solid var(--veris-forms-line); border-radius: 31px;
  background: #fff; color: var(--veris-forms-ink);
  font-family: "Manrope", sans-serif; font-size: 14px; line-height: 20px; font-weight: 400; white-space: nowrap;
}
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill:hover {
  background: #f7faff; border-color: var(--Primary); color: var(--veris-forms-ink); font-weight: 400;
}
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill[aria-pressed="true"] {
  background: var(--Primary); border-color: var(--Primary); color: #fff; font-weight: 500;
}
/* The site's focus ring, not Bootstrap's pale .nav-link glow (about 1.3:1).
   The kit's `transition: all` would grow the ring in over 0.3s; the pills
   keep the kit's timing for their colours and the ring shows at once. */
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill { transition-property: background-color, border-color, color; }
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill:focus-visible {
  box-shadow: none;
  outline-style: solid; outline-width: 3px; outline-color: var(--Primary); outline-offset: 2px;
}
.veris-forms .veris-forms-pill svg { width: 16px; height: 16px; flex: none; }
/* The kit whitens a tab's icon strokes on hover; here they follow the text. */
.veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill svg :is(path, circle, rect, line) { stroke: currentColor; }

/* The list: one bordered block, rows divided by hairlines. */
.veris-forms-list {
  list-style: none; margin: 0; padding: 0;
  border: 1px solid var(--veris-forms-line); border-radius: var(--veris-radius-md);
  background: #fff; overflow: hidden;
}
.veris-forms-row {
  position: relative; list-style: none;
  display: grid; grid-template-columns: var(--veris-forms-tile) minmax(0, 1fr) auto 20px; align-items: center;
  column-gap: 20px; padding: 20px 24px;
  transition: background-color 0.3s ease;
}
/* A divider above every row with a shown row before it, so a filtered list
   (assets/js/veris.js hides rows) never doubles the list's top border. */
.veris-forms-row:not([hidden]) ~ .veris-forms-row { border-top: 1px solid var(--veris-forms-line); }
.veris-forms-row:hover, .veris-forms-row:focus-within { background: #f7faff; }
/* Keyboard focus rings the whole row, the click target, not just the title:
   the site's 3px --Primary ring, drawn inside the row so the list's rounded
   clip cannot cut it; the first and last rows take the list's corner radius
   (less its 1px border) so the ring follows the curve there. The title's own
   ring would only outline its text inside this one, so it goes. */
.veris-forms-row:first-child { border-radius: calc(var(--veris-radius-md) - 1px) calc(var(--veris-radius-md) - 1px) 0 0; }
.veris-forms-row:last-child { border-radius: 0 0 calc(var(--veris-radius-md) - 1px) calc(var(--veris-radius-md) - 1px); }
.veris-forms-row:only-child { border-radius: calc(var(--veris-radius-md) - 1px); }
/* The same for the first and last rows still shown once a filter hides some.
   Separate rules: a browser without `of S` drops only these. */
.veris-forms-row:nth-child(1 of :not([hidden])) { border-top-left-radius: calc(var(--veris-radius-md) - 1px); border-top-right-radius: calc(var(--veris-radius-md) - 1px); }
.veris-forms-row:nth-last-child(1 of :not([hidden])) { border-bottom-left-radius: calc(var(--veris-radius-md) - 1px); border-bottom-right-radius: calc(var(--veris-radius-md) - 1px); }
.veris-forms-row:has(.veris-forms-link:focus-visible) {
  outline-style: solid; outline-width: 3px; outline-color: var(--Primary); outline-offset: -3px;
}
.veris-forms .veris-forms-link:focus-visible { outline-style: none; }
.veris-forms-icon {
  display: flex; align-items: center; justify-content: center;
  width: var(--veris-forms-tile); height: var(--veris-forms-tile); border-radius: var(--veris-radius-sm);
  background: var(--veris-forms-tint); color: var(--Primary);
}
.veris-forms-icon svg { width: var(--veris-forms-glyph); height: var(--veris-forms-glyph); flex: none; }
.veris-forms-arrow svg, .veris-forms-phone svg { width: 20px; height: 20px; flex: none; }
.veris-forms .veris-forms-title {
  margin: 0; font-family: "Manrope", sans-serif; font-weight: 500; color: var(--veris-forms-ink);
  font-size: var(--veris-forms-title); line-height: calc(var(--veris-forms-title) + 8px);
}
/* The title is the row's real link; the kit's Bootstrap `stretched-link`
   lays its ::after over the whole row (the <li> is positioned). */
.veris-forms-link, .veris-forms-link:hover { color: inherit; }
.veris-forms-desc { margin: 2px 0 0; font-size: 15px; line-height: 22px; text-wrap: pretty; }
.veris-forms-tags { display: flex; gap: 6px; justify-self: end; }
/* 12px, not the work order text's 11px: the mockup's tags measure 12px (cap
   height and pill size at 0.75 scale), and row sizes follow mockup C (Larry,
   2026-10-12). */
.veris-forms-tag {
  display: inline-block; padding: 4px 11px; border-radius: 999px;
  font-family: "Manrope", sans-serif; font-size: 12px; line-height: 15px; font-weight: 600;
  letter-spacing: 0.06em; text-transform: uppercase; white-space: nowrap;
}
.veris-forms-type { background: var(--veris-forms-tint); color: color-mix(in srgb, var(--Primary) 80%, #000); }
.veris-forms-audience { background: var(--veris-forms-navy); color: #fff; }
.veris-forms-arrow { display: flex; color: var(--Primary); transition: transform 0.3s ease; }
.veris-forms-row:hover .veris-forms-arrow, .veris-forms-row:focus-within .veris-forms-arrow { transform: translateX(4px); }

/* The live browser note sat here until WO-2026-045 task 3 dropped it (the
   calculators it warned about are native pages now). */

/* Sidebar: the photo card (the card clips the photo's corners), not
   sticky. (The count card that sat 16px under it is gone, WO-2026-060
   task 8.) */
.veris-forms-aside { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
.veris-forms-help {
  background: #fff; border-radius: var(--veris-radius-md); overflow: hidden;
  /* No border: the mockup draws a soft shadow, close and deep. */
  box-shadow: 0 2px 6px rgba(23, 45, 67, 0.06), 0 12px 32px rgba(23, 45, 67, 0.10);
}
/* 8:5, as the mockup crops it (361 x 225 at 1440; 1.62:1 on its phone). The
   three people span x 15-89% of the 16:9 file, so a centred 8:5 crop (the
   middle 90%) keeps all three whole. */
.veris-forms-help img { display: block; width: 100%; height: auto; aspect-ratio: 8 / 5; object-fit: cover; object-position: 52% 50%; }
.veris-forms-help-body { padding: 24px; }
.veris-forms .veris-forms-help-title {
  margin: 0 0 8px; font-family: "Manrope", sans-serif; font-size: 24px; line-height: 32px; font-weight: 400; color: var(--veris-forms-ink);
}
.veris-forms .veris-forms-help-body > p { margin: 0; font-size: 15px; line-height: 22px; text-wrap: pretty; }
.veris-forms .veris-forms-help-body > .veris-forms-phone { margin: 16px 0 20px; }
.veris-forms-phone a {
  display: inline-flex; align-items: center; gap: 10px; min-height: 32px;
  font-size: 20px; line-height: 28px; font-weight: 600; color: var(--veris-forms-ink);
}
.veris-forms-phone svg { color: var(--Primary); }
.veris-forms-help .tf-btn { justify-content: center; }

@media (max-width: 1199px) {
  .veris-forms-row { column-gap: 16px; padding: 18px 20px; }
}
@media (max-width: 991px) {
  .veris-forms-grid { grid-template-columns: minmax(0, 1fr); gap: 24px; }
}
/* A tablet. The sidebar runs under the list. The three people
   in the photo span x 15-89% of the frame, so any crop at least 1.31 wide
   to 1 tall, centred near 52%, keeps all three whole. From 768px the card
   lies on its side: photo 58% wide, words beside it, which keeps the photo
   at 1.4:1 or wider at every width here. Below 768px there is no room for
   that, so the photo spans the card's top as a 2:1 banner (whole width,
   heads clear of the top) with the words under it. */
@media (min-width: 576px) and (max-width: 991px) {
  .veris-forms-help img { aspect-ratio: 2 / 1; object-position: 52% 35%; }
}
/* A small tablet keeps the tags (they go only under 576px) but has no room
   for them beside the words: below 850px some descriptions wrap round them
   and the rows go uneven, and so again from 992px (the sidebar takes its
   column) to 1319px. There the tags drop under the description, with
   the icon and arrow centred on the row: titles keep one line and the rows
   an even rhythm (only near 576px does the longest description take two). */
@media (min-width: 576px) and (max-width: 849px), (min-width: 992px) and (max-width: 1319px) {
  .veris-forms-row { grid-template-columns: var(--veris-forms-tile) minmax(0, 1fr) 20px; column-gap: 16px; padding: 18px 20px; }
  .veris-forms-icon { grid-column: 1; grid-row: 1 / span 2; }
  .veris-forms-text { grid-column: 2; grid-row: 1; }
  .veris-forms-tags { grid-column: 2; grid-row: 2; justify-self: start; margin-top: 10px; }
  .veris-forms-arrow { grid-column: 3; grid-row: 1 / span 2; }
}
@media (min-width: 768px) and (max-width: 991px) {
  .veris-forms-help { display: grid; grid-template-columns: minmax(0, 58fr) minmax(0, 42fr); }
  .veris-forms-help img { height: 100%; min-height: 100%; aspect-ratio: auto; }
  .veris-forms-help-body { padding: 24px 24px 24px 28px; align-self: center; }
}
@media (max-width: 767px) {
  .veris-forms .veris-forms-head .heading-title { font-size: 28px; line-height: 36px; }
  .veris-forms .veris-forms-title { font-size: var(--veris-forms-title) !important; line-height: calc(var(--veris-forms-title) + 8px) !important; }
  .veris-forms .veris-forms-help-title { font-size: 22px !important; line-height: 30px !important; }
}
/* A phone shows icon, title, description and arrow; the tags go. */
@media (max-width: 575px) {
  .veris-forms-head { gap: 12px; margin-bottom: 16px; }
  /* "Find a form" stays 28px (set at 767px) over 20px row titles: the phone
     mockup draws it at that ratio. And the mockup's phone starts the
     heading 28px or so under the band's top edge, not the kit's 40px+. */
  .veris-forms.tf-spacing-13 { padding-top: 24px; }
  .veris-forms-row { grid-template-columns: var(--veris-forms-tile) minmax(0, 1fr) 20px; column-gap: 14px; padding: 16px; }
  .veris-forms-tags { display: none; }
  .veris-forms-desc { font-size: 14px; line-height: 20px; }
  .veris-forms-help-body { padding: 20px; }
  .veris-forms .veris-forms-help-body > p { font-size: 14px; line-height: 20px; }
}
@media (prefers-reduced-motion: reduce) {
  .veris-forms-row, .veris-forms-arrow,
  .veris-forms .nav-tabs-wrap.style-1 .nav-link.veris-forms-pill { transition: none; }
  .veris-forms-row:hover .veris-forms-arrow, .veris-forms-row:focus-within .veris-forms-arrow { transform: none; }
}

/* ---------------------------------------------------------------
   Revision brief design system (Chris Kerr, 2026-10-09; issue #61).
   Palette: Veris blue #1479bd, deep navy #101f30, pale blue #eaf4fb,
   gradient #c7eaf1 -> #e6f7fa, cool light gray #f5f7f9, dark ink
   #1b2b3d, slate #627080, soft silver #dae2e9. Manrope throughout:
   700 major headings, 600 department headings and buttons, 400 body.
   --------------------------------------------------------------- */
h1, h2, .h1, .h2 { font-weight: 700; }
/* Headings in the dark ink, not the kit's black (WO-2026-060 task 4): the
   kit's tag rule (h1-h6 and .h1-.h6, color: var(--Black), #000) restated
   with the palette's #1b2b3d, at the same specificity, so a heading with a
   colour class or a band/footer rule of its own keeps it. */
h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { color: #1b2b3d; }
.tf-btn { font-weight: 600; }


/* ---- Alternating bands, stacked-card edges (Larry, 2026-10-09) ----------
   No two sections in a row share a colour, and each one rounds up over the
   one above like a card laid on top, as <main> does over the page header.
   scripts/build-page.mjs (assignBands) gives every section of
   .main-content.style-1 its colour by position: veris-band-white or -blue.
   The footer is deep navy (revision brief, 2026-10-09), so a white last
   band still differs from it. These override whatever background the
   section was built with. A continuation (`veris-band-cont`, a pt-0
   section) shares the band above and gets no edge.
   The edge: top corners at <main>'s radius, the band pulled up by that
   radius so the corners show the colour underneath, and a transparent top
   border of the same height painted in the band's own background
   (background-origin and -clip border-box), so no content moves and the
   spacing between sections is unchanged. Later bands paint over earlier
   ones (DOM order); the footer sits above the homepage's z-index 5. */
:root {
  --veris-stack-r: 40px;
  --veris-band-blue: #eaf4fb;
  /* The section spacing scale ("Section spacing" above): the visible gap
     above and below a band's content. */
  --veris-band-pad: 80px;
}
@media (max-width: 1199px) { :root { --veris-band-pad: 64px; } }
@media (max-width: 767px) { :root { --veris-stack-r: 24px; --veris-band-pad: 40px; } }
.main-content.style-1 > .veris-band-white { background: #fff; }
.main-content.style-1 > .veris-band-blue { background: var(--veris-band-blue); }
.main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont),
#footer {
  position: relative;
  margin-top: calc(-1 * var(--veris-stack-r));
  border-top: var(--veris-stack-r) solid transparent;
  border-radius: var(--veris-stack-r) var(--veris-stack-r) 0 0;
  background-origin: border-box;
  background-clip: border-box;
}
.main-content.style-1 > .veris-band-cont { border-radius: 0; }
/* The first band now has a background of its own, so it takes <main>'s top
   corners (40px, less on small screens) or its square corners would paint
   over the curve where <main> meets the page header. */
.main-content.style-1 > [class*="veris-band-"]:first-child {
  border-top-left-radius: inherit; border-top-right-radius: inherit;
}
/* ---- Band spacing, centred (WO-2026-056 task 1) ---------------------------
   Every page but the homepage (Larry, 2026-10-14). A band with an edge is
   pulled up over the band above by --veris-stack-r, so with the scale on
   both sides its content sat 120px under its rounded edge and 40px over the
   next one (64/16 on a phone). The edge's height moves from the top padding
   to the bottom: 80/80 from 1200px, 64/64 on a tablet, 40/40 on a phone,
   and the distance from one band's content to the next does not change.
   The first band (under the page title) keeps its own top spacing. A
   continuation (veris-band-cont) has no edge and does not overlap, so the
   band before it keeps the plain scale underneath, and the continuation
   keeps its pt-0. The last band's bottom clears the footer, which overlaps
   it the same way. viewport-check holds every interior band centred. */
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont) {
  padding-top: calc(var(--veris-band-pad) - var(--veris-stack-r));
}
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:has(+ .veris-band-cont)) {
  padding-bottom: calc(var(--veris-band-pad) + var(--veris-stack-r));
}
/* The padding is the gap only if nothing inside adds to it: a first
   block's top margin (the kicker's 13px over "Bronze, Silver and Gold") or
   a last block's bottom margin (a closing paragraph's 18px, the kit's 40px
   under stacked copy) sat inside the band and moved its content off
   centre. Down to four levels of first and last children. */
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont) > .tf-container > :first-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont) > .tf-container > :first-child > :first-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont) > .tf-container > :first-child > :first-child > :first-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:first-child):not(.veris-band-cont) > .tf-container > :first-child > :first-child > :first-child > :first-child { margin-top: 0; }
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:has(+ .veris-band-cont)) > .tf-container > :last-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:has(+ .veris-band-cont)) > .tf-container > :last-child > :last-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:has(+ .veris-band-cont)) > .tf-container > :last-child > :last-child > :last-child,
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:not(:has(+ .veris-band-cont)) > .tf-container > :last-child > :last-child > :last-child > :last-child { margin-bottom: 0; }
@media (max-width: 1199px) {
  .text-with-img-2 .row > :last-child > .content { margin-bottom: 0; }
}
/* The kit offsets the copy beside a photograph 114px down (.text-with-img-2
   .content). Once the columns stack (under 1200px) there is no photograph
   beside it, and the offset was 114px of empty band above the copy
   (/who-we-are/ at 1024: 178px over the text) when the copy comes first,
   and 146px between a photo that comes first and the heading under it
   (/charter-school-fiscal-management/ "Complete List" at 1024). Stacked,
   the offset goes whichever column comes first; the photo above keeps its
   32px under it. Beside a photo, from 1200px, it goes too: the row centres
   copy and photo on each other ("Photo beside copy, centred", below). */
@media (max-width: 1199px) {
  body:not(.veris-home) .main-content.style-1 > .text-with-img-2 .content { padding-top: 0; }
}
/* In a row that centres its copy on a photograph that comes first (one
   band on the site: /outsourced-accounting/ "Why Outsourced Accounting
   Outperforms Hiring In-House"), the 114px offset only pushed the copy
   below the photo's centre and left 114px of empty band above it (194px
   to the heading at 1440). The work order's Task 4 removes the same
   offset on that band; it is here because band centring needs it. */
body:not(.veris-home) .main-content.style-1 > .text-with-img-2 .row.align-items-center > :last-child > .content { padding-top: 0; }
/* The kit's .tf-box-icon.style-7 card is white (the v2 variant pale blue),
   drawn for the kit's grey section. assignBands colours bands by position,
   so on a band of its own colour (white on white, v2 on pale blue) the card
   is invisible and its 40/33px (v2 41/31px) of padding reads as band. At
   the band's edge that padding is given back, so the content seen is
   centred (/career/ "Life at Veris" and the week cards, /llr-renewal/ "Our
   Process"). The cards themselves are not restyled. */
body:not(.veris-home) .main-content.style-1 > .veris-band-white > .tf-container > .swiper:first-child:has(.tf-box-icon.style-7:not(.v2)) { margin-top: -40px; }
body:not(.veris-home) .main-content.style-1 > .veris-band-blue > .tf-container > .swiper:first-child:has(.tf-box-icon.style-7.v2) { margin-top: -41px; }
@media (min-width: 768px) {
  body:not(.veris-home) .main-content.style-1 > .veris-band-white > .tf-container > .swiper:last-child:has(.tf-box-icon.style-7:not(.v2)) { margin-bottom: -33px; }
  body:not(.veris-home) .main-content.style-1 > .veris-band-blue > .tf-container > .swiper:last-child:has(.tf-box-icon.style-7.v2) { margin-bottom: -31px; }
}
/* /news/ with every month shown (the last "Show 6 earlier months" press, or
   JS off): the show-more row is hidden and the last month row's own 44px
   of padding (check-insights holds every row to it) is the band's foot,
   so the band gives that much back underneath. */
body:not(.veris-home) .main-content.style-1 > [class*="veris-band-"]:has(.veris-insights-actions[hidden]) {
  padding-bottom: calc(var(--veris-band-pad) + var(--veris-stack-r) - 44px);
}
/* ---- end Band spacing, centred */

/* ---- Photo beside copy, centred (Will, 2026-10-26, review of WO-2026-060)
   Wherever a photo frame sits beside a column of copy, the two are centred
   on each other vertically: "the images and text are off set … the image
   needs to be justified according to the text. Aligned." The kit pushed
   the copy 114px down beside its photo and every row was top-aligned, so
   neither the tops nor the centres met (/construction/ "We Are Not Just
   Here at Year-End.": the copy's centre 124px below the photo's at 1440).
   One rule for every interior row of that shape, by where its columns sit
   side by side: textWithImg() rows from 1200px (col-xl-6), the contact
   band from 992px (col-lg); accordionWithImg() rows carry Bootstrap's
   align-items-center from the generator (its !important would beat this);
   stepsWithPhoto() has its own grid ("Steps beside a photo"). Stacked
   rows keep their order and spacing. The homepage keeps its own sections.
   viewport-check (21) holds every such row to within 8px at 1440 and 1200. */
@media (min-width: 1200px) {
  body:not(.veris-home) .text-with-img-2 .row { align-items: center; }
  body:not(.veris-home) .text-with-img-2 .content { padding-top: 0; }
  body:not(.veris-home) .section-process.style-1 .row > .right { padding-bottom: 0; }
}
@media (min-width: 992px) {
  body:not(.veris-home) .section-contact .row:has(.veris-band-frame) { align-items: center; }
}
/* Every paragraph after the first in a photo-beside-copy row stands as far
   from the one before as the second does (the kit sets 17px on
   .description-2 only, so a third or fourth ran into the one above). */
body:not(.veris-home) .text-with-img-2 .content > .description + .description { margin-top: 17px; }
/* The open questions (textWithImg() `qa`, the grouped grid's cards): each
   answer as a card description, card style 3. */
.veris-qa .veris-svc-group-title { margin-bottom: 12px; }
.veris-qa-answer { margin: 0; color: #627080; font-size: 17px; line-height: 1.6; }
/* ---- end Photo beside copy, centred */
#footer { z-index: 6; background-color: #101f30; }
/* The navy footer's white ink (revision brief, 2026-10-09), kept with its
   background so neither ships without the other. The logo file is grey and
   blue on transparent, so it shows as an all-white mark. */
#footer { color: #fff; }
#footer .footer-logo img { filter: brightness(0) invert(1); }
#footer .footer-heading,
#footer p, #footer li, #footer address,
#footer a:not(.tf-btn) { color: #fff; }
#footer .footer-bottom { border-top-color: rgba(255, 255, 255, .2); }
#footer .veris-social a { border-color: rgba(255, 255, 255, .5); color: #fff; }
#footer :focus-visible { outline-color: #fff; }


/* ---- Homepage, revision brief (Chris Kerr, 2026-10-09; issue #61) ---------
   After the band rules on purpose: these sections carry the brief's own
   surfaces (the aqua gradient, deep navy, cool light gray) over the band
   colour assignBands gives them by position. The neighbours still differ:
   gradient, white (awards, a pt-0 continuation), navy, gray, pale blue,
   white, pale blue, navy footer. Nothing here animates in. */
.main-content.style-1 > .veris-advantage { background: linear-gradient(90deg, #c7eaf1 0%, #e6f7fa 100%); }
.veris-advantage { padding: 76px 0; }
.veris-adv-head { text-align: center; max-width: 760px; margin: 0 auto 36px; }
.veris-adv-heading { margin: 0; font-size: 46px; line-height: 1.15; font-weight: 700; color: #1b2b3d; }
.veris-adv-heading span { color: #1479bd; }
.veris-adv-intro { margin: 16px 0 0; font-size: 19px; line-height: 1.5; color: #1b2b3d; }
.veris-adv-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }
.veris-adv-card {
  display: flex; flex-direction: column; gap: 14px; padding: 30px;
  background: #fff; border: 1px solid #dae2e9; border-radius: 16px;
  box-shadow: 0 8px 24px rgba(16, 31, 48, .08);
}
.veris-adv-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 52px; height: 52px; border-radius: 50%; background: #eaf4fb;
}
.veris-adv-icon svg {
  width: 26px; height: 26px; fill: none; stroke: #1479bd; stroke-width: 1.75;
  stroke-linecap: round; stroke-linejoin: round;
}
.veris-adv-title { margin: 0; font-size: 21px; line-height: 1.3; font-weight: 700; color: #1b2b3d; }
.veris-adv-text { margin: 0; font-size: 17px; line-height: 1.5; color: #1b2b3d; }
.veris-adv-action { display: flex; justify-content: center; margin-top: 32px; }

.main-content.style-1 > .veris-svc-navy { background: #101f30; }
.veris-svc-navy { padding: 80px 0; }
.veris-svc-navy .veris-svc-head { margin-bottom: 40px; }
.veris-svc-navy .heading-title,
.veris-svc-navy .veris-svc-head p { color: #fff; }
.veris-svc-navy .veris-svc-card { background: #f5f7f9; }
.veris-svc-navy .veris-svc-title { font-size: 22px; line-height: 1.3; font-weight: 700; }
.veris-svc-navy .veris-svc-title,
.veris-svc-navy .veris-svc-text { color: #1b2b3d; }
.veris-svc-navy .veris-svc-card:focus-visible,
.veris-svc-navy .tf-btn:focus-visible { outline: 3px solid #fff; outline-offset: 3px; }

.main-content.style-1 > .veris-who { background: #f5f7f9; }
.veris-who { padding: 72px 0; }
.veris-who-heading { margin: 0 0 32px; text-align: center; font-size: 40px; line-height: 1.2; font-weight: 700; color: #1b2b3d; }
.veris-who-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px; }
.veris-who-card {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 22px 24px; background: #fff; border: 1px solid #dae2e9; border-radius: 16px;
  box-shadow: 0 6px 18px rgba(16, 31, 48, .06); color: #1b2b3d; text-decoration: none;
  transition: border-color .2s, color .2s;
}
.veris-who-label { font-size: 19px; line-height: 1.35; font-weight: 600; }
.veris-who-arrow { color: #1479bd; font-size: 20px; }
.veris-who-card:hover { border-color: #1479bd; color: #1479bd; }
.veris-who-card:focus-visible { outline: 3px solid #1479bd; outline-offset: 3px; }

@media (max-width: 1199px) { .veris-adv-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 991px) { .veris-who-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 767px) {
  .veris-advantage { padding: 44px 0; }
  .veris-adv-heading { font-size: 30px; }
  .veris-adv-intro { font-size: 18px; }
  .veris-adv-grid { grid-template-columns: 1fr; gap: 16px; }
  .veris-adv-card { padding: 28px; }
  .veris-svc-navy, .veris-who { padding: 48px 0; }
  .veris-who-heading { font-size: 30px; margin-bottom: 24px; }
}
.veris-home .veris-v-help { padding: 80px 0; }
@media (max-width: 767px) { .veris-home .veris-v-help { padding: 48px 0; } }
@media (max-width: 575px) { .veris-who-grid { grid-template-columns: 1fr; gap: 12px; } }

/* ---- Who We Are (revision brief, Chris Kerr, 2026-10-09; issue #61) ------
   A compact cool-gray breadcrumb band under the header, then the h1, one
   sentence and the partner grid, so the first row of partner headshots is
   in the first desktop screen. Partners five across from 1200px, three to
   a tablet, two on a phone; photos and names link to their pages. */
.wrap-page-header:has(.veris-crumb-title) { background: #fff; }
.wrap-page-header .page-title.style-default:has(.veris-crumb-title) { padding: 0 !important; margin-bottom: 0 !important; }
.veris-crumb-title { background: #f5f7f9; }
.veris-crumb-title .tf-container { display: flex; align-items: center; min-height: 44px; }
.veris-crumb-title .breadcrumb { margin: 0; }
.wrap-page-header .page-title .veris-crumb-title .breadcrumb { margin: 0; display: flex; flex-wrap: wrap; align-items: center; }
.wrap-page-header .page-title .veris-crumb-title .breadcrumb li,
.wrap-page-header .page-title .veris-crumb-title .breadcrumb a { font-size: 15px; line-height: 1.4; }
.wrap-page-header .page-title .veris-crumb-title .breadcrumb li { display: inline-flex; align-items: center; }
.wrap-page-header:has(.veris-crumb-title) ~ main.main-content.style-1,
.wrap-page-header:has(.veris-crumb-title) ~ main.main-content.style-1 > :first-child { border-radius: 0; }
.main-content > .veris-team { padding-top: 36px; }
.veris-team-head { margin-bottom: 28px; }
.veris-team-h1 { margin: 0; font-size: 42px; line-height: 1.2; font-weight: 700; color: #1b2b3d; }
.veris-team-intro { margin: 10px 0 0; font-size: 18px; line-height: 1.6; color: #627080; }
.veris-team .tf-grid-layout-sm { gap: 24px; }
@media (min-width: 1200px) { .tf-grid-layout-sm.veris-team-partners { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
@media (min-width: 768px) and (max-width: 1199px) { .tf-grid-layout-sm.veris-team-partners { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.veris-team .team-item .title { font-weight: 700; color: #1b2b3d; }
.veris-team .team-item .team-image { transition: box-shadow .2s ease; }
.veris-team .team-item .team-image:hover { box-shadow: 0 0 0 3px rgba(20, 121, 189, .35), var(--veris-shadow); }
.veris-team-photo-link { position: absolute; inset: 0; z-index: 2; border-radius: inherit; }
@media (max-width: 767px) {
  .main-content > .veris-team { padding-top: 28px; }
  .veris-team-h1 { font-size: 30px; }
  .veris-team .tf-grid-layout-sm { gap: 16px; }
}

/* "Read more client stories" under the homepage's three quotes. */
.veris-quotes-more { display: flex; justify-content: center; margin-top: 32px; }
/* The Testimonials page's quote wall: columns, so long and short quotes
   pack without the empty space an equal-height grid row leaves. */
.veris-quote-wall { columns: 3 300px; column-gap: 24px; }
.veris-quote-wall .veris-quote { break-inside: avoid; margin-bottom: 24px; }

/* Homepage containers (revision brief, 2026-10-09): every homepage section
   centres in a container of at most 1,280px. */
main.veris-home .tf-container, .veris-home main .tf-container {
  max-width: calc(1280px + 2 * min(var(--veris-gutter), 24px));
  padding-left: min(var(--veris-gutter), 24px); padding-right: min(var(--veris-gutter), 24px);
}

/* ---- Homepage hero (WO-2026-060 task 3) ------------------------------------
   Chris Kerr's mockup (email/chris-2-hero-mockup.png, second reply to Ashley
   Brooks, 2026-10-25): the headline on two lines, one sentence each, at the
   bottom left of the video, the button under it, nothing else.
   - Height: the mockup's hero is 52% as tall as it is wide (510px at 986,
     header included), so the visible hero is 52vw, at least 560px (a phone,
     a tablet) and at most 820px. The box is 119px taller than what shows:
     the kit pulls the content band 119px up over it.
   - Place: the copy sits at the foot (flex end). Measured on the mockup
     (986px wide, a 1440 design scaled by 1/1.46, as its buttons show): the
     button's foot is 26px above the hero's, so the gap here is 2.64vw (26px
     at 986, 38px at 1440), at least 24px. A tablet's visible hero is 640px
     (below). The left edge is the header logo's: the hero's container takes
     the header's own width and padding (".header .tf-container" above), so
     the headline lines up with the logo at every width, as in the mockup.
   - Type, measured on the mockup's ink: a 24-25px cap height and a 35px line
     pitch at 986, so Manrope 700 at 34px with a 1.04 line height; scaled,
     50px at 1440. Here 3.524vw - 0.75px, 34px at 986 and 50px at 1440, never
     under 30px (a tablet), and 30px on a 390 phone. Each sentence is a
     block, so the two lines are the two sentences (check-home holds it).
   - The button is the kit's blue primary. From the headline's ink (the
     second line's baseline) to the button's top the mockup has 16px at 986,
     23px at 1440: 1.6vw, 16-24px. The h1's margin is that less the 0.1375em
     its line box runs below the baseline.
   - So the headline's ink starts about 73% down the visible hero at 1440
     (the mockup's 74%), and check-home holds its box top below 65%. */
.veris-home .page-title.style-1 .content-inner {
  --veris-hero-gap: clamp(24px, 2.64vw, 38px);
  display: flex; flex-direction: column; justify-content: flex-end;
  min-height: calc(clamp(560px, 52vw, 820px) + 119px);
  padding-top: 140px;
  padding-bottom: calc(119px + var(--veris-hero-gap));
}
.veris-home .page-title.style-1 > .content-inner > .tf-container {
  width: 100%; max-width: 1456px;
  padding-left: var(--veris-gutter); padding-right: var(--veris-gutter);
}
@media (min-width: 1380px) {
  .veris-home .page-title.style-1 > .content-inner > .tf-container {
    padding-left: clamp(15px, calc((100vw - 1351px) / 2), 48px);
    padding-right: clamp(15px, calc((100vw - 1351px) / 2), 48px);
  }
}
.veris-home .page-title.style-1 .heading-title.veris-hero-lead { margin-bottom: 0; }
.veris-home .veris-hero-h1 {
  font-size: clamp(30px, calc(3.524vw - 0.75px), 50px);
  margin: 0 0 calc(clamp(16px, 1.6vw, 24px) - 0.1375em);
  line-height: 1.04; font-weight: 700; letter-spacing: -0.02em;
  text-shadow: 0 1px 18px rgba(6, 14, 24, .35);
}
.veris-home .veris-hero-line { display: block; }
/* On a tablet the hero is nearly square, so the 16:9 still is cropped to
   its middle and its faces sit lower in the box: 640px keeps the headline
   below the faces of the poster and the video frames at 768 and 1024. */
@media (min-width: 768px) and (max-width: 1199px) {
  .veris-home .page-title.style-1 .content-inner { min-height: calc(640px + 119px); }
}
@media (max-width: 767px) {
  .veris-home .page-title.style-1 .content-inner { padding-top: 120px; }
}
/* A phone: 30px at 390 (7.7vw), the mockup's proportion to its button. */
@media (max-width: 575px) { .veris-home .veris-hero-h1 { font-size: clamp(28px, 7.7vw, 34px); } }
.veris-home .page-title.style-1 .veris-hero-lead .tf-btn { display: inline-flex; width: auto; max-width: none; }
/* At tablet widths the headline is 30-42px, as at 986 in the mockup, where
   the button is about 180x36 beside it; the kit's 52px, 16px button read
   too heavy there. 44px tall (still a full tap target), 15px, 22px in. */
@media (min-width: 768px) and (max-width: 1199px) {
  .veris-home .page-title.style-1 .veris-hero-lead .tf-btn { height: 44px; min-height: 44px; padding: 0 22px; font-size: 15px; line-height: 44px; }
  .veris-home .page-title.style-1 .veris-hero-lead .tf-btn span { font-size: 15px; }
}

/* ---- Meet Your Team (WO-2026-060 task 3) ---------------------------------
   Its own white section after Who We Help (Chris Kerr's order), laid out as
   the band under his hero mockup: heading and link on the left, the five
   partners' round headshots on the right, each overlapping the one before by
   a sixth of its width, with a white ring and a soft shadow so the overlap
   reads. Sizes are the mockup's scaled to 1440 (48px heading, 22px link,
   104px faces). One row from 768px; on a phone the faces go under the link. The
   section's own colour is white whatever its position (the homepage's
   sections each carry their own colour, "Homepage band colours" below). */
/* Centred between its own rounded edge and the next band's: the next band
   is pulled up over this one by --veris-stack-r, so that height moves from
   the top padding to the bottom (as the interior bands do, "Band spacing,
   centred"), leaving --veris-band-pad of white on each side: 80px at 1440,
   64px on a tablet, 40px on a phone. */
.veris-home .main-content.style-1 > .veris-meet {
  padding-top: calc(var(--veris-band-pad) - var(--veris-stack-r));
  padding-bottom: calc(var(--veris-band-pad) + var(--veris-stack-r));
}
.veris-meet-row { display: flex; align-items: center; justify-content: space-between; gap: 24px 48px; flex-wrap: wrap; }
.veris-meet-heading { margin: 0; font-size: 48px; line-height: 1.2; font-weight: 700; color: #1b2b3d; }
.veris-meet-link {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 10px;
  font-size: 22px; line-height: 1.4; font-weight: 600; color: var(--Primary); text-decoration: none;
}
.veris-meet-link:hover, .veris-meet-link:focus-visible { text-decoration: underline; text-underline-offset: 4px; }
/* The mockup's long arrow (17px of shaft and a 7px head at 986, so 26px at
   1440): a drawn line and chevron, as Manrope's "\2192" is half as long and
   its "\27F6" falls back to another font. */
.veris-meet-arrow {
  position: relative; display: inline-block; flex: none;
  width: 1.2em; height: 2px; margin-left: 2px; background: currentColor; border-radius: 1px;
}
.veris-meet-arrow::after {
  content: ""; position: absolute; right: 1px; top: 50%;
  width: 0.38em; height: 0.38em;
  border-top: 2px solid currentColor; border-right: 2px solid currentColor;
  transform: translateY(-50%) rotate(45deg);
}
.veris-meet-link:focus-visible { outline: 3px solid var(--Primary); outline-offset: 3px; border-radius: 4px; }
.veris-meet-faces { --face: 104px; display: flex; margin: 0; padding: 0 0 0 calc(var(--face) / 6); list-style: none; }
/* Inset from the right as in the mockup, where the last face ends 117px
   from the window's edge at 986 (11.9vw; 171px at 1440), not on the
   container's edge. The container's own right edge is at max(24px,
   (100vw - 1280px) / 2), so the margin is the difference, never negative. */
@media (min-width: 768px) {
  .veris-meet-faces { margin-right: max(0px, calc(11.9vw - max(24px, (100vw - 1280px) / 2))); }
}
.veris-meet-faces li { margin-left: calc(var(--face) / -6); }
.veris-meet-faces img {
  display: block; width: var(--face); height: var(--face);
  object-fit: cover; object-position: 50% 22%;
  border-radius: 50%; border: 4px solid #fff;
  box-shadow: 0 6px 18px rgba(16, 31, 48, .14), 0 0 0 1px #dae2e9;
  background: #f5f7f9;
}
/* 768-1199px: the mockup's own size at 986, about a 33px heading and 70px
   faces; 35px and 76px here. The right inset (11.9vw) is unchanged. */
@media (max-width: 1199px) {
  .veris-meet-heading { font-size: 35px; }
  .veris-meet-link { font-size: 20px; }
  .veris-meet-faces { --face: 76px; }
}
@media (max-width: 767px) {
  .veris-meet-heading { font-size: 30px; }
  .veris-meet-link { font-size: 18px; margin-top: 6px; }
  .veris-meet-faces { --face: 72px; }
}

/* ---- Homepage band colours (WO-2026-060 task 3) ----------------------------
   Every homepage section is built with `veris-band-own`, so assignBands
   gives it the band's edge (and `veris-band-cont` to Awards) but no -white
   or -blue class: each names its own colour, set by the brief and Chris
   Kerr's mockups. The Advantage gradient and the navy and gray sections are
   set above; here the rest: Awards (a continuation) and Meet Your Team
   white, What Our Clients Say pale blue, the contact section white and
   Veris Is Here to Help You pale blue, then the navy footer. No two
   neighbours share a colour (viewport-check measures it). */
.veris-home .main-content.style-1 > .veris-band-own.section-about.pt-0,
.veris-home .main-content.style-1 > .veris-meet,
.veris-home .main-content.style-1 > .section-contact { background: #fff; }
.veris-home .main-content.style-1 > .veris-quotes,
.veris-home .main-content.style-1 > .veris-v-help { background: var(--veris-band-blue); }

/* ---- Veris Is Here to Help You (WO-2026-060 task 3) ------------------------
   The heading opens with the full Veris logo (the header's file, alt
   "Veris") in place of the V mark: the logo's cap height matches the
   heading's, and the logo and "Is" stay together. From 1200px, where the
   photo and the copy sit side by side, the photo runs the copy column's
   full height (Ashley Brooks: it ended well short), still photoFrame()'s
   rounded, cover-cropped frame, from the top of the heading to the foot of
   the button; stacked (under 1200px, so the frame is never narrower than
   it is tall), it keeps the frame's 4:3
   above the copy. */
.veris-home .veris-v-help .veris-v-help-title { color: #1b2b3d; }
.veris-home .veris-v-help-logo {
  /* "ERIS" fills 61 of the file's 90px rows and ends 5px above its foot:
     at 1.06em its letters are the heading's cap height and sit on its
     baseline. */
  display: inline-block; height: 1.06em; width: auto; vertical-align: -0.06em;
  margin-right: 0.04em;
}
.veris-home .veris-v-help .veris-intro-photo { margin-top: 0; }
@media (max-width: 1199px) {
  .veris-home .veris-v-help .left { margin-bottom: 32px; }
  .veris-home .veris-v-help .content { padding-top: 0; }
}
@media (min-width: 1200px) {
  .veris-home .veris-v-help .row { align-items: stretch; }
  .veris-home .veris-v-help .content { padding-top: 0; padding-bottom: 0; }
  .veris-home .veris-v-help .row > :first-child > .left { height: 100%; }
  .veris-home .veris-v-help .veris-photo-img { height: 100%; aspect-ratio: auto; object-position: 50% 35%; }
}
/* The group photo is 1.41:1 and the five partners fill 78% of its width,
   so a frame much taller than wide cuts the outer two. Measured, frame
   width over height: 1.02 at 1440, 0.98 at 1280. At 1200-1279px the copy
   column is at its narrowest, so the heading steps down to 48px there,
   which holds the frame at 0.92 (it was 0.87) and keeps every face whole. */
@media (min-width: 1200px) and (max-width: 1279px) {
  .veris-home .section-about .text-with-img-1 .content .title.veris-v-help-title { font-size: 48px; line-height: 56px; }
}

/* Homepage contact and awards, compact (revision brief: reduce oversized
   gaps; awards are "compact supporting credibility"). The kit stretches the
   contact section's left column to the form's height and spaces its parts
   apart; here they sit together at the top. */
.veris-home .section-contact.style-default .left { justify-content: flex-start; height: auto; gap: 32px; }
.veris-home .veris-awards { padding-top: 0; padding-bottom: 0; }
.veris-home .veris-awards .heading-section { margin-bottom: 32px; }
.veris-home .main-content > .section-about.pt-0 { padding-top: 56px; padding-bottom: 56px; }
/* The homepage contact form's fields: the kit's form styles drop the
   outline, so keyboard focus showed nothing there (revision brief: clear
   keyboard focus styles). */
.veris-home .section-contact input:focus-visible,
.veris-home .section-contact select:focus-visible,
.veris-home .section-contact textarea:focus-visible {
  outline: 3px solid var(--Primary); outline-offset: 2px;
}
/* Stat rows on tablets: a word stat ("Unlimited") ran 282px in a 215px
   column at 768. */
@media (max-width: 991px) {
  .counter-item.style-default .counter-number span { font-size: 40px; line-height: 48px; }
}
/* A button beside a section heading keeps its label on one line; at 768 the
   row squeezed "Start the Process" to 112px for a 133px label. */
.heading-section > .tf-btn { flex-shrink: 0; white-space: nowrap; }


/* ---- Cards, style 3 (WO-2026-056 task 1; Larry, 2026-10-14) ---------------
   Every box that was a white card lifted by --veris-shadow is a flat tinted
   card: pale blue #eaf4fb on a white band, white on a pale-blue band (the
   band colours assignBands gives, a continuation taking the band above), no
   border, no shadow, 16px corners, 32px inside (24px under 768px). The
   shadow was clipped by the carousel box (.swiper, overflow: hidden) into a
   hard grey haze at the edge of every card row. Cards: the icon-less
   .tf-box-icon.style-1 (boxIcons), the interior .testimonial.style-default
   (testimonials), the service tiers, the pricing band, the pricing tool's
   groups, the payment cards and the job card. Not cards, and left as they
   are: the contact form box, the photo frames, the team photos, the
   pricing tool's navy running total, and the homepage's own cards
   (Chris's brief; .veris-quote is out of this work order's scope).
   viewport-check holds every card tinted for its band with no shadow. */
:is(.tf-box-icon.style-1:not(:has(.icon)), .testimonial.style-default, .veris-tier, .veris-pricing-band,
    .veris-pricing-group, .veris-pay-card, .veris-job) {
  background-color: #eaf4fb; border: 0; border-radius: 16px; box-shadow: none;
}
.veris-band-blue :is(.tf-box-icon.style-1:not(:has(.icon)), .testimonial.style-default, .veris-tier, .veris-pricing-band,
    .veris-pricing-group, .veris-pay-card, .veris-job) { background-color: #fff; }
.tf-box-icon.style-1:not(:has(.icon)), .veris-tier, .veris-pricing-band, .veris-pricing-group, .veris-pay-card, .veris-job { padding: 32px; }
@media (max-width: 767px) {
  .tf-box-icon.style-1:not(:has(.icon)), .veris-tier, .veris-pricing-band, .veris-pricing-group, .veris-pay-card, .veris-job { padding: 24px; }
}
/* Title Manrope 600 24px / 1.3 in dark ink, 12px down to the description.
   !important answers the kit's h3 tag sizes, which carry it below 768px. A
   linked title takes the same type: it was the kit's link with a two-line
   clamp, which cut "South Carolina contractor license renewal" short. */
.tf-box-icon.style-1:not(:has(.icon)) > .title,
.tf-box-icon.style-1:not(:has(.icon)) > .title a,
.veris-tier-title, .veris-pay-title, .veris-job-title, .veris-pricing-group-title {
  font-size: 24px !important; line-height: 1.3 !important; font-weight: 600; color: #1b2b3d;
}
.tf-box-icon.style-1:not(:has(.icon)) > .title a { color: inherit; font-weight: inherit; }
/* Title to description: 12px plus the title's line box, matched to the
   mockup (cards-values-1440.png renders a 40px ink gap and a 176px card:
   24px between the boxes, 35px under the description, from 768px). Under
   768px the gap keeps the padding's 3:4 proportion, 18px. */
:root { --veris-card-gap: 24px; }
@media (max-width: 767px) { :root { --veris-card-gap: 18px; } }
.tf-box-icon.style-1:not(:has(.icon)) > .title { margin-bottom: var(--veris-card-gap); }
@media (min-width: 768px) { .tf-box-icon.style-1:not(:has(.icon)) { padding-bottom: 35px; } }
/* Description Manrope 400 17px / 1.6 in slate. */
.tf-box-icon.style-1:not(:has(.icon)) > p,
.tf-box-icon.style-1:not(:has(.icon)) > .veris-facts,
.veris-tier > p.text-body-1 {
  font-size: 17px; line-height: 1.6; color: #627080; margin-bottom: 0;
}
/* A card with a title and no description (an empty <p>) centres its title. */
.tf-box-icon.style-1:not(:has(.icon)):not(:has(> p:not(:empty))):not(:has(> dl)) {
  display: flex; flex-direction: column; justify-content: center;
}
.tf-box-icon.style-1:not(:has(.icon)):not(:has(> p:not(:empty))):not(:has(> dl)) > .title { margin-bottom: 0; }
.tf-box-icon.style-1:not(:has(.icon)) > p:empty { display: none; }

/* Testimonial cards: 36px inside, the quote 17px / 1.7, the name 600 under
   a 1px silver rule with 16px above it, pinned to the card foot. A lone
   quote keeps its centred pull-quote size ("A single testimonial"). */
/* 36px at every width. The kit's .section-testimonial.style-1 .testimonial
   adds 17px under each card (0,3,0); this beats it, or the band's content
   sits 17px high in it. */
.section-testimonial .testimonial.style-default,
.testimonial.style-default { padding: 36px; display: flex; flex-direction: column; margin-bottom: 0; }
.testimonial.style-default .quote { font-size: 17px; line-height: 1.7; margin-bottom: 37px; }
.testimonial.style-default .box-user { margin-top: auto; padding-top: 16px; border-top: 1px solid #dae2e9; }
/* The kit's .text_black is !important; the name is dark ink, 16px/24px at
   every width (the kit drops .text-body-2 to 12px on a phone). */
.testimonial.style-default .name { font-weight: 600; color: #1b2b3d !important; font-size: 16px !important; line-height: 24px !important; }
/* "What Our Clients Say" sat in the kit's 440px heading box and wrapped to
   "What Our Clients / Say". */
.section-testimonial.style-1 .heading-section { max-width: none; }

/* A short last row (5 cards in 3 columns) is centred under the row above:
   the grid runs on half-columns and each card spans two, so a lone or
   paired last card can start half a column in. */
@media (min-width: 992px) {
  .tf-grid-layout-lg.lg-col-3:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .tf-grid-layout-lg.lg-col-3:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) > .swiper-slide { grid-column: span 2; }
  .tf-grid-layout-lg.lg-col-3:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) > .swiper-slide:nth-child(3n+1):nth-last-child(2) { grid-column: 2 / span 2; }
  .tf-grid-layout-lg.lg-col-3:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) > .swiper-slide:nth-child(3n+1):last-child { grid-column: 3 / span 2; }
}
@media (min-width: 768px) and (max-width: 991px) {
  .tf-grid-layout-lg.md-col-2:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .tf-grid-layout-lg.md-col-2:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) > .swiper-slide { grid-column: span 2; }
  .tf-grid-layout-lg.md-col-2:has(> .swiper-slide > .tf-box-icon.style-1):not(:has(.tf-box-icon .icon)) > .swiper-slide:nth-child(2n+1):last-child { grid-column: 2 / span 2; }
}

/* Card rows are carousels only below their data-screen width (carousel.js).
   Above it they are a plain grid, and the swiper box's overflow: hidden
   only clipped the cards' edges, so it lets them show. The 3-column row
   (.tf-grid-layout-lg) is a grid from 992px only in the kit, so between
   577 and 991px it stayed a single nowrap flex line and its cards ran past
   the viewport ("Meet every deadline" on /taxes-and-advanced-planning/):
   it is a grid from 577px, one column until md-col-2 takes over at 768px.
   On a phone the row really is a carousel, so it keeps its clipping and
   the slides get 4px of room inside it instead. */
/* Side room only: vertical padding moved every card row 4px off its
   heading and band edge, and on a phone showed a 4px lip of a stacked
   slide under the carousel. */
.swiper.tf-sw-mobile, .swiper.sw-layout, .swiper.tf-sw-testimonial { padding: 0 4px; margin-left: -4px; margin-right: -4px; }
/* Once carousel.js has made a row a carousel, its wrapper is Swiper's flex
   line. The 2-column row (.tf-grid-layout) is a grid at every width in the
   kit, so on a phone its slides stacked inside the carousel and the next
   card showed as a lip under the dots on /what-we-do/. */
.swiper.swiper-initialized > .swiper-wrapper { display: flex; gap: 0; }
@media (min-width: 577px) {
  .swiper.tf-sw-mobile[data-screen="576"] { overflow: visible; }
  .swiper.tf-sw-mobile[data-screen="576"] > .swiper-wrapper { display: grid; }
}
@media (min-width: 769px) {
  .swiper.tf-sw-mobile[data-screen="768"] { overflow: visible; }
}
/* In a card-row grid every column is an equal share: the kit's repeat(n,
   1fr) lets a column grow to its content's min-content width, and between
   992 and 1199px /llr-renewal/'s four process cards came to 1076px in a
   904px row, the fourth past the viewport. */
.swiper.tf-sw-mobile:not(.swiper-initialized) > .swiper-wrapper > .swiper-slide { min-width: 0; }
/* Four across needs the room: the kit's lg-col-4 row starts at 992px, where
   a 207px card could not hold a 32px title word ("Consultation" ran out of
   its card). Two across until 1200px. */
@media (min-width: 992px) and (max-width: 1199px) {
  .swiper.tf-sw-mobile > .swiper-wrapper.lg-col-4:not(.xl-col-4) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* The accordion on the industry pages: the question's number had its own
   width ("1." narrower than "4."), so the questions started at different
   indents, and the "+" sat 5px from the text. One width for the numbers
   and 24px between the question and the "+". */
.accordion-wrap.style-faqs .accordion-title { gap: 24px; }
.accordion-wrap.style-faqs .accordion-title > .heading { flex: 1 1 auto; min-width: 0; }
.accordion-wrap.style-faqs .accordion-title .title > .text_primary { flex: 0 0 auto; min-width: 1.1em; }

/* A hyphenated word in a section heading stays on one line ("year-end."
   split across lines at 1024 and 768 on /construction/); kit-sections
   textWithImg() wraps it. */
.veris-nowrap { white-space: nowrap; }

/* A testimonial row's dots when there is nothing to page (one quote, or two
   side by side: Swiper marks them locked) were an empty 40px under the
   cards, so the band's content looked low in it. */
.section-testimonial .sw-dots:empty,
.section-testimonial .sw-dots.swiper-pagination-lock { display: none !important; }

/* ---- Card rows share a title row (WO-2026-056 task 1) ---------------------
   A title that wraps pushed its own description down, so a row's
   descriptions started at different heights (75/106px into the card on
   /non-profit/'s four-across row, the tax page's two-column row and the
   tiers). Every card row is a grid, so each card spans the grid's rows as
   a subgrid and its title, description and link sit in shared rows. The
   span follows the card's own child count (2 or 3), so no empty row adds
   a gap. viewport-check holds every row's descriptions on one line. */
@media (min-width: 768px) {
  .swiper-wrapper > .swiper-slide:not(:has(.icon)):has(> .tf-box-icon.style-1 > .title:first-child + :is(p, dl):not(:empty)),
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title:first-child + :is(p, dl):not(:empty)) {
    display: grid; grid-row: span 2; grid-template-rows: subgrid; row-gap: var(--veris-card-gap);
  }
  .swiper-wrapper > .swiper-slide:not(:has(.icon)):has(> .tf-box-icon.style-1 > .title:first-child + :is(p, dl):not(:empty) + :nth-child(3):last-child),
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title:first-child + :is(p, dl):not(:empty) + :nth-child(3):last-child) { grid-row: span 3; }
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title:first-child + :is(p, dl):not(:empty)) > * { margin-top: 0; margin-bottom: 0; }
}

/* The service tiers: a grid whose cards are subgrids of six named rows
   (title, tagline, description, list, fit, button), so each row lines up
   across the tiers. Three across from 992px, two from 600px with a lone
   third centred under them, one on a phone. */
.veris-tier-grid { display: grid; grid-template-columns: minmax(0, 1fr); column-gap: 24px; row-gap: 24px; }
.veris-tier { display: grid; grid-row: span 6; grid-template-rows: subgrid; row-gap: 0; gap: 0 0; }
.veris-tier > * { margin: 0; }
.veris-tier > .veris-tier-title { grid-row: 1; }
.veris-tier > .veris-tier-tagline { grid-row: 2; margin-top: 12px; }
.veris-tier > p.text-body-1 { grid-row: 3; margin-top: 12px; }
.veris-tier > .veris-tier-list { grid-row: 4; margin-top: 16px; align-self: start; }
.veris-tier > .veris-tier-fit { grid-row: 5; margin-top: 12px !important; align-self: end; }
.veris-tier > .veris-tier-cta { grid-row: 6; margin-top: 16px; justify-self: start; align-self: end; }
@media (min-width: 600px) {
  .veris-tier-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .veris-tier-grid > .veris-tier { grid-column: span 2; }
  .veris-tier-grid > .veris-tier:nth-child(2n+1):last-child { grid-column: 2 / span 2; }
}
@media (min-width: 992px) {
  .veris-tier-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .veris-tier-grid > .veris-tier:nth-child(2n+1):last-child { grid-column: span 2; }
  .veris-tier-grid > .veris-tier:nth-child(3n+1):nth-last-child(2) { grid-column: 2 / span 2; }
  .veris-tier-grid > .veris-tier:nth-child(3n+1):last-child { grid-column: 3 / span 2; }
}

/* ---- Counter rows at a band's foot (WO-2026-056 task 1) -------------------
   The counters (kit-sections counters(), a pt-0 continuation band) end the
   band with the number, but its 72px line box hung ~11px of descent under
   the digits, then its 15px margin over an empty note line: the last ink
   sat 106px over the next band at 1440, not 80. The empty note goes, the
   margin goes with it, and the number's line box is drawn to its ink (0.8),
   with the space it gave up above the digits put back as padding, so the
   label-to-number spacing is unchanged. */
:where(body:not(.veris-home)) .counter-item.style-default > p:empty { display: none; }
:where(body:not(.veris-home)) .counter-item.style-default > .counter-number:has(+ p:empty),
:where(body:not(.veris-home)) .counter-item.style-default > .counter-number:last-child { margin-bottom: 0 !important; }
:where(body:not(.veris-home)) .counter-item.style-default .counter-number span { line-height: 0.8 !important; }
:where(body:not(.veris-home)) .counter-item.style-default .counter-number { padding-top: 10px; }
@media (max-width: 991px) {
  :where(body:not(.veris-home)) .counter-item.style-default .counter-number { padding-top: 8px; }
}

/* ---- WO-2026-056 task 3: Charter School fiscal management ----------------
   kit-sections textWithImg() options (Larry, 2026-10-14).
   Layout A (`veris-split-a`): "Working with your school" and "What that
   means for you" as one section, the photo left in 5 of 11 columns with a
   64px gutter from 1200px, the heading, a 22px semibold subheading and the
   three points as a checklist: blue check circles, silver rules between. */
.veris-subtitle {
  font-size: 22px; font-weight: 600; line-height: 1.4; letter-spacing: 0;
  color: #1b2b3d; margin: 28px 0 8px;
}
.veris-checklist { list-style: none; margin: 0; padding: 0; }
.veris-checklist-item {
  display: flex; align-items: flex-start; gap: 18px; padding: 20px 0;
  font-size: 18px; line-height: 1.5; color: #1b2b3d;
}
.veris-checklist-item:last-child { padding-bottom: 0; }
.veris-checklist-item + .veris-checklist-item { border-top: 1px solid #dae2e9; }
.veris-check {
  flex: 0 0 26px; width: 26px; height: 26px; margin-top: 0.5px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: #eaf4fb; color: #1479bd;
}
/* A 2px tick drawn in CSS: the icon font's check is a hairline at this size. */
.veris-check::after {
  content: ""; width: 6px; height: 11px; margin-top: -3px;
  border: solid currentColor; border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.veris-band-blue .veris-check { background: #fff; }
.veris-split-a .veris-intro-photo { margin-top: 0; }
@media (min-width: 1200px) {
  /* the kit pins .row's gutter with !important (styles.css, 12px) */
  .veris-split-a .row { margin-left: -32px !important; margin-right: -32px !important; }
  .veris-split-a .row > * { padding-left: 32px !important; padding-right: 32px !important; }
  .veris-split-a .row > .col-xl-6:first-child { width: calc((100% - 128px) * 5 / 11 + 64px); }
  .veris-split-a .row > .col-xl-6:last-child { width: calc((100% - 128px) * 6 / 11 + 64px); }
}
/* The kit offsets .content 100-114px down against its photo; here the copy
   is centred on the photo, or under it below 1200px. */
.text-with-img-2.v2.veris-split-a .content { padding-top: 0; margin-bottom: 0; }
@media (max-width: 1199px) { .veris-split-a .veris-intro-photo { margin-bottom: 32px; } }
@media (max-width: 767px) {
  .veris-subtitle { font-size: 18px; margin-top: 24px; }
  .veris-checklist-item { font-size: 16px; padding: 16px 0; }
}

/* "Complete List of Charter School Fiscal Management Services" on a phone
   (`veris-photo-mid`, version 1): heading, paragraph, the photo with 28px
   above and below, then the checklist and button, all left-aligned. The
   copy column and its .content give way (display: contents) so the photo
   can sit between the paragraph and the list. Desktop is unchanged.
   viewport-check holds the order at 390. Since WO-2026-060 task 5 the same
   order holds wherever the columns stack (under 1200px), and on every list
   section of a service page and Outsourced Accounting's in-house section:
   their photo came first and sat straight under the photo that ends the
   band above (Ashley Brooks's "two photos stack"). */
@media (max-width: 1199px) {
  .veris-photo-mid .row { display: flex; flex-direction: column; align-items: stretch; margin-left: 0 !important; margin-right: 0 !important; }
  .veris-photo-mid .row.align-items-center { align-items: stretch !important; } /* a centred row (Bootstrap's !important) would shrink the list to its width */
  .veris-photo-mid .row > * { padding-left: 0 !important; padding-right: 0 !important; }
  .veris-photo-mid .row > .col-xl-6:not(:has(.veris-intro-photo)),
  .veris-photo-mid .row > .col-xl-6 > .content { display: contents; }
  .veris-photo-mid .content > .title { order: 1; }
  .veris-photo-mid .content > .description { order: 2; }
  .veris-photo-mid .row > .col-xl-6:has(.veris-intro-photo) { order: 3; }
  /* !important: the band-spacing rule zeroes the margin-top of a band's
     first descendants (the photo is first in the DOM, though not on a
     phone), and the stacked-photo rule sets 32px under it. */
  .text-with-img-2.veris-photo-mid .row > .col-xl-6 > .veris-intro-photo { margin: 28px 0 !important; }
  .veris-photo-mid .content > .list { order: 4; margin-top: 0; }
  .veris-photo-mid .content > :is(.tf-btn, .veris-cta-row) { order: 5; align-self: flex-start; }
}
/* On a tablet the photo stays between the copy and the list too (it was
   above the heading, under the band above's photo, until WO-2026-060 task 5),
   so the tablet rule that gave it 28px under it went with that. */
/* ---- end WO-2026-056 task 3 */

/* ---- WO-2026-056 task 4: page sections (Larry, 2026-10-14) ---------------- */

/* What We Do, Verum / Visum (verum-visum-*.png): the Latin word is the card
   heading, Manrope 700 40px (32px on a phone) in Veris blue; its three
   values under it in 13px semibold capitals; then the description. The
   words are the live line's, split, not changed. */
.tf-box-icon.style-1:not(:has(.icon)) > .title.veris-card-word {
  font-size: 40px !important; line-height: 1.1 !important; font-weight: 700; color: #1479bd; margin-bottom: 8px;
}
.tf-box-icon.style-1:not(:has(.icon)) > p.veris-card-values {
  font-size: 13px; line-height: 1.5; font-weight: 600; letter-spacing: .12em; text-transform: uppercase;
  color: #1b2b3d; margin: 0 0 14px;
}
/* From 768px task 1 makes every card row a subgrid with a 24px row gap and
   no child margins; these cards space their three rows as the mockup does
   (8px word to values, 14px values to description, a 204px card at 1440). */
@media (min-width: 768px) {
  .swiper-wrapper > .swiper-slide:not(:has(.icon)):has(> .tf-box-icon.style-1 > .title.veris-card-word + p.veris-card-values),
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title.veris-card-word + p.veris-card-values) { row-gap: 0; }
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title.veris-card-word + p.veris-card-values) > .title.veris-card-word { margin-bottom: 8px; }
  .swiper-wrapper > .swiper-slide > .tf-box-icon.style-1:not(:has(.icon)):has(> .title.veris-card-word + p.veris-card-values) > p.veris-card-values { margin-bottom: 14px; }
}
@media (max-width: 767px) {
  .tf-box-icon.style-1:not(:has(.icon)) > .title.veris-card-word { font-size: 32px !important; }
}

/* A diagram, lockup or banner shown at its own ratio (no 4:3 letterbox):
   Certifications and memberships, the Community banner, How we hire. */
.veris-photo.veris-photo-natural .veris-frame { aspect-ratio: auto; background: none; }
.veris-photo.veris-photo-natural .veris-frame img { display: block; width: 100%; height: auto; object-fit: initial; }
/* How we hire: about 880px wide, centred. */
.veris-photo.veris-photo-narrow { width: 100%; max-width: 880px; margin-left: auto !important; margin-right: auto !important; }
/* A paragraph under the photos, in the same band (/in-the-community/). */
.veris-photo-outro { margin: 32px 0 0; max-width: 880px; }
@media (max-width: 767px) { .veris-photo-outro { margin-top: 24px; } }

/* LLR renewal, "Our Process", option 3 (llr-our-process-*.png): the kicker
   in Veris blue, 600 15px, .08em; 48px from the heading to the steps; the
   steps on card style 3 surfaces (pale blue on a white band, white on a
   pale-blue one) lined up with the heading; step titles 600 24px. */
.veris-steps .heading-section { margin-bottom: 48px; }
.veris-steps .heading-section > p.title {
  color: #1479bd; font-weight: 600; font-size: 15px; line-height: 1.4; letter-spacing: .08em;
}
.veris-steps .tf-box-icon.style-7 {
  background-color: #eaf4fb; border: 0; border-radius: 16px; box-shadow: none; padding: 32px 28px;
}
.main-content.style-1 > .veris-band-blue.veris-steps .tf-box-icon.style-7 { background-color: #fff; }
/* These step cards are painted (pale blue on white, white on pale blue), so
   task 1's give-back of a band-coloured style-7 card's edge padding does
   not apply: the card's edge is what the band is centred on. */
body:not(.veris-home) .main-content.style-1 > .veris-steps[class*="veris-band-"] > .tf-container > .swiper:first-child:has(.tf-box-icon.style-7) { margin-top: 0; }
body:not(.veris-home) .main-content.style-1 > .veris-steps[class*="veris-band-"] > .tf-container > .swiper:last-child:has(.tf-box-icon.style-7) { margin-bottom: 0; }
.veris-steps .tf-box-icon.style-7 .icon i { font-size: 72px; }
.veris-steps .tf-box-icon.style-7 .title {
  font-size: 24px !important; line-height: 1.3 !important; font-weight: 600; color: #1b2b3d;
}
.veris-steps .tf-box-icon.style-7 p.text-body-1 { font-size: 18px; line-height: 28px; color: #1b2b3d; }
@media (max-width: 767px) {
  .veris-steps .tf-box-icon.style-7 { padding: 28px; }
  .veris-steps .tf-box-icon.style-7 p.text-body-1 { font-size: 14px; line-height: 22px; }
}

/* Careers: the awards marquee band (the homepage strip, scripts/home-awards.mjs,
   with the homepage's own .veris-awards rules: the strip runs to the kit's
   15px edge), the heading 32px above it. */
.veris-awards-band .veris-awards .heading-section { margin-bottom: 32px; }
@media (max-width: 767px) { .veris-awards-band .veris-awards .heading-section { margin-bottom: 28px; } }

/* Careers, "Open roles", smaller: a 32px heading (26px on a phone) and a
   shorter band, its content still centred between its edges. Same words. */
.main-content.style-1 > .veris-open-roles { --veris-band-pad: 56px; }
@media (max-width: 1199px) { .main-content.style-1 > .veris-open-roles { --veris-band-pad: 48px; } }
@media (max-width: 767px) { .main-content.style-1 > .veris-open-roles { --veris-band-pad: 32px; } }
.veris-open-roles .heading-section { margin-bottom: 28px !important; }
.veris-open-roles .heading-title { font-size: 32px !important; line-height: 1.25 !important; }
@media (max-width: 767px) { .veris-open-roles .heading-title { font-size: 20px !important; line-height: 1.3 !important; } }

/* Location pages: the team headshots are no larger than Summerville's
   three-across cards; a pair is centred under the heading. */
@media (min-width: 768px) {
  .veris-photo-row-center { display: flex; flex-wrap: wrap; justify-content: center; }
  .veris-photo-row-center > .veris-photo { flex: 0 0 calc((100% - 24px) / 2); }
}
@media (min-width: 992px) {
  .veris-photo-row-center > .veris-photo { flex-basis: calc((100% - 48px) / 3); }
}

/* A photo gallery (photoGrid()) that stacks: the kit's 3-column row is a
   grid from 992px only and the centred pair a flex row from 768px, so
   below those the photos stood edge to edge with no gap (round 2 of Will's
   2026-10-26 review: the office and community galleries at 390 and 768).
   Stacked, they stand 16px apart. */
@media (max-width: 991px) {
  .tf-grid-layout-lg:has(> figure.veris-photo):not(.veris-photo-row-center) { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; }
}
@media (max-width: 767px) {
  .veris-photo-row-center:has(> figure.veris-photo) { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px; }
}

/* ---- end WO-2026-056 task 4 */

/* ---- WO-2026-056 task 5: the tax page's "when we talk" grid --------------
   Proactive Advisory CPA against Reactive CPA (touchPoints() in
   scripts/kit-sections.mjs), in the photo's right-hand slot on
   /taxes-and-advanced-planning/. It replaced an image; it is a real table.
   A white card on the pale-blue band (pale gray on a white one), the moments
   as row labels with a blue rule, the outcome row's Veris-blue cell and the
   dashed silver one beside it. Mockups tax-timeline-1440.png / -390.png. */
.tf-grid-layout:has(> .veris-tp) { align-items: center; }
/* Beside the photo only from 992px; narrower, the table sits under it at
   full width, as on a phone (a half-width table cannot hold its words). */
@media (max-width: 991px) {
  .tf-grid-layout.md-col-2:has(> .veris-tp) { grid-template-columns: minmax(0, 1fr); }
}
.veris-tp {
  background: #f5f7f9; border-radius: 16px; padding: 28px; min-width: 0;
  font-family: 'Manrope', sans-serif;
}
.veris-band-blue .veris-tp { background: #fff; }
/* On a white band the card is pale gray, so its gray cells turn white. */
.veris-band-white .veris-tp .veris-tp-reactive { background: #fff; }
.veris-tp-table, .veris-tp-table th, .veris-tp-table td { border: 0; }
.veris-tp-table {
  width: calc(100% + 24px); margin: -12px; table-layout: fixed;
  border-collapse: separate; border-spacing: 12px;
}
.veris-tp-table th, .veris-tp-table td { text-align: left; font-size: 15px; line-height: 1.35; }
.veris-tp-corner { width: 25%; padding: 0; }
.veris-tp-head {
  padding: 0 4px; vertical-align: bottom; font-size: 14px !important;
  font-weight: 600; color: #627080;
}
.veris-tp-head-proactive { color: #1479bd; }
.veris-tp-when { padding: 0; vertical-align: middle; font-size: 14px !important; font-weight: 600; color: #1b2b3d; }
.veris-tp-when > span { display: block; border-left: 3px solid #1479bd; padding-left: 10px; }
.veris-tp-proactive, .veris-tp-reactive {
  padding: 14px 16px; border-radius: 12px; vertical-align: middle; font-weight: 400;
}
.veris-tp-proactive { background: #eaf4fb; color: color-mix(in srgb, var(--Primary) 80%, #000); }
.veris-tp-reactive { background: #f5f7f9; color: #627080; }
.veris-tp-proactive.veris-tp-outcome { background: #1479bd; color: #fff; font-weight: 600; }
.veris-tp-table .veris-tp-reactive.veris-tp-outcome { border: 1.5px dashed #dae2e9; }
@media (max-width: 575px) {
  .veris-tp { padding: 14px; }
  .veris-tp-table { width: calc(100% + 12px); margin: -6px; border-spacing: 6px; }
  .veris-tp-table th, .veris-tp-table td { font-size: 14px; }
  .veris-tp-corner { width: 24%; }
  .veris-tp-proactive, .veris-tp-reactive { padding: 10px 8px; }
  .veris-tp-table .veris-tp-when { font-size: 13px !important; }
  .veris-tp-when > span { padding-left: 6px; }
}

/* ---- WO-2026-056 task 8: justified text ----------------------------------
   Straight edges on both sides, no hyphenation (Larry, 2026-10-14), on
   exactly six blocks: the homepage "V is Here to Help You" paragraphs, the
   Who We Are culture paragraph, the Community intro, the CAS "Why Outsourced
   Accounting…" paragraphs, the forensic intro and the Careers "Agency
   Recruitment Policy" notice; since WO-2026-060 task 5 also the Charter
   School and Tax intros (eight). The generators add the class (kit-sections
   JUSTIFY); no page carries its own rule. viewport-check (17) holds its
   JUSTIFIED list and no other block. */
.veris-justify {
  text-align: justify;
  -webkit-hyphens: manual;
  hyphens: manual;
}
/* ---- end WO-2026-056 task 8 */

/* /what-we-do/ "Certifications and memberships": the awards strip's marquee
   and band (awardsBand), its logos cut from Veris's composite and painted dark
   gray (scripts/cert-logos.mjs). In place of the kit's gray-to-colour filter,
   they show light gray at rest and darken to that gray under the pointer
   (Will, 2026-10-19). */
.veris-certs .partner.style-3 { filter: brightness(235%); transition: filter 0.3s ease; }
.veris-certs .partner.style-3:hover { filter: none; }
@media (prefers-reduced-motion: reduce) { .veris-certs .partner.style-3 { transition: none; } }
/* More air between the marks than the awards' 96px: several are wide
   wordmarks. One set of eight is then wider than any screen (8 x 280px), so
   the marquee's repeat never puts the same logo on screen twice. */
.veris-certs .partner.style-3 { padding-left: 120px; }

/* Interior counters: the label takes the space a longer label in the same
   row needs, so every row's blue numbers sit on one line. */
body:not(.veris-home) .row > [class*="col-"] > .counter-item.style-default { display: flex; flex-direction: column; height: 100%; }
body:not(.veris-home) .counter-item.style-default > .sub-heading:first-child { flex: 1 0 auto; }

/* The accordion-beside-a-photo: no margin over the photo, so the row centres
   the photo itself on the copy ("Photo beside copy, centred"; it was the
   photo's top on the heading's until Will, 2026-10-26). */
@media (min-width: 992px) {
  .section-process.style-1 .row > .right > .veris-intro-photo { margin-top: 0; }
}

/* Location pages: "Get directions" opens the office map in a dialog. */
dialog.veris-bio-modal.veris-map-modal { width: min(880px, calc(100vw - 32px)); padding: 16px 28px 28px; }
.veris-map-frame { position: relative; aspect-ratio: 16 / 10; border-radius: 16px; overflow: hidden; background: #f5f7f9; }
.veris-map-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
@media (max-width: 767px) {
  dialog.veris-bio-modal.veris-map-modal { padding: 12px 16px 20px; }
  .veris-map-frame { aspect-ratio: 4 / 5; }
}

/* ---- Grouped service list (Larry, 2026-10-15, variation B) ----------------
   "Complete List of Charter School Fiscal Management Services": the list in
   three titled cards (textWithImg() `groups`, listGroups in
   templates/services.json). The cards are style 3: flat tint, #eaf4fb on a
   white band and #fff on a pale-blue one, 16px corners, no shadow. From
   1200px the heading, paragraph and button sit beside the photo, centred on
   it, and the cards run the full width under both. The DOM order is the
   phone's (heading, paragraph, photo, cards, button: the photoMid block
   above), so desktop places the parts on a grid. */
.veris-svc-groups { display: grid; gap: 24px; margin-top: 40px; }
@media (min-width: 1200px) { .veris-svc-groups { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.veris-svc-group { background: #eaf4fb; border-radius: 16px; padding: 32px; }
.veris-band-blue .veris-svc-group { background: #fff; }
.veris-svc-group-title { font-family: Manrope, sans-serif; font-size: 24px; line-height: 1.3; font-weight: 600; color: #1b2b3d; margin: 0 0 20px; }
.veris-svc-group-list { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; }
.veris-svc-group-list li { display: flex; gap: 12px; align-items: flex-start; font-size: 16px; line-height: 1.5; color: #1b2b3d; }
.veris-svc-group-list li i { flex: none; margin-top: 4px; }
@media (max-width: 767px) {
  .veris-svc-group { padding: 24px; }
  .veris-svc-group-title { font-size: 20px; margin-bottom: 16px; }
}
@media (max-width: 1199px) { .veris-photo-mid .content > .veris-svc-groups { order: 4; margin-top: 0; } }
@media (min-width: 1200px) {
  .veris-grouped .row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: 1fr auto auto auto 1fr auto; column-gap: 64px; margin-left: 0 !important; margin-right: 0 !important; }
  .veris-grouped .row > .col-xl-6 { width: auto; max-width: none; padding-left: 0 !important; padding-right: 0 !important; }
  .veris-grouped .row > .col-xl-6:not(:has(.veris-intro-photo)),
  .veris-grouped .row > .col-xl-6 > .content { display: contents; }
  .veris-grouped .row > .col-xl-6:has(.veris-intro-photo) { grid-column: 2; grid-row: 1 / 6; align-self: center; }
  .veris-grouped .content > .title { grid-column: 1; grid-row: 2; }
  .veris-grouped .content > .description { grid-column: 1; grid-row: 3; }
  .veris-grouped .content > :is(.tf-btn, .veris-cta-row) { grid-column: 1; grid-row: 4; justify-self: start; }
  .veris-grouped .content > .veris-svc-groups { grid-column: 1 / -1; grid-row: 6; margin-top: 56px; }
}
/* The grouped list with its photo on the left (`listPhotoLeft`, WO-2026-060
   task 5: /charter-school-fiscal-management/, where the intro's photo is on
   the right just above, so the two photos do not stack in one column). */
@media (min-width: 1200px) {
  .veris-grouped-left .row > .col-xl-6:has(.veris-intro-photo) { grid-column: 1; }
  .veris-grouped-left .content > :is(.title, .description, .tf-btn, .veris-cta-row) { grid-column: 2; }
}

/* Pricing tool, Step 3: "Your selections" (Larry, 2026-10-15). The answers
   carried down from the calculator, read-only, above the visitor's own note;
   veris-pricing.js writes it and keeps the hidden message field in step. */
.veris-pricing-summary { background: #eaf4fb; border-radius: 16px; padding: 24px 28px; margin: 16px 0 24px; }
.veris-pricing-summary-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; margin-bottom: 8px; }
.veris-pricing-summary-title { margin: 0; font-size: 20px; line-height: 28px; font-weight: 600; color: #1b2b3d; }
.veris-pricing-summary-group { margin: 16px 0 6px; font-size: 13px; line-height: 18px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #627080; }
.veris-pricing-summary-list { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px 24px; margin: 0; font-size: 15px; line-height: 22px; }
.veris-pricing-summary-list dt { font-weight: 400; color: #627080; }
.veris-pricing-summary-list dd { margin: 0; font-weight: 600; color: #1b2b3d; text-align: right; }
.veris-pricing-summary-estimate { display: flex; justify-content: space-between; gap: 16px; margin: 16px 0 0; padding-top: 14px; border-top: 1px solid #dae2e9; font-size: 15px; line-height: 22px; color: #1b2b3d; }
@media (max-width: 575px) {
  .veris-pricing-summary { padding: 20px; }
  .veris-pricing-summary-list { grid-template-columns: 1fr; gap: 2px; }
  .veris-pricing-summary-list dd { text-align: left; margin-bottom: 8px; }
}

/* ---- Band tones (WO-2026-060 task 4) ---------------------------------------
   A section may name its own colour (kit-sections BAND_TONES; assignBands in
   scripts/build-page.mjs keeps it and alternates white and pale blue around
   it): deep navy, the aqua gradient, solid Veris blue, cool light gray, as
   in Chris Kerr's Audit mockup. Navy and blue carry white ink; an in-text
   link on them is white (underlined, so never colour alone), and on the
   gradient and gray the darker blue of the tinted bands (4.5:1 or better).
   Cards on the gradient and on gray are white, as on pale blue. */
.main-content.style-1 > .veris-band-navy { background: #101f30; color: #fff; }
.main-content.style-1 > .veris-band-solid { background: var(--Primary); color: #fff; }
.main-content.style-1 > .veris-band-gray { background: #f5f7f9; }
.main-content.style-1 > .veris-band-gradient { background-color: #eaf4fb; background-image: linear-gradient(90deg, #c7eaf1 0%, #e6f7fa 100%); }
:is(.veris-band-navy, .veris-band-solid) :is(h2, h3, .heading-title) { color: #fff; }
:is(.veris-band-navy, .veris-band-solid) a.link.veris-inline-link { color: #fff; }
:is(.veris-band-gradient, .veris-band-gray) a.link.veris-inline-link { color: color-mix(in srgb, var(--Primary) 80%, #000); }
/* The kit's kicker grey (#5f6a74) is 4.33:1 on the gradient's light end
   (/taxes-and-advanced-planning/ "Why Charleston, Mount Pleasant, and
   Summerville"); on the gradient and gray it takes the dark ink. */
:is(.veris-band-gradient, .veris-band-gray) .heading-section .text_mono-gray-4 { color: #1b2b3d; }
:is(.veris-band-gradient, .veris-band-gray) :is(.tf-box-icon.style-1:not(:has(.icon)), .testimonial.style-default, .veris-tier, .veris-pricing-band,
    .veris-pricing-group, .veris-pay-card, .veris-job) { background-color: #fff; }
/* Testimonial cards on navy: the card style (flat, 16px corners, 36px
   inside, the name under a rule) in the palette's dark ink, white type. */
.veris-band-navy .testimonial.style-default { background-color: #1b2b3d; }
.veris-band-navy .testimonial.style-default .quote { color: #fff; }
/* A lone testimonial on navy (/forensic-valuation/): white over the lone
   card's centred dark ink. */
.section-testimonial.veris-band-navy .swiper-wrapper .testimonial.style-default .quote { color: #fff; }
.veris-band-navy .testimonial.style-default .name { color: #fff !important; }
.veris-band-navy .testimonial.style-default .sub { color: #c9d3dd; }
.veris-band-navy .testimonial.style-default .box-user { border-top-color: rgba(255, 255, 255, .22); }
.veris-band-navy .sw-dots .swiper-pagination-bullet { background-color: rgba(255, 255, 255, .55); }
.veris-band-navy .sw-dots .swiper-pagination-bullet-active { background-color: #fff !important; }
.veris-band-navy :focus-visible, .veris-band-solid :focus-visible { outline-color: #fff; }
/* The other service pages on these tones (WO-2026-060 task 5, "mirror it":
   band colours only). A comparison's cards on navy keep their light card
   and dark ink (the white heading rule above is for the band's own
   headings, not a card's); the heading's intro line is light slate. The
   closing pricing panel on solid blue is the band itself: no card, white
   ink, the pricing tool a white button and the call a white outline. */
.veris-band-navy :is(.tf-box-icon.style-1, .tf-box-icon.style-7) { color: #1b2b3d; }
.veris-band-navy :is(.tf-box-icon.style-1, .tf-box-icon.style-7) :is(h3, .title) { color: #1b2b3d; }
.veris-band-navy .heading-section p { color: #c9d3dd; }
.veris-band-navy .tf-box-icon.style-1:not(:has(.icon)) { background-color: #eaf4fb; }
.main-content.style-1 > .veris-band-solid .veris-pricing-band { background-color: transparent; padding: 0; }
.main-content.style-1 > .veris-band-solid .veris-pricing-band p { color: #fff; }
.main-content.style-1 > .veris-band-solid .veris-pricing-band > .d-flex { gap: 16px 20px; margin-top: 12px; }
.tf-btn.btn-border.veris-btn-on-solid { border-color: #fff; }
.tf-btn.btn-border.veris-btn-on-solid span { color: #fff !important; }
.tf-btn.btn-border.veris-btn-on-solid .bg-effect { background-color: #fff; }
.tf-btn.btn-border.veris-btn-on-solid:hover { background-color: #fff; border-color: #fff; }
.tf-btn.btn-border.veris-btn-on-solid:hover span { color: var(--Primary) !important; }

/* ---- Service hero (WO-2026-060 task 4, Chris Kerr's Audit mockup) ----------
   kit-sections serviceHero(): the page-title band, painted white, with the
   kicker, the h1 (its last line in Veris blue) and the intro and actions
   beside it, then the photograph with the three stats beside it. Sizes are
   the mockup's at 1440 (audit-mockup.html): a 1.15fr / 1fr top row 70px
   apart, the h1 4.7vw (44-70px), a 1fr / 265px bottom row 46px apart. Under
   992px the top row stacks (heading, then intro) and the stats go under the
   photo as a row of three; under 576px they are a column. */
.wrap-page-header:has(.veris-svc-hero) { background: #fff; }
.wrap-page-header .page-title.style-default:has(.veris-svc-hero) { padding: 0 !important; }
.veris-svc-hero { padding: 72px 0 calc(80px + 27px); }
.veris-svc-hero-top { display: grid; grid-template-columns: 1.15fr 1fr; gap: 70px; align-items: end; margin-bottom: 48px; }
.veris-kicker {
  display: flex; align-items: center; gap: 14px; margin: 0 0 24px;
  color: var(--Primary); font-size: 13px; line-height: 1.4; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
}
.veris-kicker::before { content: ''; width: 32px; height: 2px; background: currentColor; flex: none; }
.veris-svc-hero-h1 {
  margin: 0; color: #1b2b3d; font-weight: 700;
  font-size: clamp(44px, 4.7vw, 70px); line-height: 1.06; letter-spacing: -.035em;
}
.veris-svc-hero-accent { color: var(--Primary); }
.veris-svc-hero-intro { margin: 0 0 28px; color: #1b2b3d; font-size: 17px; line-height: 1.85; }
.veris-svc-hero-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 20px 32px; }
.veris-svc-hero-more {
  display: inline-flex; align-items: center; gap: 14px; min-height: 44px;
  color: #1b2b3d; font-size: 16px; font-weight: 600; text-decoration: none;
}
.veris-svc-hero-more:hover { color: var(--Primary); text-decoration: underline; text-underline-offset: 4px; }
.veris-svc-hero-more:focus-visible { outline: 3px solid var(--Primary); outline-offset: 3px; border-radius: 4px; }
.veris-svc-hero-bottom { display: grid; grid-template-columns: minmax(0, 1fr) 265px; gap: 46px; }
.veris-svc-hero-photo img {
  display: block; width: 100%; height: 100%; aspect-ratio: 16 / 9;
  object-fit: cover; object-position: center; border-radius: 16px;
}
.veris-svc-hero-stats { display: flex; flex-direction: column; justify-content: space-around; margin: 0; padding: 0; list-style: none; }
.veris-svc-hero-stats li { display: flex; flex-direction: column; padding: 24px 0; border-bottom: 1px solid #dae2e9; }
.veris-svc-hero-stats li:first-child { padding-top: 0; }
.veris-svc-hero-stats li:last-child { padding-bottom: 0; border-bottom: 0; }
.veris-svc-stat-value { color: var(--Primary); font-size: 45px; line-height: 1.15; font-weight: 600; letter-spacing: -.03em; }
.veris-svc-stat-label { margin-top: 8px; color: #627080; font-size: 14px; line-height: 1.5; }
@media (max-width: 1199px) {
  .veris-svc-hero-top { gap: 35px; }
  .veris-svc-hero-bottom { grid-template-columns: minmax(0, 1fr) 220px; gap: 28px; }
  .veris-svc-stat-value { font-size: 38px; }
}
@media (max-width: 991px) {
  .veris-svc-hero { padding: 56px 0 calc(64px + 27px); }
  .veris-svc-hero-top { grid-template-columns: minmax(0, 1fr); gap: 32px; margin-bottom: 40px; }
  .veris-svc-hero-h1 { font-size: clamp(40px, 7.4vw, 63px); }
  .veris-svc-hero-copy { max-width: 640px; }
  .veris-svc-hero-bottom { grid-template-columns: minmax(0, 1fr); gap: 28px; }
  .veris-svc-hero-stats { flex-direction: row; gap: 16px; }
  .veris-svc-hero-stats li, .veris-svc-hero-stats li:first-child, .veris-svc-hero-stats li:last-child { flex: 1 1 0; padding: 0 16px 0 0; border-bottom: 0; border-right: 1px solid #dae2e9; }
  .veris-svc-hero-stats li:last-child { border-right: 0; padding-right: 0; }
  .veris-svc-stat-value { font-size: clamp(26px, 5vw, 38px); }
}
@media (max-width: 767px) {
  .veris-svc-hero { padding: 40px 0 calc(48px + 27px); }
  .veris-svc-hero-top { gap: 28px; margin-bottom: 32px; }
  .veris-kicker { font-size: 12px; margin-bottom: 20px; }
  .veris-svc-hero-h1 { font-size: clamp(40px, 10.5vw, 56px); }
  .veris-svc-hero-intro { font-size: 16px; }
  .veris-svc-hero-photo img { aspect-ratio: 16 / 10; }
}
@media (max-width: 575px) {
  .veris-svc-hero-stats { flex-direction: column; gap: 0; }
  .veris-svc-hero-stats li, .veris-svc-hero-stats li:first-child, .veris-svc-hero-stats li:last-child {
    flex-direction: row; align-items: baseline; gap: 16px; padding: 14px 0; border-right: 0; border-bottom: 1px solid #dae2e9;
  }
  .veris-svc-hero-stats li:first-child { padding-top: 0; }
  .veris-svc-hero-stats li:last-child { padding-bottom: 0; border-bottom: 0; }
  .veris-svc-stat-value { flex: 0 0 150px; font-size: 32px; } /* a fixed column (the kit sets 1rem = 10px), so the labels line up */
  .veris-svc-stat-label { margin-top: 0; font-size: 15px; }
}

/* ---- Comparison cards (WO-2026-060 task 4) --------------------------------
   kit-sections compareCards(): "Without" on cool gray, "With" on pale blue,
   each a heading with its mark over a silver rule and the list under it,
   side by side 24px apart from 768px. No illustrations (Ashley Brooks). The
   first band under the hero keeps the scale's spacing above it too. */
.main-content.style-1 > .veris-compare:first-child { padding-top: var(--veris-band-pad); }
/* "How It Works ↓" lands here clear of the sticky header. */
.veris-compare { scroll-margin-top: 96px; }
.veris-compare-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
.veris-compare-card { background: #f5f7f9; border-radius: 16px; padding: 42px 44px 34px; color: #1b2b3d; }
.veris-compare-card.veris-compare-with { background: #eaf4fb; }
.veris-compare-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-bottom: 25px; border-bottom: 1px solid #dae2e9; }
.veris-band-navy .veris-compare-title, .veris-compare-title { margin: 0; color: #1b2b3d; font-size: 32px; line-height: 1.2; font-weight: 600; letter-spacing: -.02em; }
.veris-compare-mark {
  flex: none; display: grid; place-items: center; width: 36px; height: 36px;
  border: 1px solid #c3ccd5; border-radius: 50%; color: #627080; font-size: 20px; line-height: 1;
}
.veris-compare-with .veris-compare-mark { background: var(--Primary); border-color: var(--Primary); color: #fff; font-size: 18px; }
.veris-compare-list { margin: 24px 0 0; padding: 0; list-style: none; }
.veris-compare-list li { position: relative; padding: 10px 0 10px 24px; color: #1b2b3d; font-size: 16px; line-height: 1.7; }
.veris-compare-list li::before { content: '\2013'; position: absolute; left: 0; top: 10px; color: #627080; }
.veris-compare-with .veris-compare-list li::before { content: '\2713'; color: var(--Primary); }
@media (max-width: 1199px) { .veris-compare-card { padding: 32px 28px 26px; } }
@media (max-width: 767px) {
  .veris-compare-grid { grid-template-columns: minmax(0, 1fr); gap: 16px; }
  .veris-compare-card { padding: 28px 24px 22px; }
  .veris-compare-title { font-size: 24px !important; line-height: 1.25 !important; }
  .veris-compare-list li { font-size: 15px; }
}

/* ---- Steps beside a photo (WO-2026-060 task 4; task 5 reuses it) ---------
   kit-sections stepsWithPhoto(): the heading over the photo on the left
   (1fr), the numbered steps on the right (1.15fr), 100px apart at 1440, as
   in the Audit mockup. The photo is 4:3 cover-cropped with 16px corners,
   placed by its object-position so the subject's head stays in frame.
   One column under 1200px, as every photo-beside-copy row (textWithImg)
   stacks there. Side by side, from 1200px, the photo is centred on the
   steps (Will, 2026-10-26, review of WO-2026-060: "the image needs to be
   justified according to the text. Aligned."): the intro column gives way
   to a grid of two rows, the heading across both columns in the first,
   then the photo and the steps beside it in the second, centred on each
   other. The photo fills the row's height (cover-cropped), 4:3 at least,
   so the heading stands 35px above it: a 4:3 photo centred on taller
   steps sat 100-390px under the heading (round 2 of that review). A photo
   whose people reach its edges caps its height at --veris-steps-max times
   its width (stepsWithPhoto() `maxRatio`; Tax's five partners) and is
   centred in the row. The two columns match a textWithImg() row's (half
   each, 24px apart), so the photo is the size of the photos beside copy
   (Will, 2026-10-27). viewport-check (21) holds the centring and a
   heading-to-photo gap of 120px at most. */
.veris-steps-photo-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 40px; align-items: start; }
.veris-steps-photo-head { margin-bottom: 35px; }
.veris-steps-photo-title { margin: 0; color: #1b2b3d; text-wrap: balance; }
/* "3-Step" never breaks at its hyphen (keepHyphenated); an inline-block
   so the span paints the line's box, not the taller glyph box. */
.veris-steps-photo-title .veris-nowrap { display: inline-block; }
.veris-steps-photo-lead { margin: 18px 0 0; }
.veris-step-lead { margin: 0 0 10px; color: #1b2b3d; font-size: 17px; line-height: 1.6; }
@media (max-width: 1199px) { .veris-steps-photo-img { max-height: 440px; } }
@media (min-width: 1200px) {
  .veris-steps-photo-grid { container-type: inline-size; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: auto auto; column-gap: 24px; row-gap: 0; }
  .veris-steps-photo-intro { display: contents; }
  .veris-steps-photo-head { grid-column: 1 / -1; grid-row: 1; max-width: 860px; }
  .veris-steps-photo-img { grid-column: 1; grid-row: 2; align-self: center; height: 100%; max-height: calc((100cqi - 24px) / 2 * var(--veris-steps-max, 100)); }
  .veris-steps-list { grid-column: 2; grid-row: 2; align-self: center; }
}
.veris-steps-photo-img { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: 16px; }
.veris-steps-list { margin: 0; padding: 0; list-style: none; }
.veris-step { display: flex; gap: 28px; padding: 32px 0; border-bottom: 1px solid #dae2e9; }
.veris-step:first-child { padding-top: 0; }
.veris-step:last-child { padding-bottom: 0; border-bottom: 0; }
.veris-step-num { flex: 0 0 auto; min-width: 1.6em; padding-top: 6px; color: var(--Primary); font-size: 15px; line-height: 1.3; font-weight: 700; }
.veris-step-title { margin: 0 0 14px; color: #1b2b3d; font-size: 24px !important; line-height: 1.3 !important; font-weight: 600; }
.veris-step-text { margin: 0; color: #627080; font-size: 17px; line-height: 1.75; }
@media (max-width: 767px) {
  .veris-steps-photo-grid { gap: 32px; }
  .veris-steps-photo-head { margin-bottom: 24px; }
  .veris-step-lead { font-size: 16px; }
  .veris-step { gap: 18px; padding: 24px 0; }
  .veris-step-title { font-size: 20px !important; margin-bottom: 10px; }
  .veris-step-text { font-size: 16px; }
}

/* ---- Centred card-row heading (WO-2026-060 task 4) ------------------------
   boxIcons({ center }): the mockup's "Why … Choose Veris" heading, one
   centred h2 of at most 860px over the cards, 46px above them; left on a
   phone, as the mockup sets it. */
.heading-section.veris-heading-center { margin-bottom: 46px !important; }
.heading-section.veris-heading-center .left { max-width: 860px; margin: 0 auto; }
.heading-section.veris-heading-center .heading-title { font-size: clamp(30px, 3vw, 42px); line-height: 1.2; text-wrap: balance; }
@media (max-width: 767px) {
  .heading-section.veris-heading-center { text-align: left !important; margin-bottom: 28px !important; }
}

/* ---- Closing call to action (WO-2026-060 task 4) --------------------------
   kit-sections ctaBand(): solid Veris blue, the heading left at the h2
   scale and wrapping to two lines as the mockup's, the white button right;
   stacked on a phone. */
.veris-cta-band-row { display: flex; align-items: center; justify-content: space-between; gap: 32px; }
.veris-cta-band-title { margin: 0; max-width: 11em; text-wrap: balance; }
@media (max-width: 767px) {
  .veris-cta-band-row { flex-direction: column; align-items: flex-start; gap: 28px; }
}

/* ---- Service hero pages: phone heading scale (WO-2026-060 task 4) ----------
   Below 768px the kit sets every h2 to 20px (28px to 575px), half the hero's
   40px h1 and smaller than a card title, where the Audit mockup keeps its
   section headings at about 0.7 of the h1 (32px against 44px). On a page
   that opens with serviceHero() the h2s keep that proportion: 28px. */
@media (max-width: 767px) {
  .wrap-page-header:has(.veris-svc-hero) ~ main :is(h2, .h2):not(.visually-hidden) { font-size: 28px !important; line-height: 1.25 !important; }
}

/* ---- Office map (WO-2026-060 task 7) ---------------------------------------
   officeMap() in scripts/kit-sections.mjs: the map at its own ratio in a
   rounded frame, a 44px button centred on each pin (left/top in percent of
   the image, so it tracks the image at every width), and a native popover
   card per pin. The buttons and cards sit outside the frame's overflow clip.
   assets/js/veris.js ("Office map") measures the card and sets its left
   and top (.is-placed) before it shows. With
   JavaScript off the card opens where the browser puts a popover, centred
   (margin: auto, the popover default, over the kit's * reset and the band
   spacing rule that zeroes a last block's margins). */
.veris-map { position: relative; }
.veris-map .veris-frame img { display: block; width: 100%; height: auto; }
.veris-map-pin {
  position: absolute; width: 44px; height: 44px; margin: -22px 0 0 -22px; padding: 0;
  border: 0; border-radius: 50%; background: transparent; cursor: pointer;
}
.veris-map-pin:hover { background: rgba(20, 121, 189, .16); }
.veris-map-pin:focus-visible { outline: 3px solid var(--Primary); outline-offset: 0; background: rgba(20, 121, 189, .16); }
.veris-map-card {
  width: min(280px, calc(100vw - 32px)); margin: auto !important; padding: 20px 24px; border: 1px solid #dae2e9;
  border-radius: var(--veris-radius-md); background: #fff; color: #627080;
  box-shadow: 0 12px 32px rgba(16, 31, 48, .18); font-size: 16px; line-height: 1.5;
}
.veris-map-card.is-placed { position: absolute; inset: auto; margin: 0 !important; }
.veris-map-card p { margin: 0; }
.veris-map-card-title { font-weight: 600; font-size: 18px; line-height: 1.4; color: #1b2b3d; margin-bottom: 6px !important; }
.veris-map-card-phone { margin-top: 6px !important; }
.veris-map-card-phone a.link { color: #1b2b3d; }
.veris-map-card-phone a.link:hover { color: var(--Primary); }
.veris-map-card-more { margin-top: 10px !important; }

/* ---- Secondary colour (Larry, 2026-10-26) -------------------------------
   Primary #1479bd (--Primary), secondary #40bdff (--Secondary, both in the
   kit's styles.css). The secondary is a light sky blue: 2.11:1 on white, so
   it never carries text or a meaningful mark on a light ground. On deep navy
   it is 7.89:1 (6.81:1 on the #1b2b3d testimonial cards), so it is the
   accent on the dark surfaces: the footer, navy bands and their cards.
   The alternate, charcoal #414042 (--Alternate, Larry, 2026-10-26), keeps
   the secondary from repeating: it is 10.31:1 on white but 1.62:1 on
   navy, so it takes the same roles on the light surfaces instead. */
.testimonial.style-default .name { color: var(--Alternate) !important; }
a.link.veris-inline-link:hover { color: var(--Alternate); }
.veris-band-solid a.link.veris-inline-link:hover { color: #fff; }
#footer a:not(.tf-btn):hover { color: var(--Secondary); }
#footer .veris-social a { border-color: var(--Secondary); color: var(--Secondary); }
#footer .veris-social a:hover { background: var(--Secondary); border-color: var(--Secondary); color: #101f30; }
#footer :focus-visible { outline-color: var(--Secondary); }
.veris-band-navy a.link.veris-inline-link { color: var(--Secondary); }
.veris-band-navy .testimonial.style-default .name { color: var(--Secondary) !important; }
.veris-band-navy .sw-dots .swiper-pagination-bullet-active { background-color: var(--Secondary) !important; }
.veris-band-navy :focus-visible { outline-color: var(--Secondary); }

/* ---- Footer copyright and credits (Larry Collett, 2026-11-02) -------------
   One step under the kit's text-body-2 (16px/24px; the kit's own 12px under
   576px stays). It shares the bottom bar with Privacy Policy and the
   Accessibility Statement, so it takes the row's free width and wraps. The
   credits are links inside a sentence: underlined (never colour alone),
   inline, not the 44px tap rows the other footer links get on a phone. */
#footer .footer-bottom .veris-copyright { flex: 1 1 420px; margin: 0; }
@media (min-width: 576px) {
  #footer .footer-bottom .veris-copyright { font-size: 14px; line-height: 22px; }
}
#footer .veris-copyright a.veris-credit-link {
  display: inline; min-height: 0;
  text-decoration: underline; text-underline-offset: 3px;
}
