/*
Theme Name: Impreza Child
Template: Impreza
Version: 1.1
Author:	UpSolution
Theme URI: http://impreza.us-themes.com/
Author URI: http://us-themes.com/
*/

/* =============================================================================
   GPS — project layer.

   Loads AFTER assets/css/ab-base.css (see functions.php), so everything here
   overrides the base without !important.

   What does NOT belong in this file:
     - heading sizes / body copy size  → Theme Options → Typography
     - colours                         → palette variables only
     - section vertical padding        → the row's `height` param
     - grid gutter maths, narrow-*, col-*, p-*, r-*  → ab-base.css


   CLASS CONVENTIONS
   -----------------
   Written down because without them a four-page site ends up with a new class
   per element per section. Measured on this project before the rules landed:
   117 project classes, 22 of them pure typography for SEVEN design tokens, and
   54 existing to carry a single declaration.

   1. THREE LAYERS.
        ab-base.css        project-independent, value-identical everywhere.
                           Tokens, grid, structural utilities. No colours, no type.
        this file, top     the DESIGN SYSTEM — roles and components.
        this file, per page  ONLY geometry that exists in one place.

   2. THE NAMES ARE A SHARED VOCABULARY ACROSS PROJECTS.
      ab-base travels between projects by value; the layer above travels by NAME.
      The next client's style.css should also define `eyebrow`, `media-card`,
      `check-list` — different values, same words. Adding a name is a decision
      about the agency's system, not about this page.

   3. TEXT IS A ROLE, NEVER A PLACE.
      The roles, matching the text tokens a design file actually has. Body copy is
      NOT among them — that is Theme Options:
        h2-style h3-style h4-style h5-style eyebrow handwriting-style
      (body copy needs no class — it is Theme Options → Global Text)
      Plus ONE modifier, `is-accent` (italic + accent colour), which covers every
      "Heading X Italic" token and every pull-quote. If a would-be new class
      differs from an existing one only in font-size, it is not a new class.
      There is no such thing as a `-lede`, `-title` or `-quote` class per section.

   4. COMPONENTS GET GENERIC NAMES, NO PAGE PREFIX.
        eyebrow-pill  media-card  quote-block  check-list  icon-card  step-item
        badge-row  offer-panel  section-mark  image-band  cta-band
      A page prefix (home-, mm-) means "this geometry exists once". If the thing
      recurs — even on a page not built yet — it has no prefix.

   5. STYLE CHILDREN BY STRUCTURE, NOT BY ADDING CLASSES.
      Inside a component, reach for what Impreza already emits:
        .step-item h3            .step-item .w-btn
        .media-card > .wpb_text_column
      The role classes above cover the rest, so per-child classes are almost
      never needed. Stick to STABLE hooks — a tag, .w-btn, img. Avoid nth-child:
      reorder the elements in the builder and the styling swaps silently.

   6. A COMPONENT'S BASE IS NEVER PAGE-SCOPED.
        .media-card                        { }   the component, everywhere
        .media-card > .wpb_text_column     { }   its children, everywhere
        .home-offer-section .media-card    { }   ONLY what deviates here
      Writing the base under a page scope means writing it once per page, which
      is exactly how the duplicates above got made.

   7. COMPOUND THE IMPREZA ELEMENT CLASS ONTO COMPONENT AND SECTION CLASSES.
        .w-vwrapper.split-copy-vwrapper          not  .split-copy-vwrapper
        .w-hwrapper.footer-offer-hwrapper        not  .footer-offer-hwrapper
      Two reasons. Specificity: the bare form is 0-1-0 and ties with Impreza's own
      `.w-hwrapper`, so it wins only because theme-style is enqueued after
      us-style — on load order, not on merit. Measured today: `align-items` on the
      bare form was in exactly that tie. And it self-documents the element type,
      so the selector answers "what is this?" without opening the builder.

      DOES NOT apply to role or utility classes. `eyebrow`, `is-accent`,
      `narrow-el-10` must stay element-agnostic or they cannot be reused across
      element types.

   8. PARAGRAPHS ARE `vc_column_text`, NOT `us_text`.
      Body copy goes in a WPBakery text block, so the markup is `.wpb_text_column`
      wrapping real `<p>`. `us_text` keeps its content in an ATTRIBUTE
      (`text="…"`, entity-encoded, one line) and renders `.w-text-value` — fine for
      a single line, wrong for prose: no second paragraph, no inline link, no
      `<strong>` without fighting the encoding. Rule 5's own example
      (`.media-card > .wpb_text_column`) assumes this.

      Two exceptions, both real:
        - HEADINGS stay `us_text`, because that is where the `tag` param lives —
          `tag="h3"` is what emits a real <h3>.
        - a genuine one-liner (a label, a name, a citation) is fine as `us_text`;
          there is no prose to hold.

      WATCH THE SPACING when mixing them inside a `us_vwrapper`: `wpb_text_column`
      brings its own `p` bottom margin, which stacks on top of the wrapper's
      `inner_items_gap`. Zero the `p` margin on the last child, or set the gap
      knowing the margin is there — do not discover it as a mystery 24px.

   9. NEVER NEST A SHORTCODE INSIDE ITSELF.
      No `us_hwrapper` inside an `us_hwrapper`, no `us_vwrapper` inside an
      `us_vwrapper`. WordPress's shortcode regex matches an opening tag against
      the FIRST matching closer, non-greedily — so on

        [us_hwrapper A] … [us_hwrapper B] … [/us_hwrapper] … [/us_hwrapper]

      the outer element swallows only up to B's closer, and everything after it
      — including the final `[/us_hwrapper]` — is printed on the page as literal
      text. This is not an Impreza bug and no amount of escaping fixes it; it is
      why WPBakery ships `vc_row_inner` / `vc_column_inner` as separate tags in
      the first place. UpSolution's wrappers have no `_inner` twin, so the
      structure has to change instead.

      Two ways out, in order of preference:
        - alternate the tags (`us_hwrapper > us_vwrapper > us_iconbox` is fine —
          different names nest freely, and one level of each is usually all a
          layout needs);
        - collapse the inner row into one `vc_column_text` and mark the parts up
          inline (`<strong>`, a `<span>`) — see `.price-line`.

      Cheap check before writing a page: for each of `us_hwrapper` and
      `us_vwrapper`, walk the string keeping a depth counter for THAT tag alone.
      If it ever reaches 2, the page is already broken.
   ============================================================================= */

:root {
	/* Must match what Impreza emits: .g-cols.via_flex.type_default
	   { margin: 0 -15px } → 30px. Verified on this site. */
	--grid-gutter: 30px;

	/* --site-content-width is NOT set here. Impreza emits it inline and that
	   wins over this file anyway; mirroring the Theme Options number (1260px)
	   only invited a 20px error, because what Impreza actually emits is
	   1280px. ab-base reads it straight from the theme. */

	/* The one step ABOVE body size. ab-base stops its ladder at --fs-lg (17px)
	   and says to add this only when a non-heading size above 17 actually turns
	   up — it has: Figma's Body/Body text token is Geist 18/27, and the FAQ
	   accordion answers are set in it (1795:1253). It lives here rather than in
	   ab-base so the shared file stays the agency's verbatim copy; move it up a
	   layer the day a second project needs it.

	   Global Text stays 16px — this is a step, not a new base. */
	--fs-xl: 1.125rem;     /* 18px */
}


/* =============================================================================
   Typography helpers
   ============================================================================= */

/* ab-base already gives `h1`–`h6` `text-wrap: pretty`, so a heading that is a
   real heading TAG has always had it. The role classes did not: `us_text` with
   no `tag=` renders a plain `<div>`, and half the headings on this site are
   exactly that — the hero's second line on Self Assessment measured
   `text-wrap: wrap` and broke 570 / 59, the one-word last line `pretty` exists
   to prevent. With this it breaks 503 / 126.

   Listed as the class equivalents of ab-base's tag rule rather than added to
   ab-base itself: that file stays the agency's verbatim copy.

   Deliberately FIRST in this file, before any component. Two places want
   `balance` instead — `.program-item-title` and the media card's caption — and
   at the same 0-1-0 weight the later declaration wins, so those keep their own
   value without needing `!important` or a longer selector. */
.h1-style,
.h2-style,
.h3-style,
.h4-style,
.h5-style,
.h6-style {
	text-wrap: pretty;
}

/* <span> inside a heading renders as the italic accent word — used by the
   hero and section headings across the site.

   Both element types are listed because the same accent run turns up in a
   heading (us_text → .w-text-value) and mid-sentence in prose (vc_column_text →
   .wpb_text_column). Figma calls the two "Heading XS" and "Heading XS Italic";
   they differ only by italic and colour, so one rule serves both.

   The colour is Alternate Content → Primary: Figma's accent token is "Blue Dark"
   #658AC4, which the palette holds there. (As of 2026-08-20
   color_alt_content_heading carries the same #658AC4 — it used to be #6E95CE
   from the previous design — so either would resolve alike today. Primary is
   still the honest slot: this is an accent, not a heading.) */
.w-text .w-text-value > span,
.wpb_text_column p > span {
	font-style: italic;
	color: var(--color-alt-content-primary);
}

/* NO `body-style` CLASS, ON PURPOSE.

   Figma has one body token — Geist Regular 18/27 — and that is what Theme Options
   → Typography → Global Text is now set to (it was 16/30, which is why every
   section had grown its own `-lede` class). Prose in a `vc_column_text` therefore
   needs NO class at all; it inherits.

   The general lesson, third time today after h3/h4 and h5: a role class that
   restates a Theme Options value is a patch for a wrong setting. Fix the setting.
   A role class earns its place only when the design asks for something the tag
   scale genuinely does not carry — `is-accent` does, `body-style` did not. */

/* The accent modifier. Covers Figma's "Heading S Italic" and "Heading XS Italic"
   tokens and every pull-quote: those are not separate roles, they are a heading
   role wearing this. Composes — `h5-style is-accent`. The <span> rule above is
   the same treatment applied inline, for an accent word inside a heading. */
.is-accent {
	font-style: italic;
	color: var(--color-alt-content-primary);
}

/* The italic on its own, ink untouched. Figma's "Heading S Italic" appears in
   two inks: Blue Medium, which is `is-accent`, and plain Deep Blue heading ink
   (1692:2187, the photo-strip lead-in). The second one is the tag scale wearing
   nothing but the slant, so it gets the slant and nothing else — `is-accent`
   would silently repaint it.

   `is-accent` is deliberately NOT rewritten as `is-italic` plus a colour: that
   would let `is-accent` be cancelled by dropping half of it, and the accent
   treatment is one thing in the design, not two that happen to co-occur. */
.is-italic {
	font-style: italic;
}

/* The narrative block — a run of prose carrying a section's story, set denser
   and heavier than Global Text and in heading ink: Geist Medium 17/26 in Deep
   Blue against the body token's Regular 18/27 in grey.

   This is the ONE named role for that treatment, not a class per section —
   confirmed by both blocks that use it: the Mastermind journey band (1692:2200)
   and the events band (1692:2201) carry the same 17/26 Medium in Deep Blue,
   centred, split into paragraphs. Sizes are rem so the scale still moves with
   Global Text.

   It earns the name precisely because it recurs. Figma otherwise defines a
   single body token and hand-sets paragraphs around it (15/25 Medium turns up
   too, and THAT one is `--fs-md`, not a third role) — a size that appears once
   is drift and belongs to no class. */
.narrative {
	font-size: var(--fs-lg);
	font-weight: 500;
	line-height: 1.53;
	color: var(--color-content-heading);
}

/* Figma separates the sentences by a full blank line rather than the theme's
   paragraph indent. */
.narrative p + p {
	margin-top: 1.53em;
}

/* Decorative/Subheading — Platypi SemiBold 13/22, no tracking, Blue Dark, caps.
   Moved out of ab-base (see the note there): the values are per-project.
   The pill chrome is deliberately a SEPARATE class, so the role can be used
   without a pill on a page that wants a bare kicker. */
.eyebrow {
	font-family: var(--h1-font-family);
	/* `--fs-xs` IS 13px and `--fs-sm` is 14. The comment above has said 13/22 since
	   this rule was written, and the ladder has always had a 13 — the rule simply
	   reached for the wrong token, and every eyebrow on the site rendered a pixel
	   over. Ruttl iPad `U5MOBrkYJs1ScDPEvgpz` "manji fs" is what surfaced it: on the
	   Mastermind hero the pill measured 344px inside a 348px column, so one extra
	   pixel of type was the difference between a pill and a full-width bar.
	   Corrected globally, because it is wrong at every width — Figma draws the
	   eyebrow frame 26 tall with 22px text in EVERY instance across the file, and
	   `line-height: 1.692` below was already derived as 22/13, so it lands on
	   exactly 22 now instead of 23.7. */
	font-size: var(--fs-xs);
	font-weight: 600;
	line-height: 1.692;
	letter-spacing: 0;
	text-transform: uppercase;
	color: var(--color-alt-content-primary);
}

/* A form field's label wears the same Decorative/Subheading token as `.eyebrow`
   (890:2796) but NOT its ink — a label takes its colour from whatever scheme
   the form sits on, Blue Medium on the navy Contact band and Blue Dark on a
   light one. So the typography is repeated here rather than the class being
   added to the markup: `us_cform` builds its own label element and there is no
   `el_class` to reach it with.

   The 8px is the design's own label-to-field gap; Impreza's default is larger. */
.w-form-row-label {
	font-family: var(--h1-font-family);
	font-size: var(--fs-sm);
	font-weight: 600;
	line-height: 1.692;
	letter-spacing: 0;
	text-transform: uppercase;
	margin-bottom: 8px;
}

/* Caveat 36/42 in the same "Blue Dark" — Figma's Decorative token.

   FLUID since 2026-09-09. Ruttl flagged it from both narrow widths, on the same
   element, in the same words: iPad `bznCsTF34yIMtm0eBAFj` "ovaj font size moze
   da se smanji svuda na tabletu", iPhone `S3XcLCypRL5LOopOFxaP` "ovaj tekst je
   generalno svuda veliki". It was a flat 36px at every width — the desktop
   artboard's number applied everywhere, because there is no tablet or phone
   frame in the Figma file to say otherwise.

   Anchored clamp, by the project's own formula (see [[impreza-typography]]):
   floor lands at 600px, ceiling at the 1280 content width.

     slope = (36 - 27) / ((1280 - 600) / 100) = 1.32vw
     base  = 27 - 1.32 * 6                    = 19.06px

   So it reads 27px on a phone, ~30px at 820, and is back to exactly 36px from
   1280 up — which is why the DESKTOP review is untouched by this. A clamp is
   also why this can serve both threads at once without a tablet-only override:
   it moves continuously instead of stepping, so there is no jump at a breakpoint
   edge and the two viewports never have to be kept apart.

   Its slope is its own — 1.32vw against h3's 1.18 and h4's 0.88 — so the ladder
   does not collapse in the laptop band. That trap is documented in the same note.

   `letter-spacing` went from -0.72px to -0.02em in the same move. Figma states it
   as -2%, and -0.72px IS -2% of 36 — correct while the size was fixed, and
   quietly wrong at every size once it is not.

   Only three elements carry this class site-wide: "Ken & Ernie" on Home and
   About Us, and "Amy Poehler" on Home. Checked by fetching all eight published
   pages, not assumed.

   FLOOR LOWERED 27 → 24, 2026-09-10 — `KTQHvQCmvi9jV62mqbfl`, iPhone, "malkice
   manji fs", pinned inside the About Us signature.

   The signature is a flourish and it should read as one, which is a statement
   about how much of the LINE it takes, not about its size against the body copy.
   MEASURED: "Ken & Ernie" is 141px wide in a 655px column at 1440 — 22% of the
   measure — and 106px in a 327px measure at 390, which is 32%. Half again as much
   line for the same three words. At 24 it comes back to 29%.

   Not taken further. The desktop's own 22% would put it at 18px, and an 18px
   signature under 16px body copy stops being a flourish and becomes a caption —
   she asked for "malkice", and one step is what that is.

   Re-anchored rather than floored, so nothing steps at 600: the ramp now runs 24
   at 390 to 36 at 1280 and passes through 26.8 at 600, where the old curve read
   27.0. The tablet is unchanged to within a fifth of a pixel (29.8 against 29.9
   at 820). */
.handwriting-style {
	font-family: Caveat, 'Lucida Handwriting', cursive !important;
	font-size: clamp(24px, calc(18.74px + 1.35vw), 36px);
	line-height: 1.16;
	letter-spacing: -0.02em;
	color: var(--color-alt-content-primary);
}

/* Thin rule under a small label. Width 100% so the rule spans the wrapper,
   not just the text run. */
.w-text.underline {
	width: 100%;
}

/* Two labels on Home wear `.underline` but are NOT the h6 label the tag styles.
   Figma, read off the file by him on 2026-08-28:

     home-calling  "As an owner, you have the chance to:"   Platypi 400, 17/28, -2%
     home-approach "We help practice owners:"               Platypi 500, 27/36, -2%, #212A60

   The h6 tag is 14px uppercase in Deep Blue, so both were rendering as a small
   caps label instead — same family and weight axis, wrong size, wrong case.

   Sizes are written as the project's own tokens rather than the Figma pixels:
   `--fs-lg` IS 17px and `--h4-font-size` tops out at exactly 27, so at the 1440
   artboard both land on the design's number and below it they ride the ladder
   instead of freezing. Line heights are the ratios of the stated pairs — 28/17
   and 36/27. `text-transform: none` because the design draws them in sentence
   case; the h6 default would upper-case them.

   No hairline under either — his call, 2026-08-28, the design does not draw one.
   The `underline` class is gone from both in the builder rather than the rule
   being cancelled here, so nothing carries a decoration it then has to undo; the
   class still means what it says everywhere else it is used. That is also why
   these two are addressed by tag: with the class gone there is nothing else on
   them. */
.home-calling-section h6.w-text {
	font-size: var(--fs-lg);
	font-weight: 400;
	line-height: 1.647;
	letter-spacing: -0.02em;
	text-transform: none;
	/* Label to list: 32px, the inner gap of the same auto-layout column the 54px
	   below comes from (1685:1773). Impreza's default element spacing put it at
	   24. His call, 2026-09-09 — not a Ruttl thread, so nothing to resolve for it.
	   The approach band's label reads 32 in the design too; left alone until it
	   is asked for, so this stays scoped to the calling band. */
	margin-bottom: 32px;
}

.home-approach-section h6.w-text {
	font-size: var(--h4-font-size);
	font-weight: 500;
	line-height: 1.334;
	letter-spacing: -0.02em;
	text-transform: none;
	color: var(--color-content-primary);
}

.w-text.underline::after {
	content: '';
	display: block;
	height: 1px;
	width: 100%;
	margin-top: 2px;
	background-color: var(--color-alt-content-primary);
}

ul,
ol {
	margin-left: var(--space-sm);
}

li {
	margin: 0 0 var(--space-3xs);
}


/* =============================================================================
   Shared components
   ============================================================================= */

/* Pill chrome only — the type comes from `.eyebrow`, so markup reads
   `el_class="eyebrow eyebrow-pill"`. Figma 1692:2238: Grey-Light #EBEBEA ground,
   2px 21px, fully round. `width: fit-content` because us_text renders a block and
   the pill has to hug its label.

   The caps ARE in the design here — verified by screenshotting the node, not by
   reading the generated code, which reports uppercase for at least one other node
   in the same file that renders title case.

   RADIUS IS 1rem, NOT `--radius-pill` (2026-09-11). Ruttl `IOhJ5VnKmkzA1lJYya4A`
   on the Self Assessment hero, iPad: "kod ovakvih slucajeva mozda mozemo da
   podesimo da border radius bude manji?". The pin lands on the video pill, which
   is `width: 100%` by design and therefore ALWAYS wraps — at 820 it measures
   269 x 85 (three lines) and at 1920 still 412 x 68 (two). A 999px radius on a
   box that tall is not a pill, it is a stadium: 42.5px of curve either end.

   1rem is the half-height of the TALLEST single-line pill on the site, so it
   changes nothing for the pills that are meant to be round. CSS clamps a radius
   to half the box: desktop 26 tall -> 13, tablet 24 -> 12, phone 32 -> 16 (the
   phone pill carries `padding-block: 8px`, see the 600 block). All three render
   exactly as before. Only a WRAPPED pill sees the difference, which is the case
   she flagged and the only case there is.

   NOT a change to `--radius-pill`. Buttons ride that token and they stay round. */
.eyebrow-pill {
	display: inline-block;
	width: fit-content;
	padding: 2px 21px;
	border-radius: 1rem;
	background: var(--color-alt-content-bg);
}

/* The eyebrow sits TIGHTER to the heading than the wrapper's own rhythm.

   Ruttl iPad `3lm0YNBVlWSJHGi3sKdg` "manji razmak", pinned at y=42 — the gap
   between the eyebrow and the H1, not the wrapper as a whole. Impreza gives every
   child of a vwrapper the same `margin-bottom` (28.8px here, from
   `inner_items_gap="1.8rem"`), so all four gaps in that column measured 29.
   The design does not: on the Mastermind hero the eyebrow frame ends at 218 and
   the H1 starts at 236, which is 18.

   Applies to all four heroes that carry an eyebrow — Mastermind, 1-on-1, About Us
   and Self Assessment. There is no page class on the hero section to scope it
   narrower (just `hero-section`), and `hero-*` is deliberately un-prefixed as a
   shared component, so treating the four alike is the system's own logic rather
   than a shortcut. Worth stating plainly though: 18px is measured from the
   MASTERMIND frame only. The other three were not checked.

   NOT applied to the other eyebrows on those pages. The design's gap under an
   eyebrow varies by section — 24 under "GPS FRAMEWORK" and "What's Included",
   17 under "Member Bonuses", 16 under "What You'll Implement" — so there is no
   single number to push down into `.eyebrow-pill`, and only the hero was flagged. */
.hero-copy-vwrapper > .eyebrow {
	margin-bottom: 18px;
}

/* Small brand mark set above a section heading. Size only — where it sits is the
   section's business (see .split-copy-vwrapper .section-mark, which hangs it in
   the gutter). */
.w-image.section-mark img {
	width: 47px;
	height: auto;
}

/* The 1-on-1 journey band — one figure, both sides of the heading.

   Four threads and, unusually, one on EVERY device: `xHApWUEjWvLWjPyNqRFs`
   (Desktop), `dgYnaoJF2DMCX17nf67k` (iPad) and `VyM7eZF9DwYwTaXDWaTB` (iPhone)
   all say the same thing about the same band, and their pins all land in its
   BOTTOM PADDING — measured 96 / 96 / 64 against section heights of 286 / 279 /
   243. When a complaint survives all three widths it is a value, not a
   responsive problem, so this needs no media query at all. The fourth,
   `bSGKM9kxeIKuPs4eXisR`, pins y=0.7 above the heading and asks for MORE: the
   mark sits flush against it, gap 0.

   Figma `1692:2513` answers both with the same number. The mark `1692:2682` ends
   at 926 and the heading `1692:2674` starts at 964 — 38. The heading ends at
   1007 and the image band `1692:2864` starts at 1045 — 38 again. The design puts
   an equal 38 above and below the line, which is why she reads one side as too
   tight and the other as too loose at the same time.

   38 is deliberately off the `--space-*` ladder (which steps 30, 40, 50). It is
   measured twice from the frame rather than rounded to `--space-lg`, in keeping
   with the rest of this file.

   The next section carries no top padding of its own (`oo-journey-band-section`,
   measured 0), so the section's own bottom padding IS the whole gap.

   The bottom padding is page-scoped because only this band was measured for it.
   The gap ABOVE the heading is not — see the rule below. */
.l-section.oo-journey-section {
	padding-bottom: 38px;
}

/* The mark-to-heading gap, on the component. His call, 2026-09-10: "uradi isto
   na svim stranama".

   Marija raised it once, on 1-on-1. Inventoried across all six pages, the mark
   appears eight times in two distinct jobs, and only the first job is this one:

     IN FLOW, centred above a heading, gap measured 0 — `oo-journey-section`,
     `mm-journey-section`, `mm-events-section`, `mm-pricing-section`.

     ABSOLUTE, hung in the left gutter beside the copy, gap measured -51 —
     `home-about-section`, `about-story-section`, `about-roots-section`,
     `faq-story-section`. Those are `.split-copy-vwrapper .section-mark`, taken
     out of flow on purpose further up this file.

   Which is why this is safe as a base rule rather than four page-scoped ones:
   `margin-bottom` on an absolutely positioned box changes nothing, so the four
   hung marks cannot be disturbed by it. Verified `position: absolute` on all
   four before writing this.

   38 is Figma's figure in three of the four frames — Mastermind's journey
   (`1692:2207` ends 926, heading `1692:2199` starts 964), its events band
   (`1692:2048` ends 5487, heading `1692:2047` starts 5525) and 1-on-1's journey
   (`1692:2682` ends 926, heading `1692:2674` starts 964). Three independent
   frames, one number.

   Self-Assessment and Contact carry no mark at all. */
.w-image.section-mark {
	margin-bottom: 38px;
}

/* The fourth in-flow instance is the exception, and it is the design's own: on
   the pricing panel the mark is LEFT-aligned rather than centred, and Figma sets
   it tighter — `1692:2322` ends at 9538 against the heading `1692:2305` at 9555,
   so 17. Kept as a separate figure rather than averaged into the 38 above,
   because the alignment is what differs, not the drawing. */
.mm-pricing-section .section-mark {
	margin-bottom: 17px;
}

/* Every navy band runs its text on Blue Medium, not on white. Impreza's
   `primary` scheme paints the background from Content → Primary and then
   defaults the text to white, which this design never uses: measured on Home
   "We Offer" (1685:1955) and on Mastermind's "What's Included" (1692:2180) and
   "Member Bonuses" (1692:2304), all #B7D6F4.

   Set on the SECTION, not on the text elements: Impreza's
   `.l-section[class*="color_"] h1..h6 { color: inherit }` is 0-2-1, so headings
   follow the section and out-specify anything aimed at `.w-text` (0-2-0). One
   rule covers headings, body and buttons alike — and `.l-section` is compounded
   on so it ties Impreza's own 0-2-0 and wins on order, the child stylesheet
   loading last.

   Keyed on the SCHEME rather than on a page class: it used to be written once
   per section, which is how the same declaration ended up needing a third copy.
   A band that genuinely wants white text overrides it locally. */
.l-section.color_primary {
	color: var(--color-content-secondary);
}

/* …with one exception. The Home "calling" band keeps the scheme's white — it is
   the only navy band in the design that does. Verified on the live page before
   the rule above was generalised; if the design says otherwise, delete this and
   nothing else changes. */
.l-section.home-calling-section {
	color: var(--color-content-bg);
}

/* Full-bleed photo strip.

   The ratio is STATED rather than left to whichever file sits in the slot. The
   design's band is 1440x670 (2.149) and the three photos in use were all cut to
   it by hand — 450 is 2.150, 376 is 2.141, 377 is 2.136 — so this changes
   nothing today: at 1425 wide the biggest move is 4px of height. What it buys is
   that the NEXT photo, on Contact or FAQ or anywhere the band gets reused,
   cannot change the height of the band; Impreza's own `.w-image img
   { object-fit: cover }` takes the surplus off the sides instead.

   The phone override in the ≤600 block states 3/2 for the same reason. It has to
   MATCH this selector's (0,2,1) to do it — written shorter it loses on
   specificity and never fires, which is what happened for two weeks. */
.w-image.image-band img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1440 / 670;
}

/* Pull-quote with a hairline down its left edge — Figma Frame 326 / 381: rule at
   x=358, copy 44px to its right, attribution 27px under the quote, rule running
   the block's full height.

   Rendered by Grid Layout 406, and ONE DECLARATION PAIR IS ALL THIS NEEDS —
   everything else already lives in the Grid Builder, which is the right owner:

     colours       both fields → Alternate/Secondary = #4D6D9E, which is what
                   Figma 1692:2210 specifies. The layout prints it with
                   !important, so CSS here could only fight it. The rule below
                   reads the same slot — the whole block is one colour.
     quote type    Platypi Medium Italic 20/26 via `h5-style` on the element
     name type     Geist Medium 15/25, tag `div` (an h6 would arrive uppercase
                   in the heading face — that was the one real trap here)
     em dash       the field's "Before" text, so it stays selectable and
                   visible to assistive tech. Do NOT re-add it as a ::before;
                   that is how you end up with two dashes.
     27px gap      the element gap between the two fields

   Width is not set here either: it is `narrow-el-7` on the post list, so the
   component stays width-agnostic.

   `border-left` rather than a pseudo-element: the rule is the block's full
   height by definition, so there is nothing to position. */
.w-grid.ab-border-left-testimonial .w-grid-item-h {
	padding-left: 2.75rem;
	border-left: 1px solid var(--color-alt-content-secondary);
}

/* Head of the split testimonials band — heading and button on the left, cards on
   the right. The same block on Mastermind (1692:2339), 1-on-1 (1692:2811) and
   About (1700:3457), which is why it carries no page prefix.

   Figma: Platypi Medium Italic 64/75, tracking -1.28 (-0.02em), in Blue Medium
   ON WHITE — the band behind it (1692:2044) is white, so this is ~1.5:1
   contrast. That is a deliberate soft display treatment, the same move as the
   step numbers, not an oversight. Do not "fix" it to Deep Blue.

   No role class: neither 64px nor this colour belongs to a heading token, and a
   class that exists for one component part is exactly what rule 3 forbids. So it
   is styled by structure — the h2 is a stable hook.

   The cap is reached at the design's own 1440 canvas (64/1440 = 4.44vw) and held
   above it, rather than growing with the viewport the way h1 does. */
.testimonials-head-column h2 {
	font-size: clamp(2.5rem, 4.44vw, 4rem);
	font-style: italic;
	line-height: 1.172;
	letter-spacing: -0.02em;
	color: var(--color-content-secondary);
}

/* Ten columns wide, measured BOX to BOX rather than content to content.

   `narrow-section-10` would be the obvious class, but it resolves to
   `--col-step * 10 - --grid-gutter` — N columns of CONTENT plus the gutters
   BETWEEN them. That is right when the element's edges are content edges. Here
   the two cards are flush and their fills run to the column boxes, so the
   section has to carry the outer half-gutter on each side too: exactly one more
   gutter, i.e. the full tenth step.

   Figma agrees: the card pair spans 176..1264 of a 1440 canvas = 1088, against
   1091.7 for ten steps at a 1280 content width.

   Worth promoting to ab-base as a modifier the day a second flush section wants
   it — the "narrow-* minus a gutter" definition is correct for every OTHER use,
   so this is a variant, not a bug in the utility. */
.testimonials-split-section > .l-section-h {
	max-width: calc(var(--col-step) * 10);
}

/* The gutter between the two cards is closed by `cols-flush` on the row, in the
   builder — not by a rule here. Zeroing only the column padding (the first
   attempt) leaves the row's own negative margin in place, so the pair ends up a
   full gutter wider than the section and hangs 15px over each edge; measured
   1121.6 against the section's 1091.7. `cols-flush` zeroes both, at Impreza's
   own specificity. */

/* White panel that sits over a photo. Four instances on the Mastermind page.

   It is an HWRAPPER holding an optional video poster and a vwrapper of copy:

     media-card (hwrapper)
     ├─ .w-image      the video poster — absent on the hero card
     └─ .w-vwrapper   prose + the Text Link button

   The hero card omits the poster and is otherwise identical — same padding, same
   type, same ground — so it is this component with an empty slot, not a second
   one. Checked against the design before splitting them: 1692:2190 pads 27px to
   its text, 1692:2415 pads 24px to its poster; that is one token's worth of
   drift in the file, not two components.

   The button must NOT be wrapped in an hwrapper the way it used to be: this
   element is an hwrapper now, and WordPress cannot parse a shortcode nested
   inside another of the same name — see [[shortcode-nesting-and-srcset]]. The
   card would render EMPTY, with its contents beside it, and nothing would warn
   you. Button Style 11 already handles the button's own layout.

   Base is the PANEL only — the positioning belongs to whichever section places
   it, or this gets rewritten once per page. */
.w-hwrapper.media-card {
	padding: 24px;
	background: var(--color-content-bg);
}

/* The poster is 130px wide and never shrinks — a flex child would otherwise give
   up width before the prose does. The design draws 117 (1692:2405, 1692:2419);
   his call, 2026-09-09, was to run it a little larger, and the card absorbs it:
   at 3:2 the poster is 87 tall against the copy's 84, so it sets the card's
   height by 3px and nothing reflows.

   Two shapes are allowed in the slot: a plain `us_image`, and a `us_popup` with
   `show_on="image"`, which is the same poster wired to open a `vc_video` in a
   lightbox. The popup renders its trigger as a real `<button>`, so it arrives
   with the UA's button chrome and has to be reset back to a bare image. */
.media-card > .w-image,
.media-card > .w-popup {
	flex: none;
	width: 130px;
}

.media-card > .w-popup .w-popup-trigger {
	position: relative;
	display: block;
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	cursor: pointer;
}

/* The play badge. Drawn here rather than taken from `vc_video`'s own
   `overlay_icon`: that one belongs to an INLINE player, and using it would mean
   giving up the lightbox. A pseudo-element costs no markup and no request.

   It is the YouTube glyph in YouTube red, and it straddles the poster's RIGHT
   EDGE rather than sitting in the middle of it — 2037:1288 on the Home frame
   draws a 52x40 icon centred on x=1053, which is the poster's edge, at the
   poster's own vertical centre. An earlier pass had a Deep Blue disc centred on
   the poster instead, arguing the platform logo belonged to YouTube; that was
   this file inventing a treatment the design never asked for, and it also broke
   with the rest of the site, where a video affordance is already the red brand
   mark (`.video-pill i`, and both testimonial grids). Red it is.

   Half the badge hangs into the gap beside the poster, so the card that carries
   one needs a wider `inner_items_gap` — 2.5rem, set in the BUILDER on the
   hwrapper, not here: Impreza writes `--hwrapper-gap` inline and it cannot be
   overridden without `!important`.

   The triangle sits right of the box's centre: a play triangle's visual centre
   is left of its bounding box, so a mathematically centred one looks tipped
   back. */
/* The Welcome band draws the same badge on a poster that is a plain `us_image`,
   not a popup trigger: there the video is opened by a `show_on="selector"` popup
   whose selector names BOTH the poster and the card's button, which is behaviour
   the `image` shape cannot reproduce (one popup, one trigger). So the badge is
   drawn on the poster itself and `.welcome-video-poster` is what marks a poster
   as a video poster rather than a picture — the pointer cursor for that shape
   still comes from the `us_image`'s own `css=` attribute, which is the only
   place Impreza will let it be set. */
.media-card > .welcome-video-poster {
	position: relative;
}

.media-card > .w-popup .w-popup-trigger::after,
.media-card > .welcome-video-poster::after {
	content: '';
	position: absolute;
	z-index: 2;
	top: 50%;
	left: 100%;
	width: 40px;
	height: 28px;
	transform: translate(-50%, -50%);
	background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 28'%3E%3Crect width='40' height='28' rx='7' fill='%23FF0000'/%3E%3Cpath d='M16.5 8.5 26.5 14l-10 5.5z' fill='%23fff'/%3E%3C/svg%3E")
		50% 50% / contain no-repeat;
}

/* The badge does NOT fade on hover — Ruttl, desktop, 2026-09-09: "skinemo
   transparentni hover sa play ikonice, da ostane samo na video sc". It used to
   drop to `opacity: 0.8` alongside the tint below, which read as the mark going
   half-transparent rather than as the picture dimming. The tint on the picture
   is the whole hover affordance now, and the badge stays solid over it — which
   is also why the two are on separate z-indexes (1 under, 2 over).

   Removed with it: the `transition: opacity` on the rule above. Nothing changes
   the badge's opacity any more, so the transition had nothing to animate.

   Both shapes lose it together — the popup trigger (Home hero) and the
   `.welcome-video-poster` (Mastermind Welcome band). She flagged the hero, but
   this is one component with one hover behaviour; leaving the poster fading
   would be two answers to the same question. */

/* Hover tint on the poster — his call, 2026-09-09, and the value is the
   DESIGNER's: Deep Blue #212A60 at 17%. It went through two takes first (the
   same navy at 40%, then #101531 at 25%) and she came back with this one, so do
   not re-derive it — it is a stated value, not a rounded guess.

   #212A60 is `--color-content-primary`, the site's own ink, so nothing new
   enters the palette. At 0.17 it lands as a slight dim with a trace of blue:
   on a mid-grey frame the luminance drops about 9% and the blue channel sits
   11 above the red. The red badge over it keeps its contrast.

   A `::before` so it does not fight the badge for the one pseudo-element the
   trigger already spends. It goes over the picture, which is unpositioned inside
   `.w-image-h`, and UNDER the badge — which needs SAYING: the first version gave
   the tint `z-index: 1` and left the badge on `auto`, and a positioned element
   with a z-index beats a positioned element without one no matter what the
   source order is, so the veil washed over the YouTube mark. The pair is 1 and 2
   now, stated on both. `pointer-events: none` so it never eats the click, and
   the opacity transition matches the badge's. */
.media-card > .w-popup .w-popup-trigger::before,
.media-card > .welcome-video-poster::before {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background: var(--color-content-primary);
	opacity: 0;
	transition: opacity 0.2s ease;
}

.media-card > .w-popup .w-popup-trigger:hover::before,
.media-card > .w-popup .w-popup-trigger:focus-visible::before,
.media-card > .welcome-video-poster:hover::before {
	opacity: 0.17;
}

/* 3:2 — the design's own box, 116x78 on the events card and 116x78 again on the
   Home hero card (2037:1276). It is NOT the ratio of the video behind it, and an
   earlier pass forced 16:9 on exactly that reasoning; he asked for the drawn
   shape, and the poster is a still that gets cropped either way. `cover` keeps
   the subject centred. Width stays 117. */
.media-card > .w-image img,
.media-card > .w-popup img {
	display: block;
	width: 100%;
	aspect-ratio: 3 / 2;
	object-fit: cover;
}

/* Its children by structure, not by a class each: the prose block and the label
   in the foot are the only text in here.

   Both are in the BODY face, not the heading face. An earlier pass set them to
   Platypi 16/22 "as the footer offer panels" — matched to a neighbouring
   component instead of to this one's own nodes, and wrong on family, size and
   weight. Read off the design: 1692:2191 (hero card) and 1692:2402 (events card)
   are Geist Medium 15/23 in Deep Blue, and they agree with each other. */
.media-card .wpb_text_column {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.533;
	text-wrap: balance;
	color: var(--color-content-heading);
}

/* The card's CTA reads left, like the caption above it.

   Ruttl iPad `i456FAmKgb9Y2wRA2WNg`: "tekst cta pozicionirati ulevo". Impreza
   centres button labels by default, and in the design (2037:1273 and 2037:1275)
   the caption and the CTA both start at x=1096 — one left edge, not a centred
   stack.

   Invisible on the desktop, which is why it survived: MEASURED at 1440 the label
   is ONE line in a shrink-wrapped 215px box, so centring has nothing to centre
   and the button happens to line up with the caption anyway. At 820 the same
   label wraps to two lines in 110px and the second line pulls to the middle.
   So this is not a tablet fix with a tablet scope — the declaration was always
   wrong and only ever showed once the label wrapped. No breakpoint on it. */
.media-card .w-btn {
	text-align: left;
}

/* The band that CARRIES a media card: a full-width row holding one edge-to-edge
   photo with the card sitting over its lower-left corner.

   This was `.mm-events-band-section` until the Welcome band (1692:2410) turned
   up with the same shape, at which point a page prefix was a lie. The two rows
   both carry `media-band-section`; their own `mm-*` classes stay only as handles
   for anything that later needs to differ.

   The row is full-width with a single column, so the column inner IS the frame
   the card is positioned against, and the wrapper between must not become a
   containing block.

   Insets are percentages of the band so they hold as it rescales. Figma states
   4.2%/7.9% on the events band and 3.4%/6.4% on the Welcome one; those are the
   same intent drawn twice by hand, so one pair serves both rather than a
   per-section override that only records the drift. */
.media-band-section .vc_column-inner {
	position: relative;
}

.media-band-section .vc_column-inner > .wpb_wrapper {
	position: static;
}

/* Blue Medium, not the component's white. Both band cards are #B7D6F4 in the
   design (1692:2401, 1692:2415) and only the hero card is white (1692:2190) —
   which is the same line this section class already draws, so the colour rides
   it rather than earning a modifier. The two blue ones are also the two that
   carry a video poster; if a white card ever needs one, split then, not now.

   `max-width` caps the card at the 442px the design draws. Without it the width
   stays a percentage of the BAND, which is the viewport — the card kept growing
   past every screen wider than 1440 (measured 594 at 1905). The percentage stays
   for everything narrower. */
.media-band-section .media-card {
	position: absolute;
	left: 4%;
	bottom: 7%;
	width: 30.7%;
	max-width: 442px;
	z-index: 2;
	background: var(--color-content-secondary);
}

/* NOTE: the label in the foot used to be a `us_text` styled from here — Figma
   1692:2193, Geist SemiBold 13 in Blue Dark — and needed a rule on the ANCHOR
   rather than the `.w-text`, because Impreza's bare `a { color: … }` (black on
   this site) beat anything inherited. It is now Button Style 11 "Text Link
   Button", which owns all of that in Theme Options. Nothing to style here.
   (The 47px line-height in the design is the row's height, not the text's, so
   the style carries 1.2.) */

/* Numbered step: [number][title / body / quote]. The number is the hwrapper's own
   direct text child, which is a stable hook — everything else lives inside the
   nested vwrapper.

   It hangs BACK over the column boundary: Figma has "01" at x=580 while the panel
   behind the intro ends at 626, so it straddles by 46px — which is what the
   negative margin buys, measured at 46 on the front end.

   The number is Blue Light at HALF ALPHA — the same hue as the panel it straddles,
   deliberately: the part sitting on the panel disappears into it and only the
   overhang reads, lighter than the panel. Do not "correct" it to a darker blue
   for contrast; the fade is the effect. `opacity` rather than an rgba() literal,
   and it is safe here because the inherited colour is opaque — see the note in
   the skill about opacity compounding on already-transparent text.

   Type comes from the design's own token, NOT from the frame boxes: those are
   hand-sized and disagree ("01" is 146x76, "02" is 173x104), which is what made
   an earlier pass guess 64px in the wrong family. get_design_context on 1692:2053
   reports Geist Medium 135.106/103.551, tracking -2.7021 — the BODY face, not the
   heading face.

   `tabular-nums` is load-bearing: Geist's proportional digits render "01" 139px
   wide against 170 for the rest, so without it every step title sits at a
   different x. Figma has all five titles at x=807. */
.w-hwrapper.step-item + .step-item {
	margin-top: var(--space-lg);
}

.step-item > .w-text {
	flex: none;
	margin-left: -46px;
	font-family: var(--font-family);
	font-size: 8.4375rem;
	font-weight: 500;
	line-height: 0.767;
	letter-spacing: -0.02em;
	font-variant-numeric: tabular-nums;
	color: var(--color-content-secondary);
	opacity: 0.5;
}

/* Body inside a step is Body S — Geist Medium 15/25 in Deep Blue, the same
   `--fs-md` the icon cards, tick lists, badge rows and price lines use. An
   earlier pass called this one drift and let it inherit Global Text; it is the
   fifth instance of that size in the file, so it is a token, not drift.

   `:not(.is-accent)` because the quote below is also a `.wpb_text_column` and
   must keep its own size AND its Blue Dark — a bare `.step-item .wpb_text_column`
   would tie `.is-accent` on classes and steal the colour from it. */
.step-item .wpb_text_column:not(.is-accent) {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	color: var(--color-content-heading);
}

/* The quote wears `h5-style is-accent` — Figma's "Heading XS Italic", Platypi
   Medium Italic in Blue Dark. The size is the one deviation: the design sets it
   16/25.99 here against the token's 20/25.99. The line-height did not move, which
   is the fingerprint of a hand-resized instance rather than a second token — so
   it is stated as a size on the COMPONENT, not as a new role class.

   THE RULE DOWN ITS LEFT EDGE was missed on the first build and added 2026-08-28.
   In Figma each quote is a flex row — `Line 25`, then an 18px gap, then the text
   (1692:2218 and its four siblings) — so the hairline sits on the body copy's own
   left edge and only the quote's text is indented. `border-left` plus
   `padding-left: 18px` is that figure exactly: measured, the rule lands on 796
   with the paragraph above it and the text on 815.

   `currentColor` rather than a palette token because in the design the line and
   the words are the same Blue Dark (#658AC4, confirmed on both) — tie them and
   the pair can never drift apart.

   It costs the quotes 19px of measure, which is correct: "Success is the
   progressive realization…" now wraps to two lines, and Figma draws it on two
   lines too (frame 1692:2228 is 535x52). Same figure as the CPT pull-quote in
   Grid Layout 406, but at an 18px inset rather than that one's 44. */
.step-item .is-accent {
	font-size: var(--font-size);
	line-height: 1.625;
	padding-left: 18px;
	border-left: 1px solid currentColor;
}

/* ---- Body S ----

   The design has a SECOND body size — Geist Medium 15/25 — and unlike the step
   quotes this one is not drift: it recurs on the icon cards (1692:2248), the
   tick lists (1692:2290) and the bonus rows (1692:2314). It is real, so it gets
   one name — `--fs-md`, the step directly under body size in ab-base's ladder —
   that every component below references, rather than a `font-size: 15px` per
   selector. There is no class for it because the elements that need it are parts
   inside us_iconbox, which takes no per-part class.

   (The ladder has no step AT body size on purpose: that is `var(--font-size)`,
   which Impreza emits from Global Text. `--fs-md` is 15px, `--fs-lg` is 17px,
   and the 16px between them belongs to Theme Options.) */

/* Dark card: an icon over a title and a short paragraph. The class goes on the
   COLUMN so `equal_columns_height="1"` on the row can stretch it; the panel
   itself is the us_iconbox inside, which is the column's only child and so
   picks up Impreza's `:only-child { height: 100% }` from that same setting.

   Figma 1692:2243: #101531 ground on the #212A60 band, 43 top / 38 right / 78
   bottom / 46 left. Those four are drift around two values — `--space-lg` on
   the sides and top, `--space-3xl` at the foot, which is the one that is
   deliberate (the cards are bottom-weighted so the row reads as a band). */
.icon-card .w-iconbox {
	height: 100%;
	padding: var(--space-lg) var(--space-lg) var(--space-3xl);
	background: var(--color-alt-content-bg-alt);
	color: var(--color-content-secondary);
}

/* The glyph colour is NOT here — it is `color="secondary"` on the element, which
   is the builder's own hook for it and lands on exactly the Blue Medium the card
   text uses. (Left to its default the icon renders `color_primary`, i.e. Deep
   Blue, which is the band's own background: invisible.) */
.icon-card .w-iconbox-icon {
	margin-bottom: var(--space-md);
}

/* Heading XS in Figma — the same 20/31 Platypi the h5 tag already carries, so
   the size comes from `--h5-font-size` rather than a literal. The TAG stays h3:
   these are third-level headings in the document outline and only borrow h5's
   size. us_iconbox exposes no class for its parts, so they are styled by
   structure — the component's own inside, not page-scoped selectors. */
.icon-card .w-iconbox-title {
	margin-bottom: var(--space-sm);
	font-size: var(--h5-font-size);
	line-height: 1.55;
	letter-spacing: -0.02em;
	color: inherit;
}

.icon-card .w-iconbox-text {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	color: inherit;
}

/* Ticked list. Each row is its own us_iconbox (iconpos left, no content), so the
   row gap is the wrapping vwrapper's `inner_items_gap` param — nothing to set
   here. What is left is the mark and the line: Figma 1692:2287 has a 24px seal
   in Blue Dark, 10px of gap, then 15/25 body.

   `font-family: inherit` is deliberate: title_tag="div" already inherits the
   body face, but if the tag is ever changed to a real heading the list would
   silently jump to Platypi.

   Blue Dark is not one of the slots us_iconbox's `color` param can reach
   (primary / secondary / light / contrast / custom), so unlike the icon cards
   this one IS a CSS colour. `.color_primary` has to be in the selector: Impreza
   sets the default at `.w-iconbox.color_primary .w-iconbox-icon` (0-3-0), which
   a bare `.check-list .w-iconbox-icon` only reaches at 0-2-0. */
.check-list .w-iconbox.color_primary .w-iconbox-icon {
	margin-right: var(--space-2xs);
	color: var(--color-alt-content-primary);
}

/* The tick sits on the FIRST line of the label, not on the middle of the block.
   Her ruttl note, 2026-08-28: "mislim da možemo da ih ravnamo po gornjoj ivici
   teksta a ne po sredini". It only shows once a label wraps, which on a phone is
   most of them — measured a two-line item at 390: the 24px tick was floating at
   the centre of a 50px box with nothing beside it on either line.

   `.iconpos_left` has to be in the selector. Impreza sets `align-items: center`
   on `.w-iconbox.iconpos_left` (0,2,0), and a plain `.check-list .w-iconbox` ties
   it — measured, the tick stayed centred. No line-height touched: the tick's own
   24px box against a 25px first line lands it right on its own. */
.check-list .w-iconbox.iconpos_left {
	align-items: flex-start;
}

.check-list .w-iconbox-title {
	margin-bottom: 0;
	font-family: inherit;
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	letter-spacing: 0;
	color: var(--color-content-primary);
}

/* Bonus row: a dark bar with the item on the left and its value on the right.
   Figma 1692:2310 — #101531, 86 tall, 37 in from the left, 21 from the right,
   4px between bars. Alignment is NOT here: `alignment="justify"` and
   `valign="middle"` are the element's own params. */
.w-hwrapper.badge-row {
	min-height: 86px;
	padding: 0 var(--space-sm) 0 var(--space-lg);
	background: var(--color-alt-content-bg-alt);
	color: var(--color-content-secondary);
}

.w-hwrapper.badge-row + .badge-row {
	margin-top: var(--space-3xs);
}

/* Only the FIRST child — the item text. The value beside it carries `h5-style`
   and must keep it, and a bare `.badge-row > .w-text` at 0-2-0 would out-specify
   that class at 0-1-0. Both take their colour by inheritance from the bar. */
.badge-row > .w-text:first-child {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
}

/* Small print — the asterisked qualifiers under a price, the travel-costs note.
   A role, not a component: it says "this line is subordinate", nothing about
   where it sits. */
.fine-print {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	color: var(--color-alt-content-primary);
}

/* Price: a large figure with its terms set small beside it.

   ONE `vc_column_text` with a `<strong>` around the figure — NOT an hwrapper
   holding two texts, which is what it was until the parser said otherwise. See
   the composition note in the header: this line sits inside the `price-panel`
   hwrapper, and an `us_hwrapper` inside an `us_hwrapper` is exactly the shape
   WordPress cannot parse. Inline is also the honest markup here: the figure and
   its terms are one sentence sharing a baseline, not two boxes in a row. */
.price-line {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	color: var(--color-content-primary);
}

.price-line strong {
	margin-right: var(--space-2xs);
	font-family: var(--h1-font-family);
	font-size: var(--h2-font-size);
	font-weight: 500;
	line-height: 1.136;
	letter-spacing: -0.02em;
}

/* The terms of the ONE-TIME line break onto their own row and are Blue Dark,
   while the instalment line keeps its terms inline and in Deep Blue — measured,
   not assumed: Figma 1692:2282 is #658AC4 and 1692:2285 is #212A60. The <span>
   in the markup is the only thing telling them apart.

   `font-style: normal` because the global accent-span rule italicises every
   <span> in prose; here the span marks a colour change, not an accent word.
   0-2-2 to clear that rule's 0-1-2 outright rather than tie it on order. */
.wpb_text_column.price-line p > span {
	font-style: normal;
	color: var(--color-alt-content-primary);
}

/* The instalment price is two steps down from the one-time figure — Heading XS
   (20/31) against Heading L (44/50) in Figma, 1692:2307 vs 1692:2306.

   Both classes sit on the same element, so `.price-line-alt strong` would only
   TIE `.price-line strong` at 0-1-1 and win on source order. Compounded to 0-2-1
   so it wins on merit — reorder the file and this still holds. */
.price-line.price-line-alt strong {
	font-size: var(--h5-font-size);
	line-height: 1.55;
}

/* Call to action. Figma 1692:2083: Grey-Light ground, 80/96 padding, heading
   left and button right — the last of which is `alignment="justify"` on the
   element, not a rule here. The text is capped so it wraps at the design's
   proportion instead of running the full band. */
.w-hwrapper.cta-band {
	padding: var(--space-3xl);
	background: var(--color-alt-content-bg);
}

/* On both program pages the GROUND is now the row's own background (set on the
   row's Design tab, `_alt_content_bg`), so the grey bleeds the full width the
   way the design draws it while the row itself is back to the site content
   width — `width="full"` came off both rows on 2026-08-28.

   With the row capped, the band's 80px horizontal padding was pushing its copy
   80px INSIDE the content column every other section aligns to, so it goes. The
   block padding stays: that is the band's height, not its indent. */
.mm-cta-section .w-hwrapper.cta-band,
.oo-cta-section .w-hwrapper.cta-band {
	padding-inline: 0;
}

/* The band takes either a bare heading (Mastermind, 1692:2083) or a heading over
   a line of body copy (1-on-1, 1692:2563) — a vwrapper in the same slot. Both are
   capped at the same proportion: Figma gives the text block 805 of the band's
   1266 on both pages, which is where 64% comes from. */
.cta-band > .w-text,
.cta-band > .w-vwrapper {
	max-width: 64%;
}

/* The supporting line is Global Text at its default size — the design changes
   only its ink, from body grey to heading Deep Blue, because the band's ground
   is Grey-Light rather than white. Size and family are deliberately NOT restated
   here: 18/27 Geist Regular IS the body token. */
.cta-band .wpb_text_column {
	color: var(--color-content-heading);
}


/* The only link inside a footer `wpb_text_column` is the agency credit beside
   the copyright line, and it was arriving as `--color-footer-link` (Blue Medium)
   against the Blue Dark of the sentence it sits in. `inherit` ties it to whatever
   that line is, at 0-2-1 against the theme's `.color_footer-bottom a` (0-1-1) —
   and deliberately BELOW `.no-touch .color_footer-bottom a:hover` (0-3-1), so
   the hover still lifts to white and the link still reads as a link. */
.main-footer-section .wpb_text_column a {
	color: inherit;
}

/* The footer's Useful Links menu marks the current page. Impreza gives it no
   distinct ink there, so the active item sat at the same Blue Medium as its
   neighbours. `--color-footer-link-hover` IS the footer's white (measured
   #ffffff) — the same token the palette already treats as this footer's
   brightest ink, rather than a hard-coded #fff.

   It has to go through `--main-color`, not through `color`. The simple-links
   menu paints its items `color: var(--main-color)`, and Impreza writes that
   variable INLINE on the `<nav>` — so a `color` rule on the anchor loses no
   matter how specific it is (measured: 0-3-1 had no effect at all). Declaring
   the variable on the LI works because that is a different element: the item's
   own declaration beats the nav's inherited one for its own subtree, and
   Impreza's rule then resolves to white by itself. */
.footer-links-column .w-menu .current-menu-item {
	--main-color: var(--color-footer-link-hover);
}


/* =============================================================================
   Header
   ============================================================================= */

.state_default.header_hor .l-subheader-cell.at_left > .w-image {
	margin-right: 3.5rem;
}

/* Header CTA — the navy block flush with the header's right edge.
   Fill, square corners, padding and type come from Button Style 5
   ("Header CTA Block"); the negative margin that cancels the header's own
   horizontal indent lives on the element's Design tab in the Header Builder,
   NOT here — Impreza emits a per-header `ush_btn_1` rule that out-specifies
   anything the child stylesheet can reasonably write (measured: the CSS rule
   computed to margin-right: 0). */

/* What DOES belong here: the label must never wrap.

   Between 1280 (where the menu element hands over to the mobile nav) and about
   1380 the header runs out of room and the two words break onto two lines. The
   button's height is not set by anything — Style 5's padding is `3.4em 4.7em`,
   which at 13px is 44.2 top and bottom and lands the block on exactly the 104px
   header by arithmetic, not by constraint. So a second line adds a whole
   line-height: measured at 1300 the button was **120px tall, hanging 8px above
   and 8px below the header**.

   `nowrap` fixes the cause; `flex: none` stops the cell from shrinking the
   button to force the break in the first place. With both, the button is 274x104
   at 1281 and at 1300 — the same box it has at 1400 — and the nav absorbs the
   difference in its own inter-item slack, with the items themselves unchanged
   (measured: identical item widths before and after, nav 644 -> 632).

   Capping the height instead — `max-height: var(--header-height)` — treats the
   symptom: the label would still be on two lines, just clipped by the box. */
.l-header .w-btn.header-cta-btn {
	flex: none;
	white-space: nowrap;
}

/* Nav — the marker for the CURRENT item: a 14x2 dash, 6px before the label.

   Two things changed against the previous build, not one. The old marker was a
   5x5 dot, and it sat on EVERY item — the new design marks only the active one
   (Figma wraps just that item in a flex with `gap: 6px`, dash then label). So the
   `:hover` half of the old rule is gone too: hover is carried by the menu
   element's own `hover_effect: underline`, not by the marker.

   In flow, not absolute. Figma has the dash occupying layout space, which pushes
   the active label 20px right — so the nav shifts slightly from page to page, by
   design. Absolute positioning would hang it in the 24px inter-item gap instead,
   4px off the previous item.

   Impreza renders the <a> as `display: flex` (measured), so the pseudo-element is
   a flex item and `margin-right` is what sets the 6px gap. Typography and colour
   are NOT here — they belong to the menu element's own params and to
   color_header_middle_text. */
.w-nav.type_desktop .w-nav-list.level_1 > li.current-menu-item > a::before {
	content: '';
	width: 14px;
	height: 2px;
	margin-right: 6px;
	background-color: var(--color-header-middle-text);
}


/* =============================================================================
   Buttons
   ============================================================================= */

/* `us_btn` renders inside a `.w-btn-wrapper` div, and that wrapper carries
   Impreza's own `margin-block: 0.3rem`. In a `us_hwrapper` that only shifts the
   vertical centring, and in a stacked wrapper on a phone Impreza zeroes it
   (measured 0/0). But `.w-vwrapper` is a flex COLUMN, where adjacent margins do
   not collapse — so the 4.8px is added to the gap on top of `inner_items_gap`,
   and every button set from a Figma figure sits ~5px lower than that figure.

   Measured on Home, identical at 1280 and 390: gap 1.5rem rendered 29, 2rem
   rendered 37, 2.2rem rendered 40. Five buttons on that page alone, and the same
   shape wherever a button follows copy in a vertical wrapper. Zeroed so
   `inner_items_gap` means what it says. His call, 2026-08-28. */
.l-body .w-vwrapper > .w-btn-wrapper {
	margin-block: 0;
}

/* Style 1 on a Blue Medium ground — the hover that erases the button.
   Ruttl `yiInuU2Rg2q6ZxfA42Np`: "hover nije dobar, button prelazi u svetlu
   plavu, bolje na ovoj povrsini da prelazi u belu npr."

   Theme Options Style 1 ("Default Button") is Deep Blue with Blue Medium type,
   and on hover the two swap: `color_bg_hover: _content_secondary`. That is
   right on white, on Grey-Light and on Yellow, which is where nearly every
   Style 1 button on the site sits. It is wrong on exactly one ground — Blue
   Medium — because `_content_secondary` IS Blue Medium. Fill and ground become
   the same colour and the button's shape disappears; only the label is left
   floating on the panel.

   Computed, which is what identifies the real fault: the LABEL was never the
   problem (Deep Blue on Blue Medium is 8.91:1). The button-to-ground boundary
   is 1.00:1 — literally no edge. White takes that to 1.51:1 and the label to
   13.42:1.

   So this is not a Theme Options change. Style 1 is the site-wide default and
   its hover is correct everywhere else; she scopes it herself ("na ovoj
   povrsini"). Enumerated rather than guessed — every Style 1 button on a Blue
   Medium ground across all six pages is one of exactly three: the framework
   panel on Mastermind and on 1-on-1, and the Mastermind price panel. The other
   buttons on that ground are Style 6 and Style 11, which hover differently and
   are untouched.

   Both the custom property and the concrete declarations are stated: Impreza
   defines `--btn-hover-background` on the element AND writes the hover with a
   `background` shorthand, so overriding only one of the two is a coin flip on
   which build of the theme is installed. */
.framework-intro-column .w-btn.us-btn-style_1,
.price-panel .w-btn.us-btn-style_1 {
	--btn-hover-background: var(--color-content-bg);
}

.framework-intro-column .w-btn.us-btn-style_1:hover,
.framework-intro-column .w-btn.us-btn-style_1:focus-visible,
.price-panel .w-btn.us-btn-style_1:hover,
.price-panel .w-btn.us-btn-style_1:focus-visible {
	border-color: var(--color-content-bg);
	background: var(--color-content-bg);
	color: var(--color-content-primary);
}

/* SVG arrow injected in place of the FA glyph (see functions.php). */
/* 16x7 since 2026-08-26 — the redrawn arrow, with its viewBox cropped to the
   glyph in functions.php. Figma draws it inside a 40x40 box; at that size the
   element sat 12px below the label's centre and stretched the button to 40px
   tall. Cropped, `vertical-align: middle` lands within 1px, same as the old
   34x8 arrow did. Keep these two numbers equal to the SVG's own width/height. */
.w-btn .custom-arrow-icon {
	display: inline-block;
	width: 16px;
	height: 7px;
	margin-left: var(--space-2xs);
	vertical-align: middle;
	transition: transform var(--transition-base);
}

.w-btn .custom-arrow-icon path {
	fill: currentColor;
}

.w-btn.icon_atright:hover .custom-arrow-icon {
	transform: translateX(4px);
}

/* Style 4 — arrow is hidden until hover, then slides out. */
.w-btn.us-btn-style_4 .custom-arrow-icon {
	width: 0;
	opacity: 0;
	transform: translateX(-10px);
	transition: width var(--transition-base), opacity var(--transition-base), transform var(--transition-base);
}

.w-btn.us-btn-style_4:hover .custom-arrow-icon {
	width: 16px;
	opacity: 1;
	transform: translateX(0);
}

/* The OTHER injected arrow — mynaui, stroked, alone inside the outlined pill
   buttons. Ruttl 2026-09-09, four "strelice nisu po dizajnu" threads: the FA
   `fa-arrow-right` standing in for it was a different drawing. See the second
   block in `ab_replace_fa_icons_with_svg()`.

   One SVG, two sizes: Figma draws it 24px in the Home programme pills
   (1685:1798) and 17px in the footer's GPS Offerings pills (1685:1957), which
   is exactly Style 6 and Style 7. So the size hangs off the button style rather
   than off a page or a section, and any future user of either style inherits
   the right one.

   NO `margin-left` here, unlike `.custom-arrow-icon` above: that one sits beside
   a label and needs the gap. This one IS the button's whole content, and a
   margin would shift it off centre. ab-base already zeroes inline margins on
   `svg` under `.hide-btn-label`, so nothing has to be undone either.

   `display: block` so the SVG stops sitting on a text baseline — with the label
   visually hidden there is no baseline worth aligning to, and an inline SVG
   would otherwise contribute descender space and make the pill taller than the
   numbers say. The button's own flex centring does the rest.

   These two pairs and the padding in Button Styles 6 / 7 are ONE calculation:
   the pill is icon + padding + border. Change a size here and the Theme Options
   padding has to be re-derived, or the pill stops being 66x44 / 36x24.

   No hover nudge on this one. `.custom-arrow-icon` slides 4px because it points
   away from a label it belongs to; these pills already answer the pointer by
   filling with their border colour, and a second motion was not asked for. */
.w-btn .custom-arrow-pill {
	display: block;
	flex: none;
	width: 24px;
	height: 24px;
}

.w-btn.us-btn-style_7 .custom-arrow-pill {
	width: 17px;
	height: 17px;
}


/* =============================================================================
   Owl Carousel navigation
   ============================================================================= */

/* Drop the theme's FA pseudo-glyph; ab-custom.js injects an SVG instead. */
.owl-prev::after,
.owl-next::after {
	content: none;
}

.custom-owl-prev-icon,
.custom-owl-next-icon {
	display: inline-block;
	width: 34px;
	height: 8px;
}

.custom-owl-prev-icon path,
.custom-owl-next-icon path {
	fill: currentColor;
	transition: fill var(--transition-base);
}

.owl-carousel.navstyle_circle > .owl-nav button {
	width: 34px;
	padding: 0;
	border-radius: 0;
}

.no-touch .owl-carousel.navstyle_circle > .owl-nav button:hover {
	background: transparent;
}

.owl-nav button:hover .custom-owl-prev-icon path,
.owl-nav button:hover .custom-owl-next-icon path {
	fill: var(--color-content-heading);
}

/* Stack the arrows vertically in the top-inside position. */
.owl-carousel.arrows-ver-pos_top_inside > .owl-nav {
	flex-direction: column-reverse;
	align-items: flex-end;
}

.w-grid-list.owl-carousel.arrows-ver-pos_top_inside.navstyle_circle > .owl-nav button {
	text-shadow: none;
	color: var(--color-alt-content-primary);
}


/* =============================================================================
   Shared section patterns
   ============================================================================= */

/* REMOVED 2026-08-28, after checking every published page for each selector.

   The About Us rebuild of 2026-08-24 took `.our-approach-row` and
   `.halves-width-img` off the site; only their base rules were deleted then, and
   six more in media queries survived until now. Gone with them, all verified
   absent from all nine published pages: `.content-bg-alt-box` (the old
   offering/program panel), `.blurred-inner-row` / `.blurred-large-font` (the
   oversized headline knocked out of a fixed-attachment photo), `.above-footer-*`
   (page block 171, still unreferenced), `.top-header-menu` (the old 2x2 utility
   menu — NOTE: unlike everything else here, its header element still exists, just
   parked in the Header Builder's Hidden Elements, so un-hiding it would need this
   CSS back out of git), and the whole LEGACY block that used to close this file — the stats band, the compass, Grid Layout
   53 and the GSAP-pinned stacked cards.

   `initStackedCards()` went out of ab-custom.js in the same pass, and with it the
   two GSAP enqueues in functions.php — which were pulling gsap and ScrollTrigger
   off cdnjs on EVERY page of the site for a layout that no longer exists.

   Method worth repeating before deleting anything else: fetch each published page
   and search its HTML for the class, rather than trusting a note. It caught one
   false positive — `home-compas` matched on Home as the FILENAME
   `home-compass-watermark.png`, not as a class. */


/* =============================================================================
   Hero band + split media band

   Two shapes that recur across the whole site, so neither is page-scoped:

     hero-*          copy left, photo right, photo bleeds to the viewport edge.
                     Figma puts the copy at 80..742 and the photo at 844..1441
                     of a 1440 canvas on Home, Mastermind, 1-on-1 and About —
                     identical to the pixel, which is why this is one component.

     split-media-*   the same split with the photo on either half, used for the
                     narrative bands (Home "about", About us twice).

   The rows are `width="full"`, so the reading indent lives here rather than in
   Theme Options.
   ============================================================================= */

/* The builder owns the layout here — do not re-implement any of it in CSS:
     width="full_with_indents"    horizontal indents
     content_placement="middle"   vertical centring of the copy
     stretch="1"                  photo column bleeds to the viewport edge
     tablets_columns="1"          stacking below 1024px
   Killing the row's gutter in CSS in particular breaks the stretch maths:
   Impreza derives the bleed from the gutter, and without it the column
   overshoots the viewport by ~266px. */

/* Only real job left: the photo's proportions.

   Left alone the photo renders at the source file's aspect over the stretched
   column's width, which is far taller than the design; forced to fill the
   copy column's height it goes the other way and reads as a landscape crop
   (measured 844x463 = 1.82 against the design's 0.83). So the design ratio is
   stated explicitly and the photo drives the band height from there.

   `object-fit: cover` is what keeps it honest: the stretched column is wider
   than the design's 597px on most screens, and cover re-crops instead of
   distorting the photo. */
/* The hero band is 670px tall in every mockup, so the photo's design ratio is
   597/670 by default. Home is the exception: its photo is drawn 720 tall against
   the same 670 band, i.e. it is meant to overflow into the section below. */
.hero-image img {
	aspect-ratio: 597 / 670;
}

.home-hero-section .hero-image img {
	aspect-ratio: 597 / 720;
}

.split-media-image img {
	aspect-ratio: 597 / 841;
}

.hero-image img,
.split-media-image img {
	display: block;
	width: 100%;
	height: auto;
	object-fit: cover;
}

/* The COLUMN is what PLACES the media card over the photo; the card itself knows
   nothing about it. Insets as percentages of the photo — Figma has the card at
   914..1367 x 578..711 inside a photo at 844..1441 x 103..773, the same on every
   page that carries one — so it holds as the photo rescales. The wrapper between
   must not become a containing block.

   Both photo columns are listed: the hero card sits on the right-hand photo, and
   FAQ (1797:1306) puts the same card on the LEFT-hand split-media photo, at
   70..523 x 1946..2079 inside a photo at -1..596 x 1254..2146. Those work out to
   11.9% and 7.5% against 11.7% and 9.3% — the same figure, so one rule. */
.hero-media-column > .vc_column-inner,
.split-media-column > .vc_column-inner {
	position: relative;
}

.hero-media-column > .vc_column-inner > .wpb_wrapper,
.split-media-column > .vc_column-inner > .wpb_wrapper {
	position: static;
}

/* The percentage keeps the card in proportion to the photo while the photo is
   at or below its design size; the cap stops it growing past it on wide screens,
   where 76% of a stretched column is far more than the design's 453px. */
.hero-media-column .media-card,
.split-media-column .media-card {
	position: absolute;
	left: 11.7%;
	bottom: 9.3%;
	width: 76%;
	max-width: 460px;
	z-index: 2;
}

/* Home's hero card is drawn wider than the others since it took a video poster:
   2037:1272 is 477 against the 453 the shared cap above was set from. Only the
   cap moves — the percentage and the insets are the same figure. */
.home-hero-section .media-card {
	max-width: 477px;
}

/* Reading indent inside the copy half, on top of the row's own indents. */
.hero-copy-column > .vc_column-inner,
.split-copy-column > .vc_column-inner {
	padding-inline: clamp(0rem, 2vw, 2.5rem);
}

/* Hairline rule closing a block, matching the design's divider. A role class,
   so it stays element-agnostic — it sits on a vwrapper in the hero and on a
   single paragraph in the split band. */
.rule-below {
	padding-bottom: var(--space-md);
	border-bottom: 1px solid var(--color-alt-content-primary);
}

/* An italic aside sitting beside its button. Same figure in the hero and in the
   split band, so one class covers both. */
.w-hwrapper.inline-cta-hwrapper {
	margin-top: var(--space-lg);
}

.inline-cta-hwrapper .w-text {
	max-width: 27ch;
}

/* The button must not be squeezed by the italic line next to it. The design's
   button is a single 187x47 line.

   `flex` has to go on `.w-btn-wrapper`, not on the button: `us_btn` renders
   inside that wrapper, so the wrapper is the hwrapper's flex ITEM and the button
   is an inline-block inside a block. Verified 2026-08-28 by overriding the
   button's `flex` to `1 1 auto` on the live page — nothing moved, 186x47 either
   way. The rule had been sitting on `.w-btn` doing nothing; what was actually
   holding the pill together is the `nowrap` below, which gives the wrapper a
   min-content floor. Both are wanted: nowrap keeps the label on one line, and
   `flex: none` on the wrapper stops the shrink from being attempted at all. */
.inline-cta-hwrapper > .w-btn-wrapper {
	flex: none;
}

.inline-cta-hwrapper .w-btn-label {
	white-space: nowrap;
}

/* The intro paragraph of a band, in either face: body copy in the hero, the h5
   heading face in the split band (Figma "Heading XS"). Both ride Theme Options
   for size, family, weight and line-height; this class carried the one colour
   deviation, Body grey to Deep Blue.

   2026-08-26: Theme Options → Content Text became #212A60, so within the
   CONTENT scheme this is now a no-op. It stays because it is not one
   everywhere — a band on `color_scheme="primary"` or a footer scheme reads
   different variables, and this pins the lead's ink. Fold it away when the
   design stops asking for that. */
.lede {
	color: var(--color-content-heading);
}

/* The HOME hero's two accent runs are plain coloured text — unlike every other
   accent span on the site these are NOT italic, so the global span rule is
   switched off. Scoped to the page section, not to `.hero-copy-column`: the
   Mastermind hero lede in the same component DOES want the italic. 0-4-0 beats
   the global 0-2-0. */
.home-hero-section .lede .w-text-value > span {
	font-style: normal;
}

/* The mark is the vwrapper's containing block, not the column's. Without this
   the absolute mark resolved against .vc_column-inner and sat 351px above the
   first paragraph (measured), because the column also holds the CTA block below.
   Anchoring it to the vwrapper puts top:0 on the first paragraph's own top. */
.w-vwrapper.split-copy-vwrapper {
	position: relative;
}

/* The mark hangs in the gutter to the LEFT of the copy, top-aligned with the
   first paragraph — Figma has it at x=663 against text at x=735, i.e. a 25px
   gap. Taken out of flow so it does not push the paragraphs down. The vwrapper's
   left edge IS the text's left edge, so no gutter compensation is needed. */
.split-copy-vwrapper .section-mark {
	position: absolute;
	top: 0;
	left: calc(-47px - var(--space-sm));
}


/* =============================================================================
   Person card + quote band

   Two shapes the About Us frame introduces. Neither is page-scoped: `person-card`
   is the standard "photo above a tinted panel" bio tile, and `quote-band-section`
   is the centred pull-quote band Home already draws under `home-quote-section` —
   fold that class into this one the next time Home is touched, rather than
   growing a second copy of the same figure.
   ============================================================================= */

/* Figma 1700:3386-3389: two 625-wide cards on the site's own 30px gutter, each a
   625x381 photo sitting flush on a 625x432 tinted panel.

   The tint goes on `.wpb_wrapper`, NOT on `.vc_column-inner`. The gutter is
   padding INSIDE `.vc_column-inner`, so a background there paints the padding
   too and the two panels meet with no seam — right when two column grounds are
   meant to touch, wrong here, where the design wants them 30px apart. Measured:
   `.vc_column-inner` is 655 wide and the two boxes are 0 apart; `.wpb_wrapper`
   inside it is 625 wide and they are 30 apart, which is the design exactly. The
   photo then needs no bleed either — it is already the panel's full width.

   `.vc_column-inner` is `display: flex; flex-direction: column`, so its cross
   axis is horizontal and `.wpb_wrapper` gets no vertical stretch from it. The
   height has to be named or the shorter card's tint stops at its own copy while
   `equal_columns_height="1"` keeps the COLUMNS level. */
.person-card > .vc_column-inner > .wpb_wrapper {
	height: 100%;
}

.person-card.is-blue > .vc_column-inner > .wpb_wrapper {
	background: var(--color-content-secondary);
}

.person-card.is-cream > .vc_column-inner > .wpb_wrapper {
	background: var(--color-content-bg-alt);
}

/* 625x381 = 1.64. Stated rather than left to the source file so the two cards
   agree: Ken's and Ernie's exports match today, but a replacement photo at a
   different aspect would otherwise drive one card taller than the other. */
.person-card-image img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 625 / 381;
	object-fit: cover;
}

/* The photo is flush against the panel — nothing between them. */
.w-image.person-card-image {
	margin-bottom: 0;
}

/* Design has 52 top / 40 sides / 74 bottom — drift around three steps of the
   ramp, snapped to xl / lg / 3xl. */
.w-vwrapper.person-card-body {
	padding: var(--space-xl) var(--space-lg) var(--space-3xl);
}

/* Two different gaps inside the panel — 16 between the name row and the role
   line, 24 between the role line and the bio. `inner_items_gap` is uniform, so
   it carries the 16 and the bio makes up the difference here.

   The name sits in an hwrapper next to its credential pill, so it is NOT a
   direct child of the vwrapper and `inner_items_gap` does not override its own
   `--h4-margin-bottom` the way it would one level up. Measured 40 before this
   rule, against the design's 16. */
.person-card-body .w-hwrapper h3 {
	margin-bottom: 0;
}

.person-card-body > .wpb_text_column {
	margin-top: var(--space-2xs);
}

.person-card-body > .wpb_text_column p:last-child {
	margin-bottom: 0;
}

/* The role line wears `.eyebrow` for its type but not its ink: the design sets
   it in heading ink, not Blue Dark. (Figma reports plain black, which no palette
   field owns — snapped to Deep Blue, the palette's darkest text.) */
.person-card-role.w-text {
	color: var(--color-content-heading);
}

/* Centred pull-quote on a full band — Figma Frame 262: 1440x324 with 118px of
   air above and below the copy, which is between `large` (96) and `huge` (128).
   Retuning the token on the section is what ab-base's ladder is for; restating
   the padding here would hide it from whoever opens the row in the builder.

   BOUNDED TO DESKTOP 2026-09-10 — Ruttl `x9PTdveJoeDV2JEW4akq`, "manji razmaci
   od teksta 'we help..' do kraja plave sekcije gore i doel", pinned at y=59 in
   the top padding on a phone.

   Retuning the token is the right move; leaving it UNBOUNDED was not. A token is
   the thing that changes per breakpoint, so overriding it flat froze this one
   section at 118 while every other band on the site stepped down — measured at
   390 the band was 118 of air above and below a 129px block of copy, in a 365px
   section that is two-thirds padding.

   The tell was next door: Home draws the identical band and renders 64 there,
   because `home-quote-section` never carried this line. Two instances of one
   design element disagreeing by 54px is what says the override, not the value,
   is wrong.

   118 IS the design, and it is a 1440 measurement, so it stays where it was
   measured. Below that the ladder takes over again: 96 at tablet, 64 at phone —
   which is exactly what Home has been doing all along. */
@media (min-width: 1025px) {

	.quote-band-section {
		--section-pad-large: 7.375rem;
	}
}

/* Heading M upright — screenshotted, because the design is NOT italic here even
   though every other pull-quote on the site is. The ink is #4E75B2 in the file,
   which no palette field owns; Alternate/Secondary (#4D6D9E) is the nearest and
   is already the mid-blue every other band uses. */
.quote-band-section .w-text {
	color: var(--color-alt-content-secondary);
}


/* =============================================================================
   Framework band + Included cards

   Both shapes were built for Mastermind and carried an `mm-` prefix until 1-on-1
   drew the same two sections — a Blue Light panel behind a sticky intro half with
   numbered steps opposite it, and a navy band of icon cards on a 24px gap. The
   prefix said "this exists once", which stopped being true, so it is gone.
   1-on-1 uses three steps and one row of cards where Mastermind uses five and two;
   neither count is in the CSS.
   ============================================================================= */

/* The six "What's Included" cards sit on a 24px gap in BOTH directions, not on
   the site's 30px gutter — Figma 1692:2242 / 1692:2262: cards 363 wide at x 0 /
   387 / 774, so 387 − 363 = 24, and the second row starts 24 below the first
   (4824 against 4437 + 363).

   24 is not a step on the spacing ramp, but HALF of it is: each column carries
   `--space-xs` (12px) a side, which is what makes the gap between two of them 24.
   The row's own negative margin has to shrink to match, or the outer cards hang
   past the content edge by the difference.

   The column selector is 0-5-1 to clear Impreza's gutter rule at 0-4-1 — a bare
   component selector loses the inline axis of that shorthand silently. */
.g-cols.via_flex.type_default.included-cards-row {
	margin-inline: calc(var(--space-xs) * -1);
}

.g-cols.via_flex.type_default.included-cards-row > div > .vc_column-inner {
	padding-inline: var(--space-xs);
}

/* The two rows are separate `vc_row_inner`s, so nothing separates them by
   default — they render joined.

   The long selector is not decoration: Impreza sets the `margin` SHORTHAND on
   `.g-cols.via_flex.type_default` (0-3-0), which pins margin-top to 0. A plain
   `.included-cards-row + .included-cards-row` is 0-2-0 and loses the block
   axis silently — measured 0px — exactly the shorthand trap the header of this
   file describes. Five classes clears it. */
.g-cols.via_flex.type_default.included-cards-row + .included-cards-row {
	margin-top: calc(var(--space-xs) * 2);
}

/* `cards-2up` — Mastermind's six cards, merged into ONE wrapping row.

   His call, 2026-09-10, on Marija's `rMFg2zT3J1lSAtMzjRyz` ("da li je bolje da
   stavimo 2 kartice u redu, da budu manje visine nego sto su ove sada?").

   Why the markup had to change rather than just the CSS: the six cards were two
   separate `vc_row_inner`s of three. Setting the columns to 50% inside each of
   those gives 2 + 1 twice — two orphans, not three clean pairs. One row of six
   that WRAPS gives 3+3 at full width and 2+2+2 at tablet from the same markup.

   This `row-gap` is what the adjacent-sibling rule above used to do, restated for
   flex LINES instead of for two elements. Same 24, so the desktop composition is
   unchanged — verified: 3+3 with 24 between the lines, exactly as before.

   The sibling rule above is now dead on both pages (neither has a second row) and
   is kept only because 1-on-1 may yet grow one. */
.g-cols.via_flex.type_default.cards-2up {
	row-gap: calc(var(--space-xs) * 2);
}

/* Ten columns plus a full gutter on each side. `narrow-section-10` alone gives
   `--col-step * 10 - --grid-gutter`; adding a gutter per side nets out to ten
   steps plus one gutter. Written as one term rather than three so the intent
   survives being read later. */
.included-section > .l-section-h {
	max-width: calc(var(--col-step) * 10 + var(--grid-gutter));
}

/* The steps are separate `us_hwrapper`s, and Impreza's own adjacent-element rule
   spaces them at 2.5rem (40px, measured). The design wants far more air: Figma
   puts consecutive step rows ~104 apart on 1-on-1 (1692:2530..2532 against their
   bodies) and 88–111 apart on Mastermind. Neither number is on the spacing ramp,
   which stops at 80 and jumps to 120, so this takes the 80: it lands within a few
   pixels of Mastermind's own figure and leaves 1-on-1 short by less than the
   ramp's next step would overshoot. Three classes to clear Impreza's rule. */
.framework-steps-column .step-item + .step-item {
	margin-top: var(--space-3xl);
}

/* The GPS Framework band carries a Blue Light panel behind the intro half that
   runs from the viewport's left edge to the intro column's right edge, top of
   section to bottom of section.

   It is drawn as a pseudo-element on the ROW rather than as a background on the
   column, for one reason: the design's panel covers the section's vertical
   padding too (Figma 2375..3863 is the panel AND the section), and a background
   on .vc_column-inner starts below that padding. Anchoring to .l-section, which
   is both full-bleed and full-height, gets both edges for free — and keeps the
   spacing itself on the row's `height="huge"` where the builder can see it.

   The width is derived, not measured:
     50%                          centre of the full-width section
     − --site-content-width / 2   back to the content box's left edge
     + --col-step * 5             five column steps across
   The intro column is 5/12 and the steps column 7/12, so five steps lands on the
   steps column's CONTENT edge — which is where Figma draws the panel: x=626 of a
   1440 canvas, i.e. 546 from the content box's left edge, against 545.8 for
   5 × --col-step at a 1280 content width. The panel therefore eats the whole
   gutter between the two columns, which is why the term is not reduced by half a
   gutter to stop at the column box. */
.framework-section {
	position: relative;
}

.framework-section::before {
	content: "";
	position: absolute;
	inset-block: 0;
	left: 0;
	width: calc(50% - var(--site-content-width) / 2 + var(--col-step) * 5);
	background: var(--color-content-secondary);
}

/* Reading indent inside the panel: the copy stops a full column short of the
   column's right edge rather than running to it. One --col-width REPLACES the
   half-gutter, it is not added to it — 79.2px against the 78 the design needs,
   which puts the copy at 451px wide with 94px of panel to its right. Figma:
   452 and 94.

   Stated at 0-5-0 because Impreza sets the column's `padding` SHORTHAND at
   0-4-1 — a bare component selector loses the inline axis silently and the box
   keeps its 15px gutter, with no error anywhere. */
.g-cols.via_flex.type_default > .framework-intro-column > .vc_column-inner {
	padding-right: var(--col-width);
}

/* The pseudo-element is positioned, so it would paint over the in-flow content.
   Lifting the row's inner box is enough — nothing here needs its own stacking. */
.framework-section > .l-section-h {
	position: relative;
	z-index: 1;
}


/* =============================================================================
   Photo strip — `ab-photo-strip`

   A horizontal run of photos at ONE fixed height, each keeping its own natural
   width, scrolled sideways. Figma draws it on Mastermind at y6664
   (1692:2424 / 2430 / 2427): three frames 321.33 tall, 24 apart, the last one
   running past the 1440 edge.

   Figma CROPS each photo to a hand-picked width; we do not. The design's 237 is
   exactly the harbour shot's own ratio at that height, which says the intent is
   natural widths and the other two were simply trimmed by hand in the file.
   Hard-coding those three numbers would break the moment a photo is swapped.

   It is a native scroll container, NOT an Owl carousel. Owl writes an inline
   `width` on every `.owl-item` computed from an equal split of the track, and
   its translate maths depends on those widths — which is exactly what this
   component must not have. Scroll plus scroll-snap gets the same behaviour with
   none of that, and the arrows drive it with `scrollBy()`.

   Markup is a plain `us_hwrapper`, so the 24px gap is `inner_items_gap` rather
   than CSS, carrying `col-bleed-r-full` alongside to run off the right edge.
   ab-base neutralises every `col-bleed-*` at <=1024, so below that the strip
   quietly becomes an ordinary in-grid scroller. */
.w-hwrapper.ab-photo-strip {
	--photo-strip-height: 321px;

	/* Positioned so the strip is its own children's offsetParent: the arrow
	   script steps to `item.offsetLeft`, which only equals a scroll position
	   when it is measured from THIS box. */
	position: relative;
	flex-wrap: nowrap;
	overflow-x: auto;
	overscroll-behavior-x: contain;
	scroll-snap-type: x proximity;
	scrollbar-width: none;
}

/* The arrow pair replaces the scrollbar, so it is hidden — visually only. The
   container keeps `overflow-x: auto`, so it stays a real scroll region for
   trackpads, keyboards and assistive tech. */
.w-hwrapper.ab-photo-strip::-webkit-scrollbar {
	display: none;
}

/* `flex: none` because flex children shrink to fit by default, and not shrinking
   is the entire point of this component. */
.w-hwrapper.ab-photo-strip > * {
	flex: none;
	scroll-snap-align: start;
}

/* Height is the constant; width is whatever each photo's ratio makes it.
   `max-width: none` undoes the global `img { max-width: 100% }`, which would
   otherwise pull the landscape shots back inside the container. */
.ab-photo-strip .w-image img {
	height: var(--photo-strip-height);
	width: auto;
	max-width: none;
	object-fit: cover;
}

/* The strip is preceded by a fixed-width copy column — lead-in line at the top,
   arrow pair at the bottom (Figma 1692:2187 at x78 w250, arrows at y6941 level
   with the photos' bottom edge).

   The two halves are ROW COLUMNS, not two children of one hwrapper, and that is
   not a style preference. WordPress cannot parse a shortcode nested inside
   another of the SAME name: `do_shortcode`'s content group is non-greedy, so the
   inner `[/us_hwrapper]` closes the outer one and everything after it spills out
   as a sibling. An `us_hwrapper` holding the arrows therefore cannot live inside
   an `us_hwrapper` — it can inside an `us_vwrapper`, which is what this is.
   Same trap for vwrapper-in-vwrapper. Measured on the live page, not guessed.

   250 and the 30 gap are literals rather than grid tokens: the copy is not on
   the column grid. Figma puts it at 78..328 with the first photo at 358, and 250
   is no whole number of `--col-step` (109.17) — snapping it to the nearest column
   would move the strip's start by ~50px for no gain. The gap IS `--grid-gutter`,
   and it comes free: it is the two columns' own 15px paddings meeting.

   `vc_col-md-3` / `-9` is only the fallback below the stacking width. From 768 up
   the rail is the layout at every size — his call, 2026-08-28: the strip runs to
   the screen edge on a tablet exactly as it does on a desktop. The rail does not
   need to scale, because 250px is what the quote was set in. */
@media (min-width: 768px) {
	.g-cols.via_flex.type_default > .photo-strip-copy-column {
		flex: none;
		width: calc(250px + var(--grid-gutter));
	}

	/* `min-width: 0` or the strip refuses to shrink below its own content and
	   shoves the copy column off the grid — the flex min-content floor. */
	.g-cols.via_flex.type_default > .photo-strip-strip-column {
		flex: 1;
		min-width: 0;
	}
}

/* The bleed itself has to be restated below the content width, and this is the
   second place today the same arithmetic broke (see the Mastermind price slab).
   `col-bleed-r-full` is

       margin-right: calc((100vw - var(--site-content-width)) / -2)

   which describes the gap between the content block and the screen only while the
   viewport is WIDER than 1280. Below it the term flips sign and the "bleed" pulls
   the element inward: measured at 1100, `margin-right: +90px` left the strip
   stopping 130px short of the screen edge.

   Below 1280 the content block is not centred by leftover space — it is the
   viewport minus Impreza's Row Horizontal Indent, a fixed 40px on this project
   (Theme Options → Site Layout). So the distance to cancel is that indent, and it
   is the same number at 768 and at 1100. Measured after: strip right edge lands on
   770 of 770 and 1085 of 1085, with no horizontal scroll. If the indent is ever
   changed in Theme Options, this number follows it. */
@media (max-width: 1279px) {
	.w-hwrapper.ab-photo-strip.col-bleed-r-full {
		margin-right: -40px;
	}
}

/* `space-between` is what drops the arrows onto the strip's bottom edge, and it
   only has room to work if the column is as tall as the strip beside it. The row
   carries `equal_columns_height`, which stretches `.vc_column-inner`; the height
   then has to be handed down through the wrapper Impreza puts inside it. */
.photo-strip-copy-column > .vc_column-inner > .wpb_wrapper {
	display: flex;
	flex-direction: column;
	height: 100%;
}

.w-vwrapper.photo-strip-copy {
	flex: 1;
	justify-content: space-between;
}

/* The nav is authored EMPTY in the builder and filled by `initPhotoStrip()`.
   Position is a layout decision, so it stays in the page; the buttons are inert
   without the script, so they are not. With no JS the wrapper collapses to
   nothing and the strip is still scrollable — that is the intended fallback. */
.ab-photo-strip-nav:empty {
	display: none;
}

/* Figma 1692:2433 / 1692:2435: a 66x44 pill, 1px Deep Blue, transparent, with a
   24px arrow centred. Hover inverts — the design has no hover state, and filling
   the shape it already draws is the smallest invention that answers for one. */
.ab-photo-strip-arrow {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 66px;
	height: 44px;
	padding: 0;
	border: 1px solid var(--color-content-heading);
	border-radius: var(--radius-pill);
	background: none;
	color: var(--color-content-heading);
	cursor: pointer;
	transition: background-color 0.2s ease, color 0.2s ease;
}

.ab-photo-strip-arrow:hover,
.ab-photo-strip-arrow:focus-visible {
	background: var(--color-content-heading);
	color: var(--color-content-bg);
}

.ab-photo-strip-arrow svg {
	display: block;
	width: 24px;
	height: 24px;
}

/* The gap moves from Impreza's per-child margin to a real `column-gap`, same
   value, and it fixes a silent bug in the arrow script at the same time.

   `ab-custom.js` computes the loop's period as `strip.scrollWidth + gap`, reading
   that gap with `getComputedStyle(strip).columnGap`. Impreza does not set
   `column-gap` — it spaces an hwrapper with `margin-inline-end` on every child
   but the last — so that read has always returned `normal`, `parseFloat` has
   always given NaN, and the `|| 0` has always made the period one gap short. The
   wrap therefore drifted by exactly one gap on every loop. Declaring the real
   property makes the script's own reasoning true; the comment in the JS was right
   all along and the value it needed simply was not there.

   `var(--hwrapper-gap)` rather than a literal, so the builder's
   `inner_items_gap` stays the source. Zeroing the child margin is what stops the
   two mechanisms from adding up. */
.l-body .w-hwrapper.ab-photo-strip {
	column-gap: var(--hwrapper-gap);
}

.l-body .w-hwrapper.ab-photo-strip > :not(:last-child) {
	margin-inline-end: 0;
}

@media (max-width: 767px) {
	.w-hwrapper.ab-photo-strip {
		--photo-strip-height: 220px;
	}
}

/* Her "manji razmak izmedju slika?" — `iDIFnItORLlFWTNtztYG`, iPhone, pinned
   mid-photo at y=104.8.

   The gap is a constant while the photos are not: `inner_items_gap` is 1.5rem at
   every width, and the strip's own height — the dimension that sets every photo's
   scale, since widths follow each ratio — falls 321 → 220. MEASURED, the gap
   against that height: **7.5% at 1440 and 10.9% at 390**.

   1rem restores the design's proportion rather than picking a smaller number:
   0.685 is the height ratio and 24 x 0.685 is 16.4. It also buys back 8px of a
   327px window on a phone, where one photo fills the screen and the gap is dead
   swipe. */
@media (max-width: 600px) {
	.l-body .w-hwrapper.ab-photo-strip {
		column-gap: 1rem;
	}
}


/* =============================================================================
   Home — "We Offer"

   Navy band via color_scheme="primary" on the row; the zig-zag comes from the
   column order plus 5/12 + 7/12 widths, both set in the builder.
   ============================================================================= */

.home-offer-title {
	text-align: left;
}

/* Design ratio of the card photo (600x460). cover re-crops rather than
   distorting when the column is wider than the design's 600px. No radius —
   the design's photos are square-cornered. */
.offer-image img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 600 / 460;
	object-fit: cover;
}

/* The copy sits in its own panel, a deeper navy than the band itself
   (#101531, held as the alternate scheme's alt background). Padding is stated
   as a ratio of the design's 461px card: 45 left / 68 right / 59 top / 48
   bottom. */
.offer-card-vwrapper {
	background: var(--color-alt-content-bg-alt);
	padding: 12.8% 14.8% 10.4% 9.8%;
}

.offer-card-title {
	font-style: italic;
}

/* Geist SemiBold 15/26 — smaller and heavier than site body copy, so it is a
   component style rather than a Typography tag. Geist is a variable font with
   a 100–900 wght axis, so 600 is a real weight, not a synthesised one. */
.offer-card-body {
	font-size: var(--fs-md);
	font-weight: 600;
	line-height: 1.734;
}

/* The design stacks the two cards flush (1895 → 2355 → 2815), no gap. */
.home-offer-inner-row + .home-offer-inner-row {
	margin-top: 0;
}

/* Panel and photo butt up against each other horizontally — the text frame is
   461 wide starting at 193, the photo starts at exactly 654. Nothing to do
   here: the copy columns carry `col-extend-r-md` / `col-extend-l-md`, which
   grow the panel by one gutter towards the photo and close the gap. Equal
   height likewise comes from `equal_columns_height="1"` on the row, whose
   `.equal_height > div > .vc_column-inner > .wpb_wrapper > :only-child
   { height: 100% }` is exactly the chain down to the panel. (That same rule is
   what had to be removed from the hero row, where the copy needed to centre
   rather than fill.) */


/* =============================================================================
   Home — testimonials

   Two lists side by side: the text testimonials left, the video one right.
   In the design the cards sit 1px apart, so the block reads as one continuous
   panel — which means the row's gutter has to go. Safe here (unlike the
   approach / programs rows) because neither column uses `stretch`.
   ============================================================================= */

/* Only the negative gutter margin goes — the inline margin stays `auto` so
   `narrow-el-10` on the row can still centre it. A flat `margin: 0` here would
   out-specify that class (0-4-0 against 0-1-0) and pin the block left.

   The width is `narrow-el-10` stretched by one gutter: the block is 1089px of
   1440 in the design, and ten columns land on 1062 — the missing 27 is a
   gutter. Written as the token rather than a number so it tracks
   `--grid-gutter`. */
.g-cols.via_flex.type_default.home-testimonials-inner-row {
	margin-block: 0;
	margin-inline: auto;
	max-width: calc(var(--col-step) * 10 - var(--grid-gutter) + var(--col-bleed-md));
}

.g-cols.via_flex.type_default.home-testimonials-inner-row > div > .vc_column-inner {
	padding: 0;
}

/* Grid Layout 311 is read-only over MCP, so the card fill and padding are set
   on what it emits. Padding is a ratio of the design's 544px card: 58 in from
   the left, 60 down from the top.

   **This is the ONLY inset the card gets.** Both layouts used to add another
   56 down / 32 in on their outer vwrapper (`usg_vwrapper_2`) from the Grid
   Builder, which landed the copy at 116/90 against the design's 60/58, and this
   file carried three rules zeroing it — on the archive, and below 600 for both
   grids. **He removed it in the Grid Builder itself on 2026-09-09** and all
   three went out with it. Measured after: content inset 60/58 on every card,
   and the cards 77px shorter (542 against 619) with the video card down from
   1239 to 1085. If a card ever springs back to a double inset, it was re-added
   in the builder — take it out there, not here. */
.testimonial-column .w-grid-item-h {
	height: 100%;
	padding: 11% 10.7%;
}

.testimonial-column-text .w-grid-item-h {
	background: var(--color-content-bg-alt);
}

/* The design alternates the fill down the stack: card 1 on Yellow #F2F1DF
   (= content_bg_alt), card 2 on #F5F5F5.

   #F5F5F5 has no predefined palette field to sit in — Figma's named colours are
   Deep Blue #212A60, Grey-Light #EBEBEA, Blue Dark #658AC4, Blue Medium #B7D6F4,
   Yellow #F2F1DF and Body #686A80, and `Grey-Light` is already spoken for by
   #EBEBEA (= alt_content_bg). So it is a Custom Global Color, named for the
   colour and slotted into that same Grey family: `_grey_lightest`.

   Note the variable name — underscores in the slug come out as hyphens. See the
   note at the top of ab-base.css. */
.testimonial-column-text .w-grid-item:nth-child(even) .w-grid-item-h {
	background: var(--color-grey-lightest);
}

.testimonial-column-video .w-grid-item-h {
	background: var(--color-content-secondary);
}

/* The split layout carries ONE text card, not a stack, so the alternation above
   never fires and it would land on Yellow. Figma gives it Grey-Lightest
   (1692:2323 = #F5F5F5) against the video card's Blue Medium (1692:2324) — the
   same pairing Home reaches on its SECOND card. Page-scoped because it is the
   composition that differs, not the component. */
.testimonials-split-section .testimonial-column-text .w-grid-item-h {
	background: var(--color-grey-lightest);
}

/* The two cards are NOT the same height here, and forcing them to be is the bug.
   In the split layout the left column carries the heading and button ABOVE its
   card, so a card at `height: 100%` matches the right card exactly and then sits
   389px lower — measured — with the bottoms no longer aligned. Figma bottom-
   aligns them and lets the left card be half as tall: 451 against 902.

   So the grid takes what the heading and button LEAVE, rather than the whole
   column. The shared `.testimonial-column .w-grid { height: 100% }` above is
   right for Home, where both columns hold nothing but a grid; here it is undone
   in favour of `flex: 1`. `min-height: 0` because a flex item will not shrink
   below its content without it. Measured ratio after: 0.50, against the design's
   0.50. */
.testimonials-split-section .testimonial-column .wpb_wrapper {
	display: flex;
	flex-direction: column;
}

.testimonials-split-section .testimonial-column .w-grid {
	height: auto;
	flex: 1;
	min-height: 0;
}

/* Both columns have to fill the row: the video card spans the full height of
   the two cards opposite it (902px in the design), and those two split that
   height evenly (450 / 451).

   Every link needs the height, INCLUDING `.wpb_wrapper` — that one is the trap.
   `.vc_column-inner` is `display: flex; flex-direction: column`, so its cross
   axis is horizontal and the wrapper gets no vertical stretch from it. With the
   chain starting at `.w-grid`, that 100% resolved against an unstretched 778.8px
   wrapper and the video card stopped ~50px short of the column bottom
   (measured) while the two text cards came out 440.3 / 388.3. */
.testimonial-column .wpb_wrapper,
.testimonial-column .w-grid,
.testimonial-column .w-grid-list {
	height: 100%;
}

.testimonial-column-video .w-grid-item {
	height: 100%;
}

/* `1fr` rather than `height: 100%` on the items: the list is a CSS grid, so the
   even split belongs to the row track. */
.testimonial-column-text .w-grid-list {
	grid-auto-rows: 1fr;
}


/* -----------------------------------------------------------------------------
   Grid Layout 506 "GPS Testimonials Grid v2" — type and ink

   NOTE ON WHERE THIS LIVES. Grid Layouts 311 and 406 carry their own type and
   colour inside the Grid Builder config, which is the house default and where
   the next person will look first. 506 is deliberately the other way round: it
   was given the `gps-testimonials-grid-v2` class on the grid wrapper so the
   values could be stated here against the design tokens instead of retyped as
   literals in a JSON blob the MCP cannot even read back. Keep the two in sync
   by not setting these properties in the Grid Builder at all.

   Every value is measured off the FAQ frame's testimonial block:
     quote  1795:1180  Heading XS — Platypi Medium 20/31, -.02em, Deep Blue
     name   1795:1183  Geist Medium 15/25, Deep Blue
     role   1795:1181  Geist Medium 15/25, BLUE DARK — not the `_content_faded`
                       the config reached for, which is #000 on this site.

   The `.w-post-elm-value` half of each pair is not redundant: the Grid Builder
   emits its own rule on that inner span, and the wrapper rule alone loses to it
   on `font-weight` and `line-height`. Measured, not assumed. */
.gps-testimonials-grid-v2 .w-post-elm.post_content {
	font: var(--h5-font-style) var(--h5-font-weight) var(--h5-font-size) / var(--h5-line-height) var(--h5-font-family);
	letter-spacing: var(--h5-letter-spacing);
	color: var(--color-content-heading);
}

.gps-testimonials-grid-v2 .w-post-elm.us_testimonial_author,
.gps-testimonials-grid-v2 .w-post-elm.us_testimonial_author .w-post-elm-value {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;    /* 25 / 15 */
	color: var(--color-content-heading);
}

.gps-testimonials-grid-v2 .w-post-elm.us_testimonial_role,
.gps-testimonials-grid-v2 .w-post-elm.us_testimonial_role .w-post-elm-value {
	font-size: var(--fs-md);
	font-weight: 500;
	line-height: 1.667;
	color: var(--color-alt-content-primary);
}

/* The pill is full width on the Self Assessment card, where it fills a 453px
   media card. In a testimonial it hugs its label — 362 measured against the
   design's 353. */
.gps-testimonials-grid-v2 .w-text.video-pill {
	width: fit-content;
}

/* Button Style 12 "Video Pill" is the same pill drawn by a `us_popup` trigger
   rather than a `us_text`, so the ground, type and radius come from Theme
   Options and only the YouTube mark is left here: us-core scales a button icon
   off the label's font-size, which would give 14px against the design's 34.

   The mark has to be BIGGER than the box that holds it — Figma puts a 34px
   glyph in a 38px pill (1795:1185), and letting it size the line box grows the
   pill to 49. So the `<i>` is zero-height with `overflow: visible`, and the
   glyph is centred on that zero line by flex rather than hung off a baseline.
   `line-height: 0` alone was the first attempt and it sent the mark out through
   the TOP of the pill: a zero-height inline box still has a baseline, and the
   glyph sits on it. Flex centring is what actually holds it in the middle.

   The button goes inline-flex for the same reason — `align-items: center` is
   what the icon's zero-height box centres against. */
.w-btn.video-pill-btn {
	display: inline-flex;
	align-items: center;
}

/* The pill wants roughly 37px above the quote in the design (1685:1827 ends at
   3923, 1685:1826 opens at 3960), against the 0.7rem the item's vwrapper gives
   every other pair. The ladder brackets it — 30 and 40 — and his call was the
   lower one: `--space-md`. Seven pixels under the frame, against a literal that
   would sit in the file belonging to nothing.

   It is a margin on the popup WRAPPER, not on the button: the trigger is
   wrapped in `.w-popup`, and that wrapper is the vwrapper's flex child — the one
   carrying `--vwrapper-gap` as its bottom margin. */
.gps-testimonials-grid-v2 .w-grid-item-h > .w-vwrapper > .w-popup {
	margin-bottom: var(--space-md);
}

/* Same story one card over: the video in layout 311 sits well clear of the quote
   under it, and the item's 0.7rem is not it. The frame measures 66 there
   (1685:1848 ends at 3747, 1685:1854 opens at 3813) — nearly twice the pill's
   37, because a player is a heavier object than a lozenge and needs the air to
   stop reading as part of the paragraph. `--space-2xl` is 60, the ladder's
   nearest rung.

   Same mechanism as the pill: the margin goes on `.w-video`, the vwrapper's own
   flex child. This reaches every 311 — Home's video column, the testimonial
   splits on Mastermind and FAQ, and the archive page. */
.gps-testimonials-grid .w-grid-item-h > .w-vwrapper > .w-video {
	margin-bottom: var(--space-2xl);
}

.w-btn.video-pill-btn i {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 0;
	overflow: visible;
	font-size: 34px;
	line-height: 0;
	color: #FF0000;
}

/* Decorative watermark. In the design it sits flush to the right edge of the
   1440 artboard (298x496 at x=1142), overlapping the tail of the card block.
   The bleed formula is ab-base's `.col-bleed-r-full`, written out because the
   element is absolutely positioned: it escapes the content column and lands on
   the viewport edge, where .l-canvas clips whatever runs over.

   Sizes in vw so it holds the design's 20.7% share of the screen. At a 1440
   viewport that reproduces the overlap exactly; wider than that the content
   column stays fixed while the screen grows, so the compass drifts clear of
   the cards. That is the layout being honest, not a bug. */
.testimonials-watermark-image {
	position: absolute;
	top: 34%;
	right: calc((100vw - var(--site-content-width)) / -2);
	z-index: 0;
	width: 20.7vw;
	pointer-events: none;
}

.testimonials-watermark-image img {
	display: block;
	width: 100%;
	height: auto;
}

/* ---- Card fields, from Figma ----

   Hooked on the meta-key classes the grid emits (`.us_testimonial_author` /
   `.us_testimonial_role`), never the `usg_post_custom_field_N` auto-indexes —
   those renumber when the layout is edited.

   BRIDGE, and it needs `!important`: the Grid Builder compiles its element
   settings to `.layout_311 .usg_post_custom_field_N { … !important }`, printed
   inline in the body, so it wins on source order against anything in this file
   at equal specificity. `.w-grid` is compounded on to get to 0-3-0. The proper
   home for these five values is the Grid Builder itself — set them there and
   this block can go. */

/* Quote — Figma "Heading XS Italic": Platypi Medium Italic 20/25.99. Family,
   size and weight ride the h5 tag now that it is corrected to 500 in Theme
   Options; only the italic and the line-height are stated here.

   Leading is **1.6**, his call 2026-09-09 — looser than the frame's 25.99/20 =
   1.3. These quotes run four to six lines in a card 546 wide, which is a much
   longer measure than the frame's, and at 1.3 the italic set solid. */
.w-grid.gps-testimonials-grid .w-post-elm.post_content p {
	font-family: var(--h5-font-family);
	font-size: var(--h5-font-size);
	font-weight: var(--h5-font-weight);
	font-style: italic;
	line-height: 1.6;
	color: var(--color-content-heading);
}

/* Author line — Geist Medium 15/25; name Deep Blue, role Blue Dark. */
.w-grid.gps-testimonials-grid .us_testimonial_author,
.w-grid.gps-testimonials-grid .us_testimonial_role {
	font-size: var(--fs-md) !important;
	font-weight: 500 !important;
	line-height: 1.667 !important;
}

.w-grid.gps-testimonials-grid .us_testimonial_author {
	color: var(--color-content-heading) !important;
}

.w-grid.gps-testimonials-grid .us_testimonial_role {
	color: var(--color-alt-content-primary) !important;
}

/* Avatar 83px against the grid's 4rem, then Figma's 16px gap to the name block —
   exactly --space-s.

   BOTH layouts need it. 311 and 506 carry the identical Grid Builder rule
   (`width: 4rem !important; aspect-ratio: 1/1; margin-right: 1rem;
   border-radius: 50%`, printed inline in the page), and only 311 was being
   corrected here — so the two grids rendered 83px and 64px avatars side by side
   on Home. Figma says 83 (confirmed 2026-08-27). `!important` plus the grid's
   own class, because the builder's rule is inline and therefore later in
   document order: at its own 0-2-0 an `!important` here would only tie. */
.w-grid.gps-testimonials-grid .post_image,
.w-grid.gps-testimonials-grid-v2 .post_image {
	width: 83px !important;
}

.w-grid.gps-testimonials-grid .w-hwrapper {
	gap: var(--space-s);
}


/* ---- The testimonial card's caption rhythm — at every width ----

   Two of the four Ruttl threads on this card (`ot2BTnnb` "ovde mozda treba manji
   line height", `z22wgpZW` "smanjiti ovaj razmak, sada je preveliki, mozda za
   trecinu") were fixed in the 1024 block first, because both were filed from a
   phone. Measured, neither value ever changed with the viewport — 15px on a
   25.005px line box is 1.667 at 1440 exactly as at 390, and the quote-to-
   attribution gap is 19px at both. So the card was reading one way on a phone
   and another on a laptop for no reason anyone had chosen. His call, 2026-09-12:
   take them to the base layer. Points 1 and 2 stay in the 1024 block, where they
   belong — those two ARE a constant beside a measure that has narrowed.

   THE LEADING: 1.3 is the caption figure the rest of the site uses; 1.667 is the
   body leading, which is what a caption inherits when nothing says otherwise.

   THE GAP is a SUM: the vwrapper's own `--vwrapper-gap` of 0.7rem = 11.2px, plus
   8px of `margin-top` authored on the hwrapper. Zeroing the added 8 leaves
   exactly the one value the component declares — a 41% cut, near enough her "za
   trecinu", and a number you can now read off the component instead of adding
   two up.

   The `!important` is the theme's own escape hatch rather than a shortcut: the
   8px is `.layout_506 .usg_hwrapper_1 { margin-top: 0.5rem !important }` in
   Impreza's GENERATED grid-layout stylesheet, so a plain (0,4,0) rule lost to a
   (0,2,0) one. Important against important is decided on specificity, and this
   selector wins that. Verified by listing every rule matching the element and
   reading its priority flag — the first attempt looked like an ordinary
   specificity loss until the flag showed otherwise. */
.w-grid-item.type-us_testimonial .post_custom_field .w-post-elm-value {
	line-height: 1.3;
}

.w-grid-item.type-us_testimonial .w-vwrapper > .w-hwrapper {
	margin-top: 0 !important;
}


/* =============================================================================
   Home — lower sections
   ============================================================================= */

/* ---- Full-bleed live-event band ---- */

.home-event-band-image img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 1616 / 609;
	object-fit: cover;
}

/* ---- "Why Be a Group Practice Owner Now?" ----
   Sized by the h1 tag (Theme Options → Typography) via .h1-style — h1 was
   unused on this site and its calc(32px + 2vw) lands on the design's ~56px.
   Only the one-off display treatment stays here. */
.home-why-title {
	text-align: center;
	font-style: italic;
}

/* ---- "high calling" band ---- */

/* The indent is PADDING on the list, not a margin, so the marker is drawn
   inside the element's own box — and it scales with the font instead of being a
   fixed 12px.

   The number is the MARKER BOX, measured rather than guessed: 22px at 16px type
   (1.375em — glyph plus the gap Chrome puts after it), not the ~12px it looks
   like. With `outside` that box is laid immediately before the text, so any
   padding smaller than it pushes the bullet out of the list's own box: at the
   previous 12px margin the marker started at x=14 against a column whose copy
   starts at 24 — ten pixels out in the gutter, visibly left of everything above
   it. At 1.4em the marker box starts exactly on the column's text edge and the
   copy sits 22px in. An ordered list would need more again; none here has one.

   `list-style-position` stays `outside`. `inside` would pull the marker into
   the text flow and send every wrapped line back under it — and on a phone
   every item in these lists wraps. */
.calling-list ul {
	margin-left: 0;
	padding-inline-start: 1.4em;
}

.calling-list li {
	margin-bottom: var(--space-2xs);
}

/* Air above the signature — Ruttl, desktop AND iPad, 2026-09-09: "malo veci
   razmak ovde od body do pisanog fonta". It was 8px. Not 8px of anything
   authored: the wrapper is block layout and both boxes compute `margin: 0`, so
   what separates them is the LAST li's `--space-2xs` bottom margin collapsing
   out through the ul and the `.wpb_text_column` — the list's internal rhythm
   leaking out and standing in for a section gap.

   54px is the design's own number: frame 1685:1772 is a 54px-gap column, list
   block then "Ken & Ernie" (the 32px above it is the label-to-list gap, which
   the site renders at 24 — not flagged, left alone).

   `margin-top` rather than a bottom margin on the list, because it collapses
   with that escaping 8px instead of adding to it: adjacent siblings take the
   larger of the two, so this lands on exactly 54 and not 62. */
.home-calling-section .handwriting-style {
	margin-top: 54px;
}

/* ---- Our approach: copy laid over the photo, anchored bottom-left ---- */

.approach-media-column > .vc_column-inner {
	position: relative;
}

/* Scrim so the white copy stays legible over a light photo. It hangs off the
   IMAGE, not the column: the image states its own aspect ratio, so its box is
   the one guaranteed to match the photo exactly — the column can outgrow it
   whenever the copy half is taller, and the gradient would then fade against
   bare background instead of the photo.

   z-index 1 against the overlay text's 2. `.w-image` takes no z-index of its
   own, so it opens no stacking context and the two still compare directly
   inside .vc_column-inner. pointer-events: none so it never eats clicks. */
.w-image.approach-image {
	position: relative;
}

.w-image.approach-image::after {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 1;
	pointer-events: none;
	background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(95, 96, 110, 0.45) 100%);
}

.approach-image img {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 720 / 709;
	object-fit: cover;
}

/* Design places this 80px in from the left and bottom of a 720px half —
   percentages so it holds at any viewport (percentage padding resolves
   against width, which is what the design's ratio is measured from). */
.approach-overlay-text {
	position: absolute;
	inset: auto 0 0 0;
	z-index: 2;
	max-width: 72%;
	padding: 11%;
	color: #ffffff;
}

/* Copy half: the design insets the text 124px from the left of a 720px half
   and leaves 92px on the right. Compounded onto the inner row's own class for
   two reasons — Impreza's `.g-cols.via_flex.type_default > div > .vc_column-inner`
   is 0-4-1 and beat the plain descendant form (measured: padding stayed at
   15px), and at 0-5-2 this also survives `cols-flush`'s 0-5-1 padding reset,
   which is exactly the escape hatch that reset is designed to leave open. */
.g-cols.via_flex.type_default.home-approach-inner-row > div.approach-copy-column > .vc_column-inner {
	padding-inline: 17% 13%;
}

/* The overlay resolves against .vc_column-inner, so the wrapper between them
   must not become a containing block of its own. */
.approach-media-column > .vc_column-inner > .wpb_wrapper {
	position: static;
}

/* See the note on .calling-list ul. */
.approach-list ul {
	margin-left: 0;
	padding-inline-start: 1.4em;
}

.approach-list li {
	margin-bottom: var(--space-2xs);
}

/* ---- Programs split: two stacked panels beside the video ---- */

/* The panels share the column's height evenly, so the chain above them has to
   be full height first — neither .vc_column-inner nor .wpb_wrapper takes it
   on its own. */
.programs-list-column > .vc_column-inner,
.programs-list-column > .vc_column-inner > .wpb_wrapper {
	height: 100%;
}

.programs-list-column > .vc_column-inner > .wpb_wrapper {
	display: flex;
	flex-direction: column;
}

/* Design splits the half 365 / 345 — near enough to equal that flex: 1 on
   both is the honest expression of it.

   Horizontal padding is a percentage because the design states it as a ratio:
   the title starts 96px into a 720px panel and the arrow ends 93px from the
   right — 13.3% / 12.9%. A fixed 3.5rem read as 56px on our 938px panel, less
   than half of that.

   Alignment is NOT here — `alignment="justify"` and `valign="middle"` on the
   element carry it. Vertical padding is only a floor: the middle alignment
   centres the row in whatever height flex hands it (477px here), so the padding
   matters only where the content would otherwise outgrow the panel. */
.program-item-hwrapper {
	flex: 1;
	padding-inline: 13%;
	padding-block: clamp(1.5rem, 4vw, 3rem);
}

.program-item-cream {
	background: var(--color-content-bg-alt);
}

.program-item-blue {
	background: var(--color-content-secondary);
}

/* `balance` evens the line lengths instead of filling each line greedily, which
   is what keeps "1-on-1 Coaching Consultation Services" from leaving a one-word
   last line next to the arrow. The max-width stays as the outer bound — balance
   distributes within it, it does not set it. */
.program-item-title {
	max-width: 22ch;
	text-wrap: balance;

	/* Size tracks the COLUMN, not the viewport ladder — Ruttl 2026-09-09, four
	   threads, the same two titles flagged from both narrow widths: iPad
	   `rR2ZI3jUvQBlinuZSPs1` / `scCdMty2gawZH3tKDHVr`, iPhone
	   `nTu3TUT7Ly0VeUDW271w` / `hajkyMfaw9gb1J3yKsRr`.

	   What was actually wrong is worth stating, because "font too big" is the
	   symptom and not the cause. MEASURED: every box in this component scales
	   with the container — the panel is half the viewport (the row is
	   width="full"), its inset is 13% of the panel at 1440 and 13% at 820, and
	   the title box is 51.7% of the panel at 1440 and 52.6% at 820. The type was
	   the ONE thing that did not: `h2-style` is on the site-wide viewport clamp,
	   which falls 44 → 34.5 between 1440 and 820 while its box falls 372 → 212.
	   So the title got proportionally BIGGER as the column narrowed, and
	   "1-on-1 Coaching Consultation Services" reached FOUR lines in a 212px box.

	   Worse on the tablet than on the phone, which is why the iPad wording is
	   sharper: at 375 the row is stacked, so the box is 229 — WIDER than the
	   tablet's 212 — with a smaller 30px type in it.

	   The fix is one ratio, taken from the design: 44 / 372 = 0.1183 of the title
	   box, and the box is a constant 0.2584 of the viewport across the whole
	   2-up range (372/1440 and 212/820 agree to three decimals). 0.1183 * 0.2584
	   = 3.06vw. Capped at 44px, which it reaches at 1440 — the artboard width —
	   so the desktop review is untouched.

	   Below 768 the row stacks, the column becomes the full width and the ratio
	   no longer holds, so that range keeps its own anchored clamp: 27px at 375
	   (the same 0.1183 of the 229px box) rising to the 33.4px it already renders
	   at 767, which nobody flagged.

	   There IS a step at the boundary: 33.4px at 767, 23.5px at 768. Deliberate.
	   768 is exactly where `tablets_columns="1"` splits one full-width row into
	   two half-width ones (verified by measuring at 767 and at 820), so the type
	   drops because its container just halved. A discontinuity that accompanies a
	   layout change reads as the layout changing; one in the middle of a stable
	   range would read as a bug. */
	font-size: clamp(27px, calc(20.9px + 1.63vw), 34px);
}

@media (min-width: 768px) {

	.program-item-title {
		font-size: min(3.06vw, 44px);
	}
}

/* The video is out of flow, so this column has no intrinsic height and the
   two panels opposite it collapsed to their text (measured 485px against the
   design's 710). The design ratio of the video half restores it, and the
   panels then stretch to match. */
.programs-video-column > .vc_column-inner {
	position: relative;
	aspect-ratio: 720 / 710;
}

/* Full-height chain, and it has to be spelled out at every link.
     - `.ratio_initial` must be in the selector: Impreza's own
       `.w-video.ratio_initial .w-video-h` is 0-3-0 and beats a plain
       `.programs-video-column .w-video-h` (0-2-0). Measured: the video stayed
       at its intrinsic 150px until the class was included.
     - width has to be explicit too. With only `inset: 0` + `height: 100%` the
       box is over-constrained vertically but not horizontally, so the video
       sized itself 16:9 off the height and ran 1696px wide in a 968px column.
     - overflow: hidden clips whatever `cover` crops.
   `left: 0` + `width: 100%` is only correct because the row carries
   `cols-flush`, which strips the column padding — so the padding box the video
   resolves against IS the content box the panels opposite it sit in. Without it
   the video lands half a gutter left of the seam and half a gutter past the
   document edge. Do not "fix" that here; fix it on the row. */
.programs-video-column .w-video.ratio_initial {
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	overflow: hidden;
	z-index: 1;
}

.programs-video-column .w-video.ratio_initial .w-video-h {
	width: 100%;
	height: 100%;
}

.programs-video-column .w-video video {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.programs-video-text {
	position: absolute;
	inset: auto 0 0 0;
	z-index: 2;
	max-width: 34ch;
	padding: clamp(1.5rem, 3vw, 3rem);
}


/* =============================================================================
   Mastermind Groups page — geometry only

   Everything typographic and every recurring component is in the shared section
   above. What is left here is what exists exactly once.
   ============================================================================= */

/* NOTE: the hero itself is no longer here — it is the shared `hero-*` component
   in the section above, because Mastermind, 1-on-1 and About draw it at exactly
   the same coordinates. Only what exists once on this page is below. */

/* Pricing is two full-bleed halves in different colours (Figma 1692:2049 white /
   1692:2050 Yellow).

   The colours are painted on the SECTION as a hard-stop gradient, not on the two
   `.vc_column-inner`s, and the row is a NORMAL grid row — not `width="full"`.
   That distinction is the whole point: a full-width row makes its columns halves
   of the VIEWPORT, which have no relationship to `--col-step` (derived from
   --site-content-width), so every grid utility used inside one measures against
   the wrong thing and lands wherever it lands. Same trick as
   `.framework-section::before` further up — paint past the grid, keep the
   content on it.

   The stop is at 50%, which is where Figma splits it too (720 of 1440). */
.mm-pricing-section {
	background: linear-gradient(
		to right,
		var(--color-content-bg) 0 50%,
		var(--color-content-bg-alt) 50% 100%
	);
}

/* The column insets. Now that the row is on the grid these are read from the
   content edge, so the design's 142 is the grid's 80 plus this 60.

   The selector still has to out-specify Impreza's own gutter rule,
   `.g-cols.via_flex.type_default > div > .vc_column-inner` at 0-4-1 — a bare
   `.mm-pricing-offer-column > .vc_column-inner` (0-2-0) loses the inline axis of
   the shorthand and keeps the 15px gutter (measured).

   The offer half has no bottom padding: the price slab below finishes it. */
.g-cols.via_flex.type_default > .mm-pricing-offer-column > .vc_column-inner {
	padding: var(--space-3xl) var(--space-2xl) 0;
}

.g-cols.via_flex.type_default > .mm-pricing-skills-column > .vc_column-inner {
	padding: var(--space-3xl) var(--space-2xl);
}

/* The one inverted eyebrow pill on the site — Blue Dark ground, white type
   (1692:2359). The other four on this page are the default Grey-Light ground
   with Blue Dark type, so this is a deviation and stays page-scoped rather than
   becoming a modifier class; the component's base is untouched.

   It is inverted for a reason that would recur: this pill sits on the Yellow
   half, where the default #EBEBEA ground is all but invisible. If a second one
   turns up, that is the moment to promote it to `eyebrow-pill is-invert` and
   delete this. */
.mm-pricing-skills-column .eyebrow-pill {
	background: var(--color-alt-content-primary);
	color: var(--color-content-bg);
}

/* The price slab spans the WHOLE left half — viewport edge to the halves'
   boundary — which is what Figma draws (1692:2261, x=-4 to 720 of 1440).

   That single requirement is why the row was `width="full"` to begin with. The
   cost of solving it that way was the entire section losing the grid, so the
   slab bleeds on its own instead and the row stays where it belongs. Neither
   `narrow-el-*` nor `col-bleed-*` is used here: they cap and shift, and what
   this needs is to escape its column in both directions by different amounts.

   LEFT edge, deliberately over-shot. `100vw` counts the scrollbar while the
   document does not, so the term overshoots left by half a scrollbar (measured
   7.5px at 1920). Harmless — it bleeds outward into `.l-canvas`'s
   `overflow-x: clip`, and erring outward is what keeps a gap from ever showing.
   ab-base's own `col-bleed-*-full` carries the same approximation.

   RIGHT edge, exact. It has to land on the gradient's 50% stop or the seam
   shows, so it is the column's own padding negated — no viewport term, nothing
   to drift. Measured: 952.5, which is the section's midpoint to the half-pixel.

   ONLY THE BACKGROUND LEAVES THE GRID. The copy inside must still line up with
   the mark, heading and tick list above it, so `padding-left` is the exact
   negation of `margin-left` — same three terms, opposite sign. Written out
   rather than shared through a custom property because a `calc()` holding `100vw`
   resolves where it is USED, and the two are used on the same element anyway;
   if one is ever edited, edit both. Measured: copy starts at 357.5, which is the
   column's own content edge.

   `max-width: none` because the hwrapper would otherwise be held by whatever
   width it inherits. */
.mm-pricing-offer-column .price-panel {
	margin-left: calc(
		(100vw - var(--site-content-width)) / -2
		- var(--space-2xl)
		+ var(--grid-gutter) / 2
	);
	margin-right: calc(var(--space-2xl) * -1);
	max-width: none;
	padding: var(--space-lg) var(--space-2xl) var(--space-lg)
		calc(
			(100vw - var(--site-content-width)) / 2
			+ var(--space-2xl)
			- var(--grid-gutter) / 2
		);
	background: var(--color-content-secondary);
}

/* =============================================================================
   FAQ accordion

   Figma 1795:1246. `vc_tta_accordion` with `toggle_style="style_2"` already
   gives the stacked, gapped, cream-grounded rows; what is below is the gap
   between that default and the design.

   THE `!important`s ARE NOT LAZINESS. The theme ships a stylesheet this page
   cannot enumerate from script (one sheet throws on `cssRules`), and it sets the
   title's font metrics, the section's ground and border, and the control bars'
   insets with `!important`. Measured, not assumed: a LITERAL `font-size: 20px`
   at 0-3-0 lost, and the same declaration with `!important` won. Same shape as
   the Gravity Forms submit button — where Theme Options hardwires a value, the
   child theme has to answer in kind.
   ============================================================================= */

/* Ground and hairline move from the SECTION to the HEADER. The design opens a
   row by repainting its header Blue Medium and leaving the answer on the page's
   own ground; Impreza paints the whole section instead, which would carry the
   cream down behind the answer. */
.faq-accordion .w-tabs-section {
	background: none !important;
	border: 0 !important;
}

/* Design row is 95px with a 30px title line, i.e. ~32 a side against 24 inline.
   Snapped to the ramp at 30 / 20; measured 94. */
.faq-accordion .w-tabs-section-header {
	padding: var(--space-md) var(--space-sm);
	background: var(--color-content-bg-alt);
	border: 1px solid var(--color-alt-content-primary);
	/* Square, deliberately: neither 1795:1249 (open) nor 1795:1257 (closed)
	   carries a corner radius, and `toggle_style_2` gives it one by default. */
	border-radius: 0;
}

.faq-accordion .w-tabs-section.active .w-tabs-section-header {
	background: var(--color-content-secondary);
}

/* Heading XS Italic — the question wears h5 rather than the h3 its tag would
   give it, which is what `title_tag="h3"` is for: the tag is for SEO and the
   scale is the design's. Ink is Blue Dark closed, Deep Blue open. */
.l-body .faq-accordion .w-tabs-section-title {
	font-family: var(--h5-font-family) !important;
	font-size: var(--h5-font-size) !important;
	font-weight: var(--h5-font-weight) !important;
	font-style: italic !important;
	line-height: var(--h5-line-height) !important;
	letter-spacing: var(--h5-letter-spacing);
	color: var(--color-alt-content-primary);
}

.l-body .faq-accordion .w-tabs-section.active .w-tabs-section-title {
	color: var(--color-content-heading);
}

/* The control is a 32px outlined circle, not Impreza's bare glyph.

   `position: relative` is load-bearing and easy to lose. Impreza's plus is two
   absolutely positioned bars, and the only thing giving them a containing block
   is the ROTATION the theme puts on the control. Cancel that rotation without
   restoring a containing block and the bars resolve against the section instead:
   the circles render empty and a 745px hairline appears down the left of the
   accordion. That was a real ten-minute detour. */
.faq-accordion .w-tabs-section-header .w-tabs-section-control {
	box-sizing: border-box;
	position: relative;
	flex: none;
	width: 32px;
	height: 32px;
	border: 1px solid var(--color-alt-content-primary);
	border-radius: var(--radius-circle);
	transform: none !important;
}

/* Impreza runs the bars edge to edge — right for a bare glyph, wrong inside a
   plate. Centred with `translate` rather than `transform` so nothing fights the
   theme's own transform machinery. */
.l-body .faq-accordion .w-tabs-section-control::before,
.l-body .faq-accordion .w-tabs-section-control::after {
	top: 50% !important;
	bottom: auto !important;
	left: 50% !important;
	right: auto !important;
	translate: -50% -50%;
	/* `!important` and `.l-body` both earn their place: us-style paints the bars
	   with `currentColor`, so without them the plus inherits the body ink
	   (#686A80) instead of Blue Dark. Measured 2026-08-26, not assumed. */
	background-color: var(--color-alt-content-primary) !important;
}

.faq-accordion .w-tabs-section-control::before {
	height: 38% !important;
}

.faq-accordion .w-tabs-section-control::after {
	width: 38% !important;
}

/* Open reads as a minus, not as the × the theme's 135deg rotation would give. */
.faq-accordion .w-tabs-section.active .w-tabs-section-control::before {
	opacity: 0;
}


/* Impreza pads the content WRAPPER (1.5rem at 0-4-0) as well as the inner box,
   which doubles the design's single 40px inset to 64. Zero the outer one and
   let `-content-h` carry the whole inset. Five classes to clear the theme's
   `.w-tabs.accordion > div > .w-tabs-section > .w-tabs-section-content`. */
.l-body .faq-accordion.w-tabs > div > .w-tabs-section > .w-tabs-section-content {
	padding: 0;
}

/* The answer is the ONE place on the site set in Figma's Body/Body TEXT token —
   Geist Regular 18/27 (1795:1253) — where everything else uses Body/Body small
   16/30. Hence `--fs-xl` in this file's :root, and the leading restated as
   27/18: Global Text now runs 1.875, which at 18px would give 33.75.
   The ink needs nothing — Content Text is Deep Blue as of 2026-08-26. */
.faq-accordion .w-tabs-section-content-h {
	padding: var(--space-lg);
	border-bottom: 1px solid var(--color-alt-content-primary);
	font-size: var(--fs-xl);
	line-height: 1.5;
}



/* =============================================================================
   About Us page — geometry only

   Everything typographic and every recurring component is in the shared sections
   above. What is left here is what exists exactly once on this page.
   ============================================================================= */

/* The page draws the split-media band TWICE at two different photo heights:
   597x841 for the story band (the component default) and 597x893 for "Our
   Roots". Only the deviation is stated.

   This section spent 2026-08-24/25 fighting its photo and is back to the plain
   component. Worth knowing why, so nobody re-opens it: the first replacement
   photo of Joe, Ken and Ernie was landscape with the three faces across 63% of
   its width, which no portrait crop could hold — that forced the photo out of
   flow with the COPY driving the band height, and a `padding-block` on the copy
   column to replace the height the photo had been giving. All of that is gone
   now, because he supplied a PORTRAIT crop of the three of them at 596x893,
   which is the Figma slot to the pixel. If the photo is ever swapped for a
   landscape one again, that whole apparatus is in the git history rather than
   worth rebuilding from scratch. */
.about-roots-section .split-media-image img {
	aspect-ratio: 597 / 893;
}


/* =============================================================================
   Footer
   ============================================================================= */

.footer-logo img {
	width: 246px;
	height: auto;
}

.footer-title {
	margin-bottom: var(--space-sm);
}

/* ---- The three rules that meet ----

   Figma draws a horizontal at the top of the block (1685:1949, x80→1360), a
   vertical between the links and the offerings (1685:1950, x795, y8416→8855) and
   a horizontal at the bottom (1685:1870). All three share their endpoints, so
   they read as one frame — and the only way to guarantee that is to make them
   EDGES OF ONE BOX rather than three elements with margins between them.

   That is why the two `us_separator`s are gone and the copyright's own
   `border-top` was cleared: a separator's margin IS the gap that stops a
   column's vertical rule from reaching the horizontal. Nothing can close it from
   the CSS side without hard-coding the separator's own margin.

   The horizontals are pseudo-elements rather than `border-block` on the row,
   because `.g-cols` carries Impreza's negative inline margin: a border would run
   half a gutter past the content on each side and miss the copyright text below
   it by 15px. Insetting the pseudo-elements by that half gutter puts them on the
   content edges, where the design has them.

   The columns reach both horizontals because of `equal_columns_height="1"` on the
   inner row, not an `align-items` here — that is the row's own builder setting for
   exactly this. */
.g-cols.via_flex.type_default.footer-inner-row {
	position: relative;
}

.footer-inner-row::before,
.footer-inner-row::after {
	content: '';
	position: absolute;
	left: calc(var(--grid-gutter) / 2);
	right: calc(var(--grid-gutter) / 2);
	height: 1px;
	background: var(--color-footer-text);
}

.footer-inner-row::before {
	top: 0;
}

.footer-inner-row::after {
	bottom: 0;
}

/* The breathing room goes on the COLUMNS, not the row. On the row it would sit
   inside the border box, so the stretched columns would stop short of the
   horizontals and the vertical rule would fall shy at both ends. On the columns
   the stretch still fills the row edge to edge. */
.g-cols.via_flex.type_default.footer-inner-row > .wpb_column > .vc_column-inner {
	padding-block: var(--space-xl);
}

.footer-offerings-column {
	position: relative;
}

.footer-offerings-column::before {
	content: '';
	position: absolute;
	left: calc(var(--grid-gutter) / -2);
	top: 0;
	bottom: 0;
	width: 1px;
	background: var(--color-footer-text);
}

/* …and it goes away the moment the columns stop being columns.

   Ruttl iPad `LzbbBiDDsEAzZAym31gn`: "ukloniti ovu liniju". The column is
   `vc_col-sm-12 vc_col-md-5`, so from 1024 down it is full width and this rule
   is no longer a divider BETWEEN two columns — it is a 1px hairline hanging
   down the left edge of a stacked block, 322px of it, out in the gutter.

   Hidden from 1024 down, which reaches the phone as well as the tablet. There is
   no mobile thread for it, but it is the same stray line from the same cause, and
   a vertical divider under a stacked layout is not a judgement call.

   The horizontal `::before` / `::after` on `.footer-inner-row` STAY — those span
   the row and still mean something stacked. Only the vertical one is conditional.

   How this was found is worth writing down: I scanned the whole footer for a line
   with `querySelectorAll('*')` and reported to him, with confidence, that the
   footer contained none. That scan CANNOT see pseudo-elements — it walks elements.
   He knew the answer and named this selector. To look for a painted rule, iterate
   elements AND call `getComputedStyle(el, '::before')` / `'::after'` on each. */
@media (max-width: 1024px) {

	.footer-offerings-column::before {
		display: none;
	}
}

/* Figma's Heading S Italic: Platypi Medium Italic 27/35 in Grey-Light #EBEBEA.
   Size, family and weight ride `h4-style`; the italic and the colour are the
   two things the tag does not carry. #EBEBEA is the palette's
   alt_content_bg — the same Grey-Light token, not a new value. */
.footer-pitch-title {
	max-width: 20ch;
	font-style: italic;
	color: var(--color-alt-content-bg);
}

/* Offerings are dark panels, not outlined rows — the same #101531 as the We
   Offer cards (alt_content_bg_alt), square corners.

   Figma states the padding as 30 top / 35 right / 33 bottom / 24 left. Those four
   numbers are not a system — they are drift in the design file, and `--space-md`
   is exactly the 30px they cluster around. One token beats four literals that
   only pretend to be intentional. Same for the 13px between panels: that is
   `--space-xs` (12px) with a rounding error.

   Vertical alignment is NOT set here: it belongs to the element's own `valign`
   param (`middle`), which emits `.valign_middle`. Figma has the arrow at the top
   (`items-start`), but centred reads better against a two-line title. */
.footer-offer-hwrapper {
	padding: var(--space-md);
	background: var(--color-alt-content-bg-alt);
	border: 0;
	border-radius: 0;
}

.footer-offer-hwrapper + .footer-offer-hwrapper {
	margin-top: var(--space-xs);
}

/* The whole panel is the link. `link` on the us_hwrapper does NOT wrap the row in
   an <a> — Impreza adds `.has-link` and injects a sibling `.w-hwrapper-link`
   absolutely positioned over the box at z-index 10. So there are no nested
   anchors, but the overlay also covers the arrow button: `elementFromPoint` over
   the button returns the overlay, which means the button never receives :hover
   and its own Button Style hover state can never fire. The box has to supply the
   feedback instead.

   What can actually be restyled from here is narrower than it looks. Verified by
   injection on the live page: `background` and `color` on `.w-btn`, and
   `background` on `.w-btn::before`, are immovable — they resist even
   `!important` at 0-5-0, because Impreza drives them through its own
   fade-transition machinery. `transform`, `outline` and geometry DO apply. Hence
   the arrow nudges rather than filling, which also matches the
   `.w-btn.icon_atright:hover .custom-arrow-icon` idiom used elsewhere here.

   The hover ground stays exactly as it is. The earlier version lightened
   #101531 toward white with `color-mix`, which produced a colour that exists
   nowhere in the palette and read as muddy against the footer's #212A60. The
   feedback is a 1px inset ring in Blue Dark instead — `--color-alt-content-primary`
   is the accent this colour scheme already uses, `inset` keeps it inside the box
   so nothing reflows, and it pairs with the title going to white (the footer's
   own `link_hover`) and the arrow nudge. */
.footer-offer-hwrapper {
	transition: box-shadow 0.3s ease;
}

.footer-offer-hwrapper:hover {
	box-shadow: inset 0 0 0 1px var(--color-alt-content-primary);
}

.footer-offer-hwrapper:hover .footer-offer-title {
	color: #ffffff;
}

/* Nudge the WHOLE button, not just the glyph inside it.

   It has to be the `translate` property, not `transform`: Impreza owns
   `transform` on `.w-btn` for its own hover machinery and any value written here
   collapses to the identity matrix (measured — `translateX(6px)` came back as
   `matrix(1, 0, 0, 1, 0, 0)`). `translate` is a separate property that composes
   with whatever `transform` is doing, and it is untouched. Same reason
   `background` / `color` / `opacity` on `.w-btn` are unreachable — see the note
   above the box-hover rules. */
.program-item-hwrapper .w-btn,
.footer-offer-hwrapper .w-btn {
	transition: translate var(--transition-base);
}

.program-item-hwrapper:hover .w-btn,
.footer-offer-hwrapper:hover .w-btn {
	translate: 4px 0;
}

/* Figma 1685:1955: Platypi Medium 16/22, letter-spacing -0.32, in Blue Medium
   #B7D6F4 — the same text colour as the We Offer cards. It was rendering in Geist
   at the footer's Blue Dark, so family and colour both had to be stated. */
.footer-offer-title {
	max-width: 24ch;
	font-family: var(--h1-font-family);
	font-size: var(--font-size);
	line-height: 1.375;
	letter-spacing: -0.02em;
	color: var(--color-content-secondary);
}

.above-footer-cta-hwrapper .w-btn-label {
	white-space: nowrap;
}


/* =============================================================================
   Self Assessment (367) — Figma 1797:1313

   Three rows: the shared hero, a full-bleed two-panel band carrying the Kit
   opt-in form, and the testimonials split. Only the band and the Kit embed are
   page geometry; everything else is the component vocabulary.
   ============================================================================= */

/* Design puts 48px between the copy group and the button where the wrapper's
   own gap is 24 (1797:1684). */
.assessment-hero-section .hero-copy-vwrapper > .w-btn-wrapper {
	margin-top: var(--space-sm);
}

/* The media card's label is a pill with the YouTube mark pushed to its right
   edge — the same figure the testimonial grid layout draws, hence a component
   name rather than a page-scoped one. It rides `eyebrow eyebrow-pill` and only
   states what differs: full width, the taller 12px padding, and Body Grey ink.

   That grey is a NAMED Figma token ("Body", #686A80) that used to be Theme
   Options → Content Text. Since that moved to Deep Blue on 2026-08-26 the
   colour was orphaned, so it lives on as the `_body_grey` Custom Global Color
   rather than as a literal here. */
/* The pill is the popup's `trigger_selector`, not a link, so it carries no
   anchor of its own — hence the explicit cursor and hover. */
.w-text.video-pill {
	display: flex;
	width: 100%;
	padding: 12px 21px;
	color: var(--color-body-grey);
	cursor: pointer;
	transition: color 0.2s ease;
}

.w-text.video-pill:hover {
	color: var(--color-content-heading);
}

.video-pill .w-text-h {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--space-sm);
	width: 100%;
	color: inherit;
}

/* The video itself opens in Impreza's own lightbox: a `us_popup` with
   `show_on="selector"` sits in the same column, holds a `vc_video`, and names
   `.assessment-hero-section .video-pill` as its trigger. That shape renders NO
   trigger markup of its own (measured: `.w-popup` is 836x0), so the card's
   layout is untouched and the pill stays a plain `us_text`. The Welcome band on
   Mastermind does the same thing with `show_on="image"` and a poster. */

/* The loading state of a video lightbox.

   A `us_popup` that lives inside a Grid Layout item gets the class
   `for_list-item` and does NOT ship its content with the page: Impreza fetches
   it from `admin-ajax.php` on the first open. Measured on Home's testimonial
   grid: the wrap opens at 12ms, the XHR takes **1212ms**, the iframe appears at
   1226 and the YouTube embed itself needs a further 304 — so for a second and a
   half the lightbox is real and its content is not. Impreza does put a
   `g-preloader` in there, but on an unstyled box that is a 393x80 white strip
   across a dimmed page with a small spinner in it, which reads as broken rather
   than as loading.

   So the empty box is given the shape of the thing that is coming: 16/9 at the
   popup's own width, in the site's navy with a Blue Medium spinner. The final
   player lands at exactly that size, so nothing jumps either. `:has()` is what
   scopes it — the preloader is a child only while the content is outstanding,
   and Impreza replaces it wholesale when the response arrives, so the rule
   switches itself off with no JS and no class to clean up.

   This does not make it faster. The 1212ms is server time on admin-ajax and
   belongs to the host; re-measure on production before engineering around it. */
.w-popup-wrap.ab-video-popup .w-popup-box-content:has(> .g-preloader) {
	display: flex;
	align-items: center;
	justify-content: center;
	aspect-ratio: 16 / 9;
	background: var(--color-content-primary);
}

.w-popup-wrap.ab-video-popup .w-popup-box-content > .g-preloader {
	color: var(--color-content-secondary);
}

/* FA's brand mark stands in for the design's multicolour selfhst glyph — same
   size, same red, one font instead of an SVG upload. */
.video-pill i {
	flex: none;
	font-size: 34px;
	line-height: 1;
	color: #FF0000;
}

/* The two panels ARE the row's columns. Background on `.vc_column-inner` rather
   than a `cols-flush` row: the gutter lives inside that box, so painting it
   makes the halves meet with no seam while the gutter survives as part of the
   inset the design asks for. Five classes to clear Impreza's own gutter rule
   (`.g-cols.via_flex.type_default > div > .vc_column-inner`, 0-4-1).

   Insets are percentages, not lengths: the design states 164px inside an
   844-wide panel and 71px inside a 596-wide one, and those ratios are what
   holds when the band is 1920 wide rather than 1440. */
.g-cols.via_flex.assessment-access-inner-row > .assessment-form-column > .vc_column-inner {
	padding: 7.5rem 19.4%;
	background: var(--color-content-secondary);
}

.g-cols.via_flex.assessment-access-inner-row > .assessment-points-column > .vc_column-inner {
	padding: 6.5rem 11%;
	background: var(--color-content-bg-alt);
}

/* The seam between the two panels has to land on the SAME vertical line as the
   hero photo's left edge, directly above it — that is what the design draws,
   and at 1440 a plain 7/12 split happens to hit it.

   It does not hold anywhere else. The hero is a normal content-width row: its
   photo column starts at 7/12 of the 1280 GRID, which sits inside the centred
   content block. This band is `width="full"`, so its 7/12 is 7/12 of the
   VIEWPORT. The two only coincide when viewport = content width; at 1920 they
   were 37px apart, which is what he saw.

   Restating the grid line as a percentage of the full-width row closes it:

     grid line = (100% - CW)/2 + CW * 7/12
               = 50% + CW/12

   plus half a gutter, because the photo is inset by the column's own padding
   while the panel paints from the column edge. Measured after: 2px apart.

   `col-bleed-*-full` was tried first and does NOT work here — these are flex
   grid columns, and a negative margin lets a sibling overlap without growing
   the box. It left the panel stopping 600px short of the screen edge. */
.g-cols.via_flex.assessment-access-inner-row > .assessment-form-column {
	flex: 0 0 auto;
	width: calc(50% + var(--site-content-width) / 12 + var(--grid-gutter) / 2);
	max-width: none;
}

.g-cols.via_flex.assessment-access-inner-row > .assessment-points-column {
	flex: 0 0 auto;
	width: calc(50% - var(--site-content-width) / 12 - var(--grid-gutter) / 2);
	max-width: none;
}

/* 1797:1459 — Heading XS throughout (the `h5-style` on the block), with the
   nested level in its italic. Figma separates the three groups with an empty
   line rather than per-item spacing, so the space belongs to the nested list,
   not to `li + li`. */
.assessment-points ul {
	margin: 0;
	padding-left: 1.15em;
	list-style: disc;
}

.assessment-points li {
	margin: 0;
}

.assessment-points ul ul {
	margin-block: 1.55em;
	font-style: italic;
	line-height: 1.3;
}

/* =============================================================================
   Contact (15) — the Gravity Form

   The page embeds GF with its own `[gravityform]` shortcode, not a us-core
   element. Impreza still reaches it: Field Style 1 paints the inputs (that is
   why they already match the rest of the site), and the submit button is mapped
   onto Button Style 1. What Impreza does NOT carry over is the label token.

   The band was `color_scheme="primary"` until 2026-08-27, when he moved it to
   the default light ground. That took THREE rules with it — the button's white
   fill, its navy ink, and a white required-asterisk — all of which existed only
   because navy-on-navy was invisible. On the light ground Style 1 is a navy pill
   matching the CTA in the footer band directly below it, and GF's own asterisk
   red reads as an asterisk again, so the defaults are simply better than the
   overrides were. Deleted rather than kept "just in case": a scheme change that
   silently re-arms three dead rules is exactly the trap worth not leaving.

   What remains is typography only, scoped to `.gform_wrapper` so a second form
   on any ground inherits it. Nothing here depends on the section's colour any
   more — if a navy form ever comes back, write it against `.contact-form-section`
   again and check the button and the asterisk first.
   ============================================================================= */

/* The field label. It was the Decorative/Subheading token — Platypi SemiBold at
   `--fs-sm`, matching `.w-form-row-label` — and moved to the BODY face at body
   size and weight on 2026-09-09, his call: a form label is read, not announced,
   and the heading face at 600 was doing the announcing.

   `var(--font-size)` rather than a literal 1rem: they are the same 16px today,
   and the ladder deliberately skips the body size, so this is the token that
   follows Theme Options if the body ever moves — see [[fs-ladder]].

   The uppercase went with it, same call: sentence case is what a body face is
   for, and the caps were the other half of the announcing. `letter-spacing: 0`
   stays as the neutraliser it always was — Impreza tracks its own label rule.
   What separates the label from its input now is the 10px and the ink, not the
   shouting.

   Ink is deliberately absent: the label takes it from whatever scheme the form
   sits on. */
.l-body .gform_wrapper .gfield_label {
	font-family: var(--font-family);
	font-size: var(--font-size);
	font-weight: 400;
	line-height: 1.692;
	letter-spacing: 0;
	margin-bottom: 10px;
}

/* First / Last under a name field, and any field description. Left at the
   inherited ink on purpose — the uppercase Platypi label above already
   separates the two, and dropping these to the accent blue costs legibility for
   no gain. */
.l-body .gform_wrapper .ginput_complex label,
.l-body .gform_wrapper .gfield_description {
	font-size: var(--fs-sm);
	line-height: 1.692;
	padding-top: 0;
	padding-bottom: 8px;
}

.l-body .gform_wrapper .gform_fields {
	row-gap: 1.5rem;
}

/* The Self Assessment form is the exception: two fields, no labels, and the
   design (1730:3212) sets them 8px apart, not 24. The 1.5rem above is sized for
   the contact form, where 24 fields with uppercase labels need the air; at 8px
   that form reads as one dense block. Scoped to the section's wrapper rather
   than to a form id, so it survives the form being rebuilt.

   This is the second half of a fix whose first half is in the builder: the
   wrapper's `alignment` param was dropped (it emitted `align_left`, which is
   `align-items: flex-start`, and a block child of that shrink-wraps to its
   content). The Kit embed used to be held open by a `> .w-html` width rule here;
   that rule is dead now and the width comes from the wrapper stretching. Do not
   re-add `alignment="left"` in the builder and then fix the width here. */
.l-body .assessment-form-vwrapper .gform_wrapper .gform_fields {
	row-gap: 8px;
}

/* The post-submit confirmation, off Gravity's literal `green` — his call,
   2026-09-10. That colour belongs to no palette field on this site and reads as
   a browser default next to everything around it.

   `--color-content-heading` (#212A60) rather than `--color-content-primary`,
   which resolves to the same ink today: the two are only equal because the
   palette sets them so, and the confirmation is a heading-weight line, so it
   should follow whichever field moves if that ever changes.

   `.l-body` because Gravity's own rule is (0,1,0) and lives in plugin CSS —
   (0,2,0) here settles it without depending on load order. Size left alone. */
.l-body .gform_confirmation_message,
.l-body .form_saved_message_sent {
	color: var(--color-content-heading);
}


/* =============================================================================
   Media queries
   ============================================================================= */

/* SIDE BY SIDE ON A NARROW GRID — 768 to 1279.

   768 is the Columns Stacking Width in Theme Options; below it every row is one
   column and these rules must not apply. Above it the image / text rows stay
   two columns all the way to the desktop layout — his call, 2026-08-28. It used
   to start at 1025 because those rows carried `tablets_columns="1"`; that came
   off the rows in the same pass.

   It covers BOTH pairs, because the hero and the split band are the same figure
   under different class names — measured on Home's hero at 1100: section 744
   with the photo only 532, floating on 54px of nothing above and below while
   the copy ran the full height.

   What goes wrong there is a ROLE SWAP. On desktop the photo is the taller of
   the two and sets the row height, so the copy sits centred inside it with air
   above and below (measured at 1440: photo 839, copy block 601). Squeeze the
   grid and the photo's fixed aspect-ratio makes it SHORTER than the copy, so
   the copy becomes the tall one — pinned hard to the top and bottom edge — and
   the photo floats in the middle with gaps (measured at 1100: section 692,
   photo 622, copy 692).

   Two rules put it back. The photo takes the row's full height: the column is
   already a stretched flex item, so a `height: 100%` chain down to the <img>
   gives every ancestor a definite height and `object-fit: cover` handles the
   crop — `aspect-ratio` stops driving layout once both dimensions are set.
   Measured after: 622 -> 820 on About's story band, 660 -> 909 on Our Roots,
   622 -> 951 on FAQ.

   And the copy column gets real block padding, so the tallest element in the
   row is copy PLUS air rather than copy alone.

   A third thing fixes itself. The media card over the FAQ photo is anchored
   `bottom: 9.3%` of the COLUMN, not of the photo — and while the photo was
   shorter than the column, that put the card 24px BELOW the picture, floating
   on the section background. With the photo filling the column the two bottoms
   coincide again and the card lands back on the photo, 89px up from its edge,
   which is the design's inset. */
@media (min-width: 768px) and (max-width: 1279px) {

	.hero-media-column > .vc_column-inner,
	.hero-media-column > .vc_column-inner > .wpb_wrapper,
	.hero-media-column .hero-image,
	.hero-media-column .hero-image .w-image-h,
	.split-media-column > .vc_column-inner,
	.split-media-column > .vc_column-inner > .wpb_wrapper,
	.split-media-column .split-media-image,
	.split-media-column .split-media-image .w-image-h {
		height: 100%;
	}

	.hero-media-column .hero-image img,
	.split-media-column .split-media-image img {
		width: 100%;
		height: 100%;
		object-fit: cover;
	}

	.hero-copy-column > .vc_column-inner,
	.split-copy-column > .vc_column-inner {
		padding-block: var(--space-2xl);
	}
}

/* Home — the two offer rows, tablet and laptop tiers.

   The rows carried `tablets_columns="1"`, but that works through the `sm-12`
   form and the columns' own `width=` params emitted an explicit `vc_col-sm-5` /
   `vc_col-sm-7`, which beat it: the row never stacked at 768–1024 and kept the
   desktop split, copy 5/12. Measured at 768 that left the panel 320px wide — a
   267px measure and a 550px-tall card standing next to a 300px photo.

   His call, 2026-08-28: invert the split for the tablet tier only — copy takes
   7/12 (~448px, within 13px of the design's 461px panel) and the photo 5/12.
   Set in the builder as `vc_col-sm-7 vc_col-md-5` / `vc_col-sm-5 vc_col-md-7`,
   so the design ratio returns at 1025 and `tablets_columns` is gone.

   What is left here is the photo. At 5/12 it can no longer keep 600/460 and
   still reach the bottom of the panel, so it fills the row's height and crops —
   the same treatment the hero and split bands already get.

   The ceiling is 1279, not 1024: the ratio only coincides with the panel by luck.
   At 1100 the first row's photo lands on exactly 440 against a 440 card, while the
   second row's card runs to 458 and the photo stops 18px short of it. */
@media (min-width: 768px) and (max-width: 1279px) {

	.offer-media-column > .vc_column-inner,
	.offer-media-column > .vc_column-inner > .wpb_wrapper,
	.offer-media-column .offer-image,
	.offer-media-column .offer-image .w-image-h {
		height: 100%;
	}

	/* The photo has to come OUT OF FLOW to fill the panel. In flow, `height: 100%`
	   is circular here: the percentage resolves against the column, the column is
	   stretched to the row's tallest item, and the photo is a candidate for that
	   item — so its own height is an input to the height it is asking for. Chrome
	   resolves the circle by sizing the img from nothing and letting it inflate
	   the row; measured at 768 the card came out 1500px tall instead of 439.

	   Absolute inside a relative `.w-image-h` breaks it: the photo contributes
	   nothing to intrinsic height, the row is the card's height, and the photo
	   then fills exactly that. `aspect-ratio` also has to go explicitly — the base
	   rule sets 600/460, and a ratio left standing wins over a percentage
	   height. */
	.offer-media-column .offer-image .w-image-h {
		position: relative;
	}

	.offer-media-column .offer-image img {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		aspect-ratio: auto;
		object-fit: cover;
	}
}

/* Home — the approach band, tablet and laptop tiers.

   Same shape as the offer rows and for the same reason: the photo states its own
   720/709 ratio, which at a 385px half is 379px tall, while the copy half runs to
   663. The photo stops short and the scrim fades against bare band. It does not
   come right again until the columns are wide enough for the ratio to outrun the
   copy — measured at 1100, photo 543x534 under a 543x633 column, so ~99px of bare
   section showed below the picture with the overlay text still pinned to its
   bottom edge. Held to 1279 for that reason.

   The copy also needs air. Its inset is inline-only by design — on desktop the
   near-square photo sets the row height and the text centres inside it — but once
   the copy is what DRIVES the height, it ends up pinned to the band's top and
   bottom edges. `--space-2xl` here, the same step the hero and split copy columns
   already take one tier up.

   Photo out of flow for the circularity reason noted on the offer rows. The scrim
   rides `.approach-image`, which now carries the full height, so it still covers
   exactly the picture; the overlay text is absolute against `.vc_column-inner` and
   anchored bottom, so it follows the taller box on its own. */
@media (min-width: 768px) and (max-width: 1279px) {

	.approach-media-column > .vc_column-inner,
	.approach-media-column > .vc_column-inner > .wpb_wrapper,
	.approach-media-column .approach-image,
	.approach-media-column .approach-image .w-image-h {
		height: 100%;
	}

	.approach-media-column .approach-image .w-image-h {
		position: relative;
	}

	.approach-media-column .approach-image img {
		position: absolute;
		inset: 0;
		width: 100%;
		height: 100%;
		aspect-ratio: auto;
		object-fit: cover;
	}

	/* Same 0-5-2 shape as the desktop inset rule — that is what carries it past
	   `cols-flush`'s padding reset. Inline padding stays with the ≤1024 rule. */
	.g-cols.via_flex.type_default.home-approach-inner-row > div.approach-copy-column > .vc_column-inner {
		padding-block: var(--space-2xl);
	}

	/* Overlay copy sized against the PHOTO, not the viewport ladder — the same
	   correction as the phone rule in the ≤767 block, carried up here because the
	   defect is worse on the tablet and it is the same element. Not flagged at
	   this width; measured, and offered to him with the phone fix.

	   MEASURED: `h2-style` is on the site-wide viewport clamp and falls 44 → 34.5
	   between 1440 and 820, while the half it sits in falls 713 → ~400. So the
	   type is 6.2% of its picture at 1440 and 8.6% at 820 — it grows as the photo
	   shrinks, which is the same constant-beside-fluid shape as
	   `.program-item-title`.

	   3.4375vw is 44px at exactly 1280, so there is NO step at the desktop
	   boundary, and because both terms are linear in vw it holds one constant
	   ratio across the whole range: the half is 50vw, so the type is 6.875% of it
	   at 768 and at 1279 alike. That is not an invented figure — it is the site's
	   own ratio at 1280, where the photo is 633 and the capped type is 44.

	   THE MEASURE GOES WITH IT, or the smaller type just wraps into more lines in
	   the same squeezed box. MEASURED at 820 before this rule: the box is 72% of a
	   403px half = 290, and 11% padding on both sides leaves a 202px measure — the
	   copy ran to FIVE lines with a 90px orphan on the last one, against the 528px
	   measure and three lines the same copy gets at 1440.

	   Percentages cannot fix it: the design's own ratio is a 282px measure inside
	   a 720 half, which at 820 would be 157 — narrower still. That is exactly why
	   the ≥1280 rule abandoned percentages for `calc(12em + 11%)`, and the same
	   figure carries down here unchanged, so there is nothing to reconcile at the
	   boundary: at 1279 it resolves to the same 528px measure it has at 1280.

	   `padding-right: 0` for the same reason as up there — the box is border-box,
	   so zeroing the right inset is what makes the CONTENT exactly the 12em.
	   Measured three lines at 768, 820 and 1279. */
	.l-body .approach-overlay-text {
		font-size: 3.4375vw;
		max-width: calc(12em + 11%);
		padding-right: 0;
	}
}

/* Hero and split bands — undoing Impreza's stacked-column gap where they no
   longer stack.

   Impreza gives any column carrying a `vc_col-md-*` or `vc_col-lg-*` class a 1rem
   block margin between 601 and 1024:

       .g-cols.via_flex.type_default > div[class*="vc_col-md-"] { margin: 1rem 0 }

   That is the vertical gap between columns that have STACKED, and it is right for
   a stacked row. These rows stay two-across from 768 up, and in each of them only
   ONE side carries an `md` class — the hero's media column, the split band's copy
   column — so the row came out 16px short at the top and 16px at the bottom on
   that side alone: measured at 768, hero copy 90–991 against media 106–975;
   About's split band, media 612–1668 against copy 628–1652.

   The floor is 768, not 601. Written as ≤1024 first, and that was wrong: from 601
   to 767 the rows DO stack, and on a phone the same declaration took the gap out
   from under the hero photo — the image sat straight on the copy with nothing
   between them (measured at 400: image bottom 429, copy top 429). Impreza places
   that gap correctly even on a `columns_reverse` row, on whichever column ends up
   visually first; there is nothing to fix below the stacking width.

   Theirs is (0,4,1) — three classes, an attribute selector and `div`. Four classes
   plus `div` would only tie, and a tie is decided by document order, which is not
   a thing to depend on here; `.l-body` makes it (0,5,1). */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-body .g-cols.via_flex.type_default > div.hero-media-column,
	.l-body .g-cols.via_flex.type_default > div.split-copy-column {
		margin-block: 0;
	}
}

/* Home "We Offer" — the band's own inset, tablet tier.

   Ruttl iPad, thread `fOaroexNHfn15lJmb61f`: "mozda i ovaj razmak smanjiti za
   trecinu". The row is `height="large"`, which resolves to --section-pad-large,
   6rem / 96px at this width. A third off is 64px — and 64px is exactly
   --section-pad-medium, so this steps DOWN THE EXISTING LADDER instead of
   inventing a number.

   Scoped to 768-1024 and to this ONE section deliberately. Two things it must
   not do:
     - not written into --section-pad-large, which the testimonials, calling and
       quote bands all read (all three measure 96 here, and none was flagged);
     - not written into the ≤1024 band, which also reaches the phone.
   The phone has its OWN section-3 thread (`T551IoQvjBpz626HuRIc`) asking for
   something different — "isto kao kod sekcije iznad" — and the mobile review was
   filed before today's edits, so its comments describe the older page. Tablet and
   phone are being kept independent of each other this round; his instruction,
   2026-09-09.

   Compounded with `.l-section` because that is the class Impreza's own height
   rule sits on. */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-section.home-offer-section {
		padding-top: var(--section-pad-medium);
		padding-bottom: var(--section-pad-medium);
	}
}

/* Footer — tablet tier.

   Two Ruttl iPad threads, both located by their PIN rather than guessed:
   `Rm7IBYK2eGVB6zYFmoDE` "manji razmak" sits at y=49.7, inside the section's own
   96px top padding; `rhzEtXzNIVDrhaPfYIbK` "manji razmak za polovinu" at y=15.2,
   inside the rule separator under the logo.

   The coordinates are what made these actionable — from their selectors alone both
   threads point at the footer section as a whole. `get_ruttl_thread` returns
   `target.position` in pixels relative to the targeted element; mapping that onto
   the live layout is the difference between fixing the right box and guessing.

   Top padding steps down the ladder, 96 -> 64, the same move the "We Offer" band
   took. The separator is halved literally, 57 -> 28, because "za polovinu" is a
   number and the ladder has nothing at 28. Impreza's separator `size` is a single
   value with no per-breakpoint control, so CSS is the only tool for it — scoped to
   the tablet band rather than changed globally.

   The footer is ONE page block shared by every page, so this moves the footer
   site-wide at tablet width. Intended: it is the same footer she reviewed.

   And a warning about the class name: `footer-rule-separator` draws NO line.
   Verified across the entire section — no borders on any side, no shadows, no thin
   elements. It is pure vertical space and "rule" is a leftover from an earlier
   design. Do not go looking for a line to restyle. */
/* Home "We Offer" — panel and photo meet again on the tablet.

   Ruttl iPad `9mX3K9vL6eoCqvXDhv1Y`: "ove sekcije po dizajnu nemaju razmaka
   izmedju, spojene su". She is right, and the design says so too — the text frame
   is 461 wide starting at 193 and the photo starts at exactly 654, flush.
   MEASURED at 820: a 30px gap in BOTH rows (panel ends 450, photo starts 480;
   and photo ends 325, panel starts 355).

   The cause is a false assumption in ab-base, not in this page. It neutralises
   every `col-extend-*` from 1024 down, under the comment "Column-fraction
   utilities are meaningless once columns stack". These columns DO NOT stack
   there: they are `vc_col-sm-7` / `vc_col-sm-5`, so they stay 2-up all the way
   to 767. The neutraliser is correct in intent and too wide in range.

   Note for anyone reading the class name: the `-md` in `col-extend-r-md` is a
   T-SHIRT SIZE meaning ONE GUTTER, not a breakpoint. ab-base warns about exactly
   this collision — a NUMBER means whole columns, a t-shirt size means gutters. I
   misread it as a breakpoint first.

   Fixed HERE rather than in ab-base: that file is the shared agency layer and a
   verbatim copy, so the range stays as it is for every other project and this
   page states its own exception. Scoped to `.home-offer-section` — other pages
   may well have the same latent gap, but none was flagged and none was measured.
   (0,3,0) against the neutraliser's (0,2,0).

   The 30px it restores is one `--col-bleed-md`, i.e. exactly the gutter that
   opened the gap, so this closes it to zero rather than to a guess. */
@media (min-width: 768px) and (max-width: 1024px) {

	.home-offer-section .col-extend-r-md > .vc_column-inner {
		width: calc(100% + var(--col-bleed-md));
	}

	.home-offer-section .col-extend-l-md > .vc_column-inner {
		width: calc(100% + var(--col-bleed-md));
		margin-left: calc(var(--col-bleed-md) * -1);
	}
}

/* Mastermind — the two bands hugging the journey photo, tablet tier.

   Ruttl iPad, both pinned into section PADDING rather than into content:
   `DwtIIeJYyXfdNDsfUOlM` at y=272.3 of a 314-tall section 2, i.e. inside its
   96px BOTTOM padding; `Wu4RjJCTiFC8fV4quapf` at y=44.5 of section 4, inside its
   96px TOP padding. Both say "manji razmak za polovinu".

   They are the two edges that meet the full-bleed journey photo band between them
   (section 3, which carries no padding of its own), so halving both tightens the
   photo to its copy from either side — which is why she filed them as a pair.

   `calc(... / 2)` rather than 48px: the ladder has 32 and 64 but nothing at 48,
   and "za polovinu" is a relationship, not a number. Written this way it stays
   half of whatever `--section-pad-large` resolves to at this tier.

   Only the flagged EDGE of each section moves — section 2 keeps its 96 on top and
   section 4 keeps its 96 at the bottom. */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-section.mm-journey-section {
		padding-bottom: calc(var(--section-pad-large) / 2);
	}

	/* 1-on-1 draws the same trio and was never given the same treatment —
	   `S8b3CqEpCmr4TlZcMHky`, iPad, "smanjiti razmak", pinned at y=15.45, which is
	   inside section 4's top padding and nowhere else.

	   `oo-journey-copy-section` is `mm-journey-copy-section` under another prefix:
	   MEASURED at 820, both pages put a full-bleed photo band with zero padding
	   between a cream heading section and a cream copy section, and both copy
	   sections open with 96. Mastermind's was halved weeks ago and this one kept
	   its 96, which is the sort of split that only shows up reading the two pages
	   side by side rather than page by page.

	   Only the copy section's TOP here. The band's other edge is section 2's foot,
	   and that is already 38 from the section-mark rule — tighter than the 48 this
	   halving would give it, so there is nothing left to take. */
	.l-section.mm-journey-copy-section,
	.l-section.oo-journey-copy-section {
		padding-top: calc(var(--section-pad-large) / 2);
	}

	/* The events band is the same trio one screen further down, and it gets the
	   same treatment. Measured at 820: section 8 `mm-events-section` (heading,
	   96px), section 9 `mm-events-band-section` (the full-bleed photo, `width_full`
	   and no padding at all), section 10 `mm-events-copy-section` (copy, 96px).
	   Structurally identical to the journey trio above.

	   Ruttl `kUVkutEKKHOcTGosS52j` (iPad, "manji razmak") pins y=50.9 into section
	   10's 96px TOP padding — the edge under the photo.

	   She flagged one edge here where she flagged both on the journey band, and
	   both move anyway: the photo is one object, and 96 above it against 48 below
	   would be a lopsidedness nobody asked for either. Halving the pair keeps the
	   photo centred in its own air, which is what the journey rule above already
	   established as this band's shape. */
	.l-section.mm-events-section {
		padding-bottom: calc(var(--section-pad-large) / 2);
	}

	.l-section.mm-events-copy-section {
		padding-top: calc(var(--section-pad-large) / 2);
	}

	/* Two cards to a line at tablet — the whole point of merging the rows.
	   Measured at 820 before: content 725 wide, three columns on a 24px gap gives
	   226 a card, and the card's own 40px insets leave a **146px measure** — about
	   twenty characters, which is why the bodies ran five to seven lines and the
	   cards stood 483 tall with up to 130px of empty ground under the copy.

	   At 50% the card is 350 and the measure 270 — around thirty-six characters,
	   which is a real column. */
	.g-cols.via_flex.type_default.cards-2up > .wpb_column {
		width: 50%;
	}

	/* 1-on-1 keeps three to a line, because it only has THREE cards — two up would
	   leave one alone on a second line. So it buys the measure back from the card
	   instead, which is what he chose when the alternative was a tighter gap
	   between cards.

	   The gap was the wrong lever and the arithmetic says so: 24px between cards
	   is Figma's own figure (`1692:2242`, cards 363 wide at x 0 / 387 / 774), and
	   taking it to 16 would return about 5px of measure per card. Taking the
	   card's side inset from 40 to 24 returns 32. Six times the gain, and it does
	   not depart from a design value.

	   Stated as "any cards row that is still three up", so it follows the layout
	   rather than the page — if 1-on-1 ever gains a fourth card and takes
	   `cards-2up`, this stops applying to it on its own. */
	.included-cards-row:not(.cards-2up) .icon-card .w-iconbox {
		padding-inline: 1.5rem;
	}

	/* The band card stops being a percentage at tablet. His call, 2026-09-10 —
	   he spotted it himself, and Marija had filed the same shape on the sibling
	   card (`Kkh4ujAnkuFLPvYrxnIS`, iPad: "ova sekcija je cudna na tabletu ... da
	   moze vise teksta da stane sa desne strane").

	   `width: 30.7%` is the design's proportion — 442 on a 1440 band — and it
	   holds the PROPORTION perfectly while the contents refuse to scale with it.
	   Measured at 820 the card is 252, of which 48 is padding and 130 the poster,
	   so the copy is left with **58px**. Below 600 this was already solved by
	   dropping the overlap entirely; the tablet was never given anything.

	   `min(442px, 46%)` keeps the cap and raises the floor: 377 at 820, and the
	   design's own 442 as soon as the band is wide enough to hold it. The card
	   covers 46% of the band instead of 31%, which is the price of the fix and
	   the reason it was his call and not mine.

	   The gap goes back to the builder's 2.5rem HERE, on the band card only. The
	   1.25rem above exists because the copy was 65-97px and every pixel counted;
	   at 377 that argument is gone, while the play badge — centred on the poster's
	   right edge, so overhanging by 20 — has been landing exactly on the copy's
	   edge all along. Result: copy 159, badge clearance 20, the same pair the
	   phone tier now has.

	   The HERO card keeps 1.25rem: its 76% is a share of its COLUMN, not of the
	   viewport, so it cannot be widened the same way and its copy is still 119. */
	.media-band-section .media-card {
		width: min(442px, 46%);
	}

	/* `.l-body` on the gap rule is not decoration. The generic
	   `.w-hwrapper.media-card > :not(:last-child)` that sets 1.25rem lives in the
	   `max-width: 1279px` block, which sits LATER in this file — same specificity
	   (0,3,0), so it wins on order alone and this rule was struck out until the
	   extra class broke the tie. He caught it in DevTools. */
	.l-body .media-band-section .media-card > :not(:last-child) {
		margin-inline-end: 2.5rem;
	}
}

@media (min-width: 768px) and (max-width: 1024px) {

	.l-section.main-footer-section {
		padding-top: var(--section-pad-medium);
	}

	.l-body .main-footer-section .footer-rule-separator {
		height: 28px;
	}
}

/* Mastermind — the pricing halves, tablet tier.

   The row keeps two columns here (`width="1/2"` on both, so `vc_col-sm-6`), and
   the section's insets are read from the design's 720px half: 80 top, 60 a side.
   On a 360px column that is 120px of padding and 240px of content — measured, the
   check-list ran two words to a line and the price slab had 120px left to split
   between the prices and the round apply button. Same 2.5rem / 1.5rem step the
   rest of the site takes at this tier. The offer half keeps its open bottom — the
   slab below is what finishes it.

   Selectors match the desktop rules they override, which are compounded to
   out-specify Impreza's own 0-4-1 gutter rule. */
@media (min-width: 768px) and (max-width: 1024px) {

	.g-cols.via_flex.type_default > .mm-pricing-offer-column > .vc_column-inner {
		padding: 2.5rem 1.5rem 0;
	}

	.g-cols.via_flex.type_default > .mm-pricing-skills-column > .vc_column-inner {
		padding: 2.5rem 1.5rem;
	}
}

/* Self Assessment — the opt-in form, tablet tier.

   The form is two short inputs plus a submit, and it stretches to whatever it is
   given. Stacked, its panel is the whole band: measured at 768 the field ran 704px
   across for one email address. Held to eight of the panel's twelve columns. His
   call, 2026-08-28 — carried over from the Kit embed to the Gravity Form that
   replaced it on 2026-09-08.

   `width: 100%` is load-bearing, not belt-and-braces: the `margin-inline: auto`
   below centres the block, and auto margins cancel the flex stretch the wrapper
   would otherwise give it. Measured without the width, the form shrink-wrapped
   to 291px and the cap had nothing to cap. */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-body .assessment-form-vwrapper .gform_wrapper {
		width: 100%;
		max-width: 66.6667%;
	}

	/* Centred as a block with its heading, not left-aligned against a panel that
	   is now the full band. `margin-inline: auto` rather than `align-items`: auto
	   margins on the items win regardless of what the container asks for, which
	   mattered while the vwrapper still carried `align_left` and is harmless now
	   that it does not.

	   Kit's own input reset `text-align: start` for free; Gravity Forms' does not,
	   so the inputs are put back explicitly — without it the visitor's typed name
	   and address centre themselves as they type. */
	.l-body .w-vwrapper.assessment-form-vwrapper {
		text-align: center;
	}

	.l-body .w-vwrapper.assessment-form-vwrapper > * {
		margin-inline: auto;
	}

	.l-body .assessment-form-vwrapper .gform_wrapper input {
		text-align: start;
	}
}

/* Our Roots stacks on the tablet, like it already does on the phone.

   Ruttl `goTwnEBkUd1DRjFEUYNN`, About Us, iPad: "da li je bolje da imamo sliku
   celom sirinom skrina, a onda sivu sekciju sa tekstom ispod nje". Measured at
   820 the two-column split gives the photo a column 355 wide against a band 1106
   tall, so the image renders 325 x 1106 — a strip eight characters wide and three
   screens tall. That is not a photo of three people any more.

   The ≤767 block already does exactly what she is asking for (see the long note
   on `.split-media-column > .vc_column-inner` there: `width: 100vw` with
   `margin-inline: calc(50% - 50vw)`, which re-derives the inset from the parent
   rather than hard-coding it). All this block does is start that treatment one
   tier earlier for THIS section, plus the ratio.

   4:3 IS HIS CALL, 2026-09-11 — there is no tablet frame in Figma to take a
   number from, and the component's own 597/893 portrait is the wrong shape once
   the photo is 820 wide. Measured result: 820 x 615, copy starting 615 below the
   section top instead of beside it.

   `object-position: 50% 50%` is HIS CALL, 2026-09-11, and it is stated rather
   than left to the default so nobody "fixes" it later. The source is a 597x893
   PORTRAIT and a 4:3 box shows only the middle 50% of it vertically, so the
   framing is a real choice: I had shipped 38%, which gives all three of them
   headroom, and he wants it centred.

   `margin-block: 0` on the column inner is not tidying. Impreza gives
   `.vc_column-inner` `margin: -16px` to cancel a padding it no longer has here,
   so with the photo full-bleed the image hung 16px ABOVE the section and bled
   into `.about-coaches-section` above it. Measured: image top 3665 against a
   section top of 3681.

   ONLY Our Roots. The story band on this same page has the identical geometry at
   this width (image 325 x 973) and nobody flagged it — that one is his to decide,
   together with the other `.split-media-section` instances on Home, 1-on-1 and
   the FAQ. */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-body .about-roots-section .split-media-inner-row > .vc_column_container {
		width: 100%;
		max-width: none;
		margin-left: 0;
	}

	/* Undoing the equal-height apparatus the 768–1279 block sets up for the
	   side-by-side case. Left in place it pins the photo to the copy's height,
	   which is the strip this rule exists to kill. */
	.l-body .about-roots-section .split-media-column > .vc_column-inner,
	.l-body .about-roots-section .split-media-column > .vc_column-inner > .wpb_wrapper,
	.l-body .about-roots-section .split-media-column .split-media-image,
	.l-body .about-roots-section .split-media-column .split-media-image .w-image-h {
		height: auto;
	}

	.l-body .about-roots-section .g-cols.via_flex.type_default > div.split-media-column > .vc_column-inner {
		width: 100vw;
		max-width: none;
		padding-inline: 0;
		margin-inline: calc(50% - 50vw);
		margin-block: 0;
	}

	.l-body .about-roots-section .split-media-image img {
		aspect-ratio: 4 / 3;
		height: auto;
		object-position: 50% 50%;
	}
}

/* =============================================================================
   Header — buying the desktop nav its last 60px

   The switch to the hamburger is `mobile_width` on the menu element, moved from
   1280 to 1140 on 2026-08-28. What has to fit in a row, all measured:

       indent 40 · logo 158 · menu 702 · menu margin 24 · button 198 · bleed −40 · indent 40

   Three of those were bought in the Header Builder, on the LAPTOPS state so the
   desktop composition above 1280 is untouched: logo height 90 → 80 (178px wide →
   158), the CTA's inline padding 4.7em → 1.8em (274 → 198), and the menu's own
   right margin 58 → 24. That alone lands the floor at about 1200 — measured, the
   item row still wanted 702 and the list box could only give it 679 at 1140.

   The last 56 come from the item indents, and this is the one thing the builder
   cannot do per state: `indents` is a single value on the menu element, so
   changing it there would tighten the desktop nav too. Hence CSS, in the band
   between the new breakpoint and the content width. 8px is the comfortable step —
   measured at 1140 the row lands on 646 with 52px of air before the logo; 9px is
   the true floor at 660 and 38, and 12px overflows by 23.

   `a.w-nav-anchor` is load-bearing: Impreza sets the indent on the anchor's own
   class, and a rule written `> .menu-item > a` loses to it however long the rest
   of the selector is. Measured — computed padding stayed 12px. */
@media (min-width: 1140px) and (max-width: 1279px) {
	.l-header .w-nav.type_desktop .w-nav-list.level_1 > .menu-item > a.w-nav-anchor.level_1 {
		padding-inline: 8px;
	}
}

/* =============================================================================
   BELOW THE SITE CONTENT WIDTH — 1279 and down

   Two compositions that are stated as "text left, button right" in the builder
   and only work while the half they sit in is the design's. Both were written at
   1024 first; measured across the laptop tier they are still wrong there, so the
   floor moved to 1279 on 2026-08-28, his call.
   ============================================================================= */

@media (max-width: 1279px) {

	/* The CTA block's height is arithmetic, not a constraint: Style 5's padding is
	   `3.4em 4.7em`, which at 13px lands exactly the 104px of the DEFAULT header
	   state and nothing else. Every other state sets its own middle height — 98 on
	   laptops, 90 on tablets and mobiles — and the same button overhangs each of
	   them: measured at 900 it ran -7 to 97 in a 90px header, and at 1140 it ran
	   29 to 133 in a 98px one, 3px proud top and bottom beside a menu block that
	   is flush.

	   Letting it stretch and centring the label makes it fill whatever the state's
	   header height actually is, so the height can be changed in the Header Builder
	   without a number here having to follow it. Held to 1279 because above that
	   the arithmetic is right by construction. */
	.l-header .w-btn.header-cta-btn {
		display: flex;
		align-items: center;
		align-self: stretch;
		padding-block: 0;
	}

	/* The hero's aside-plus-button row.

	   `stack_on_mobiles="1"` is an Impreza param and it means the MOBILES state,
	   600 and down. That was right while the hero itself stacked at 1024; the hero
	   now stays two columns from 768 up, so this wrapper lives in a half-column all
	   the way to 1280 and the italic aside is what pays for it: measured at 768 it
	   was 145px across and 356 tall, at 1041 240x216, at 1100 269x216, at 1279 still
	   359x180 — five to seven lines beside a 186px button. At 1400 it settles at
	   407x144, which is the design's shape.

	   So the same shape the param would have produced, three breakpoints wider:
	   `display: block` plus the gap as the first child's bottom margin. The split
	   band's identical wrapper sits in a 7/12 column and goes with it. */
	.hero-copy-column .w-hwrapper.inline-cta-hwrapper,
	.split-copy-column .w-hwrapper.inline-cta-hwrapper {
		display: block;
	}

	.hero-copy-column .w-hwrapper.inline-cta-hwrapper > :not(:last-child),
	.split-copy-column .w-hwrapper.inline-cta-hwrapper > :not(:last-child) {
		margin-bottom: 1.5rem;
	}

	/* Mastermind's price slab. Two things end together here.

	   The bleed is arithmetic on `(100vw - var(--site-content-width))`, which is
	   what pushes the slab out to the viewport edge and then pads the copy back
	   onto the grid. Below 1280 that term goes negative and the "bleed" becomes an
	   inset — the calc describes nothing real, so the slab returns to normal flow.

	   And it stops being a two-across composition. `alignment="justify"` puts the
	   prices left and the round apply button right, which needs the design's 540px
	   slab; at 768 it had 120px of content to split and `$1,495` alone came out
	   106px wide over three lines, at 1100 the price block was still 201x111.
	   Block, with the hwrapper's gap restated as the first child's bottom margin. */
	.mm-pricing-offer-column .price-panel {
		display: block;
		margin-inline: 0;
		padding: 2.5rem 1.5rem;
	}

	/* The card's 2.5rem gap exists to hold the play badge hanging off the poster's
	   right edge, and it is measured against a card at its DESIGN width — 477 in
	   the hero, 442 on the bands. Both are percentages until the site hits its
	   1280 content width, and below that the 40px comes straight out of the copy:
	   the band card is 30.7% of the viewport, so at 1024 its copy column is 97px
	   and at 808 it is 65. Back to 1.25rem here, which puts the badge's outer edge
	   exactly on the copy's — touching, not overlapping. The `gap` shorthand
	   rather than the variable: Impreza writes `--hwrapper-gap` inline from the
	   builder field — and it spaces the row with `margin-inline-end` on every child
	   but the last (`.w-hwrapper > :not(:last-child)`), NOT with `gap`, so `gap` is
	   the one property that has no effect here. Measured: the shorthand computes to
	   `normal` on every hwrapper on the site. */
	.w-hwrapper.media-card > :not(:last-child) {
		margin-inline-end: 1.25rem;
	}

	.mm-pricing-offer-column .price-panel > :not(:last-child) {
		margin-bottom: 1.5rem;
	}

	/* The eyebrow steps down one rung below the desktop tier.

	   Four threads, and it took all four to see it was one thing. Three on iPad,
	   all Mastermind, all the same component and none of them adjacent:
	   `O3GUkAhfnB2cfPtCHkjr` ("What's Included", s7), `aIf8dbMgAQ2FqzegjBzh`
	   ("What You'll Implement", s13) and `mmblfTaPjm1xYPgfRMSw` ("Member
	   Bonuses", s12) — "smajiti font size" / "manji fs" / "manji fs". Resolving
	   each pinned selector in the page gives the same answer every time:
	   `SPAN.w-text-value < SPAN.w-text-h < DIV.w-text.eyebrow`, 13px Platypi.

	   The fourth is what makes it a rule rather than three coincidences.
	   `djnM0QKKYlOaDMZWWDDa` is on the PHONE, on About Us, and it is not a pill at
	   all — it is the role line under a testimonial ("Founder & Owner, Palo Alto
	   Therapy"), which wears `.eyebrow` for its type but not its ink. It measures
	   13px too. The phone rule further down only ever reached
	   `.w-text.eyebrow-pill`, so below 600 the pills dropped to 12 and every
	   non-pill eyebrow stayed at 13, a mismatch nobody had a reason to notice
	   until she pinned one.

	   So it belongs on `.eyebrow`, not on the pill and not per instance. 13px is
	   the DESKTOP figure, taken from Figma where the eyebrow frame is 26 tall with
	   22px text; there is no tablet frame, so the tablet has simply been wearing
	   the desktop size all along.

	   `--fs-2xs` rather than a literal 12px: the ladder already has this rung
	   (0.75rem), it is exactly one step below the `--fs-xs` the base rule uses,
	   and the phone pill had independently arrived at the same 12. This makes
	   that agreement explicit instead of coincidental. */
	.eyebrow {
		font-size: var(--fs-2xs);
	}

	/* Heading L is a figure sized for the design's 540px slab. On a 264px measure
	   `$1,495 – 1,995` broke over two lines at 36px; one step down to Heading M it
	   is 181px on a single line, and still three steps clear of the instalment
	   figure below it, which is pinned to Heading XS. */
	.price-line strong {
		font-size: var(--h3-font-size);
	}
}

/* Home hero / about below the tablet breakpoint. The column count itself is
   set on the row (tablets_columns="1"), not here — this only retunes what the
   stacked layout needs: the photo can no longer fill a column's height, so it
   falls back to a fixed ratio. */
@media (max-width: 1024px) {

	/* ---- The testimonial card, all four complaints at once ----

	   FOUR threads, TWO pages, BOTH narrow devices, one component — which is why
	   they are here together and not in four places:

	     `cTnGMLwl` (Home, iPad)       "tekst preveliki na testimonialsima, margine
	                                    sa strana premale, smanjiti fs svuda"
	     `r2CennRM` (Home, iPad)       "centrirati tekst ulevo i smanjiti ovaj font
	                                    size svuda" — on the popup trigger
	     `ot2BTnnb` (Home, iPhone)     "ovde mozda treba manji line height" — on the
	                                    attribution's second line
	     `z22wgpZW` (Mastermind, iPhone) "smanjiti ovaj razmak, sada je preveliki,
	                                    mozda za trecinu" — quote to attribution

	   Scoped by post type rather than by section, because the same card is built
	   twice: `.testimonial-column-text` on Home section 4 and inside
	   `.testimonials-split-section` on Mastermind. One selector, both pages.

	   1. THE QUOTE. MEASURED as a share of its own measure — 20px in 429 at 1440
	      is 4.66%; 18.58 in 283 at 820 is 6.57%; 18 in 279 at 390 is 6.45%. Forty
	      per cent oversized for the box it is in, and it shows as ~30 characters a
	      line against the desktop's 43. Her second complaint, "margine sa strana
	      premale", is the same fault felt from the other side: the card's padding
	      is proportionally CORRECT (58.4/546 = 10.7% at 1440 against 40/363 = 11.0%
	      at 820), so what crowds the panel edge is the type, not the inset.
	      Below 1025 the quote stops being a display line and becomes prose: 1rem,
	      which is 5.7% of the measure and ~35 characters.

	   2. THE POPUP TRIGGER. At 1440 the label is ONE line in a 341px button; at 820
	      and 390 the same label wraps to TWO in a 269-273px one, and a centred
	      two-line label in a pill with a trailing icon is what she is looking at.
	      Left-aligned and one step down. `justify-content` as well as `text-align`
	      — the label is a flex item, so alignment does not come from text-align
	      alone.

	   3. THE ATTRIBUTION LEADING. 15px on a 25.005px line box is 1.667, and it is
	      the SAME at every width — a caption set with body leading. 1.3 is the
	      caption figure the rest of the site uses.

	   4. THE GAP. 19px between the quote and the attribution, also constant at
	      every width, and it is a SUM: the vwrapper's own `--vwrapper-gap` of
	      0.7rem = 11.2, plus 8px of `margin-top` authored on the hwrapper. Zeroing
	      the added 8 leaves exactly the one value the component declares, which is
	      a 41% cut — near enough her "za trecinu", and it means the gap is now a
	      number you can read off the component instead of a sum.

	   POINTS 3 AND 4 ARE NO LONGER HERE — his call, 2026-09-12. Both measured
	   identically at 1440, so the fault was never narrow-viewport-only and the
	   card was carrying two different rhythms depending on width. They moved to
	   the base layer (search `.w-grid-item.type-us_testimonial` in the Home
	   testimonials section) and now hold at every width. What stays below is
	   points 1 and 2, which ARE width-dependent: both are a constant beside a
	   measure that has narrowed. */
	.w-grid-item.type-us_testimonial .post_content {
		font-size: 1rem;
	}

	.w-grid-item.type-us_testimonial .w-popup-trigger {
		font-size: var(--fs-xs);
		text-align: left;
		justify-content: flex-start;
	}

	/* Same figure, same cause, on Contact: `inner_items_gap="6rem"` is the rhythm
	   between the intro paragraph and the accent line across a two-column band.
	   In one stacked column it is 96px of nothing between two short blocks.

	   MOVED HERE FROM THE 767 BLOCK, 2026-09-12. The row is authored
	   `tablets_columns="1"`, so it is one column from 1024 down — but the fix only
	   started at 767, which left 768..1024 with the full 96. Measured at 793
	   before: intro paragraph 202..343, accent line at 439, a 96px hole. One rule
	   for the whole stacked range rather than two sources of truth. */
	.contact-intro-vwrapper > *:not(:last-child) {
		margin-bottom: 1.5rem;
	}

	/* The Self Assessment band's insets are percentages of a HALF-width panel.
	   Once `tablets_columns="1"` stacks them each panel is the whole viewport,
	   where 19.4% is a 250px margin on a phone. Back to a normal gutter. */
	.g-cols.via_flex.assessment-access-inner-row > .assessment-form-column > .vc_column-inner,
	.g-cols.via_flex.assessment-access-inner-row > .assessment-points-column > .vc_column-inner {
		padding: 4rem 6%;
	}

	/* …and the panel's two insets should then MEASURE the same, which they did not
	   — `zC3hFeYoy63bAzFb3c4z`, iPhone, "ovaj razmak izjednaciti sa gornjim
	   razmakom od teksta 'get immediate ..' do pocetka plave sekcije", pinned at
	   y=385.7 of a 424-tall panel, i.e. in the bottom inset.

	   The padding above is symmetric, so this took a screenshot to see and then a
	   measurement to explain. MEASURED at 390: the heading's top sits **64** below
	   the panel's top edge, exactly the 4rem — but the Subscribe button's bottom
	   sits **88** above the panel's bottom edge. Twenty-four extra, and none of it
	   ours. Gravity Forms contributes both halves:

	     .gform_footer   padding-bottom: 16px
	     .gform_button   margin-bottom:   8px

	   Both are invisible in the panel's own padding readout, which is why the two
	   insets look equal until you measure to the INK.

	   Zeroed by experiment, not by inspection — the first attempt guessed the 8 was
	   an inline-block descender and reached for `display: flex`, which changed
	   nothing because the button's margin is a real margin. Forcing each value in
	   the live page in turn is what separated 16 from 8: block layout with both at
	   zero measures 0, and so does flex, so the layout mode was never in it.

	   Specificity: Gravity's own rule is `.gform_wrapper.gravity-theme
	   .gform_footer` at (0,3,0) and beat the first attempt's (0,2,0) — its class
	   goes into the selector rather than being out-weighted by hand.

	   NOT taken to desktop, where the same fault measures 120 against 163. That
	   pass is signed off and no thread covers it; his call whether to square it. */
	.assessment-form-column .gform_wrapper.gravity-theme .gform_footer {
		padding-bottom: 0;
	}

	.assessment-form-column .gform_wrapper.gravity-theme .gform_footer .gform_button {
		margin-bottom: 0;
	}

	/* And hand the widths back to the theme — the calc above exists only to put
	   the seam under the hero photo, and once the panels are stacked there is no
	   seam to place. Without this they would keep their desktop fractions
	   instead of stacking to full width. */
	.g-cols.via_flex.assessment-access-inner-row > .assessment-form-column,
	.g-cols.via_flex.assessment-access-inner-row > .assessment-points-column {
		width: 100%;
	}

	/* The two panels each paint their own ground and are meant to read as one
	   band — on desktop the seam between them lands under the hero photo. Stacked
	   they still have to touch, but Impreza's 601–1024 rule gives any column with
	   an `md` class `margin: 1rem 0`, and 32px of section background opened up
	   between the two colours.

	   Not folded into `cols-flush`: that utility also zeroes the columns' inline
	   padding at (0,5,0), which would take the 6% inset with it. Written out here
	   instead, and at (0,5,1) — theirs is (0,4,1) and the rule directly above is
	   only (0,3,0), so this could not just be another declaration in it. */
	.l-body .g-cols.via_flex.type_default > div.assessment-form-column,
	.l-body .g-cols.via_flex.type_default > div.assessment-points-column {
		margin-block: 0;
	}

	/* Same for the split testimonials row: two panels that paint their own ground
	   and are meant to read as one, so the 1rem Impreza gives them between 601 and
	   1024 opened 32px of section background between the two colours.

	   NOT written on `cols-flush` — tried that first and it was wrong. That utility
	   is about the INLINE axis, columns butting side by side. Stacked, a blanket
	   rule on it also took Impreza's 1.5rem out from under the home approach and
	   programs bands on a phone, where that gap is air the two blocks want.
	   Named rows only. */
	.l-body .g-cols.via_flex.type_default > div.testimonials-head-column,
	.l-body .g-cols.via_flex.type_default > div.testimonials-video-column {
		margin-block: 0;
	}

	/* Gravity Forms sits in an `align_left` vwrapper, so it is a flex item on a
	   cross axis held at flex-start and sizes to fit-content: measured at 768 the
	   form came out 582px inside a 690px column, short of the copy above it and of
	   its own section. Nothing sets that width — it is just what the fields ask
	   for. `width: 100%` puts it back on the column, and GF's own twelve-column
	   grid recomputes from there (the email / phone pair stays 6+6). */
	.l-body .gform_wrapper {
		width: 100%;
	}

	/* Header Horizontal Indents drop to 1rem at this breakpoint in Theme
	   Options, so the CTA block's bleed has to follow. */
	.w-btn.header-cta-btn {
		margin-right: -1rem;
	}

	/* The top of the section ladder is retuned rather than overridden per section:
	   ab-base states `.l-section.height_huge { padding-block: var(--section-pad-huge) }`
	   precisely so a project can move the step, and Impreza's own 8rem is a
	   desktop proportion. From the tablet tier down `huge` and `large` do the same
	   job, so huge collapses onto large — 128px to 96px, everywhere at once, with
	   no new selectors and nothing to keep in sync. Moved up from 767 on
	   2026-08-28, his call. The footer keeps its own, smaller bottom below 600;
	   that rule is more specific and still wins. */
	:root {
		--section-pad-huge: var(--section-pad-large);
	}

	/* The pricing halves are a left/right gradient on the section, which stops
	   making sense the moment `tablets_columns="1"` stacks the two columns —
	   each stacked column would then sit across BOTH colours. Below the stack
	   the colour goes back onto the columns themselves, one each. */
	.mm-pricing-section {
		background: var(--color-content-bg);
	}

	.mm-pricing-skills-column > .vc_column-inner {
		background: var(--color-content-bg-alt);
	}

	/* Stacked (tablets_columns="1"), the derived panel width no longer describes
	   anything — the intro is full width and the steps sit below it, so a
	   left-edge panel would tint them too. The panel becomes the intro column's
	   own background instead, and the numbers stop overhanging into it. */
	.framework-section::before {
		content: none;
	}

	.framework-intro-column > .vc_column-inner {
		padding-block: var(--space-lg);
		background: var(--color-content-secondary);
	}

	/* `margin-left: 0` because the overhang above has nothing left to overhang
	   into once the panel is the intro column's own ground.

	   The COLOUR was darkened here at the same time, and that part is undone
	   2026-09-10 — Ruttl `f9PidrDpLvr9t41tllh4`, "brojevi treba da budu svetliji".

	   What the numeral is doing on desktop only becomes clear once you measure it.
	   At 1440 its box runs 572..732 and the panel ends at 618, but the BOX is the
	   wrong thing to measure — a glyph does not start at its layout edge. Taken
	   from the font instead (`measureText().actualBoundingBoxLeft` at
	   `500 135px Geist`), the side bearing is 6px, so the ink starts at 578 and
	   **40px of painted numeral lies ON the panel**, in the panel's own colour,
	   with the rest emerging onto the white. The panel edge SLICES the "0" at
	   roughly its middle. The colour is not a legibility choice up there, it is
	   the effect itself, which is why it is Blue Medium and not something darker.

	   Stacked, the slice is gone but the numeral keeps its identity, and Blue
	   Medium is what the design gives it. So the swap to Blue Dark was mine, not
	   the design's, and she is overruling it.

	   There is no legibility cost to weigh, and checking that is what settles it.
	   The base rule also carries `opacity: 0.5`, which `getComputedStyle().color`
	   does not report — so the swap was never 3.51:1 against 1.51:1 as the colour
	   values alone suggest. Composited over white the numeral renders
	   rgb(178,196,226) = **1.76:1** dark, rgb(219,234,250) = **1.22:1** light
	   (computed, not eyeballed). Neither is readable text at any threshold: this
	   is a watermark by construction, every step carries its own heading, and the
	   darker value bought nothing anyone could read. Which is the answer to why
	   the design picked the pale one. */
	.step-item > .w-text {
		margin-left: 0;
	}

	/* Once the columns stack there is nothing left to equalise, and the
	   equal-height chain turns into dead space: the two text cards share a `1fr`
	   row track, so the short quote inherits the long one's height. Measured at
	   440px — both cards 721px tall, ~250px of the second one empty. Undone here
	   rather than at 600 because the row stacks at `tablets_columns="1"`. */
	.testimonial-column .wpb_wrapper,
	.testimonial-column .w-grid,
	.testimonial-column .w-grid-list,
	.testimonial-column-video .w-grid-item,
	.testimonial-column .w-grid-item-h {
		height: auto;
	}

	/* The card inset is a ratio of the design's 544px card — 11% / 10.7% reads as
	   60px / 58px only while the card is that wide. From the tablet tier down the
	   column narrows faster than the type does, so the percentage keeps eating
	   measure it can no longer afford; a flat inset from here, the way the phone
	   already has one below 600. His call, 2026-08-28.

	   SQUARED UP 2026-09-10 — Ruttl `JXrWvSah` (1-on-1) and `BmKT2bC7`
	   (Mastermind), both iPad, both pinned INSIDE the left inset strip (x=15 and
	   x=10 against a 24px band): "veci padinzi sa strana ... da ne bude tekst
	   zalepljen za ivicu".

	   The horizontal figure was the odd one out, not the vertical: measured at
	   820 the page gutter is 40px and the card's own top inset is 40px, so 24 a
	   side was the only edge in the composition that did not line up — the quote
	   sat 16px closer to the screen edge than everything above and below it. One
	   value, `2.5rem` on all four sides, and the card reads as a square inset
	   again.

	   Costs 32px of measure on the split layouts, where the card is the full
	   725: 677 -> 645, about 69 characters at 18.6px. The video card in the same
	   column loses the same 32 and keeps its ratio.

	   HOME IS NOT COVERED and deliberately so: its two lists stay side by side at
	   820 (`home-testimonials-inner-row`), so each card is only 363 wide and 40 a
	   side would leave a 283px measure — ~30 characters. Her Home thread
	   (`cTnGMLwlhL1F1S8AmTJS`) asks for a font-size drop in the same breath,
	   which is the 2-up row's real problem. That one is his call.

	   Below 600 the flat `1.5rem` further down still wins, so the phone pass —
	   which is final — does not move. */
	.testimonial-column .w-grid-item-h {
		padding: 2.5rem;
	}


	.testimonial-column-text .w-grid-list {
		grid-auto-rows: auto;
	}

	/* The copy half is inset 17% / 13%, a ratio of the design's 720px half. Once
	   the row stacks that is a 75px indent on a 440px phone — his call,
	   2026-08-27: a flat 2.5rem / 1.5rem from 1024 down. Same 0-5-2 shape as the
	   desktop rule it overrides, which is also what carries it past `cols-flush`. */
	.g-cols.via_flex.type_default.home-approach-inner-row > div.approach-copy-column > .vc_column-inner {
		padding-inline: 2.5rem 1.5rem;
	}

	/* Ken is at the far LEFT of this photo, standing. Any crop that takes width
	   off both sides loses him — at 3/2 on a phone he is gone entirely. Anchoring
	   the crop to the top-left keeps him whole at every ratio below the stack. */
	.home-event-band-image img {
		object-position: 0 0;
	}

	/* `height="huge"` is 8rem top and bottom. The ≥1025 rule already trims the
	   bottom to 4rem, because the design does not want a full ladder step under
	   the last footer row; on a phone even that reads as a screenful of nothing,
	   so it drops to the small step (2rem). Compounded onto `.height_huge` to
	   out-specify Impreza's own 0-2-0 rule for it. */
	.l-section.height_huge.main-footer-section {
		padding-bottom: var(--section-pad-small);
	}

	/* The footer columns each carry 50px of block padding, which is what holds
	   their content clear of the two horizontal rules while they sit side by side.
	   Stacked, that padding meets itself: 50 + the 24px column margin + 50 = 124px
	   between one block's last line and the next block's first (measured). The
	   clearance is still wanted at the two ENDS, where the rules actually are, so
	   it stays on the first column's top and the last one's bottom and the middles
	   drop to a normal rhythm — 12 + 24 + 12 = 48px. */
	.g-cols.via_flex.type_default.footer-inner-row > .wpb_column > .vc_column-inner {
		padding-block: var(--space-xs);
	}

	.g-cols.via_flex.type_default.footer-inner-row > .wpb_column:first-child > .vc_column-inner {
		padding-top: var(--space-xl);
	}

	.g-cols.via_flex.type_default.footer-inner-row > .wpb_column:last-child > .vc_column-inner {
		padding-bottom: var(--space-xl);
	}

	/* The split band's compass hangs in the gutter to the LEFT of the copy —
	   `left: calc(-47px - var(--space-sm))` against a vwrapper that, once the band
	   stacks, starts at the section's own text edge. There is no gutter left to
	   hang in: measured on About at 393, the mark sat at x=-43 with 4px of it on
	   screen. Back into flow, where it reads as the section's opening mark. */
	.split-copy-vwrapper .section-mark {
		position: relative;
		left: auto;
		top: auto;
	}

	/* The compass is bled off the viewport's RIGHT edge by a formula written for
	   the 1440 artboard. Below the stack it lands 80px outside the LEFT edge
	   instead (measured at 440px) and shows as a clipped arc. It is decoration —
	   drop it rather than re-derive a placement nobody designed. */
	.testimonials-watermark-image {
		display: none;
	}
}

/* The hamburger's own band. The number is NOT a Theme Options breakpoint — it is
   one below `mobile_width` on the menu element (1140px), which is what decides
   where the desktop nav gives way. If that setting moves, this moves with it;
   everything below dresses a control that only exists under it.

   Horizontal indents are deliberately NOT here: Row Horizontal Indents is a
   responsive Theme Options field and already steps down on its own. */
@media (max-width: 1139px) {

	/* ---- Mobile nav: the CTA block becomes the menu toggle ----

	   Design: the old mobile frame (781:553 closed, 824:580 open) puts a 109x90
	   block flush in the top-right corner with a word in it instead of a burger —
	   and his call, 2026-08-27: on the SAME ground the desktop header CTA uses,
	   in the same face. That is Button Style 5 "Header CTA Block": Deep Blue
	   ground, Blue Medium ink, Geist 13/600 — and its hover swap is exactly the
	   open state the design draws (Blue Medium ground, Deep Blue "Close").

	   The ground goes on the NAV ELEMENT, not on the `<a>` and not on the cell:
	   us-style pins the control to `line-height: 50px; max-height: 50px`, so the
	   control can never be the block itself — and the CELL is wrong above 600,
	   because from 601 to 1024 the real CTA button shares it (measured at 900:
	   cell 308–869, holding nav AND button) and painting the cell would paint the
	   empty space between the logo and the menu too. The nav is the block on its
	   own: `align-self: stretch` fills the header height at whatever that state
	   sets it to (104 on desktop, 90 on tablets and mobiles), and `min-width`
	   holds the design's 109 rather than the 95 the label alone gives.

	   PHONE ONLY since 2026-08-28. The designer's tablet/laptop header (Figma
	   2012:840) drops the block entirely above 600: there the control is the plain
	   word plus the burger, dark on the white header, and the only coloured slab
	   in the row is the real CTA button. The block below is what is left of the
	   old treatment, and it now lives in the 600 block further down.

	   The word itself is the Header Builder's `mobile_icon_text_label`; swapping
	   it for "Close" is `initNavLabel()` in ab-custom.js. */
	.l-header .l-subheader-cell.at_right .w-nav-control {
		padding: 0;
		font-size: 13px;
		font-weight: 600;
	}

	/* The label sat 7px right of the block's centre — measured 43.7px of ground on
	   its left against 29.9px on its right. Impreza pulls the control out by
	   `margin-inline-end: -0.8rem` to cancel the hamburger glyph's optical
	   padding; with the glyph hidden that pull has nothing to cancel, and the
	   cell's `justify-content: center` centres the control's BOX — negative margin
	   included — so half of it (6.4px) shows up as the asymmetry. Zeroing it
	   leaves 37.3 / 36.3, the last 1px being the block's own left hairline.

	   It has to be the logical property, and it has to out-specify
	   `body.header_hor .l-subheader-cell.at_right .w-nav:last-child
	   .w-nav-control` (0-6-1): a plain `margin-right` at lower weight is simply
	   never applied, which is what the first attempt did. */

	/* The fullscreen panel draws its own close cross in the corner, which would
	   sit next to our "Close" block. Hidden — the block is the only control.
	   Six classes because theirs is five (`.w-nav.type_mobile.m_layout_fullscreen
	   .w-nav-list.level_1 .w-nav-close`) and a shorter selector loses silently.

	   The panel itself no longer covers the header: the menu element's
	   `mobile_header_visible` param was switched on, which is what lets the block
	   stay visible and flip to "Close" over the open menu. Without it the panel is
	   `position: fixed` INSIDE the header cell, so no z-index on the cell can lift
	   the ground above its own descendant. */
	.l-header .w-nav.type_mobile.m_layout_fullscreen .w-nav-list.level_1 .w-nav-close {
		display: none;
	}

	/* The open panel, from 824:595. Ground and ink are the menu element's own
	   `color_mobile_bg` / `color_mobile_text` (Deep Blue / Blue Medium, both set
	   in the builder); what the builder has no field for is the geometry and the
	   bullet, so they are here.

	   The FACE is deliberately not touched — his call, 2026-08-27: the mobile
	   items stay on the same face as the desktop nav. The old design drew them in
	   Platypi Medium Italic; that is the one thing from 824:595 we do not follow.

	   Geometry: bullet at 59, copy at 88, rows 48 tall on a 24 gap. The anchor's
	   `margin-inline: 0` is load-bearing — Impreza pulls the item out by its own
	   padding, so with the padding zeroed the negative margin was still dragging
	   the whole row 11px left of the list. */
	.l-header .w-nav.type_mobile .w-nav-list.level_1 {
		padding-inline: 59px;
		padding-block-start: 0;
	}

	/* The panel is TOP-ALIGNED, not centred. Ruttl 2026-09-09, the same complaint
	   from both narrow widths: iPad `ppqqIwlDmBiDMZGWvMMb` "preveliki razmak kod
	   meni navigacije", iPhone `X2hCe9A8eBjJIdCWfMTn` "preveliki razmak od
	   'close' do menu itema".

	   It was not padding and not a gap anyone authored. Impreza centres the list
	   with a pair of auto margins —

	     .w-nav...m_layout_fullscreen .w-nav-list.level_1 > li:first-child
	         { margin-top: auto }
	     ... > li:nth-last-child(2) { margin-bottom: auto }

	   — which split the panel's free space evenly. MEASURED at 375x812: 97.6px
	   above the first item and 97 below the last, putting "Home" 150px under the
	   Close block.

	   The design puts it at ZERO. Frame 824:579: the Close block is 90 tall and
	   the "Menu items" frame starts at y=90, flush under it. So the first item
	   lands on 90 once the auto margin and the list's own 32px top padding are
	   both gone. The rows are 48px of line-height with the label optically
	   centred, so "flush" still reads as air.

	   3rem RATHER THAN THE DESIGN'S ZERO — his call, 2026-09-11: "da ne bude
	   toliko nabijeno gore". Flush under the Close block measured correct and
	   still read as cramped on the device, which is the one thing a frame cannot
	   tell you. 48px is the row's own line-height, so the gap above the list is
	   exactly one row — a figure already in the panel rather than a new one.

	   Killing only the TOP auto margin leaves `margin-bottom: auto` on the CTA
	   item, which then absorbs the whole free space BELOW it — so the Schedule a
	   Consultation button rides up with the list instead of sitting near the
	   bottom of the screen. That is a visible change nobody asked for, and it is
	   the right one: the button belongs to the menu, not to the bottom edge.

	   Row pitch is NOT touched. The 0.5rem gap above is his call from 2026-08-27
	   and is deliberately not the design's 24 — see the note on that rule. She
	   asked for less space, and the row gap is already tighter than the design.

	   (0,5,1) against Impreza's (0,3,1). */
	.l-header .w-nav.type_mobile.m_layout_fullscreen .w-nav-list.level_1 > li:first-child {
		margin-top: 3rem;
	}

	/* 0.5rem, not the 1.5 this started at: the row is already 48px of line-height,
	   so the gap is air on top of a tap target that is comfortable without it.
	   1.5 put the pitch at 72 and the seven items read as seven separate things —
	   his call, 2026-08-27, and 56 is the pitch that reads as one list. */
	.l-header .w-nav.type_mobile .w-nav-list.level_1 > .menu-item {
		margin-bottom: 0.5rem;
	}

	.l-header .w-nav.type_mobile .w-nav-list.level_1 > .menu-item > a {
		position: relative;
		margin-inline: 0;
		padding: 0 0 0 29px;
		line-height: 48px;
	}

	.l-header .w-nav.type_mobile .w-nav-list.level_1 > .menu-item > a::before {
		content: '';
		position: absolute;
		left: 0;
		top: 50%;
		width: 5px;
		height: 5px;
		margin-top: -2.5px;
		border-radius: 50%;
		background: currentColor;
	}

	/* The Reusable Block at the foot of the panel holds the Schedule a
	   Consultation button. Impreza's wrapper is `align_center`, which read as an
	   accident next to seven left-aligned items — and the button's own 30px inner
	   padding means that flushing the PILL to the panel's 59px edge puts its
	   LABEL on 89, i.e. the same copy column as the bulleted labels above it
	   (measured 88). `margin-block: 0` drops the wrapper's stray 0.3rem so the
	   list rhythm stays the 24 + 8 set on the item itself. */
	.l-header .w-nav.type_mobile .w-nav-list.level_1 .w-btn-wrapper {
		margin-block: 0;
		text-align: left;
	}

	.l-header .w-nav.type_mobile .w-nav-list.level_1 > .menu-item:has(.w-btn) {
		margin-top: 1.5rem;
	}

	/* Only whatever is LAST in the cell may bleed past the header's own indent.
	   On a phone that is the menu block (the CTA is in the Hidden Elements tray);
	   from 601 to 1024 the CTA button is last and carries its own -1rem from the
	   Header Builder, and the menu block sits inboard of it.

	   `!important` is not laziness here — it is the only thing that moves this.
	   Impreza zeroes the margin on the last element of the right cell with its own
	   `!important`, so specificity is off the table: tested at 400 with
	   `body.header_hor` in front (0,6,1), with the class doubled, and with the tag
	   named, all three left the block at 260..369 while the screen edge is 385.
	   With `!important` it lands on 385. */
}

/* Open state: the header row goes under the panel with it.

   `mobile_header_visible: 1` keeps the header above the panel on purpose — the
   Menu/Close block has to stay reachable, and the panel is `position: fixed`
   INSIDE the header cell, so nothing can be lifted over it. The side effect was a
   white strip across the top with the logo still in it, sitting on a navy panel.
   His call, 2026-08-28: the whole row takes the panel's ground and only the Close
   block stays, so the two read as one surface.

   No media query, deliberately. `:has(.w-nav-control.active)` is already the exact
   condition — the control only has an `active` class when it is the hamburger and
   the panel is open — so this follows `mobile_width` without a number to keep in
   sync. The logo is hidden rather than swapped for a light version: `visibility`
   not `display`, so the row keeps its height and the Close block does not move. */
/* The timing is Impreza's own, copied from the panel it has to move with:

       .w-nav.type_mobile.m_layout_fullscreen .w-nav-list.level_1 {
           transition: transform .3s cubic-bezier(.4,0,.2,1),
                       opacity   .3s cubic-bezier(.4,0,.2,1),
                       visibility .3s;
       }

   Read out of the theme's own stylesheet rather than guessed — the panel fades
   over 300ms and the cover was snapping in instantly beside it. `visibility` is
   in the list for the same reason it is in theirs: it holds the logo in the tree
   for the whole fade instead of dropping it on the first frame. Neither element
   carries a transition of its own, so the shorthand is safe here. */
.l-header .l-subheader.at_middle {
	transition: background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.l-header .l-subheader-cell.at_left {
	transition:
		opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1),
		visibility 0.3s;
}

.l-header:has(.w-nav-control.active) .l-subheader.at_middle {
	background: var(--color-content-primary);
}

.l-header:has(.w-nav-control.active) .l-subheader-cell.at_left {
	opacity: 0;
	visibility: hidden;
}

/* And the page underneath stops scrolling while it is open.

   His report, 2026-08-28: with the header's sticky auto-hide on, scrolling with
   the menu open hides the header, the content runs past behind the panel, and the
   panel itself stays where it was — it is `position: fixed` INSIDE the header
   cell, so it is anchored to a box that has just been moved out of the way.

   A fullscreen menu should not have a page moving behind it at all, so the cure is
   the cause: no scroll, no auto-hide, nothing to fall out of sync. It goes on the
   root because that is the scrolling element here — `overflow: hidden` on `body`
   alone left the page scrolling, measured.

   No media query: `:has(.w-nav-control.active)` is true only when the control is
   the hamburger and the panel is open, so this follows `mobile_width` on its own
   and does nothing at desktop widths. */
html:has(.w-nav-control.active),
html:has(.w-nav-control.active) body {
	overflow: hidden;
}


/* ---- The designer's tablet / laptop header, 2026-08-28 ----

   From the frame he sent in chat (node 2012:840 still holds the BEFORE shot, so
   this is built from the image, not the node): logo, then the navy CTA slab, then
   a Blue Medium square carrying the burger alone, flush to the screen edge. The
   word "Menu" is gone; so is the CTA's flush-right position — the square takes it.

   His rule for the order, in his words: wherever the menu is not the desktop menu,
   the button comes first and the menu second. That boundary is `mobile_width`
   (1140), which does NOT line up with the header's own states — the laptops state
   runs to 1279 and carries both arrangements. So the order is stated here rather
   than left to the Header Builder, which can only speak per state. Below 1025 the
   builder already puts them in this order and `order` is a no-op there; it is
   written for the whole band anyway so the two halves cannot drift apart.

   The bleed moves with the order. Whatever is LAST sits on the screen edge, and
   the amount is that state's header indent — 1rem on tablets, 2.5rem on laptops.
   The CTA's own negative margin has to be cancelled, and neither that nor the
   square's bleed lands without `!important`: the Header Builder writes both
   elements' margins from the element `css` param, and it out-specifies anything
   reasonable — tested at 1100 with the cell in the selector, with `body.header_hor`
   in front and with the class doubled, all three left the button on -40px. */
@media (min-width: 601px) and (max-width: 1139px) {

	.l-header .l-subheader-cell.at_right > .w-btn.header-cta-btn {
		order: 1;
		margin-right: 0 !important;
	}

	/* `aspect-ratio: 1` rather than a width: the square then follows whatever the
	   state sets the header to — 98 on laptops, 90 on tablets — the same way the
	   CTA slab does, so a height change in the builder needs no number here. */
	.l-header .l-subheader-cell.at_right > .w-nav {
		order: 2;
		display: flex;
		align-self: stretch;
		align-items: center;
		justify-content: center;
		aspect-ratio: 1;
		margin-left: 0;
		background: var(--color-content-secondary);
		color: var(--color-content-primary);
	}

	/* The label is a bare `<span>` inside the control — no class of its own, which
	   is why this is a child selector and not a named one. */
	.l-header .l-subheader-cell.at_right .w-nav-control > span {
		display: none;
	}

	/* `:hover` and `:focus` are listed for a reason — her ruttl note, "'meni'
	   nestaje na hover, staviti bela slova". The control is an `<a>`, so the site's
	   link hover colour lands on it, and against this ground that colour is the
	   ground. Pinned to the block's own ink in every state instead. */
	.l-header .l-subheader-cell.at_right .w-nav-control,
	.l-header .l-subheader-cell.at_right .w-nav-control:hover,
	.l-header .l-subheader-cell.at_right .w-nav-control:focus {
		color: inherit;
	}

	.l-header .w-nav-control .w-nav-icon {
		display: block;
	}

	/* Centring the burger in the square takes undoing two things Impreza does for
	   a control that has a WORD next to it, which this one no longer has:

	   - the control carries `margin-inline-end: -0.8rem` (-12.8px), an optical
	     correction for the glyph's own padding. `justify-content: center` centres
	     the control's BOX, negative margin included, so half of it shows up as a
	     shift — measured at 885 the burger sat 43px from the left of the square
	     and 23px from the right.
	   - the icon carries `margin-left: 8px`, the gap to the label. With the label
	     display:none that gap is 8px of nothing, and it pushed the same way.

	   The margin rule has to out-weigh
	   `body.header_hor .l-subheader-cell.at_right .w-nav:last-child .w-nav-control`
	   (0,6,1) — and it cannot use `:last-child` itself, because from 1025 to 1139
	   the nav is last only by `order`, not in the DOM. Hence the doubled `.w-nav`,
	   which takes it to (0,7,1) and settles it on merit rather than source order.

	   Measured after: 33px on all four sides at 885, 37px at 1085. */
	body.header_hor .l-header .l-subheader-cell.at_right .w-nav.w-nav .w-nav-control {
		margin-inline-end: 0;
	}

	.l-header .l-subheader-cell.at_right .w-nav-control .w-nav-icon {
		margin: 0;
	}
}

@media (min-width: 601px) and (max-width: 1024px) {
	.l-header .l-subheader-cell.at_right > .w-nav {
		margin-right: -1rem !important;
	}
}

@media (min-width: 1025px) and (max-width: 1139px) {
	.l-header .l-subheader-cell.at_right > .w-nav {
		margin-right: -2.5rem !important;
	}
}

/* -----------------------------------------------------------------------------
   Testimonials archive (/testimonials/)
   -------------------------------------------------------------------------- */

/* The page carried a bare grid and nothing else — no section, no heading, and
   none of the card treatment, because every card rule on the site is scoped to
   `.testimonial-column`, a class that only exists in the two-column
   compositions on Home and in the split band. His call, 2026-08-28: put
   `main-testimonial-section` on the row and aim at that.

   Layout 311 emits both kinds of card here, video ones with a picture and a
   pill and text ones without, mixed into one masonry. So the fill alternates
   down the DOM the way Home's stack does, rather than by column type. Note the
   grid is `orderby="rand"`: which card lands on which ground changes per load,
   which is why the two grounds have to be equal partners rather than a
   figure-and-exception. */
.l-section.main-testimonial-section .w-grid-item-h {
	height: 100%;
	padding: 2.5rem;
	background: var(--color-content-bg-alt);
}

/* Three grounds, not two. Blue Medium belongs in this page's palette — it is
   what a testimonial card wears on Home and in the split band — but it cannot
   ride on "has a video": 11 of the 15 cards here carry one, counted live, so
   that rule paints almost the whole page blue. Rotating it by position instead
   keeps it to a third and lets the picture, not the ground, say which cards are
   video. His call, 2026-08-28. */
.l-section.main-testimonial-section .w-grid-item:nth-child(3n + 1) .w-grid-item-h {
	background: var(--color-content-bg-alt);
}

.l-section.main-testimonial-section .w-grid-item:nth-child(3n + 2) .w-grid-item-h {
	background: var(--color-grey-lightest);
}

.l-section.main-testimonial-section .w-grid-item:nth-child(3n) .w-grid-item-h {
	background: var(--color-content-secondary);
}

/* The inset comes off the ratio entirely and goes flat. 11% / 10.7% is a figure
   from the design's 544px card inside a composed section; these cards are 617px
   in a masonry, where the same ratio gives 62px above the first line and 61 at
   the sides and reads as a hole rather than as an inset. Video cards showed it
   first — the player has hard edges, so the gap above it is unmistakable — but
   it was the same on every card.

   The figures were then chased down too far, because the builder's second inset
   below was still in play and every measurement was a sum. With that zeroed, the
   card's own padding is the whole inset and it can be read honestly: 2.5rem on a
   617px card, 1.5rem once the card is 327 and 40px would be an eighth of it.
   His call, 2026-08-28. */


/* =============================================================================
   Framework panel — the tablet band only

   Ruttl `wwuvPIzymCKiUfMUbfjx` (Mastermind) and `kUEh4WTuQtg8TKBuUmoZ` (1-on-1),
   both iPad, and they are the SAME element: identical selector, identical
   measurements on both pages (panel 25..780 in an 805px box, padding
   `40px 79.1667px 40px 15px`). One pinned the left edge (x=15), the other the
   right (x=689 of 820) — between them they describe the whole strip.

   Two separate bugs were sitting in that one measurement:

   1. **The panel stops at the section's text edge.** Below 600 it already runs
      screen-edge to screen-edge, because the mobile block zeroes the row's
      margin and the column's padding and the section carries no gutter there.
      At 820 the section DOES carry a 40px gutter, so the same trick lands the
      panel on the text edge and leaves a 25px white strip each side. Bleeding
      past a padded ancestor needs real negative margin, which is what
      `calc(50% - 50vw)` is: half the element's own containing block minus half
      the viewport, measured from the element rather than from a content width.
      Safe here because both `body` and `.l-canvas` are `overflow-x: hidden` /
      `clip` — measured on both pages.

      NOT `col-bleed-x-full`: ab-base's formula is
      `(100vw - var(--site-content-width)) / -2`, which assumes the viewport is
      WIDER than the content column. Same trap noted in the mobile block below.

   2. **The desktop reading indent leaks in.** `padding-right: var(--col-width)`
      (79.17px) is the gap to the steps column BESIDE the panel on desktop.
      Stacked there is nothing to its right, so the copy sat 15px from one edge
      and 79 from the other. The mobile block already corrects this; the tablet
      band never did.

   `2.5rem` for the inset rather than mobile's `1.5rem`, because it is the page
   gutter at this width — the same figure the testimonial cards were just
   squared up to, so a panel and a card inset alike.

   Scoped `min-width: 601px` deliberately. The phone pass is FINAL and its panel
   already measures 0..375; leaving it out of this rule is what guarantees it
   cannot move. The specificity (0,6,0) is what beats the desktop indent at
   (0,5,0) and Impreza's own `padding` shorthand at (0,4,1). */
@media (min-width: 601px) and (max-width: 1024px) {

	.g-cols.via_flex.type_default.framework-inner-row > .framework-intro-column > .vc_column-inner {
		width: 100vw;
		margin-inline: calc(50% - 50vw);
		padding-inline: 2.5rem;
	}

	/* Pricing band — three threads, one composition.
	   `GjlE2tB7UrspE0sZYR6S` (iPad) "plava sekcija ne treba da ima beline sa leve
	   i desne strane", `zvokq1PbgcEQP9FPSEHA` (iPad, pin x=807 of 820 — the right
	   screen edge) "zuta sekcija moze da ide do kraja", and on the phone
	   `BXSAbOK5IVSLMK2XK0Vl` "plavu sekciju povecati od ivice do ivice, da se
	   spoji sa zutom sekcijom". Between them: the band should be edge to edge,
	   with the Blue foot and the Yellow half meeting instead of a white seam.

	   Measured at 820 before: the row sat on the section's text edge, Blue at
	   49..379 and Yellow at 403..780 in an 805px box — white down both outer
	   sides and a 24px white gap between the two colours.

	   THE DESKTOP ALREADY DOES THIS. The base rule bleeds the panel to the
	   viewport's left edge and pulls its right margin to the column edge; the
	   `max-width: 1279px` block cancels it because that bleed is arithmetic on
	   `(100vw - var(--site-content-width))`, which goes NEGATIVE below 1280 and
	   describes nothing. That reasoning is right and stays. What was lost with it
	   was the intent, and the intent is what she is asking for back.

	   So the same result, reached the other way round: bleed the ROW to the
	   viewport, then pull the panel out by the column's own inset. The row is
	   horizontally centred in the section, which is the one condition
	   `calc(50% - 50vw)` needs to be exact — half the element's containing block
	   minus half the viewport IS the distance to the screen edge only for a
	   centred box. (It is NOT exact for the panel itself, which sits off-centre
	   in its column; measured from there the formula overshoots by ~196px.)

	   After: row 0..820, Blue 0..410, Yellow 410..820. The columns' 24px inset
	   is left as it is — it is the same figure the phone tier already uses on
	   this band, so the two tiers now read alike. */
	.g-cols.via_flex.type_default.mm-pricing-inner-row {
		width: 100vw;
		margin-inline: calc(50% - 50vw);
	}

	.mm-pricing-offer-column .price-panel {
		margin-inline: -1.5rem;
	}

	/* The gap from the Blue panel down to step 01 — `xSQmjZUDi0d74mSeDejq`
	   (Mastermind, iPad) and `g4ctS9NozWJ7C1qt9YAx` (1-on-1), plus
	   `NEQMAV9KZVMDp85aO0Wu` on the phone. She names the target rather than a
	   direction: "razmak od plave sekcije do broja i teksta da bude isti kao od
	   teksta do broja 2 ispod".

	   Measured, identical on both pages: 32px here against the steps' own 80, and
	   24 against 50 on the phone. The two figures were never related — the step
	   rhythm is authored (`--space-3xl`, and `--space-xl` below 600), while this
	   gap is whatever margin Impreza drops on a column when the row stacks.
	   That is why it reads as a stumble: the list starts on a tighter beat than
	   it keeps.

	   Stated with the SAME TOKEN the step rule uses at this tier rather than a
	   literal 80px, so the two stay locked if the ramp is ever retuned. */
	.g-cols.via_flex.type_default.framework-inner-row > .framework-intro-column {
		margin-bottom: var(--space-3xl);
	}

	/* The gap is a SUM, and only half of it was visible from the intro column.
	   Impreza gives a stacked column `margin: 16px 0`, so the steps column brings
	   its own 16 to the join: the original 32 was 16 + 16, and stating 80 above
	   landed 96. Zeroed here rather than by subtracting 16 from the token above,
	   which would have made that rule lie about the figure it produces.

	   Not needed below 600 — measured, the phone tier gives the intro column a
	   bottom margin and the steps column nothing, so 50 lands as 50. */
	.g-cols.via_flex.type_default.framework-inner-row > .framework-steps-column {
		margin-top: 0;
	}

	/* "What's Included" head — the eyebrow sits too far off its heading.
	   `0unP7HyDz0N0mimMxytq` (Mastermind, iPad) and `dfA0pf1u2I3AR5g9z7oG`
	   (1-on-1, iPhone): same section, same component, same complaint, and both
	   pins land inside this one gap rather than anywhere else in the block.

	   The gap is 26px at EVERY width — it is `--vwrapper-gap: 1.6rem`, a
	   constant. The heading is not: 32px at 1440, 26.6 here, 24 on the phone. So
	   the gap goes from 0.81x the heading to 1.08x as the screen narrows, and the
	   eyebrow drifts away from the words it belongs to. Nothing is "wrong" at any
	   single width, which is why it only reads as a mistake on the narrow ones.

	   That is also why desktop is not in this rule and was not flagged: up there
	   the head is TWO columns, heading beside paragraph (measured `h2_to_para` of
	   -137), so this is the only gap in its column and has nothing to be out of
	   step with. From 1024 down the three blocks stack into one rhythm.

	   The figure is the design's own ratio, not a guess: Figma puts 24 under
	   "What's Included" against a 32px heading, so 0.75. Applied to the heading
	   at this tier, 26.58 x 0.75 = 20. Scoped to this head row because the
	   design's gap under an eyebrow varies by section — 24 here and under "GPS
	   FRAMEWORK", 17 under "Member Bonuses", 16 under "What You'll Implement" —
	   so there is no one number to push down into `.eyebrow-pill`. */
	.included-head-row .w-vwrapper > .eyebrow-pill {
		margin-bottom: 20px;
	}

	/* The "What's Included" head, stacked — `HZY9AllIoB5AmaQ7ku5D` and
	   `P8zFKnpJmPcgTm92M9OC`, both 1-on-1, both iPad, both "smanjiti razmak", and
	   their pins land on the two different joins in that head.

	   Impreza gives each stacked column `margin: 16px 0`, and both of her gaps are
	   made of that margin rather than of anything authored:

	     heading block -> paragraph = 32, which is 16 + 16 meeting in the middle;
	     paragraph -> cards = 73, which is the 57px separator PLUS the paragraph
	     column's own 16 underneath it.

	   The second one has a design figure to check against, and it says the
	   separator was never the problem: Figma puts 56 between the head and the
	   cards on BOTH pages (Mastermind `1692:2180` ends 4381 against cards
	   `1692:2242` at 4437; 1-on-1 `1692:2658` ends 3568 against `1692:2717` at
	   3624). The live separator is 57. So zeroing the column margins alone lands
	   that join on 57 — the design's number — without touching the separator, and
	   that is the whole fix for `P8zFKnpJ`.

	   The first join has no design figure, because at full width the heading and
	   the paragraph are SIDE BY SIDE and never have a vertical gap at all. Stacked
	   they need one, and 24 is stated rather than inherited: it sits between the
	   20 that binds the eyebrow to its heading (rule above) and the 57 that
	   separates the whole head from the cards, so the three joins read as
	   pair / peer / break instead of three near-equal gaps.

	   Zeroing the TOP margin too is deliberate: it was adding 16 under the
	   section's own 96px padding, so the head now starts where the padding says. */
	.g-cols.via_flex.type_default.included-head-row > .wpb_column {
		margin-block: 0;
	}

	.g-cols.via_flex.type_default.included-head-row > .wpb_column + .wpb_column {
		margin-top: 24px;
	}

	/* The framework intro block, same story as the head row above.
	   `0YbbEyMrZGMj2nHNE9eV` (Mastermind) and `jMUaGQuacgiPGeeUDJae` +
	   `KKgBYeGQyOSma33qLP0D` (1-on-1), all "manji razmak", all on the phone. Two
	   of the pins sit in the eyebrow-to-heading gap and the third in the
	   heading-to-paragraph gap, so it is the block's whole rhythm she is reading,
	   not one join.

	   `--vwrapper-gap: 1.8rem` renders 29px at EVERY width on both pages, while
	   the heading goes 32 -> 26.6 -> 24. Same constant-against-fluid shape as the
	   head row, so it gets the same treatment and the same source.

	   Figma `1692:2037` (the desktop intro block) measures it directly: the
	   eyebrow frame `1692:2039` is 26 tall and the heading `1692:2041` starts at
	   50, so 24; paragraph and button follow at 23 each. Against a 32px heading
	   that is 0.75 — the identical ratio the "What's Included" head gave, which is
	   what makes it a system figure rather than two lucky measurements.

	   0.75 of the heading at this tier is 20.

	   WORTH KNOWING, not changed here: desktop renders 29 where Figma says 24, so
	   this block is ~5px loose at full width too. No thread covers it and the
	   desktop pass is closed, so it stays as it is until he says otherwise. */
	.framework-intro-column .w-vwrapper > :not(:last-child) {
		margin-bottom: 20px;
	}

	/* Our Approach on About Us, heading to lede — `ScjkhHzKZRk3a5wGxYEf`, iPad,
	   "preveliki razmak", pinned at y=80.6 inside the gap itself.

	   Same `inner_items_gap` of 6.5rem the ≤600 block already cuts, and the same
	   argument, one tier up. MEASURED at 820: the heading ends at 36 and the lede
	   starts at 140 — a **104px** hole between two blocks that together are only
	   197 tall.

	   The reason it belongs here and not only on the phone is that the columns
	   HAVE ALREADY STACKED at this width — both measure 755 wide at 820. The 104
	   is the design's rhythm for a two-column band, where the short heading column
	   is spaced out to balance the taller copy column beside it. Stacked, there is
	   nothing to balance against and the gap is just a hole. That condition starts
	   the moment `vc_col-md-*` stops applying, which is this tier, not 600.

	   Same 1.5rem as the phone, deliberately: it is the same stacked shape, and
	   two different numbers for one shape would be a figure to keep in sync for no
	   reason.

	   Contact carries the identical defect from `inner_items_gap="6rem"` and is
	   also only cut at ≤600. Left alone — nobody has flagged that page at any
	   width, and it is not under review this round. */
	.about-approach-inner-row .w-vwrapper > *:not(:last-child) {
		margin-bottom: 1.5rem;
	}
}


@media (max-width: 600px) {

	/* The two full-bleed photo bands, phone tier — the same halving the tablet
	   block already does, now on the edges she flagged down here.

	   `PUv4rp0ix5cpWiyEXMGi` "manji razmak od slike do teksta ispod" (section 4,
	   the copy under the journey photo) and `HvqaQE3H3kcPkh5uVgUv` "manji razmak
	   od teksta do slike" (section 8, the heading above the events photo).
	   Measured at 390: every one of these four edges is 64 while the photo bands
	   themselves (sections 3 and 9) carry no padding at all, so 64 is the entire
	   distance from the picture to the words on either side of it.

	   All FOUR edges move, not just her two. Between this round and the tablet one
	   she has now flagged every edge of both bands — section 2's foot and section
	   4's head on the journey band, section 8's foot and section 10's head on the
	   events band — just never all four at the same width. A photo band is one
	   object; 64 above it against 32 below would be a lopsidedness nobody asked
	   for, which is the argument he already accepted for the events band at tablet.

	   `calc(... / 2)` rather than 32px, for the same reason the tablet rule gives:
	   the ladder has no 32 at every tier, and "half" is a relationship. */
	.l-section.mm-journey-section,
	.l-section.mm-events-section {
		padding-bottom: calc(var(--section-pad-large) / 2);
	}

	/* `oo-journey-copy-section` joins at this tier too, for the reason given in the
	   tablet block: it is the same band on another page and it was carrying 64
	   where its Mastermind twin carried 32. Not separately flagged at 390 — she
	   flagged this component on the phone on Mastermind and at tablet on 1-on-1,
	   and between the two every tier of it is covered. */
	.l-section.mm-journey-copy-section,
	.l-section.mm-events-copy-section,
	.l-section.oo-journey-copy-section {
		padding-top: calc(var(--section-pad-large) / 2);
	}

	/* The testimonials split ends flush — no white strip under the last card.

	   FOUR Ruttl threads, one component, four pages, all iPhone:
	     `AZ6qpuEhWyBUGf9ur8fx`  1-1 Coaching   "ukinuti belinu da se spoje plava i siva sekcija"
	     `gis1NUDVSTxLD7YviXkv`  About Us       "ukinuti belinu ovde, mogu da se spoje plava i siva sekcija"
	     `5d8hXyz4ioyPWPAMlLRm`  Self Assessment "ukinuti belinu"
	     `eu5VBCkEwQ63GugP45ny`  Mastermind     "skloniti ovu belinu"

	   Below 600 the two testimonial cards go FULL-BLEED — measured 390px wide in a
	   390px viewport, against 687 inside a 767 one — so the section's 64px bottom
	   padding reads as a white band between a full-width coloured card and whatever
	   full-width thing follows. Above 600 the cards are inset and the padding is
	   correct, which is why this is a ≤600 rule and not a component change.

	   What follows differs by page and the fix serves both: the grey
	   `above-footer-cta-section` (#EBEBEA) on the three pages where this is the last
	   section, and the navy `mm-bonuses-section` on Mastermind, where it is 11th of
	   14. Hence her wording varies — only two of the four name the colours.

	   Verified against the pin on Self Assessment, the vaguest of the four: at 390
	   the section is 1593 tall, the last card ends at 1529, and the pin sits at
	   1554.96 — inside the 1529..1593 strip.

	   MEASURE PINS AT 390x844. That is the iPhone 12 Pro she reviewed on. At 600 the
	   same section measured 1410 and the pin fell outside it entirely, which is what
	   caught the error. The `mobile` preset is 375x812 and is close enough for
	   layout but NOT for pin arithmetic. */
	.l-section.testimonials-split-section {
		padding-bottom: 0;
	}

	/* Same shape at the other end of the page: the framework band opens flush.

	   TWO threads, one component, two pages, both iPhone:
	     `pmvbkDmrmS0xVRkGjei2`  1-1 Coaching  "ukinuti belinu, da se spoje zuta i plava sekcija"
	     `EAeaqFTisTK2FGjkSj4N`  Mastermind    "ukinuti ovu belinu"
	   Both pins sit at the TOP of section 5 — y=29.8 and y=28.1 — inside the 64px
	   top padding, not at the bottom like the testimonials pair.

	   The band itself is transparent, so its padding shows as page white. Below 600
	   the framework intro panel goes full-bleed Blue Medium, and the section above is
	   yellow on both pages (`oo-journey-copy-section` / `mm-journey-copy-section`),
	   so 64px of white sat between two full-width colour fields. MEASURED at 390 on
	   both: previous section #F2F1DF, panel #B7D6F4 starting at y=64.

	   TOP ONLY. At 390 the panel is the section's only full-bleed block — it ends at
	   413 on 1-1 and 493 on Mastermind, and everything below it is content on white,
	   so the bottom padding separates white from white and is doing no harm.

	   ≤600 for the same reason as the testimonials rule: at 700 the panel is inset
	   40..660 inside a 96px-padded band, where joining it upward would leave white
	   down both sides and read as a mistake rather than as a join. */
	.l-body .l-section.framework-section {
		padding-top: 0;
	}

	/* The author's role under the name. Her "ovde možda treba manji line height" —
	   on a phone it wraps to two lines and at 1.5 they drifted apart under a name
	   set much tighter.

	   `!important` is the Grid Builder's, not a choice: both layouts emit
	   `.layout_506 .usg_post_custom_field_2 { line-height: 1.5 !important }` and
	   `.layout_311 …` the same, so nothing without it lands — measured, a (0,2,0)
	   rule left the value untouched. Written against `.us_testimonial_role` rather
	   than the two generated `usg_` classes, which change if the layout is edited.

	   1.4 — his number. Measured: 21.6 / 25 → 20.2 / 21. */
	.l-body .w-post-elm.us_testimonial_role {
		line-height: 1.4 !important;
	}

	/* Impreza sizes a large separator `calc(1rem + 5vw)` below 1024, which on a
	   390 phone is 36px of nothing — and there are seven of them on Mastermind
	   alone. Halved on his call: `calc(0.5rem + 2.5vw)`, measured 18px.

	   `:empty` is Impreza's own qualifier, kept so this only touches the spacer
	   form of the element and never one that draws a rule. */
	.w-separator.size_large:empty {
		height: calc(0.5rem + 2.5vw);
	}

	/* ---- The two `size_medium` separators, given stated heights ----

	   His call, 2026-09-10: rather than keep waiting on the ladder, set a custom
	   value per device for the instances that are actually flagged.

	   That is two rules, not twelve. COUNTED from the page content rather than by
	   eye: Mastermind carries twelve separators — two medium, six large, four small
	   — and 1-on-1 five. But only TWO component positions use the default medium,
	   and each of those two recurs on both pages, so both threads are covered by a
	   pair of rules and the other ten are untouched.

	   `size_medium` renders 26 at 390. The ladder is inverted here — small/medium/
	   large measure 24/48/72 at 1440 but 16/26/18 at this width, because halving
	   `size_large` pushed it under `medium` — so 26 is not a step on anything and
	   there is no token to reach for. Stated values, then, and the reasoning is in
	   the numbers below rather than in the name.

	   1. THE MASTERMIND HERO — `oimWNHv71AMTY71pPzzv`, iPhone, "malo manji razmak".
	      MEASURED at 390, the heading-to-lede gap is 84 and it is a SUM: 28.8 from
	      the vwrapper's own `inner_items_gap` of 1.8rem, then the 26 separator, then
	      28.8 again. Two thirds of it is the wrapper doing its job twice; only the
	      middle third is ours to move. 12px takes the gap to 70 — "malo manji" at
	      -17%, and it keeps the separator visible as a deliberate break rather than
	      deleting it, which zeroing would do.

	      Scoped to `.hero-copy-vwrapper`, which is Mastermind's class. 1-on-1's hero
	      measures the same 84 but its open thread there (`abDcV20O`) asks for MORE
	      space somewhere in that stack, so it stays out until that one is settled.

	   2. THE TESTIMONIALS HEAD — `np04iSvafM2KOUBfy6ai`, iPhone, "ovaj razmak od
	      buttona do sive sekcije treba da bude veci". MEASURED at 390: the button
	      ends at 283 and the first card starts at 309, and the whole 26 between them
	      IS this separator — the head vwrapper's last child, nothing else in the
	      gap. 2.5rem takes it to 40.

	      The other half of her note, the card's own inset, is handled on the card in
	      the ≤600 block below. */
	.hero-copy-vwrapper > .w-separator.size_medium:empty {
		height: 12px;
	}

	.testimonials-head-column .w-vwrapper > .w-separator.size_medium:empty {
		height: 2.5rem;
	}

	/* ---- Two `size_large` separators back to full height ----

	   The halving above stands everywhere; these two blocks buy their air back,
	   the same trade already made for `mm-events-copy-section`. `calc(1rem + 5vw)`
	   is Impreza's own un-halved `size_large` — 35.5 at 390 against the 18 the
	   halved figure gives — so the number is restored rather than invented.

	   `wsp2HfnHezbu1nKLEvQ0`, iPhone, "veci razmak", on `mm-journey-copy-section`.
	   MEASURED at 390: narrative ends 494, separator 494..512, testimonial starts
	   512. Eighteen pixels between a 494px wall of text and a quote card. This is
	   the sibling of the two events joins she flagged in the earlier round — the
	   note on that rule says this one had been left alone, and now it has not.

	   `I6Bp44R9JmAK7zaN6lHu`, iPhone, on `mm-bonuses-section`: "smanjiti malkice
	   ovaj razmak a povecati ispod teksta 'extra support..'" — two gaps in one
	   comment, and they were the wrong way round. MEASURED: eyebrow to heading
	   **25.6**, heading to the first badge row **18**. A head block with more air
	   above its heading than below it reads upside down.

	   The one below takes the same restored `size_large`, 35.5. The one above goes
	   to 18 by the 0.75 ratio — Figma puts 24 under an eyebrow against a 32px
	   heading in two independent frames, so it is a system figure, and 0.75 of this
	   tier's 24px heading is 18. Same rule shape as `.framework-intro-column`.

	   Written on the separators themselves rather than as margins on their
	   neighbours, which is his call from today: a stated height per device beats a
	   sum, and the events rule's margin idiom exists only because it needed both
	   sides of one element. */
	.mm-journey-copy-section .w-separator.size_large:empty,
	.mm-bonuses-section .w-separator.size_large:empty {
		height: calc(1rem + 5vw);
	}

	.mm-bonuses-section .w-vwrapper > :not(:last-child) {
		margin-bottom: 18px;
	}

	/* The one place that halving costs too much — Ruttl `N5M8FyATpex6cysXDgdE`
	   ("malo veci razmak") and `PGP53ZwHo9uFEDSYfy94` ("povecati razmak da se
	   odvoji tekst od testimonials sekcije"), both iPhone, both in
	   `mm-events-copy-section`.

	   Counted before assuming: there are SEVEN of these separators on Mastermind
	   at 390 and every one renders 18. She flagged exactly two, and they are the
	   two that sandwich the testimonial grid — the join above it and the join
	   below. The third separator in that same section (text -> photo row) she left
	   alone, and so is the one in `mm-journey-copy-section`. So the component is
	   not too tight in general; one BLOCK is glued on both sides, which is what
	   her second comment says in as many words.

	   So the fix goes on the testimonial, not on the separator: his halving stands
	   everywhere, and this block buys its air back. `calc(0.5rem + 2.5vw)` is the
	   halved figure restated, so each join adds up to `calc(1rem + 5vw)` — exactly
	   Impreza's own `size_large`, the value the rest of the page trades away.
	   Measured at 390: 18 becomes 36 on each side.

	   Scoped to this section because it is where both threads are, and to the
	   phone because both are iPhone — at 820 the separator is already 57. */
	.mm-events-copy-section .w-grid.us_post_list {
		margin-block: calc(0.5rem + 2.5vw);
	}

	/* Her "smanjiti razmak ovde da bude isti kao kod sekcije iznad (od buttona do
	   kraja žute sekcije)" on We Offer. The reference she names is the cream band
	   above: 64px from its button down to where the section ends.

	   The comparable measure is the CARD's bottom edge, not the button's. In the
	   cream band the button sits straight on the section's ground, so what the eye
	   reads is button → edge. In We Offer the button sits inside a navy card whose
	   own bottom inset is 40px, so button → edge was 141 while the space anyone
	   actually sees below the block was 96.

	   Done on the TOKEN rather than on that one section — his call: 6rem is a
	   desktop step and a phone wants it everywhere, not just where she happened to
	   look. `--section-pad-huge` already resolves to large below 1024, so both top
	   steps come down together. Measured: We Offer 64/64 and its card ends 64 above
	   the section edge, exactly like the cream band. */
	:root {
		--section-pad-large: 4rem;
	}

	/* Her "povećati razmak između teksta i buttona" in the hero — and today's
	   tablet work had quietly made it worse, not better. The ≤1279 rule that stacks
	   this wrapper restates the gap as `margin-bottom: 1.5rem`, which on a phone
	   REPLACED the 2rem `stack_on_mobiles` was already giving it: measured 24px
	   where she had been looking at 32.

	   2.5rem here, so the phone ends up with more than either — 40px, measured.
	   Hero only; the split band's identical wrapper keeps the 1.5rem step. */
	.hero-copy-column .w-hwrapper.inline-cta-hwrapper > :not(:last-child) {
		margin-bottom: 2.5rem;
	}

	/* ---- Photo strip: the arrows go under the pictures ----

	   Her "da li da stavljamo drugačiju navigaciju na mobu, 'swipe' ispod slika?",
	   his call to do it. On desktop the rail holds the quote with the arrows pinned
	   to its bottom (`space-between`); stacked, that put them between the quote and
	   the pictures they drive.

	   The arrows live inside the copy column, so they cannot be reordered against
	   the strip — different flex containers. `display: contents` on the copy column
	   and the two wrappers Impreza puts inside it dissolves those boxes, and then
	   the quote, the strip and the arrows are siblings of one flex column and
	   `order` decides. Nothing in that chain paints or pads at this width, which is
	   what makes `contents` safe here.

	   The three `display: contents` rules have to out-specify Impreza's own
	   `.g-cols.via_flex > div` (0,3,1) and `.g-cols.via_flex.type_default > div >
	   .vc_column-inner` (0,4,1) — measured, a plain child selector left the column
	   a flex item and the arrows stayed put.

	   Dissolving the vwrapper also drops its 2.5rem gap, so the arrows get their own
	   margin back. Measured: quote 8545..8629, strip 8669..8889, arrows 8913..8957. */
	.l-body .g-cols.via_flex.type_default.mm-events-strip-row > div.photo-strip-copy-column,
	.l-body .g-cols.via_flex.type_default.mm-events-strip-row > div.photo-strip-copy-column > .vc_column-inner,
	.l-body .g-cols.via_flex.type_default.mm-events-strip-row > div.photo-strip-copy-column > .vc_column-inner > .wpb_wrapper,
	.w-vwrapper.photo-strip-copy {
		display: contents;
	}

	.mm-events-strip-row {
		flex-direction: column;
	}

	.photo-strip-copy > .w-text {
		order: 1;
	}

	.mm-events-strip-row > .photo-strip-strip-column {
		order: 2;
	}

	.ab-photo-strip-nav {
		order: 3;
		margin-top: 1.5rem;
	}

	/* And the strip stops at the text edge instead of running off the screen. His
	   call: on a phone the right side should not touch the edge. The ≤1279 rule
	   cancels a 40px indent, which is the tablet and laptop figure — at 600 and
	   down the indent is 24, so that -40 overshot and the strip ended on 406 in a
	   390 viewport. Zeroed rather than re-numbered: with the arrows now under the
	   pictures there is nothing left that needs to bleed. */
	.w-hwrapper.ab-photo-strip.col-bleed-r-full {
		margin-right: 0;
	}

	/* Dissolving the column also dissolved the 15px the column-inner was holding
	   against the row's own negative gutter, so the quote and the arrows sat on
	   9 while everything else in the section starts on 24 — his note, the copy was
	   pulled too far left. Half a gutter puts them back on the text edge: measured,
	   the quote runs 24..350 and the first arrow starts on 24, against a strip that
	   starts on 24. The strip keeps its own column, which is why it never moved. */
	.photo-strip-copy > .w-text,
	.ab-photo-strip-nav {
		padding-inline: calc(var(--grid-gutter) / 2);
	}

	/* ---- Three of her Mastermind notes ----

	   1. "cena može da bude ispod početnog teksta" — the Member Bonuses rows are
	      `alignment="justify"`, label left and value right. That needs the design's
	      width; at 390 the label was 207px over three lines with "$2,000 value"
	      squeezed into 55px beside it. Stacked, the label gets 262 and the value
	      sits under it on one line. The children need `display: block` too — the
	      wrapper alone left them side by side, measured.

	   2. "ove sekcije sa brojevima treba da budu kompaktnije" — the step number is
	      set at 80px for the desktop composition, and `stack_on_mobiles` turns the
	      hwrapper's 4rem into 64px of air under it. 48px and 1rem, with the copy
	      stack tightened from 1.2rem to 0.8rem. A step block goes 304 → 279 tall
	      and reads as one unit instead of three.

	   3. "isto možemo manji font" on the testimonial quote — it was running at
	      Heading XS, 18/27.9. Body size and the quote's own 1.625: 112 → 104 tall.
	      The `p` has to be named; the Grid Builder's generated class on the
	      wrapper out-specifies a rule written at the wrapper. */
	.badge-row,
	.badge-row > * {
		display: block;
	}

	.badge-row > :not(:last-child) {
		margin-bottom: 0.4rem;
	}

	/* Stacked, the bar also has to stop being a fixed-height bar. `min-height: 86px`
	   and `padding: 0 …` are the design's single-line strip; with the value under
	   the label the two lines filled all 86px and sat against the top and bottom
	   edges of the dark panel — his note, too tight. Height goes back to the
	   content and the panel gets a real inset: measured 118 tall with 20px above
	   and below. `.w-hwrapper` is in the selector because the base rule carries it
	   and a bare `.badge-row` loses. */
	.w-hwrapper.badge-row {
		min-height: 0;
		padding-block: 1.25rem;
	}

	.step-item {
		--hwrapper-gap: 1rem;
	}

	.step-item > .w-text:first-child {
		font-size: 48px;
	}

	.step-item .w-vwrapper {
		--vwrapper-gap: 0.8rem;
	}

	.testimonials-split-section .w-grid-item-h .post_content p {
		font-size: var(--font-size);
		line-height: 1.625;
	}

	/* Her "da li ikako možemo da povećamo visinu slike, pa i da im malo 'sečemo'
	   ruke sa strane ako treba" on the full-width photo bands. Measured at 390 they
	   were 390x182 — a 2.15:1 letterbox strip, because the band simply keeps the
	   source's own ratio at any width.

	   3/2 takes them to 390x260. `object-fit: cover` is already on them, so the
	   extra height comes out of the SIDES: at 260 tall the 1920x893 source scales
	   to 559 wide and loses ~85px off each edge — the arms she said we could cut.
	   The crop stays centred; these are group shots with nobody at an edge.

	   NEVER APPLIED UNTIL 2026-09-10, and the base rule's own comment says why in
	   the wrong direction: it claims this override "wins by source order". It does
	   not. The base rule is `.w-image.image-band img` at (0,2,1) and this one was
	   written `.image-band img` at (0,1,1) — specificity is read before order, so
	   the letterbox stood the whole time. MEASURED at 390 before the fix: the band
	   still computed `aspect-ratio: 1440 / 670` and rendered 375x174, exactly the
	   strip she flagged. Matched to (0,2,1) and it lands.

	   Found only because the same thread came round again in a cross-page sweep —
	   worth remembering that a rule sitting in the file with a confident comment is
	   not evidence that it is doing anything. */
	.w-image.image-band img {
		height: auto;
		aspect-ratio: 3 / 2;
	}

	/* Her "smanjiti line height kod ovog fonta, možda povećati padinge?" on the
	   Mastermind hero eyebrow. The label wraps to two lines at 390, and at Impreza's
	   1.692 the two lines drifted apart inside a pill whose own inset is 2px — the
	   type looked loose and the chrome tight, which is what she was reading.

	   1.3 pulls the pair together and the 8px block inset gives the pill something
	   to hold: measured, the pill stays the same height (51 → 52) while the line
	   gap closes from 23.7 to 18.2. Phone only — one line above 600 and the design's
	   2px inset is right there.

	   Her second comment on the same element was "manji font size". It goes on
	   the component, not on one instance — the same pill runs 5x on Mastermind,
	   3x on 1:1, 4x on About. 14px is the desktop value and it is coarse on a
	   phone: the hero pill "For Therapy Group Practice Owners" fills the whole
	   column (327 of 327) and breaks to two lines. 13px fits at 322, but 5px of
	   slack means the first copy edit puts it back on two lines. 12px measures
	   301 and a 32px pill, and the two-line hero pill becomes one line.

	   THE SIZE HAS MOVED OUT of this rule (2026-09-10). It now comes from
	   `.eyebrow` in the 1024 block, as `--fs-2xs` — the same 12px, reached from
	   the ladder and applied to every eyebrow rather than only to pills. See the
	   long note there; the short version is that a non-pill eyebrow on this same
	   phone tier was still rendering 13. What stays here is the part that really
	   is phone-only: the tighter leading and the block inset that a WRAPPED pill
	   needs, which a one-line pill above 600 does not. */
	.w-text.eyebrow-pill {
		padding-block: 8px;
		line-height: 1.3;
	}

	/* Her "manji fs i lh" on the 1:1 lede ("No rigid structure. No long-term
	   commitment…"). The lede wears `h5-style`, and on a phone that clamp bottoms
	   out at 18px/27.9 — while the body copy on the same page measures 17px/26.
	   One pixel apart: the lede does not read as a tier above the prose, it reads
	   as prose that happens to sit a little looser, which is what she was seeing.

	   16px/1.5 puts it in body territory on purpose and lets the 500 weight carry
	   the distinction instead of size. Measured on the flagged block: 84 -> 72,
	   still three lines. Ten instances share this — Home 2, MM 2, 1:1 2, About 2,
	   FAQ 1 — so it goes on the component. The Home hero's plain `.lede` (no
	   `h5-style`, 16px/30, weight 400) is a different thing and is left alone. */
	.l-body .h5-style.lede,
	.l-body .h5-style.lede p {
		font-size: 16px;
		line-height: 1.5;
	}

	/* Her "ovde ravnati tekst ulevo" on the video trigger inside the text
	   testimonial card. The label wraps to two lines on a phone — measured 188x47
	   at 390 — and its second line was centred under the first.

	   It has to go on `.w-btn-label`, not on the button: the button is
	   `inline-flex` and the label is a flex ITEM sized to its longest line, so
	   `text-align` on the button reaches nothing. Measured, the label box did not
	   move; only the rule below actually turns the ragged edge to the left. */
	.testimonial-column-text .w-popup-trigger .w-btn-label {
		text-align: left;
	}

	/* The pill's own type, his call 2026-09-14: 0.75rem (12px) against the 14 it
	   inherits. On a phone the longest label — "Listen to What Abraham Has to
	   Say" — ran 291px wide in a 327px card, so the lozenge was all but the full
	   width of the poster it sits on.

	   Nothing in the site's CSS sets a font-size on this button (measured: no
	   matching rule, no inline style — the 14 is inherited), so a plain 0-2-0
	   selector is enough and no `!important` is needed. The icon keeps its own
	   34px from the `.w-btn.video-pill-btn i` rule and does not scale with this. */
	.w-btn.video-pill-btn {
		font-size: 0.75rem;
	}

	/* Two of her notes land on the same place in the video testimonial card —
	   "povećati malo ovaj da ne bude tekst zalepljen za video" and "izravnati ovaj
	   padding sa ovima sa strane". They agree: measured at 390 the quote started
	   11px under the video while the card's own side inset is 25.6px, so the text
	   read as stuck to the picture.

	   The 11px is the Grid Builder's vwrapper gap (0.7rem), and layout 311 is
	   read-only over MCP. Overriding the VIDEO's bottom margin rather than the
	   wrapper's gap keeps the author row's own spacing where the design put it —
	   the gap would have widened that too. Lands on 26px against a 25.6 inset. */
	.testimonial-column-video .w-grid-item-h .w-video {
		margin-bottom: 1.6rem;
	}

	/* Her "razmak kao sa strana" on the Self Assessment and 1-on-1 heroes: the
	   band's vertical air should match its side inset. Measured at 390 it was
	   40px top and bottom against 24 a side. Squared off at 24.

	   `:not(.home-hero-section)` because the home hero is the one place she asked
	   for the opposite — "veći razmak" — so it keeps its own step until that one
	   is settled.

	   SPLIT 2026-09-10 — `5YKePBCv5puOcmLCu8nG` (Mastermind, iPhone, pinned at
	   y=1000 of a 990-tall section, i.e. exactly on the boundary): "veci razmak od
	   buttona do zute sekcije". The same "veći razmak" she had already asked for on
	   Home, now on a second page, which says the squaring went one edge too far.

	   The squaring argument holds for the TOP — that is an inset, and matching the
	   24px side inset is what makes the band read as a band. It does not hold for
	   the BOTTOM, which is not an inset at all but the boundary to the next
	   section, and every other section boundary on the phone measures 64.

	   Figma agrees, at the only width it draws: the CTA `1692:2197` ends at 674
	   while the hero band `1692:2057` runs to 774, so a hundred pixels of the
	   hero's own ground sit under the button before the colour changes to the
	   yellow `1692:2198` at 773. Stacked, that hundred had become 24.

	   HOME JOINS THE TOP HALF, 2026-09-10 — `edoqIq2h5BVdds8SzMGj` (iPhone, pinned
	   at y=69 on the hero's own `.l-section-h`): "ovde padding izjednaciti sa ovim
	   sa strane". That is the identical squaring request, now on the one page the
	   `:not()` was holding out, so the exclusion survives on the BOTTOM only —
	   where the home hero keeps its 40 into the cream band below.

	   THE 90px ON `.l-section-h` IS NOT PADDING — DO NOT TOUCH IT. It looks like a
	   second inset and it is not. Impreza gives the FIRST section under a fixed
	   header `padding-top: var(--header-height)` on its `.l-section-h`, through
	   `.header_hor .l-header.pos_fixed ~ .l-main > .l-section:first-child >
	   .l-section-h`, and this header IS fixed — MEASURED at 390: `position: fixed`,
	   90px tall, `--header-height` 90px, and the section's own box starting at the
	   very top of the document underneath it. That 90 is the only thing keeping the
	   hero out from under the menu. Zero it and the photo slides behind the header.

	   The white she is pointing at is the 40 BELOW it, which is the section's own
	   padding and the only part that is ours to move. Written down because I nearly
	   shipped the zeroing: the tell was measuring the gap from the SECTION's top
	   rather than from the header's bottom edge — 114 on 1-on-1 reads as a failure
	   until you subtract the 90 the header is standing in, and what is left is the
	   24 this rule was already delivering correctly.

	   ORDERING, and it bit once already. `padding-block: 2.5rem` further down this
	   block used to name the hero too, and a shorthand at equal specificity in a
	   LATER rule takes the top back: the first attempt at this fix left Home at 40
	   and quietly cost the two pages that already had their 24. The hero is out of
	   that rule now and takes only a bottom there, so nothing downstream sets a top
	   for it and this plain (0,3,0) selector is enough. The bottom below stays at
	   (0,4,0) — `:not()` carries its argument's specificity — which is what lets it
	   beat that same downstream rule without depending on order at all. */
	.l-body .l-section.hero-section {
		padding-top: 1.5rem;
	}

	.l-body .l-section.hero-section:not(.home-hero-section) {
		padding-bottom: var(--section-pad-medium);
	}

	/* The About Us pull quote — `0Vndwpp79blt4eHT89lU`, iPhone, "mozda manji fs",
	   pinned mid-heading at y=70 of a 129-tall block.

	   Found by auditing every text element on the page at both widths rather than
	   by eye, because "manji fs" on a phone is usually an illusion: body copy does
	   not scale, so EVERY heading is relatively larger there and the whole page
	   looks top-heavy. The audit is what separates the illusion from the fault —
	   font-size as a share of its own column, phone against desktop:

	     eyebrow 1.69x · hero H1 1.38x · hero lede 1.65x · body copy 1.75-1.84x
	     Our Approach H2 1.15x · handwriting 1.37x
	     THE QUOTE BAND 2.75x

	   One outlier, and the cause is structural. This is the only place on the page
	   where `h3-style` sits in a FULL-WIDTH column: 1310 at 1440, where it renders
	   953 wide over two lines at 32px. Stacked, that column becomes 357 like every
	   other one — a quarter of its width — while the type only falls 32 → 24. So a
	   two-line statement becomes FOUR lines at 27 characters a line, which is a
	   cramped measure for display type at any size.

	   One rung down the ladder Theme Options already owns, not a literal: 21px at
	   this width. `--h4-font-size` by name, the same move as `.programs-video-text`.
	   Ratio to measure falls 7.3% → 6.4%, which is where the other h3-style
	   headings on this page already sit. */
	.quote-band-section .w-text {
		font-size: var(--h4-font-size);
	}

	/* Her "bulleti su nešto preveliki, manji font size teksta?" on the Self
	   Assessment points. The block carries `h5-style`, so the list came out at
	   Heading XS — 18px on a phone — and the marker scales with it. Body size for
	   the list only; the heading above it keeps its own step. Measured: the block
	   drops from 345 to 282 tall and each item from 56 to 50. */
	.assessment-points-column ul {
		font-size: var(--font-size);
	}

	/* ---- Panels to the screen edge ----

	   Her call (ruttl, 2026-08-28, iPhone 12 Pro): "plavu površinu od ivice do
	   ivice, kao na dizajnu, nema potrebe za belim okvirom", and the same for the
	   yellow pricing half and the testimonials pair. On a 390 phone every one of
	   these sections was 24..366 with a 24px white strip either side of a solid
	   panel — the panel reads as a floating card instead of a band.

	   The indent is `padding: 96px 24px` on `.l-section` ITSELF, not on
	   `.l-section-h` — that inner box only carries the 1280 max-width. Zeroing the
	   inline half of it is the whole fix; the block half stays. First attempt put
	   it on `.l-section-h` and moved nothing, measured.

	   These three rows are not `width="full"` in the builder and must not become
	   it: above the phone the indent is right. Named rather than blanket for the
	   same reason.

	   Each panel already carries its own inset, so the copy does not follow the
	   ground out — measured after: blue panel 0..390 with its eyebrow at 24,
	   pricing halves 0..390 with the price slab at 24..366, testimonial cards
	   0..390 with their copy at 26. */
	.l-body .l-section.framework-section,
	.l-body .l-section.mm-pricing-section,
	.l-body .l-section.testimonials-split-section {
		padding-inline: 0;
	}

	/* The one column in those three with no ground of its own — the framework
	   steps. Without this its numbers and copy sit on the screen edge (measured
	   0..390). Compounded to (0,5,2) to clear Impreza's own
	   `.g-cols.via_flex.type_default > div > .vc_column-inner` at (0,4,1); the
	   plain descendant form does not apply at all. */
	.g-cols.via_flex.type_default.framework-inner-row > div.framework-steps-column > .vc_column-inner {
		padding-inline: 1.5rem;
	}

	/* Same case in the testimonials pair: the head column's cards carry their own
	   ground and belong on the edge, but the heading and the "Read More" button
	   above them do not — measured after the section lost its indent, they ran
	   0..390. The inset goes on that vwrapper alone, so the card below it stays
	   full width. Heading lands back on 24..366. */
	.testimonials-head-column > .vc_column-inner > .wpb_wrapper > .w-vwrapper {
		padding-inline: 1.5rem;
	}

	/* Her "ukinuti ovaj gap" on the home programs band. The row is `cols-flush` and
	   the two halves are meant to butt — side by side they do, stacked they picked
	   up Impreza's 1.5rem between stacked columns and the cream strip floated off
	   the video. Measured: 24px, now 0.

	   Named, not written on `cols-flush` itself. That utility is the inline axis;
	   the approach band one section up is also `cols-flush` and there she asked for
	   MORE air between the photo and the copy, not less. A blanket rule took that
	   gap out once already today and had to be reverted. */
	.l-body .g-cols.via_flex.type_default.home-programs-inner-row > .wpb_column {
		margin-block: 0;
	}

	/* ---- The Menu slab, phone only ----

	   Design: the old mobile frame (781:553 closed, 824:580 open) puts a 109x90
	   block flush in the top-right corner with a word in it instead of a burger,
	   on the same ground and face the desktop header CTA uses — Button Style 5,
	   Deep Blue ground, Blue Medium ink, Geist 13/600 — and its hover swap is
	   exactly the open state the design draws.

	   This is the phone's answer to a header with no CTA button in it: the mobiles
	   state keeps `btn:1` in Hidden Elements, so without the slab the row would
	   have no coloured block at all. From 601 up the designer's own solution takes
	   over and the control goes plain.

	   The ground goes on the NAV ELEMENT, not on the `<a>` and not on the cell:
	   us-style pins the control to `line-height: 50px; max-height: 50px`, so the
	   control can never be the block itself, and the cell would paint the empty
	   space beside it too. `align-self: stretch` fills whatever height the state
	   sets, and `min-width` holds the design's 109 rather than the 95 the label
	   alone gives. */
	.l-header .l-subheader-cell.at_right > .w-nav {
		display: flex;
		align-self: stretch;
		align-items: center;
		justify-content: center;
		min-width: 109px;
		padding-inline: 2.25rem;
		border-left: 1px solid var(--color-alt-content-primary);
		background: var(--color-content-primary);
		color: var(--color-content-secondary);
	}

	.l-header .l-subheader-cell.at_right > .w-nav:has(.w-nav-control.active) {
		background: var(--color-content-secondary);
		color: var(--color-content-primary);
	}

	/* `:hover` and `:focus` are listed for a reason — her ruttl note, "'meni'
	   nestaje na hover, staviti bela slova". The control is an `<a>`, so the site's
	   link hover colour lands on it, and against this ground that colour is the
	   ground. Pinned to the block's own ink in every state instead. */
	.l-header .l-subheader-cell.at_right .w-nav-control,
	.l-header .l-subheader-cell.at_right .w-nav-control:hover,
	.l-header .l-subheader-cell.at_right .w-nav-control:focus {
		color: inherit;
	}

	.l-header .w-nav-control .w-nav-icon {
		display: none;
	}

	/* The label sat 7px right of the block's centre — measured 43.7px of ground on
	   its left against 29.9px on its right. Impreza pulls the control out by
	   `margin-inline-end: -0.8rem` to cancel the hamburger glyph's optical
	   padding; with the glyph hidden that pull has nothing to cancel, and
	   `justify-content: center` centres the control's BOX, negative margin
	   included, so half of it (6.4px) shows as the asymmetry. Zeroing it leaves
	   37.3 / 36.3, the last 1px being the block's own left hairline.

	   It has to be the logical property, and it has to out-specify
	   `body.header_hor .l-subheader-cell.at_right .w-nav:last-child
	   .w-nav-control` (0-6-1): a plain `margin-right` at lower weight is simply
	   never applied, which is what the first attempt did. */
	body.header_hor .l-header .l-subheader-cell.at_right .w-nav:last-child .w-nav-control {
		margin-inline-end: 0;
	}

	.l-header .l-subheader-cell.at_right > .w-nav:last-child {
		margin-right: -1rem !important;
	}


	/* Both bands are height="auto" on purpose — on desktop the photo column sets
	   the band height and the copy sits beside it. Stacked, nothing sets it, so
	   the copy runs straight into the next section: the yellow band's closing
	   line was touching the navy edge below it. `height` has no per-breakpoint
	   value in the builder, so this is the one section padding that cannot live
	   there.

	   The hero used to be in this rule and is not any more — see the squaring block
	   further up, which sets its top to 1.5rem. A `padding-block` shorthand here
	   would take that top back on source order at equal specificity, so the hero
	   states only the bottom half of what it wanted from this rule. */
	.l-body .l-section.split-media-section {
		padding-block: 2.5rem;
	}

	.l-body .l-section.hero-section {
		padding-bottom: 2.5rem;
	}

	/* …but not above the photo. Part two of the split-media bleed below — see the
	   ≤767 block for the reasoning and the thread ids.

	   ONLY the top. The 2.5rem above exists because stacked bands have nothing to
	   set their height and the copy was running into the next section — that is the
	   BOTTOM edge, and it stays. The media column is first visually in every one of
	   these bands (verified on About Us ×2 and FAQ at 390), so zeroing the top puts
	   the photo on the section's own edge and takes nothing away from the copy. */
	.l-body .l-section.split-media-section {
		padding-top: 0;
	}

	/* Home section 3, the navy offer band, where it meets the cream band above it —
	   Ruttl 2026-08-27, iPhone, two threads forty seconds apart and both pinned at
	   y=63, i.e. on the section's own top inset: `T551IoQvjBpz626HuRIc` on the
	   section ("smanjiti razmak ovde da bude isto kao kod sekcije iznad, od buttona
	   do kraja zute sekcije") and `tf9qaIrStIMASOCLhCq2` one level deeper on the
	   wrapper ("smanjiti razmak ovde"). One complaint, one fix.

	   Her reference is explicit and measurable, which is what makes this safe to
	   act on even though her review predates the last two weeks of edits — it is
	   RELATIVE. MEASURED at 390: the two bands touch, edge to edge, at y=2435. The
	   cream band's last painted element is its button and it sits 40px off the
	   bottom edge; the navy band's first heading sits 64px off the top edge. So one
	   side of the junction is 40 and the other 64.

	   2.5rem, not a token, because 40 is not a step on the section ladder here —
	   `--section-pad-medium` and `--section-pad-large` are BOTH 64 at this width.
	   It is the literal same 2.5rem the rule directly above gives the cream band,
	   which is the whole point: the two insets are meant to be the same number
	   because they are the two halves of one junction.

	   The BOTTOM stays 64. She flagged only the top, and the bottom edge meets the
	   testimonials band, which brings its own 64 — a different junction that
	   nobody has queried.

	   Independent of the tablet rule for this section in the 768–1024 block above,
	   which takes both insets 96 → 64 for a different thread. His instruction,
	   2026-09-09: the two widths do not depend on each other this round. */
	.l-body .l-section.home-offer-section {
		padding-top: 2.5rem;
	}

	/* The overlay copy is the full width of the phone here, not a 72% inset of a
	   half-width column. */
	.l-body .approach-overlay-text {
		max-width: none;
		padding: 8% 6%;
	}

	/* The scrim stays exactly as it is on desktop — his call, 2026-08-27, after
	   seeing both. On the record, since the measurement exists: this photograph is
	   bright edge to edge (max luminance 0.84–0.91 in EVERY row under the copy),
	   so with the desktop gradient the white copy's worst point is 1.62:1, and
	   grey cannot be pushed into range — even at 60% it only reaches 1.94:1,
	   because #5F606E is barely darker than the picture. If it is ever revisited,
	   navy at 0.55 behind the text box alone measured 3.60:1 worst / 4.56:1
	   average, over the 3:1 WCAG AA asks of text this size, and a taller 4/5 crop
	   drops the copy's share of the photo from 44% to 35%.

	   What DOES change on a phone is only the geometry: the copy is the full width
	   of the picture here, not a 72% inset of a half-width column. */

	/* The card inset is a ratio of the design's 544px card. On a 392px column
	   that is 42px a side and the quote gets a very narrow measure, so the phone
	   takes a flat inset — the same 1.5rem on all four sides, matching the tablet
	   tier's horizontal figure. The asymmetry the first pass had (1rem top, 2rem
	   bottom) was carrying the author block's own top gap; that gap now comes off
	   the vwrapper below instead of the card. His call, 2026-08-28.

	   1.5rem → 2rem, 2026-09-10, and it reverses part of that call — flagging it
	   because the PREMISE changed, not because the reasoning was wrong.

	   `np04iSvafM2KOUBfy6ai` (1-on-1, iPhone) asks for "od pocetka sive sekcije do
	   teksta testimonialsa" to be bigger, and the measurement agrees: the card's
	   inset is 58.4 of a 546px card at 1440 — 10.7% — and 40 of 363 at 820, 11.0%,
	   but only 24 of 327 at 390, which is **7.3%**. The phone is the one tier where
	   this inset is proportionally short, and 1.5rem was chosen there to protect the
	   measure from an 18px quote.

	   That quote is 16px as of today (see the testimonial-card block in the ≤1024
	   tier). The measure it needs is smaller, so the inset can have the room back:
	   2rem leaves 263px and ~33 characters a line, against 279 and ~35 before.
	   Two characters for three points of inset. */
	.testimonial-column .w-grid-item-h {
		padding: 2rem;
	}

	.l-section.main-testimonial-section .w-grid-item-h {
		padding: 2rem;
	}

	/* The avatar on the testimonial cards. 83px is the Figma size and it holds
	   from 601 up, but on a 390 phone it takes a quarter of the card's width and
	   squeezes the name and role beside it. 64 here, his call 2026-09-14 —
	   which is also the `4rem` the Grid Builder prints inline, so the phone
	   simply gives the builder its own number back.

	   Same 0-3-0 selector and same `!important` as the base rule on purpose: the
	   Grid Builder prints its own `width: 4rem !important` INLINE on both layouts
	   (311 and 506), so importance only ties and document order decides. This sits
	   later in the file than the base rule, which is what makes it win. */
	.w-grid.gps-testimonials-grid .post_image,
	.w-grid.gps-testimonials-grid-v2 .post_image {
		width: 64px !important;
	}

	/* The FAQ questions — `wHGrMdhpWExYZ18lX6jv`, iPhone, "da li da smanjimo ova fs
	   da staje vise u box".

	   Two things eat the line and both are measured. The TYPE barely moves between
	   widths — `--h5-font-size` is 20 at 1440 and 18 at 390, a 10% drop — while the
	   measure falls by a factor of three and a half. And the CHROME is a percentage
	   of a box that is no longer wide: `--space-sm` puts 23px a side here against
	   20 at 1440, so the phone's inset is 7.0% of the row where the desktop's is
	   2.4%. MEASURED at 390: row 327, minus 46 of padding, minus the title's 10.8
	   margin, minus the 32px control — a **236px measure** for an 18px question,
	   which is about 26 characters a line.

	   THE INSET IS NOT THE LEVER, though it looks like one. Widening it was the
	   first attempt and it was wrong twice over: the `≤767` rule further down sets
	   `calc(1.5rem - 1px)` on purpose — the `- 1px` is the header's own border, so
	   that the question, the answer panel and the toggle all land on 48 — and
	   pulling the header in would have broken that alignment to buy 14px.

	   So the type carries it alone, and it is enough. MEASURED at 390, before and
	   after, on the live page rather than predicted: line counts 2-4-2-2-2-1-3-2 →
	   2-THREE-2-2-2-1-3-2 and the stack 1002 → **899** tall. One question comes off
	   its fourth line and every row gets shorter from the tighter leading; the rest
	   were already as tight as their wording allows. The four-line question is
	   simply a long question.

	   Line-height with it: 1.55 is the ratio at both widths, and leading wants to
	   fall as the measure narrows, not hold. 1.45 at 16px is 23.2 against 27.9.

	   `!important` because the base rule uses it to get past Impreza's tab styles;
	   same selector, later in the file, so order settles it. */
	.l-body .faq-accordion .w-tabs-section-title {
		font-size: 1rem !important;
		line-height: 1.45 !important;
	}

	/* The CTA band's supporting line — `kootfNgYN2EDlBQ7WauC`, iPhone, "font size
	   i line height deluju preveliki".

	   Half of that is not actionable and worth writing down so it is not chased
	   again: the size is 16px at BOTH widths, which is the site's body token and
	   its floor. It cannot come down without moving the whole text scale, and it
	   only looks large here because body copy does not scale while everything
	   around it does.

	   The leading is a different matter and it is a real number. MEASURED: 30px on
	   16, a ratio of 1.875, identical at 1440 and at 390 — but the measure it was
	   set for is 819px and two lines, while the phone gives it 327 and FIVE. Leading
	   should fall as the measure narrows: a short line needs less of it to track,
	   and holding 1.875 across a 2.5x narrower column is the same constant-beside-
	   fluid shape as everything else in this round. 1.6 at 41 characters a line;
	   the block goes 150 → 128.

	   On the component, not the section: `.cta-band` is drawn on 1-on-1 and on
	   Mastermind, though only 1-on-1's carries a paragraph today.

	   NOT the global body line-height, which is where this fault actually lives —
	   every paragraph on the site holds 1.875 on a phone. That is a site-wide
	   typographic call and it is his; this rule is the one instance she flagged. */
	.cta-band .wpb_text_column p {
		line-height: 1.6;
	}


	/* 1616/609 is 2.65:1 — a 166px letterbox once it is only 440px wide.

	   3/2 WAS TOO FAR, 2026-09-10 — `KjK3TQl9ofEpikG49SZK`, iPhone: "bolje
	   pozicionirati sliku na mobu da se vide svi". Six people in this photograph and
	   the sixth was sliced down the middle by the right edge.

	   It is not a positioning problem, which is the trap in her wording. The crop
	   is anchored top-left ON PURPOSE — see the ≤1024 rule — because Ken is at the
	   far left and centring the window loses him. So the two ends compete: anchored
	   left, the right-hand man is cut; centred, Ken is. Neither is "svi", and no
	   `object-position` value fixes that. Only a SMALLER CROP does.

	   MEASURED against the served 1024x473 file: at 3/2 the source scales to 541
	   wide in a 375 window and 31% is discarded; at 16/9 it is 18%. That thirteen
	   points is exactly the man's width — verified by screenshot at both ratios,
	   not by arithmetic: at 16/9 he is whole and Ken still has his raised arm.

	   375x211 rather than 250, which is still well clear of the 147px letterbox
	   this rule exists to prevent. If she wants the group to fill a taller band, the
	   answer is a re-export cropped tight around them, not another ratio here. */
	.home-event-band-image img {
		aspect-ratio: 16 / 9;
		object-position: 50% 0;
	}

	/* The video band is bottom-anchored copy over a video, and on a phone the
	   copy stopped reading as an overlay: at 36px in a 434px band it stood 333px
	   tall — 77% of the picture — so it began just under the top edge and there
	   was no video left to sit on.

	   Both halves of that are fixed here. The band goes portrait (3/4 = 587px at
	   440), which is the natural shape for a video on a phone anyway, and the
	   line drops one step down the heading scale. `--h3-font-size` rather than a
	   literal: it is the same fluid clamp Theme Options owns, so the line still
	   tracks the type scale. Measured after: 238px of 587, 41% — the copy sits in
	   the bottom two fifths with the video clear above it. */
	.programs-video-column > .vc_column-inner {
		aspect-ratio: 3 / 4;
	}

	.programs-video-text {
		font-size: var(--h3-font-size);
	}

	/* Contact's opening paragraph carries the address as a live mailto link, and
	   an email address is one unbreakable token: at 28px it measured 401px against
	   345px of column, so it set the line box for the WHOLE paragraph and every
	   line ran 32px off the right edge. Two things fix it and both are wanted —
	   Heading S is a desktop size for a five-line paragraph on a phone anyway, and
	   `break-word` means no address anyone types later can push the page again.
	   At 24px the link lands at 343 of 345 on a 393 screen and wraps on a 375 one,
	   which is the right order: fit where it fits, break where it does not. */
	.contact-form-section .wpb_text_column.h3-style {
		font-size: var(--h4-font-size);
		overflow-wrap: break-word;
	}
}

/* The hero card stacks on the TABLET too, not only on the phone.

   Ruttl `MIWfwQY156SWYNEd0lkw`, Mastermind hero, iPad: "da se doda video
   screenshot iznad teksta sa ikonicom". The poster was added in the builder
   (2026-09-11 — the Mastermind hero card was the same markup as Home's minus the
   `us_popup`, same copy, same button, so it is now literally Home's card). What
   is left is the word ABOVE.

   Side by side at 820 the numbers are indefensible: the card is 317 wide, the
   poster takes a fixed 130 and the padding 48, which leaves the prose and the
   "Apply For Mastermind Program" link a 119px measure. Stacked, the copy gets the
   card's full 269. Measured after: card 317 x 239, copy 269 x 84 — two lines and
   the label on one — and the card still ends 56px inside the photo's bottom edge.

   This is the same shape as `Kkh4ujAnkuFLPvYrxnIS` on Home ("ova sekcija je cudna
   na tabletu … tako da moze vise teksta da stane"), which is why the rule is
   written on `.hero-media-column` rather than scoped to Mastermind: one component,
   two pages, one cause. Home's hero card gets it too.

   Everything here is the ≤767 block's rules a tier earlier, INCLUDING the margin
   flip. Impreza spaces an hwrapper with `margin-inline-end` alone, so stacking
   without touching it leaves the poster and the copy with a zero gap — that was
   `0a2viIAYEFxkMwsAWQTn` on the phone, and it would repeat here verbatim.

   NOT the band cards (`.media-band-section .media-card`). Their copy measures 190
   and their labels are two words; they were deliberately kept side by side, and
   nobody has flagged them. NOT the overlay either — the card stays positioned on
   the photo at this tier, which is what the ≤767 block separately undoes. */
@media (min-width: 768px) and (max-width: 1024px) {

	.hero-media-column .media-card {
		flex-direction: column;
		align-items: stretch;
	}

	.hero-media-column .media-card > :not(:last-child) {
		margin-inline-end: 0;
		margin-block-end: 1.25rem;
	}

	/* "Manje bele margine" — `Kkh4ujAnkuFLPvYrxnIS`, Home hero, iPad. The other
	   half of that thread ("vise teksta") was the stacking above; this is what was
	   left once the copy already had its 269.

	   24px is the component's figure everywhere, and it reads as a lot of white on
	   the HERO card specifically, which is 317 wide here against the band cards'
	   384. 16 leaves the frame legible and gives the copy 285. Measured: card
	   317 x 239 -> 317 x 223, padding 24 -> 16 on all four sides, and the card's
	   position in the photo is untouched (33 left, 38 right, 70 bottom) because it
	   is bottom-anchored by percentage.

	   The POSTER stays 130. Her comment also asks for a smaller screenshot, and
	   that request came from the side-by-side layout where the poster's fixed
	   width was eating the copy's measure — stacked, it costs the copy nothing.
	   His call, 2026-09-11, was to leave it: the play badge is 40px, so at a
	   104-wide poster it would cover close to half the thumbnail's height and stop
	   reading as a picture. */
	.l-body .hero-media-column .media-card {
		padding: 1rem;
	}
}

/* The Home hero's three questions carry their own leading on the tablet.

   Ruttl `486fasO8BdHZUNZx8BOW`, iPad: "ovaj font deluje da ima veliki line
   height". The earlier pass on this thread closed it as "matches Figma" and that
   is still true — `--h4-line-height` is 1.334 and the frame says 1.334. HIS CALL,
   2026-09-11, is to override it for the tablet anyway, behind a class of its own
   so the rest of the site's Heading S is untouched: `hero-question`, added to all
   three `us_text` elements in the builder.

   All three, not only the one she pinned: they are one stack of one size, and
   fixing the first alone would leave two questions at a different rhythm
   directly beneath it.

   The measure is what changed, not the type. At 1440 the column is 625 and a
   line holds about 30 characters; at 820 it is 348 and holds about 20. 1.334 was
   set for the long line. 1.2 is the house step for a heading on a short measure —
   measured at 820 the leading goes 30.57 -> 27.50 and the three blocks 92/61/61
   -> 83/55/55, with no change to how many lines anything breaks into.

   `.l-body` for weight, not for need: `.h4-style` in ab-base sets leading through
   the `font` SHORTHAND, and that file loads first, so a plain longhand would
   already win on source order. Stated at 0-2-0 anyway, because the shorthand is
   exactly the thing that has silently taken a longhand back twice in this file. */
@media (min-width: 768px) and (max-width: 1024px) {

	.l-body .hero-question {
		line-height: 1.2;
	}
}

/* The BAND cards stack on the tablet too — the same move, one tier of the same
   component further out.

   Ruttl `JTVRqVQa3Q2mOQCLZ4Jt`, Mastermind events band, iPad: "ova sekcija
   izgleda cudno, hajde prvo da imamo sc sa play ikonicom, pa tekst ispod".

   This overturns a decision recorded twice in this file — the band cards were
   deliberately kept side by side because "their copy measures 190 and their
   labels are two words". THAT FIGURE IS THE PHONE'S. At 820 the card is 384, the
   poster takes its fixed 130 and the padding 48, and the copy gets 166 — tighter
   than the phone it was compared against. The tablet is this card's worst case,
   which is the one width nobody had measured. Stacked: copy 336, the caption on
   one line and "Learn More →" on one line, card 384 x 216, still 133 below the
   band's top edge and 26 above its bottom.

   ALL THREE instances, his call 2026-09-11: the two on Mastermind (events band,
   which she flagged, and the welcome band at the foot) and the one on Self
   Assessment. Same component, same numbers, and leaving the twin directly below
   the fixed one in the old shape is how a closed round reopens.

   `.l-body` is load-bearing, for the reason the 2.5rem rule above already
   records: the generic `.w-hwrapper.media-card > :not(:last-child)` in the
   `max-width: 1279px` block is (0,3,0) and sits later in this file. This rule has
   to beat BOTH it and the 2.5rem rule, so it matches that one's (0,4,0) and wins
   on order. 1.25rem on the block axis, the same figure the hero card uses —
   the 2.5rem it replaces bought clearance for the play badge, which overhangs
   the poster's RIGHT edge and is a horizontal concern that stacking retires. */
@media (min-width: 768px) and (max-width: 1024px) {

	.media-band-section .media-card {
		flex-direction: column;
		align-items: stretch;
	}

	.l-body .media-band-section .media-card > :not(:last-child) {
		margin-inline-end: 0;
		margin-block-end: 1.25rem;
	}
}

/* Impreza zeroes the bottom margin of the LAST stacked column at this width:
   `.g-cols.stacking_default.via_flex:not(.reversed) > div:last-child` (0-5-1).
   Right for a boxed grid, wrong here — this row is the whole of a `height="auto"`
   section, so with the margin gone the copy runs straight into the band below.
   Restated at 0-6-1, which is what `.l-body` is here for. */
@media (max-width: 767px) {

	/* The split-media photo goes edge to edge once the band stacks.

	   THREE Ruttl threads, one component, two pages, all iPhone:
	     `ohI87yAZEsF53V8tCHLE`  About Us, story  "slika je lose pozicionirana, ne
	                             mora da ima razmake sa strene i gore, moze da ide
	                             do ivice i da ima vecu visinu"
	     `qilIm81ZIljeUFOHBDFg`  About Us, roots  "ukinuti margine sa strana i gore,
	                             po dizajnu slika nema sive margine sa strana"
	     `YnlQPrHmJh3PKiIRfmqC`  FAQ, story       "veca visina slike, bez sivih
	                             margina sa strane i gore"

	   She is quoting the design, and the design agrees: the mask group on the Home
	   band sits at x=-1 in a 1440 frame — past the canvas edge — and is exactly the
	   band's height. Stacked, the photo was inset instead: MEASURED at 390, the
	   image ran 24..366 with the section's own ground showing 24px down each side,
	   which on Our Roots and the FAQ band is grey. Hence "sive margine".

	   `width: 100vw` with `margin-inline: calc(50% - 50vw)` rather than a negative
	   margin in pixels: the inset is NOT one number. It is the section indent minus
	   the row's gutter compensation, and both change with the breakpoint — 24px of
	   visible margin at 390 comes from `padding: 40px 24px`, and the same 24px at
	   700 comes from `padding: 0 40px`. The 50%/50vw pair re-derives it from the
	   parent's own width at any width, so there is nothing to keep in sync.

	   ≤767 is where these columns stack (`vc_col-sm-*`), which is also where an
	   inset photo starts reading as a margin rather than as a column.

	   "Veca visina" needs no rule of its own: every one of these images states an
	   `aspect-ratio` (4/3 on the story bands, 597/893 on Our Roots), so widening it
	   to the viewport makes it taller by the same ratio — 342→390 wide takes the
	   story photo 257→292 and Our Roots 512→583.

	   Home's `.home-about-section` is the same component and gets the same
	   treatment, though nobody flagged it.

	   The FAQ band carries a media card positioned in PERCENTAGES of this very box
	   — `left: 11.7%`, `width: 76%`, `bottom: 9.3%` of `.vc_column-inner`. Widening
	   the box therefore moves and widens the card too: at 390 it goes from 43.5/283
	   to 45.6/296. That is the intended behaviour of those percentages ("keeps the
	   card in proportion to the photo"), and the photo is exactly what just grew —
	   but it IS a second-order effect of this rule, so check the card if the band
	   ever looks off. Verify it visually, not only by the numbers.

	   The selector is compounded to (0,6,1) for ONE of these four declarations.
	   Written plainly as `.split-media-column > .vc_column-inner` it half-worked and
	   that is the dangerous kind of failure: `width` and `margin-inline` landed,
	   because Impreza sets neither, while `padding-inline` silently lost to its
	   gutter rule at (0,4,1). Measured result was a box correctly spanning 0..390
	   with the photo still inset to 15..375 inside it — which looks like the rule
	   simply did less than asked, not like a specificity loss. Same shape as the
	   `.hero-media-column` rules in the 768–1279 block above, and for the same
	   reason. */
	.l-body .g-cols.via_flex.type_default > div.split-media-column > .vc_column-inner {
		width: 100vw;
		max-width: none;
		padding-inline: 0;
		margin-inline: calc(50% - 50vw);
	}

	/* Two stacked offers read as one block when the first card butts straight
	   into the second photo. Side by side they are meant to be flush; stacked
	   they are two separate offers. Moved down from 1024 on 2026-08-28: the row
	   now holds two columns through the whole tablet tier and only stacks here.

	   The selector is long for a reason: Impreza's `.g-cols.via_flex.type_default`
	   sets the gutter with the `margin` SHORTHAND (0-3-0), which also pins
	   margin-top to 0. A plain `.home-offer-inner-row + .home-offer-inner-row`
	   (0-2-0) loses to it silently — measured, the rows stayed flush. Matching its
	   three classes on the subject and adding ours makes it 0-4-0. */
	.g-cols.via_flex.type_default.home-offer-inner-row + .g-cols.via_flex.type_default.home-offer-inner-row {
		margin-top: 2.5rem;
	}

	/* The card's insets are ratios of the design's 461px panel — 12.8% / 14.8% /
	   10.4% / 9.8%. Stacked, the panel is the full column and those percentages
	   resolve against a much wider box: 50 top, 58 right, 41 bottom, 38 left at
	   440px, and asymmetric with it. A flat inset below the stack. At 768–1024 the
	   panel is ~448px, within 13px of the design's 461, so the ratios are right
	   again up there and this no longer reaches them. */
	.offer-card-vwrapper {
		padding: 2.5rem 1.5rem;
	}


	/* Stacked, the photo spans the full width — the design's portrait ratio
	   would push the copy an entire screen down, so it flattens.

	   16/10 was the first attempt and it decapitated every two-people photo on
	   the site: at 392px wide (440px viewport) the centred crop keeps the torsos
	   and cuts both heads off. 4/3 with the focal point above centre keeps the
	   faces — checked against home-about-ken-ernie.jpg (1079x1515) and the About
	   hero, which is the same pair.

	   Moved down from 1024 to 767 on 2026-08-28, when these rows stopped stacking
	   above the Columns Stacking Width. Below 768 they really are one full-width
	   photo above the copy and the ratio is what the layout needs; from 768 up
	   the photo is a column again and fills its height instead — see the
	   768–1279 block.

	   THE HEROES CAME OUT OF THIS RULE, 2026-09-10 — `kLjTxNqdEtD9cfpS7usK`
	   (1-on-1, iPhone, "veca visina slike?") and `TAspuzks8zvGBV0JXxtC` (Home,
	   iPhone, "vecu visinu slike na mobu da se vide sta je"), which are one
	   complaint on two pages.

	   The reasoning above conflated two different things. 16/10 decapitated people
	   because it was FLATTER than the source, and 4/3 decapitates them less — but
	   the design's own ratio decapitates them not at all, because it IS the source's
	   ratio. MEASURED at 1440, every hero on the site states a portrait one and
	   every one of them matches its file: Home `597/720` (894x1080), 1-on-1 and
	   About `597/670` (894x1005 and 1067x1200). Flattening a 0.89 source to 1.333
	   throws away 33-43% of the frame for no reason a crop can justify.

	   What the reasoning WAS right about is the split bands, and they stay: those
	   state `597/841` and `597/893`, which full-bleed on a phone would run 549 and
	   583px tall. That really is a screenful, and 4/3 is the answer for them.
	   Heroes are not full-bleed — 327 wide inside the page gutter — so the design
	   ratio puts them at 367-394, under half a screen.

	   `object-position` goes with them: 50% 22% is a rescue for a crop, and there
	   is no crop left to rescue. It stays on the split bands, which still have one. */
	.split-media-image img {
		aspect-ratio: 4 / 3;
		object-position: 50% 22%;
	}

	/* Every hero photo the same height on a phone — his call, 2026-09-11, taking
	   Home's ratio as the one they all share.

	   On desktop they deliberately differ. The design draws the hero band 670 tall
	   on every page and gives its photo `597/670`, except Home, whose photo is
	   drawn 720 against the same 670 band because it is meant to overflow into the
	   section below. Each source file matches its own frame: `home-hero-navigate`
	   is 894x1080 (0.828) against Figma's 0.829, and `oo-hero`, `about-hero-ken-
	   ernie`, `mastermind-hero` and `assessment-hero-marina` are all 0.889-0.890
	   against 0.891.

	   Stacked, none of that reads. The photo is no longer beside a band whose
	   height it is answering — it is a full-gutter block above the copy, and the
	   pages simply look inconsistent scrolling between them: 367 on four pages and
	   394 on Home. MEASURED at 390, one figure now: **327 x 394 everywhere**.

	   The cost is 6.9% off the sides of the four 0.889 sources, taken centred by
	   `object-fit: cover`. Checked against the two that could not afford it —
	   About and its Ken-and-Ernie pair — at 327 wide the crop is 23px total, and
	   both stay whole. Home is unchanged; its own (0,2,1) base rule already says
	   `597 / 720` and agrees with this one. */
	.hero-image img {
		aspect-ratio: 597 / 720;
	}

	/* (The Home-only override that used to sit here is gone. It restated
	   `597 / 720`, which is what the base rule already gives once the heroes are out
	   of the 4/3 group above — a second copy of a number is a number to keep in
	   sync. The second half of `TAspuzks`'s note still holds: the video card lands
	   inside the first screen because the hero squaring takes 106px off the band's
	   top inset, so the photo runs 24..418 and the card follows at ~443 of 844.)

	   The approach band's three stacked-layout corrections — Ruttl 2026-09-10,
	   iPhone: `VqIQY3Pk4GyqElNRfYzs` "veci razmak" (pin y=395, the photo/copy
	   junction), `RJtrgISWFqv1tBg1QhvL` "povecati ovde razmak" (pin y=1093, just
	   past the section's 1080 — the junction into `home-programs-section`) and
	   `4CRpJPhG3OuPQKj8UiML` "ovaj tekst isto treba da bude manji font size".

	   The design has nothing to say about either gap: Figma frame 1685:1704 puts
	   the two halves SIDE BY SIDE, 720x709 each at x=0 and x=720, so the vertical
	   gaps here are Impreza's stacking margins and not authored values. Same
	   situation as the "What's Included" head one page over.

	   MEASURED at 390: photo bottom 8202, copy top 8226 — a 24px gap, which is
	   Impreza's stacked-column margin verbatim. `--space-lg` puts the copy the
	   same 2.5rem from the picture as it already sits from the page edge (the
	   ≤1024 rule insets this column 2.5rem/1.5rem), so the block reads as one
	   square inset rather than two unrelated numbers.

	   The second gap is the whole junction: this band and `home-programs-section`
	   BOTH carry zero section padding (both are full-bleed), so the copy column's
	   own bottom margin is the only thing between them — 40px, against the 128
	   that two ordinary phone sections give each other. `--section-pad-medium` is
	   64, exactly one section's worth, which is the same halving convention the
	   photo bands on Mastermind already use at this width. */
	.l-body .g-cols.stacking_default.via_flex.home-approach-inner-row > div.approach-media-column {
		margin-bottom: var(--space-lg);
	}

	.l-body .g-cols.stacking_default.via_flex.home-approach-inner-row > div.approach-copy-column {
		margin-bottom: var(--section-pad-medium);
	}

	/* Overlay copy sized against the PHOTO. Below 768 the picture is full-bleed,
	   so the photo's width IS the viewport and one vw figure carries it.

	   MEASURED at 390: photo 375x369, type 30px — 8.0% of the picture, where the
	   design's own figure is 44 on a 720 half, 6.11%. The picture halves from
	   desktop (713 → 375, a factor of 0.53) while the type only falls 44 → 30, a
	   factor of 0.68. So the copy is a quarter oversized for the frame it sits in,
	   and it shows in the wrap: at 1440 the longest line is 89% of the measure,
	   at 390 it is 100% — the third line touches the box edge.

	   6.1vw is the design's ratio applied to a full-bleed photo: 23.8px at 390,
	   and it reaches the 44px cap at a 721px viewport, which is where the picture
	   itself reaches the 720 the design drew. The step at 768 is deliberate and
	   accompanies a layout change — the photo stops being full-bleed and becomes
	   a half-width column — exactly as with `.program-item-title` at the same
	   boundary. Line-height is unitless on `h2-style`, so it follows.

	   `.l-body` prefix for the same reason as everywhere else here: `h2-style`
	   and `approach-overlay-text` are on the SAME element, so at 0-1-0 this would
	   be a source-order coin toss. */
	.l-body .approach-overlay-text {
		font-size: min(44px, 6.1vw);
	}

	/* The 13% inset is a ratio of the design's half-width band; at full width it
	   is 57px and the two titles wrap differently because of it. */
	.program-item-hwrapper {
		padding-inline: 1.5rem;
	}

	/* Side by side the two bands are one row and match by construction. Stacked
	   they are two boxes whose titles run to different lengths — 153px against
	   235px, measured — and the pair reads as a mistake. The column wrapper holds
	   nothing but these two, so an equal row track is the whole fix; flex could
	   not do it, because the wrapper's height is its content's. */
	.programs-list-column > .vc_column-inner > .wpb_wrapper {
		display: grid;
		grid-auto-rows: 1fr;
	}

	/* ---- Mastermind / 1-on-1 components that were drawn as half-width figures ----

	   All four below have the same cause: a proportion measured against a 1266px
	   band or a 720px half, applied to a 393px phone. */

	/* The step numeral is a 135px display figure beside the copy. The builder now
	   stacks the row (`stack_on_mobiles="1"`), and at 135px the number would then
	   eat a third of the screen on its own line — 5rem keeps the gesture and gives
	   the copy the full width. Measured: the item went from 538px tall with a
	   121px text column to 348px at full width. */
	.step-item > .w-text {
		font-size: 5rem;
		margin-bottom: var(--space-2xs);
	}

	/* The band card is an overlap — absolutely positioned over the photo's lower
	   left at 30.7% of the band. At 393px that is a 120px column with one word per
	   line, hanging past the left edge, and 275px tall against a 184px photo. Below
	   the stack it goes back into flow, under the photo. It is authored after the
	   image, so nothing has to move for that. */
	.media-band-section .media-card {
		position: relative;
		left: auto;
		bottom: auto;
		width: auto;
		max-width: none;
	}

	/* The pricing halves carry a 60px inset, which is the design's 142px column
	   edge minus the grid. Stacked that is 120px of 393 spent on nothing.

	   Both go, and the row's gutter goes with them: with one column per line there
	   is no gutter to keep, and the pair (row's negative margin + the column's
	   padding) was what left the Yellow half sticking 9px past the content on each
	   side — visible as a sliver of white either side of the band. Zeroing both
	   puts every column, and the Yellow ground, on the section's own text edge.
	   This is `cols-flush` written out; the utility is not on the row. */
	.g-cols.via_flex.type_default.mm-pricing-inner-row {
		margin-inline: 0;
	}

	.g-cols.via_flex.type_default.mm-pricing-inner-row > .wpb_column > .vc_column-inner {
		padding-inline: 1.5rem;
	}

	/* Ruttl `BXSAbOK5IVSLMK2XK0Vl` — "plavu sekciju povecati od ivice do ivice, da
	   se spoji sa zutom sekcijom". The Yellow half already runs 0..375 here,
	   because the two rules above put the row and both columns on the section's
	   text edge and the section carries no gutter at this width. The Blue foot
	   did not follow: measured 24..351, a white sliver down each side and a step
	   where it meets the Yellow.

	   The pull is exactly the column inset restated above, so the two move
	   together — if that 1.5rem is ever retuned, this follows it by hand. The
	   panel keeps its own `2.5rem 1.5rem` padding, so the price copy does not
	   move; only the Blue ground grows out to the screen. */
	.mm-pricing-offer-column .price-panel {
		margin-inline: -1.5rem;
	}

	/* The CTA band's 80px inset and its heading's 64% cap are both proportions of
	   a 1266px band; at 393 they leave the heading 149px wide and 512px tall, one
	   word to a line, with the button overflowing beside it. */
	.w-hwrapper.cta-band {
		padding: var(--space-xl) var(--space-md);
	}

	.cta-band > .w-text,
	.cta-band > .w-vwrapper {
		max-width: none;
	}

	/* The framework row, same story as the pricing one. The intro column is a
	   Blue Medium panel below the stack (see the 1024 block), and the row's
	   negative gutter plus the column's own gutter padding left that panel
	   sticking 15px past the content on each side — a sliver of white either
	   side of a band that should sit on the text edge. With one column per line
	   there is no gutter to keep, so both go, and the panel gets a real inset of
	   its own instead. The 79px right padding it carried is the gap to the steps
	   beside it on desktop; stacked there is nothing to its right.

	   The third selector matches the second's class count so it has to come after
	   it to win — that is deliberate, not an accident of ordering.

	   A full-bleed version of this panel was tried and rejected on 2026-08-27 —
	   it stays on the section's text edge. If it is ever revisited, note that
	   `col-bleed-x-full` is NOT the tool: ab-base's formula,
	   `(100vw - var(--site-content-width)) / -2`, assumes the viewport is WIDER
	   than the content column, and at 393 against a 1280 content width it
	   evaluates to +443px and pushes the panel off screen. `(100% - 100vw) / 2`
	   measures the same distance from the element instead, and works here. */
	.g-cols.via_flex.type_default.framework-inner-row {
		margin-inline: 0;
	}

	.g-cols.via_flex.type_default.framework-inner-row > .wpb_column > .vc_column-inner {
		padding-inline: 0;
	}

	.g-cols.via_flex.type_default.framework-inner-row > .framework-intro-column > .vc_column-inner {
		padding-inline: 1.5rem;
	}

	/* Impreza stacks an `stack_on_mobiles` wrapper by making it a block and
	   turning `inner_items_gap` into the child's bottom margin
	   (`.w-hwrapper.stack_on_mobiles > :not(script)`, 0-2-1). That gap was chosen
	   for a HORIZONTAL relationship — 4rem between a step's numeral and its copy,
	   2rem in the CTA band — and reads far too loose once the two are stacked. One
	   flat vertical rhythm instead. `.l-body` takes it past the 0-2-1 tie. */
	.l-body .w-hwrapper.stack_on_mobiles > :not(script) {
		margin-bottom: 1.5rem;
	}

	/* Impreza puts that gap on EVERY child, the last one included, and the
	   wrapper has no padding or border, so the trailing 24px collapses out of
	   the wrapper and lands under the section. Measured on Home at 390: the
	   hero and the split band read 64px to the section edge where the section
	   asks for 40, the above-footer CTA 88 where it asks for 64, the footer 56
	   where it asks for 32. The gap belongs BETWEEN the stacked items, not
	   after the last one. */
	.l-body .w-hwrapper.stack_on_mobiles > :not(script):last-child {
		margin-bottom: 0;
	}

	/* And with the numeral now sitting above its own copy, the 80px between steps
	   no longer separates two blocks — it separates a step from the next step's
	   number, which reads as a gap inside the list. */
	.framework-steps-column .step-item + .step-item {
		margin-top: var(--space-xl);
	}

	/* And the gap INTO the list matches the gap inside it — same fix as the
	   tablet band above, same reasoning, one tier down: measured 24px against the
	   50 the steps keep. Ruttl `NEQMAV9KZVMDp85aO0Wu` (Mastermind) and
	   `g4ctS9NozWJ7C1qt9YAx` (1-on-1). The token is the one restated directly
	   above, so the pair moves together. */
	.g-cols.via_flex.type_default.framework-inner-row > .framework-intro-column {
		margin-bottom: var(--space-xl);
	}

	/* Same eyebrow gap as the tablet band, one tier down — see the long note
	   there. The heading is 24px here, so the design's 0.75 ratio gives 18. The
	   pill also grows at this width (`padding: 8px 21px` against 2px above, so a
	   32px box rather than 26), which adds its own air on top of the margin and
	   is the reason the phone reads looser than the tablet did. */
	.included-head-row .w-vwrapper > .eyebrow-pill {
		margin-bottom: 18px;
	}

	/* The framework intro block at phone size — this is the tier the three
	   threads were actually filed on; see the long note in the tablet block for
	   the derivation. The heading is 24px here, so the design's 0.75 gives 18,
	   and all three gaps in the block take it, because her three pins are spread
	   across two different joins in it. */
	.framework-intro-column .w-vwrapper > :not(:last-child) {
		margin-bottom: 18px;
	}

	/* The answer panel is inset 40px all round — a proportion of the desktop
	   accordion. On a phone that leaves the copy 265px of 345 and sets it 20px
	   deeper than the question above it. */
	.faq-accordion .w-tabs-section-content-h {
		padding: var(--space-md) 1.5rem;
	}

	/* And the question follows it to the same edge. The `- 1px` is the header's
	   own border, which the answer panel does not carry on its sides: without it
	   the two sit 3px apart at the same nominal 1.5rem. Measured after: question,
	   answer and the toggle's right edge all at 48. */
	.faq-accordion .w-tabs-section-header {
		padding-inline: calc(1.5rem - 1px);
	}

	/* ---- Self Assessment access band ----

	   The band is `width="full"`, so its row's negative gutter margin has nothing
	   to sit against: the two panels ran -15 to 408 on a 393 screen and were
	   clipped on both sides, with the copy 10px from the glass. Zeroing the margin
	   puts them edge to edge, which is what a full-bleed band should be.

	   (The row ABOVE them still measures -15..408 in dev tools. That one is the
	   outer `vc_row`'s grid, whose margin is cancelled by its own column's
	   padding — an empty box with no ground, and zeroing it would push the panels
	   15px in on each side. Leave it.)

	   The inset then comes off the percentage: 6% of a full-width column is a
	   23.58px inset that matches nothing else on the site. */
	.g-cols.via_flex.type_default.assessment-access-inner-row {
		margin-inline: 0;
	}

	.g-cols.via_flex.assessment-access-inner-row > .assessment-form-column > .vc_column-inner,
	.g-cols.via_flex.assessment-access-inner-row > .assessment-points-column > .vc_column-inner {
		padding: 4rem 1.5rem;
	}

	/* Same marker-box story as the other lists, with a different number because
	   this copy is 20px: the box measures 29px = 1.45em, against a 23px indent, so
	   every bullet sat 6px outside the panel. At 1.45em the marker starts exactly
	   on the panel's text edge — and the nested list inherits the same ratio, so
	   its bullets line up with the parent item's text. */
	.assessment-points-column ul {
		margin-left: 0;
		padding-inline-start: 1.45em;
	}

	/* The points list is spaced for a half-width panel — 3rem between blocks. */
	.assessment-points-vwrapper > *:not(:last-child) {
		margin-bottom: 1.5rem;
	}

	/* Same figure, same fix, on the coach bio panel. */
	.w-vwrapper.person-card-body {
		padding: 2.5rem 1.5rem;
	}

	/* The Our Approach columns carry `inner_items_gap` of 6.5rem and 4rem — the
	   design's vertical rhythm between a heading and its copy across a 1266px
	   band. On a phone that is 104px and 64px of nothing between two paragraphs.

	   Impreza writes the gap INLINE as `--vwrapper-gap`, so redeclaring the
	   property here would lose to the element's own style attribute without an
	   `!important`. Setting the child margin the variable feeds instead wins on
	   specificity alone: their rule is `.w-vwrapper > *:not(:last-child)`, ours
	   adds the row's class. */
	.about-approach-inner-row .w-vwrapper > *:not(:last-child) {
		margin-bottom: 1.5rem;
	}

	/* The icon card's 40/40/80 is a ratio of the design's three-up card. As one
	   full-width card per line that bottom inset is most of a screen of nothing.

	   RETUNED 2026-09-10 — Ruttl `EVtxr9jXavBgd6OxzfFN`, "razmak treba da bude
	   isti kao od leve ivice do ikonice, tako uraditi kod svih ikonica". Her pin
	   (x=36, y=17 on the card's wrapper) sits in the band ABOVE the glyph, not
	   beside it, which is what identifies the top inset as the subject.

	   She is describing a relationship the card already has everywhere else:
	   measured, desktop and tablet are 40 left AND 40 top, so the glyph is
	   indented as deeply as it is dropped. When the sides came down to 24 for the
	   phone the top stayed at 40, and that reads as the icon sitting too low —
	   the complaint is the broken pairing, not the absolute figure.

	   So the top follows the sides down to 1.5rem and the foot keeps 2.5rem. The
	   card stays bottom-weighted, which is the one part of the 40/40/80 that is
	   deliberate (see the base rule). Result: 24 top, 24 sides, 40 foot. */
	.icon-card .w-iconbox {
		padding: 1.5rem 1.5rem 2.5rem;
	}

	/* The eyebrow belongs to the heading, not to the photo above it.
	   `IZeYdA8eevigZxyx4lyq`: "povecati malo razmak tako da 'for therapy group..'
	   vise bude blize naslovu ispod" — increase the gap ABOVE it so it reads as
	   part of the heading below.

	   Measured, that is the whole problem: 24px above the eyebrow (the media
	   column's stacking margin) against 18px below it. Two nearly equal gaps, so
	   the eyebrow floats between the photo and the heading instead of belonging to
	   either. Nothing here is wrong on its own — it is the near-tie that reads
	   badly, the same shape as the framework and "What's Included" gaps.

	   `--space-lg` makes it 40 against 18, which is unambiguous. The 18 below is
	   Figma's own (`1692:2238` ends at 218, heading `1692:2179` starts at 236) and
	   does not move.

	   Hits all four heroes that stack a photo over an eyebrow — Mastermind, 1-on-1,
	   About Us, Self Assessment — for the same reason the 18px rule above already
	   does: `hero-*` is deliberately un-prefixed as a shared component. */
	.g-cols.via_flex.type_default.hero-inner-row > .hero-media-column {
		margin-bottom: var(--space-lg);
	}

	/* The pull-quote's 44px left inset is the distance from its hairline to the
	   quote in the design, measured on a full-width column. */
	.w-grid.ab-border-left-testimonial .w-grid-item-h {
		padding-left: 1.5rem;
	}

	/* The badge rows run edge to edge otherwise — they are a tinted row, not a
	   text block, so they need their own inset once they are the full screen. */
	.w-hwrapper.badge-row {
		padding-inline: 1.5rem;
	}

	/* And the value beside each badge steps down a size: at h5 it competes with
	   the label it is meant to annotate once the two are this close together. */
	.badge-row .h5-style {
		font-size: var(--h6-font-size);
	}

	/* The hero card is the same overlap figure as the media bands: absolutely
	   positioned over the photo's lower left, 76% of the column. Same fix — back
	   into flow, under the photo.

	   The hairline is the price of moving it: the card is WHITE, and over the
	   photo that was enough to read as a card. Below it, on a white section, the
	   fill says nothing and it becomes text with padding. Blue Medium rather than
	   `--color-content-border` — that token is Impreza's default #ddd, a grey the
	   design does not use anywhere; Blue Medium is the same ink the two band cards
	   carry as their ground, so the three read as one component. It sits flush
	   under the photo on purpose: hairline plus shared edge makes the pair one
	   block rather than two.

	   The SPLIT band's card is deliberately not included — his call, 2026-08-27:
	   it stays an overlay on the phone. */
	.hero-media-column .media-card {
		position: relative;
		left: auto;
		bottom: auto;
		width: auto;
		max-width: none;
		border: 1px solid var(--color-content-secondary);
	}

	/* Home's hero card is the only hero card carrying a video poster, and it is
	   the tightest instance of the component: inside the hero column it measures
	   327 against the band cards' full 375, so the poster's fixed 117 leaves the
	   copy 142px — four lines of prose with the Text Link button broken over two.
	   Stacked, the copy gets the card's whole 279 and the label goes back on one
	   line.

	   The band cards keep the side-by-side shape on purpose: their copy measures
	   190 and their labels are two words.

	   The 2.5rem set in the builder buys room for the play badge hanging off the
	   poster's right edge, which is a HORIZONTAL concern: stacked it is an inline
	   margin doing nothing, so it is zeroed. Nothing replaces it — Impreza already
	   gives the element a 1.25rem BOTTOM margin of its own, and the two stack:
	   measured 40px between poster and copy with a `margin-block-end: 1.25rem`
	   here, 20px with it removed. Note it is the MARGIN that spaces an hwrapper
	   (`.w-hwrapper > :not(:last-child)`), never `gap` — and `--hwrapper-gap`
	   itself is written inline from the builder field. */
	.hero-media-column .media-card {
		flex-direction: column;
		align-items: stretch;
	}

	/* CORRECTED 2026-09-10 — Ruttl `0a2viIAYEFxkMwsAWQTn` (Home hero, iPhone),
	   "tekst je ovde previse pribijen videu", pinned at the very top of the
	   paragraph.

	   The note above assumed Impreza would leave a 1.25rem BOTTOM margin of its
	   own once the inline one was zeroed, and recorded 40px between poster and
	   copy. It does not: Impreza spaces an hwrapper with `margin-inline-end`
	   ALONE, so zeroing that left nothing on the block axis. Measured now, the
	   poster ends at y533 and the copy begins at y533 — the gap is exactly zero,
	   which is what she is looking at.

	   So the block margin is stated rather than assumed. 1.25rem is the figure the
	   old note thought was already there. */
	.hero-media-column .media-card > :not(:last-child) {
		margin-inline-end: 0;
		margin-block-end: 1.25rem;
	}

	/* The play badge had no clearance at all — `oXVCir2eV9uJJp5GpIjh` (Mastermind
	   events band, iPhone): "tekst je previse primaknut play ikonici, mozda mozemo
	   na mobu da smanjimo video screenshot".

	   The badge is centred ON the poster's right edge (`left: 100%` with a -50%
	   translate), so it overhangs by half its width — 20px. The tablet rule above
	   cuts the card's gap to exactly 1.25rem = 20px, which lands the badge's outer
	   edge precisely on the copy's. Its own comment says so: "touching, not
	   overlapping". Touching is the complaint.

	   (Read the transform, not the resolved `right`. `getComputedStyle` reports
	   `right: -40px` for that pseudo-element and it is 20px of overhang — I read
	   the -40 first and thought the badge overlapped the copy by 20.)

	   That 1.25rem was bought for the TABLET, where the band card is 30.7% of the
	   viewport and the copy is down to 65-97px. Below 600 the card goes full width
	   — measured 375 — so the reduction is no longer paying for anything while the
	   badge is still paying for it. Back to the builder's 2.5rem here.

	   Her other suggestion — "smanjiti video screenshot" — is deliberately NOT
	   taken. The poster's 130 is his own call of 2026-09-09, made against the
	   design's 117 (see the base rule, "run it a little larger"), so shrinking it
	   here would quietly reverse a decision rather than implement one. The gap
	   carries the whole fix instead, and the copy pays 20px for it: 157 against
	   177. If that measure turns out too tight, the poster is the lever, and it is
	   his to pull. */
	.w-hwrapper.media-card > :not(:last-child) {
		margin-inline-end: 2.5rem;
	}
}

@media (min-width: 1280px) {

	/* Above the design width the overlay's measure stops being a share of the
	   COLUMN and becomes a share of the TYPE.

	   The base rule is the design's box — 72% of the half with an 11% inset all
	   round, which is 1685:1811's 442 inside a 720 half. It leaves the text 356px
	   at 1440 and it breaks over FIVE lines. His call, 2026-09-09: three lines at
	   every width above 1279.

	   No single percentage can do that. The type stops growing at 44px while the
	   half goes on widening, so the share that yields three lines is 74% of the
	   column at 1280 and 49% at 1920. `12em` is 528px for as long as the type is
	   44px and scales with it if the clamp ever lifts — measured three lines at
	   1280, 1440 and 1920, longest line 469 against the 470 the third line needs
	   and the ~664 that would collapse it to two. The `calc` adds the left inset
	   back because the box is border-box, so the CONTENT is exactly the 12em.

	   `padding-right` goes: at 1280 the half is 633 and 11% on both sides leaves
	   493, under the 528 the measure asks for. Nothing is lost — `max-width` is
	   what holds the text off the right edge now. The LEFT inset stays a
	   percentage; it is the design's 80-in-720 and it should keep scaling. */
	.approach-overlay-text {
		max-width: calc(12em + 11%);
		padding-right: 0;
	}

	.l-header.shadow_thin:not(.sticky) .l-subheader.at_middle,
	.l-header.shadow_thin:not(.sticky) .l-subheader.at_bottom {
		box-shadow: 0 1px 0 var(--color-content-secondary);
	}

	.footer-inner-row .vc_col-lg-2,
	.footer-inner-row .vc_col-lg-6 {
		width: calc(100% / 4);
	}

	.footer-inner-row .footer-title.underline {
		max-width: 110px;
	}
}

@media (min-width: 1025px) {

	.l-subheader.at_middle.width_full {
		padding-right: 0;
	}

	/* Footer link list: room around it, and a wrap that does not leave an orphan.

	   `text-wrap` is on the LI, not on the `a`. Impreza renders these links
	   `display: inline` (measured), and text-wrap only applies to a block
	   container — put it on the anchor and it computes to `pretty` and changes
	   nothing at all, which is exactly what the first attempt did.

	   On the LI it does the job: "What Practice Owners are Saying" broke
	   199 / 51 — a one-word last line — and lands 171 / 79 with `pretty`.
	   (`balance` was measured too: 108 / 142, which reads worse in a left-aligned
	   list because the first line ends up the short one.)

	   The inset is on the RIGHT only — his call, and the right one: on all four
	   sides it put the list 16px in from the column title above it and grew the
	   column by 32px. On the right it narrows the measure and nothing moves. The
	   wrap is `pretty`'s doing either way; this only keeps the longest line off
	   the column edge. */
	.footer-links-column .w-menu {
		padding-right: 1.5rem;
	}

	.footer-links-column .w-menu li {
		text-wrap: pretty;
	}

	/* "Schedule Your Free Consultation Today" comes in one grid column off the
	   right edge — his call, and specifically the column WITHOUT its gutter.

	   The distinction is the whole point of the value. `100% / 12` is the grid
	   STEP — what `vc_col-md-offset-1` would shift by — and at 1280 that is
	   106.67px. Subtracting the gutter leaves 76.66px, which is the column as it
	   is actually drawn, gutter excluded. Measured: the button lands 1222–1516
	   against a content edge at 1593, i.e. 77px in.

	   Percentages and the gutter token rather than a length, so it stays one
	   column at any width and follows `--grid-gutter` if that ever changes. */
	.above-footer-cta-hwrapper > .w-btn-wrapper {
		margin-right: calc(100% / 12 - var(--grid-gutter));
	}

	.l-section.height_huge.main-footer-section {
		padding-bottom: 4rem;
	}
}

/* -----------------------------------------------------------------------------
   Footer at tablet width — "Useful Links" beside the pitch
   -----------------------------------------------------------------------------
   Ruttl `XSOgJiFG69f617zKo5ar` (iPad Air): "mozda mozemo da stavimo 'useful
   links' sekciju pored 'you built a group..' sa desne strane".

   The inner row is authored `tablets_columns="1"`, so from 1024 down all three
   columns render `vc_col-sm-12` and the footer is one full-width stack. Measured
   at 820 before: three 755px blocks at y 7374 / 7642 / 7883, the row 863 tall,
   and the whole right half of the links block empty.

   Two of the three fit side by side at this width. 50% of 755 is 378, the pitch
   title is capped at 20ch regardless, and the link list is four short items.
   Offerings keeps the full width on a second row: it is the widest column by
   design (41.67% against 25 and 25 on desktop) and each of its two rows is a
   justified title-and-arrow pair that needs the measure. So 50 / 50 / 100, and
   the row wraps by itself — the builder already renders it `flex-wrap: wrap`.

   `width` goes on the COLUMN, never on `.vc_column-inner`: the inner carries the
   half gutter as `padding-inline`, and that is what draws the 30px between the
   two. Widths beat Impreza's `vc_col-sm-12` (0,1,0) on specificity alone.

   The padding-top is the part that is not obvious. The 1024 block above drops
   every column's `padding-block` to `--space-xs` and hands `--space-xl` back to
   `:first-child` at the top and `:last-child` at the bottom — the 50px of
   clearance from the two horizontal rules, kept only at the ends of a stack.
   Links is now in the FIRST visual row, so it needs that same 50 or its title
   starts 38px above the pitch's. Note what it takes to land: the shorthand
   `padding-block` at (0,6,0) resets the top edge, so the fix is a LONGHAND at
   the same weight, written later in the file. Out-specifying is not the lever
   here, source order is — and a `padding` or `padding-block` shorthand added
   below this would take the whole thing back.

   The vertical hairline stays hidden. It belongs to `.footer-offerings-column`,
   which is still a full-width block here, and the design only ever drew a rule
   between links and offerings, never between the pitch and links.

   Measured after, at 820: pitch 25..403 and links 403..781, both at y 211 with
   their titles sharing a baseline at 261; offerings 25..780 below; the row 634
   instead of 863. Phone is untouched — `min-width: 601px`, and the phone pass
   is final. */
@media (min-width: 601px) and (max-width: 1024px) {

	.footer-inner-row > .footer-pitch-column,
	.footer-inner-row > .footer-links-column {
		width: 50%;
	}

	.footer-inner-row > .footer-offerings-column {
		width: 100%;
	}

	.g-cols.via_flex.type_default.footer-inner-row > .footer-links-column > .vc_column-inner {
		padding-top: var(--space-xl);
	}
}

/* -----------------------------------------------------------------------------
   CTA band at tablet width — heading across the band, button under it
   -----------------------------------------------------------------------------
   Ruttl `AyHI0WVGDZcVEypLgywO` (iPad Air, pin inside the heading): "mozemo li da
   stavimo da ova recenica ide duzinom sive slajfne, a button ispod nje, ne pored".

   Read "duzinom sive slajfne" as the band, not the viewport. The grey ground is
   the ROW's background and bleeds edge to edge, but the band's content sits on
   the site content column like every other section, and running a heading out
   into the bleed would be the only line on the page that does. Full width of the
   band is what she is pointing at: the 64% cap.

   Measured at 820 before: band 40..765, heading capped at 464 of 725 and four
   lines tall, button beside it at 536..765. After: heading the full 725 in three
   lines, button under it at 40..285, band 306 → 340 tall.

   Mechanics, and the reason this is three declarations rather than
   `flex-direction: column`:

   - the element is `alignment="justify"` + `valign="middle"`, i.e.
     `justify-content: space-between` and `align-items: center`. Turned into a
     column those two would centre the heading and the button HORIZONTALLY, so
     the fix would have to undo both. `flex-wrap: wrap` plus a 100% child leaves
     the row axis alone and lets the button fall to the next line on its own,
     left where the text starts.
   - `margin-inline-end` is how Impreza spaces an hwrapper — never `column-gap`
     — so the heading carries 32px of it on the wrapped line too. Zeroed here,
     and the vertical rhythm comes from `row-gap: var(--hwrapper-gap)`: the same
     `2rem` the builder wrote inline on the element, so the gap keeps following
     `inner_items_gap` rather than becoming a second source of truth.
   - `margin-bottom: 0` because the two pages disagree — Mastermind's `w-text`
     carries 24px of it and 1-on-1's `w-vwrapper` carries none, which would make
     one band's gap 56 and the other's 32.

   On the component, so it closes on both pages the band is drawn on: Mastermind
   1692:2083 (bare heading) and 1-on-1 1692:2563 (heading over a line of copy).
   Verified on both at 820 — the vwrapper behaves exactly like the w-text.

   The phone block below already removes the cap and shrinks the padding, and
   `stack_on_mobiles="1"` stacks the items there; this rule stops at 601 so none
   of that moves. */
@media (min-width: 601px) and (max-width: 1024px) {

	.w-hwrapper.cta-band {
		flex-wrap: wrap;
		row-gap: var(--hwrapper-gap);
	}

	.cta-band > .w-text,
	.cta-band > .w-vwrapper {
		width: 100%;
		max-width: none;
		margin-inline-end: 0;
		margin-bottom: 0;
	}
}

/* -----------------------------------------------------------------------------
   Header CTA on hover — a seam against the burger block
   -----------------------------------------------------------------------------
   Ruttl `GHZ4sOpsbpGitrXdn7DH` (iPad Air): "prilikom havera buttona, spoje se
   dve plave povrsine, da li da ih odvojimo ovom sivom linijom koja razdvaja meni
   od hero sekcije" — his call: yes.

   The two surfaces are both Blue Medium. Button Style 5 carries
   `--btn-hover-background: var(--color-content-secondary)`, and the burger block
   `.w-nav` is painted that same #B7D6F4 from the header's own options. At rest
   they read as two blocks because the button is Deep Blue; hovered, they are one
   376px slab with nothing between them. Measured at 820: button 441..715, nav
   715..805, the same colour on both sides of x=715.

   The ink is NOT the one she named. The line she is pointing at is the header's
   bottom hairline, which at her width is Impreza's own `rgba(0,0,0,0.08)` — our
   Blue Medium hairline only starts at 1280. Over white that 8% black reads; over
   Blue Medium it computes to #A8C5E0 against #B7D6F4 and disappears — invisible
   in the browser pane at 1:1 and gone entirely at half scale. And Blue Medium
   itself, the hairline ink everywhere else on this site, cannot divide two Blue
   Medium surfaces.

   So the seam takes the ink of the MARKS on that ground rather than a tone of
   the ground itself: `--color-content-primary`, measured off the burger glyph
   beside it (`rgb(33,42,96)` on the bars and on the control) and the same ink
   the button's own label switches to on hover. His call, and the right one — an
   earlier pass used `--color-alt-content-primary` (#658AC4), which is an
   alt-palette value for DARK grounds and read as a wrong colour rather than as
   a divider. One ink for every mark on the light-blue slab; at 1px against the
   2px bars it reads as part of the same vocabulary. Checked against a real
   hover in the pane, not a simulated one.

   `box-shadow: inset`, not a border: no layout, and the button's own
   `box-shadow` is `none` in both states so nothing is being taken away.

   Scoped `max-width: 1139px` because that is exactly where the two surfaces are
   neighbours. At 1140 and up the nav becomes the horizontal menu, its ground
   goes transparent and it sits to the LEFT of the button (Impreza's header JS
   also reorders the DOM around there, so a sibling selector is not safe to lean
   on). Below 601 the button is `hidden_for_mobiles` and the rule cannot fire.
   Verified at 601 / 820 / 1024 / 1139 / 1140 / 1440. */
@media (max-width: 1139px) {

	.l-header .w-btn.header-cta-btn:hover {
		box-shadow: inset -1px 0 0 var(--color-content-primary);
	}
}

/* -----------------------------------------------------------------------------
   Video popup overlay — 0.95 instead of 0.85
   -----------------------------------------------------------------------------
   His call: the lightbox behind the video should be darker.

   `!important` is not a shortcut here, it is the only lever. The 0.85 is not in
   any stylesheet — the theme's `.w-popup-overlay` / `.w-popup-overlay.active`
   rules carry position, z-index, the opacity transition and nothing else.
   Impreza's popup JS builds the overlay element at open time and writes
   `background:rgba(0,0,0,0.85);` INLINE on it (read off the live element with a
   popup open), and an inline declaration cannot be beaten by specificity.

   On `.active` rather than the bare class because that is the state that is
   actually painted — the element sits at `opacity: 0` until then. */
.w-popup-overlay.active {
	background: rgba(0, 0, 0, 0.95) !important;
}

/* -----------------------------------------------------------------------------
   Layout 311's inline video — the design's pill instead of the theme's disc
   -----------------------------------------------------------------------------
   Marija, 2026-09-11: the play control is already drawn on the Home frame, so
   nothing new needs designing. Figma `1685:1855` ("Frame 346"): a 353x38 pill
   over the poster, the label at x21 and a 34x34 `selfhst:youtube` glyph at x298
   — 21px in from the pill's right edge, centred on the 38. The poster there is
   422x327 and the pill sits 29 from its left with 25 of clearance under it.
   That is Button Style 12, which the site already draws (`.video-pill-btn`
   above), so this block only PLACES it and gets the theme's own control out of
   the way.

   His call, 2026-09-12: on 311 the click must keep PLAYING THE VIDEO IN PLACE,
   not open the lightbox. So the pill is not the trigger — `pointer-events: none`
   and the click falls through to `.w-video-play`, Impreza's own button, which
   covers the whole poster (measured 536x302, absolute, full box). The theme's
   72px translucent disc is the only thing that goes.

   The insets are percentages of the poster, not the design's literals: 29/422 =
   6.9% and 25/327 = 7.6%. The archive's poster is 536 wide against the frame's
   422, and the card is a masonry cell that changes width with the column.

   Width is left to the label — `fit-content` through Style 12's `inline-flex`,
   the same call as the 506 card ("it hugs its label — 362 against the design's
   353"), rather than the design's 83.6% of the poster.

   The pill hides itself the moment the video starts: Impreza DROPS the
   `with_overlay` class off `.w-video` on play and sets its own button to
   `display: none` (verified by clicking one and reading the class list before
   and after), so `:has()` reads the real state with no JS and no class of ours.

   NOTE ON STRUCTURE: this expects the layout to wrap the video and the pill in
   one vwrapper carrying `video-play-wrap`, with the button after the video. The
   wrapper is what the percentages resolve against; drop the pill straight into
   the card's vwrapper instead and they resolve against the whole card. The 60px
   that `.w-video` used to carry below it moves to the wrapper with it — the
   existing rule targets `> .w-vwrapper > .w-video` and stops matching once the
   video is one level deeper. */
.gps-testimonials-grid .video-play-wrap {
	position: relative;
}

/* The wrapper has to measure the POSTER and nothing else, because the pill's
   `bottom` is a percentage of it. Measured after the first deploy: wrapper 313
   against a 302 video, and the pill landed 13px above the poster instead of 23.
   The 11.2px is the item vwrapper's own `--vwrapper-gap`, handed to the video as
   `margin-bottom` — inside this wrapper there is nothing under the video for it
   to space, and the 60px that separates the player from the quote now rides the
   wrapper. Zeroed: wrapper 302, pill 23 above the poster's bottom, which is the
   design's 25-on-327 at this size. */
.gps-testimonials-grid .video-play-wrap > .w-video {
	margin-bottom: 0;
}

.gps-testimonials-grid .w-grid-item-h > .w-vwrapper > .video-play-wrap {
	margin-bottom: var(--space-2xl);
}

.gps-testimonials-grid .w-video-play-icon {
	display: none;
}

.gps-testimonials-grid .video-play-pill {
	position: absolute;
	left: 6.9%;
	bottom: 7.6%;
	z-index: 2;
	pointer-events: none;
}

.gps-testimonials-grid .video-play-wrap:not(:has(.w-video.with_overlay)) .video-play-pill {
	display: none;
}

/* ---- …and its hover state ----
   His note, 2026-09-12: "treba nesto da se desi na hover svega toga… sad je
   cudno, nikakva promena na hover celog thumbnaila". Right — the poster is the
   click target and it was answering nothing.

   Both halves are values the site already owns, not new design:

   1. THE POSTER takes the same veil as the media-card posters — Deep Blue
      `--color-content-primary` at **0.17**, the DESIGNER's stated figure after
      two takes of ours (see the `.media-card` block above; do not re-derive it).
   2. THE PILL takes Button Style 12's own hover ink, Body Grey →
      `_content_heading`. It cannot fire by itself: the pill carries
      `pointer-events: none` so the click can reach the player, and a button that
      never gets hovered never runs its hover. So it is restated here, and the
      pill goes on behaving like every other Style 12 on the site.

   Two overrides had to be worked around, and both are the file's usual suspects:

   - **`button.w-video-play { background: none !important; background-color:
     initial !important }`** is Impreza's own reset at (0,1,1), so the veil cannot
     be a background on that button — measured `rgba(0,0,0,0)` with the rule
     sitting right there. It is a `::before` instead, which nothing resets, and
     that also puts it on the same technique as the media-card veil.
   - **`.us-btn-style_12 { color: var(--color-body-grey) !important }`** is the
     GENERATED Theme Options CSS, (0,1,0) with `!important`. Important against
     important is decided on specificity, and (0,3,0) here takes it.

   The veil rides the play BUTTON rather than the wrapper deliberately: Impreza
   sets that button to `display: none` on play and drops `with_overlay` off the
   video, so the veil disappears with it and can never sit over a playing embed.
   No `:has()`, no class of ours, nothing to clean up. */
.gps-testimonials-grid .w-video-play::before {
	content: '';
	position: absolute;
	inset: 0;
	background: var(--color-content-primary);
	opacity: 0;
	transition: opacity 0.2s ease;
}

/* 0.25 on THIS poster, not her 0.17 — his call, 2026-09-12, after looking at it
   live: "deluje preslabo". The two are not in conflict. 0.17 is the designer's
   value for a 130px media-card thumbnail, where a 17% dim covers a small bright
   patch the eye is already resting on; here the poster is 536x302 and the same
   percentage spreads over 14x the area of a picture that is often dark to start
   with, so it reads as nothing happening. 0.25 sits between her figure and the
   0.25 of the earlier #101531 take, and the pill's ink change carries the rest
   of the signal.

   The media-card posters are NOT touched — this rule is scoped to
   `.gps-testimonials-grid`, and her 0.17 still governs every small poster. */
.gps-testimonials-grid .w-video-play:hover::before {
	opacity: 0.25;
}

.gps-testimonials-grid .video-play-wrap:hover .video-play-pill {
	color: var(--color-content-heading) !important;
}
