/*
 * Proposed home page.
 *
 * CONTAINER: measured off this install rather than assumed. The theme's own .uk-container runs
 * `max-width: none` with 40px padding, so at a 1440 viewport the content measure is 1360 — which is
 * exactly what the Figma frame is drawn to. An earlier note in the skill said 1200 content / 1280
 * box; that does not match this theme. This file mirrors the real container and caps at 1440 so the
 * measure stops growing on ultrawide instead of running to the viewport.
 *
 * Tokens are the measured house values: buttons are pills at 30px, cards and images are 0.
 */
:root {
  --kf-ink: #161616;
  --kf-ink-2: #2a2b2c;
  --kf-ink-3: #414243;
  --kf-mute: #717275;
  --kf-line: #e5e5e5;
  --kf-paper: #f9f9f9;
  --kf-yellow: #fed208;
  --kf-onDark: #d3d4d5;
  --kf-onDark-mute: #a1a2a4;
  --kf-measure: 1440px; /* 1360 content + 40 padding each side */
}

.kf-sec {
  position: relative;
}
/* .kf-container is only used by the custom elements' own markup. It deliberately does NOT set a
   max-width: the surrounding Builder section already supplies the theme's container, and imposing a
   second cap here put our content 80px narrower than the header and footer at 2560. Inherit the
   chrome rather than competing with it. */
.kf-container {
  margin-inline: auto;
}

/* ---------- type ---------- */
.kf-eyebrow {
  font:
    700 11px/14px "Roboto Condensed",
    "Roboto",
    sans-serif;
  letter-spacing: 1.8px;
  text-transform: uppercase;
  color: var(--kf-mute);
  margin: 0 0 10px;
}
.kf-eyebrow--onDark {
  color: var(--kf-yellow);
}
.kf-h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 16px;
}
.kf-h2--onDark {
  color: #fff;
}
.kf-deck {
  font:
    400 17px/27px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0 0 28px;
  max-width: 62ch;
}
.kf-deck--onDark {
  color: var(--kf-onDark-mute);
}
.kf-display {
  font:
    700 clamp(40px, 5vw, 72px)/1.08 "Roboto Condensed",
    sans-serif;
  color: #fff;
  margin: 0 0 28px;
}
.kf-rule {
  display: block;
  width: 72px;
  height: 3px;
  background: var(--kf-yellow);
  margin-bottom: 22px;
}

/* ---------- buttons: pill 30, per the measured house value ---------- */
.kf-btn {
  display: inline-block;
  padding: 15px 30px;
  margin: 0 12px 12px 0;
  border-radius: 30px;
  border: 1px solid transparent;
  font:
    700 15px/19px "Roboto Condensed",
    sans-serif;
  text-transform: uppercase;
  letter-spacing: 0.4px;
  text-decoration: none;
  transition: opacity 0.15s ease;
}
.kf-btn:hover {
  opacity: 0.88;
  text-decoration: none;
}
.kf-btn--primary {
  background: var(--kf-yellow);
  color: var(--kf-ink);
}
.kf-btn--ghost {
  background: transparent;
  color: #fff;
  border-color: rgba(255, 255, 255, 0.55);
}

/* ---------- our story / why: dark bands ---------- */
.kf-story,
.kf-why {
  background: var(--kf-ink);
}
.kf-story .kf-container,
.kf-why .kf-container {
  padding-block: 88px;
}

/* ---------- stubs: visible and labelled, never silently absent ---------- */
.kf-stub {
  background: repeating-linear-gradient(
    135deg,
    #f4f4f4 0 12px,
    #eeeeee 12px 24px
  );
}
.kf-stub__inner {
  padding-block: 72px;
  text-align: center;
}
.kf-stub__label {
  font:
    700 22px/28px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0 0 6px;
}
.kf-stub__note {
  font:
    400 13px/18px "Roboto",
    sans-serif;
  color: var(--kf-mute);
  margin: 0;
}
.kf-stub code {
  background: #fff;
  border: 1px solid var(--kf-line);
  padding: 1px 6px;
}


/* ============================================================================
   Native-element structure.
   The bands are now section > row > column > headline/text/button plus the kf_*
   custom elements, so these rules target the element markup rather than the
   hand-written HTML the first pass used.
   ========================================================================= */

.kf-h2,
.kf-sec h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  margin: 0 0 14px;
}
.kf-sec h3 {
  font:
    700 22px/28px "Roboto Condensed",
    sans-serif;
  margin: 0 0 8px;
}
.kf-sec p {
  font:
    400 15px/24px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
}

/* dark bands ------------------------------------------------------------- */
.kf-hero,
.kf-story,
.kf-why,
.kf-featured,
.kf-follow {
  background: var(--kf-ink);
}
.kf-hero h1,
.kf-story h2,
.kf-why h2,
.kf-featured h2,
.kf-follow h2,
.kf-why h3 {
  color: #fff;
}
.kf-story p,
.kf-why p,
.kf-featured p,
.kf-follow p {
  color: var(--kf-onDark-mute);
}

/* ---- marquee: one row, seamless, motion-safe --------------------------- */

/* ---- horizontal rails: featured / series / arrivals -------------------- */
.kf-featured__rail,
.kf-series__rail,
.kf-arrivals__rail {
  display: flex;
  gap: 20px;
  list-style: none;
  margin: 24px 0 0;
  padding: 0 0 14px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
}
.kf-featured__rail > li,
.kf-series__rail > li,
.kf-arrivals__rail > li {
  flex: 0 0 auto;
  scroll-snap-align: start;
}
.kf-featured__item {
  width: 160px;
}
.kf-featured__poster {
  width: 160px;
  height: 240px;
  object-fit: cover;
  display: block;
  background: #222;
}
.kf-featured__title {
  font:
    700 13px/17px "Roboto Condensed",
    sans-serif;
  color: #fff;
  margin: 10px 0 2px;
  text-transform: uppercase;
}
.kf-featured__kind {
  font:
    700 10px/14px "Roboto Condensed",
    sans-serif;
  color: var(--kf-yellow);
  margin: 0;
  letter-spacing: 1px;
  text-transform: uppercase;
}
.kf-featured__rights {
  font:
    400 11px/16px "Roboto",
    sans-serif;
  color: var(--kf-mute);
  margin-top: 18px;
}
/* A <ul> now, because that is what UIkit's filter controls bind to — so the list styling has to go
   or the markers sit between the pills. */
.kf-featured__filter {
  display: flex;
  gap: 10px;
  margin-top: 18px;
  list-style: none;
  padding: 0;
}
.kf-featured__filter > li {
  margin: 0;
  list-style: none;
}
.kf-pill {
  border: 1px solid rgba(255, 255, 255, 0.35);
  background: none;
  color: #fff;
  cursor: pointer;
  border-radius: 30px;
  padding: 8px 20px;
  font:
    700 13px/1 "Roboto Condensed",
    sans-serif;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
/* UIkit marks the selected control with `uk-active` on the LI, not with a class on the button, so
   the filled state hangs off the parent. `.is-on` is kept for the hand-rolled pills elsewhere. */
.kf-pill.is-on,
.kf-featured__filter > li.uk-active > .kf-pill {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
.kf-pill:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 2px;
}

.kf-arrivals__rail a {
  text-decoration: none;
}
/* Section headers STACK — eyebrow, then heading, then deck. This was a flex row so a CTA could sit
   opposite the heading, but it caught the eyebrow and deck too and laid all three side by side.
   The CTA is positioned on its own instead. */
.kf-arrivals__head,
.kf-featured__head,
.kf-onset__head,
.kf-follow__head {
  display: block;
  position: relative;
}
.kf-arrivals__head > .kf-btn,
.kf-featured__head > .kf-btn,
.kf-onset__head > .kf-btn,
.kf-follow__head > .kf-btn,
.kf-arrivals__head > .uk-button,
.kf-featured__head > .uk-button,
.kf-onset__head > .uk-button,
.kf-follow__head > .uk-button,
.kf-follow__head > .kf-link {
  position: absolute;
  right: 0;
  bottom: 0;
}
@media (max-width: 639px) {
  .kf-arrivals__head > .uk-button,
  .kf-featured__head > .uk-button,
  .kf-onset__head > .uk-button,
  .kf-follow__head > .kf-link {
    position: static;
    margin-top: 16px;
  }
}

/* ---- on set: one lead plus three ---------------------------------------- */
.kf-onset__grid {
  display: grid;
  gap: 20px;
  grid-template-columns: 1fr;
  margin-top: 24px;
}
.kf-onset__card {
  text-decoration: none;
  display: block;
}
.kf-onset__media {
  display: block;
  aspect-ratio: 16/9;
  background: #eee center/cover no-repeat;
  margin-bottom: 10px;
}
.kf-onset__meta {
  font:
    700 11px/15px "Roboto Condensed",
    sans-serif;
  color: var(--kf-mute);
  letter-spacing: 1.2px;
  text-transform: uppercase;
  display: block;
}
.kf-onset__title {
  font:
    700 18px/24px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  display: block;
}
@media (min-width: 960px) {
  .kf-onset__grid {
    grid-template-columns: repeat(3, 1fr);
  }
  .kf-onset__card--lead {
    grid-column: span 3;
  }
  .kf-onset__card--lead .kf-onset__media {
    aspect-ratio: 21/9;
  }
  .kf-onset__card--lead .kf-onset__title {
    font-size: 26px;
    line-height: 32px;
  }
}

/* ---- signup form --------------------------------------------------------
   Figma 635:183 "Signup media — 6 · Editorial split".

   THE FIELD IS THE ROW, NOT THE INPUT. The design draws ONE white 524x56 rectangle at radius 4
   with the Sign Up pill sitting INSIDE it, inset 6px from the right and vertically centred. The
   build had a fully-rounded white input with the pill floating beside it — a different component
   that happens to contain the same two controls.

   The markup does not change: it stays a real labelled <input type="email" required> plus a
   submit button. Only the painting moves from the input up to the form, so the field reads as one
   object while the tab order and the accessible name stay exactly as they were. */
.kf-signup__row {
  display: flex;
  align-items: center;
  width: 524px;
  max-width: 100%;
  height: 56px;
  /* the theme does not border-box a <form>, so without this the 6px padding was added to the
     524x56 and the field measured 536x68 */
  box-sizing: border-box;
  /* 56 - 44 (button) = 12, so 6 top and bottom — and the same 6 at the right, which is the
     design's inset from the field edge to the pill */
  padding: 6px;
  background: #fff;
  /* CONCENTRIC WITH THE BUTTON, not the design's 4px. The Sign Up button is a 44px-tall pill —
     an effective radius of 22 — inset 6px from the field edge, so the field's outer radius has to
     be 22 + 6 = 28 for the two curves to run parallel. At 4px the design had a nearly square box
     with a fully round pill inside it, and the corners visibly disagreed.
     Stated as 100px rather than 28 so it stays a pill if the field's height ever changes; at 56px
     tall the rendered result is identical. */
  border-radius: 100px;
}
.kf-signup__input {
  flex: 1 1 auto;
  min-width: 0;
  height: 44px;
  border: 0;
  background: transparent;
  border-radius: 0;
  padding: 0 12px 0 18px; /* 6 row padding + 18 = the design's 24px text inset */
  color: #212c34;
  font:
    400 14px/18px "Roboto",
    sans-serif;
}
.kf-signup__input::placeholder {
  color: #212c34;
  opacity: 1; /* Firefox dims placeholders by default, which would miss the design's value */
}
/* Focus is shown on the FIELD, not the input: the input no longer has an edge of its own, so an
   outline on it would draw a rectangle floating inside the white one. */
.kf-signup__row:focus-within {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 2px;
}
.kf-signup__input:focus,
.kf-signup__input:focus-visible {
  outline: none;
}
.kf-signup__btn {
  flex: 0 0 150px;
  height: 44px;
  padding: 0;
  /* .kf-btn ships `margin: 0 12px 12px 0` and `padding: 15px 30px`, which is what pushed the pill
     outside the field and made it 113x49 instead of 150x44 */
  margin: 0;
  border: 0;
  border-radius: 30px;
  cursor: pointer;
  font:
    700 15px/20px "Roboto Condensed",
    sans-serif;
  text-transform: none; /* the design's label is "Sign Up", not "SIGN UP" */
  letter-spacing: 0;
}
.kf-signup .kf-signup__note {
  font-size: 12px;
  line-height: 16px;
  color: var(--kf-mute);
}

.kf-follow__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  list-style: none;
  margin: 24px 0 0;
  padding: 0;
}
.kf-follow__grid img {
  width: 100%;
  height: auto;
  aspect-ratio: 1;
  object-fit: cover;
  display: block;
}
@media (min-width: 960px) {
  .kf-follow__grid {
    grid-template-columns: repeat(8, 1fr);
  }
}

/* ---- dealer map --------------------------------------------------------- */
.kf-map__plate {
  height: 380px;
  background: #eef0f2 center/cover no-repeat;
}
.kf-map__note,
.kf-map__attr {
  font:
    400 12px/17px "Roboto",
    sans-serif;
  color: var(--kf-mute);
  margin: 8px 0 0;
}
.kf-map__attr {
  font-size: 11px;
}

.kf-link {
  font:
    700 14px/19px "Roboto Condensed",
    sans-serif;
  color: #212c34;
  text-decoration: none;
}
.kf-link--onDark {
  color: var(--kf-yellow);
}

/* ---- hero: plate on the section, scrim as a pseudo-element -----------------
   The native-element hero has no media div to paint into, so the section carries the image and a
   ::before carries the gradient. That keeps the markup Builder-editable — an editor changes the
   headline and buttons without touching a background they cannot see. */
.kf-hero {
  position: relative;
  /* The background IMAGE is the section's own `image` prop, set in the Builder — it used to be
     hardcoded here, which is exactly why nobody could change it from the editor. Only the ink
     fallback stays, so the hero is still readable if the image is removed or fails to load. */
  background-color: #161616;
  min-height: 640px;
  display: flex;
  align-items: center;
}
/* The hero is a flex container, so its child — the wrapper YOOtheme paints the section image onto —
   sizes to its CONTENT and the photograph rendered 550px wide inside a 1440px band. It has to
   stretch to the full box for `uk-background-cover` to mean anything. This did not matter while the
   image was hardcoded on .kf-hero itself; it does now that the background lives on the child. */
.kf-hero > * {
  position: relative;
  z-index: 1;
  flex: 1 1 100%;
  width: 100%;
  align-self: stretch;
}
/* ...and the scrim has to sit ABOVE that child's background but below the copy, which the child's
   own z-index:1 would otherwise win. Raising the text instead keeps the stack honest:
   image (child bg) < scrim (::before) < content. */
.kf-hero > * > * {
  position: relative;
  z-index: 1;
}
.kf-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(
    90deg,
    rgba(13, 13, 13, 0.92) 0%,
    rgba(13, 13, 13, 0.66) 48%,
    rgba(13, 13, 13, 0.3) 100%
  );
}
.kf-hero h1 {
  font:
    700 clamp(40px, 5vw, 72px)/1.08 "Roboto Condensed",
    sans-serif;
  margin: 0 0 26px;
}
.kf-hero .uk-container {
  padding-block: 110px;
}
@media (max-width: 959px) {
  .kf-hero {
  }
}

/* ============================================================================
   Beating the theme, deliberately and narrowly.

   Two things the first pass got wrong, both measured rather than guessed:

   1. Sections were emitted with style="secondary", which adds .uk-section-secondary. Its
      background-color has the same specificity as .kf-hero and the theme stylesheet loads later, so
      every dark band computed to #58595B instead of #161616 and the hero's background-image was
      dropped wholesale. Sections are now style="default"; these rules paint the grounds.

   2. A native button_item renders `.uk-button.uk-button-primary` and does NOT carry a custom class,
      so every .kf-btn rule missed. The theme's own primary is #FEDD00 with a WHITE label — about
      1.9:1, a WCAG failure that ships site-wide. Scoped here to ink-on-yellow.
   ========================================================================= */

.kf-sec.kf-hero,
.kf-sec.kf-story,
.kf-sec.kf-why,
.kf-sec.kf-featured,
.kf-sec.kf-follow {
  background-color: var(--kf-ink);
}

.kf-sec.kf-hero {
}
@media (max-width: 959px) {
  .kf-sec.kf-hero {
  }
}

.kf-sec.kf-campaigns,
.kf-sec.kf-buyrent,
.kf-sec.kf-owners,
.kf-sec.kf-arrivals,
.kf-sec.kf-signup {
  background-color: #fff;
}
.kf-sec.kf-marquee,
.kf-sec.kf-series,
.kf-sec.kf-onset {
  background-color: #fff;
}

/* buttons: the design is a 30px pill, #FED208, ink label, Roboto Condensed Bold */
.kf-sec .uk-button {
  border-radius: 30px;
  border: 1px solid transparent;
  font:
    700 15px/1 "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.4px;
  text-transform: uppercase;
  padding: 0 30px;
  height: 48px;
  line-height: 48px;
}
.kf-sec .uk-button-primary {
  background-color: var(--kf-yellow);
  color: var(--kf-ink);
}
.kf-sec .uk-button-primary:hover {
  background-color: #e9c007;
  color: var(--kf-ink);
}
/* the design's secondary is a ghost pill on dark, not an underlined text link */
.kf-sec .uk-button-text {
  background: transparent;
  color: #fff;
  border-color: rgba(255, 255, 255, 0.55);
  text-decoration: none;
}
.kf-sec .uk-button-text::before {
  display: none;
}
.kf-sec.kf-campaigns .uk-button-text,
.kf-sec.kf-owners .uk-button-text,
.kf-sec.kf-buyrent .uk-button-text {
  color: #212c34;
  border-color: transparent;
  padding: 0;
  height: auto;
  line-height: 1.4;
  text-transform: none;
}

/* eyebrows are yellow on dark, grey on light — the design's treatment, missing entirely before */
.kf-hero .kf-eyebrow,
.kf-story .kf-eyebrow,
.kf-why .kf-eyebrow,
.kf-featured .kf-eyebrow,
.kf-follow .kf-eyebrow {
  color: var(--kf-yellow) !important;
}
.kf-campaigns .kf-eyebrow,
.kf-series .kf-eyebrow,
.kf-arrivals .kf-eyebrow,
.kf-buyrent .kf-eyebrow,
.kf-owners .kf-eyebrow,
.kf-signup .kf-eyebrow {
  color: var(--kf-mute) !important;
}
.kf-eyebrow {
  font:
    700 11px/14px "Roboto Condensed",
    sans-serif !important;
  letter-spacing: 1.8px;
  text-transform: uppercase;
}

/* ============================================================================
   Sections rebuilt against the design (second pass, after the fidelity audit).
   ========================================================================= */

/* ---- hero: the two-tone headline is the section ------------------------- */
.kf-display__a,
.kf-display__b {
  display: block;
}
.kf-display__b {
  color: var(--kf-yellow);
}
.kf-hero__sub {
  max-width: 470px; /* the design constrains the text column; full-bleed copy
                                         over an image reads as a mistake */
  font:
    400 18px/28px "Roboto",
    sans-serif;
  color: #b9b9b9;
}
.kf-hero .uk-container > .uk-grid > * {
  max-width: 780px;
}

/* ---- why: pull-quote card + icon grid ----------------------------------- */


/* ---- arrivals: product wells with the NEW badge ------------------------- */

/* ---- on set: featured split then three ---------------------------------- */
.kf-onset__meta {
  font:
    700 11px/15px "Roboto Condensed",
    sans-serif;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--kf-mute);
}
.kf-onset__lead-title {
  font:
    700 30px/38px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 6px 0 12px;
}
.kf-onset__title {
  font:
    700 16px/22px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 4px 0 0;
}

/* ---- follow: MEET US beside FOLLOW US ----------------------------------- */
.kf-events {
  list-style: none;
  margin: 0;
  padding: 0;
}
.kf-event {
  display: flex;
  gap: 22px;
  padding: 18px 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.14);
}
.kf-event__when {
  flex: 0 0 96px;
  font:
    700 12px/20px "Roboto Condensed",
    sans-serif;
  letter-spacing: 1px;
  color: var(--kf-yellow);
}
.kf-event__what {
  font:
    400 13px/20px "Roboto",
    sans-serif;
  color: var(--kf-onDark-mute);
}
.kf-event__what b {
  font:
    700 17px/24px "Roboto Condensed",
    sans-serif;
  color: #fff;
}
.kf-follow__line {
  font:
    400 13px/20px "Roboto",
    sans-serif;
  color: var(--kf-onDark-mute);
}
.kf-follow__feed .kf-follow__grid {
  grid-template-columns: repeat(4, 1fr);
}

/* ---- campaigns: cards read as cards, not stacked text ------------------- */
.kf-card__img img {
  aspect-ratio: 649/380;
  object-fit: cover;
  width: 100%;
}
.kf-card__meta {
  font:
    700 11px/15px "Roboto Condensed",
    sans-serif;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--kf-mute);
  margin-top: 12px;
}
.kf-card__title {
  font:
    700 24px/32px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
}
.kf-owners__img img,
.kf-story__img img {
  width: 100%;
  height: auto;
}

/* ============================================================================
   Rail chrome — arrows and progress. Injected by kf-home.js, styled here.
   ========================================================================= */
.kf-rail {
  position: relative;
}
.kf-rail.is-static .kf-rail__nav,
.kf-rail.is-static .kf-rail__progress {
  display: none;
} /* nothing to scroll, no chrome */

.kf-rail__nav {
  position: absolute;
  top: -62px;
  right: 0;
  display: flex;
  gap: 10px;
}
.kf-rail__btn {
  width: 46px;
  height: 46px;
  border-radius: 50%;
  cursor: pointer;
  background: transparent;
  color: currentColor;
  border: 1px solid currentColor;
  font:
    400 22px/1 "Roboto",
    sans-serif;
  display: flex;
  align-items: center;
  justify-content: center;
  transition:
    background-color 0.15s ease,
    color 0.15s ease,
    opacity 0.15s ease;
}
.kf-rail__btn:hover:not(:disabled) {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
/* disabled, not hidden: an end-stop that vanishes makes the row jump */
.kf-rail__btn:disabled {
  opacity: 0.3;
  cursor: default;
}

.kf-rail__progress {
  position: relative;
  height: 4px;
  border-radius: 2px;
  margin-top: 22px;
  overflow: hidden;
  background: rgba(0, 0, 0, 0.12);
}
.kf-rail__progress > span {
  position: absolute;
  inset-block: 0;
  left: 0;
  display: block;
  background: var(--kf-yellow);
  border-radius: 2px;
  transition: transform 0.18s ease;
}
/* on dark grounds the track has to lift off the background, not sink into it */
.kf-featured .kf-rail__progress,
.kf-follow .kf-rail__progress {
  background: rgba(255, 255, 255, 0.18);
}

/* the rail itself keeps its own scrollbar hidden — the progress bar is the affordance */
.kf-featured__rail,
.kf-series__rail,
.kf-arrivals__rail {
  scrollbar-width: none;
}
.kf-featured__rail::-webkit-scrollbar,
.kf-series__rail::-webkit-scrollbar,
.kf-arrivals__rail::-webkit-scrollbar {
  display: none;
}
[data-kf-rail-ready]:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 4px;
}

/* campaigns: the design is a carousel, so let the native grid scroll horizontally and give the
   columns a real width. The columns stay native elements, so the section is still Builder-editable. */
@media (min-width: 960px) {
  .kf-campaigns .uk-grid:not(.uk-slider-items) {
    flex-wrap: nowrap;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
  }
  .kf-campaigns .uk-grid:not(.uk-slider-items)::-webkit-scrollbar {
    display: none;
  }
  .kf-campaigns .uk-grid:not(.uk-slider-items) > * {
    flex: 0 0 auto;
    width: 560px;
    scroll-snap-align: start;
  }
}
.kf-campaigns .kf-rail__btn {
  color: var(--kf-ink);
}
.kf-arrivals .kf-rail__btn,
.kf-series .kf-rail__btn {
  color: var(--kf-ink);
}
.kf-featured .kf-rail__btn {
  color: #fff;
}

/* ---- events (CPT-driven) ------------------------------------------------ */
.kf-event__row {
  display: flex;
  gap: 22px;
  text-decoration: none;
  color: inherit;
}
a.kf-event__row:hover .kf-event__what b {
  color: var(--kf-yellow);
}
a.kf-event__row:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 4px;
}
.kf-events__empty {
  font:
    400 15px/24px "Roboto",
    sans-serif;
  color: var(--kf-onDark-mute);
}

/* ============================================================================
   SYSTEMIC PASS — after the second fidelity audit.

   Two findings cascaded into a dozen others, so they are fixed at the root here
   rather than section by section.

   1. MEASURE. The design puts content at x=120 in a 1600 frame — a 1360 measure with 120px
      gutters. The build inherited the theme chrome's 40px padding, making every section 160px
      wider than drawn, which is what pushed card sizes and section heights out across the page.
      Note the tension this creates: the theme header and footer run to a 40px gutter, so page
      content is now narrower than the chrome around it. The design specifies 1360, and the chrome
      itself does not match the design either — that is a separate, global decision.

   2. GROUND SCOPING. Colour was applied by element, not by the ground it sits on, so the light
      body colour landed on the dark hero (1.93:1, unreadable) and the on-dark ghost button landed
      on a white section (white on white, invisible). Colours are now scoped to the band.
   ========================================================================= */

/* `> * > .uk-container` as well as `> .uk-container`: the moment a section is given a background
   IMAGE in the Builder, YOOtheme wraps its contents in a `.uk-background-*` div and the container
   stops being a direct child. A `>` selector then silently stops matching and the band loses its
   measure — the hero's copy jumped 7px left and lost its vertical centring the first time the hero
   image was moved out of CSS and into the Builder. kf-about.css already pairs its selectors this
   way for the same reason. */
.kf-sec > .uk-container,
.kf-sec > * > .uk-container {
  max-width: 1360px;
  padding-inline: 0;
  margin-inline: auto;
}
@media (max-width: 1439px) {
  .kf-sec > .uk-container,
  .kf-sec > * > .uk-container {
    max-width: none;
    padding-inline: 40px;
  }
}

/* type scale: this design is 36/44 for section headings and 42/55 for the hero — NOT the 40/48
   carried over from the v5 page. Measured off the Arrivals heading and the hero H1. */
.kf-h2,
.kf-sec h2 {
  font-size: 36px;
  line-height: 44px;
}
.kf-display {
  font-size: 42px;
  line-height: 55px;
}
@media (max-width: 959px) {
  .kf-display {
    font-size: 34px;
    line-height: 42px;
  }
}

/* light-section headings are #161616, not the slate that crept in */
.kf-sec:not(.kf-hero):not(.kf-story):not(.kf-why):not(.kf-featured):not(
    .kf-follow
  )
  .kf-h2,
.kf-sec:not(.kf-hero):not(.kf-story):not(.kf-why):not(.kf-featured):not(
    .kf-follow
  )
  h2 {
  color: var(--kf-ink);
}

/* --- ground-scoped body + control colour ------------------------------- */
/* dark bands */
.kf-hero p,
.kf-story p,
.kf-why p,
.kf-featured p,
.kf-follow p {
  color: var(--kf-onDark-mute);
}
.kf-hero__sub {
  font-size: 18px;
  line-height: 28px;
}
.kf-hero__sub,
.kf-hero__sub p {
  color: #b9b9b9;
} /* 10.5:1 on the hero plate */

/* the ghost pill belongs to dark bands ONLY; on light it was white-on-white */
.kf-sec:not(.kf-hero):not(.kf-story):not(.kf-why):not(.kf-featured):not(
    .kf-follow
  )
  .uk-button-text {
  background: none;
  border: 0;
  padding: 0;
  height: auto;
  line-height: 1.4;
  color: var(--kf-ink);
  text-transform: none;
  letter-spacing: 0;
  font:
    700 15px/1.4 "Roboto Condensed",
    sans-serif;
}
.kf-sec:not(.kf-hero):not(.kf-story):not(.kf-why):not(.kf-featured):not(
    .kf-follow
  )
  .uk-button-text::after {
  content: "  \2192";
}

/* the design's text links are ink with an arrow, not mustard */
.kf-link,
.kf-sec .uk-button-text {
  color: var(--kf-ink);
}
.kf-featured .kf-link,
.kf-follow .kf-link,
.kf-story .kf-link {
  color: #fff;
}

/* series: the raw term count is CMS bookkeeping, not content */

/* featured poster labels: white title, yellow kind */
.kf-featured__title {
  color: #fff;
}
.kf-featured__kind {
  color: var(--kf-yellow);
}

/* --- specificity corrections ------------------------------------------------
   Three rules above lost to earlier, more specific selectors. Raising them
   deliberately rather than sprinkling !important:
     .kf-hero h1  (0,1,1) beat .kf-display (0,1,0), so the clamp() kept winning.
     .kf-sec p    (0,1,1) beat .kf-hero__sub (0,1,0) — the copy is in a child <p>.
   ------------------------------------------------------------------------- */
.kf-hero h1.kf-display {
  font-size: 42px;
  line-height: 55px;
}
@media (max-width: 959px) {
  .kf-hero h1.kf-display {
    font-size: 34px;
    line-height: 42px;
  }
}

.kf-hero .kf-hero__sub p,
.kf-hero p.kf-hero__sub {
  font-size: 18px;
  line-height: 28px;
  color: #b9b9b9;
}

.kf-series

/* ============================================================================
   HERO — final. The supplied asset (Section/Hero.png, 1600x640) is already the
   composite: solid black on the left, photograph on the right, feathered at the
   seam exactly as the design draws it. So there is no CSS split to build and no
   scrim to apply — a scrim over this would only mud the right-hand photo.
   .tm-page caps at 1600, so the image sits 1:1 and is never upscaled.
   ========================================================================= */
.kf-sec.kf-hero {
}
.kf-hero::before {
  content: none;
} /* the asset carries its own darkness */
.kf-hero .uk-container > .uk-grid > * {
  max-width: 640px;
} /* copy stays clear of the seam */

/* the design's secondary is a SOLID dark pill, not an outlined ghost */
.kf-hero .uk-button-text {
  background-color: #2e2e2e;
  border: 0;
  color: #fff;
}
.kf-hero .uk-button-text:hover {
  background-color: #3a3a3a;
  color: #fff;
}

/* labels are Title Case as authored, tracked 0.6 — not uppercased in CSS */
.kf-sec .uk-button {
  text-transform: none;
  letter-spacing: 0.6px;
}

/* ---- hero: centre the copy block, don't pin it with fixed padding ---------
   110px top padding put the content 110 above / 208 below in a 640 band. The design sits it
   roughly centred (166 / 179), so centre it and let the block find its own middle — which also
   survives the copy growing or shrinking. */
/* Centring the CONTAINER does nothing — it stretches to the section's full height, so the copy
   still sits at its top edge. Centre the content INSIDE the container instead. */
.kf-hero > .uk-container,
.kf-hero > * > .uk-container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 640px;
  padding-block: 0;
}

/* ============================================================================
   Corner radii, per the updated design.

   The pattern is consistent and worth stating: a split pair rounds only its OUTER corners
   (TL/BL on the left half, TR/BR on the right) so the seam where the two halves meet stays flush.
   Standalone tiles get 4px all round. Buttons stay pills at 30.
   ========================================================================= */
.kf-signup__img img {
  border-radius: 4px 0 0 4px;
}
.kf-onset__panel,
.kf-signup__panel {
  border-radius: 0 4px 4px 0;
}

.kf-onset__img img,
.kf-follow__grid img,
.kf-arrivals__img,
.kf-card__img img {
  border-radius: 4px;
}

/* the design backs On Set's lead copy with an #F2F2F2 panel; without it the split reads as two
   unrelated halves rather than one card */
.kf-onset .uk-grid > :nth-child(2) {
  background: #f2f2f2;
  border-radius: 0 4px 4px 0;
}
.kf-onset .uk-grid > :nth-child(2) > * {
  padding-inline: 44px;
}

/* signup is a DARK panel inset in a light band — the build had this inverted */
/* DELIBERATE DEVIATION FROM THE DESIGN. Figma gives this band #f2f2f2, but that value appears
   exactly once across fifteen bands — every other light ground on the page is #f9f9f9 (Campaigns,
   Arrivals, Buy & Rent, Owners) or #ffffff (Marquee, Series, On Set). A fifth ground used a single
   time is a slip in the file, not a token, and it reads as a dirty grey next to the white On Set
   band directly above it. Matched to the family instead. */
.kf-sec.kf-signup {
  background-color: #fff;
}
.kf-signup .kf-eyebrow {
  color: var(--kf-yellow) !important;
}
.kf-signup .kf-h2,
.kf-signup h2 {
  color: #fff !important;
}
.kf-signup .kf-deck,
.kf-signup .kf-deck p {
  color: var(--kf-onDark-mute) !important;
}
/* the note is one step quieter than the deck in the design — #717275 against the deck's #a1a2a4 */
.kf-signup__note {
  color: var(--kf-mute) !important;
}

/* ---- campaign tiles: text sits ON the image, per the design ------------- */
.kf-tile {
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  text-align: left;
  cursor: pointer;
  color: inherit;
  font: inherit;
}
a.kf-tile,
div.kf-tile {
  cursor: auto;
  text-decoration: none;
}
a.kf-tile {
  cursor: pointer;
}
.kf-tile__media {
  position: relative;
  display: block;
  border-radius: 4px;
  overflow: hidden;
}
.kf-tile__media img {
  display: block;
  width: 100%;
  aspect-ratio: 649/380;
  object-fit: cover;
}
.kf-tile__scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.05) 40%,
    rgba(0, 0, 0, 0.78) 100%
  );
}
.kf-tile__text {
  position: absolute;
  left: 28px;
  right: 28px;
  bottom: 24px;
  display: block;
}
.kf-tile__meta {
  display: block;
  margin-bottom: 6px;
}
.kf-tile__date {
  font:
    700 11px/15px "Roboto Condensed",
    sans-serif;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: #d3d4d5;
}
.kf-tile__product {
  font:
    700 11px/15px "Roboto Condensed",
    sans-serif;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--kf-yellow);
  margin-left: 10px;
}
.kf-tile__title {
  display: block;
  font:
    700 24px/32px "Roboto Condensed",
    sans-serif;
  color: #fff;
  text-transform: uppercase;
}
.kf-tile__play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 64px;
  height: 64px;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, 0.85);
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  transition:
    background-color 0.15s ease,
    color 0.15s ease,
    transform 0.15s ease;
}
.kf-tile__play svg {
  width: 30px;
  height: 30px;
}
.kf-tile--video:hover .kf-tile__play {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
.kf-tile:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
  .kf-tile__play {
    transition: none;
  }
}

/* ---- modal -------------------------------------------------------------- */
html.kf-modal-open {
  overflow: hidden;
}
.kf-modal {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: flex;
  align-items: center;
  justify-content: center;
}
.kf-modal[hidden] {
  display: none;
}
.kf-modal__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(8, 8, 8, 0.88);
}
.kf-modal__box {
  position: relative;
  width: min(1120px, 92vw);
}
.kf-modal__frame {
  position: relative;
  aspect-ratio: 16/9;
  background: #000;
  border-radius: 4px;
  overflow: hidden;
}
.kf-modal__frame iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}
.kf-modal__close {
  position: absolute;
  top: -48px;
  right: 0;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.5);
  background: none;
  color: #fff;
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
}
.kf-modal__close:hover {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
.kf-modal__close:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}

/* ---- Our Story: media bleeds left, copy respects the right margin --------
   The design puts the media at x=0 (full-bleed off the left page edge) at 800x524, with the copy
   column starting at x=880 and ending at 1480 — so the two halves follow different rules and the
   section cannot use the shared centred container. Height comes from the media, not padding. */
.kf-sec.kf-story > .uk-container {
  max-width: none;
  padding: 0;
}
.kf-story .uk-grid {
  margin: 0;
  align-items: stretch;
}
.kf-story .uk-grid > * {
  padding: 0;
}

/* The media half is now a video fill, but the element also renders an <img> poster before play
   and whenever the reel is swapped back for a still — so both tags get the same box. */
.kf-story__media,
.kf-story__media img,
.kf-story__media video {
  height: 100%;
}
.kf-story__media img,
.kf-story__media video {
  width: 100%;
  object-fit: cover;
  display: block;
  min-height: 524px;
}
/* the native video element wraps its child in `uk-flex-1 uk-flex`, which shrink-wraps without this */
.kf-story__media {
  display: block;
  width: 100%;
}

/* Someone who has asked their OS to reduce motion should get the poster frame, not a looping reel.
   `autoplay` is an attribute, not a style, so CSS cannot stop it — the pause is done in kf-home.js;
   this only makes sure the poster is what they see. */
@media (prefers-reduced-motion: reduce) {
  .kf-story__media video {
    background-size: cover;
    background-position: center;
  }
}

.kf-story .uk-grid > :nth-child(2) {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 60px 120px 60px 80px; /* 880 - 800 = 80 left, 1600 - 1480 = 120 right */
}
.kf-story .uk-grid > :nth-child(2) > * {
  max-width: 600px;
}

/* 40/48 here, not the 36/44 section default. Qualified with h2 so it beats `.kf-sec h2` (0,1,1) —
   the third time an unqualified class has lost to that selector, so it is written the long way. */
.kf-story h2.kf-story__head {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  margin: 0 0 18px;
}
.kf-story__a,
.kf-story__b {
  display: block;
}
.kf-story__a {
  color: #fff;
}
.kf-story__b {
  color: var(--kf-yellow);
}
/* body is pure white in the design, not the muted on-dark grey used elsewhere */
.kf-story__body,
.kf-story__body p {
  font:
    400 17px/28px "Roboto",
    sans-serif;
  color: #fff;
}

@media (max-width: 959px) {
  .kf-story .uk-grid > :nth-child(2) {
    padding: 44px 24px;
  }
  .kf-story__media img,
  .kf-story__media video {
    min-height: 320px;
  }
  .kf-story__head {
    font-size: 30px;
    line-height: 38px;
  }
}

/* ---- Signup: pinned to the design's own geometry -------------------------
   Was inheriting the Our Story / On Set split rules and blowing out to 711px in a 450px band.
   The design is explicit: a 1360 centred block at x=120, split 620 (photo) / 740 (panel), both
   390 tall, inside a 450 band — so 30px of band above and below. Written out rather than derived
   from a shared 50/50, because 620/740 is not a half. */
/* the band's 30px sits on the container: the section carries uk-padding-remove-vertical,
   whose !important cannot be beaten without matching it, and the visual result is identical */
.kf-sec.kf-signup > .uk-container {
  max-width: 1360px;
  margin-inline: auto;
  padding: 30px 0;
}
.kf-signup .uk-grid {
  margin: 0;
  align-items: stretch;
}
.kf-signup .uk-grid > * {
  padding: 0;
}
.kf-signup .uk-grid > :nth-child(1) {
  width: 45.588%;
} /* 620 / 1360 */
.kf-signup .uk-grid > :nth-child(2) {
  width: 54.412%;
} /* 740 / 1360 */

.kf-signup__img,
.kf-signup__img img {
  height: 100%;
}
.kf-signup__img img {
  width: 100%;
  height: 390px;
  object-fit: cover;
  display: block;
}

.kf-signup .uk-grid > :nth-child(2) {
  background: var(--kf-ink);
  border-radius: 0 4px 4px 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 390px;
  padding: 0 60px;
}
/* The design's content column is 524 wide inside a 740 panel: left-aligned at 60, right edge left
   ragged. Without the cap the copy and the field stretched to the full 628 of panel width. */
.kf-signup .uk-grid > :nth-child(2) > * {
  max-width: 524px;
  width: 100%;
  /* YOOtheme puts `uk-margin` on these wrappers and `* + .uk-margin { margin-top: 20px !important }`
     cannot be beaten on specificity — it was adding 20px above the head, the field and the note,
     making the block 55px taller than the design and pushing every element off its y-position. The
     spacing below is carried entirely by each element's own margin-bottom. */
  margin-top: 0 !important;
}
/* the panel has 390px to hold five things, so the internal rhythm is tighter than elsewhere */
/* Gaps are the differences between the Figma y-positions, not round numbers:
   eyebrow 99 (h14) · head 121 (h40) · sub 166 (h24) · field 205 (h56) · note 275 (h16) */
.kf-signup .kf-eyebrow {
  margin-bottom: 8px;
  letter-spacing: 1.6px; /* the global eyebrow is 1.8; this band is 1.6 */
}
.kf-signup h2 {
  margin: 0 0 5px;
  font:
    700 32px/40px "Roboto Condensed",
    sans-serif;
}
/* The gap belongs to the wrapper only. Setting it on both the deck and its <p> applied it twice —
   the margins do not collapse through the panel — and the field sat 15px low. */
.kf-signup .kf-deck {
  margin: 0 0 15px;
}
.kf-signup .kf-deck p {
  margin: 0;
}
.kf-signup .kf-deck,
.kf-signup .kf-deck p {
  font-size: 15px;
  line-height: 24px;
}
.kf-signup__note {
  margin: 14px 0 0;
  font-size: 12px;
  line-height: 16px;
}
.kf-signup .kf-signup__row {
  margin: 0;
}

@media (max-width: 959px) {
  .kf-signup .uk-grid > :nth-child(1),
  .kf-signup .uk-grid > :nth-child(2) {
    width: 100%;
  }
  .kf-signup .uk-grid > :nth-child(2) {
    border-radius: 0 0 4px 4px;
    padding: 32px 24px;
    min-height: 0;
  }
  .kf-signup__img img {
    height: 220px;
    border-radius: 4px 4px 0 0;
  }
  /* the field is a fixed 524 at desktop; on a stacked panel it takes the column */
  .kf-signup__row {
    width: 100%;
  }
}

/* ===== Products / Series band ============================================
   Design: node 600:8282 — 1600x447 on white.
     eyebrow y60 · heading y86 (40/48) · toggle 322x42 at x342 · "All Products" flush right
     rail y170, tiles 282x175 r6 with the name and descriptor sitting ON the photograph
     edge fades over the page margins · progress 1360x10 at y375

   The rail is full-bleed while the header keeps the 1360 measure, because the design lets the tiles
   run off both page edges. `calc(50% - 680px)` is the distance from the page edge to the container
   edge (680 = half of 1360) — it aligns the first tile with the heading above it, sizes the fades to
   exactly the page margin, and stays correct at any width without a breakpoint per size. A
   PERCENTAGE, not 50vw: the theme caps .tm-page at 1600 inside the window, so a viewport-relative
   figure measures from the wrong edge and pushes the first tile clear of the heading. */

.kf-sec.kf-series > .uk-container {
  max-width: none;
  padding: 60px 0 62px;
}
.kf-series__band {
  position: relative;
}

/* ---- header row -------------------------------------------------------- */
.kf-series__head {
  max-width: 1360px;
  margin: 0 auto 36px;
  padding: 0;
  display: grid;
  grid-template-columns: auto auto 1fr;
  align-items: end;
  column-gap: 44px;
}
.kf-series__title {
  min-width: 0;
}
.kf-series .kf-series__head .kf-eyebrow {
  margin: 0 0 13px;
}
.kf-series .kf-series__head h2.kf-h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0;
}
.kf-series__all {
  justify-self: end;
  white-space: nowrap;
  text-decoration: none;
  margin-bottom: 12px;
  font:
    700 14px/17px "Roboto",
    sans-serif;
  color: #111;
}
.kf-series__all::after {
  content: "  \2192";
}
.kf-series__all:hover {
  color: var(--kf-ink-3);
}

/* ---- toggle ------------------------------------------------------------ */
.kf-series__toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0;
  background: #f2f2f2;
  border-radius: 100px;
  padding: 4px;
  height: 42px;
  justify-self: start;
  box-sizing: border-box;
  margin-bottom: 0;
}
/* One sliding pill rather than a background on each button: the moving thumb is what makes the two
   options read as a single control, and it means only one element carries the yellow. */
.kf-series__thumb {
  position: absolute;
  top: 4px;
  left: 4px;
  height: 34px;
  width: 150px;
  background: var(--kf-yellow);
  border-radius: 100px;
  transition:
    transform 0.22s ease,
    width 0.22s ease;
}
.kf-series__opt {
  position: relative;
  z-index: 1;
  border: 0;
  background: none;
  cursor: pointer;
  font:
    700 13px/16px "Roboto",
    sans-serif;
  color: #212c34;
  padding: 9px 0;
  text-align: center;
  width: 150px;
}
.kf-series__opt:nth-of-type(2) {
  width: 160px;
}
.kf-series__opt:focus-visible {
  outline: 2px solid var(--kf-ink);
  outline-offset: 3px;
  border-radius: 100px;
}
@media (prefers-reduced-motion: reduce) {
  .kf-series__thumb {
    transition: none;
  }
}

/* ---- rail -------------------------------------------------------------- */
.kf-series__viewport {
  position: relative;
}
.kf-sec.kf-series .kf-series__rail {
  display: flex;
  gap: 15px;
  list-style: none;
  margin: 0;
  overflow-x: auto;
  padding-inline: max(24px, calc(50% - 680px));
  padding-block: 0;
  scroll-padding-inline-start: max(24px, calc(50% - 680px));
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
  scrollbar-width: none;
}
.kf-sec.kf-series .kf-series__rail::-webkit-scrollbar {
  display: none;
}
.kf-series__item {
  flex: 0 0 auto;
  width: 282px;
  scroll-snap-align: start;
}
.kf-series__tile {
  width: 282px;
}

/* The application panel holds four tiles against a 1360 measure, so at the series width they leave
   roughly 200px of dead space. `flex: 1 0 282px` lets them grow to share the row — (1360-45)/4 =
   328 each — while refusing to shrink below 282, so a fifth application would overflow into the
   same scrolling rail rather than squeezing all five. Height is deliberately unchanged: the toggle
   must not make the section jump. */
.kf-series__rail[data-panel="application"] .kf-series__item {
  flex: 1 0 282px;
  width: auto;
}
.kf-series__rail[data-panel="application"] .kf-series__tile {
  width: 100%;
}

.kf-series__tile {
  position: relative;
  display: block;
  height: 175px;
  border-radius: 6px;
  overflow: hidden;
  background: #1b1b1b;
  text-decoration: none;
}
.kf-series__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.4s ease;
}
a.kf-series__tile:hover .kf-series__img {
  transform: scale(1.04);
}
@media (prefers-reduced-motion: reduce) {
  .kf-series__img {
    transition: none;
  }
}

/* The name is yellow on photographs that range from a bright sunset to a black LED wall, so the
   scrim is not decoration — it is what keeps the type legible on every tile. Weighted to the foot,
   where the type sits. */
.kf-series__scrim {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.42) 0%,
    rgba(0, 0, 0, 0) 38%,
    rgba(0, 0, 0, 0.3) 58%,
    rgba(0, 0, 0, 0.78) 100%
  );
}
.kf-series__meta {
  position: absolute;
  left: 14px;
  right: 14px;
  bottom: 14px;
}
.kf-series__name {
  display: block;
  font:
    700 21px/26px "Roboto Condensed",
    sans-serif;
  color: var(--kf-yellow);
}
.kf-series__desc {
  display: block;
  font:
    400 14px/24px "Roboto",
    sans-serif;
  color: #fff;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.kf-series__badge {
  position: absolute;
  top: 14px;
  left: 14px;
  font:
    600 10px/15px "Roboto",
    sans-serif;
  letter-spacing: 0.85px;
  text-transform: uppercase;
  color: var(--kf-yellow);
}
a.kf-series__tile:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}

/* ---- edge fades -------------------------------------------------------- */
.kf-series__fade {
  position: absolute;
  top: 0;
  bottom: 0;
  width: max(24px, calc(50% - 680px));
  pointer-events: none;
  z-index: 2;
}
.kf-series__fade--l {
  left: 0;
  background: linear-gradient(90deg, #fff 45%, rgba(255, 255, 255, 0) 100%);
}
.kf-series__fade--r {
  right: 0;
  background: linear-gradient(270deg, #fff 45%, rgba(255, 255, 255, 0) 100%);
}

/* ---- progress + arrows ------------------------------------------------- */
/* The application panel's four tiles fill the measure, so that rail never scrolls and its progress
   bar is hidden — which made the whole band shrink 40px the moment someone hit the toggle. Reserve
   the bar's height so switching panels moves nothing below it. */
.kf-series .kf-rail.is-static {
  padding-bottom: 40px;
}

.kf-series .kf-rail__progress {
  max-width: 1360px;
  margin: 30px auto 0;
  height: 10px;
  border-radius: 100px;
  background: #f9f9f9;
}
.kf-series .kf-rail__progress > * {
  border-radius: 100px;
  background: var(--kf-yellow);
}
/* Series arrows overlay the rail at its two edges, not stacked in a corner.
   The shared `.kf-rail__nav` is a flex row pinned top-right, which is right for Campaigns (the
   design puts a pair above the heading there) but wrong here: it put both glyphs on the right, so
   the "back" arrow sat on the forward side. Here the nav becomes a transparent overlay and each
   button anchors to its own edge.
   Hiding a disabled arrow is safe in THIS rail specifically — they float above the tiles, so one
   disappearing shifts nothing. That is why the shared rule keeps them visible-but-dim and this one
   does not. */
/* Shared overlay treatment, after chauvetdj.com: the controls float over the tiles at the rail's
   own edges and appear on hover, instead of sitting in the header where they compete with the
   section's CTA. Opt in by setting `--kf-rail-nav-h` to the height the buttons should centre on —
   the CARD MEDIA, not the whole card, or the arrow drifts down onto the label. */
.kf-series .kf-rail__nav,
.kf-arrivals .kf-rail__nav,
.kf-featured .kf-rail__nav {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: var(--kf-rail-nav-h, 175px);
  display: block;
  pointer-events: none;
  gap: 0;
}
.kf-series .kf-rail__btn,
.kf-arrivals .kf-rail__btn,
.kf-featured .kf-rail__btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: auto;
  opacity: 0;
  width: 44px;
  height: 44px;
  background: rgba(255, 255, 255, 0.94);
  border-color: rgba(0, 0, 0, 0.1);
  color: var(--kf-ink);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.18);
  transition:
    opacity 0.18s ease,
    background-color 0.15s ease,
    color 0.15s ease;
}
/* 50% of the rail wrapper is half the page; less half the 1360 measure lands on the container edge,
   then 12px inward so the control sits over the first/last tile rather than in the margin. */
.kf-series .kf-rail__btn--prev,
.kf-arrivals .kf-rail__btn--prev,
.kf-featured .kf-rail__btn--prev {
  left: max(12px, calc(50% - 680px + 12px));
}
.kf-series .kf-rail__btn--next,
.kf-arrivals .kf-rail__btn--next,
.kf-featured .kf-rail__btn--next {
  right: max(12px, calc(50% - 680px + 12px));
}

.kf-series .kf-rail:hover .kf-rail__btn:not(:disabled),
.kf-series .kf-rail:focus-within .kf-rail__btn:not(:disabled),
.kf-arrivals .kf-rail:hover .kf-rail__btn:not(:disabled),
.kf-arrivals .kf-rail:focus-within .kf-rail__btn:not(:disabled),
.kf-featured .kf-rail:hover .kf-rail__btn:not(:disabled),
.kf-featured .kf-rail:focus-within .kf-rail__btn:not(:disabled) {
  opacity: 1;
}
.kf-series .kf-rail__btn:disabled,
.kf-arrivals .kf-rail__btn:disabled,
.kf-featured .kf-rail__btn:disabled {
  opacity: 0;
  pointer-events: none;
}
.kf-series .kf-rail__btn:hover:not(:disabled),
.kf-arrivals .kf-rail__btn:hover:not(:disabled),
.kf-featured .kf-rail__btn:hover:not(:disabled) {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
/* No hover on touch, where swiping is the natural gesture — a permanently visible pair would just
   cover two tiles.

   APPLIES TO EVERY RAIL, not just Series. `.kf-rail__nav` is `position: absolute; top: -62px`,
   which parks it in the header row's space. That is clear at desktop, but once the header stacks
   the -62px lands ON the controls above it — in Featured Titles the prev arrow (248–294) sat over
   the "Series" pill (193–276). Same absolute nav, same collision, in Featured, Arrivals and
   Campaigns.

   The width query matters as well as the touch one: the overlap is caused by the header stacking,
   not by the pointer type, so a narrow desktop window hits it too. */
@media (hover: none), (max-width: 767px) {
  .kf-rail__nav,
  /* Series has its own two-class rule setting `display: block` for the edge-anchored overlay, so a
     single-class hide loses to it — this was the one rail whose arrows stayed and sat on a tile. */
  .kf-series .kf-rail__nav {
    display: none;
  }
}

@media (max-width: 1023px) {
  .kf-series__head {
    grid-template-columns: 1fr auto;
    row-gap: 18px;
    padding-inline: 24px;
  }
  .kf-series__toggle {
    grid-column: 1;
    grid-row: 2;
    justify-self: start;
  }
  .kf-series__all {
    grid-column: 2;
    grid-row: 2;
  }
  /* The application panel's four tiles fill the measure, so that rail never scrolls and its progress
   bar is hidden — which made the whole band shrink 40px the moment someone hit the toggle. Reserve
   the bar's height so switching panels moves nothing below it. */
  .kf-series .kf-rail.is-static {
    padding-bottom: 40px;
  }

  .kf-series .kf-rail__progress {
    margin-inline: 24px;
  }
}
@media (max-width: 639px) {
  .kf-sec.kf-series > .uk-container {
    padding: 40px 0 44px;
  }
  .kf-series .kf-series__head h2.kf-h2 {
    font-size: 30px;
    line-height: 38px;
  }
}

/* ---- Our Story: the copy column's rhythm is the design's, not UIkit's ----
   Every band in this column is a separate Builder element, and each arrives wrapped in a
   `uk-margin-*` div. Those stack on top of the margins the type already carries, which pushed
   head->body to 38px and body->button to 40px against the design's 16 and 30. Zero the wrappers
   once, then state each gap explicitly, so the spacing is readable here instead of being the
   residue of two systems disagreeing.
   Design (node 600:8283): eyebrow 111-124 · head 141-237 · body 253-337 · button 367-413. */
/* Every gap below is scoped through the same `> :nth-child(2) >` path as the reset above it.
   Written unqualified first, the reset (0,3,0) outranked them and collapsed the column — the fourth
   time specificity has silently undone spacing in this file. Match the reset's path, or lose. */
.kf-story .uk-grid > :nth-child(2) > * {
  margin: 0;
}
.kf-story .uk-grid > :nth-child(2) > .kf-eyebrow {
  margin-bottom: 17px;
}
.kf-story .uk-grid > :nth-child(2) > .kf-story__head {
  margin-bottom: 16px;
}
/* padding, not margin: every one of the theme's `uk-margin-*` utilities is !important, so a margin
   here is unwinnable whichever way the Builder sets the element. Padding is untouched by them, and
   the element's own margins are removed at source (text(..., tight=True)), so this is the only
   thing holding the gap. */
.kf-story .uk-grid > :nth-child(2) > .kf-story__body {
  padding-bottom: 30px;
}
.kf-story .uk-grid > :nth-child(2) .kf-story__body p {
  margin: 0;
}

/* ===== New Arrivals ======================================================
   Design: node 600:8334 — 1600x560 on paper.
     eyebrow y56 · heading y78 (36/44) · CTA pill 210x48 r30 flush right, ON the heading's row
     five 254x254 white cards r4 · 209x209 product image inset · NEW badge 57x25 r12 top-left
     product name BELOW the card at y433 (20px under it) · progress 1360x10 */

.kf-sec.kf-arrivals > .uk-container {
  max-width: 1360px;
  margin-inline: auto;
  padding: 56px 0 64px;
}

.kf-arrivals__head {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: end;
  column-gap: 24px;
  margin-bottom: 37px;
}
.kf-arrivals .kf-arrivals__head .kf-eyebrow {
  margin: 0 0 8px;
}
.kf-arrivals .kf-arrivals__head h2.kf-h2 {
  font:
    700 36px/44px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0;
}
/* The CTA sat under the heading because the old markup stacked it as a third block element.
   It belongs on the heading's row, flush to the right edge of the measure. */
.kf-arrivals .kf-arrivals__cta {
  justify-self: end;
  min-width: 210px;
  height: 48px;
  line-height: 46px;
  border-radius: 30px;
  padding-inline: 26px;
  font:
    700 15px/46px "Roboto",
    sans-serif;
  text-align: center;
  margin: 0;
}

.kf-sec.kf-arrivals .kf-arrivals__rail {
  display: flex;
  gap: 22px;
  list-style: none;
  margin: 0;
  padding: 0;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
  scrollbar-width: none;
}
.kf-sec.kf-arrivals .kf-arrivals__rail::-webkit-scrollbar {
  display: none;
}
/* 254 fixed would leave the fifth card short of the measure at (1360 - 4*22)/5 = 254.4, so the
   flex basis is the design width and growth takes up the rounding rather than a gap doing it.
   Written through the rail — the shared `.kf-arrivals__rail > li` rule is (0,1,1) and an
   unqualified `.kf-arrivals__item` (0,1,0) loses to it, which collapsed every card to 98px. */
.kf-sec.kf-arrivals .kf-arrivals__rail > .kf-arrivals__item {
  flex: 1 0 254px;
  scroll-snap-align: start;
}

.kf-arrivals__card {
  position: relative;
  display: block;
  aspect-ratio: 1;
  background: #fff;
  border: 1px solid var(--kf-line);
  border-radius: 4px;
  overflow: hidden;
}
.kf-arrivals__card img {
  position: absolute;
  inset: 9%;
  width: 82%;
  height: 82%;
  object-fit: contain;
  display: block;
}
.kf-arrivals__badge {
  position: absolute;
  top: 13px;
  left: 14px;
  z-index: 1;
  min-width: 57px;
  height: 25px;
  border-radius: 12px;
  background: var(--kf-yellow);
  color: var(--kf-ink);
  font:
    700 11px/25px "Roboto",
    sans-serif;
  text-align: center;
  padding-inline: 10px;
}
.kf-arrivals__name {
  display: block;
  margin-top: 20px;
  text-align: center;
  text-decoration: none;
  font:
    700 17px/23px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
}
.kf-arrivals__name:hover {
  color: var(--kf-ink-3);
}
.kf-arrivals__name:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}

/* Five flagged products fill the measure exactly, so the rail does not scroll and the controller
   hides its chrome — leaving the band 40px short of the design's 560. Reserve the bar's space in
   that state so the page's vertical rhythm is the same whether or not a sixth product is flagged;
   the moment one is, the real bar occupies this reserve. */
.kf-arrivals .kf-rail.is-static {
  padding-bottom: 40px;
}

/* the design's track is ink on paper here, not the paper-on-white used elsewhere */
.kf-arrivals .kf-rail__progress {
  margin-top: 30px;
  height: 10px;
  border-radius: 100px;
  background: rgba(22, 22, 22, 0.12);
}
.kf-arrivals .kf-rail__progress > * {
  border-radius: 100px;
  background: var(--kf-yellow);
}

@media (max-width: 1023px) {
  .kf-sec.kf-arrivals > .uk-container {
    padding-inline: 24px;
  }
  .kf-arrivals__head {
    grid-template-columns: 1fr;
    row-gap: 18px;
  }
  .kf-arrivals .kf-arrivals__cta {
    justify-self: start;
  }
}

/* ---- campaign tile hover preview ---------------------------------------
   The clip sits directly over the still and cross-fades in, so the tile never shows a gap or a
   flash of black while the video decodes its first frame. Below the scrim, so the date, product and
   title keep the same contrast whether the reel is running or not. */
.kf-tile__preview {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 0.35s ease;
  pointer-events: none;
  z-index: 0;
}
.kf-tile.is-previewing .kf-tile__preview {
  opacity: 1;
}
.kf-tile__media > img {
  z-index: 0;
}
.kf-tile__scrim {
  z-index: 1;
}
.kf-tile__text,
.kf-tile__play {
  z-index: 2;
}

@media (prefers-reduced-motion: reduce) {
  .kf-tile__preview {
    display: none;
  }
}

/* ---- Buy & Rent ------------------------------------------------------------
   Measured off Figma node 600:8577. The band is flat white cards on a #f9f9f9 ground — square
   corners, no shadow, no border. That flatness is the style; adding a radius or a drop shadow here
   would read as a different design system, not as polish.

   Budget: 660 = 56 top + 104 header block + 40 gap + 400 cards + 26 note + 34 bottom.            */
.kf-sec.kf-buyrent {
  background-color: #f9f9f9;
}
.kf-sec.kf-buyrent > .uk-container {
  padding-block: 56px 21px;
}

.kf-buyrent .kf-eyebrow {
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.12em;
  color: var(--kf-mute) !important;
  margin: 0 0 13px;
}
.kf-buyrent h2.kf-h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 12px;
}
.kf-buyrent .kf-deck,
.kf-buyrent .kf-deck p {
  font:
    400 15px/22px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0;
  max-width: 800px;
}

/* 760 / 520 with a 20px gutter — not a half, so the widths are stated rather than left to a fraction */
.kf-buyrent .uk-grid > .kf-locator {
  width: 58.46%;
}
.kf-buyrent .uk-grid > .kf-brcards {
  width: 40%;
}

/* --- the locator card ---------------------------------------------------- */
.kf-buyrent .kf-locator > .uk-panel,
.kf-buyrent .kf-locator {
  min-width: 0;
}
.kf-buyrent .kf-locator > * {
  background: #fff;
}
.kf-buyrent .kf-locator {
  background: #fff;
  padding: 24px 24px 14px;
  display: flex;
  flex-direction: column;
}
.kf-buyrent .kf-locator__head {
  margin: 0;
}
.kf-buyrent h3.kf-locator__title {
  font:
    700 20px/23px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 15px;
}

/* search: a 44px pill pair — input on the site ground, button in brand yellow */
.kf-buyrent .kf-dealer-search__row {
  display: flex;
  gap: 16px;
  margin: 0 0 16px;
}
.kf-buyrent .kf-dealer-search__input {
  flex: 1 1 auto;
  height: 44px;
  border-radius: 30px;
  border: 0;
  background: #f9f9f9;
  padding: 0 24px;
  font:
    400 14px/44px "Roboto",
    sans-serif;
  color: var(--kf-ink);
}
.kf-buyrent .kf-dealer-search__input::placeholder {
  color: #9a9a9a;
}
.kf-buyrent .kf-dealer-search__row .uk-button-primary {
  flex: 0 0 176px;
  height: 44px;
  line-height: 44px;
  border-radius: 30px;
  background: var(--kf-yellow);
  color: var(--kf-ink);
  font:
    700 14px/44px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.02em;
  text-transform: none;
}

.kf-buyrent .kf-map {
  margin: 0;
}
.kf-buyrent .kf-map__live {
  height: 264px;
  border-radius: 0;
  overflow: hidden;
}
/* caption and action share one baseline — see the note in kf_dealer_map/templates/template.php */
.kf-buyrent .kf-map__foot {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  margin: 12px 0 0;
  min-height: 14px;
}
.kf-buyrent .kf-map__note {
  font:
    500 11px/14px "Roboto",
    sans-serif;
  color: var(--kf-mute);
}
.kf-buyrent a.kf-map__link {
  font:
    700 12px/14px "Roboto Condensed",
    sans-serif;
  white-space: nowrap;
}

/* --- the two cards beside it --------------------------------------------- */
.kf-buyrent .kf-brcards {
  display: flex;
  flex-direction: column;
  gap: 20px;
}
.kf-buyrent .kf-brcard {
  background: #fff;
  padding: 22px 24px 23px;
  margin: 0;
  flex: 1 1 0;
  display: flex;
  flex-direction: column;
}
.kf-buyrent h3.kf-brcard__t {
  font:
    700 18px/21px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 7px;
}
.kf-buyrent .kf-brcard__d {
  font:
    400 14px/19px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0;
  max-width: 392px;
}
/* the design floats the CTA to the card's foot rather than letting it sit under the copy */
.kf-buyrent .kf-brcard__a {
  margin-top: auto;
  padding-top: 16px;
  font:
    700 14px/16px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
}

@media (max-width: 959px) {
  .kf-buyrent .uk-grid > .kf-locator,
  .kf-buyrent .uk-grid > .kf-brcards {
    width: 100%;
  }
  .kf-buyrent .kf-dealer-search__row {
    flex-wrap: wrap;
  }
  .kf-buyrent .kf-dealer-search__row .uk-button-primary {
    flex: 1 1 100%;
  }
  .kf-buyrent h2.kf-h2 {
    font-size: 30px;
    line-height: 38px;
  }
}

/* ---- Owners ----------------------------------------------------------------
   Figma node 628:139. Band 440 on #f9f9f9:
     56 top + 13 eyebrow + 13 + 42 head + 26 + 230 content + 60 bottom.
   Content row is 680 of cards (2x330 + 20 gutter) + 35 + a 645 links panel = 1360.
   Cards and panel are white with a 4px radius — the ONE place in this design that rounds, so it is
   deliberate rather than inherited from the flat Buy & Rent cards above it.                     */
.kf-sec.kf-owners {
  background-color: #f9f9f9;
}
.kf-sec.kf-owners > .uk-container {
  padding-block: 56px 60px;
}

.kf-owners .kf-eyebrow {
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.12em;
  color: #212c34 !important;
  margin: 0 0 13px;
}
.kf-owners h2.kf-h2 {
  font:
    700 34px/42px "Roboto Condensed",
    sans-serif;
  color: #212c34;
  margin: 0 0 26px;
}

.kf-owners .uk-grid > .kf-owners__cards {
  width: 50%;
}
.kf-owners .uk-grid > .kf-owners__links {
  width: 47.43%;
} /* 645 / 1360 */
/* Scoped to the SECTION's own grid. Unscoped, it also hit the grid the native grid
   element renders inside a column, cancelling UIkit's gutter there and leaving the first card
   20px narrower than its neighbours. */
.kf-owners > .uk-container > .uk-grid {
  margin-left: 0;
}
/* The h2 already carries the design's 26px gap to the cards. UIkit's .uk-grid-margin adds another
   40 on the second row, which is how a 26px gap became 66. */
.kf-owners .uk-grid + .uk-grid.uk-grid-margin {
  margin-top: 0;
}
.kf-owners > .uk-container > .uk-grid > * {
  padding-left: 0;
}
.kf-owners .uk-grid > .kf-owners__links {
  margin-left: 2.57%;
} /* the 35px gutter */

/* --- the two cards -------------------------------------------------------- */
/* The two promo cards are the native grid + grid_item now, so the column layout is UIkit's and the
   banner comes from the element's media field instead of an {{IMG:}} token typed into markup.
   `.kf-ocard` is on each `.el-item`; the whole panel is the link (`panel_link`), which is why the
   anchor is the panel rather than a wrapper around it. */
.kf-owners .kf-ocards {
  margin: 0;
}
/* Same 10-vs-20 gutter correction as the pillar grid. */
.kf-owners .kf-ocards > .uk-grid {
  margin-left: -20px;
}
.kf-owners .kf-ocards > .uk-grid > * {
  padding-left: 20px;
}
.kf-owners .kf-ocard {
  height: 100%;
}
/* panel_link makes the panel itself the anchor, so the card's surface styles live here. */
.kf-owners .kf-ocard > a {
  display: flex;
  flex-direction: column;
  height: 100%;
  background: #fff;
  border-radius: 4px;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  transition:
    box-shadow 0.18s ease,
    transform 0.18s ease;
}
.kf-owners .kf-ocard > a:hover {
  box-shadow: 0 6px 20px rgba(33, 44, 52, 0.1);
  transform: translateY(-2px);
}
.kf-owners .kf-ocard > a:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}
/* The banner is a 660x173 export for a 330x86 slot — exactly 2x, so it stays sharp without
   upscaling. The ratio is pinned so a differently-proportioned replacement cannot change the
   card's height. */
.kf-owners .kf-ocard .el-image {
  display: block;
  width: 100%;
  aspect-ratio: 330 / 86;
  object-fit: cover;
  background: #000;
  margin: 0;
}
/* Spacing as PADDING, not margin. The element's margin utilities are turned off above, and the
   `uk-margin-remove-*` classes that leaves behind carry !important — so a margin here loses no
   matter how specific it is. Padding is untouched by them. */
.kf-owners .kf-ocard .el-title {
  font:
    700 17px/20px "Roboto Condensed",
    sans-serif;
  color: #212c34;
  padding: 26px 20px 6px;
}
.kf-owners .kf-ocard .el-content,
.kf-owners .kf-ocard .el-content p {
  font:
    400 13px/20px "Roboto",
    sans-serif;
  color: #212c34;
  margin: 0;
}
.kf-owners .kf-ocard .el-content {
  padding: 0 20px 16px;
}
/* The CTA renders as a uk-button by default; the design's is a plain text link that carries the
   highlighter, so the button chrome is stripped rather than the element replaced. `margin-top:auto`
   keeps it on the card's floor whatever the description's length. */
/* inline-block, NOT block. The highlighter is a background-image sized to the element, so on a
   full-width block it painted a yellow bar across the whole card floor instead of a stroke under
   the words. The inset moved to the wrapper above so this can hug its own text. */
.kf-owners .kf-ocard .el-link {
  all: unset;
  display: inline-block;
  font:
    700 13px/15px "Roboto Condensed",
    sans-serif;
  color: #212c34;
  cursor: pointer;
}
/* The CTA's wrapper carries the card inset and the push to the floor, so the link itself can be
   content-sized. */
.kf-owners .kf-ocard > a > :last-child {
  margin: auto 20px 21px;
}
.kf-owners .kf-ocard .el-link::after {
  content: " \2192";
}

.kf-owners .kf-olinks {
  margin: 0;
  padding: 30px;
  background: #fff;
  border-radius: 4px;
  height: 100%;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
}
/* Beat `.uk-nav` and `.uk-nav-default`, which bring their own list and link styling. */
.kf-owners .kf-olinks > .uk-nav {
  list-style: none;
  margin: 0;
  padding: 0;
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.kf-owners .kf-olinks > .uk-nav > li {
  margin: 0;
}
.kf-owners .kf-olinks > .uk-nav > li + li {
  border-top: 1px solid rgba(33, 44, 52, 0.1);
}
.kf-owners .kf-olinks > .uk-nav > li > a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 15px 0;
  text-decoration: none;
  font:
    700 16px/19px "Roboto Condensed",
    sans-serif;
  color: #212c34;
}
/* The arrow was a real <span aria-hidden="true"> in the old markup. The menu template does not emit
   one and should not have to — a purely decorative glyph is a pseudo-element's job, and this way it
   cannot end up in the accessibility tree or in copied text. */
.kf-owners .kf-olinks > .uk-nav > li > a::after {
  content: "\2192";
  transition: transform 0.18s ease;
}
.kf-owners .kf-olinks > .uk-nav > li:first-child > a {
  padding-top: 0;
}
.kf-owners .kf-olinks > .uk-nav > li:last-child > a {
  padding-bottom: 0;
}
.kf-owners .kf-olinks > .uk-nav > li > a:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}
.kf-owners .kf-olinks > .uk-nav > li > a:hover::after {
  transform: translateX(3px);
}

@media (max-width: 959px) {
  .kf-sec.kf-owners > .uk-container {
    padding-block: 40px;
  }
  .kf-owners .uk-grid > .kf-owners__cards,
  .kf-owners .uk-grid > .kf-owners__links {
    width: 100%;
    margin-left: 0;
  }
  .kf-owners .uk-grid > .kf-owners__links {
    margin-top: 20px;
  }
  .kf-owners h2.kf-h2 {
    font-size: 26px;
    line-height: 32px;
  }
}
@media (max-width: 639px) {
  .kf-owners .kf-owners__cards {
    flex-direction: column;
  }
}

/* ---- Highlighter hover ------------------------------------------------------
   Replaces a mustard colour-swap on hover. #846c01 is the darkened yellow needed to make brand
   yellow legible AS TEXT on white, and it reads as a muddy third colour rather than as the brand —
   the palette has one yellow and it is #FED208. So the text stays slate and the yellow arrives as
   a marker stroke swept in behind it, which uses the real brand colour at the size it works at.

   Implemented as a background-size transition rather than a pseudo-element: it animates a single
   compositor-friendly property, needs no extra DOM, and degrades to a plain highlight if the
   transition is refused. The stroke sits low and covers ~42% of the line box, which is where a real
   marker lands relative to a baseline — a full-height block reads as a button, not a highlight.  */
.kf-hl,
.kf-sec .kf-link,
.kf-owners .kf-olinks__label,
.kf-owners .kf-ocard .el-link,
.kf-sec.kf-buyrent .uk-button-text {
  background-image: linear-gradient(var(--kf-yellow), var(--kf-yellow));
  background-repeat: no-repeat;
  background-position: 0 88%;
  background-size: 0 42%;
  transition: background-size 0.28s cubic-bezier(0.4, 0, 0.2, 1);
  /* the stroke should hug the glyphs, so it must not inherit a stretched flex width */
  align-self: flex-start;
}
.kf-hl:hover,
.kf-sec a.kf-link:hover,
.kf-sec a.kf-link:focus-visible,
.kf-owners .kf-olinks > .uk-nav > li > a:hover .kf-olinks__label,
.kf-owners .kf-olinks > .uk-nav > li > a:focus-visible .kf-olinks__label,
.kf-owners .kf-ocard > a:hover .el-link,
.kf-owners .kf-ocard > a:focus-visible .el-link,
.kf-sec.kf-buyrent .uk-button-text:hover,
.kf-sec.kf-buyrent .uk-button-text:focus-visible {
  background-size: 100% 42%;
}

/* On the dark bands the link is white; a yellow stroke behind white text fails contrast, so those
   keep a plain colour change to the brand yellow instead. */
.kf-featured .kf-link,
.kf-follow .kf-link,
.kf-story .kf-link {
  background-image: none;
}
.kf-featured a.kf-link:hover,
.kf-follow a.kf-link:hover,
.kf-story a.kf-link:hover {
  color: var(--kf-yellow);
}

@media (prefers-reduced-motion: reduce) {
  .kf-hl,
  .kf-sec .kf-link,
  .kf-owners .kf-olinks__label,
  .kf-owners .kf-ocard .el-link,
  .kf-sec.kf-buyrent .uk-button-text {
    transition: none;
  }
}

/* ---- On Set ----------------------------------------------------------------
   Figma node 600:8667. Band 1018 on white.
     56 + 104 header + 30 + 400 lead + 40 + 1 rule + 31 + 300 cards + 56 = 1018
   The photo and the copy panel MEET at x=880 with no gutter — they read as one 1360-wide object,
   which is why the row collapses its column gap rather than using a small one.                  */
.kf-sec.kf-onset {
  background-color: #fff;
}
.kf-sec.kf-onset > .uk-container {
  padding-block: 56px;
}

.kf-onset .kf-onset__head {
  position: relative;
}
.kf-onset .kf-eyebrow {
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.12em;
  color: var(--kf-mute) !important;
  margin: 0 0 13px;
}
.kf-onset h2.kf-h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 12px;
}
.kf-onset .kf-deck,
.kf-onset .kf-deck p {
  font:
    400 15px/18px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0;
  max-width: 700px;
}
/* the design sets this beside the heading, vertically against it — not stacked under the deck */
.kf-onset .kf-onset__allwrap {
  position: absolute;
  right: 0;
  top: 40px;
  margin: 0;
}
.kf-onset a.kf-onset__all {
  font:
    700 15px/18px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
}

/* --- lead ----------------------------------------------------------------- */
.kf-onset .uk-grid > .kf-onset__leadmedia {
  width: 55.88%;
} /* 760 / 1360 */
.kf-onset .uk-grid > .kf-onset__leadcopy {
  width: 44.12%;
} /* 600 / 1360 */
.kf-onset .uk-grid > * {
  padding-left: 0;
}
.kf-onset .uk-grid {
  margin-left: 0;
}
/* UIkit puts a flat 40px on every subsequent grid. The design uses two different gaps — 30 from the
   header to the lead, and 40 from the lead to the rule — so the blanket margin is cleared and the
   two are stated. The cards row takes none: .kf-scards owns its own 40 + rule + 31.
   
   Stated on the element's OWN classes rather than as `> .uk-container > .uk-grid + .uk-grid`.
   That form encoded the section's node depth, and the content now comes from the kf_on_set element,
   which renders one level further in — the sibling chain no longer matched and the 30px gap between
   the header and the lead silently became UIkit's 40. Depth-independent selectors survive the
   static-to-element swap; positional ones do not. */
.kf-onset > .uk-container > .uk-grid {
  margin-top: 0;
}
.kf-onset .kf-onset__lead {
  margin-top: 30px;
}
.kf-onset .kf-onset__rail {
  margin-top: 0;
}
.kf-onset .kf-onset__lead-img,
.kf-onset .kf-onset__lead-img img {
  height: 100%;
  margin: 0;
}
.kf-onset .kf-onset__lead-img img {
  width: 100%;
  height: 400px;
  object-fit: cover;
  display: block;
}

.kf-onset .kf-onset__panel {
  background: #f2f2f2;
  min-height: 400px;
  height: 100%;
  box-sizing: border-box;
  padding: 58px 60px;
  margin: 0;
  /* The design's copy exactly fills 400px — a two-line title over a four-line excerpt. Real CMS
     copy is shorter or longer than that, and top-anchoring left a dead gap under the button.
     Centring makes any length read as deliberate instead of as a layout that ran out of text. */
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.kf-onset .kf-onset__kicker {
  display: block;
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.1em;
  color: var(--kf-mute);
  margin-bottom: 15px;
}
.kf-onset h3.kf-onset__lead-title {
  font:
    700 30px/38px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
  margin: 0 0 15px;
  max-width: 485px;
}
.kf-onset .kf-onset__lead-x {
  font:
    400 16px/26px "Roboto",
    sans-serif;
  color: var(--kf-ink-3);
  margin: 0 0 15px;
  max-width: 493px;
}
.kf-onset a.kf-onset__cta {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 190px;
  height: 46px;
  padding: 0 24px;
  border-radius: 30px;
  background: var(--kf-yellow);
  color: var(--kf-ink);
  text-decoration: none;
  font:
    700 15px/46px "Roboto Condensed",
    sans-serif;
  transition: background-color 0.18s ease;
}
.kf-onset a.kf-onset__cta:hover {
  background: #e5bd00;
}
.kf-onset a.kf-onset__cta:focus-visible {
  outline: 2px solid var(--kf-ink);
  outline-offset: 3px;
}

/* --- the three cards ------------------------------------------------------ */
.kf-onset .kf-scards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 30px;
  margin: 40px 0 0;
  padding-top: 31px;
  border-top: 1px solid #e4e4e4;
}
.kf-onset .kf-scard {
  display: block;
  text-decoration: none;
  color: inherit;
}
.kf-onset .kf-scard__img {
  display: block;
  aspect-ratio: 433 / 244;
  border-radius: 4px;
  overflow: hidden;
  background: #f2f2f2;
}
.kf-onset .kf-scard__img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.4s ease;
}
.kf-onset .kf-scard:hover .kf-scard__img img {
  transform: scale(1.03);
}
.kf-onset .kf-scard__k {
  display: block;
  font:
    700 12px/14px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.08em;
  color: var(--kf-mute);
  margin: 10px 0 8px;
}
/* 20px, up from 16. The rail cards sit under a 30px lead title, so this lifts them clear of the
   date meta without competing with the lead — a third step between the 13px kicker and the 30px
   headline rather than a second one. */
.kf-onset .kf-scard__t {
  display: block;
  font:
    700 20px/27px "Roboto Condensed",
    sans-serif;
  color: var(--kf-ink);
}
.kf-onset .kf-scard:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 4px;
}

@media (max-width: 959px) {
  .kf-sec.kf-onset > .uk-container {
    padding-block: 40px;
  }
  .kf-onset .uk-grid > .kf-onset__leadmedia,
  .kf-onset .uk-grid > .kf-onset__leadcopy {
    width: 100%;
  }
  .kf-onset .kf-onset__lead-img img {
    height: 240px;
  }
  .kf-onset .kf-onset__panel {
    min-height: 0;
    padding: 32px 24px;
  }
  .kf-onset .kf-onset__allwrap {
    position: static;
    margin-top: 16px;
  }
  .kf-onset h2.kf-h2 {
    font-size: 30px;
    line-height: 38px;
  }
  .kf-onset .kf-scards {
    grid-template-columns: 1fr;
  }
}

/* ---- Why Kino Flo ----------------------------------------------------------
   Figma node 619:99. Band 754 on #161616:
     60 + 14 eyebrow + 9 + 48 heading + 8 + 27 deck + 48 + 460 content + 80 = 754
   Content row: a 640x460 yellow quote card, a 40px gutter, then a 2x2 grid of 330x220 cards.

   EVERY selector below is qualified with .kf-why. The section already carries `.kf-why p { color:
   var(--kf-onDark-mute) }` for its dark ground, which is (0,1,1) and was beating the single-class
   `.kf-quote__credit` — so the credit rendered at deck size in muted grey ON YELLOW, which is what
   made it look washed out. Fifth time specificity has silently decided a value on this page.     */
.kf-sec.kf-why > .uk-container {
  padding-block: 60px 80px;
}
.kf-why .kf-eyebrow {
  margin: 0 0 9px;
}
.kf-why h2.kf-h2 {
  font:
    700 40px/48px "Roboto Condensed",
    sans-serif;
  color: #fff;
  margin: 0 0 8px;
}
.kf-why .kf-deck,
.kf-why .kf-deck p {
  font:
    400 17px/27px "Roboto",
    sans-serif;
  color: var(--kf-onDark-mute);
  margin: 0;
  max-width: 820px;
}

/* the two halves: 640 + 40 gutter + 680 = 1360 */
/* The quote/pillars split, on the SECTION's grid only — the nested element grid's columns are
   sized by UIkit's child-width classes and must not inherit these. */
.kf-why > .uk-container > .uk-grid > :nth-child(1) {
  width: 47.06%;
}
.kf-why > .uk-container > .uk-grid > :nth-child(2) {
  width: 50%;
  margin-left: 2.94%;
}
/* the 48 belongs between the header and the content row only — not above the header, where the
   container's own 60px top padding already places the eyebrow */
/* Scoped to the SECTION's own grid. Unscoped, it also hit the grid the native grid
   element renders inside a column, cancelling UIkit's gutter there and leaving the first card
   20px narrower than its neighbours. */
.kf-why > .uk-container > .uk-grid {
  margin-left: 0;
}
.kf-why > .uk-container > .uk-grid {
  margin-top: 0;
}
.kf-why > .uk-container > .uk-grid + .uk-grid {
  margin-top: 48px;
}
.kf-why > .uk-container > .uk-grid > * {
  padding-left: 0;
}

/* Collapse the Featured Titles band when it has no posters to show.
   The element renders a `.kf-featured__empty` marker and nothing else; without this the section's
   own padding still paints and the band reads as a broken rail rather than as absent. That is what
   it was doing on dev, where the licence-pending posters are deliberately not imported. */
.kf-sec.kf-featured:has(.kf-featured__empty) {
  display: none;
}

/* --- quote card -----------------------------------------------------------
   The native `quotation` element plus a native headline for the credit. The YELLOW PANEL is the
   COLUMN, not the blockquote: the credit sits above the quote inside the panel, and `quotation` has
   no slot above its content, so the column is the card and the two elements stack inside it.

   Every selector is qualified with .kf-why. The section carries `.kf-why p { color:
   var(--kf-onDark-mute) }` at (0,1,1), which beat the single-class `.kf-quote__credit` and rendered
   the credit in muted grey on yellow. */
.kf-why .kf-quotecol {
  background: var(--kf-yellow);
  border-radius: 4px;
  min-height: 460px;
  box-sizing: border-box;
  padding: 48px;
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
/* The oversized decorative quote glyph. Was a <span aria-hidden="true"> in the markup; it is
   painted, never read, so it belongs here. */
.kf-why .kf-quotecol::before {
  content: "\201d";
  position: absolute;
  right: -14px;
  top: -46px;
  pointer-events: none;
  font:
    700 300px/300px "Roboto Condensed",
    sans-serif;
  color: rgba(22, 22, 22, 0.1);
}
.kf-why .kf-quotecol > * {
  position: relative;
}
/* The gutter reset `.kf-why > .uk-container > .uk-grid > * { padding-left: 0 }` is (0,3,0) and beat
   the panel's own `padding` shorthand, flattening its left inset to 0. It exists to collapse the
   grid gutter, which still has to happen — so the padding is restated at matching specificity
   rather than the gutter rule being weakened. */
.kf-why > .uk-container > .uk-grid > .kf-quotecol {
  padding-left: 48px;
}
.kf-why div.kf-quote__credit {
  font:
    500 11px/14px "Roboto",
    sans-serif;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: #414243;
  margin: 0 0 24px;
}
/* The element renders <blockquote>; it is the flex child that has to grow so the attribution can be
   pushed to the panel's floor. */
.kf-why blockquote.kf-quote {
  flex: 1;
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
  border: 0;
}
.kf-why blockquote.kf-quote > p {
  font:
    400 27px/42px "Roboto",
    sans-serif;
  color: var(--kf-ink);
  margin: 0;
  max-width: 544px;
}
/* `footer` is emitted BEFORE <cite class="el-author">, and the design wants the name above the role.
   column-reverse flips them without putting a <br> into a content field. */
.kf-why blockquote.kf-quote .el-footer {
  display: flex;
  flex-direction: column-reverse;
  align-items: flex-start;
  margin: auto 0 0;
  font:
    400 15px/20px "Roboto",
    sans-serif;
  color: #414243;
}
/* UIkit puts `content: "— "` on a blockquote footer's ::before. It is a flex item under
   column-reverse, so it landed BELOW the role as a stray dash on its own line. The design has no
   dash; the name/role pair carries the attribution on its own. */
.kf-why blockquote.kf-quote .el-footer::before {
  content: none;
}
.kf-why blockquote.kf-quote .el-author {
  font:
    500 15px/20px "Roboto",
    sans-serif;
  color: var(--kf-ink);
  font-style: normal;
}

/* --- pillar grid ---------------------------------------------------------- */
/* Let `uk-grid-small` own the 20px gutter. Restating it as a negative margin plus child padding
   doubled it to 41 and left the first card 21px narrower than its neighbours. */
/* Native grid + grid_item. `.kf-why__grid` is the element's WRAPPER now and `.kf-why__card` is on
   each `.el-item.uk-panel`; the columns come from UIkit's own child-width classes.
   
   Six competing definitions of `.kf-why__grid` had accumulated across iterations — a 1/2/4 set at
   one class that never applied, and a 2-up set at two classes that did. They are one block now, at
   the values that were actually winning: 2 up, 1 below @s. */
.kf-why .kf-why__grid {
  margin: 0;
}
/* This build's `uk-grid-small` is a 10px gutter and the design's is 20, so UIkit's own values are
   REPLACED here rather than added to. Stacking a second negative margin on top of theirs produced a
   41px gap on the first attempt. */
.kf-why .kf-why__grid > .uk-grid {
  margin-left: -20px;
}
.kf-why .kf-why__grid > .uk-grid > * {
  padding-left: 20px;
}
.kf-why .kf-why__grid > .uk-grid > .uk-grid-margin {
  margin-top: 20px;
}
.kf-why .kf-why__card {
  background: #1c1c1c;
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: 4px;
  padding: 30px;
  min-height: 220px;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
}
/* The icons are CSS art keyed by the item's modifier class, drawn as the card's ::before. The old
   markup carried an empty <span aria-hidden="true"> whose only job was to be painted — decoration
   with no content belongs in a pseudo-element, not in the DOM an editor can see.
   box-sizing so the two bordered icons render 40x40 like the other two rather than 46x46, which
   pushed their titles 6px lower. */
.kf-why .kf-why__card::before {
  content: "";
  display: block;
  width: 40px;
  height: 40px;
  box-sizing: border-box;
  flex: 0 0 auto;
  margin: 0 0 26px;
}
.kf-why .kf-why__card--0::before {
  border-radius: 50%;
  background: conic-gradient(#e83c45, #f2c739, #8cd159, #3ec7b8, #4a8ce0, #a95cc7, #e83c45);
}
/* "Rigs anywhere" — three assembled blocks, one tall beside two stacked. The previous mark was a
   clip-path polygon that read as a bare diagonal slash at 40px with nothing to identify it
   (Userback #8282551). Modular components are what the line actually claims, and it is the same
   language as the LiteTile / LiteMat products themselves. */
.kf-why .kf-why__card--1::before {
  background:
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><g fill="none" stroke="%23fed208" stroke-width="3" stroke-linejoin="round"><rect x="4.5" y="4.5" width="13" height="31" rx="3"/><rect x="22.5" y="4.5" width="13" height="13" rx="3"/><rect x="22.5" y="22.5" width="13" height="13" rx="3"/></g></svg>')
      center / 100% 100% no-repeat;
}
/* "Proven since 1987" — a medal. This was an empty ring, which carried no meaning at all next to a
   line about forty years of history (Userback #8282551). The ribbon legs start on the circle at
   ±(7, 9.1) from its centre, which is exactly r=11.5, so they meet the rim rather than crossing
   it. */
.kf-why .kf-why__card--2::before {
  background:
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40"><g fill="none" stroke="%23fed208" stroke-width="3" stroke-linejoin="round" stroke-linecap="round"><circle cx="20" cy="14.5" r="11.5"/><path d="M13 23.6 L10.5 38 L20 32 L29.5 38 L27 23.6"/></g></svg>')
      center / 100% 100% no-repeat;
}
/* A ring with two crossed ellipses. The original drew the ellipses on the span's ::before and
   ::after; with the icon itself now a ::before there is only one pseudo-element left, so they are
   an inline SVG instead — same mark, and it no longer depends on having a spare element to
   decorate. */
.kf-why .kf-why__card--3::before {
  border: 3px solid var(--kf-yellow);
  border-radius: 50%;
  background:
    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34 34"><g fill="none" stroke="%23fed208" stroke-width="3"><ellipse cx="17" cy="17" rx="7.6" ry="17"/><ellipse cx="17" cy="17" rx="17" ry="7.6"/></g></svg>')
      center / 100% 100% no-repeat;
}
/* padding, not margin — the element's `uk-margin-remove-*` classes are !important. */
.kf-why .kf-why__card > .el-title {
  font:
    700 22px/28px "Roboto Condensed",
    sans-serif;
  color: #fff;
  margin: 0;
  padding: 0 0 8px;
}
.kf-why .kf-why__card > .el-content,
.kf-why .kf-why__card > .el-content p {
  font:
    400 15px/24px "Roboto",
    sans-serif;
  color: var(--kf-onDark-mute);
  margin: 0;
  max-width: 270px;
}

@media (max-width: 959px) {
  .kf-sec.kf-why > .uk-container {
    padding-block: 40px;
  }
  .kf-why > .uk-container > .uk-grid > :nth-child(1),
  .kf-why > .uk-container > .uk-grid > :nth-child(2) {
    width: 100%;
    margin-left: 0;
  }
  .kf-why > .uk-container > .uk-grid > :nth-child(2) {
    margin-top: 20px;
  }
  .kf-why h2.kf-h2 {
    font-size: 30px;
    line-height: 38px;
  }
}

/* ---- Follow & Meet Us -------------------------------------------------------
   Figma node 600:8696. Band 1600x340 on #161616, with a #212c34 panel from x=719 to the right edge
   — it bleeds off the page, so it is a background on the column rather than a boxed card.
   Four 160x160 r4 tiles at x=800 / 973 / 1147 / 1320, y=120 — pitch 173.3, so a 13px gutter.     */
.kf-sec.kf-follow {
  background-color: #161616;
}
.kf-sec.kf-follow > .uk-container {
  padding-block: 0;
  max-width: none;
}
.kf-follow .uk-grid {
  margin-left: 0;
}
.kf-follow .uk-grid > * {
  padding-left: 0;
}

/* left: Meet Us, on the 120 measure */
.kf-follow .uk-grid > :nth-child(1) {
  width: 44.94%; /* 719 / 1600 */
  padding: 56px 56px 56px 120px;
  box-sizing: border-box;
}
/* right: the panel, bleeding to the page edge */
.kf-follow .uk-grid > :nth-child(2) {
  width: 55.06%;
  background: rgba(33, 44, 52, 0.1);
  padding: 56px 120px 60px 81px;
  box-sizing: border-box; /* 800-719 = 81 */
}
.kf-follow .kf-eyebrow {
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.12em;
  color: var(--kf-yellow) !important;
  margin: 0 0 25px;
}

.kf-follow .kf-follow__line,
.kf-follow p.kf-follow__line {
  font:
    700 11px/13px "Roboto Condensed",
    sans-serif;
  letter-spacing: 0.06em;
  color: #fff;
  margin: 0 0 13px;
}
.kf-follow .kf-follow__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 13px;
  list-style: none;
  margin: 0;
  padding: 0;
}
.kf-follow .kf-follow__grid li {
  margin: 0;
}
.kf-follow .kf-follow__grid a {
  display: block;
}
.kf-follow .kf-follow__grid img {
  width: 100%;
  aspect-ratio: 1 / 1;
  height: auto;
  object-fit: cover;
  border-radius: 4px;
  display: block;
  transition: opacity 0.18s ease;
}
.kf-follow .kf-follow__grid a:hover img {
  opacity: 0.82;
}
.kf-follow .kf-follow__grid a:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}
.kf-follow .kf-follow__note {
  margin: 12px 0 0;
  font-size: 12px;
  color: var(--kf-onDark-mute);
}

@media (max-width: 959px) {
  .kf-follow .uk-grid > :nth-child(1),
  .kf-follow .uk-grid > :nth-child(2) {
    width: 100%;
    padding: 32px 24px;
  }
  .kf-follow .kf-follow__grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* Event rows to the design's pitch. Figma has each row 39 tall with its rule 12 below and the next
   row 12 after that — a 64 pitch, three rows filling exactly 180. The build was on an 81 pitch
   (18/18 padding), which is what pushed the left column 89px past the band.
   The rule sits BELOW each row including the last: in the design the third row's rule closes the
   list rather than only separating pairs. */
.kf-follow .kf-event {
  gap: 22px;
  padding: 0 0 12px;
  margin-bottom: 12px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.14);
}
.kf-follow .kf-event:last-child {
  margin-bottom: 0;
}
.kf-follow .kf-event__when,
.kf-follow .kf-event__what {
  line-height: 19px;
}
.kf-follow .kf-events {
  margin-bottom: 18px;
}

/* handle left, "See more" right, on one row above the tiles — per the design, where the CTA sits at
   y=93 alongside the handle rather than under the grid */
.kf-follow .kf-follow__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 20px;
  margin: 0 0 13px;
}
.kf-follow .kf-follow__head .kf-follow__line {
  margin: 0;
}
.kf-follow a.kf-follow__more {
  font:
    700 13px/15px "Roboto Condensed",
    sans-serif;
  color: var(--kf-yellow);
  text-decoration: none;
  white-space: nowrap;
}
.kf-follow a.kf-follow__more:hover {
  text-decoration: underline;
}
.kf-follow a.kf-follow__more:focus-visible {
  outline: 2px solid var(--kf-yellow);
  outline-offset: 3px;
}

/* ---- mobile ------------------------------------------------------------
   Found by _migration/checks/audit-responsive.mjs at 375 and 390, not by eye.

   `html` is `overflow-x: clip` on this theme, which matters: anything pushed past the viewport is
   not merely off-screen, it is UNREACHABLE — no sideways scroll gets you to it. So an overflowing
   link is a dead control, not a cosmetic issue. */
@media (max-width: 767px) {
  /* The header grid asks for 318 + 44 + 94 = 456px at its narrowest. In a 375 container that put
     "All Products" at x=386 — outside the page, unclickable. Stacked, it keeps its place in the
     reading order and stays tappable. */
  .kf-series__head {
    /* `minmax(0, 1fr)`, not `1fr`. A bare `1fr` is `minmax(auto, 1fr)`, and that `auto` floor is
       the track's MIN-CONTENT — here the segmented toggle's 318px — so the column refused to
       shrink below it and pushed 22px off the side of a 320px screen. */
    grid-template-columns: minmax(0, 1fr);
    column-gap: 0;
    row-gap: 16px;
    align-items: start;
  }
  /* ...and the toggle has to be able to take that narrower track: its options are a fixed 150
     each, which is 308 for two before the track is even considered. */
  .kf-series__toggle {
    /* `justify-self: start` sizes the toggle to its CONTENT, so it stayed 318 inside a 272 track
       and `min-width: 0` had nothing to act on — the item was never being squeezed. Stretching it
       to the track is what lets the options below shrink. */
    justify-self: stretch;
    min-width: 0;
  }
  .kf-series__opt {
    flex: 1 1 0;
    min-width: 0;
  }
  /* 190 min-width + 48 of padding is 238, which overruns a 320 screen by 2px once centred.
     Qualified to `.kf-onset a.kf-onset__cta` because that is how the base rule is written, and a
     single class loses to it. */
  .kf-onset a.kf-onset__cta {
    min-width: 0;
  }
  .kf-series .kf-series__head .kf-series__all {
    /* `grid-column: 1` is the fix, not justify-self. The desktop rule pins this link to an explicit
       column so it sits flush right of the toggle; collapsing the template to `1fr` left that
       placement intact, which created an implicit SECOND track and put the link at x=342 — still
       outside a 375 page. Returning it to column 1 is what actually stacks it. */
    grid-column: 1;
    /* `grid-row: auto` as well as the column. The <=1023 rule pins this to row 2, which is where
       the toggle lands once the header is one column — overriding only the column put both in the
       same cell and they rendered on top of each other. */
    grid-row: auto;
    justify-self: start;
  }

  /* 46px of side padding leaves ~200px of measure in a 295px card, and the card is overflow:hidden,
     so the 14px that did not fit was clipped away rather than merely tight. */
  .kf-why .kf-quotecol {
    min-height: 0;
    padding: 32px 24px;
  }
  /* This reduction never applied before: it was written `p.kf-quote__body`, and the body was a
     <blockquote>. The native element renders a real <p>, so it works now. */
  .kf-why blockquote.kf-quote > p {
    font-size: 21px;
    line-height: 32px;
  }

  /* Tap targets. The audit flags anything under 32px; these are the ones a thumb actually goes for
     on this page — inline text links whose line box is ~17px tall. */
  .kf-series__all,
  .kf-sec .kf-link {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }
}

/* ---- mobile: systemic fixes --------------------------------------------
   From an independent layout review at 375/390. Three mechanisms accounted for most of what it
   found; these are the two that are not already handled above.

   MECHANISM A — UIkit puts `margin-top: 30px` on a column via `uk-grid-margin` the moment a
   multi-column grid stacks. Where the two halves are a full-bleed pair designed to ABUT (a photo
   meeting its panel), that margin tears a 30px strip of page background between them. It reads as
   a rendering fault, not a gap. Signup was the worst: white between the photo and the black panel,
   and white again between that panel and the black band below it.

   MECHANISM B — desktop padding and placement left in force after the layout goes single column.  */
@media (max-width: 767px) {
  .kf-signup .uk-grid > .uk-grid-margin,
  .kf-onset .uk-grid > .uk-grid-margin,
  .kf-story .uk-grid > .uk-grid-margin {
    margin-top: 0;
  }
  /* ...and the container's own 30px band padding showed as white above the photo and below the
     panel. With the halves abutting there is nothing left for it to separate. */
  .kf-sec.kf-signup > .uk-container {
    padding-block: 0;
  }

  /* One gutter for the page. Measured three: 24px (series, story, arrivals, signup), 40px (hero,
     campaigns, featured, why, buyrent, owners, onset) and 64px (follow) — headings visibly jumped
     left and right while scrolling, 39px in one screenful between Newsletter and Meet Us. */
  .kf-sec > .uk-container {
    padding-inline: 24px;
  }
  .kf-sec.kf-signup > .uk-container {
    padding-inline: 0;
  }

  /* The On Set panel kept its desktop 44px side padding, leaving 207px of measure inside a 295px
     card — the H3 wrapped to five lines. */
  .kf-onset__panel {
    padding: 28px 24px;
  }

  /* Zero-gap junctions: the pull-quote body and its attribution were touching. */
  .kf-why blockquote.kf-quote > p {
    margin-bottom: 20px;
  }

  /* Two-column rows that refuse to stack: a nowrap link holds its width and starves the text
     beside it — a 65-character note was being squeezed into 108px over three lines. */
  .kf-map__foot,
  .kf-follow__head {
    flex-wrap: wrap;
    row-gap: 12px;
  }
  .kf-map__note,
  .kf-follow__line {
    flex: 1 1 100%;
  }

  /* Hero CTAs were 206 and 134 wide, 10px apart, in a 295px column. */
  .kf-hero__cta {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 12px;
  }
  .kf-hero__cta > .kf-btn {
    box-sizing: border-box;
    width: 100%;
    min-height: 52px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    margin: 0;
  }

  /* The video tile's play ring is vertically centred while the caption is bottom-anchored, so in a
     173px tile the ring sat on top of the product name. Pin it to the upper area instead. */
  .kf-tile--video .kf-tile__play {
    top: 34%;
  }

  /* Follow carries its own 24px column padding, which was the gutter back when this band ran
     full-bleed. Now that the container supplies 24 it doubled to 48 — the one band still off the
     page's text axis. */
  .kf-follow .uk-grid > * {
    padding-inline: 0;
  }
}

/* ============================================================================
   Mobile rails — three card groups that were long stacked columns
   ============================================================================
   At 375 these cost 940px (Why, 4 cards), 813px (On Set, 3) and 634px (Campaigns, 3) — between
   0.8 and 1.2 viewports each, for groups whose whole point is that you can compare the items.
   Same treatment as the About range and the warranty coverage tables: one swipeable row, 270px
   cards so the next one is always part-visible, bleeding to the bezels so the overhang reads as
   "there is more" rather than as a clipped column.

   270px matches About's range rail. One card width across the site, so the affordance is learned
   once. The rows bleed with `margin-inline: -24px` against the container's own 24px gutter, then
   put the gutter back as padding, and `scroll-padding-inline` keeps a snapped card in line with
   the copy above instead of flush to the screen edge.

   Chrome comes from kf-home.js's own rail controller (these are registered in its selector), which
   hides the arrows below 768 and shows the progress bar only when there is something to scroll —
   so above the breakpoint each of these is a plain grid again with no leftover furniture. */
@media (max-width: 767px) {
  /* Two classes: `.kf-why .kf-why__grid` sets `display: grid` further up the file, and an
     equal-specificity rule here would lose to it. */
  .kf-why .kf-why__grid > .uk-grid,
  .kf-onset .kf-scards {
    display: flex;
    flex-wrap: nowrap;
    grid-template-columns: none;
    gap: 16px;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    scroll-padding-inline: 24px;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    margin-inline: -24px;
    padding-inline: 24px;
  }
  .kf-why .kf-why__grid > .uk-grid::-webkit-scrollbar,
  .kf-onset .kf-scards::-webkit-scrollbar {
    display: none;
  }
  .kf-why .kf-why__grid > .uk-grid > *,
  .kf-onset .kf-scards > .kf-scard {
    flex: 0 0 270px;
    scroll-snap-align: start;
  }
  /* The section rule above the cards is drawn on .kf-scards itself, so bleeding the row took the
     rule to the bezels with it while every other rule on the page stops at the gutter. Move the
     border and the space it sits under onto the rail wrapper, which stays inside the container. */
  .kf-onset .kf-scards {
    border-top: 0;
    margin-block: 0;
    padding-top: 0;
  }
  .kf-onset .kf-rail:has(.kf-scards) {
    margin-top: 40px;
    padding-top: 31px;
    border-top: 1px solid #e4e4e4;
  }

  /* Campaigns is a native UIkit grid, so it comes with a -30px gutter margin and 30px of
     padding-left per column. Those already place the first tile at the container edge, which is
     what a bleeding rail wants — the row scrolls inside the container's own gutter rather than
     against a second one, so no margin-inline here. `uk-grid-margin` adds margin-top:30px to every
     column after the first, which in a nowrap row is 30px of dead vertical offset. */
  .kf-campaigns .uk-grid:has(.kf-tile):not(.uk-slider-items) {
    flex-wrap: nowrap;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    /* 0, not the 24 the other rails use: this scrollport's own left edge already sits at -6
       (container gutter 24 + UIkit's -30 grid margin), and each column carries 30px of
       padding-left. A snapped column therefore lands its TILE on the 24px gutter with no scroll
       padding at all; adding 24 would push it a gutter further in than the copy above it. */
    scroll-padding-left: 0;
    scrollbar-width: none;
  }
  .kf-campaigns .uk-grid:has(.kf-tile):not(.uk-slider-items)::-webkit-scrollbar {
    display: none;
  }
  .kf-campaigns .uk-grid:has(.kf-tile):not(.uk-slider-items) > * {
    flex: 0 0 300px;   /* 270 of tile + the column's own 30px gutter padding */
    width: auto;
    margin-top: 0;
    scroll-snap-align: start;
  }
}

/* The Why band is ink, so the shared progress track's default rgba(0,0,0,.12) ground disappears
   into it — same reason .kf-featured and .kf-follow are listed above. */
.kf-why .kf-rail__progress {
  background: rgba(255, 255, 255, 0.18);
}

/* ---- New Arrivals: the arrows and the CTA wanted the same corner -----------
   `.kf-arrivals__head > .uk-button` is pinned by the section-head utility to `position: absolute;
   right: 0; bottom: 0`, and `.kf-rail__nav` is `position: absolute; top: -62px; right: 0` — which
   resolves to that same bottom-right of the header. They overlapped by 25px at every width where
   the rail actually scrolls. It never showed on a desktop screenshot because at 1440 the five
   flagged products fit, the rail goes `is-static` and the arrows are hidden.

   Park the arrows to the left of the CTA rather than move the CTA, which is where the design puts
   it. The offset is the CTA's own min-width, declared once so the two cannot drift apart. */
/* The arrows moved onto the tiles, so they no longer share the header's bottom-right with the CTA
   and the dodge that kept them apart is gone. 254 is the card; the media inside it is 207 tall
   starting 24 down, so centring on the card puts the button at 127 — the middle of the product
   shot rather than over its label. */
.kf-arrivals {
  --kf-rail-nav-h: 254px;
}

/* ---- Buy / Rent: the locator card sat 10px outboard of everything else -----
   The row is a `uk-grid-column-small` grid, so it carries `margin-left: -10px` and each column
   pays it back as `padding-left: 10px`. That is invisible on a column with no background — but
   `.kf-locator` IS the white card, so its painted left edge landed on the grid's negative margin
   at 14 while every other element on the page starts at the container's 24. The card also kept a
   24px right pad against a 10px left one, so it read visibly asymmetric.

   Stacked, there is no gutter to compensate for, so the simplest correct answer is to retire the
   whole mechanism below the breakpoint rather than patch one column back into line. */
@media (max-width: 959px) {
  .kf-buyrent .uk-grid {
    margin-left: 0;
  }
  .kf-buyrent .uk-grid > * {
    padding-left: 0;
  }
}

/* ---- the locator map's controls were bigger than the map ------------------
   GeoDirectory hands Google Maps its default control set, which is sized for a desktop map. In a
   303x264 box on a phone the Map/Satellite toggle alone is 192px — 63% of the width — and with the
   Pegman under the zoom column the chrome covered more of the map than the map did.

   Scoped to .kf-locator: the full /dealers/ directory map is large enough to carry all of this, and
   should keep it. Google's attribution and Terms link are deliberately untouched — they are a
   condition of using the API, not chrome. Zoom and fullscreen stay: they are the two controls that
   earn their space at this size, and fullscreen is the way out of a 264px map. */
@media (max-width: 767px) {
  .kf-locator .gm-style-mtc-bbw,
  .kf-locator .gm-svpc {
    display: none !important;
  }
}

/* ---- small targets and small type, from the mobile reviews ----------------
   All three were flagged by the responsive audit's tap-target and minimum-type passes. */
@media (max-width: 767px) {
  /* A product name is the card's link — 254x23 of it. The extra height comes from padding rather
     than margin so it is part of the target, and the 20px that used to sit above it as margin is
     folded in, leaving the visual position unchanged. */
  .kf-arrivals__name {
    margin-top: 9px;
    padding-block: 11px;
  }
  /* 65x15. Inline in a row of its own, so it can take padding without disturbing anything. */
  .kf-follow a.kf-follow__more {
    display: inline-block;
    padding-block: 14px;
  }
}
/* 11px on a #717275 grey is below the audit's floor and hard to read on a phone in daylight.
   12px/16 is the smallest size used anywhere else on the page. */
.kf-buyrent .kf-map__note {
  font:
    500 12px/16px "Roboto",
    sans-serif;
}

/* ---- two bands never got the mobile rhythm --------------------------------
   Every other band drops to 40/40 below 960. New Arrivals kept its desktop 56/64 and Buy & Rent
   its 56/21 — the second of which is a design value measured off a composition where the note
   under the cards carries the rest of the space, and stacked it just reads as a band that stops
   abruptly 21px after its last element. */
@media (max-width: 959px) {
  .kf-sec.kf-arrivals > .uk-container,
  .kf-sec.kf-buyrent > .uk-container {
    padding-block: 40px;
  }
}

/* The story-band filter pills are 8+13+8 = 31px tall, one pixel under the audit's tap floor and
   well under the 44 a thumb wants. The padding grows rather than the type, so the design's 13px
   uppercase label is unchanged. */
@media (max-width: 767px) {
  .kf-pill {
    padding-block: 15px;
  }
}

/* UIkit's nav gives a row a background on hover. The highlighter under the label IS the hover
   signal here, and a full-width grey band on top of it reads as a selection, not a hover. */
.kf-owners .kf-olinks > .uk-nav > li > a:hover,
.kf-owners .kf-olinks > .uk-nav > li > a:focus-visible {
  background-color: transparent;
  /* The theme ships `.uk-nav-default > li > a:hover { padding-left: 5px !important }`, which nudged
     the whole row right on hover — the label visibly jumped beside its neighbours. !important here
     only because it is countering an !important; nothing else in this file needs it. */
  padding-left: 0 !important;
}

/* ---- featured titles: the poster captions -------------------------------
   `.kf-featured__title` / `__kind` are <p> elements, and the section's own `.kf-featured p` rule is
   (0,1,1) against their (0,1,0) — so the built page rendered them at body size in muted grey,
   left-aligned, instead of the design's bold white title over a yellow kind. Same specificity trap
   already documented on the Why band's credit line. Qualified here so they win, and the poster
   picks up the design's rounded corner at the same time. */
.kf-featured .kf-featured__item {
  text-align: center;
}
.kf-featured img.kf-featured__poster {
  border-radius: 8px;
}
.kf-featured p.kf-featured__title {
  font:
    700 13px/17px "Roboto Condensed",
    sans-serif;
  color: #fff;
  margin: 10px 0 2px;
  text-transform: uppercase;
}
.kf-featured p.kf-featured__kind {
  font:
    700 10px/14px "Roboto Condensed",
    sans-serif;
  color: var(--kf-yellow);
  margin: 0;
  letter-spacing: 1px;
  text-transform: uppercase;
}

/* `All Products` sits on the toggle's baseline, not the eyebrow's.
   The shared highlighter rule matches this link via `.kf-sec .kf-link` and carries
   `align-self: flex-start` — two classes, declared later — which beat the header grid's
   `align-items: end` and floated the link 58px up. Restated here at three classes, after that rule.
   Third time that one declaration has decided a position it was never meant to: it is correct in a
   column flex container and wrong in every other context it reaches. */
.kf-sec.kf-series .kf-series__all {
  align-self: end;
}

/* Featured Titles opts into the same overlay controls. 240 is the poster; centring on it keeps the
   arrow off the title/kind caption underneath, and clears the filter pills the pair used to sit
   beside. */
.kf-featured {
  --kf-rail-nav-h: 240px;
}

/* ---- Latest Updates: UIkit Slider -----------------------------------------
   The band is a slider rather than a scroll rail (see kf-home.js). UIkit owns the track, so this
   only positions the controls and keeps the tiles' gutter — the shared `.kf-rail` chrome is not
   used here. */
.kf-campaigns .kf-campaigns__track {
  position: relative;
  /* The heading and the track are separate rows, and the track's row is `uk-container-expand` so
     it runs full-bleed and never receives UIkit's stacked-row margin. Without this the tiles sit
     flush against "Latest Updates" with no gap at all. */
  margin-top: 40px;
}
.kf-campaigns .uk-slider-items > * {
  /* The tiles keep the design's 30px gutter; uk-slider-items strips the grid's own. */
  padding-left: 30px;
}
.kf-campaigns .uk-slider-items {
  margin-left: -30px;
}
/* Controls sit over the tiles at the track's edges, matching the other rails and chauvetdj.com. */
.kf-campaigns .kf-campaigns__nav {
  position: absolute;
  inset: 0 0 auto 0;
  height: 100%;
  pointer-events: none;
}
.kf-campaigns .kf-campaigns__nav .kf-rail__btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: auto;
  opacity: 0;
  width: 44px;
  height: 44px;
  text-decoration: none;
  background: rgba(255, 255, 255, 0.94);
  border-color: rgba(0, 0, 0, 0.1);
  color: var(--kf-ink);
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.18);
  transition: opacity 0.18s ease, background-color 0.15s ease, color 0.15s ease;
}
.kf-campaigns .kf-campaigns__nav .kf-rail__btn--prev {
  left: max(12px, calc(50% - 680px + 12px));
}
.kf-campaigns .kf-campaigns__nav .kf-rail__btn--next {
  right: max(12px, calc(50% - 680px + 12px));
}
.kf-campaigns .kf-campaigns__track:hover .kf-rail__btn,
.kf-campaigns .kf-campaigns__track:focus-within .kf-rail__btn {
  opacity: 1;
}
.kf-campaigns .kf-campaigns__nav .kf-rail__btn:hover {
  background: var(--kf-yellow);
  border-color: var(--kf-yellow);
  color: var(--kf-ink);
}
@media (hover: none), (max-width: 767px) {
  .kf-campaigns .kf-campaigns__nav {
    display: none;
  }
}

/* Dotnav, in place of the scroll-progress bar the rail drew. UIkit builds the list from the item
   count; this only recolours it — the default is a grey ring, and the band's accent is Kino yellow. */
.kf-campaigns .kf-campaigns__dots {
  display: flex;
  justify-content: center;
  /* The 16px between dots is now the anchors' own padding; a flex gap would add to it. */
  gap: 0;
  margin: 28px 0 0;
  padding: 0;
  list-style: none;
}
.kf-campaigns .kf-campaigns__dots > li {
  margin: 0;
}
.kf-campaigns .kf-campaigns__dots > li > * {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  border: 0;
  background: rgba(22, 22, 22, 0.22);
  transition: background-color 0.18s ease, transform 0.18s ease;
  /* The dot stays 9px; the TAP TARGET becomes 25px. content-box sizing makes the padding add to
     the 9px instead of eating it, and background-clip keeps the colour off the padding so nothing
     looks bigger.
     25px, not 44px, because the two constraints fight: non-overlapping targets must be at least
     their own width apart, so 44px targets would force these 9px dots 35px apart and wreck the
     band. 25px clears the WCAG 2.5.8 AA minimum of 24 and moves the visible dots from 10px apart
     to 16px, which is the most this design can absorb. Overlapping targets would be worse than
     small ones: the wrong dot answers the tap. */
  box-sizing: content-box;
  padding: 8px;
  background-clip: content-box;
}
.kf-campaigns .kf-campaigns__dots > li.uk-active > * {
  background: var(--kf-yellow, #fed208);
  transform: scale(1.25);
}
.kf-campaigns .kf-campaigns__dots > li > :focus-visible {
  outline: 2px solid var(--kf-yellow, #fed208);
  outline-offset: 3px;
}

/* Slide widths for the UIkit track. UIkit sizes slides from their own width, and these are the
   figures the scroll rail used, so swapping the mechanism does not move the design: 560 on desktop
   (the design's carousel tile) and 300 below 768 (270 of tile plus the column's 30px gutter). */
.kf-campaigns .uk-slider-items {
  overflow: visible;
}
.kf-campaigns .uk-slider-items > * {
  flex: 0 0 auto;
  width: 560px;
  margin-top: 0;
}
@media (max-width: 767px) {
  .kf-campaigns .uk-slider-items > * {
    width: 300px;
  }
}
