/* ==========================================================================
   J&H Cars — "Tmavá noc" design system. See ../DESIGN.md.
   Dark Night #061726 ground, Crimson Bold #D73139 as a DELIBERATELY SMALL
   accent, everything between them neutral cool grey. The site is meant to read
   near-monochrome and technical — thin rules, small type, flat surfaces — not
   decorative. Radii are near-square, there is no glow, and colour is rationed.
   ========================================================================== */

:root {
  /* ground — Dark Night and four steps lightened toward slate */
  --ink-950: #061726;
  --ink-900: #0A1F31;
  --ink-800: #0F2839;
  --ink-700: #163243;
  --line: #1E4053;
  --hairline: rgba(234, 240, 245, .13);

  /* text — neutral cool greys, no hue of their own */
  --paper: #EAF0F5; /* 15.78:1 on --ink-950 */
  --soft: #B4C2CE;  /*  9.97:1 — body copy */
  --muted: #7E8F9E; /*  5.45:1 — captions, labels */
  --dim: #46586A;   /*  2.47:1 — decorative only, NEVER text */

  /* action — Crimson Bold, rationed. Only ~5% of the page should carry it:
     the primary CTA fill, the nav underline, and a handful of 1px marks.
     CONTRAST TRAP: crimson on the ground is only 3.79:1 — fine for fills, rules
     and icons (3:1 threshold for non-text) but it FAILS as small body text.
     And unlike the last two themes, this fill needs WHITE text (4.79:1);
     dark text on crimson is 3.79:1 and fails. */
  --crimson: #D73139;
  --crimson-deep: #B3232B; /* hover / pressed on filled controls */

  /* form error state — lifted off the accent so a warning never looks clickable,
     and light enough to pass as small text (5.83:1) where crimson would not. */
  --error: #F2645C;

  /* THIRD COLOUR — amber. Added because crimson is only 3.79:1 on the ground, which
     bars it from small text and left the "meta" layer (eyebrows, labels, step numbers)
     stuck on grey and looking flat. Amber is 8.41:1, so it CAN carry small text, and it
     sits between the cool ground and the warm crimson rather than fighting either.
     Division of labour: crimson = act on this. Amber = notice this. Grey = read this. */
  --amber: #E8A33D;
  --amber-dim: rgba(232, 163, 61, .16); /* hairlines and quiet fills */

  /* state — verified reads amber, not crimson: crimson is reserved for actions */
  --verified: #E8A33D;
  --star: #E8A33D;

  /* type — Inter Tight for headings (narrow, modern, technical — replaced
     Cormorant Garamond, whose decorative serif was the single biggest thing
     separating this site from the reference designs) over Plus Jakarta Sans for
     body. Both ship latin-ext, so Slovak carons (ť ľ ď ĺ ŕ) render — verified
     against the Google Fonts unicode-ranges before switching. */
  /* ONE type scale. Every size on the site comes from these eight steps — added after
     the cocoonblanket.com reference pass, where the whole page runs on a handful of
     type roles and nothing is sized ad hoc. Do not introduce a ninth step or an
     inline font-size; if something needs to be bigger, it is a --fs-header. */
  --fs-display: clamp(2rem, 5.6vw, 3.5rem);
  --fs-header: clamp(1.9rem, 4vw, 2.7rem);
  --fs-title: clamp(1.5rem, 2.8vw, 2.05rem);
  --fs-quote: clamp(1.18rem, 2vw, 1.5rem); /* pull quote + the big footer contact links */
  --fs-sub: 1.14rem;
  --fs-lead: 1.02rem;
  --fs-body: .95rem;
  --fs-micro: .86rem;
  --fs-label: .69rem;

  --font-display: 'Inter Tight', system-ui, -apple-system, sans-serif;
  --font-body: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;
  --font-label: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;

  /* layout — near-square corners; the old 16px pill-like radii read as "app UI",
     which is the opposite of the reference direction */
  --container: min(1320px, 100% - clamp(28px, 6vw, 72px));
  --radius: 4px;
  --radius-sm: 2px;
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, .4);
  --shadow-md: 0 16px 40px rgba(0, 0, 0, .5);
  --header-h: 76px;
}

/* ============ RESET ============ */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
/* clip on BOTH html and body — clipping only body still lets the root element form the
   scroll container and report the 100vw overspill of full-bleed sections */
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; overflow-x: clip; }
html, body { height: 100%; }
body {
  font-family: var(--font-body);
  background: var(--ink-950);
  color: var(--soft);
  font-size: 16px;
  line-height: 1.62;
  -webkit-font-smoothing: antialiased;
  /* clip, not hidden: full-bleed elements use 100vw, which INCLUDES the scrollbar, so
     they sit ~8px wider than the content box. overflow-x:hidden would still form a scroll
     container and report the overflow; clip does not, so nothing can be scrolled to. */
  overflow-x: clip;
}
img, picture, svg { display: block; max-width: 100%; }
/* Icons are <svg><use href="#ic-…"/></svg> with no intrinsic size. Without a base
   size they fall back to the replaced-element default of 300×150 and blow up the
   layout. Specificity is (0,0,1) so every component rule below still wins. */
svg { width: 18px; height: 18px; flex: none; }
input, button, textarea, select { font: inherit; color: inherit; }
button { cursor: pointer; }
a { color: inherit; text-decoration: none; }
/* ol included: the stepper is an <ol>, and the UA's 40px padding-inline-start was
   pushing the number circles off the drawn track's centre line */
ul, ol { list-style: none; padding: 0; }
/* Inter Tight has a normal x-height, so the +15% bump Cormorant needed is reversed and
   the scale steps back down. A narrow sans also wants negative tracking at display
   sizes, which the serif did not. */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  color: var(--paper);
  line-height: 1.06;
  font-weight: 600;
  letter-spacing: -.022em;
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important; animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.skip-link {
  position: absolute; left: 12px; top: -60px; z-index: 200;
  background: var(--crimson); color: #fff; padding: 12px 18px; border-radius: var(--radius-sm);
  font-family: var(--font-label); font-size: 14px; transition: top .2s ease;
}
.skip-link:focus { top: 12px; }
:focus-visible { outline: 2px solid var(--crimson); outline-offset: 3px; border-radius: 3px; }

/* ============ LAYOUT ============ */
.container { width: var(--container); margin-inline: auto; }
/* Sections were asked to breathe more, so the whole rhythm stepped up a notch. */
.section { padding-block: clamp(76px, 10.5vw, 140px); }
.section--tight { padding-block: clamp(54px, 7vw, 86px); }
.section-head { max-width: 760px; margin-bottom: clamp(38px, 5.6vw, 68px); }
.section-title { font-size: var(--fs-title); }
.section-title--xl { font-size: var(--fs-header); }
/* a shorter measure than the old 64ch: the reference keeps every paragraph to about
   two short lines, which is also what forces the copy to stay edited */
.section-sub { margin-top: 14px; font-size: var(--fs-lead); color: var(--soft); max-width: 46ch; }

/* ONE label role for the whole site. The numbered section badges (.num-row /
   .num-badge, 02 · 03 · 04 …) were removed: the numbers were decoration, not a real
   sequence, which the owner's own rulebook (section 2.5) rules out — and the reference
   site labels its sections with nothing but a small grey line of text. The classes are
   gone from the markup; do not bring them back. */
.eyebrow {
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .15em;
  text-transform: uppercase; color: var(--muted); display: inline-flex;
  align-items: center; gap: 10px; margin-bottom: 16px;
}
.eyebrow::before { content: ''; width: 20px; height: 2px; background: var(--crimson); }

/* hairline + proof row */
.hair { height: 1px; width: 100%; background: var(--hairline); }
.proof-row {
  display: flex; align-items: center; flex-wrap: wrap; gap: 10px;
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .12em;
  text-transform: uppercase; color: var(--muted); margin-top: 14px;
  max-width: none; /* it's a <p>, so it would otherwise inherit the 66ch measure */
}
/* separated by whitespace alone — the little round .pdot separators were removed on
   request, so the gap has to carry the separation instead */
.proof-row { gap: 10px clamp(22px, 4vw, 40px); }

/* ============ TYPOGRAPHY ============ */
h1 { font-size: var(--fs-display); line-height: 1.04; }
h2 { font-size: var(--fs-title); }
h3 { font-size: var(--fs-lead); font-weight: 600; letter-spacing: -.012em; }
h4 { font-weight: 700; }
p { max-width: 66ch; }
strong { color: var(--paper); font-weight: 600; }

/* ============ BUTTONS ============ */
.btn {
  /* buttons stay in the sans (UI face) — a serif CTA reads as decorative, not actionable */
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  font-family: var(--font-body); font-weight: 600; font-size: var(--fs-body); letter-spacing: -.005em;
  padding: 15px 26px; border: 1.5px solid transparent; border-radius: var(--radius-sm);
  transition: transform .18s ease, box-shadow .18s ease, background .18s ease,
              border-color .18s ease, color .18s ease;
  white-space: nowrap;
}
.btn svg { width: 18px; height: 18px; flex-shrink: 0; transition: transform .22s ease; }
.btn:hover svg { transform: translateX(3px); }
/* WHITE text, not dark — this palette inverts the last two. White on crimson is
   4.79:1 (passes); --ink-950 on crimson is only 3.79:1 and fails for button text.
   No glow: the accent carries the emphasis on its own. */
.btn--primary { background: var(--crimson); color: #fff; font-weight: 600; }
.btn--primary:hover { background: var(--crimson-deep); }
.btn--primary:active { transform: translateY(1px); transition-duration: .08s; }
.btn--ghost { background: transparent; color: var(--paper); border-color: var(--line); }
/* border only — crimson as small link text would be 3.79:1 and fail */
.btn--ghost:hover { border-color: var(--crimson); color: var(--paper); }
.btn--ghost:active { transform: translateY(1px); transition-duration: .08s; }
.btn--quiet {
  /* underline appears on interaction only — a permanent one next to the hero's own
     hairline read as two redundant rules stacked close together */
  background: transparent; color: var(--muted); font-family: var(--font-label);
  font-weight: 500; font-size: var(--fs-micro); padding: 15px 4px;
  border-bottom: 1px solid transparent; border-radius: 0;
  transition: color .18s ease, border-color .18s ease;
}
.btn--quiet:hover, .btn--quiet:focus-visible { color: var(--paper); border-bottom-color: var(--paper); }
.btn--quiet:hover svg { transform: translateX(3px); }
.btn--sm { padding: 11px 18px; font-size: var(--fs-micro); }
.btn--lg { padding: 18px 32px; font-size: var(--fs-lead); }

/* The "bitten corner" notch is retired. It came from an early reference and was the
   most decorative thing on the page — the opposite of the direction chosen here.
   The class is kept as a no-op so the existing markup doesn't need touching. */
.btn--bitten { border-radius: var(--radius-sm); }

/* ============ HEADER ============ */
.site-header {
  position: sticky; top: 0; z-index: 100; background: rgba(6, 23, 38, .88);
  backdrop-filter: blur(12px); border-bottom: 1px solid var(--line);
}
.header-inner { display: flex; align-items: center; justify-content: space-between; height: var(--header-h); gap: 24px; }
.brand { display: flex; align-items: center; min-height: 44px; }
/* The client's real logo is a near-square emblem (car + swoosh + wordmark stacked),
   not the old wide lockup — it needs more height to keep the "J & H CARS" line legible. */
.brand img { height: 52px; width: auto; }
/* ============ NAV — sliding tab bar ============
   Vanilla port of the Vercel-style tabs the owner supplied as a React component:
   a rounded highlight that slides to whichever item is hovered, plus a 2px bar
   under the current page. Both are single elements measured and positioned in
   js/main.js, so the motion is one transition rather than per-item states.
   Because this is a multi-page site, the "active tab" is the current page and
   does not move on click — the browser navigates instead. */
.vtabs { position: relative; }
.vtabs-hover, .vtabs-active {
  position: absolute; pointer-events: none;
  transition: left .3s ease, width .3s ease, opacity .3s ease;
}
.vtabs-hover {
  top: 50%; height: 30px; margin-top: -15px;
  background: rgba(234, 240, 245, .10); border-radius: 6px; opacity: 0;
}
.vtabs-active { bottom: -6px; height: 2px; background: var(--crimson); border-radius: 2px; }
/* nothing to slide before JS measures, and no flash of a mis-placed bar */
.js .vtabs-active { opacity: 0; }
.js .vtabs-active.is-ready { opacity: 1; }

/* deliberately NOT position:relative — the links' offsetParent has to be .vtabs, which
   is what the highlight and underline are positioned against. If .nav-list becomes a
   containing block the two coordinate systems can drift apart. */
.nav-list { display: flex; align-items: center; gap: 6px; }
.nav-link {
  /* positioned so it paints ABOVE .vtabs-hover. Both highlights are absolutely
     positioned and sit earlier in the DOM, so without this the hover pill renders on
     top of the link text and washes it out. Making the link itself relative does not
     change its own offsetParent, so the JS measurements stay anchored to .vtabs. */
  position: relative;
  display: flex; align-items: center; height: 30px; padding: 0 12px;
  font-size: var(--fs-body); font-weight: 500; color: var(--muted);
  white-space: nowrap; transition: color .3s ease;
}
.nav-link:hover { color: var(--paper); }
.nav-link[aria-current="page"] { color: var(--paper); font-weight: 600; }
@media (prefers-reduced-motion: reduce) {
  .vtabs-hover, .vtabs-active { transition: none; }
}
.header-cta { display: flex; align-items: center; gap: 12px; }
.tel-chip {
  display: inline-flex; align-items: center; gap: 9px; font-family: var(--font-label);
  font-size: var(--fs-micro); color: var(--paper); background: var(--ink-800);
  border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 10px 16px;
  transition: border-color .18s ease, transform .18s ease, background .18s ease;
}
.tel-chip svg { width: 16px; height: 16px; color: var(--muted); transition: transform .3s ease; }
.tel-chip:hover { border-color: var(--crimson); transform: translateY(-1px); background: var(--ink-700); }
.tel-chip:hover svg { transform: rotate(-10deg) scale(1.1); }
.tel-chip:active { transform: translateY(0) scale(.97); }

.nav-toggle {
  display: none; flex-direction: column; justify-content: center; gap: 5px;
  width: 42px; height: 42px; border: 1px solid var(--line); border-radius: 10px; background: var(--ink-800);
  transition: border-color .18s ease, transform .12s ease;
}
.nav-toggle:hover { border-color: var(--crimson); }
.nav-toggle:active { transform: scale(.93); }
.nav-toggle span { width: 18px; height: 2px; background: var(--paper); margin-inline: auto; transition: transform .2s ease, opacity .2s ease; }
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
.nav-panel[hidden] { display: none; }

@media (max-width: 880px) {
  .nav, .header-cta .tel-chip, .header-cta .btn { display: none; }
  .nav-toggle { display: flex; }
  .nav-panel:not([hidden]) {
    display: block; position: fixed; inset: var(--header-h) 0 0 0; background: var(--ink-950);
    z-index: 99; padding: 28px clamp(20px, 6vw, 40px); overflow-y: auto;
    animation: nav-panel-in .22s ease both;
  }
  @keyframes nav-panel-in { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: none; } }
  .nav-panel ul { display: flex; flex-direction: column; gap: 2px; margin-bottom: 26px; }
  /* height:auto is load-bearing: the desktop .nav-link is a 30px-tall flex row, and with
     the global box-sizing:border-box that 30px is the WHOLE box. Here the padding alone
     is 15+15, so the content box collapsed to zero, the text spilled 10px past the
     bottom border and the hairline struck straight through the words. */
  .nav-panel .nav-link {
    display: block; height: auto; padding: 15px 4px;
    font-size: var(--fs-sub); border-bottom: 1px solid var(--line);
    transition: color .15s ease, padding-left .15s ease;
  }
  .nav-panel .nav-link:hover, .nav-panel .nav-link:focus-visible { color: var(--paper); padding-left: 10px; }
  .nav-panel .btn { width: 100%; justify-content: center; margin-top: 12px; }
  .nav-panel .tel-chip { width: 100%; justify-content: center; }
}

/* ============ HERO — centred lockup ============ */
.hero {
  position: relative;
  min-height: min(88svh, 780px);
  display: flex; flex-direction: column;
  padding-block: clamp(40px, 8vh, 90px) clamp(24px, 4vh, 40px);
  overflow: hidden;
}
.hero-backdrop { position: absolute; inset: 0; z-index: 0; background: var(--ink-900); }
.hero-backdrop img {
  width: 100%; height: 114%; object-fit: cover; object-position: 62% 46%;
  position: absolute; left: 0; top: -7%; opacity: .62;
}
/* Two scrims. The vertical one seats the hero into the page; the radial one keeps the
   middle of the frame dark enough for centred copy no matter how bright the car is
   behind it — the photo is a white car, so a weak scrim renders white-on-white.
   (Was a left-weighted 90deg gradient back when the copy sat in a left column.) */
.hero-backdrop::after {
  content: ''; position: absolute; inset: 0;
  background:
    radial-gradient(115% 85% at 50% 50%, rgba(6, 23, 38,.44) 0%, rgba(6, 23, 38,.60) 55%, rgba(6, 23, 38,.78) 100%),
    linear-gradient(180deg, rgba(6, 23, 38,.62) 0%, rgba(6, 23, 38,.24) 26%, rgba(6, 23, 38,.72) 74%, var(--ink-950) 100%);
}
@media (max-width: 899px) {
  .hero-backdrop::after {
    background:
      linear-gradient(180deg, rgba(6, 23, 38,.68) 0%, rgba(6, 23, 38,.6) 22%, rgba(6, 23, 38,.93) 66%, var(--ink-950) 100%);
  }
  .hero-backdrop img { opacity: .3; }
}
/* Copy is centred in the frame — vertically (auto margins top and bottom) and
   horizontally (each child capped by its own measure, then margin-inline:auto). */
.hero-inner { position: relative; z-index: 1; margin-block: auto; }
.hero-copy { text-align: center; }
.hero-title {
  font-size: var(--fs-display);
  margin-bottom: 18px; max-width: 19ch; margin-inline: auto;
}
.hero-title em { font-style: normal; color: var(--crimson); }
.hero-sub {
  font-size: var(--fs-lead); max-width: 46ch; margin-bottom: 30px;
  margin-inline: auto; color: var(--soft);
}
.hero-actions { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: center; }
.hero-foot { position: relative; z-index: 1; margin-top: clamp(36px, 7vh, 72px); }
.hero-foot .proof-row { justify-content: center; }

@media (min-width: 900px) {
  .hero-sub { margin-bottom: 34px; }
}

/* ============ IMPORT STEPPER ============
   Was a diagram: a line drawn down the CENTRE of the section, icon circles sitting on
   it, and the five step texts alternating to its left and right. The owner's words —
   it is scattered, the icon principle is not nice, and the text is hard to find. Same
   failure as the staged headline it sat under: no common left edge, so reading it meant
   jumping across the page and back.

   It is a list now. One left edge, one hairline between rows, the icon inline at the
   start of its row instead of floating in a circle on a track. The icons keep their
   self-drawing entrance (see the pathLength note in CLAUDE.md) — it just happens in
   place rather than along a line. */
.stepper { position: relative; }
.stepper-list { display: grid; gap: 0; }
.stepper-item {
  display: grid; grid-template-columns: 34px 1fr; gap: clamp(16px, 2vw, 26px);
  align-items: start;
  padding-block: clamp(22px, 3vw, 34px);
  border-top: 1px solid var(--hairline);
}
.stepper-item:first-child { border-top: 0; padding-top: 0; }

/* no circle, no fill, no border — the icon is a mark in the text, not an object */
.stepper-num { display: flex; align-items: flex-start; justify-content: flex-start; padding-top: 2px; }
.stepper-num svg { width: 26px; height: 26px; color: var(--muted); transition: color .35s ease; }
.stepper-item.is-done .stepper-num svg { color: var(--amber); }

/* ---- the step icons draw themselves ----
   Every shape in the symbols carries pathLength="1", so one dash pair draws all of them
   at once, and because stroke-dasharray / stroke-dashoffset are inherited SVG properties
   setting them on the <svg> reaches inside the <use> shadow tree, which a selector
   cannot. Start state is `1 2` / `1.02`, not a flat `1`: at exactly 1 the dash boundary
   sits on the path start and the round caps leave visible specks. */
.js .stepper-num svg {
  stroke-dasharray: 1 2; stroke-dashoffset: 1.02;
  transition: color .35s ease, stroke-dashoffset .9s cubic-bezier(.32, .72, .32, 1);
}
.js .stepper-item.is-done .stepper-num svg { stroke-dashoffset: 0; }
@media (prefers-reduced-motion: reduce) {
  .js .stepper-num svg { stroke-dashoffset: 0; transition: none; }
}

.stepper-index {
  display: block; margin-bottom: 6px;
  font-family: var(--font-label); font-size: var(--fs-label); font-weight: 600;
  letter-spacing: .2em; color: var(--muted);
}
.stepper-body h3 { font-size: var(--fs-sub); margin-bottom: 7px; }
.stepper-body p { font-size: var(--fs-body); max-width: 56ch; }

@media (max-width: 560px) {
  .stepper-item { grid-template-columns: 26px 1fr; gap: 14px; }
  .stepper-num svg { width: 22px; height: 22px; }
}

/* ============ VEHICLE CARD ============ */
/* Asymmetric corners rather than a uniform rounded rectangle — the offer block reads as
   a shaped object instead of a generic card, and it rhymes with the bitten-corner CTA. */
.vehicle-card {
  display: grid; grid-template-columns: 1.1fr 1fr; background: var(--ink-800);
  border: 1px solid var(--line); border-radius: 30px 6px 30px 6px; overflow: hidden;
  /* mostly depth, only a trace of tint — a strongly coloured halo here was part of the
     glow overuse and made the card look like it was lit from underneath */
  box-shadow: none;
}
/* Centred in its column and pinned to 4:3 instead of stretched to the body's height.
   align-self:center is what makes aspect-ratio safe here: a STRETCHED grid item has a
   definite height, so aspect-ratio resolves its WIDTH from the row — that is exactly
   the bug the old aspect-ratio:5/4 caused. Unstretched, the height resolves from the
   column width instead. Before this, the column ran ~600px tall against a 4:3 photo and
   object-fit:cover carved a narrow vertical slice out of the car. */
.vehicle-photo {
  position: relative; align-self: center; aspect-ratio: 4 / 3;
  overflow: hidden; background: var(--ink-900);
}
/* Absolutely positioned so the photo never feeds back into grid sizing. */
.vehicle-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.vehicle-body { padding: clamp(24px, 3vw, 40px); display: flex; flex-direction: column; }

/* Badge row. These used to float on top of the photo; in the product-grid reference
   the badges sit in the text block above the name, which keeps the photo clean. */
.vehicle-pills { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 18px; }
.vpill {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--font-label); font-size: var(--fs-label); font-weight: 600;
  letter-spacing: .09em; text-transform: uppercase;
  padding: 5px 11px; border-radius: var(--radius-sm);
  border: 1px solid var(--line); color: var(--muted);
}
.vpill svg { width: 12px; height: 12px; }
.vpill--new { background: var(--crimson); border-color: var(--crimson); color: #fff; font-weight: 600; }
.vpill--ok { color: var(--paper); border-color: rgba(215, 49, 57, .45); }
/* hold states (Rezervované, Predané) — amber is the "notice this" colour, crimson stays
   reserved for "act on this", so a held car cannot read as an available one */
.vpill--hold { background: transparent; border-color: var(--amber); color: var(--amber); }

.vehicle-title { font-size: var(--fs-sub); margin-bottom: 7px; letter-spacing: -.004em; }
/* the mono category line under the product name, straight from the tile-grid reference */
.vehicle-cat {
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .11em;
  text-transform: uppercase; color: var(--muted); margin-bottom: 20px;
}
.vehicle-sub { color: var(--soft); font-size: var(--fs-body); margin-bottom: 20px; }

/* No inset panel: a bordered box inside a bordered card was the nesting the owner
   objected to. The rows sit directly on the card, separated by hairlines only. */
/* more than one car stacks with real air between the cards */
.vozidla-list { display: flex; flex-direction: column; gap: clamp(28px, 4vw, 52px); }
.vehicle-empty { color: var(--muted); font-size: var(--fs-body); }
.spec-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 20px; }
.spec-row { display: flex; flex-direction: column; gap: 3px; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
/* last row of the 2-col grid carries no rule — it would read as an underline on the box */
.spec-row:nth-last-child(-n+2) { padding-bottom: 0; border-bottom: 0; }
.spec-label { font-size: var(--fs-label); text-transform: uppercase; letter-spacing: .1em; color: var(--muted); font-family: var(--font-label); }
.spec-value { font-family: var(--font-label); font-weight: 600; color: var(--paper); font-size: var(--fs-body); font-variant-numeric: tabular-nums; }

/* One oversized figure with small pill labels beneath it — the pricing-card move. */
.vehicle-price {
  margin-top: auto; padding-top: 22px; border-top: 1px solid var(--line);
  display: flex; flex-direction: column; align-items: flex-start;
}
.price-num {
  font-family: var(--font-label); font-weight: 800; line-height: 1;
  font-size: clamp(2rem, 3.4vw, 2.6rem); color: var(--crimson); letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
}
.price-pills { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 14px; }
.ppill {
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .04em;
  padding: 4px 9px; border-radius: var(--radius-sm);
  background: var(--ink-700); color: var(--soft);
}
.ppill--alt { background: transparent; border: 1px solid var(--line); color: var(--muted); }
.vehicle-price .btn { margin-top: 20px; }
@media (max-width: 780px) {
  .vehicle-card { grid-template-columns: 1fr; }
  .vehicle-photo { aspect-ratio: 4 / 3; }
}

/* Two actions per card: "get in touch" and "look closer". The second one exists
   because the card deliberately shows only four numbers — everything else moved into
   the dialog so the card could stop being tall enough to crop its own photo. */
.vehicle-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
.vehicle-actions .btn { margin-top: 0; }

/* Click target over the photo. Mouse affordance only — it is aria-hidden and
   tabIndex -1, because the real button lives in the price block. Carries no label:
   the owner does not want a photo count anywhere on the card. */
.vphoto-open {
  position: absolute; inset: 0; z-index: 1;
  border: 0; background: transparent; cursor: zoom-in;
}

/* ============ VEHICLE DETAIL DIALOG ============ */
/* Built and filled by js/vozidla.js. Appended to <body>, never inside <header> —
   the header's backdrop-filter would become the containing block for position:fixed. */
.vmodal[hidden] { display: none; }
.vmodal {
  position: fixed; inset: 0; z-index: 120;
  display: flex; align-items: center; justify-content: center;
  padding: clamp(0px, 3vw, 40px);
}
body.vmodal-open { overflow: hidden; }
.vmodal-backdrop { position: absolute; inset: 0; background: rgba(3, 10, 18, .84); }
.vmodal-panel {
  position: relative; z-index: 1;
  width: min(1240px, 100%); max-height: 100%;
  /* minmax(0,1fr) on the row is what lets the info column actually scroll: an auto row
     takes its content height, overflows the clamped panel and overflow:hidden just
     clips it, so the column's own overflow-y never gets a chance to fire. */
  display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr);
  background: var(--ink-800); border: 1px solid var(--line);
  border-radius: 30px 6px 30px 6px; overflow: hidden;
  box-shadow: var(--shadow-md);
}
.vmodal-close {
  position: absolute; top: 14px; right: 14px; z-index: 3;
  width: 42px; height: 42px; border-radius: 50%; padding: 0;
  display: grid; place-items: center;
  background: rgba(6, 23, 38, .86); border: 1px solid var(--line); color: var(--paper);
  cursor: pointer; transition: border-color .2s ease, color .2s ease;
}
.vmodal-close svg { width: 17px; height: 17px; }
.vmodal-close:hover { border-color: var(--crimson); }

.vmodal-gallery {
  display: flex; flex-direction: column; justify-content: center;
  min-width: 0; min-height: 0; background: var(--ink-950);
}
.vmodal-stage { position: relative; aspect-ratio: 4 / 3; min-height: 0; }
/* contain, not cover: three of the source photos are portrait and the point of the
   dialog is to show the whole frame, not a confident crop of it */
.vmodal-stage img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.vmodal-nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 46px; height: 46px; border-radius: 50%; padding: 0;
  display: grid; place-items: center;
  background: rgba(6, 23, 38, .74); border: 1px solid var(--line); color: var(--paper);
  cursor: pointer; transition: border-color .2s ease, background .2s ease;
}
.vmodal-nav svg { width: 20px; height: 20px; }
.vmodal-nav:hover { border-color: var(--crimson); background: rgba(6, 23, 38, .92); }
.vmodal-prev { left: 12px; }
.vmodal-next { right: 12px; }
.vmodal-counter {
  position: absolute; right: 14px; bottom: 14px;
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .09em;
  padding: 5px 10px; border-radius: var(--radius-sm);
  background: rgba(6, 23, 38, .82); border: 1px solid var(--line); color: var(--soft);
  font-variant-numeric: tabular-nums;
}
.vmodal-thumbs {
  display: flex; gap: 8px; padding: 10px; overflow-x: auto; overscroll-behavior-x: contain;
  border-top: 1px solid var(--line);
  scrollbar-width: thin; scrollbar-color: var(--line) transparent;
}
.vmodal-thumbs::-webkit-scrollbar { height: 8px; }
.vmodal-thumbs::-webkit-scrollbar-track { background: transparent; }
.vmodal-thumbs::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
.vmodal-info { scrollbar-width: thin; scrollbar-color: var(--line) transparent; }
.vmodal-info::-webkit-scrollbar { width: 8px; }
.vmodal-info::-webkit-scrollbar-track { background: transparent; }
.vmodal-info::-webkit-scrollbar-thumb { background: var(--line); border-radius: 4px; }
.vmodal-thumbs[hidden] { display: none; }
.vmodal-thumb {
  flex: 0 0 78px; aspect-ratio: 4 / 3; padding: 0; overflow: hidden; cursor: pointer;
  border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--ink-900);
  opacity: .5; transition: opacity .2s ease, border-color .2s ease;
}
.vmodal-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.vmodal-thumb:hover { opacity: .85; }
.vmodal-thumb[aria-current="true"] { opacity: 1; border-color: var(--crimson); }

.vmodal-info { padding: clamp(22px, 2.4vw, 36px); overflow-y: auto; min-width: 0; min-height: 0; }
/* amber, not crimson — these are "notice this" labels, and crimson is rationed to actions */
.vmodal-h {
  font-family: var(--font-label); font-size: var(--fs-label); font-weight: 600;
  letter-spacing: .11em; text-transform: uppercase; color: var(--amber);
  margin: 26px 0 12px; padding-top: 16px; border-top: 1px solid var(--line);
}
.vmodal-info .spec-grid + .vmodal-h { margin-top: 26px; }
.vybava-group ul { display: grid; gap: 8px; }
.vybava-group li {
  position: relative; padding-left: 17px;
  color: var(--soft); font-size: var(--fs-body); line-height: 1.5;
}
.vybava-group li::before {
  content: ''; position: absolute; left: 0; top: .66em;
  width: 7px; height: 1px; background: var(--crimson);
}
.vmodal-info .vehicle-price { margin-top: 28px; }

@media (max-width: 900px) {
  .vmodal { padding: 0; }
  .vmodal-panel {
    grid-template-columns: 1fr;
    /* must undo the desktop minmax(0,1fr) row: stacked, the gallery lands in that row
       and the tall info column in an implicit auto one, so 1fr resolved to 0 and the
       gallery collapsed to a sliver */
    grid-template-rows: auto;
    border-radius: 0; max-height: 100%; overflow-y: auto; align-content: start;
  }
  .vmodal-info { overflow: visible; }
  .vmodal-nav { width: 40px; height: 40px; }
  /* the panel itself scrolls here, so an absolutely-positioned close button would
     scroll away with it — pin it to the viewport instead */
  .vmodal-close { position: fixed; }
}

/* ============ WHY-US ============ */
/* copy pinned to the left edge, cards pushed hard right against it — the columns are
   deliberately lopsided so the block reads as two opposed edges, not a balanced pair */
.why-split { display: grid; grid-template-columns: minmax(0,.62fr) minmax(0,1.38fr); gap: clamp(32px, 7vw, 110px); align-items: start; }
.why-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(24px, 3.4vw, 44px); }
/* Not cards any more: a bordered, lifting, shadowed box for four short facts was
   four boxes of chrome around twelve words. Now each item is just a hairline, a
   heading and a line of text. */
.why-card {
  padding-top: 18px; border-top: 1px solid var(--hairline);
}
.why-card h3 { font-size: var(--fs-lead); margin-bottom: 8px; }
.why-card p { font-size: var(--fs-body); max-width: 34ch; }
@media (max-width: 880px) {
  .why-split { grid-template-columns: 1fr; }
  .why-grid { grid-template-columns: 1fr; }
}

/* ============ TRUST MOMENT ============ */
.trust-band { display: grid; grid-template-columns: minmax(0,.72fr) minmax(0,1.28fr); gap: clamp(28px, 5vw, 72px); align-items: center; }
/* tall portrait rather than a 4:3 landscape — asked to run long on the vertical */
.trust-photo { position: relative; border-radius: var(--radius); overflow: hidden; aspect-ratio: 3/4.4; box-shadow: none; border: 1px solid var(--line); }
.trust-photo img { position: absolute; left: 0; top: -7%; width: 100%; height: 114%; object-fit: cover; }
.trust-copy blockquote {
  font-family: var(--font-display); font-weight: 500;
  font-size: var(--fs-quote); color: var(--paper); line-height: 1.38; margin-bottom: 18px;
}
.trust-copy cite { font-style: normal; font-size: var(--fs-micro); color: var(--muted); font-family: var(--font-label); }
@media (max-width: 880px) { .trust-band { grid-template-columns: 1fr; } .trust-photo { order: -1; } }

/* ============ FAQ ============ */
/* Laid out like a memory-game board: equal square-ish tiles on a grid rather than a
   stack of thin accordion bars. min-height (not aspect-ratio) keeps them square while
   closed but lets a tile grow freely when its answer opens. Five questions + one "ask us"
   tile fills a 3-column board exactly. */
.faq-list {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(13px, 1.7vw, 20px); max-width: none;
}
/* Lifted off the page rather than sitting flat: a lit top edge, a soft ambient shadow
   and a tighter contact shadow underneath. Hover raises the tile and deepens both. */
.faq-item, .faq-ask {
  background: var(--ink-900);
  border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
  display: flex; flex-direction: column;
  min-height: clamp(176px, 19vw, 226px);
  box-shadow: none;
  transition: border-color .25s ease, transform .25s ease, box-shadow .25s ease;
}
.faq-item:hover, .faq-ask:hover {
  border-color: var(--dim); transform: translateY(-5px);
  box-shadow: none;
}
.faq-q {
  /* grow to fill the closed square, but never shrink below the question's own height —
     with plain `flex: 1` (basis 0) an opened answer squeezed the summary and the
     question text got clipped by the tile's overflow:hidden */
  list-style: none; cursor: pointer; flex: 1 0 auto;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px;
  padding: 24px 20px; font-family: var(--font-display); font-weight: 700;
  font-size: var(--fs-sub); line-height: 1.24;
  color: var(--paper); text-align: center; transition: background .2s ease;
}
.faq-q:hover { background: rgba(234, 240, 245, .06); }
.faq-q::-webkit-details-marker { display: none; }
.faq-q::marker { content: ''; }
.faq-q svg { width: 20px; height: 20px; flex-shrink: 0; transition: transform .25s ease; color: var(--muted); }
.faq-item[open] .faq-q svg { transform: rotate(45deg); }
.faq-item[open] { border-color: var(--dim); }
.faq-a { padding: 0 22px 24px; font-size: var(--fs-body); text-align: center; margin-inline: auto; animation: faq-a-in .22s ease both; }

/* the sixth tile — completes the board and gives the section an exit */
.faq-ask { justify-content: center; align-items: center; text-align: center; padding: 24px 20px; text-decoration: none; }
.faq-ask-q { font-family: var(--font-display); font-weight: 700; font-size: var(--fs-sub); line-height: 1.24; color: var(--paper); }
.faq-ask-note {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin-top: 14px; font-size: var(--fs-micro); color: var(--muted); transition: color .2s ease;
}
.faq-ask-note svg { width: 20px; height: 20px; color: var(--muted); flex-shrink: 0; transition: transform .25s ease; }
.faq-ask:hover .faq-ask-note { color: var(--paper); }
.faq-ask:hover .faq-ask-note svg { transform: translateX(4px); }

@media (max-width: 900px) { .faq-list { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) {
  .faq-list { grid-template-columns: 1fr; }
  .faq-item, .faq-ask { min-height: 0; }
}
@keyframes faq-a-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* ============ CTA BAND ============ */
/* sits noticeably lower than the section above it and carries the most inner space on
   the page — it's the last thing you read, so it gets room to land */
/* The full-bleed amber panel that used to close every page is gone. It was the one
   block of pure, saturated colour on the site and it was doing the job a photograph
   should do — the reference closes its pages on imagery, not on a colour field.
   The band is now a photo behind the copy, dissolved at both edges like every other
   photo here, with a veil heavy enough to keep the type at full contrast. */
.cta-band {
  position: relative; overflow: hidden;
  background: var(--ink-950); text-align: center;
  padding-block: clamp(88px, 12.5vw, 156px); margin-top: clamp(24px, 4.5vw, 64px);
}
.cta-band-bg {
  position: absolute; inset: 0; z-index: 0;
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%);
          mask-image: linear-gradient(180deg, transparent 0%, #000 16%, #000 84%, transparent 100%);
}
.cta-band-bg img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 45%; display: block; }
.cta-band-bg::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(6,23,38,.94) 0%, rgba(6,23,38,.78) 50%, rgba(6,23,38,.94) 100%);
}
/* A single thin line-glyph, the same kind of minimal mark the reference colour cards
   carry in their corner. Decorative only — no markup, no extra request, and it stays
   far below text contrast so it reads as texture. */
/* The bloom that used to sit behind this copy was removed — glow was being leaned on
   in too many places at once and stopped meaning anything. The band now separates by
   surface and rule alone. */
/* only the copy — NOT .cta-band-bg, which must stay absolutely positioned. This rule
   used to be `> *` and it silently un-positioned the photo layer, turning it into a
   block that pushed the copy out of the band. */
.cta-band > .container { position: relative; z-index: 1; }
.cta-title { font-size: var(--fs-title); margin-bottom: 14px; }
.cta-title b { color: var(--crimson); font-weight: 700; }
.cta-sub { color: var(--soft); font-size: var(--fs-lead); max-width: 44ch; margin: 0 auto 32px; }
.cta-actions { display: flex; gap: 16px; justify-content: center; flex-wrap: wrap; align-items: center; }
/* --muted measures 5.45:1 on the flat ground but only 3.04:1 over the CTA photograph,
   so the quiet link steps up a tone inside this band. */
.cta-band .btn--quiet { color: var(--soft); }
.cta-band .btn--quiet:hover, .cta-band .btn--quiet:focus-visible { color: var(--paper); }

/* ============ COST TABLE ============ */
/* One long column, no boxes and no rules between items — the separation is carried by
   space alone (was a bordered table with a header row and a divider under every line). */
.cost-list { display: flex; flex-direction: column; gap: clamp(24px, 3.4vw, 38px); max-width: 760px; }
.cost-row { display: flex; justify-content: space-between; align-items: baseline; gap: 20px 32px; flex-wrap: wrap; }
.cost-item { font-size: var(--fs-lead); color: var(--soft); max-width: 46ch; }
.cost-price {
  font-weight: 700; font-size: var(--fs-lead); color: var(--paper);
  font-variant-numeric: tabular-nums; white-space: nowrap; margin-left: auto;
}
.cost-note { margin-top: clamp(30px, 4vw, 46px); font-size: var(--fs-micro); color: var(--muted); }

/* The gallery section (.gallery-section / .delivery-shot — the full-bleed handover
   photo with its caption) was removed on request: the source was a 596px Instagram
   screenshot blown up to 560px tall, so it was visibly soft, and the page reads better
   ending on the listing. If the client supplies originals it can come back. */

/* ============ FOOTER ============
   Structure taken from the reference the owner supplied: a wide lead column on the
   left, short link columns to its right under italic-serif headers, and one oversized
   wordmark bleeding off the bottom edge. */
.site-footer {
  position: relative; overflow: hidden;
  background: var(--ink-950); border-top: 1px solid var(--line);
  color: var(--muted); padding-block: clamp(56px, 8vw, 88px) 0;
}
.footer-top {
  display: grid; grid-template-columns: 1fr 2fr;
  gap: clamp(36px, 5vw, 64px); padding-bottom: 46px;
}
.footer-lead { max-width: 40ch; }
.footer-brand { display: flex; align-items: center; margin-bottom: 20px; }
.footer-brand img { height: 54px; width: auto; }
.footer-pitch { font-size: var(--fs-body); margin-bottom: 24px; }
.footer-big { display: flex; flex-direction: column; gap: 5px; margin-bottom: 26px; }
.footer-big a {
  font-family: var(--font-display); font-size: var(--fs-quote); font-weight: 600;
  color: var(--paper); transition: color .18s ease;
}
.footer-big a:hover { color: var(--paper); opacity: .7; }

.footer-cols { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px 24px; }
.footer-col p { font-size: var(--fs-micro); }
/* italic serif column headers — the reference's most distinctive typographic move,
   and the reason --font-display ships an italic 600 weight */
.footer-h {
  font-family: var(--font-display); font-style: italic; font-weight: 600;
  font-size: var(--fs-body); text-transform: uppercase; letter-spacing: .1em;
  color: var(--paper); margin-bottom: 17px;
}
.footer-list { display: flex; flex-direction: column; gap: 11px; }
.footer-list a { display: flex; align-items: center; gap: 9px; font-size: var(--fs-micro); transition: color .18s ease, gap .18s ease; }
.footer-list a:hover { color: var(--paper); gap: 12px; }
.footer-list svg { width: 15px; height: 15px; color: var(--muted); flex-shrink: 0; transition: transform .3s ease; }
.footer-list a:hover svg { transform: scale(1.15); }

.footer-bottom {
  display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px 22px;
  padding-top: 22px; padding-bottom: 24px; border-top: 1px solid var(--line);
  font-size: var(--fs-micro); color: var(--muted);
}
.footer-legal { display: flex; flex-wrap: wrap; gap: 6px 20px; }
.footer-legal a { text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--dim); transition: color .18s ease, text-decoration-color .18s ease; }
.footer-legal a:hover { color: var(--paper); text-decoration-color: var(--crimson); }
.footer-disclaimer { flex: 1 1 100%; max-width: none; }

/* ============ LEGAL + 404 PAGES ============ */
.legal-wrap { max-width: 760px; }
.legal-wrap h2 {
  font-size: var(--fs-sub); margin-top: clamp(34px, 4.5vw, 52px); margin-bottom: 12px;
}
.legal-wrap p { margin-bottom: 14px; }
.legal-wrap a { color: var(--paper); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--crimson); }
.legal-wrap a:hover { color: var(--paper); }
.legal-wrap code {
  font-family: var(--font-label); font-size: .85em; font-weight: 600;
  background: var(--ink-700); color: var(--paper);
  padding: 2px 7px; border-radius: 5px;
}
.legal-list { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.legal-list li { padding-left: 18px; position: relative; }
.legal-list li::before { content: ''; position: absolute; left: 0; top: .62em; width: 7px; height: 1.5px; background: var(--crimson); }
/* an editorial note to the site owner, not legal text — deliberately set apart */
.legal-note {
  margin-top: clamp(26px, 3.5vw, 38px); padding: 18px 20px;
  border-left: 2px solid var(--crimson); background: var(--ink-800);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  font-size: var(--fs-micro); max-width: none;
}

.notfound-wrap { max-width: 620px; }
.notfound-links { display: flex; flex-wrap: wrap; gap: 8px 26px; margin-top: clamp(34px, 5vw, 52px); padding-top: 22px; border-top: 1px solid var(--hairline); }
.notfound-links a { font-family: var(--font-label); font-size: var(--fs-micro); color: var(--muted); transition: color .18s ease; }
.notfound-links a:hover { color: var(--paper); }

/* Oversized wordmark, clipped by the footer's overflow:hidden. Decorative only —
   aria-hidden in the markup, and it must stay far below text contrast so it reads
   as a watermark rather than as content. */
.footer-wordmark {
  font-family: var(--font-display); font-weight: 700;
  font-size: clamp(3.2rem, 17vw, 15rem); line-height: .78;
  letter-spacing: -.03em; white-space: nowrap; text-align: center;
  color: var(--paper); opacity: .05;
  margin-bottom: -.17em; user-select: none; pointer-events: none;
}

@media (max-width: 920px) {
  .footer-top { grid-template-columns: 1fr; }
  .footer-cols { grid-template-columns: repeat(2, 1fr); gap: 26px 20px; }
  .footer-lead { max-width: none; }
}
@media (max-width: 780px) {
  .footer-grid { grid-template-columns: 1fr; gap: 30px; }
  /* these are tap-to-call / tap-to-mail links — give them a real 44px target */
  .footer-list { gap: 2px; }
  .footer-list a { min-height: 44px; }
}

/* ============ FORM ============ */
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }
.field { display: flex; flex-direction: column; gap: 8px; }
.field--full { grid-column: 1 / -1; }
.field label { font-size: var(--fs-micro); font-weight: 600; color: var(--paper); }
.field input, .field textarea {
  background: var(--ink-700); border: 1.5px solid var(--line); border-radius: var(--radius-sm);
  padding: 14px 15px; font-size: var(--fs-body); color: var(--paper);
  transition: border-color .2s ease, box-shadow .2s ease;
}
.field input::placeholder, .field textarea::placeholder { color: var(--muted); }
.field input:focus, .field textarea:focus {
  border-color: var(--crimson); outline: none; box-shadow: 0 0 0 2px rgba(215, 49, 57, .25);
}
/* kept short on purpose: the whole form, submit button included, has to clear a
   ~900px viewport without scrolling — it's resizable if someone wants more room */
.field textarea { resize: vertical; min-height: 104px; }
.btn[disabled] { opacity: .6; cursor: progress; transform: none; }
.form-note { font-size: var(--fs-micro); color: var(--muted); }
.form-status { font-size: var(--fs-body); margin-top: 6px; }
.form-status[data-state="ok"] { color: var(--verified); }
.form-status[data-state="err"] { color: var(--error); }
.hp-field { position: absolute; left: -9999px; }

/* Single vertical flow: intro → contact methods → form → dostupnosť → map (the map
   lives in its own full-width section at the very end of the page). The banner photo
   that used to head this page was removed and the intro folded into the same section,
   so the form's fields and its submit button sit as high up the page as possible. */
.contact-section { padding-block: clamp(24px, 3vw, 36px) clamp(44px, 6vw, 68px); }
.contact-wrap { max-width: 760px; }
.contact-intro { text-align: center; margin-bottom: clamp(22px, 3.5vw, 32px); }
.contact-intro .eyebrow { justify-content: center; }
.contact-intro .section-sub { margin-inline: auto; }

.contact-methods { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: clamp(22px, 3.5vw, 30px); }
/* A small text label centred above the value — the icons were dropped on request, so the
   label is what names each field now. */
.contact-card {
  background: var(--ink-800); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 18px 12px 20px;
  display: flex; flex-direction: column; align-items: center; gap: 7px; text-align: center;
  transition: border-color .25s ease, transform .25s ease, box-shadow .25s ease;
}
.contact-card:hover { border-color: var(--dim); transform: translateY(-3px); box-shadow: var(--shadow-sm); }
/* Deliberately lopsided hierarchy: the label is a whisper, the value carries the card.
   ~1.8x size difference, plus muted --muted against full --paper. */
.contact-label {
  font-family: var(--font-label); font-size: var(--fs-label); font-weight: 600;
  letter-spacing: .2em; text-transform: uppercase; color: var(--muted);
}
.contact-card > a,
.contact-card > p:not(.contact-label) {
  font-size: var(--fs-lead); font-weight: 600; color: var(--paper); line-height: 1.35;
}
/* break-word (not anywhere) so the e-mail only splits at the <wbr> after its @ */
.contact-card p, .contact-card a { max-width: none; overflow-wrap: break-word; }
.contact-card a { transition: color .18s ease; }
.contact-card a:hover { color: var(--paper); }
/* the availability strip reads as one centred line, so label and value sit side by side */
.contact-card--wide { flex-direction: row; justify-content: center; align-items: baseline; gap: 12px; margin-top: clamp(24px, 4vw, 34px); }
.contact-card--wide p { font-size: var(--fs-body); }
@media (max-width: 820px) { .contact-methods { grid-template-columns: 1fr 1fr; } }
.map-embed { border-radius: var(--radius); overflow: hidden; border: 1px solid var(--line); aspect-ratio: 16/10; margin-top: 6px; }
.map-embed--lg { aspect-ratio: 21/9; margin-top: 0; }
@media (max-width: 780px) { .map-embed--lg { aspect-ratio: 4/3; } }
/* canonical dark-map recipe: full invert flips lightness, hue-rotate(180) puts the
   hues back, so it darkens instead of turning the map into a colour negative */
.map-embed iframe { width: 100%; height: 100%; border: 0; filter: invert(1) hue-rotate(180deg) saturate(.75) brightness(.92) contrast(1.05); }
@media (max-width: 560px) { .form-grid { grid-template-columns: 1fr; } }

/* ============ REVEAL (progressive enhancement hook) ============ */
.reveal { opacity: 1; }
.js .reveal { opacity: 0; transform: translateY(24px); }
.js .reveal.is-visible { opacity: 1; transform: none; transition: opacity .6s ease, transform .6s ease; }

/* Hero entrance (.fx). Pre-hidden here in CSS for the same reason as .reveal above:
   GSAP's fromTo() sets its "from" state the instant the script runs, so if these
   started at the CSS default (opacity 1) they'd flash fully visible on first paint,
   then jump to invisible, then fade back in — exactly the "weird load" a stagger-
   without-a-CSS-baseline produces. Hiding them here means there's nothing to flash. */
.js .hero .fx { opacity: 0; }
/* main.js's no-GSAP branch reveals these directly if the GSAP CDN request fails —
   see the .hero .fx block there. Without it this rule would hide the hero forever
   in that failure case. */

/* ============ STICKY MOBILE BAR ============ */
.stickybar { display: none; }
@media (max-width: 780px) {
  .stickybar {
    display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 90;
    background: rgba(10, 31, 49, .96); backdrop-filter: blur(10px);
    border-top: 1px solid var(--line); gap: 10px;
    /* Netlify injects its own badge (<iframe id="nl-badge-frame">) fixed to the bottom
       right; its visible pill sits 13-61px above the viewport bottom and it landed
       straight on the "Napísať" button. Moving THEIR iframe worked in a desktop browser
       but not reliably on a real phone — they own that element and can restyle it at any
       time. So the bar keeps its own buttons clear instead: the padding below them is
       what reserves the badge's strip, and the bar's own background fills it, so the
       badge reads as sitting inside the bar rather than on top of a button. Nothing here
       depends on Netlify's markup. */
    padding: 10px 14px 72px;
  }
  .sb-call, .sb-book {
    flex: 1; display: flex; align-items: center; justify-content: center; gap: 8px;
    padding: 14px; border-radius: var(--radius-sm); font-weight: 700; font-size: var(--fs-micro);
    font-family: var(--font-display); transition: transform .12s ease, background .18s ease;
  }
  .sb-call:active, .sb-book:active { transform: scale(.96); }
  .sb-call { background: var(--ink-700); color: var(--paper); border: 1px solid var(--line); }
  .sb-call svg { width: 17px; height: 17px; color: var(--muted); }
  .sb-book { background: var(--crimson); color: #fff; }
  .sb-book:active { background: var(--crimson-deep); }
  body { padding-bottom: 140px; } /* musí kryť celú výšku .stickybar vrátane pruhu pre badge */
}

/* ============ RHYTHM + ACCENT (added after the near-monochrome pass) ============
   Two problems the owner spotted once the theme settled: whole stretches of the page
   sat on one flat ground and read as a single slab, and the accent had been rationed
   so hard it stopped registering. Both are fixed structurally rather than by adding
   decoration — alternating grounds for rhythm, and crimson placed only where it is
   either a fill, a rule, or text large enough to clear 3:1. */

/* alternating section grounds break the slab without introducing a new colour */
.section:nth-of-type(even) { background: var(--ink-900); }
/* NB: the full-bleed photo breaks are <div>s, not <section>s, precisely so they do not
   land in this :nth-of-type count and flip the alternation of everything below them. */

/* The crimson rule that used to sit above every section head was removed: with the
   eyebrow already carrying a crimson dash, every heading had two accent marks stacked
   within 20px of each other. One mark per label. */

/* the CTA band earns a solid crimson edge: it is the one place asking for action */


/* completed steps read in the accent, not just a tint */

/* an open question is marked by the accent down its edge */
.faq-item[open] { border-left: 2px solid var(--crimson); }

/* the availability strip gets an accent edge so it stops looking like another grey card */
.contact-card--wide { border-left: 2px solid var(--crimson); }

/* give the offer and delivery blocks the full new width to spread into */
.vehicle-card { grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); }
@media (max-width: 780px) { .vehicle-card { grid-template-columns: 1fr; } }

/* ============ REVIEWS ============
   Flat cards, hairline borders, no shadow — same language as the FAQ board. The section
   only ever exists when data/recenzie.json actually has entries (see js/recenzie.js). */
.review-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(13px, 1.7vw, 20px); }
.review-card {
  background: var(--ink-800); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 24px 22px; display: flex; flex-direction: column; gap: 14px;
}
.review-stars { display: flex; gap: 3px; }
.star { color: var(--dim); font-size: var(--fs-body); line-height: 1; }
.star--on { color: var(--crimson); }
.review-text { font-size: var(--fs-body); color: var(--soft); max-width: none; }
.review-meta { display: flex; flex-direction: column; gap: 2px; margin-top: auto; }
.review-name { font-weight: 600; color: var(--paper); font-size: var(--fs-body); }
.review-date {
  font-family: var(--font-label); font-size: var(--fs-label); letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted);
}
@media (max-width: 900px) { .review-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .review-grid { grid-template-columns: 1fr; } }

/* ============ PHOTO LEDE — the picture dissolves, the copy sits in the dissolve ========
   Third iteration of the photo sections. First they were .photo-band (a solid copy panel
   stamped on the photo — rejected), then a clean strip with the copy in a separate block
   below it (correct but disconnected). This is what was actually wanted: the photo fades
   out downward into the ground, and the copy begins inside that fade. The car itself is
   still never covered — by the time the text starts, the picture underneath it has gone.
   No panel, no blur, no box: the fade IS the background for the type.

   Two layers do the work, both fading together because the mask is on their shared
   parent: the photo, and a scrim that guarantees the copy's contrast even if a bright
   part of a photo reaches the text (a white car in low sun would otherwise do it). */
.photo-lede {
  position: relative; overflow: hidden;
  padding-block: clamp(230px, 30vw, 430px) clamp(54px, 7vw, 86px);
}
.photo-lede-bg {
  position: absolute; inset: 0 0 auto 0; z-index: 0;
  height: clamp(320px, 42vw, 600px);
  -webkit-mask-image: linear-gradient(180deg, #000 0%, #000 42%, rgba(0,0,0,.55) 70%, transparent 97%);
          mask-image: linear-gradient(180deg, #000 0%, #000 42%, rgba(0,0,0,.55) 70%, transparent 97%);
}
.photo-lede-bg img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 40%; display: block; }
.photo-lede-bg::after {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(180deg, rgba(6,23,38,0) 36%, rgba(6,23,38,.72) 74%, var(--ink-950) 100%);
}
.photo-lede > .container { position: relative; z-index: 1; }
/* the amber leading rule is the only mark the copy keeps from the old panel */
.photo-lede-inner {
  max-width: 560px; padding-left: clamp(18px, 2.2vw, 28px);
  border-left: 3px solid var(--amber);
}
.photo-lede-inner .eyebrow { color: var(--amber); }
.photo-lede-inner .eyebrow::before { background: var(--amber); }
.photo-lede-inner .section-sub { max-width: 46ch; }
@media (max-width: 720px) {
  .photo-lede-inner { padding-left: 16px; border-left-width: 2px; }
}


/* ============ AMBER — a SURFACE, not a text colour ============
   First pass put amber on every label and eyebrow. That was a misread of the brief: the
   third colour was wanted as a coloured *background* to lift the scene, not as tinted
   text. Amber is therefore now mostly a panel colour, and only a couple of genuinely
   stateful marks keep it as a foreground. */
.stepper-num svg { color: var(--muted); }
.stepper-item.is-done .stepper-num svg { color: var(--amber); }
.star--on { color: var(--amber); }

/* The .band-amber panel (a full-bleed saturated amber block, with its own inverted
   text and button rules) was deleted. Colour on this site is now: crimson where you
   click, amber on a completed step, everything else neutral — and the photographs
   carry whatever else the page needs. Do not reintroduce a colour-field section. */

/* a photo used purely as a visual break between sections — no overlay, no copy.
   It dissolves into the ground at both edges rather than ending on a hairline: the hard
   cut was the thing that made these read as a pasted-in band. */
.photo-strip {
  display: block; width: 100vw; margin-left: calc(50% - 50vw);
  -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 11%, #000 76%, transparent 100%);
          mask-image: linear-gradient(180deg, transparent 0%, #000 11%, #000 76%, transparent 100%);
}
.photo-strip img {
  width: 100%; height: clamp(230px, 29vw, 420px); object-fit: cover; object-position: 50% 45%;
  opacity: .95; display: block;
}


/* ============ PAGE TRANSITION ============
   One flat sheet of the page ground that fades up as you leave a page. The incoming
   page paints the same colour first, so the seam between two documents disappears.
   Created by js/main.js at opacity 0 and only ever raised on an internal navigation —
   it can never trap the page, and it is not created at all under reduced motion. */
.page-veil {
  position: fixed; inset: 0; z-index: 200; pointer-events: none;
  background: var(--ink-950); opacity: 0;
  transition: opacity .3s cubic-bezier(.4, 0, 1, 1);
}
.page-veil.is-leaving { opacity: 1; }

/* ============ FILM GRAIN ON WIDE PHOTOS ============
   The source photos top out around 600px (Instagram screenshots), so at full-bleed they
   are upscaled ~2.4x. They are already resampled with lanczos + unsharp rather than left
   to the browser's bilinear stretch, and this adds the last part: a very fine grain over
   the photo. Grain gives the eye high-frequency detail to latch onto, which reads as
   texture instead of softness — a standard trick for low-res source material.
   It is a repeating SVG noise tile, so it costs no extra request. */
.photo-strip { position: relative; }
.photo-strip::after, .photo-lede-bg::before, .cta-band-bg::before {
  content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 2;
  opacity: .16; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
}
.photo-strip { overflow: hidden; }

/* ============ STEP GRID (homepage) ============
   Replaces the old offset photo pair + horizontal stepper. That composition put two
   unequal photos side by side with a big hole under the shorter one, then a row of
   circles joined by a drawn line underneath, which read as a diagram rather than a
   scene. This is one even grid: a photograph per step, a numeral, the step, one line.
   The numerals stay because three steps in order ARE a sequence — unlike the section
   badges that were removed. The five-step walkthrough with the drawn line and the
   self-drawing icons still lives on ako-funguje.html, where it has room to work. */
.steps {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: clamp(20px, 3vw, 46px);
  margin-top: clamp(40px, 5.5vw, 78px);
}
.step-media { overflow: hidden; background: var(--ink-900); margin-bottom: 20px; }
.step-media img {
  width: 100%; height: clamp(220px, 26vw, 380px); object-fit: cover; display: block;
  transition: transform .7s cubic-bezier(.2,.7,.2,1);
}
.step:hover .step-media img { transform: scale(1.035); }
.step-index {
  display: block; margin-bottom: 9px;
  font-family: var(--font-label); font-size: var(--fs-label); font-weight: 600;
  letter-spacing: .2em; color: var(--muted);
}
.step h3 { font-size: var(--fs-sub); margin-bottom: 8px; }
.step p { font-size: var(--fs-lead); color: var(--soft); max-width: 32ch; }
@media (max-width: 860px) {
  .steps { grid-template-columns: 1fr; gap: clamp(30px, 6vw, 44px); }
  .step-media img { height: clamp(200px, 46vw, 280px); }
}

/* ============ SECOND SECTION — staged type ============
   Asked for something more creative and more spatial here. The headline is broken onto
   three lines that step outward, each on its own baseline with a widening indent, so the
   phrase reads as a sequence rather than a block — which is what the section is about.
   Only this one section does it; repeating it would make it a pattern, not a moment. */
.section--stage { padding-block: clamp(96px, 13vw, 176px); }
.section-head--stage { max-width: none; margin-bottom: clamp(52px, 7vw, 92px); }
.stage-title {
  font-family: var(--font-display); color: var(--paper);
  font-size: clamp(2.1rem, 6.4vw, 4.6rem);
  line-height: .98; letter-spacing: -.035em; font-weight: 600;
  display: flex; flex-direction: column;
}
.stage-title span:nth-child(1) { margin-left: 0; }
.stage-title span:nth-child(2) { margin-left: clamp(0px, 6vw, 108px); }
.stage-title span:nth-child(3) { margin-left: clamp(0px, 12vw, 216px); }
/* the last line drops to the muted tone so the eye finishes on the quiet end */
.stage-title span:nth-child(3) { color: var(--muted); }
.stage-sub {
  margin-top: clamp(26px, 3.6vw, 44px);
  margin-left: clamp(0px, 12vw, 216px);
  font-size: var(--fs-lead); color: var(--soft); max-width: 34ch;
}
@media (max-width: 700px) {
  .stage-title span { margin-left: 0 !important; }
  .stage-sub { margin-left: 0; }
  .stage-sub br { display: none; }
}



/* The measuring-grid background (.grid-bg) was removed on request — the owner did not
   want a grid drawn over the hero or the stage section. The stacking context stays,
   because the staged section positions its own container against it. */
.section--stage { position: relative; }
.section--stage > .container { position: relative; z-index: 1; }

/* The framed inset photo in the hero (.hero-inset, with its caption) was removed on
   request: no caption or text panel sits on top of a vehicle photo any more. */

/* The offset photo pair (.stage-shots / .stage-shot) was removed with the composition
   it belonged to — see .steps above. */
