/* ═══════════════════════════════════════════════════════════════════════════
   THE ISLAND — one deployment's homepage, hand-designed as a whole page.

   Loaded only when `layout.stylesheet` is set (index.html), so no other tenant
   requests a byte of it. Everything is scoped under `.layout-island` so the
   shared nav and footer can be restyled here without reaching any other page.

   The design record is spec 05 §26. Two values in it are load-bearing rather
   than taste and must not drift:
     · the display face is Outfit at weight 200 — measured against Linear (510)
       and Stripe (300); every car rental site sets 700-800, and the weight
       alone reads as "not a car rental site" before a word is read;
     · the accent appears on ONE element — the thing you are meant to press.
       A second saturated element on this page is a bug, not a decision.

   The ground was #F7F8FA cool near-white until 2026-08-24, when the owner
   chose Ink and Blush over five near-monochromes and six jewel tones, and
   DEEP WATER on 2026-08-26 after seeing nine colourings rendered whole. Ink
   and Blush and Graphite are both kept on record in the token block.
   ═══════════════════════════════════════════════════════════════════════════ */

/* These tokens deliberately do NOT go in a `:root` block. `:root` means one
   thing in this codebase — the tenant palette `build_palette()` derives from
   base.css — and a colour literal declared in any other `:root` is a colour no
   tenant palette can ever reach (tests/test_palette_integrity.py names the bug
   that guard was written for). Unreachable is the correct outcome here, but
   saying it in `:root` would say it in the wrong vocabulary: layout and colour
   are ours and are never tenant-editable, so these belong scoped to the layout
   that owns them. */
.layout-island {
  /* SAND AND TERRACOTTA, chosen 2026-10-06 with the name Local Car Rentals
     (owner's "lets go with A", spec 2026-10-06-local-car-rentals-rebrand):
     a warm light ground, white cards, dark ink, a terracotta accent on the
     booking button only, Fraunces headings. The notes below were written
     for the dark colourings that came before; the ROLES they describe hold,
     the near-black values they mention do not.

     DEEP WATER, chosen 2026-08-26. A cold blue-black ground with a pale steel
     accent on exactly one thing: the element you are meant to press.

     It overturns this file's own argument, and that was the owner's call made
     with the argument in front of him. The rental industry owns yellow
     (Hertz), red (Avis), orange (Sixt, Budget), green (Europcar, Enterprise)
     and blue (Alamo, Thrifty, and every local firm on every island) -- which
     is why the accent was rose for two days. What separates this from the
     incumbents is value, not hue: theirs is a mid, saturated blue on white and
     reads as signage; this is a desaturated near-white blue, used once, on
     near-black. If the site ever starts reading as generic, the accent is the
     first place to look.

     TWO ALTERNATIVE COLOURINGS are kept. Each is the same file with these
     TWELVE values swapped, and nothing else:

       INK AND BLUSH -- live 2026-08-24 to 2026-08-26
         --isl-bg #141215  --isl-card #1E1B20  --isl-line #2F2B32
         --isl-ink #F2EAEA --isl-dim #968E92   --isl-accent #D9A2A2
         --isl-accent-ink #141215              --isl-scrim #09202A
         --isl-ok #8FBBA0  --isl-warn #DCBC8B
         --isl-bad #EE857C --isl-info #9CB4CB

       GRAPHITE -- never live
         --isl-bg #4A4F54  --isl-card #565C62  --isl-line #676E75
         --isl-ink #F2F5F7 --isl-dim #B7BEC4   --isl-accent #E5AFA8
         --isl-accent-ink #34383C              --isl-scrim #0E1E26
         --isl-ok #B4DAC2  --isl-warn #F2DCB6
         --isl-bad #FFB4AC --isl-info #C4D7E8

     It was six until 2026-08-26, and the claim was not true. Two things were
     wrong with it. The four meanings did not exist yet, and when they arrived
     they had to join the set rather than sit outside it: measured on
     Graphite's lighter ground, the Ink and Blush four read 3.26:1 to 4.57:1
     and every one fails, so a ground that moves needs them to move with it.
     The values above are the same meanings lifted to clear 4.5:1 on #4A4F54.

     The second was older and quieter. The neutral ramp below -- the washes,
     the second line, the two dim inks -- was seven more literal hex values
     with no link to the six, so swapping the six gave a Graphite page with
     Ink and Blush cards on it. Rendering the booking wizard under these
     values is what showed it. Those seven now derive, and --isl-accent-ink is
     the one that could not (see its note below), which is why the set is
     eleven and not ten. The twelfth arrived last and for the same reason: the
     veil over a photograph was a fourth literal, and it was the deep sea-blue
     of a palette this brand REJECTED, still tinting the only photograph on the
     site months after the palette lost.

     Everything else in this file derives from these twelve, so a new colouring
     really is a twelve-line edit -- with ONE exception, named here so the
     claim stays true. The five placeholder gradients (the hero's hard horizon,
     the three tile grounds, the feature card's) are hand-painted illustration,
     roughly fourteen tuned stops, and they do NOT derive. That is deliberate:
     they are a drawing, not a surface, and a formula would flatten the horizon
     that makes them read as artwork instead of as a failed upload. A new
     colouring must repaint them by eye. They are all near-black, so the
     mismatch is slight, and they disappear entirely the day real photographs
     land -- which is why this is a note and not a twelve-line list of stops.
     (Graphite with no accent at all -- accent #F2F5F7, accent-ink #34383C --
     was the version shown first; it lost because a page whose whole job is one
     button should not paint that button the same colour as its body text.) */
  --isl-bg: #F5EFE6;
  --isl-ink: #2A2420;
  --isl-dim: #74695F;
  --isl-accent: #B8532E;
  --isl-card: #FFFDF9;
  --isl-line: #E3D8C8;

  /* THE FOUR MEANINGS, and they are part of the colouring above rather than
     constants that outlive it. A booking wizard has to be able to say
     "available", "excess", "error" and "note"; nothing else on this site does,
     which is why they arrived late (2026-08-26) and why they are the only
     saturated colours here that are not the accent.

     They are theme values because they HAVE to be, not as a tidiness rule.
     Measured against Graphite's #4A4F54 ground, this set reads 3.26:1 to
     4.57:1 -- every one of them fails, and `--isl-bad` fails worst. A ground
     that moves needs these to move with it, so they swap together or the next
     colouring ships four illegible states.

     Kept deliberately quiet against the accent's job of being the one thing
     you press: none of them is a brand colour and none should read like one.
     `--isl-bad` is the exception that has to fight -- at roughly 72% saturation
     against the accent's 26% it reads as a distinctly hotter coral, because an
     error that reads as the brand colour is an error nobody sees. */
  --isl-ok: #2F7D55;
  --isl-warn: #9A6410;
  --isl-bad: #B83A2E;
  --isl-info: #5B549E;
  /* The two faces, one token each (owner 2026-10-06 10:34, "lets apply 1"):
     Fraunces for headings with Literata behind it, because Fraunces draws
     no Greek; Inter for everything else -- body, labels, fields, times,
     prices, buttons. The mono that used to label things here is gone, and
     Outfit is left to the wordmark alone (`.brand-name`). */
  --isl-sans: "Inter", "Segoe UI", Arial, sans-serif;
  --isl-serif: "Fraunces", "Literata", Georgia, serif;

  /* Text that sits ON the accent, and the eleventh member of the swap set.
     Load-bearing: the button used to be white on deep sea and is now near-black
     on a pale steel blue, so a hardcoded #fff here would have been invisible.

     It is stated rather than derived because it cannot be derived. The obvious
     formula is "the ground" -- and on Ink and Blush that is exactly right, the
     value below IS --isl-bg and reads 8.55:1 on the accent. On Graphite the
     same formula gives 4.35:1 and fails. Which way this has to move depends on
     how light the accent is, and a light accent wants dark text while a dark
     one wants light: that is a decision per colouring, not an offset. */
  --isl-accent-ink: #FFFFFF;

  /* The veil over a photograph, and the twelfth member of the swap set. Three
     places use it: the foot of the hero, and the destination tiles at rest and
     on hover. It exists so white text can sit on an image whose brightness we
     do not control.

     It is DELIBERATELY COLDER THAN THE GROUND, and that is the whole reason it
     is a value rather than an offset. Read the hero: it is the Aegean, and a
     cool veil holds the sea turquoise where the warm near-black above would
     grey it out. Derived from --isl-bg the page would still be coherent -- the
     shift measures 10 of 255 and only in the water -- but the sea is the
     picture, so the picture wins and the colour gets registered instead.

     Which way it has to move is a judgement per colouring, exactly like
     --isl-accent-ink: it must stay plausibly related to the ground while
     serving whatever the photographs are of. There is no formula, so a new
     colouring must LOOK at the hero and decide. Nothing here will warn you --
     a scrim left behind is invisible until it is on someone else's photo. */
  --isl-scrim: #2A1A10;

  /* The neutral ramp, DERIVED. Six tokens describing one system -- the values
     are inverted from the near-white original but the ROLES are unchanged,
     which is what let this become a colour swap rather than a rewrite.

     They were literal hex until 2026-08-26, and that quietly made the promise
     at the top of this block false: swapping the six seeds gave a Graphite
     ground with Ink and Blush cards still sitting on it, because these six had
     no link to the seeds they were picked to sit against. Rendering the
     booking wizard under the Graphite values is what showed it.

     Each is now the offset that produced the hand-picked value, fitted against
     it and measured: every one lands within 2/255 of what it replaced except
     --isl-accent-deep, which is 5 and is one stop of a gradient. So this is
     the same colouring, stored as relationships instead of as results -- and
     the swap set above is now genuinely the only thing a new colouring
     touches. */
  --isl-ink-2:  color-mix(in oklab, var(--isl-dim) 72%, var(--isl-bg));   /* placeholder art, disabled marks */
  --isl-ink-3:  color-mix(in oklab, var(--isl-dim) 88%, var(--isl-bg));   /* placeholder text */
  --isl-line-2: color-mix(in oklab, var(--isl-line) 80%, var(--isl-dim)); /* a border that has been pointed at */
  --isl-wash:   color-mix(in oklab, var(--isl-card) 96%, var(--isl-ink));
  --isl-wash-2: color-mix(in oklab, var(--isl-card) 60%, var(--isl-bg));
  --isl-accent-deep: color-mix(in oklab, var(--isl-accent) 68%, var(--isl-ink));

  /* Each meaning's panel and its edge, DERIVED rather than chosen -- a little
     of the meaning mixed into the ground it will sit on.

     These were twelve hand-picked hex values for one afternoon, and that was
     the bug: eight of them were tints of a ground they had no link to, so the
     next colouring would have swapped the ground and left the panels behind.
     Mixing makes the relationship the thing that is stored, and the swap set
     above the only thing anyone has to touch.

     `in oklab`, not `in srgb`: mixing a light colour into a dark one in sRGB
     drags it toward grey and the hue washes out at exactly these low
     percentages, which is the whole signal here. 12% and 32% measured on Ink
     and Blush: the meaning stays between 6.3:1 and 8.6:1 on its own panel, and
     the edge stays visible without becoming a second statement. */
  --isl-ok-bg:    color-mix(in oklab, var(--isl-ok) 12%, var(--isl-bg));
  --isl-ok-line:  color-mix(in oklab, var(--isl-ok) 32%, var(--isl-bg));
  --isl-warn-bg:  color-mix(in oklab, var(--isl-warn) 12%, var(--isl-bg));
  --isl-warn-line:color-mix(in oklab, var(--isl-warn) 32%, var(--isl-bg));
  --isl-bad-bg:   color-mix(in oklab, var(--isl-bad) 12%, var(--isl-bg));
  --isl-bad-line: color-mix(in oklab, var(--isl-bad) 32%, var(--isl-bg));
  --isl-info-bg:  color-mix(in oklab, var(--isl-info) 12%, var(--isl-bg));
  --isl-info-line:color-mix(in oklab, var(--isl-info) 32%, var(--isl-bg));

  /* One gutter, one card inset. There were four different left edges on the
     phone and three on desktop, none of them chosen -- and a reader who cannot
     name that is still the reader who calls the page cheap. A single true left
     rule down the page is most of what "designed" means. */
  --isl-gutter: 20px;   /* text and grids */
  --isl-edge: 14px;     /* cards that sit outside the gutter (the hero) */

  /* Three radii, nested: an inner corner is the outer minus its padding. */
  --isl-r-lg: 24px;
  --isl-r-md: 16px;
  --isl-r-sm: 12px;

  /* The hero photograph, when there is one: the template sets this on the
     section itself. Declared here so the no-photo path is an explicit `none`
     rather than an unset property -- `background-image: var(--unset)` is
     invalid at computed-value time, which is a different and much vaguer
     thing than being told there is no image. */
  --isl-hero-photo: none;

  /* The same, for a destination page's hero band. Set inline on the section by
     `destination_island.html` when the page's content carries a photo, so this
     declaration is the no-photo default -- and it is also what makes the
     reference legal: tests/test_palette_integrity.py asserts every var() in
     this file resolves, and an inline-only variable reads as a typo it cannot
     distinguish from a real one. It was one when this line was missing. */
  --isld-photo: none;

  /* And once more, for a destination TILE on the homepage. Same reason and
     the same trap: `island.html` sets it inline from the linked page's own
     hero photograph, and without this declaration the reference is a var()
     that resolves to nothing. */
  --isl-tile-photo: none;

  /* The height of the shared header, which is `position: fixed` and opaque.
     The hero has to start below it: at `top: 0` the header sits ON the
     photograph and the top 83px of it can never be seen. That was invisible
     while the hero was a gradient and became the whole problem the moment a
     real photograph went in -- the subject of a landscape shot lives in the
     upper third, which is precisely the band the header was eating.
     Keep in step with `.nav-shell`'s padding plus the brand mark's height. */
  --isl-header: 83px;

  --isl-grain: none;  /* the film grain belonged to the dark ground */

  background: var(--isl-bg);
  color: var(--isl-ink);
  font-family: var(--isl-sans);
  font-size: 16px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

.layout-island main { display: block; }

/* ── The rest of the site ─────────────────────────────────────────────────
   base.html applies `.layout-island` and loads this file on EVERY page, not
   only the front one — a design that stops at the homepage is not one, the
   visitor clicks About and lands on a different website.

   The inner pages are shared product templates styled by inner-pages.css and
   components.css, and both reach every colour through a token. So this maps
   the product's tokens onto Ink and Blush once, here, and those pages recolour
   themselves — rather than restating every card, badge and button under a new
   scope, which is what the deleted Night Drive theme tried and drowned in.

   Only tokens whose ROLE is unambiguous are remapped. That is the whole trick:
   `--primary-deep` is only ever a dark band's background and `--primary` is
   only ever text, so they can invert independently. A token used as both would
   have no correct value here and is left alone deliberately.

   Nothing in this block escapes `.layout-island`, so a classic deployment is
   untouched — and does not download this file at all. */
.layout-island {
  /* Ground and ink. */
  --bg: var(--isl-bg);
  --text: var(--isl-ink);
  --muted: var(--isl-dim);
  --muted-alt2: var(--isl-dim);
  --muted-alt4: var(--isl-dim);
  --muted-alt5: var(--isl-ink-3);
  --muted-alt7: var(--isl-dim);
  --muted-alt9: var(--isl-dim);
  --muted-alt13: var(--isl-ink-3);

  /* Cards: a raised surface here is lighter than the ground, not whiter. */
  --surface: var(--isl-card);
  /* Not the card's own rgb. Every `rgba(var(--surface-rgb), a)` in the product
     is a translucent WHITE -- a hairline, a hover lift, faded text on a dark
     band -- and never the card. On a near-black site that role wants the ink,
     and a card-coloured version of it would simply be invisible. The solid
     `--surface` above keeps the other meaning; the two are separated here
     because the product never separated them. */
  --surface-rgb: 42, 36, 32;
  --surface-alt: var(--isl-wash-2);
  --surface-tint: var(--isl-line);
  --surface-tint-rgb: 227, 216, 200;
  --surface-tint-alt3: var(--isl-line);
  --surface-tint-alt4: var(--isl-wash);
  --border-plain: var(--isl-line);

  /* `--primary` is text on these pages; the `-deep`/`-alt` family is the dark
     band behind a page header. Inverted, that band is the ground with a little
     lift, which is why all three land near it rather than on a colour. */
  --primary: var(--isl-ink);
  --primary-alt: var(--isl-wash);
  --primary-deep: var(--isl-bg);
  --primary-deep-alt5: var(--isl-wash-2);
  --primary-soft-alt4: var(--isl-dim);

  /* Shadow only. Black under a near-black card reads; navy does not. */
  --primary-rgb: 0, 0, 0;

  /* The accent, and the one rule that survives from the front page: it is the
     thing you are meant to press. The `-warm`/`-pale`/`-alt` trio are the two
     stops of the button gradient, so they stay within one step of each other
     rather than becoming a second colour. */
  --accent: var(--isl-accent);
  --accent-rgb: 184, 83, 46;
  --accent-alt: var(--isl-accent);
  --accent-alt2: var(--isl-accent-deep);
  --accent-warm: var(--isl-accent-deep);
  --accent-pale: var(--isl-accent);
  --text-on-accent: var(--isl-accent-ink);
  --text-on-accent-alt2: var(--isl-accent-ink);
  --text-on-accent-alt3: var(--isl-accent-ink);

  --radius-sm: var(--isl-r-sm);
  --radius-md: var(--isl-r-md);
  --radius-lg: var(--isl-r-lg);

  /* ── The rest of the palette ───────────────────────────────────────────
     Added 2026-08-26. Everything above was mapped by hand when this layout
     only had a homepage, under the rule stated at the top of the block: remap
     a token only where its ROLE is unambiguous. That was the right rule and it
     stays -- but "unambiguous" was being decided by eye, so the ninety-odd
     tokens nobody had looked at kept resolving to the light tenant palette.

     Nowhere did that show as badly as the booking wizard. Every colour in it
     is a token -- fifty-seven references, not one literal -- so the whole
     five-step flow rendered as a light-theme component dropped onto a
     near-black page: white cards, white inputs, and labels like RETURN DATE
     that the reader simply could not see. It was never a booking bug. It was
     this block stopping early.

     So the role question got answered with evidence instead of by eye. Every
     `var()` in the product's stylesheets and templates was read together with
     the property it sits in, which sorts each token into text, background,
     border or shadow. Exactly thirteen turned out to carry two roles at once;
     eight of those were already decided above and the remaining five are named
     in the generator. Everything else had one role and one correct value.

     Three consequences worth keeping in mind:
       · this is the whole palette now, so a component nobody has opened yet --
         the confirmation screen, a stop-sales banner, a validation error --
         is already themed rather than waiting to be found;
       · the four meanings (ok / warn / bad / info) come from the tokens at the
         top of this file, not from the tenant palette, so they stay quiet
         enough to leave the accent as the only saturated thing on a page;
       · every `*-rgb` triplet feeds an `rgba()`, and on a near-black ground
         those are shadows. They go to black -- navy under a near-black card
         does not read. The two that are not shadows keep their hue, and
         `--surface-rgb` keeps the ink it was deliberately given above.

     Still scoped to `.layout-island`, so no other deployment sees any of it. */
  --accent-pale-alt2:        var(--isl-line-2);
  --accent-pale-alt3:        var(--isl-line-2);
  --accent-pale-alt4:        var(--isl-line-2);
  --accent-pale-alt5:        var(--isl-line-2);
  --accent-warm-alt2:        var(--isl-accent);
  --accent-warm-alt3:        var(--isl-accent);
  --accent-warm-alt4:        var(--isl-accent);
  --accent-warm-alt5:        var(--isl-accent);
  --bg-alt2:                 var(--isl-wash);
  --bg-alt3:                 var(--isl-wash);
  --bg-alt4:                 var(--isl-wash);
  --bg-alt5:                 var(--isl-wash);
  --bg-alt6:                 var(--isl-wash);
  --bg-alt7:                 var(--isl-wash);
  --bg-alt8:                 var(--isl-wash);
  --danger:                  var(--isl-bad);
  --danger-alt2:             var(--isl-bad);
  --danger-alt3:             var(--isl-bad);
  --danger-alt4:             var(--isl-bad-bg);
  --danger-bg:               var(--isl-bad-bg);
  --danger-bg-alt2:          var(--isl-bad-bg);
  --danger-bg-alt3:          var(--isl-bad-line);
  --danger-bg-alt4:          var(--isl-bad-bg);
  --danger-tint:             var(--isl-bad-line);
  --danger-tint-alt2:        var(--isl-bad-line);
  --info:                    var(--isl-info-bg);
  --info-alt:                var(--isl-info);
  --info-bg:                 var(--isl-info-bg);
  --muted-alt10:             var(--isl-wash);
  --muted-alt11:             var(--isl-dim);
  --muted-alt12:             var(--isl-dim);
  --muted-alt14:             var(--isl-dim);
  --muted-alt15:             var(--isl-wash);
  --muted-alt16:             var(--isl-dim);
  --muted-alt17:             var(--isl-dim);
  --muted-alt3:              var(--isl-dim);
  --muted-alt6:              var(--isl-dim);
  --muted-alt8:              var(--isl-dim);
  --primary-deep-alt10:      var(--isl-ink);
  --primary-deep-alt11:      var(--isl-bg);
  --primary-deep-alt12:      var(--isl-bg);
  --primary-deep-alt13:      var(--isl-bg);
  --primary-deep-alt14:      var(--isl-bg);
  --primary-deep-alt15:      var(--isl-ink);
  --primary-deep-alt16:      var(--isl-bg);
  --primary-deep-alt17:      var(--isl-bg);
  --primary-deep-alt2:       var(--isl-ink);
  --primary-deep-alt3:       var(--isl-bg);
  --primary-deep-alt4:       var(--isl-ink);
  --primary-deep-alt6:       var(--isl-bg);
  --primary-deep-alt7:       var(--isl-ink);
  --primary-deep-alt8:       var(--isl-bg);
  --primary-deep-alt9:       var(--isl-bg);
  --primary-soft:            var(--isl-line-2);
  --primary-soft-alt2:       var(--isl-line-2);
  --primary-soft-alt3:       var(--isl-line-2);
  --primary-soft-alt5:       var(--isl-line-2);
  --primary-soft-alt6:       var(--isl-line-2);
  --primary-soft-alt7:       var(--isl-ink);
  --success:                 var(--isl-ok);
  --success-alt:             var(--isl-ok-bg);
  --success-alt2:            var(--isl-ok);
  --success-alt3:            var(--isl-ok);
  --success-alt4:            var(--isl-ok);
  --success-alt5:            var(--isl-ok);
  --success-alt6:            var(--isl-ok);
  --success-bg:              var(--isl-ok-bg);
  --success-bg-alt:          var(--isl-ok-bg);
  --success-bg-alt2:         var(--isl-ok-bg);
  --success-bg-alt3:         var(--isl-ok-bg);
  --success-tint:            var(--isl-ok-line);
  --success-tint-alt2:       var(--isl-ok-line);
  --surface-tint-alt10:      var(--isl-line);
  --surface-tint-alt11:      var(--isl-line);
  --surface-tint-alt12:      var(--isl-wash);
  --surface-tint-alt13:      var(--isl-wash);
  --surface-tint-alt14:      var(--isl-wash);
  --surface-tint-alt15:      var(--isl-wash);
  --surface-tint-alt16:      var(--isl-line);
  --surface-tint-alt17:      var(--isl-dim);
  --surface-tint-alt18:      var(--isl-dim);
  --surface-tint-alt19:      var(--isl-line);
  --surface-tint-alt2:       var(--isl-wash);
  --surface-tint-alt20:      var(--isl-line);
  --surface-tint-alt21:      var(--isl-line);
  --surface-tint-alt22:      var(--isl-line);
  --surface-tint-alt23:      var(--isl-dim);
  --surface-tint-alt24:      var(--isl-line);
  --surface-tint-alt25:      var(--isl-line);
  --surface-tint-alt26:      var(--isl-line);
  --surface-tint-alt27:      var(--isl-line);
  --surface-tint-alt28:      var(--isl-line);
  --surface-tint-alt29:      var(--isl-wash);
  --surface-tint-alt30:      var(--isl-line);
  --surface-tint-alt31:      var(--isl-wash);
  --surface-tint-alt32:      var(--isl-wash);
  --surface-tint-alt33:      var(--isl-dim);
  --surface-tint-alt34:      var(--isl-line);
  --surface-tint-alt35:      var(--isl-line);
  --surface-tint-alt36:      var(--isl-wash);
  --surface-tint-alt37:      var(--isl-wash);
  --surface-tint-alt38:      var(--isl-wash);
  --surface-tint-alt39:      var(--isl-dim);
  --surface-tint-alt40:      var(--isl-wash);
  --surface-tint-alt41:      var(--isl-wash);
  --surface-tint-alt5:       var(--isl-line);
  --surface-tint-alt6:       var(--isl-line);
  --surface-tint-alt7:       var(--isl-line);
  --surface-tint-alt8:       var(--isl-line);
  --surface-tint-alt9:       var(--isl-line);
  --text-on-accent-alt4:     var(--isl-accent-ink);
  --warning:                 var(--isl-warn);
  --warning-alt2:            var(--isl-warn);
  --warning-alt3:            var(--isl-warn-bg);
  --warning-alt4:            var(--isl-warn);
  --warning-bg:              var(--isl-warn-bg);

  --ink-alt2-rgb:            0, 0, 0;
  --ink-alt3-rgb:            0, 0, 0;
  --ink-alt4-rgb:            0, 0, 0;
  --ink-alt5-rgb:            0, 0, 0;
  --ink-alt6-rgb:            0, 0, 0;
  --ink-rgb:                 0, 0, 0;
  --primary-deep-alt3-rgb:   0, 0, 0;
  --sky-tint-alt-rgb:        0, 0, 0;
  --sky-tint-alt2-rgb:       0, 0, 0;
  --sky-tint-rgb:            0, 0, 0;
}

/* base.css sets Fraunces on h1-h3 by element, which inheritance cannot reach.
   The display face is the loudest half of this design — see the file header on
   why the weight is 200 — so it is stated here for the pages that did not get
   their headings from `.isl-*` rules.
   Since 2026-10-06 (owner 10:34) that face is Inter, and only h4-h6 and car
   names keep it; h1-h3 are Fraunces by the rule below. */
.layout-island h1,
.layout-island h2,
.layout-island h3,
.layout-island h4,
.layout-island h5,
.layout-island h6,
.layout-island .model-name {
  /* !important because inner-pages.css states Fraunces fifteen times and five
     of those carry it -- a specificity race this rule would otherwise lose on
     exactly the pages it exists for. The `.isl-*` rules that want the mono face
     put it on spans and small caption classes, never on a heading, so nothing
     on the front page is caught by this. */
  font-family: var(--isl-sans) !important;
  font-weight: 300;
  letter-spacing: -0.02em;
}

/* Theme A (2026-10-06): the three heading levels a reader scans by are set in
   Fraunces, the warm serif of the chosen direction; h4-h6 and car names stay
   in Outfit. !important for the same race as above -- the `.isl-*` heading
   rules state Outfit at weight 200-300. */
.layout-island h1,
.layout-island h2,
.layout-island h3 {
  font-family: var(--isl-serif) !important;
  font-weight: 500 !important;
  letter-spacing: -0.01em;
}

/* ── The two dual-role tokens, repaired by hand ───────────────────────────
   `--surface` is a card's background AND the white text on a dark band;
   `--primary-deep`/`--primary-alt` are that band. Light-on-dark inverts to
   dark-on-light, and the pair cannot both be right from one value -- which is
   the trap that sank the Night Drive theme. The token keeps the card meaning,
   the three places that used it the other way say so here.

   The bands become a lift off the ground rather than a colour against it: on a
   near-black site a header band that is a different hue reads as a leftover
   from another design, and there is only one hue in this one. */
.layout-island .page-hero-inner,
.layout-island .content-hero,
.layout-island .inner-cta-row {
  background: var(--isl-wash) !important;
}

.layout-island .page-hero-inner h1,
.layout-island .content-hero h1,
.layout-island .inner-cta-row h2 {
  color: var(--isl-ink);
}

.layout-island .page-hero-inner p.hero-intro,
.layout-island .content-hero p {
  color: var(--isl-dim);
}

/* The icon tile: a dark square on a dark card, holding a dark glyph. */
.layout-island .icon-card-icon,
.layout-island .contact-icon {
  background: var(--isl-wash) !important;
}

.layout-island .icon-card-icon svg,
.layout-island .contact-icon svg {
  color: var(--isl-ink);
}

/* The rest of `color: var(--surface)`, which is the same white-on-dark role in
   every one of them. Grouped rather than chased one page at a time so a page
   built later inherits the repair instead of repeating the bug. */
.layout-island .inner-cta-row .btn-outline,
.layout-island .msg-icon-link,
.layout-island .guide-feature,
.layout-island .guide-feature h2,
.layout-island .guide-feature-cta {
  color: var(--isl-ink);
}

/* ── Shared nav and footer, restyled rather than replaced ─────────────────
   The nav markup is `website/nav.html` and the footer `website/_footer.html`,
   both included by index.html outside the section loop. A bespoke layout
   cannot swap them without editing a template every tenant renders, so it
   dresses them instead. */
.layout-island .site-header {
  background: var(--isl-bg);
  border-bottom: 0;
  box-shadow: none;
  backdrop-filter: none;
}
.layout-island .site-header.scrolled {
  background: color-mix(in srgb, var(--isl-bg) 92%, transparent);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--isl-line);
}
/* The shared header centres its contents in a 1180px column. This page is
   full-bleed and rules its own left edge off `--isl-gutter`, so the centred
   column put the logo 394px from the viewport edge while the hero started at
   24px -- two different left edges in the first 100px of the page, which is
   the exact failure `--isl-gutter` exists to prevent. */
.layout-island .nav-shell {
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 18px var(--isl-gutter);
}

/* The brand mark, and the one thing the repalette missed on the first pass.
   `base.css` paints `.brand-mark` with `linear-gradient(145deg, var(--accent),
   var(--accent-warm-alt2))` at `font-weight: 800` — the TENANT palette's
   accent, which is gold on the shipped default. On this ground that rendered
   as a gold tile in the top-left corner of a near-black page, belonging to no
   part of this design, and at a weight §26 exists to forbid.

   It is only visible when no logo has been uploaded (`_brand_mark.html` falls
   back to the company's initials), which is exactly the state a fresh install
   and the demo are permanently in — so it is the state worth drawing, not the
   one worth ignoring. Drawn as a small echo of the plate: a hairline box, a
   light weight, letterspaced. */
.layout-island .brand-mark,
.layout-island .footer-brand-mark {
  background: none;
  border: 1px solid var(--isl-line-2);
  border-radius: var(--isl-r-sm);
  color: var(--isl-ink);
  font-weight: 300;
  font-size: .72rem;
  letter-spacing: .12em;
  text-indent: .12em;
}
/* With a real logo there is no tile to draw — a translucent surface tint
   behind a transparent PNG is a box around someone's mark. */
.layout-island .brand-mark.has-logo,
.layout-island .footer-brand-mark.has-logo { border: 0; background: none; }

/* ── The mark, drawn rather than uploaded ─────────────────────────────────
   The header logo is CSS, not an image file, and that is the better artefact
   here rather than a shortcut: the nav already prints the company's own name
   (`cs.name`) as real text in Outfit, which this page has already loaded. Drawn
   in CSS it is crisp at every density, it recolours with the palette, it costs
   no request, and it cannot go stale against the design the way an exported
   PNG does.

   Two tricks carry it, and both are load-bearing:

   · `width: min-content` makes the box as narrow as its longest word, which
     forces the wrap at the space without the template splitting the string or
     the CSS guessing a width in ch. Works for any two-word name.
     (`word-spacing: 9999px` was tried first and is a trap: it breaks the line
     correctly but the space still contributes its 9999px to the element's
     intrinsic width, so the box measured 10143px and both words sat on one
     line inside a plate stretched across the viewport.)
   · `::first-line` sets the size of the FIRST line only, which is the one
     thing that makes the settled 86% second line possible from a single text
     node. 12.8px over 11px is the 86% ratio chosen on 24 Aug.

   The initials tile is hidden while it is a placeholder — the plate IS the
   mark now, and "PR" beside it would be the logo twice. If a real logo is ever
   uploaded, `.has-logo` survives and the tile comes back.

   NOTE: this covers the website only. The invoice and voucher PDFs and the
   customer emails render `company_logo` from the database, so they still need
   an uploaded file — see the logo-variants idea on the backlog. */
/* Both marks, header and footer. The footer macro is called with a different
   class (`footer-brand-mark`), which is why naming only `.brand-mark` left a
   round PR tile at the bottom of the page after the header one was gone.

   Unconditional, and it used to be `:not(.has-logo)`. This layout was built and
   reviewed on a deployment with no logo uploaded, so the one case nobody saw was
   the one that shipped: with a logo present the mark reappeared, and
   `company_logo` is a WIDE WORDMARK — 600x260 — crushed into a 40x40 square,
   sitting beside the brand text that already reads the same words. An
   illegible smudge next to a legible wordmark.

   Hiding it rather than swapping the file, because `company_logo` is also what
   prints on the voucher PDFs and the customer emails, where the full wordmark
   is correct. The header's identity here IS the wordmark. */
.layout-island .brand-mark,
.layout-island .footer-brand-mark { display: none; }
.layout-island .brand-tag { display: none; }
/* The wordmark (owner 2026-10-06, after Economy Car Rentals' own): the name
   on one line in heavy capitals, the first word in the accent. It replaced the
   boxed two-line plate with the name Primus. `wordmark()` in _brand_mark.html
   wraps the first word, so a rename is still only the company_name setting.
   The accent here is his choice: LOCAL is the word that sets the company apart
   from the big brokers ("we stick for now with the local highlighted"). */
.layout-island .brand-text {
  display: inline-block;
  flex: 0 0 auto;
  line-height: 1;
}
.layout-island .brand-name,
.layout-island #footerBrand {
  display: inline-block;
  font-family: "Outfit", "Helvetica Neue", Arial, sans-serif;
  font-weight: 800;
  font-size: 22px;
  line-height: 1;
  letter-spacing: .01em;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--isl-ink);
}
.layout-island .brand-first { color: var(--isl-accent); }
@media (max-width: 767px) {
  .layout-island .brand-name,
  .layout-island #footerBrand { font-size: 18px; }
}
.layout-island .footer-tagline { display: none; }

.layout-island .brand-tag { color: var(--isl-dim); }
.layout-island .top-nav a { color: var(--isl-ink); font-weight: 400; }
.layout-island .top-nav a:hover { color: var(--isl-accent); }
/* The phone menu is the header's own ground, solid. base.css draws it 98%
   black, so the page heading showed through it and it read as a different,
   blacker panel under the header (2026-09-18). Wide enough to cover el/de,
   which fold into the menu below 1080px; on a desktop the bar is the same
   colour, so nothing shows. */
@media (max-width: 1080px) {
  .layout-island .top-nav { background: var(--isl-bg); }
}
/* Outlined, not filled — and this file's own rule is why. The accent belongs
   to ONE element, the thing you are meant to press (top of this file, and
   again above), and the same reasoning already greyed the language flag and
   left the wordmark unpainted. The nav pill was the exception nobody caught:
   on a phone it sat in the fixed header wearing exactly the same accent as
   "See cars and prices" 630px below it, so the first screen offered two
   equally loud buttons and neither said press here. Measured 2026-09-17 on
   staging at 375x812 — both rgb(143, 182, 206).

   Demoted rather than removed: it is still the only way into the wizard from
   a page that has scrolled past its bar.

   `--isl-dim` and not `--isl-line` for the border: the hairline token is
   rgb(38, 46, 53) against a near-black header — about 1.5:1, measured — so
   the pill vanished and what was left read as bare text. Demoted is the
   intent; invisible is a different bug. */
.layout-island .nav-book-btn {
  background: transparent;
  border-color: var(--isl-dim);
  color: var(--isl-ink);
  border-radius: 999px;
  font-weight: 400;
}
.layout-island .nav-book-btn:hover {
  border-color: var(--isl-accent);
  color: var(--isl-accent);
}
/* The shared header is dark on classic, so its language label and burger bars
   are white. On this ground they were white-on-white — invisible rather than
   merely wrong, and the burger is the only way to the menu on a phone. */
/* !important is not laziness here: `lang_switcher()` (app/__init__.py) writes
   that colour as an inline style, which no selector can outrank. Making the
   helper read a CSS variable instead would be the root-cause fix, and it is
   the wrong trade today — it changes a served byte on every page of every
   deployment to recolour one label on one. */
.layout-island .lang-switcher__label { color: var(--isl-dim) !important; }
/* The flag was the second saturated thing on the page, in a FIXED header, so
   it was on screen for every pixel of a 5,000px scroll. This file's own rule
   (top of the file) is that the accent is the only saturated element and a
   second one is a bug -- the flag is one, and it is not even ours. Greyscale
   rather than removed: it still reads as a flag, and it is still the control a
   German visitor is looking for. Colour returns on hover, where it confirms
   the choice. Same treatment the wizard already gives the system emoji. */
.layout-island .lang-switcher img,
.layout-island .lang-switcher svg {
  filter: grayscale(1) opacity(.72);
  transition: filter .25s;
}
.layout-island .lang-switcher:hover img,
.layout-island .lang-switcher:hover svg { filter: none; }
/* ...and the label was the only bold on a page whose hierarchy is carried by
   weight. `lang_switcher()` writes 600 inline, so this needs the same
   `!important` the colour line above already justifies. */
.layout-island .lang-switcher__label {
  font-family: var(--isl-sans);
  font-weight: 600 !important;
  font-size: 10px !important;
  letter-spacing: .08em;
}
.layout-island .nav-burger span { background: var(--isl-ink); }
.layout-island .nav-burger { background: transparent; border-color: var(--isl-line); }

.layout-island .site-footer {
  background: var(--isl-bg);
  border-top: 1px solid var(--isl-line);
  color: var(--isl-ink);
  /* `premium-home.css` gives the classic homepage's footer
     `box-shadow: 0 -120px 0 0 var(--primary-deep-alt9)` — a 120px solid slab
     of navy offset upward, so the dark footer reads as flowing out of the dark
     testimonial section above it. There is nothing dark above it here, so it
     rendered as a navy bar floating between the closing line and the footer.
     Worth knowing why it was so hard to find: a box-shadow paints outside the
     border box and shows in neither `backgroundColor` nor `elementsFromPoint`,
     so the band was invisible to every DOM probe. */
  box-shadow: none;
}
/* Same centred 1180px column the header had, and the same fix. The footer is
   the last thing on the page and its left edge is read against every section
   above it, so an inset that nothing else shares reads as the page giving up
   at the bottom. Aligned to `--isl-gutter`, which is where the booking bar,
   every section heading and the nav now sit -- the hero is the single
   deliberate exception at `--isl-edge`, and it reads as a card sitting proud
   precisely because nothing else does it. */
.layout-island .site-footer > * {
  max-width: none;
  width: 100%;
  margin: 0;
  padding-left: var(--isl-gutter);
  padding-right: var(--isl-gutter);
}
.layout-island .site-footer a { color: var(--isl-ink); }
.layout-island .site-footer a:hover { color: var(--isl-accent); }
.layout-island .footer-copy,
.layout-island .footer-ai-hint { color: var(--isl-dim); }
/* The footer is dark on classic, so its brand name is white and its tagline is
   white at 40%. On this ground both were white-on-white — the company name was
   the least readable text on its own homepage. The tagline's colour is an
   inline style in `_footer.html`, which is why one of these needs the same
   `!important` the language label does. */
.layout-island #footerBrand,
.layout-island .footer-copy-brand { color: var(--isl-ink); }
.layout-island .footer-tagline { color: var(--isl-dim) !important; }

/* ── Hero ────────────────────────────────────────────────────────────────── */
.isl-hero {
  position: relative;
  margin: var(--isl-header) var(--isl-edge) 0;
  height: 342px;
  border-radius: var(--isl-r-lg);
  overflow: hidden;
  /* A hard horizon, not a smooth blur. A three-stop blur is what a CMS shows
     while an upload is pending, so it reads as a missing image however well
     the colours are chosen; one crisp edge reads as an illustration. This is
     the fallback an install with no photographs sees, which makes it the state
     worth designing hardest -- and the demo is permanently in it. */
  background: linear-gradient(#333C44 0 46%, #262E35 46% 47%, #1A2127 47% 74%, #0B1014 74%) center / cover;
}
/* The photograph gets a layer of its own rather than riding on the section's
   own `background-image`, for two reasons. It is the layer that drifts, and
   scaling the section itself would scale the headline with it. And a photo set
   inline on the section replaces the fallback gradient wholesale, which meant
   inheriting a `background-size` list written for the layer beneath it.

   The URL arrives as a custom property from the template, because a pseudo
   element cannot be addressed by an inline style. With no photo the property
   is unset, `background-image` resolves to nothing, and the gradient below
   shows through untouched. */
.isl-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: var(--isl-hero-photo);
  background-size: cover;
  /* NOT `center`. This frame is a fixed 590px tall against a fluid width, so
     its aspect ratio runs from about 2:1 on a laptop to 3.2:1 at 1920 — and
     everything `cover` discards it discards from the top and bottom. A
     landscape photograph keeps its subject above the middle (a horizon, a
     roofline, a car on a road), so centring the crop throws away the subject
     first and keeps the foreground. 20% holds the upper third at every width
     this layout is used at. */
  background-position: center 32%;
}
/* Twenty seconds, six percent, once. Slow enough that it is felt rather than
   watched -- the moment a viewer can see it move it stops reading as film and
   starts reading as a slideshow. `both` holds the end state instead of
   snapping back, and the animation is on a composited layer so it costs no
   layout. Class-gated: there is nothing to drift when there is no photograph,
   and drifting the fallback gradient would only advertise that it is one. */
@keyframes isl-drift { from { transform: scale(1); } to { transform: scale(1.06); } }
.isl-hero.has-photo::before { animation: isl-drift 20s ease-out both; }
/* One scrim, not two. The template used to add its own gradient over the
   photograph and this one over that, which multiplied to roughly 85% black at
   the foot -- invisible today with no photographs, and the day real ones land
   it would look like darkened stock and the photographer would get the blame. */
.isl-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    var(--isl-grain),
    linear-gradient(180deg,
      color-mix(in oklab, var(--isl-scrim) 58%, transparent) 0%,
      color-mix(in oklab, var(--isl-scrim) 16%, transparent) 30%,
      color-mix(in oklab, var(--isl-scrim) 10%, transparent) 52%,
      color-mix(in oklab, var(--isl-scrim) 70%, transparent) 100%);
  background-size: 140px 140px, cover;
}
/* Title at the top of the frame, the line under it at the foot (owner
   2026-09-20). White type in the MIDDLE of a bright photograph — sky, sand,
   sea — has nothing to sit on; the two ends are where the scrim is, and the
   photograph keeps its middle to itself. `pointer-events` because the block
   now covers the whole frame: invisible, and it would swallow a click on
   anything laid over the hero later. */
.isl-hero-txt {
  position: absolute;
  left: 24px;
  right: 24px;
  top: 20px;
  bottom: 24px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  color: #fff;
  z-index: 1;
  pointer-events: none;
}
.isl-hero-txt > * { pointer-events: auto; }
.isl-hero-txt .isl-promise { margin-bottom: 0; }
/* Eyebrow: Inter 600 caps at .08em (owner 2026-10-06 10:34). */
.isl-kicker {
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  opacity: .85;
  margin: 0 0 8px;
}
.layout-island h1.isl-h1 {
  font-family: inherit;
  font-size: 30px;
  font-weight: 200;
  letter-spacing: -.035em;
  line-height: 1;
  margin: 0 0 11px;
  color: #fff;
  text-wrap: balance;
  /* Faint, not a drop shadow: enough to hold an edge where a cloud runs
     white behind a letter, invisible everywhere else. */
  text-shadow: 0 2px 18px rgba(0, 0, 0, .35);
}
/* The hook, inside the LCP element's own block. Positioning decided that
   friction removal belongs in the headline (spec 01 section 3); the headline
   itself is derived from the destination list and stays that way (section
   26.5), so the promise sits directly beneath it in the same lockup.
   Hard-stopped fragments, not bullets or commas: a fragment ending in a full
   stop reads as a term of business, the same words with dots between them
   read as a banner. */
.isl-promise {
  text-shadow: 0 1px 14px rgba(0, 0, 0, .55);
  font-size: 15px;
  font-weight: 300;
  line-height: 1.3;
  letter-spacing: -.015em;
  max-width: 30ch;
  margin: 0 0 10px;
  text-wrap: balance;
}

/* ── Booking bar ──────────────────────────────────────────────────────────
   No negative pull on the phone: the hero's own text sits at its bottom edge,
   so an overlapping bar would cover the sub-line. Desktop has the room. */
.isl-book {
  position: relative;
  z-index: 2;
  margin: 16px var(--isl-gutter) 0;
  background: var(--isl-card);
  border: 1px solid var(--isl-line);
  border-radius: var(--isl-r-md);
  padding: 6px;
  box-shadow: 0 14px 30px -18px rgba(60, 40, 25, .2);
}
.isl-fld {
  display: block;
  padding: 11px 13px;
  border-bottom: 1px solid var(--isl-line);
}
.isl-fld:last-of-type { border-bottom: 0; }
/* The destination list is shown only while two or more are live (spec
   2026-10-04 §7); `display: block` above would otherwise outrank [hidden]. */
.isl-fld[hidden] { display: none; }
/* 8.5px was a decorative size on a functional label. These name the fields of
   the one control the page exists for, they are read outdoors, on a phone, by
   a customer who is frequently over 40. 10px with the tracking eased from
   .13em to .11em is very close to the same rendered width -- so the field rows
   do not reflow and the longest label, PICK-UP DATE - RETURN DATE, still sits
   on one line -- while being a size a person can actually read.
   Raised again to 12px (design review 2026-09-10: 10px still read as small
   print). Tracking eased to .07em for the same reason as before: the longest
   label has to hold one line in the phone's 297px field, measured. */
/* Inter 600 at 13px in sentence case, no tracking (owner 2026-10-06 10:34:
   the capitals in the mono were what made these fields look bad).
   `:first-child` because site-loader.js wraps each time <select> in a
   `.time-wrap` span, which is a child of the label too and must not take
   the label's weight into the time sheet it holds. */
.isl-fld > span:first-child {
  display: block;
  font-family: var(--isl-sans);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  color: var(--isl-dim);
}
.isl-fld input,
.isl-fld select {
  width: 100%;
  border: 0;
  background: transparent;
  padding: 0;
  margin-top: 2px;
  font-family: inherit;
  font-size: 16px;
  font-weight: 400;
  color: var(--isl-ink);
  appearance: none;
  -webkit-appearance: none;
}
/* iOS Safari zooms the whole page in when a field smaller than 16px is
   focused, and does not zoom back out -- so the customer is left magnified,
   halfway through the one control this page exists for. The 16px rule was
   already written, at the foot of this file inside `@media (min-width: 860px)`:
   applied to desktop, where no iPhone ever is, and not to the phone.
   The DATE box only. The two location dropdowns stay at 14.5px because at 16px
   the longest real desk name -- "Mandraki Port (local boats & sailing yachts)"
   -- needs 302px where it has 297 and would lose a character, and because iOS
   opens a wheel picker for a <select> rather than placing a caret in the page,
   so it is not clear it zooms for one at all. Nobody here owns an iPhone to
   settle that; when a real one is at hand, check the dropdowns and raise them
   too (shortening that one location name in the console is the other way). */
.isl-fld input { font-size: 16px; }
/* The two dropdowns are 16px too since Inter (owner 2026-10-06 10:34): the
   bar's list now names a kind of place (spec 2026-10-04 §7), not the long
   desk name the note above was measured on. */
.isl-fld input::placeholder { color: var(--isl-ink-3); }
/* `appearance: none` above strips the native arrow, and a select with no
   affordance that it opens is the whole booking bar on a phone. Inline SVG
   rather than a pseudo-element: a <select> cannot carry ::after. */
.isl-fld select {
  padding-right: 16px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='6' fill='none' stroke='%23968E92' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1.5 4.5 5 8 1.5'/%3E%3C/svg%3E") no-repeat right center;
}
.isl-fld input:focus,
.isl-fld select:focus { outline: 2px solid var(--isl-accent); outline-offset: 4px; border-radius: 3px; }

/* ── The open dropdown was white text on a white list ─────────────────────
   Reported from Chrome on Windows, 2026-09-04, and measured: every <select>
   on this layout computed `option { background: rgba(0,0,0,0) }` with
   `color: #E8EDF1` and a root `color-scheme: normal`. The CLOSED control is
   fine -- it sits on our own card. The OPEN list is painted by the browser,
   and with no background given and no scheme declared Chrome paints it on the
   system default, which on Windows is white. Near-white text on white: the
   station and time lists were invisible. Firefox and Safari each guess
   differently, which is why it read as a browser bug and is not one -- the
   stylesheet genuinely never said.

   `color-scheme: dark` is the root-cause fix: it tells the browser this whole
   layout is dark, so every native control it paints for us -- popups,
   scrollbars, date fields -- follows. The explicit option colours stay beside
   it because `color-scheme` alone leaves the popup at the UA's dark grey
   rather than this page's card, and the two lists then disagree.

   Declared on `.layout-island` and not on `:root`: `:root` in this codebase is
   the tenant palette, and this must not reach a deployment that renders the
   light classic homepage. Precedent for the option rule is
   `.flatpickr-monthDropdown-months option` further down this file -- the same
   bug, found and fixed for the calendar's month list alone, which is why that
   one dropdown was the only readable one on the page. */
/* Light since theme A (2026-10-06): the same rule, the other way round. */
.layout-island { color-scheme: light; }
.layout-island .isl-fld select option,
.layout-island.page-booking .wizard-panel-body select option,
.layout-island.page-booking #preferredModel option {
  background: var(--isl-card);
  color: var(--isl-ink);
}
.isl-times, .isl-locs { display: grid; grid-template-columns: 1fr 1fr; }
.isl-times .isl-fld:first-child, .isl-locs .isl-fld:first-child { border-right: 1px solid var(--isl-line); }
.isl-locs { border-bottom: 1px solid var(--isl-line); }
.isl-locs .isl-fld { border-bottom: 0; }
.isl-go {
  display: block;
  width: 100%;
  background: var(--isl-accent);
  color: var(--isl-accent-ink);
  text-align: center;
  border: 0;
  border-radius: var(--isl-r-sm);
  padding: 14px;
  margin-top: 6px;
  font-family: inherit;
  font-size: 15.5px;
  font-weight: 400;
  cursor: pointer;
}
.isl-go:hover { background: var(--isl-accent-deep); }

/* ── The terms of the booking, inside the booking ─────────────────────────
   This replaces a three-column row of display numerals below the card. Two
   things were wrong with that and only one of them was the height.

   A numeral at 46px is a QUANTITY form -- the reader's eye is trained that a
   big figure is an impressive fact -- so it landed on "0" three times and got
   a null. Grand form, empty payload. The same three facts read as confident
   when they are sentences and as cheap when they are figures, which is the
   whole of it. And three fixed columns is precisely where German and Greek
   break: at 375px each column was 101px holding a phrase that measures 108px.

   Putting them inside the card is not just tidier. Stated anywhere else these
   are marketing; stated here they are the specification of this form, and the
   booking bar stops being a widget and becomes an object with weight.

   The negative margins pull the hairline out to the card's inner edge so it
   divides the card rather than sitting inside it.

   Two rules that outlive this layout:
     - "No credit card required" is a KEYWORD, not a claim to be improved. It
       is the literal string a German or Italian types when they mean the
       guarantee deposit (spec 01 section 4). It ships verbatim, contiguous, as
       crawlable text, in its own span. Not "no card hold", not "deposit-free".
     - A booking fee, if one ever exists, must never share this eyeline. It is
       a payment; these are about the deposit, and the two in one glance read
       as a contradiction. */
.isl-terms {
  border-top: 1px solid var(--isl-line);
  margin: 6px -6px -6px;
  padding: 12px 14px 13px;
  display: flex;
  flex-wrap: wrap;
  gap: 4px 14px;
  font-size: 12.5px;
  line-height: 1.35;
  color: var(--isl-dim);
}
.isl-terms b { font-weight: 500; color: var(--isl-ink); }

/* ── Section furniture ─────────────────────────────────────────────────────
   The rule above each heading is the cheapest structural move on the page: it
   converts a stack of floating blocks into a document. It is full-bleed for
   free -- the padding is inside the border box, so the line runs edge to edge
   while the heading sits at the gutter. There was exactly one hairline in this
   file before, a `border-bottom` under the figures with no `border-top`
   anywhere to answer it, which is why it read as a leftover rather than a
   system. */
.isl-sect {
  padding: 24px var(--isl-gutter) 0;
  margin-top: 24px;
  border-top: 1px solid var(--isl-line);
}
.isl-sect + .isl-reel, .isl-sect + .isl-tiles, .isl-sect + .isl-feature { margin-top: 0; }
.isl-sect-h { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 14px; }
.layout-island .isl-sect-h h2 {
  font-family: inherit;
  font-size: 21px;
  font-weight: 300;
  letter-spacing: -.025em;
  margin: 0;
  color: var(--isl-ink);
}
.isl-sect-h a { font-size: 12.5px; color: var(--isl-accent); font-weight: 400; text-decoration: none; }
.isl-sect-sub {
  margin: -6px 0 0;
  max-width: 46ch;
  font-size: 13.5px;
  font-weight: 300;
  line-height: 1.45;
  color: var(--isl-dim);
}

/* ── Cars. Real models, and no price until dates make one true (§26.3) ───── */
.isl-reel {
  display: flex;
  gap: 12px;
  overflow-x: auto;
  padding: 0 var(--isl-gutter) 6px;
  scroll-snap-type: x mandatory;
}
.isl-reel::-webkit-scrollbar { height: 0; }
.isl-car {
  flex: 0 0 176px;
  scroll-snap-align: start;
  background: var(--isl-card);
  border: 1px solid var(--isl-line);
  border-radius: var(--isl-r-md);
  overflow: hidden;
  transition: border-color .3s, transform .5s cubic-bezier(.2, .7, .2, 1);
}
.isl-car .im {
  height: 96px;
  background: var(--isl-grain), linear-gradient(160deg, var(--isl-wash), var(--isl-wash-2));
  background-size: 140px 140px, cover;
  display: flex;
  align-items: center;
  justify-content: center;
}
.isl-car .im img { width: 100%; height: 100%; object-fit: cover; }
.isl-car .im svg { stroke: var(--isl-ink-2); }
.isl-car .bd { padding: 11px 13px 14px; }
.isl-car .nm { font-size: 14px; font-weight: 500; letter-spacing: -.01em; }
.isl-car .mt { font-size: 11px; color: var(--isl-dim); margin-top: 1px; }
.isl-car .nopr { font-size: 12.5px; color: var(--isl-dim); margin-top: 8px; }
/* The whole card is an anchor now, so it has to be told to stop looking like
   one -- and to be a block, because an inline <a> ignores the flex basis and
   the grid track the reel gives it. */
.isl-car { display: block; color: inherit; text-decoration: none; }
/* The price. `strong` is the figure and only one month's is ever visible; the
   suffix is a separate span so it does not inherit the weight. `hidden` on the
   other twelve is the browser's own, which is why nothing here may give
   .fleet-month-rate a display. */
.isl-car .pr {
  display: flex;
  align-items: baseline;
  gap: 4px;
  margin-top: 9px;
  font-size: 15px;
  font-weight: 500;
  letter-spacing: -.01em;
}
.isl-car .pr .pd { font-size: 11.5px; font-weight: 300; color: var(--isl-dim); }
/* The duration discount. A hairline rule above it rather than a coloured pill:
   a badge is what a discount site puts here, and the whole argument of this
   page is that it is not one. The rule reads as a term, the figure beside it
   as the consequence. */
.isl-car .dsc {
  margin-top: 8px;
  padding-top: 8px;
  border-top: 1px solid var(--isl-line);
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 2px 8px;
}
.isl-car .dsc .rule {
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-accent);
}
.isl-car .dsc .then { font-size: 12px; font-weight: 500; }
.isl-car .dsc .then .pd { font-size: 10.5px; font-weight: 300; color: var(--isl-dim); }
/* "On Request". Its own class rather than the discount's, because both can sit
   on one card: the discount is a price term, this is how the car is got. Set in
   the same mono face as the discount rule so the two read as one column of
   terms, but in --isl-dim rather than --isl-accent -- the accent is reserved
   for what improves the offer. */
.isl-car .onreq {
  margin-top: 8px;
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-dim);
}
/* The one explanation for the whole reel, under it rather than inside a card:
   every card is an anchor and this carries a link of its own. */
.isl-onreq-note {
  margin: 0 var(--isl-gutter) 4px;
  font-size: 12px;
  font-weight: 300;
  color: var(--isl-dim);
}
.isl-onreq-note a { color: var(--isl-accent); }

/* The month stepper. premium-home.css styles the shared classes against
   --surface / --text, which are the classic palette's tokens and not this
   layout's, so every rule that decides a colour is restated here. Layout is
   inherited from that file on purpose: it is the same control. */
.layout-island .fleet-months {
  justify-content: flex-start;
  gap: 10px;
  margin: 0 var(--isl-gutter) 14px;
  font-family: var(--isl-sans);
  font-variant-numeric: tabular-nums;
}
.layout-island .fleet-month-step {
  width: 26px;
  height: 26px;
  background: transparent;
  border-color: var(--isl-line);
  color: var(--isl-ink);
  transition: border-color .3s, color .3s;
}
.layout-island .fleet-month-step:hover:not(:disabled) { border-color: var(--isl-line-2); }
/* 26px is under half the 44px minimum tap target, on a control a thumb is
   meant to step through thirteen months with. The button STAYS 26px -- at this
   size it is right beside a 9px mono label and a bigger circle would become
   the loudest thing in the section. The hit area grows instead, invisibly. */
.layout-island .fleet-month-step { position: relative; }
.layout-island .fleet-month-step::before {
  content: "";
  position: absolute;
  inset: -9px;
}
.layout-island .fleet-month-labels {
  min-width: 15ch;
  text-align: left;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-dim);
}
/* island.js writes this element on an empty fleet and the stylesheet had no
   rule for it, so the one state a fresh install always hits rendered as a
   default-margin <p> inside a flex row. */
.isl-car-empty {
  margin: 0;
  padding: 8px 0 16px;
  font-size: 14px;
  font-weight: 300;
  color: var(--isl-dim);
}

/* ── What the price includes ──────────────────────────────────────────────
   A rate card, so it is set as one: hairline rules, the tier on the left and
   the two figures ranged right, nothing boxed. The same spec-sheet register
   the About page's fact cards use -- money read as a table is read as fact,
   money read in a card with a border is read as an offer. */
.isl-cover {
  padding: 16px var(--isl-gutter) 0;
}
.isl-cover .row {
  display: grid;
  grid-template-columns: 1fr auto;
  /* Named, not implicit. The row gained a third cell (what the level does) and
     auto-placement put the excess line in the second column's track, floating
     it into the middle of the row with nothing under the name. Areas say where
     each cell goes and cannot drift when a fourth is added. */
  grid-template-areas:
    "nm pd"
    "ds ds"
    "ex ex";
  gap: 2px 16px;
  padding: 13px 0;
  border-top: 1px solid var(--isl-line);
}
.isl-cover .nm { grid-area: nm; }
.isl-cover .pd { grid-area: pd; }
.isl-cover .ds { grid-area: ds; }
.isl-cover .ex { grid-area: ex; }
.isl-cover .row:first-child { border-top: 0; }
.isl-cover .nm { font-size: 15px; font-weight: 400; letter-spacing: -.01em; }
.isl-cover .pd {
  font-size: 15px;
  font-weight: 500;
  text-align: right;
  white-space: nowrap;
}
.isl-cover .ex {
  margin-top: 4px;
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-dim);
}
/* What the level DOES. The row used to be a name and two figures, so the
   largest sum a visitor might owe was the first hard number on the page with
   nothing beside it saying what the cover was for. This sentence sits under
   the name, in the flow, and is the only cell that wraps. */
.isl-cover .ds {
  max-width: 58ch;
  font-size: 13.5px;
  font-weight: 300;
  line-height: 1.5;
  color: var(--isl-dim);
}
.isl-cover .ds:empty { display: none; }
.isl-cover .note {
  margin: 16px 0 0;
  max-width: 62ch;
  font-size: 13.5px;
  font-weight: 300;
  line-height: 1.5;
  color: var(--isl-dim);
}
/* The exclusions. Same size AND same colour as its siblings on purpose: a
   warning styled as a warning reads as the small print a reader has learned to
   skip, and the whole argument of this page is that it says the awkward part in
   the same voice as the rest. It used to be the one white paragraph in the
   block, which made the loudest sentence in the insurance section the one about
   what is not covered -- the opposite of what the block is for. Only the rule
   above it separates them now. */
.isl-cover .note.warn {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--isl-line);
}

/* ── Destinations. Real anchors, never JS handlers — they are the crawlable
      link block the whole SEO argument rests on (§13.2). ─────────────────── */
.isl-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding: 16px var(--isl-gutter) 0; }
.isl-tiles.is-two { grid-template-columns: 1fr; gap: 12px; }
.isl-tiles.is-two .isl-tile { height: 168px; }
.isl-tiles.is-two .isl-tile .n { font-size: 26px; }
.isl-tile {
  position: relative;
  display: block;
  height: 112px;
  border-radius: var(--isl-r-md);
  overflow: hidden;
  text-decoration: none;
  background: var(--isl-grain), linear-gradient(#343D45 0 52%, #252D34 52% 53%, #161C21 53%);
  background-size: 140px 140px, cover;
  transition: transform .5s cubic-bezier(.2, .7, .2, 1);
}
.isl-tile.g2 { background: var(--isl-grain), linear-gradient(#333E42 0 52%, #242E32 52% 53%, #151E22 53%); background-size: 140px 140px, cover; }
.isl-tile.g3 { background: var(--isl-grain), linear-gradient(#3A3D4A 0 52%, #2A2C38 52% 53%, #191B25 53%); background-size: 140px 140px, cover; }
/* The destination's own photograph, under the scrim and over the fallback
   gradient. A layer of its own rather than the tile's `background`, because the
   gradient below it is what a destination with no photo keeps -- and because
   the three `g1/g2/g3` variants each set `background` wholesale, so a photo put
   there would be overwritten by the variant on two tiles in every three. */
.isl-tile.has-photo::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: var(--isl-tile-photo);
  background-size: cover;
  background-position: center 42%;
}
.isl-tile::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg,
    transparent 38%,
    color-mix(in oklab, var(--isl-scrim) 74%, transparent) 100%);
  transition: background .3s;
}
.isl-tile .tx { position: absolute; left: 13px; right: 13px; bottom: 11px; color: #fff; z-index: 1; }
.isl-tile .n { font-size: 18px; font-weight: 300; letter-spacing: -.025em; line-height: 1.1; }
.isl-tile .c {
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  opacity: .88;
  margin-top: 5px;
}

/* One destination is a strip, not a grid of one (owner 2026-09-19: "it
   should be a strip"): a small photo, the name and its pick-up sentence, and
   the link, one row under the booking bar. */
.isl-feature {
  display: grid;
  grid-template-columns: 96px 1fr;
  align-items: center;
  gap: 14px;
  margin: 16px var(--isl-gutter) 0;
  padding: 10px;
  border: 1px solid var(--isl-line);
  border-radius: var(--isl-r-lg);
  transition: border-color .3s;
  background: var(--isl-card);
  text-decoration: none;
  color: inherit;
}
.isl-feature .ph {
  height: 64px;
  border-radius: calc(var(--isl-r-lg) - 6px);
  background: var(--isl-grain), linear-gradient(#343D45 0 54%, #252D34 54% 55%, #161C21 55%);
  background-size: 140px 140px, cover;
  background-position: center;
}
.isl-feature.has-photo .ph {
  background-size: cover;
  background-position: center 38%;
  background-repeat: no-repeat;
}
.isl-feature .bd { min-width: 0; }
.isl-feature .bd h3 { font-family: inherit; font-size: 20px; font-weight: 300; letter-spacing: -.02em; margin: 0 0 2px; }
.isl-feature .bd p { font-size: 14px; color: var(--isl-dim); margin: 0 0 2px; line-height: 1.4; }
.isl-feature .bd .go { font-size: 14px; color: var(--isl-accent); }

/* ── How it works ─────────────────────────────────────────────────────────
   The only numbered block on the page. Numerals are used here because the
   order carries real information -- you cannot collect before you book --
   and nowhere else, so they never become decoration. Mono and small: a
   large numeral is a QUANTITY form, which is the mistake the €0 row made. */
.isl-steps {
  list-style: none;
  margin: 16px 0 0;
  padding: 0 var(--isl-gutter);
  display: grid;
  gap: 26px;
}
.isl-steps li { display: block; }
.isl-steps .n {
  display: block;
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  color: var(--isl-accent);
  margin-bottom: 9px;
}
.isl-steps h3 {
  font-family: inherit;
  font-size: 19px;
  font-weight: 400;
  letter-spacing: -.02em;
  margin: 0 0 7px;
  color: var(--isl-ink);
}
.isl-steps p {
  margin: 0;
  font-size: 15px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--isl-dim);
  text-wrap: pretty;
}

/* ── About ────────────────────────────────────────────────────────────────
   Three beats, stacked on a phone and side by side on desktop (below). Each
   column keeps a reading measure of its own; the row fills the gutters. */
.isl-about {
  padding: 16px var(--isl-gutter) 0;
  display: grid;
  gap: 34px;
}
.isl-about .col { max-width: 60ch; }
.isl-about p {
  margin: 0 0 15px;
  font-size: 15.5px;
  font-weight: 300;
  line-height: 1.62;
  color: var(--isl-dim);
  text-wrap: pretty;
}
.isl-about p:last-child { margin-bottom: 0; }
.isl-about .lead {
  font-size: 18px;
  line-height: 1.5;
  color: var(--isl-ink);
  letter-spacing: -.01em;
}
/* The title over each column. Was the 9px mono label (`.isl-desk .k`), in
   the placeholder grey: the owner could not see them (2026-09-10 12:56). Now a
   small sentence-case heading in a light orange he chose (12:59, option D) --
   the only orange on the site, used nowhere else on purpose. */
.isl-about .k {
  font-size: 17px;
  font-weight: 500;
  line-height: 1.3;
  color: var(--isl-accent);
  margin-bottom: 12px;
}

/* ── No deposit ───────────────────────────────────────────────────────────
   One line and a comparison (owner 2026-09-23). A phone stacks each row with
   its two small column labels (the <em>s); from 900px the labels move up
   into one header row and each row is three columns. The orange is the
   About heading colour he chose on 2026-09-10. */
.isl-nodep { padding: 0 var(--isl-gutter); }
.isl-nodep__intro {
  margin: 10px 0 20px;
  max-width: 62ch;
  font-size: 16.5px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--isl-dim);
  text-wrap: pretty;
}
.isl-nodep__row { display: block; padding: 14px 0; border-top: 1px solid var(--isl-line); }
.isl-nodep__row > span { display: block; font-size: 15px; line-height: 1.5; }
.isl-nodep__row .h { color: var(--isl-ink); font-size: 15.5px; margin-bottom: 8px; }
.isl-nodep__row .desk { color: var(--isl-dim); font-weight: 300; margin-bottom: 8px; }
.isl-nodep__row .here { color: var(--isl-ink); }
/* The way to the full explanation (owner 2026-10-07). */
.isl-nodep__more { margin: 18px 0 0; font-size: 15px; }
.isl-nodep__more a { color: var(--isl-accent); text-underline-offset: 3px; }
.isl-nodep__row em {
  display: block;
  font-style: normal;
  font-size: 12px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--isl-dim);
}
.isl-nodep__row .here em, .isl-nodep__head .here { color: var(--isl-accent); }
.isl-nodep__head { display: none; }
@media (min-width: 900px) {
  .isl-nodep__row {
    display: grid;
    grid-template-columns: minmax(140px, .8fr) 1.3fr 1.3fr;
    column-gap: 28px;
    padding: 16px 0;
  }
  .isl-nodep__row .h, .isl-nodep__row .desk { margin-bottom: 0; }
  .isl-nodep__row em { display: none; }
  .isl-nodep__head {
    display: grid;
    border-top: 0;
    padding: 0 0 10px;
  }
  .isl-nodep__head > span { font-size: 12.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--isl-dim); }
}

/* ── The desk ─────────────────────────────────────────────────────────── */
.isl-desk {
  padding: 16px var(--isl-gutter) 0;
  display: grid;
  gap: 22px;
}
/* Eyebrow: Inter 600 caps at .08em (owner 2026-10-06 10:34). */
.isl-desk .k {
  font-family: var(--isl-sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink-3);
  margin-bottom: 7px;
}
.isl-desk p { margin: 0; font-size: 16px; font-weight: 300; color: var(--isl-ink); line-height: 1.45; }
.isl-desk a { color: var(--isl-ink); text-decoration: none; border-bottom: 1px solid var(--isl-line-2); }
.isl-desk a:hover { color: var(--isl-accent); border-bottom-color: var(--isl-accent); }
.isl-desk .sub { display: block; margin-top: 6px; font-size: 13px; font-weight: 300; color: var(--isl-dim); }

/* ── Three questions ──────────────────────────────────────────────────────
   No JavaScript. `<details>` is keyboard-operable and screen-reader-correct
   for free, and the answers stay in the DOM for a crawler whether or not
   anyone opens them -- which matters on a page whose whole demand strategy is
   organic search. The default triangle is replaced because it is the one part
   of the element that looks like a browser rather than like this site. */
.isl-q { padding: 8px var(--isl-gutter) 0; }
.isl-q details { border-top: 1px solid var(--isl-line); }
.isl-q details:last-child { border-bottom: 1px solid var(--isl-line); }
.isl-q summary {
  list-style: none;
  cursor: pointer;
  padding: 17px 30px 17px 0;
  position: relative;
  font-size: 16px;
  font-weight: 400;
  letter-spacing: -.01em;
  color: var(--isl-ink);
}
.isl-q summary::-webkit-details-marker { display: none; }
.isl-q summary::after {
  content: "";
  position: absolute;
  right: 4px;
  top: 50%;
  width: 9px;
  height: 9px;
  margin-top: -6px;
  border-right: 1.5px solid var(--isl-dim);
  border-bottom: 1.5px solid var(--isl-dim);
  transform: rotate(45deg);
  transition: transform .25s, border-color .25s;
}
.isl-q details[open] summary::after { transform: rotate(-135deg); margin-top: -2px; border-color: var(--isl-accent); }
.isl-q summary:hover::after { border-color: var(--isl-accent); }
.isl-q details p {
  margin: 0 0 18px;
  max-width: 58ch;
  font-size: 15px;
  font-weight: 300;
  line-height: 1.6;
  color: var(--isl-dim);
  text-wrap: pretty;
}

/* ── The guarantee ────────────────────────────────────────────────────────
   Terms, set as terms. An <ol> because they are numbered clauses a reader can
   point at, but the markers are deliberately NOT the display numerals the
   steps use: those are accent-coloured and stacked above their heading because
   order carries meaning there. Here the order is arbitrary, so the numbers run
   inline in the placeholder grey and stay quiet. Reusing the loud form would
   have cost the steps their uniqueness for no gain.

   Hairline per row, the page's own device for "this is a schedule, not a
   pitch". No icons, no ticks -- a row of green checkmarks is the visual
   grammar of a pricing table and would undo the whole point. */
/* Good to know: four cards, icon + headline + one line. One column on a
   phone, two on a tablet, four across from desktop. */
.isl-know {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
  padding: 4px var(--isl-gutter) 0;
}
.isl-know .card {
  padding: 20px;
  border: 1px solid var(--isl-line);
  border-radius: var(--isl-r-lg);
  background: var(--isl-card);
}
.isl-know svg {
  width: 26px;
  height: 26px;
  fill: none;
  stroke: var(--isl-accent);
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  margin-bottom: 12px;
}
.isl-know h3 { font-family: inherit; font-size: 18px; font-weight: 400; letter-spacing: -.01em; margin: 0 0 6px; color: var(--isl-ink); }
.isl-know p { font-size: 14.5px; font-weight: 300; line-height: 1.5; margin: 0; color: var(--isl-dim); text-wrap: pretty; }
@media (min-width: 600px) { .isl-know { grid-template-columns: repeat(2, 1fr); } }

/* ── One review ───────────────────────────────────────────────────────────
   One, not a carousel. A row of five is a volume claim this company cannot
   make yet; a single quotation is a quotation. No stars, no rating number,
   no "trusted by N" -- all three were rejected in the design review as the
   things a reader has learned to discount. */
.isl-close { display: block; }
.isl-review {
  margin: 24px 0 0;
  padding: 26px var(--isl-gutter) 0;
  border-top: 1px solid var(--isl-line);
}
.isl-review blockquote {
  margin: 0;
  font-size: 21px;
  font-weight: 200;
  letter-spacing: -.02em;
  line-height: 1.4;
  color: var(--isl-ink);
  max-width: 30ch;
  text-wrap: pretty;
}
.isl-review figcaption {
  margin-top: 14px;
  font-size: 14px;
  font-weight: 400;
  color: var(--isl-ink);
}
.isl-review figcaption span {
  display: block;
  margin-top: 2px;
  font-family: var(--isl-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink-3);
}

/* ── The cookie banner ───────────────────────────────────────────────────
   A shared component (components.css), and on classic it is the shipped navy
   with white text — correct there, a slab of another company's brand colour
   here. It is `position: fixed`, so it is not part of the page and no layout
   change can stop it covering the bottom of the viewport until it is
   dismissed; what a layout CAN do is make it look like it belongs to this
   site. Restyled only under `.layout-island`, so every other deployment's
   banner is untouched. */
.layout-island .cookie-banner {
  background: var(--isl-card);
  border-top: 1px solid var(--isl-line);
  box-shadow: 0 -14px 34px -20px rgba(60, 40, 25, .2);
}
.layout-island .cookie-text { color: var(--isl-dim); }
.layout-island .cookie-text a { color: var(--isl-accent); }
.layout-island .cookie-btn { border-radius: 999px; font-weight: 400; }
/* Both answers look the same (owner 2026-09-18): "Book now" is the only filled
   accent on the first screen, and refusing is as easy as accepting. */
.layout-island .cookie-btn-gold,
.layout-island .cookie-btn-outline { background: transparent; color: var(--isl-dim); border: 1px solid var(--isl-line); }
.layout-island .cookie-btn-gold:hover,
.layout-island .cookie-btn-outline:hover { background: transparent; color: var(--isl-accent); border-color: var(--isl-accent); }
/* Measured at 375x812 on 2026-09-04: the banner covered 656-812 and the one
   button this page exists to get a thumb onto sat at 692-740 -- underneath it.
   On a 667px phone the button was off-screen entirely and the banner reached
   the date field. The banner is `position: fixed` and shared, so no layout
   change can move it; what this layout can do is make it shorter. Type and
   padding only -- nothing here changes what the banner says or does, and it
   is scoped so no other deployment's banner shrinks. */
/* ── CAR GROUPS YOU CAN BOOK ───────────────────────────────────────────────
   The section a destination page carries instead of the deleted /groups fleet
   page (owner 2026-09-17). Its markup is `_island_cars.html`; these rules are
   here rather than in the template because the page that used to own them was
   a one-off with a <style> block in its head, and that is how the site ended
   up with two car cards styled two ways.

   Scoped under `.isld-cars` on purpose. `.fleet-category`, `.photo-carousel`
   and `.group-model-*` are also styled by `inner-pages.css` and `booking.css`
   for the classic theme and the wizard; neither stylesheet is loaded on this
   layout, and the scope makes sure it stays that way if one ever is.

   No price anywhere, so there is no price type to style — the one visual
   difference from the wizard's card, and the one that matters. */
.isld-cars-grid {
  display: grid;
  /* auto-fit + a cap, not auto-fill: two cars on a three-track row left an
     empty third cell (outsider 2026-09-20). They centre at their own width. */
  grid-template-columns: repeat(auto-fit, minmax(260px, 360px));
  justify-content: center;
  gap: 20px;
  padding: 0 var(--isl-gutter);
}
.isld-cars .fleet-category {
  background: var(--isl-card);
  border: 1px solid var(--isl-line);
  border-radius: var(--isl-r-md);
  overflow: hidden;
  padding-bottom: 14px;
}
.isld-cars .fleet-category-header { padding: 16px 16px 0; }
.layout-island .isld-cars .fleet-category-header h3 {
  font-family: inherit;
  font-size: 19px;
  font-weight: 400;
  letter-spacing: -.02em;
  margin: 0;
  color: var(--isl-ink);
}
.isld-cars .fleet-category-desc {
  padding: 4px 16px 0;
  font-size: 13.5px;
  line-height: 1.45;
  color: var(--isl-dim);
}
.isld-cars .group-model-card { margin-top: 12px; }
/* The stage: one model standing on it, the rest hidden until a pill is
   pressed. A fixed height so pressing a pill does not move the page under the
   thumb that pressed it -- the cars are photographed at different aspects. */
.isld-cars .group-photo-stage[hidden] { display: none; }
.isld-cars .photo-carousel,
.isld-cars .photo-placeholder {
  position: relative;
  height: 172px;
  overflow: hidden;
  background: linear-gradient(140deg, var(--isl-line), var(--isl-card));
}
.isld-cars .photo-placeholder {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 40px;
  /* The glyph is decoration standing in for a photograph nobody uploaded. */
  opacity: .5;
}
.isld-cars .photo-carousel-track {
  display: flex;
  height: 100%;
  transition: transform 320ms cubic-bezier(.4, 0, .2, 1);
}
.isld-cars .photo-carousel-track img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  flex-shrink: 0;
  user-select: none;
}
.isld-cars .carousel-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(14, 19, 23, .72);
  color: var(--isl-ink);
  font-size: 17px;
  line-height: 1;
  cursor: pointer;
  z-index: 2;
}
.isld-cars .carousel-btn:hover { background: rgba(14, 19, 23, .9); }
.isld-cars .carousel-btn-prev { left: 8px; }
.isld-cars .carousel-btn-next { right: 8px; }
.isld-cars .carousel-dots {
  position: absolute;
  bottom: 8px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 5px;
  z-index: 2;
}
.isld-cars .carousel-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: rgba(232, 237, 241, .45);
}
.isld-cars .carousel-dot.active { background: var(--isl-ink); }
.isld-cars .group-model-card__info { padding: 12px 16px 0; }
.isld-cars .group-model-card__name {
  margin: 0;
  font-size: 15px;
  font-weight: 400;
  color: var(--isl-ink);
}
.isld-cars .model-meta {
  margin: 3px 0 0;
  font-size: 12.5px;
  color: var(--isl-dim);
}
/* The pill row. Not the accent: the accent belongs to the booking button, and
   a row of accent pills beside it would be the same bug this file keeps
   fixing. An unsaturated border carries "pressed" well enough. */
.isld-cars .group-model-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 12px 16px 0;
}
.isld-cars .group-model-tab {
  font-family: inherit;
  font-size: 12.5px;
  font-weight: 400;
  padding: 6px 12px;
  border-radius: 999px;
  border: 1px solid var(--isl-line);
  background: transparent;
  color: var(--isl-dim);
  cursor: pointer;
}
.isld-cars .group-model-tab:hover { border-color: var(--isl-dim); }
.isld-cars .group-model-tab.active {
  border-color: var(--isl-dim);
  color: var(--isl-ink);
}

@media (max-width: 767px) {
  .layout-island .cookie-text { font-size: 12.5px; line-height: 1.35; }
  .layout-island .cookie-btn { padding: 8px 14px; font-size: 13px; }
  /* The banner sits at the foot on a phone too (owner 2026-09-18: "both on
     the bottom position"), over the booking button until it is answered.
     The banner is `z-index: 9999` against the header's 1000, so with the
     banner up the burger menu's lower links would open UNDERNEATH it. Put
     behind the panel while the menu is open, not dismissed: the visitor has
     still not answered it, and it comes back the moment the menu closes. */
  .layout-island .site-header.nav-open ~ .cookie-banner { z-index: 999; }

  /* The last line of the booking's own terms was under the fold.

     Measured 2026-09-17 on staging at 375x812, the tight phone: the homepage
     hero is 342px, and "No deposit held on your card" — the third of the
     three facts the bar exists to state — ended at 831 against an 812 fold,
     so a visitor read two of them and had to scroll to learn there was a
     third. The island page never had this: its hero is 300px and its row
     already cleared.

     Taken off the photograph rather than off the type. The hero's text is
     anchored to its bottom edge (`.isl-hero-txt { bottom: 24px }`), so a
     shorter hero crops the picture and moves nothing the visitor reads —
     and 22px of a decorative photograph is the cheapest 22px on the screen.
     Filling the date and time boxes does NOT buy this back: a select holding
     a value is exactly as tall as one showing a placeholder. */
  .isl-hero { height: 320px; }
}

/* ── The claim ───────────────────────────────────────────────────────────
   The extra room at the foot is for the banner: the page's closing sentence
   is the one line that must not be sat on while a visitor decides about
   cookies. It reads as deliberate whitespace once the banner is gone. */
.isl-claim { padding: 40px var(--isl-gutter) 64px; margin-top: 24px; border-top: 1px solid var(--isl-line); }
.isl-claim p {
  font-size: 20px;
  font-weight: 200;
  letter-spacing: -.02em;
  line-height: 1.35;
  max-width: 26ch;
  margin: 0;
  color: var(--isl-ink);
  text-wrap: pretty;
}

/* ── Pointer and keyboard states ──────────────────────────────────────────
   There was not one :hover, :focus-visible or transition on any of the three
   anchor types in this file -- and those three anchors are the whole
   navigation of the page. On a desktop, a card that does nothing when you
   point at it is the plainest "unfinished" tell available; without
   :focus-visible it is also unusable from a keyboard, which is the floor
   rather than a refinement. Deliberately no shadow bloom: the material
   language here is hairlines and exactly one shadow, and a card that grows a
   shadow would be arguing with every other surface. */
.isl-car:hover { border-color: var(--isl-line-2); transform: translateY(-2px); }
.isl-feature:hover { border-color: var(--isl-line-2); }
.isl-tile:hover { transform: translateY(-2px); }
.isl-tile:hover::after {
  background: linear-gradient(180deg,
    transparent 30%,
    color-mix(in oklab, var(--isl-scrim) 86%, transparent) 100%);
}
.layout-island a:focus-visible,
.layout-island button:focus-visible {
  outline: 2px solid var(--isl-accent);
  outline-offset: 3px;
  border-radius: var(--isl-r-sm);
}
.isl-tile:focus-visible, .isl-car:focus-visible { outline-offset: 4px; }

/* ═══ Desktop. auto-fit is the whole scaling rule (§26.5): two destinations
       become two wide panels and eight a four-across grid, with no mode, no
       setting and no breakpoint. ═══════════════════════════════════════════ */
@media (min-width: 860px) {
  .layout-island {
    --isl-gutter: 52px;
    --isl-edge: 24px;
    --isl-r-lg: 28px;
    --isl-r-md: 20px;
    --isl-r-sm: 14px;
  }

  .isl-hero { height: 590px; }
  /* 62px, not 48: the booking bar pulls up 34px over the foot of the hero
     on desktop, and the line has to clear it. */
  .isl-hero-txt { left: var(--isl-gutter); right: var(--isl-gutter);
                  top: 40px; bottom: 62px; }
  .isl-kicker { font-size: 12px; letter-spacing: .08em; margin-bottom: 16px; }
  .layout-island h1.isl-h1 {
    font-size: clamp(40px, 4.4vw, 62px);
    letter-spacing: -.045em;
    line-height: .9;
    margin-bottom: 16px;
    /* At 126px with -.045em tracking, a capital's left sidebearing reads as an
       indent against the mono kicker sitting above it. Optical, not metric --
       the class of correction that separates hand-set from CSS-set. */
    margin-left: -.04em;
  }
  .isl-promise { font-size: 18px; max-width: 42ch; margin-bottom: 16px; }

  .isl-book {
    margin: -34px var(--isl-gutter) 0;
    border-radius: var(--isl-r-md);
    padding: 10px;
    display: grid;
    grid-template-columns: 1.9fr 1.5fr 1.1fr auto;
    align-items: center;
    box-shadow: 0 20px 44px -22px rgba(60, 40, 25, .2);
  }
  /* A fifth column while the destination list shows. The destination needs
     the least room (an island's name); the dates the most: at 1366px the
     date cell holds "Click your arrival, then your departure" (269px of
     text in a 305px box, measured 2026-10-04, Chromium) and each time box
     still holds "Select time…". */
  .isl-book.has-dest { grid-template-columns: .6fr 1.35fr 1.65fr 1.4fr auto; }
  /* Spans the whole card, below every field and the button. */
  .isl-terms {
    grid-column: 1 / -1;
    margin: 10px -10px -10px;
    padding: 14px 18px;
    gap: 0 26px;
    font-size: 13.5px;
  }
  .isl-book .isl-fld { padding: 12px 18px; border-bottom: 0; border-right: 1px solid var(--isl-line); }
  /* Not the phone's 12px: in this four-column grid the label cells are
     80-195px wide between 1024 and 1280, and at 12px -- at any tracking --
     PICK-UP LOCATION and PICK-UP TIME wrap where they held one line at 9px.
     10.5px with .02em is the largest size measured (2026-09-10, Chromium)
     that keeps every English label on the lines it had before, and
     PICK-UP DATE - RETURN DATE on one line from 1024px up. Below 1024 the
     bar wrapped already at 9px. */
  /* Sentence-case Inter 600, no tracking with the caps gone (owner
     2026-10-06 10:34). 12px below 1280: the cells are the ones measured
     above, and at 13px "Pick-up time" broke into three lines at 1024
     where the mono took two. */
  .isl-book .isl-fld > span:first-child { font-size: 12px; letter-spacing: 0; }
  /* From 1280px the label is 13px and the columns follow what Inter needs:
     "Pick-up time" on one line in its half of the times, "Same as pick-up"
     and the dates placeholder unclipped at 16px (measured 2026-10-06, Edge). */
  @media (min-width: 1280px) {
    .isl-book { grid-template-columns: 1.8fr 1.6fr 1.25fr auto; }
    .isl-book .isl-fld > span:first-child { font-size: 13px; }
  }
  /* Below 1280 one row clipped the place names ("Harbour Desk" needed 115px
     in 109px at 1024, before the font change too). Two rows instead (owner
     2026-10-06 11:46): places and dates, then times and the button. */
  @media (max-width: 1279.98px) {
    .isl-book, .isl-book.has-dest { grid-template-columns: 1fr 1fr; }
    .isl-book .isl-fld > span:first-child { font-size: 13px; }
    .isl-book > .isl-locs { border-bottom: 1px solid var(--isl-line); }
    .isl-book > .isl-fld[for="islDates"] { border-right: 0; border-bottom: 1px solid var(--isl-line); }
    .isl-book .isl-go { margin: 10px 0 0 10px; }
  }
  .isl-book .isl-fld input,
  .isl-book .isl-fld select { font-size: 16px; margin-top: 3px; }
  .isl-times { border-right: 0; }
  .isl-locs { border-bottom: 0; }
  .isl-times .isl-fld:last-child { border-right: 0; }
  .isl-go { width: auto; border-radius: var(--isl-r-sm); padding: 16px 30px; margin: 0 0 0 10px; font-size: 16px; }

  .isl-sect { padding: 40px var(--isl-gutter) 0; margin-top: 40px; }
  .isl-sect-h { margin-bottom: 24px; }
  .layout-island .isl-sect-h h2 { font-size: 38px; font-weight: 200; letter-spacing: -.035em; }
  .isl-sect-h a { font-size: 16px; }
  .isl-sect-sub { margin: -12px 0 0; font-size: 15px; max-width: 58ch; }

  .isl-reel {
    display: grid;
    /* Capped at four rather than auto-fit. auto-fit laid every model out in a
       single row at 1920px, so the fleet became countable by looking at it --
       the layout leaking the number the copy is careful never to state
       (section 26.2). Four across, wrapping, reads as a selection continuing. */
    /* One card per GROUP, not per model, so the row is short enough to hold
       them all: a fixed four columns put the fifth group alone on a second
       row, which reads as a mistake rather than a selection. auto-fit tops out
       at five tracks at 1440 and stretches to fill when there are fewer.
       ponytail: a sixth group would orphan again -- revisit the column rule
       then, not before. */
    grid-template-columns: repeat(auto-fit, minmax(214px, 1fr));
    gap: 18px;
    padding: 0 var(--isl-gutter);
    overflow: visible;
  }
  .isl-car { flex: none; }
  .isl-car .im { height: 150px; }
  .isl-car .bd { padding: 18px 20px 20px; }
  .isl-car .nm { font-size: 19px; letter-spacing: -.02em; }
  .isl-car .mt { font-size: 13.5px; margin-top: 3px; }
  .isl-car .nopr { font-size: 14px; margin-top: 14px; }
  .isl-car .pr { font-size: 19px; margin-top: 13px; }
  .isl-car .pr .pd { font-size: 13px; }
  .isl-car .dsc { margin-top: 12px; padding-top: 12px; }
  .isl-car .dsc .rule { font-size: 10.5px; }
  .isl-car .dsc .then { font-size: 14px; }
  .isl-car .dsc .then .pd { font-size: 12px; }
  .layout-island .fleet-months { margin-bottom: 18px; }
  .layout-island .fleet-month-labels { font-size: 11px; }

  /* No cap and no centring: every other section on this page runs to the
     gutter, so a 900px cap with no auto margins left the table and its
     hairlines stopping dead two thirds across a wide screen, with the rest
     of the row empty. The rules are what make it read as one object, and a
     rule that stops short reads as a mistake. Measure is kept on the cells
     that hold prose, not on the block. */
  .isl-cover { padding: 0 var(--isl-gutter); }
  /* Four columns with the room for it: the level, what it does, your share,
     and where you get it. Stacked on a phone by the base rule above; a real
     table here, because that is the shape the comparison actually is. */
  .isl-cover .row {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.55fr) 14ch 12ch;
    grid-template-areas: "nm ds ex pd";
    align-items: baseline;
    gap: 24px;
    padding: 18px 0;
  }
  .isl-cover .nm { font-size: 18px; }
  .isl-cover .ds { font-size: 14px; max-width: none; }
  .isl-cover .ex { text-align: right; font-size: 12px; margin-top: 0; }
  .isl-cover .pd { font-size: 18px; }
  .isl-cover .note { font-size: 15px; margin-top: 22px; }

  .isl-tiles {
    grid-template-columns: repeat(auto-fit, minmax(266px, 1fr));
    gap: 18px;
    padding: 0 var(--isl-gutter);
  }
  .isl-tiles.is-two { grid-template-columns: repeat(auto-fit, minmax(266px, 1fr)); }
  .isl-tile { height: 210px; }
  /* Two destinations at 1920px became ~900x330 letterboxes holding a 38px name
     in a field of gradient. Capped, and centred against the gutter. */
  .isl-tiles.is-two { max-width: 1180px; margin: 0 auto; }
  .isl-tiles.is-two .isl-tile { height: 330px; }
  .isl-tile .tx { left: 20px; right: 20px; bottom: 18px; }
  .isl-tile .n { font-size: 26px; font-weight: 200; letter-spacing: -.03em; }
  .isl-tiles.is-two .isl-tile .n { font-size: 38px; }
  .isl-tile .c { font-size: 12px; letter-spacing: .09em; margin-top: 8px; }

  .isl-feature { margin: 0 var(--isl-gutter); grid-template-columns: 140px 1fr; gap: 20px; }
  .isl-feature .ph { height: 72px; }
  .isl-feature .bd { display: flex; align-items: baseline; gap: 18px; flex-wrap: wrap; }
  .isl-feature .bd p { margin: 0; flex: 1; }
  .isl-feature .bd .go { margin-right: 12px; }

  .isl-steps {
    grid-template-columns: repeat(3, 1fr);
    gap: 40px;
    padding: 0 var(--isl-gutter);
  }
  .isl-steps .n { font-size: 11px; margin-bottom: 14px; }
  .isl-steps h3 { font-size: 23px; margin-bottom: 10px; }
  .isl-steps p { font-size: 16.5px; }

  /* Same grid as `.isl-cover-notes` directly above: three equal columns,
     gutter to gutter, same gap. A 1180px cap here left the right third of a
     wide monitor empty under a full-width table. */
  .isl-about {
    padding: 0 var(--isl-gutter);
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 40px;
    align-items: start;
  }
  .isl-about .col { max-width: none; }
  .isl-about .lead { font-size: 21px; line-height: 1.38; letter-spacing: -.015em; }
  .isl-about p { font-size: 16px; margin-bottom: 16px; }

  .isl-desk {
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 40px;
    padding: 0 var(--isl-gutter);
    max-width: 1180px;
  }
  .isl-desk p { font-size: 18px; }

  /* The accordion runs the full width -- a question with its chevron pinned
     to the far right IS the counterweight, so this one never needed a cap. The
     answer keeps a reading measure inside it. */
  .isl-q { padding: 0 var(--isl-gutter); max-width: none; }
  .isl-q summary { font-size: 19px; padding: 22px 40px 22px 0; }
  .isl-q details p { font-size: 16.5px; margin-bottom: 24px; max-width: 62ch; }

  /* Two columns of three at desktop width. Six single-line clauses stacked
     down a 1160px page is a lot of vertical nothing beside each one; in two
     columns the block reads as a single object. */
  .isl-know { grid-template-columns: repeat(4, 1fr); gap: 16px; padding: 0 var(--isl-gutter); }
  .isl-know .card { padding: 24px; }

  /* What a customer said, and what we say. One row, one hairline across the
     whole page, and neither half alone in the dark. */
  .isl-close {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 64px;
    margin-top: 40px;
    padding: 40px var(--isl-gutter) 88px;
    border-top: 1px solid var(--isl-line);
    align-items: start;
  }
  .isl-review { margin: 0; padding: 0; border-top: 0; }
  .isl-review blockquote { font-size: 30px; letter-spacing: -.03em; max-width: 22ch; }
  .isl-review figcaption { margin-top: 22px; font-size: 15px; }
  .isl-claim { margin: 0; padding: 0; border-top: 0; }
  .isl-claim p { font-size: 30px; letter-spacing: -.03em; line-height: 1.3; max-width: 22ch; }
}

/* Wide screens. The four columns hold their proportions to about 1200px and
   then stop working: `ds` is the only cell that wraps, so every extra pixel
   went into it and the description ran past any readable measure while the two
   figures floated in the middle of the row. Fixed measures on the pair that
   carry words, the slack in the third column, and the figures land on the right
   edge under a hairline that now runs the whole width. */
@media (min-width: 1160px) {
  .isl-cover .row {
    /* `max-content` on the two figure columns, not a ch guess: "YOUR SHARE UP
       TO AC 800" is mono, uppercase and wide-tracked, and a fixed track
       narrower than it broke the line into four at 1280. Sized to the longest
       line, they never wrap and both land on the right edge. */
    grid-template-columns: minmax(0, 26ch) minmax(0, 1fr) max-content max-content;
    gap: 40px;
  }
  /* The description cell is wide now; its TEXT still keeps a measure. */
  .isl-cover .ds { max-width: 60ch; }
  /* The three closing paragraphs, side by side instead of a left-hand column
     with two thirds of the row empty beneath a full-width table. Same reading
     order across as down. */
  .isl-cover-notes {
    margin-top: 22px;
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 40px;
    align-items: start;
  }
  .isl-cover-notes .note { margin-top: 0; max-width: none; }
  /* `margin-top` too, not just the rule and its padding: the base warn rule
     is `.isl-cover .note.warn`, one class more specific than
     `.isl-cover-notes .note`, so its 12px survived and dropped the middle
     column a step below its neighbours. */
  .isl-cover-notes .note.warn { margin-top: 0; padding-top: 0; border-top: 0; }
}

@media (prefers-reduced-motion: reduce) {
  .layout-island *,
  .layout-island *::before,
  .layout-island *::after { animation: none !important; transition: none !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ABOUT — `about_island.html`, this layout's own version of the page.

   Appended here rather than given its own file on purpose: base.html already
   loads this stylesheet on every page of this layout and on no page of any
   other, so a second file would be a second request buying nothing. The
   Scoped `.layout-island` and no further. It was `.layout-island.page-about`
   until the destination page reused `.isla-art` and `.isla-cta` and rendered
   them unstyled: the `.isla-` names are only ever written by this layout's own
   hand-designed pages, so the class name IS the scope and the page half was
   doing nothing but excluding the page that wanted them. Isolation is unharmed
   -- no other deployment downloads this file at all.

   A third body class was the first attempt at scoping and broke
   test_layout_site_wide.py's assertion that the layout class JOINS the page
   class rather than displacing it. The test was right; the class was redundant.

   Register, set by the owner: serious, high-quality SERVICE — not premium
   cars. So this page borrows the homepage's type and colour and none of its
   romance. No hero photograph, no drift animation, no gradient. The only
   saturated element is still the one button, which is the rule the homepage
   set and this page does not get to break.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── The opening ────────────────────────────────────────────────────────── */
.layout-island main { padding-bottom: 56px; }

.layout-island .isla-open { padding: 34px var(--isl-gutter) 0; }
/* Eyebrow: Inter 600 caps at .08em (owner 2026-10-06 10:34). */
.layout-island .isla-open .k {
  font-family: var(--isl-sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink-3);
  margin: 0 0 18px;
}
/* Weight 200 is the layout's load-bearing value, not taste (see the file
   header). It is restated here because inner-pages.css sets h1 at 700 and
   loads before this file. */
.layout-island .isla-open h1 {
  font-family: inherit;
  font-size: 34px;
  font-weight: 200;
  line-height: 1.06;
  letter-spacing: -.04em;
  color: var(--isl-ink);
  margin: 0 0 18px;
  max-width: 15ch;
  text-wrap: balance;
}
.layout-island .isla-open .lead {
  margin: 0;
  max-width: 46ch;
  font-size: 17px;
  font-weight: 300;
  line-height: 1.5;
  color: var(--isl-ink);
  letter-spacing: -.01em;
  text-wrap: pretty;
}

/* ── The fact row ────────────────────────────────────────────────────────
   A specification, not a marketing triad: hairline, mono label, statement,
   qualifier. No icon and no box. The shared page's `.icon-card` is a rounded
   panel with a decorative glyph, which is the block this design rejected on
   the homepage for reading as every company on the internet — the distance
   between the two is the entire point of this file. */
.layout-island .isla-facts {
  display: grid;
  gap: 0;
  padding: 0 var(--isl-gutter);
  margin-top: 34px;
}
.layout-island .isla-facts .f {
  border-top: 1px solid var(--isl-line);
  padding: 16px 0 18px;
}
.layout-island .isla-facts .f:last-child { border-bottom: 1px solid var(--isl-line); }
/* Eyebrow: Inter 600 caps at .08em (owner 2026-10-06 10:34). */
.layout-island .isla-facts .k {
  font-family: var(--isl-sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink-3);
  margin: 0 0 9px;
}
.layout-island .isla-facts .s {
  margin: 0 0 6px;
  font-size: 16px;
  font-weight: 400;
  line-height: 1.35;
  letter-spacing: -.015em;
  color: var(--isl-ink);
  text-wrap: pretty;
}
.layout-island .isla-facts p:last-child {
  margin: 0;
  font-size: 14px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--isl-dim);
  text-wrap: pretty;
}

/* ── The article ─────────────────────────────────────────────────────────
   One <section> per movement, hairline above each, heading and prose splitting
   into two columns on desktop — the same rhythm as the homepage's About block,
   so the two pages read as one design rather than two. */
.layout-island .isla-art { padding: 0 var(--isl-gutter); }
.layout-island .isla-art section {
  border-top: 1px solid var(--isl-line);
  margin-top: 26px;
  padding-top: 24px;
}
.layout-island .isla-art h2 {
  font-family: inherit;
  font-size: 21px;
  font-weight: 300;
  letter-spacing: -.025em;
  line-height: 1.2;
  color: var(--isl-ink);
  margin: 0 0 14px;
  text-wrap: balance;
}
.layout-island .isla-art p {
  margin: 0 0 15px;
  font-size: 15.5px;
  font-weight: 300;
  line-height: 1.62;
  color: var(--isl-dim);
  text-wrap: pretty;
}
.layout-island .isla-art p:last-child { margin-bottom: 0; }
/* The desk reuses the homepage's own block wholesale, so it only needs its
   top margin cancelled inside an article section. */
.layout-island .isla-desk-wrap .isl-desk { padding: 0; }

/* ── The way out ─────────────────────────────────────────────────────────── */
.layout-island .isla-cta {
  padding: 44px var(--isl-gutter) 0;
  margin-top: 30px;
  border-top: 1px solid var(--isl-line);
}
.layout-island .isla-cta h2 {
  font-family: inherit;
  font-size: 26px;
  font-weight: 200;
  letter-spacing: -.03em;
  line-height: 1.12;
  color: var(--isl-ink);
  margin: 0 0 12px;
  max-width: 18ch;
  text-wrap: balance;
}
.layout-island .isla-cta p {
  margin: 0 0 22px;
  max-width: 46ch;
  font-size: 15px;
  font-weight: 300;
  line-height: 1.6;
  color: var(--isl-dim);
  text-wrap: pretty;
}
.layout-island .isla-cta .isl-go { max-width: 320px; margin: 0; }

@media (min-width: 900px) {
  .layout-island .isla-open { padding-top: 64px; }
  .layout-island .isla-open h1 { font-size: 68px; letter-spacing: -.045em; max-width: 13ch; }
  .layout-island .isla-open .lead { font-size: 20px; max-width: 52ch; }

  /* Two across here and four further up, both explicit. `auto-fit` was the
     obvious answer and it is the wrong one: at this width it fits three and
     leaves the fourth fact alone on a second row, which reads as a mistake
     rather than as a grid. Four facts wrap cleanly only into 2 or 4. */
  .layout-island .isla-facts {
    grid-template-columns: 1fr 1fr;
    column-gap: 40px;
    margin-top: 56px;
  }
  .layout-island .isla-facts .f { padding: 18px 0 0; min-height: 132px; }
  .layout-island .isla-facts .f:last-child { border-bottom: 0; }

  .layout-island .isla-art section {
    display: grid;
    grid-template-columns: 1fr 1.15fr;
    gap: 56px;
    align-items: start;
    margin-top: 40px;
    padding-top: 40px;
  }
  .layout-island .isla-art h2 { font-size: 30px; font-weight: 200; letter-spacing: -.035em; margin: 0; max-width: 15ch; }
  .layout-island .isla-art p { font-size: 17px; margin-bottom: 18px; max-width: 56ch; }
  .layout-island .isla-desk-wrap .isl-desk { grid-template-columns: 1fr 1fr; gap: 32px; }

  .layout-island .isla-cta { padding-top: 72px; margin-top: 48px; }
  .layout-island .isla-cta h2 { font-size: 44px; }
}

@media (min-width: 1160px) {
  .layout-island .isla-facts { grid-template-columns: repeat(4, 1fr); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   A DESTINATION — `destination_island.html`, one template for every island.

   Scoped `.layout-island.page-destination`, so it needs no new body class and
   cannot reach the homepage or About. Nearly everything is borrowed: the
   booking bar, the terms row, the article rhythm, the desk block and the
   questions are all the classes those two pages already define. What is left
   below is only what a destination page has that neither of them does.
   ═══════════════════════════════════════════════════════════════════════════ */

.layout-island.page-destination main { padding-bottom: 56px; }

/* ── The search, answered ─────────────────────────────────────────────────
   Smaller than the homepage's 46px hero and larger than About's opening. The
   H1 here is a full sentence carrying a place name rather than one word, and
   at hero size a long one wraps to four lines on a phone before the visitor
   has seen a single field. */
.layout-island.page-destination .isld-hero { padding: 30px var(--isl-gutter) 0; }

/* ── The hero photograph ──────────────────────────────────────────────────
   Deliberately a BAND, not the homepage's full-height hero. The two pages have
   to stay distinguishable at a glance -- `/` is the company and its argument,
   `/kos` is the answer to a search -- and giving this one the same towering
   photo treatment would undo exactly the separation the metadata just fixed.
   So: shorter, squarer corners at the top of the flow, and the type sits ON it
   rather than under it.

   The scrim is not decoration. Contrast here sits over a photograph chosen by
   whoever writes the page, which may be anything, so legibility cannot be left
   to a colour token -- the gradient guarantees the headline reads whatever is
   underneath. Same reasoning as the homepage hero. */
.layout-island.page-destination .isld-hero.has-photo {
  position: relative;
  margin: 14px var(--isl-edge) 0;
  padding: 0;
  min-height: 300px;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  border-radius: var(--isl-r-lg);
  overflow: hidden;
  background-color: var(--isl-wash-2);
  background-image: var(--isld-photo);
  background-size: cover;
  background-position: center;
  isolation: isolate;
}
.layout-island.page-destination .isld-hero.has-photo::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg,
              color-mix(in srgb, var(--isl-bg) 20%, transparent) 0%,
              color-mix(in srgb, var(--isl-bg) 62%, transparent) 58%,
              color-mix(in srgb, var(--isl-bg) 93%, transparent) 100%);
}
.layout-island.page-destination .isld-hero.has-photo > * { position: relative; }
.layout-island.page-destination .isld-hero.has-photo .k,
.layout-island.page-destination .isld-hero.has-photo h1,
.layout-island.page-destination .isld-hero.has-photo .lead { padding-left: 26px; padding-right: 26px; }
.layout-island.page-destination .isld-hero.has-photo .k { color: color-mix(in srgb, var(--isl-ink) 80%, transparent); padding-top: 26px; }
.layout-island.page-destination .isld-hero.has-photo .lead { color: color-mix(in srgb, var(--isl-ink) 84%, transparent); padding-bottom: 28px; }
/* Eyebrow: Inter 600 caps at .08em (owner 2026-10-06 10:34). */
.layout-island.page-destination .isld-hero .k {
  font-family: var(--isl-sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink-3);
  margin: 0 0 14px;
}
.layout-island.page-destination .isld-hero h1 {
  font-family: inherit;
  font-size: 32px;
  font-weight: 200;
  line-height: 1.08;
  letter-spacing: -.038em;
  color: var(--isl-ink);
  margin: 0 0 16px;
  max-width: 16ch;
  text-wrap: balance;
}
.layout-island.page-destination .isld-hero .lead {
  margin: 0;
  max-width: 48ch;
  font-size: 16.5px;
  font-weight: 300;
  line-height: 1.55;
  color: var(--isl-dim);
  text-wrap: pretty;
}

/* ── The bar ──────────────────────────────────────────────────────────────
   `.isl-book` is the homepage's card and is absolutely positioned over its
   hero photograph there. There is no photograph here, so it returns to the
   flow -- position and offsets reset explicitly rather than relying on the
   homepage rule not to apply, because that rule lives in a file this one is
   appended to and would otherwise win on source order. */
.layout-island.page-destination .isld-book {
  position: static;
  margin: 26px var(--isl-edge) 0;
  inset: auto;
  width: auto;
}

/* ── Where you collect ────────────────────────────────────────────────────── */
.layout-island.page-destination .isld-desks { padding: 0; }

/* ── The way on ───────────────────────────────────────────────────────────── */
.layout-island.page-destination .isld-links {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  margin: 22px 0 0;
}
.layout-island.page-destination .isld-links a {
  font-size: 14px;
  font-weight: 300;
  color: var(--isl-dim);
  text-decoration: none;
  border-bottom: 1px solid var(--isl-line-2);
  padding-bottom: 2px;
}
.layout-island.page-destination .isld-links a:hover {
  color: var(--isl-accent);
  border-bottom-color: var(--isl-accent);
}

@media (min-width: 900px) {
  .layout-island.page-destination .isld-hero { padding-top: 60px; }
  .layout-island.page-destination .isld-hero.has-photo { padding-top: 0; min-height: 420px; }
  .layout-island.page-destination .isld-hero.has-photo .k { padding-top: 0; }
  .layout-island.page-destination .isld-hero.has-photo .k,
  .layout-island.page-destination .isld-hero.has-photo h1,
  .layout-island.page-destination .isld-hero.has-photo .lead { padding-left: 44px; padding-right: 44px; }
  .layout-island.page-destination .isld-hero.has-photo .lead { padding-bottom: 40px; }
  .layout-island.page-destination .isld-hero h1 { font-size: 60px; letter-spacing: -.045em; max-width: 15ch; }
  .layout-island.page-destination .isld-hero .lead { font-size: 19px; max-width: 56ch; }
  /* No max-width, and no auto-centring: the bar keeps the base rule's
     `var(--isl-edge)` sides so it shares an edge with the hero band
     directly above it, exactly as the homepage's bar shares an edge with
     its own hero. A 900px cap was capping the width without widening the
     fields to suit, so the location selects shrank to 105px and truncated
     to "Select locatio..." on the page search sends the most traffic to.
     Only the top margin changes here; below 900px nothing reads this. */
  .layout-island.page-destination .isld-book { margin-top: 34px; }
  .layout-island.page-destination .isld-desks { grid-template-columns: 1fr 1fr; gap: 32px; }
}

/* The closing row is a two-column pairing of what a customer said and what we
   say. With no testimonial saved there is only one child, and the grid was
   still reserving the empty half -- the claim then sat in a column with a page
   of nothing beside it, which is the exact fault the row was built to fix. */
.layout-island .isl-close:has(> .isl-claim:only-child) {
  display: block;
}

@media (min-width: 900px) {
  .layout-island .isl-close:has(> .isl-claim:only-child) .isl-claim p { max-width: 34ch; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   WHAT A TOKEN COULD NOT REACH

   The remap above fixes every component that asks the palette for its colour,
   which is nearly all of them. What is left is the two cases it cannot touch:
   a stylesheet that is not ours, and a token whose value is right but whose
   ROLE flips under a state class.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── The date picker ──────────────────────────────────────────────────────
   flatpickr's stylesheet comes from a CDN with its colours written as literal
   hex, so it reads no token and the remap slides straight past it. Untouched,
   it opens as a white rectangle over a near-black page -- the single loudest
   thing on the booking screen, and the one element a customer cannot avoid.

   The calendar is rendered into a portal appended to <body>, which is why
   these selectors are scoped to the layout and not to the wizard: at the time
   it opens, the element is not inside the panel at all.

   !important throughout, reluctantly. The CDN file loads after this one in
   booking.html's stylesheet block, so document order hands it every tie. */
.layout-island .flatpickr-calendar {
  background: var(--isl-card) !important;
  border: 1px solid var(--isl-line) !important;
  border-radius: var(--isl-r-md) !important;
  box-shadow: 0 18px 48px rgba(60, 40, 25, .2) !important;
  color: var(--isl-ink) !important;
}
/* The pointer into the input. Both halves: the ::before is the border and the
   ::after the fill, so colouring one leaves a pale wedge behind. */
.layout-island .flatpickr-calendar.arrowTop::before,
.layout-island .flatpickr-calendar.arrowBottom::before { border-bottom-color: var(--isl-line) !important; border-top-color: var(--isl-line) !important; }
.layout-island .flatpickr-calendar.arrowTop::after,
.layout-island .flatpickr-calendar.arrowBottom::after { border-bottom-color: var(--isl-card) !important; border-top-color: var(--isl-card) !important; }

.layout-island .flatpickr-months,
.layout-island .flatpickr-month,
.layout-island .flatpickr-weekdays,
.layout-island .flatpickr-monthDropdown-months { background: transparent !important; color: var(--isl-ink) !important; }
.layout-island .flatpickr-monthDropdown-months option { background: var(--isl-card) !important; color: var(--isl-ink) !important; }
.layout-island .flatpickr-current-month input.cur-year,
.layout-island .flatpickr-current-month .flatpickr-monthDropdown-months { color: var(--isl-ink) !important; }
.layout-island span.flatpickr-weekday { color: var(--isl-ink-3) !important; background: transparent !important; }

/* The month arrows are inline SVG; fill is the only thing that moves them. */
.layout-island .flatpickr-months .flatpickr-prev-month svg,
.layout-island .flatpickr-months .flatpickr-next-month svg { fill: var(--isl-dim) !important; }
.layout-island .flatpickr-months .flatpickr-prev-month:hover svg,
.layout-island .flatpickr-months .flatpickr-next-month:hover svg { fill: var(--isl-accent) !important; }

.layout-island .flatpickr-day { color: var(--isl-ink) !important; border-color: transparent !important; }
.layout-island .flatpickr-day:hover { background: var(--isl-wash) !important; border-color: var(--isl-line-2) !important; }
.layout-island .flatpickr-day.today { border-color: var(--isl-line-2) !important; }
.layout-island .flatpickr-day.selected,
.layout-island .flatpickr-day.startRange,
.layout-island .flatpickr-day.endRange,
.layout-island .flatpickr-day.selected:hover {
  background: var(--isl-accent) !important;
  border-color: var(--isl-accent) !important;
  color: var(--isl-accent-ink) !important;
}
.layout-island .flatpickr-day.inRange { background: var(--isl-wash) !important; border-color: var(--isl-wash) !important; box-shadow: -5px 0 0 var(--isl-wash), 5px 0 0 var(--isl-wash) !important; }
/* A date outside the window is the one thing here that must NOT be readable:
   a greyed day the reader can still make out is a day they will try to click.
   --isl-ink-2 is the disabled mark in this layout's ramp. */
.layout-island .flatpickr-day.flatpickr-disabled,
.layout-island .flatpickr-day.flatpickr-disabled:hover,
.layout-island .flatpickr-day.prevMonthDay,
.layout-island .flatpickr-day.nextMonthDay { color: var(--isl-ink-2) !important; background: transparent !important; }
.layout-island .numInputWrapper span { border-color: var(--isl-line) !important; }
.layout-island .numInputWrapper span::after { border-bottom-color: var(--isl-dim) !important; border-top-color: var(--isl-dim) !important; }
.layout-island .numInputWrapper:hover { background: var(--isl-wash) !important; }

/* ── Where the role flips ─────────────────────────────────────────────────
   --primary is text on every page of this site, and the remap above gives it
   the ink. Four rules in booking.html use it for something else, and the ink
   is wrong in all four -- three of them draw a near-white ring or bar that
   ends up louder than the accent it is sitting next to.

   A token cannot fix this: the value is correct everywhere else it is read.
   Only the call sites are wrong, so only the call sites are restated. */

/* A step already done. The shared rule paints it --primary to --primary-soft,
   which inverts to a white disc; three of those across the top of the page
   out-shout the one that is actually current. Done is context, not emphasis. */
.layout-island.page-booking .wizard-step.completed .wizard-step__num {
  background: var(--isl-wash) !important;
  color: var(--isl-ink) !important;
  border: 1px solid var(--isl-line-2);
  box-shadow: none !important;
}
.layout-island.page-booking .wizard-step.completed + .wizard-step__connector,
.layout-island.page-booking .wizard-step__connector.completed {
  background: var(--isl-line-2) !important;
}

/* Chosen. The accent's whole job on this site is to mark the thing you acted
   on, and these are the only places in the wizard where the customer has. The
   shared rules reach for --primary instead, so the tier you picked was
   outlined in near-white -- the same weight as the two you did not. */
.layout-island.page-booking .insurance-option.selected,
.layout-island.page-booking .extra-item.selected,
.layout-island.page-booking .group-model-tab.active {
  border-color: var(--isl-accent);
  background: var(--isl-wash);
}
.layout-island.page-booking .group-model-tab.active { color: var(--isl-ink); }
.layout-island.page-booking .insurance-option input[type="radio"],
.layout-island.page-booking .extra-item input[type="checkbox"],
.layout-island.page-booking .tc-agree-label input[type="checkbox"] {
  accent-color: var(--isl-accent);
}
.layout-island.page-booking .tc-agree-label a { color: var(--isl-accent); }

/* ═══════════════════════════════════════════════════════════════════════════
   THE DESIGN PASS

   A second designer read the five steps against this layout's own rules and
   came back with twelve findings. Six were correctness -- contrast below the
   floor, a state the customer cannot see, a typeface nobody chose -- and six
   were the layout's own rules not being kept. All twelve are here.

   Every translucent value is written as a mix of a theme token rather than as
   literal channels. That is not style: the twelve values at the top of this
   file are the whole colouring, and an `rgba(217, 162, 162, .18)` would be the
   accent copied out by hand and left behind at the next repaint. Black shadows
   stay literal -- a shadow is an absence of light, not a colour in the scheme.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 1. The placeholder was the browser's, not ours ───────────────────────
   `dd/mm/yyyy` rendered in Chrome's UA grey at 3.39:1 -- under the 4.5 floor,
   on the one field the customer meets first. Nothing in the remap reaches
   `::placeholder`, because it is not a colour the product ever set.
   `--isl-ink-3` is this layout's placeholder token but it is only 3.91:1 on
   the fill below and is not legal here; the dim is 4.90:1. */
.layout-island.page-booking .wizard-panel-body input::placeholder {
  color: var(--isl-dim);
  opacity: 1;   /* Firefox applies .54 of its own otherwise */
}

/* ── 2. An empty select looked exactly like a filled one ──────────────────
   "Select time…" printed in the same ink as a real value, so a half-finished
   form looked finished and the customer had to hunt for what was missing.
   Every placeholder option carries `value=""`, which is what makes this
   reachable at all. */
.layout-island.page-booking .wizard-panel-body select:has(option[value=""]:checked) {
  color: var(--isl-dim);
}

/* ── 3. Three lifts painted in black, on a near-black page ────────────────
   `--primary-rgb` is remapped to black, which is right for a shadow and wrong
   for the three rules that use it as a visible surface. The step buttons had
   no hover at all -- `rgba(0,0,0,.04)` over a dark ground is nothing -- and
   the panel leaned on a 1.23:1 border with an 8% black shadow doing no work. */
.layout-island.page-booking .wizard-step:hover {
  background: color-mix(in srgb, var(--isl-ink) 6%, transparent);
}
.layout-island.page-booking .group-select-card:hover {
  border-color: var(--isl-line-2);
  box-shadow: 0 8px 25px rgba(60, 40, 25, .2);
}
/* Choosing a car no longer moves the customer on, so `selected` is a state
   they sit in until they press Continue — and it has to be legible as one.
   booking.css paints it with `--accent` and `--accent-rgb`, and this theme
   remaps those toward the near-black ground (see the note above `:hover`),
   so that rule drew a black glow on a black page and the chosen card looked
   identical to the other. The island's own accent, at a ring wide enough to
   read as a shape and not only as a colour. */
.layout-island.page-booking .group-select-card.selected {
  border-color: var(--isl-accent);
  background: color-mix(in srgb, var(--isl-accent) 8%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--isl-accent) 45%, transparent),
              0 8px 28px rgba(60, 40, 25, .2);
}
.layout-island.page-booking .wizard-panel.card {
  border-color: var(--isl-line-2) !important;
  box-shadow: 0 18px 48px rgba(60, 40, 25, .2) !important;
}

/* ── 4. The three-level stack crossed itself ──────────────────────────────
   The worst of the twelve, and invisible until measured. The panel is the
   card; the field group inside it was a gradient running from BELOW the panel
   to EXACTLY the input's fill. So at the bottom of every group the input
   dissolved into its own container, and its border was 1.09:1 against that
   fill -- no boundary anywhere near the 3:1 WCAG 1.4.11 asks of a control.
   The two empty name fields at step 4 were near-invisible rectangles.

   Now three flat values and no gradient crossing them: the panel, a group
   recessed below it, a field raised above the group. The border drops from
   2px to 1px deliberately -- `--isl-ink-3` at 2px reads as a chunky outline,
   and it is the only dim on this palette that clears 3:1 (4.44:1 on the
   group, 3.91:1 on the fill). */
.layout-island.page-booking .field-group,
.layout-island.page-booking .rental-details-summary,
.layout-island.page-booking .selected-group-summary,
.layout-island.page-booking .booking-review-summary,
.layout-island.page-booking .step3-cost-sidebar .cost-summary {
  background: var(--isl-wash-2);
  border-color: var(--isl-line);
}
.layout-island.page-booking .wizard-panel-body input:not([type="checkbox"]):not([type="radio"]),
.layout-island.page-booking .wizard-panel-body select,
.layout-island.page-booking #preferredModel {
  background: var(--isl-wash) !important;
  border: 1px solid var(--isl-ink-3) !important;
}

/* ── 5. Every button in the wizard was rendering in Arial ─────────────────
   A <button> does not inherit the body face and no rule ever set one, so
   "Check Availability", "Continue" and "Back" were the only Arial anywhere on
   this site. 600 rather than the shared 700: beside a 200 display face, 700
   reads as shouting. */
.layout-island.page-booking .wizard-actions .btn-accent,
.layout-island.page-booking .wizard-actions .btn-ghost,
.layout-island.page-booking button.btn {
  /* Inter since 2026-10-06; base.css now gives every control the page face. */
  font-family: var(--isl-sans);
  font-weight: 600;
}

/* ── 6. The system emoji were the loudest pixels in the flow ──────────────
   Nobody chose these colours -- they are the operating system's. A blue
   building glyph at step 1 was more saturated than the button above it, on a
   page whose one rule is that the accent is the only saturated thing.
   Desaturated rather than removed: they still carry their meaning as shapes.
   The glyph inside a location <option> is TEXT and no stylesheet can reach it;
   that one is handled by `plain_icons` on the layout. */
.layout-island.page-booking #availabilityBanner span:first-child,
.layout-island.page-booking .photo-placeholder,
.layout-island.page-booking .group-model-card__photo-placeholder {
  filter: grayscale(1) brightness(1.6) opacity(.65);
}
/* `.cd-icon` is dead CSS -- booking.html declares it and uses it nowhere. The
   glyph it was meant for lives INSIDE `.cd-title`, run together with the text,
   where no selector can reach it on its own. Greyscale alone, then, and no
   brightness or opacity: those would dim the title with it, and the title is
   already `--isl-ink`, which is near-neutral and comes through a greyscale
   pass essentially unchanged. The emoji does not. */
.layout-island.page-booking .cd-title { filter: grayscale(1); }

/* ── 7. The accent was on eleven to thirteen things per step ──────────────
   The rule at the top of this file is that the accent appears on ONE element:
   the thing you are meant to press. The wizard was reaching for it for every
   eyebrow, every field-group title, a divider bar and a partner rule -- none
   of which is something the customer acts on.

   Demoted to the dim. What keeps the accent is what the customer did or must
   do next: the current step, the tier they chose, and the button. */
.layout-island.page-booking .wizard-panel-header .eyebrow,
.layout-island.page-booking .field-group__title {
  color: var(--isl-dim);
}
.layout-island.page-booking .wizard-panel-header::after {
  background: linear-gradient(90deg, transparent, var(--isl-line-2), transparent);
}
.layout-island.page-booking .partner-disclosure {
  border-left-color: var(--isl-line-2);
}
/* `company_logo` is ONE field serving a near-black website and white paper, and
   the design record settled that fight in favour of paper: ship the mark black
   so invoices, vouchers and emails are right, and invert it here. Scoped to our
   OWN block -- a partner's mark is his own artwork and inverting it would hand
   the customer a colour-negative of somebody else's brand. */
.layout-island.page-booking .partner-disclosure--own .partner-disclosure__logo {
  filter: invert(1);
}
/* A PARTNER'S MARK GETS A PALE PLATE, measured rather than judged by eye.

   The comment above is right that a partner's artwork must not be inverted —
   it is his, and inverting mangles it. But leaving it untreated on this theme
   left it at **1.66:1** against `--surface-alt`, below the 3:1 floor for a
   graphic being distinguishable at all (WCAG 1.4.11): the first file on
   record averages dark navy, rgb(35,63,102), because logos are drawn for
   white letterheads. It was being served, and rendered, and could not be
   seen. On the plate it measures 9.02:1 and keeps every one of its own
   colours.

   Owner 2026-09-08: "it's better to use the logo we have for the supplier for
   their cars too" — it always was the same field, `Supplier.logo`, on both
   the destination page and this card. What was missing was it being legible
   on either. Same treatment as `.isld-partners li`, so the two surfaces stay
   in step. */
.layout-island.page-booking .partner-disclosure__logo {
  background: var(--isl-ink);
  border-radius: 6px;
  padding: 4px 6px;
  box-sizing: border-box;
}
/* Two identical rose pills on one screen, and this one does nothing here --
   the reader is already booking. Outlined so it stays available without
   competing with the button that actually advances the form. */
.layout-island.page-booking .nav-book-btn {
  background: transparent;
  color: var(--isl-ink);
  border: 1px solid var(--isl-line-2);
  box-shadow: none;
}

/* ── 8. Eyebrows and labels were in the display face ──────────────────────
   Ten places elsewhere in this file set the mono for exactly this role -- a
   small uppercase label with wide tracking. The wizard set none, so every
   eyebrow and form label was Outfit 700 uppercase, which is the one weight
   this design does not use. The panel heading was 300 where the display face
   is 200. */
/* Since 2026-10-06 (owner 10:34, "lets apply 1") the mono is gone: the
   step eyebrow stays a cap line in Inter 600; field labels and section
   titles are Inter 600 at 13px in sentence case with no tracking. The
   generic `label` rule in booking.css also put the cover and extra names
   and the terms tick in capitals; the case reset reaches those too. */
.layout-island.page-booking .wizard-panel-header .eyebrow {
  font-family: var(--isl-sans);
  font-weight: 600;
  letter-spacing: .08em;
}
.layout-island.page-booking .field-group__title,
.layout-island.page-booking .wizard-panel-body label,
.layout-island.page-booking .section-label,
.layout-island.page-booking .rds-label,
.layout-island.page-booking .cost-summary__title,
.layout-island.page-booking .pref-label {
  font-family: var(--isl-sans);
  letter-spacing: 0;
  text-transform: none;
}
.layout-island.page-booking .field-group__title,
.layout-island.page-booking .wizard-panel-body label[for],
.layout-island.page-booking .section-label,
.layout-island.page-booking .rds-label,
.layout-island.page-booking .cost-summary__title,
.layout-island.page-booking .pref-label {
  font-size: 13px !important;
  font-weight: 600 !important;
}
/* A review row's label on a phone: in Inter "Pick-up" broke at its hyphen
   beside a long value, and in the narrower face it had sat flush against
   the value with no gap (owner 2026-10-06 10:34). The value wraps instead. */
.layout-island.page-booking .review-row { gap: 12px; }
.layout-island.page-booking .review-row__label { white-space: nowrap; }
/* Figures that are read in columns or against each other -- prices,
   totals, dates, times -- take equal-width digits so they line up
   (owner 2026-10-06 10:34). Inter's default digits are proportional.
   Only on boxes that hold figures: Inter's tabular set also widens the
   hyphen, so "Same as pick-up" in a place list read "pick - up". */
.layout-island #pickupTime,
.layout-island #returnTime,
.layout-island .flatpickr-input,
.layout-island #driverAge,
.layout-island .time-sheet,
.layout-island .flatpickr-calendar,
.layout-island .group-select-card__price,
.layout-island .cost-table td,
.layout-island .extra-item__price,
.layout-island .insurance-badge,
.layout-island .isl-cover .pd {
  font-variant-numeric: tabular-nums;
}
.layout-island.page-booking .wizard-panel-header h2 { font-weight: 200; }

/* ── 9. A finished step read as loudly as the current one ─────────────────
   The disc was already quietened further up this file. The LABEL beside it
   was still full ink, identical to the active step, so all four read the same
   and only the disc said where you were. */
.layout-island.page-booking .wizard-step.completed .wizard-step__label {
  color: var(--isl-dim);
}

/* ── 10. The chosen tier was marked by a hairline ─────────────────────────
   A 1px rose edge and a background shift of 1.09:1 -- everything else about
   the selected card was identical to the two below it. This is the most
   consequential choice on the page and it has to be unmistakable at a glance,
   not on inspection. */
.layout-island.page-booking .insurance-option.selected {
  border-width: 2px;
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--isl-accent) 18%, transparent),
              0 2px 14px color-mix(in srgb, var(--isl-accent) 12%, transparent);
}

/* ── 11. Five coloured chips in one column ────────────────────────────────
   Three amber and two green under the tier names, and the amber is the
   brightest coloured text on this whole site -- brighter than the accent -- so
   "Excess: €800.00" was out-shouting the Continue button.

   A price is a fact, not a state, so it loses its colour entirely. The excess
   keeps one, because it is the number that costs money. Five chips become
   three and only one of them is coloured.

   Zero excess is the exception: it is what the top tier is SOLD for, and it
   was printing in the same warning colour as an 800 euro liability. The
   modifier comes from booking.js and exists nowhere else. */
.layout-island.page-booking .badge-price {
  background: var(--isl-wash);
  color: var(--isl-ink);
}
.layout-island.page-booking .badge-excess {
  background: transparent;
  color: var(--isl-warn);
  box-shadow: inset 0 0 0 1px var(--isl-warn-line);
}
.layout-island.page-booking .badge-excess--zero {
  color: var(--isl-ok);
  box-shadow: inset 0 0 0 1px var(--isl-ok-line);
}

/* ── 12. One category rendered as a half-width card beside nothing ────────
   The grid is two columns because most deployments have several categories.
   With one, the card sat in the left half and the right half was empty. */
.layout-island.page-booking #carGroupsList:has(> :only-child) {
  grid-template-columns: minmax(0, 440px);
  justify-content: center;
}

/* ── The step-1 box on the dark card (where-box.js; base rules in booking.css,
   which reach this palette through the remapped shared tokens). Its labels
   take the mono like every other label in the wizard, and the bar's one
   list colours its group headings like its options. ── */
.layout-island.page-booking .where-lab,
.layout-island.page-booking .where-grp {
  font-family: var(--isl-sans);
  font-weight: 600;
  color: var(--isl-dim);
}
/* The step-1 box's field labels read as the other field labels: sentence
   case, 13px (owner 2026-10-06 10:34). */
.layout-island.page-booking .where-lab {
  font-size: 13px;
  letter-spacing: 0;
  text-transform: none;
}
.layout-island.page-booking .where-grp { letter-spacing: .08em; }
.layout-island.page-booking .where-chosen,
.layout-island.page-booking .where-list,
.layout-island.page-booking .where-suggest { background: var(--isl-wash); border-color: var(--isl-ink-3); }
.layout-island.page-booking .where-ic { background: var(--isl-wash-2); }
.layout-island .isl-fld select optgroup { background: var(--isl-card); color: var(--isl-dim); }

/* ═══════════════════════════════════════════════════════════════════════════
   A DESTINATION PAGE'S OWN FURNITURE — the board, the partners, the rhythm.

   Owner 2026-09-08: "I do not like the layout, this is too linear... do not
   change colouring... show me some pizzazz."

   HE WAS RIGHT ABOUT THE CAUSE. The page had ONE component — `.isla-art`,
   heading left and prose right — used four times in a row. The homepage has
   six shapes and alternates them, which is why it reads as a designed page
   and this read as a document. Nothing below invents a second design
   language: the three-column block and the numbered steps are the homepage's
   own, and only the board and the partner row are new.

   NOT ONE COLOUR VALUE IS ADDED. Every rule here resolves to the twelve
   tokens at the top of this file, so the two alternative colourings still
   swap the whole site in twelve lines. The accent stays on ONE element — the
   button — which is this file's oldest rule and the one a "pizzazz" brief is
   most likely to break. The board earns its emphasis from SIZE, WEIGHT and
   the mono face instead, which costs the accent nothing.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── The board: this page's signature ───────────────────────────────────────
   A departures board. The artefact is from the subject's own world — the
   ferry gate, the airport hall, the sign at the junction — and it carries the
   argument no other block makes: the far end of the island is forty minutes
   away, so a car is worth having. Every place name is also a search someone
   types. */
.layout-island .isld-reach {
  padding: 46px var(--isl-gutter) 6px;
  display: grid;
  gap: 26px;
  grid-template-columns: minmax(0, 22ch) minmax(0, 1fr);
  align-items: start;
}
.layout-island .isld-reach .hd h2 {
  font-family: inherit;
  font-size: clamp(26px, 4.4vw, 40px);
  font-weight: 200;
  letter-spacing: -.035em;
  line-height: 1.02;
  color: var(--isl-ink);
  margin: 0 0 12px;
  text-wrap: balance;
}
.layout-island .isld-reach .hd p {
  margin: 0;
  color: var(--isl-dim);
  font-size: 14px;
  line-height: 1.62;
  max-width: 34ch;
}
.layout-island .isld-reach .board {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--isl-line);
}
.layout-island .isld-reach .row {
  display: grid;
  grid-template-columns: minmax(0, auto) minmax(0, 1fr);
  align-items: baseline;
  gap: 4px 14px;
  padding: 13px 0;
  border-bottom: 1px solid var(--isl-line);
}
.layout-island .isld-reach .pl {
  font-size: clamp(17px, 2.1vw, 21px);
  font-weight: 300;
  letter-spacing: -.02em;
  color: var(--isl-ink);
}
/* The note is the reason to go, and it is the quietest thing in the row: the
   place and the number are what the eye is scanning for. */
.layout-island .isld-reach .nt {
  font-size: 12.5px;
  color: var(--isl-dim);
  letter-spacing: .005em;
}
/* The mono face carries the FACTS, which is the only place numbers survived.
   It is already loaded for the layout, so this costs no font request. Each
   fact is a slab rather than a line of prose: three unrelated statements read
   as three, and a reader scanning takes all three in one pass. */
.layout-island .isld-reach .facts {
  list-style: none;
  margin: 20px 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.layout-island .isld-reach .facts li {
  font-family: var(--isl-sans);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--isl-ink);
  background: var(--isl-wash-2);
  border: 1px solid var(--isl-line);
  border-radius: 999px;
  padding: 8px 14px;
  white-space: nowrap;
}
.layout-island .isld-reach .ft {
  grid-column: 2;
  max-width: 68ch;
  margin: 14px 0 0;
  font-size: 12.5px;
  color: var(--isl-dim);
}

/* NO SCROLL REVEAL. There was one — rows rising on a `view()` timeline — and
   it is cut rather than tuned. It left rows four onward sitting at zero
   opacity in the owner's own browser: a board showing three of its seven
   lines reads as a broken page, not as motion. A device I cannot verify
   across every browser has no business hiding the content it decorates, and
   this board earns its emphasis from size, weight and the mono face without
   moving at all. Chanel's rule: take one thing off. */

/* ── The partners ──────────────────────────────────────────────────────────
   Quiet on purpose. The board is where this page spends its boldness, and a
   second loud element would leave it with none. Marks sit at rest slightly
   held back and come up to full on hover, so the row reads as one texture
   until the eye stops on one. */
.layout-island .isld-partners {
  padding: 40px var(--isl-gutter) 8px;
  border-top: 1px solid var(--isl-line);
  margin-top: 40px;
}
.layout-island .isld-partners h2 {
  font-family: var(--isl-sans);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--isl-dim);
  margin: 0 0 20px;
}
.layout-island .isld-partners ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px 34px;
}
.layout-island .isld-partners li {
  display: flex;
  align-items: center;
  min-height: 44px;
}
/* EACH MARK SITS ON A PALE PLATE, and this is a correctness fix before it is
   a style choice.

   A partner's logo is drawn for their own white letterhead. Measured, the
   first file on record averages rgb(35,63,102) — dark navy — against a ground
   of #0E1317: it rendered perfectly and could not be seen. Every rental
   company that sends artwork will send that kind of file, so a dark site
   either treats them or shows an empty row that nobody notices for months.

   FLATTENING THEM TO THE INK COLOUR WAS TRIED FIRST and is wrong here. It
   works only on a transparent file; this one carries an opaque background, so
   `brightness(0) invert(1)` painted the whole rectangle and the strip showed a
   solid grey slab where a logo should be. A plate is the treatment that
   survives both kinds of file, and it keeps each partner's own colours, which
   is theirs to insist on.

   Kept small and few — a 28px mark and its padding — because this page spends
   its brightness on one element and these must not become a second. */
.layout-island .isld-partners li {
  background: var(--isl-ink);
  border-radius: 10px;
  padding: 9px 14px;
  min-height: 0;
  opacity: .86;
  transition: opacity .25s;
}
.layout-island .isld-partners li:hover { opacity: 1; }
.layout-island .isld-partners img {
  display: block;
  height: 28px;
  width: auto;
  min-width: 34px;
  max-width: 168px;
  object-fit: contain;
}
.layout-island .isld-partners > p {
  margin: 20px 0 0;
  font-size: 12.5px;
  color: var(--isl-dim);
  max-width: 62ch;
}

/* ── Rhythm ────────────────────────────────────────────────────────────────
   The borrowed blocks need breathing room they did not need on the homepage,
   where a different section sat above each of them. */
.layout-island .isld-cols { padding-top: 40px; }
.layout-island .isld-sect { margin-top: 44px; }
.layout-island .isld-steps { padding-bottom: 8px; }

@media (max-width: 760px) {
  .layout-island .isld-reach {
    grid-template-columns: minmax(0, 1fr);
    gap: 20px;
    padding-top: 34px;
  }
  .layout-island .isld-reach .hd p { max-width: none; }
  /* The note drops under the place name rather than trailing it: at this
     width the two on one line wrap into each other and the list stops
     scanning as a list. */
  .layout-island .isld-reach .row { grid-template-columns: minmax(0, 1fr); }
  .layout-island .isld-reach .nt { grid-row: 2; }
  .layout-island .isld-reach .ft { grid-column: 1; }
}

/* ── Where we operate ──────────────────────────────────────────────────────
   A list of place names, and it has to hold up when a name is ALL there is.
   Two of Kos's three desks are meeting points with no shopfront and no
   street address, so the layout cannot lean on a second line existing. Each
   place is a slab that reads as complete on its own; an address, where there
   is one, sits under it. */
.layout-island .isld-where .isld-desks {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(178px, 1fr));
  gap: 10px;
}
.layout-island .isld-where .itm {
  background: var(--isl-wash-2);
  border: 1px solid var(--isl-line);
  border-radius: 12px;
  padding: 15px 16px;
}
/* The mono face here is DELIBERATE, not the 9px label inherited from
   `.isl-desk .k`. The page now uses two voices and keeps them apart: Outfit
   is editorial — the argument, the places worth driving to — and the mono is
   operational, the things that are simply true. A desk name is operational,
   so it belongs with the fact chips rather than with the prose. Set at
   reading size and in sentence case, because this is a name to be read, not
   a label above something else. */
.layout-island .isld-where .itm .k {
  display: block;
  font-family: var(--isl-sans);
  font-size: 13.5px;
  font-weight: 600;
  letter-spacing: .005em;
  text-transform: none;
  color: var(--isl-ink);
}
.layout-island .isld-where .itm p {
  margin: 6px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--isl-dim);
}
.layout-island .isld-where .nt {
  margin: 14px 0 0;
  font-size: 13px;
  color: var(--isl-dim);
}
