/* The booking form's stylesheet — the ~90 pages that are not the Zurich working copy.
 *
 * Same file for all of them, loaded from <head> by Base.astro (`bookingCss="main"`), instead
 * of 29 KB inlined into every page. No Astro scoping out here, so selectors stay inside the
 * form's own namespace; .dtp-back and body.dtp-full are global on purpose, because script
 * puts them on <body>.
 *
 * Frozen: this is the copy that serves customers. New work happens in booking-lab.css and is
 * copied over when it is finished.
 */
.bf {
    background: linear-gradient(180deg, var(--color-blue) 0%, var(--color-blue-deep) 100%);
    padding: 2rem 0 2.25rem;
    /* Not `hidden`: the date panel hangs below its pill and would be sheared off. */
    overflow: visible;
  }
  .bf * { box-sizing: border-box; }
  /* Trimmed from 64px to 40px — about 6 mm reclaimed on each side, which is what the row of
     9+9+9+4 cm needs to sit inside a 1280px screen without shrinking. */
  .bf-form .bf .container { max-width: none; padding: 0 clamp(16px, 2vw, 40px); }
  .bf-sub { color: rgba(255,255,255,.9); text-align: center; font-size: .95rem; margin: -.7rem 0 1.1rem; }
  .bf-heading { color: #fff; text-align: center; font-family: var(--font-head); font-weight: 700; text-transform: uppercase; letter-spacing: .02em; font-size: clamp(1.15rem, 2.3vw, 1.55rem); line-height: 1.2; margin: 0 0 1.1rem; }
  @media (max-width: 700px) { .bf-heading { font-size: 1.05rem; margin-bottom: .8rem; } }
  /* On the booking page the H1 already says "Book your transfer" — the band just labels itself. */
  .bf--compact { padding: 1.4rem 0 1.6rem; }
  .bf-step { color: rgba(255,255,255,.92); font-family: var(--font-head); font-weight: 700; text-transform: uppercase; letter-spacing: .1em; font-size: .8rem; margin: 0 0 .9rem; }

  /* radios */
  .bf-group { display: flex; flex-wrap: wrap; gap: .6rem 1.6rem; }
  .bf-sep { width: 2px; height: 28px; background: rgba(255,255,255,.75); border-radius: 2px; flex: 0 0 auto; }
  /* group 2 (service) uses light-blue dots to differ from the orange direction group */
  .bf-group--svc .dot { border-color: var(--color-blue); }
  .bf-group--svc input:checked + .dot { background: var(--color-blue); box-shadow: inset 0 0 0 3px #fff; }

  /* fields — single line on desktop, roomy */
  /* Row A: From ⇅ To, half each. Row B: when, return, passengers, button. */
  .bf-fields { display: flex; flex-wrap: nowrap; gap: .8rem; align-items: flex-start; }
  /* Top, not centre: when "other address" opens a box under one of the two, centring would
     lift that column's pill above its neighbour. Pinned to the top, both pills stay put. */
  .bf-fields--places { align-items: flex-start; }
  .bf-fields--places .bf-cell { flex: 1 1 0; }
  .bf-fields--when { margin-top: .7rem; position: relative; }
  .bf-fields--when .bf-cell--dates,
  .bf-fields--when .bf-cell--ret,
  .bf-fields--when .bf-cell--pax { flex: 1.1333 1 0; }
  .bf-fields--when .bf-book { flex: .60 1 0; }
  .bf-fields--when.has-gap::after { content: ''; flex: .60 1 0; }

  /* The swap sits between the two place fields, on the row's centre line. */
  .bf-swap {
    width: 15mm; height: 15mm; flex: 0 0 auto; margin: 0; padding: 0; cursor: pointer;
    display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid var(--color-border); border-radius: 10px; background: #fff;
  }
  .bf-swap svg { width: 20px; height: 20px; fill: var(--accent); }
  .bf-swap:hover { border-color: var(--color-blue); background: var(--color-bg); }

  /* "+ Add return trip" — a dashed placeholder until it is asked for. */
  .bf-addret {
    display: flex; align-items: center; justify-content: center; gap: .5rem;
    width: 100%; min-height: 15mm; padding: .5rem .8rem; cursor: pointer;
    border: 2px dashed var(--color-border); border-radius: 12px; background: rgba(255,255,255,.14);
    font: inherit; font-size: .95rem; font-weight: 500; color: #fff;
  }
  .bf-addret[hidden] { display: none; }
  .bf-addret:hover { border-color: var(--accent); background: rgba(255,255,255,.24); }
  .bf-addret svg { width: 20px; height: 20px; fill: currentColor; flex: 0 0 auto; }
  #bf-ret-pill[hidden] { display: none; }
  /* A name over each half of the journey, with a rule running out to the edge so the two
     blocks read as two blocks and not as one long list of fields. */
  .bf-leg-h {
    display: flex; align-items: center; gap: .7rem; margin: 1rem 0 .45rem;
    font-family: var(--font-head); font-weight: 700; font-size: .8rem;
    letter-spacing: .12em; text-transform: uppercase; color: #fff;
  }
  .bf-leg-h[hidden] { display: none; }
  .bf-leg-h > span:first-child { flex: 0 0 auto; }
  .bf-leg-h::after { content: ''; flex: 1 1 auto; height: 1px; background: rgba(255, 255, 255, .3); }
  .bf-leg-ret[hidden] { display: none; }
  .bf-cell--ret[hidden] { display: none; }

  .bf-ret-x {
    order: 2; flex: 0 0 auto; width: 24px; height: 24px; padding: 0; cursor: pointer; line-height: 1;
    display: inline-flex; align-items: center; justify-content: center;
    border: 0; border-radius: 50%; background: rgba(255, 255, 255, .18); color: #fff; font-size: 1.05rem;
  }
  .bf-ret-x:hover { background: var(--accent); color: #fff; }

  /* Passengers: minus, number, plus — straight in the field. */
  /* One centimetre either side of the number. The three sit as a group at the left of the
     field, under the label — not shoved into its far corners. */
  /* Bounded, not spaced by a fixed gap: 10 mm between each part overflowed the pill on a
     narrow phone and pushed "+" past the border. The box takes the width it is given, caps
     itself on a wide screen, and lets the gap absorb whatever is left over. */
  .bf-count {
    display: flex; align-items: center; justify-content: space-between; flex-wrap: nowrap;
    gap: .4rem; width: 100%; max-width: 34mm; min-width: 0;
  }
  .bf-count-b {
    /* inline-flex, not the button default: otherwise the glyph sits on its baseline near the
       bottom of the box instead of in the middle of it. */
    display: inline-flex; align-items: center; justify-content: center;
    width: 26px; height: 26px; margin: 0; padding: 0; flex: 0 0 auto; cursor: pointer; line-height: 1;
    font: inherit; font-size: 1.15rem; font-weight: 700;
    border: 1px solid var(--color-border); border-radius: 8px; background: #fff; color: var(--navy);
  }
  .bf-count-b:hover:not(:disabled) { background: var(--accent); border-color: var(--accent); color: #fff; }
  .bf-count-b:disabled { color: var(--color-disabled); border-color: var(--color-disabled-bg); cursor: default; }
  .bf-count .bf-count-n {
    width: 2.4ch; flex: 0 0 auto; padding: 0;
    text-align: center; font-size: 1.05rem; font-variant-numeric: tabular-nums;
    -moz-appearance: textfield; appearance: textfield;
  }
  .bf-count-n::-webkit-outer-spin-button,
  .bf-count-n::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

  /* Only ever visible in sheet mode; created by script, so it is styled globally. */
  .dtp-back {
    position: fixed; inset: 0; z-index: 99;
    background: rgba(9, 34, 66, .45);
  }
  .dtp-back[hidden] { display: none; }

  .bf-note { margin: .4rem 0 0; font-size: .84rem; font-weight: 500; color: #ffe6c7; }
  .bf-note[hidden] { display: none; }
  /* The running total. Script writes it, so it is empty until then — and an empty paragraph
     would still push the row below it down by its own margin. */
  .bf-note--pax:empty { display: none; }

  /* ---- two counters in one pill -------------------------------------------------------
     Adults and children are one question asked twice, so they share a pill rather than
     taking two: side by side they read as a single head count, and the row keeps the same
     three-cell rhythm it had with a single number. */
  .bf-pill--split .bf-field { flex: 1 1 0; }
  /* Only the first half carries the person icon — one icon for one question. */
  .bf-pill--split .bf-field:not(.bf-field--icon) { padding-left: .45rem; }
  .bf-vdiv {
    flex: 0 0 auto; align-self: center; width: 1px; height: 60%;
    background: var(--color-border);
  }
  /* The age band, said once where it is decided rather than in a note underneath. It gives
     way first when the pill is narrow: the word is the label, the band only qualifies it. */
  .bf-pill--split .bf-lbl small {
    font-size: .78em; color: var(--color-muted); margin-left: .3em;
  }

  .bf-dt-val.is-ph { color: var(--color-muted); }

  /* The shared date panel is positioned against the row, not a single pill. */
  .bf-fields--when > .dtp { top: calc(100% + 10px); }
  /* The cell is the flex item; the pill sits on top of its own error line, so a message
     appearing underneath pushes nothing sideways. */
  .bf-cell { display: flex; flex-direction: column; min-width: 0; }
  .bf-pill {
    background: #fff; border-radius: 12px; display: flex; align-items: center;
    /* 15 mm, fixed, so the band keeps its shape whatever gets chosen. */
    padding: 0 .3rem; min-height: 15mm; width: 100%; flex: 0 0 auto; min-width: 0;
  }
  /* Pick-up and drop-off carry the longest text on the row — a label that must not wrap and
     an option like "✈  Friedrichshafen Airport (FDH)  🇩🇪" — so they take the lion's share of
     the width. Dates are fixed-format and passengers are two small numbers; both give way. */
  .bf-field {
    display: flex; flex-direction: column; justify-content: center;
    flex: 1; padding: .25rem .6rem; min-width: 0; position: relative;
  }
  .bf-field[hidden] { display: none; }
  /* Sentence case at reading size, not a small-caps micro-label: the reference treats these
     as the field's own words, and they are the only thing in the field until it is answered.
     Always one line — a wrapped label would push the pill taller than its neighbours. */
  .bf-lbl { color: var(--color-text); font-size: .82rem; font-weight: 500; line-height: 1.15; pointer-events: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .bf-lbl small { font-weight: 500; text-transform: none; letter-spacing: 0; }
  .bf-input {
    border: 0; background: transparent; padding: 0; margin: 0; width: 100%; min-width: 0;
    font: inherit; font-size: .95rem; color: var(--color-text); line-height: 1.25;
    appearance: none; -webkit-appearance: none;
  }
  .bf-input:focus { outline: none; }
  /* A missing answer is ringed in red inside its white pill, and named underneath it.
     Fields carry no other rule of their own, so nothing competes with it. */
  .bf-field.is-invalid { box-shadow: inset 0 0 0 2px var(--color-error); border-radius: 10px; }
  .bf-err {
    margin: .4rem 0 0; padding: .4rem .7rem; border-radius: 8px;
    background: #fff; border-left: 4px solid var(--color-error);
    color: var(--color-error); font-size: .84rem; font-weight: 500; line-height: 1.4;
  }
  .bf-err[hidden] { display: none; }
  .bf-err span { display: block; }
  .bf-err span + span { margin-top: .2rem; }
  select.bf-input { cursor: pointer; text-overflow: ellipsis; }
  /* From and To are one line: the word sits at the left, the pin at the right, both centred
     on the same axis. The word is an overlay on the select, so choosing a place replaces it
     rather than pushing a second line into the pill. */
  /* From / To stack one item per line — the word, then the place, then what kind of place,
     then its code. A closed <select> can only ever draw one line, so the select is made
     invisible and laid over the whole field to keep the native list, while these lines are
     what the visitor actually reads. */
  .bf-field--route.js .bf-input {
    position: absolute; inset: 0; width: 100%; height: 100%;
    opacity: 0; cursor: pointer; z-index: 2;
  }
  .bf-route-val {
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
    min-width: 0; line-height: 1.2; font-size: .95rem; color: var(--color-text);
  }
  .bf-route-val .rv-kind,
  .bf-route-val .rv-code { color: var(--color-muted); }
  .bf-route-val.is-ph { color: var(--color-muted); }
  .bf-input option, .bf-input optgroup { color: var(--color-text); }
  .bf-dt { display: flex; align-items: baseline; gap: .5rem; min-width: 0; }
  .bf-dt .bf-input { width: auto; flex: 1 1 auto; }
  .bf-time { flex: 0 0 auto; color: var(--color-muted); }
  .bf-num { max-width: 4ch; }
  .bf-div { width: 1px; align-self: stretch; background: var(--color-border); margin: .6rem 0; }
  /* The pin sits to the LEFT of the pick-up / drop-off field, ahead of the label and the
     select, the way a map marker reads. The field indents to make room for it. */
  .ic { width: 20px; height: 20px; fill: var(--accent); flex: 0 0 auto; position: absolute; left: .75rem; top: 50%; transform: translateY(-50%); pointer-events: none; }
  /* The indent clears the mark and then leaves 5 mm of air, so the text is not pressed
     against it. Change the mark's size or offset and this has to move with it. */
  .bf-field--icon { padding-left: 51px; }
  .bf-swap {
    background: none; border: 0; cursor: pointer; padding: .4rem; margin: 0 .1rem;
    display: inline-flex; align-items: center; border-radius: 8px; flex: 0 0 auto;
    /* As tall as a pill and pinned to the top, so it keeps sitting level with the two
       fields even after one of them grows a box underneath. */
    height: 15mm; align-self: flex-start;
  }
  .bf-swap:hover { background: var(--color-bg); }
  .bf-swap .ic-swap { position: static; transform: none; fill: var(--color-navy); width: 20px; height: 20px; }

  /* ---- date + time picker --------------------------------------------------------
     The outlined look comes from the reference screenshots: every surface is drawn with a
     coloured contour rather than a fill, so the panel reads as one object made of frames.
     The colour is the site accent, not the reference's red, so it belongs to this brand. */
  .bf-pill--dates { position: relative; }
  /* Class, not id: the return pill gets the same treatment as the outbound one, otherwise
     it keeps showing the browser's own dd.mm.yyyy and --:-- next to our label. */
  .has-dtp > .bf-field > .bf-lbl,
  .has-dtp .bf-dt { display: none; }

  /* The JS view of a date field: label + ⓘ on one line, the chosen value under it. */
  .bf-dtj {
    display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
    gap: .05rem; width: 100%; cursor: pointer;
  }
  .bf-dtj[hidden] { display: none; }
  .bf-dtj:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; border-radius: 6px; }


  .bf-dt-btn {
    display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
    gap: .12rem; width: 100%; min-height: 2.5rem; padding: 0; border: 0; background: none;
    font: inherit; text-align: left; cursor: pointer; color: inherit;
  }
  /* Label and its info mark share a line; the value sits underneath. */
  .bf-dt-head { display: flex; align-items: center; gap: .3rem; }
  .bf-i {
    position: relative; flex: 0 0 auto; cursor: help;
    display: inline-flex; align-items: center; justify-content: center;
    width: 16px; height: 16px;
    border: 1px solid var(--accent); border-radius: 50%; background: #fff;
    font-size: .58rem; font-weight: 700; font-style: italic; line-height: 1; color: var(--accent);
  }
  .bf-i:hover, .bf-dtj:focus-visible .bf-i { background: var(--accent); color: #fff; }
  /* Hover on a mouse, focus on a tap or a keyboard — no script involved either way. */
  .bf-tip {
    position: absolute; bottom: calc(100% + 9px); left: 50%; transform: translateX(-50%);
    width: max-content; max-width: 230px; padding: .5rem .7rem;
    border-radius: 10px; background: var(--navy); color: var(--accent);
    font-size: .78rem; font-weight: 500; font-style: normal; line-height: 1.4;
    text-align: left; letter-spacing: 0; text-transform: none;
    box-shadow: 0 10px 26px rgba(9, 34, 66, .3);
    opacity: 0; visibility: hidden; transition: opacity .12s; pointer-events: none; z-index: 120;
  }
  .bf-tip::after {
    content: ''; position: absolute; top: 100%; left: 50%; margin-left: -5px;
    border: 5px solid transparent; border-top-color: var(--navy);
  }
  /* The mark cannot take focus any more — it sits inside a button, and a button with a
     second tab stop inside it is a trap. The tip now opens on the button's own focus. */
  .bf-i:hover .bf-tip,
  .bf-dtj:focus-visible .bf-tip { opacity: 1; visibility: visible; }

  .bf-dt-lbl { color: var(--color-text); font-size: .82rem; font-weight: 500; line-height: 1.15; white-space: nowrap; }
  /* Never let "31/08/26 | 04:15" slide under the calendar mark on the right. */
  .bf-dt-val { font-size: .92rem; color: var(--color-muted); line-height: 1.1; white-space: pre-line; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
  .bf-dt-val:empty { display: none; }
  .bf-dt-btn:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; border-radius: 6px; }

  .dtp {
    position: absolute; z-index: 60; top: calc(100% + 10px); left: 0;
    width: min(370px, calc(100vw - 2rem));
    background: #fff; border: 1px solid var(--accent); border-radius: 16px;
    padding: .9rem 1rem 1.1rem;
    box-shadow: 0 18px 44px rgba(9, 34, 66, .28);
    text-align: left; cursor: default;
  }
  .dtp[hidden] { display: none; }
  .dtp-grip { display: none; }

  .dtp-tabs { display: flex; gap: .5rem; margin-bottom: .9rem; }
  .dtp-tab {
    flex: 1 1 0; display: inline-flex; align-items: center; justify-content: center; gap: .4rem;
    min-height: 44px; padding: .4rem .6rem;
    border: 1px solid var(--color-border); border-radius: 12px; background: #fff;
    font: inherit; font-size: .92rem; font-weight: 700; color: var(--color-muted);
  }
  .dtp-tab[hidden] { display: none; }
  .dtp-tab svg { width: 17px; height: 17px; fill: currentColor; flex: 0 0 auto; }
  .dtp-tab.is-on { border-color: var(--accent); color: var(--navy); }

  .dtp-note {
    margin: 0 0 .7rem; font-size: .82rem; line-height: 1.45;
    color: var(--accent); font-weight: 500;
  }
  .dtp-title { margin: 0 0 .3rem; font-family: var(--font-head); font-weight: 700; color: var(--navy); font-size: 1rem; }

  .dtp-datefield {
    display: inline-flex; align-items: center; gap: .55rem; width: 100%;
    min-height: 46px; padding: .4rem .85rem; cursor: pointer;
    border: 1px solid var(--color-border); border-radius: 12px; background: #fff;
    font: inherit; font-size: 1rem; color: var(--navy);
  }
  .dtp-datefield:hover { border-color: var(--accent); }
  .dtp-datefield svg { width: 18px; height: 18px; fill: var(--accent); flex: 0 0 auto; }

  .dtp-cal { margin-top: .7rem; border: 1px solid var(--accent); border-radius: 12px; padding: .6rem .55rem .7rem; }
  .dtp-cal[hidden] { display: none; }
  .dtp-cal-head { display: flex; align-items: center; gap: .35rem; margin-bottom: .5rem; }
  /* Everything in the calendar and the time lists sits on white and turns orange under the
     pointer — one hover colour across days, months, hours and minutes. */
  .dtp-nav {
    width: 32px; height: 32px; flex: 0 0 auto; cursor: pointer; font-size: 1.25rem; line-height: 1;
    border: 1px solid var(--color-border); border-radius: 50%; background: #fff; color: var(--navy);
  }
  .dtp-nav:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
  .dtp-sel {
    flex: 1 1 auto; min-width: 0; min-height: 32px; padding: .2rem .4rem;
    border: 1px solid var(--color-border); border-radius: 8px; background: #fff;
    font: inherit; font-size: .9rem; font-weight: 700; color: var(--navy); cursor: pointer;
  }
  .dtp-sel:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
  .dtp-wd, .dtp-days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
  .dtp-wd span { text-align: center; font-size: .74rem; font-weight: 700; color: var(--color-muted); padding: .2rem 0 .3rem; }
  /* The day buttons are built by script, so they never carry Astro's scoping attribute —
     without  these rules match nothing and the browser's grey button default wins. */
  .dtp-days .dtp-day {
    aspect-ratio: 1; min-height: 34px; border: 0; border-radius: 8px; background: #fff;
    font: inherit; font-size: .88rem; color: var(--navy); cursor: pointer;
  }
  .dtp-days .dtp-day.is-blank { visibility: hidden; }
  .dtp-days .dtp-day:disabled { background: #fff; color: var(--color-disabled); cursor: default; }
  .dtp-days .dtp-day:not(:disabled):hover { background: var(--accent); color: #fff; }
  .dtp-days .dtp-day.is-on { background: var(--accent); color: #fff; font-weight: 700; }

  /* The panel's two halves each say what they are for. The calendar's heading has no icon:
     the date button under it already carries one, and two in a row reads as clutter. */
  .dtp-part-t {
    display: flex; align-items: center; gap: .45rem; margin: .9rem 0 .5rem;
    font-size: .92rem; font-weight: 500; color: var(--navy);
  }
  #bf-dtp-date-t { margin-top: .2rem; }
  .dtp-time-t svg {
    width: 18px; height: 18px; flex: 0 0 auto;
    /* Blue like the rest of the funnel's markers; the paths are filled, the clock is stroked,
       so it takes both. */
    fill: var(--color-blue); stroke: var(--color-blue); color: var(--color-blue);
  }
  .dtp-time { display: flex; align-items: flex-start; gap: .5rem; }
  .dtp-spin { position: relative; flex: 0 0 auto; }
  .dtp-spin-btn {
    display: inline-flex; align-items: center; gap: .35rem; min-height: 46px; padding: .3rem .6rem;
    border: 1px solid var(--color-border); border-radius: 12px; background: #fff; cursor: pointer;
    font: inherit; color: var(--navy);
  }
  .dtp-spin-btn:hover { border-color: var(--accent); }
  .dtp-spin-l { font-size: .72rem; color: var(--color-muted); font-weight: 500; }
  .dtp-spin-btn b { font-size: 1rem; font-variant-numeric: tabular-nums; }
  .dtp-caret { color: var(--accent); font-size: .7rem; }
  .dtp-list {
    position: absolute; z-index: 2; top: calc(100% + 4px); left: 0;
    max-height: 190px; overflow-y: auto; padding: .25rem;
    border: 1px solid var(--accent); border-radius: 12px; background: #fff;
    box-shadow: 0 12px 26px rgba(9, 34, 66, .2);
  }
  .dtp-list[hidden] { display: none; }
  /* Same for the hour and minute rows — also built by script. */
  .dtp-list button {
    display: block; width: 100%; min-width: 4.2rem; min-height: 34px; padding: .2rem .7rem;
    border: 0; border-radius: 7px; background: #fff; cursor: pointer;
    font: inherit; font-size: .95rem; font-variant-numeric: tabular-nums; color: var(--navy); text-align: center;
  }
  .dtp-list button:hover { background: var(--accent); color: #fff; }

  .dtp-save {
    margin-left: auto; min-height: 46px; padding: 0 1.6rem; cursor: pointer;
    border: 0; border-radius: 12px; background: var(--color-blue); color: #fff;
    font: inherit; font-weight: 700; font-size: 1rem;
  }
  .dtp-save:hover { background: var(--color-blue-dark); }

  /* ---- the drawn place list -------------------------------------------------------- */
  .lb {
    position: absolute; z-index: 65; top: calc(100% + 8px); left: 0;
    /* 60vh so the list cannot outgrow a small phone held sideways, where a flat 340px
       is taller than the screen and the last places sit below the fold with no way down. */
    width: min(340px, calc(100vw - 2rem)); max-height: min(340px, 60vh); overflow-y: auto;
    background: #fff; border: 1px solid var(--accent); border-radius: 14px;
    padding: .4rem; box-shadow: 0 18px 44px rgba(9, 34, 66, .28);
    text-align: left; cursor: default;
  }
  .lb[hidden] { display: none; }
  /* Full-bleed, so nothing scrolls past in the strip either side of it, and a hairline
     underneath so it reads as a fixed header rather than a row that refuses to move. */
  .lb .lb-search {
    position: sticky; top: 0; z-index: 2; background: #fff;
    margin: -.4rem -.4rem .1rem; padding: .5rem .5rem .45rem;
    border-bottom: 1px solid var(--color-border); border-radius: 12px 12px 0 0;
  }
  .lb .lb-q {
    width: 100%; min-height: 40px; padding: .4rem .7rem; font: inherit; font-size: .95rem;
    color: var(--color-text); border: 1px solid var(--color-border); border-radius: 9px; background: #fff;
  }
  .lb .lb-q:focus { outline: none; border-color: var(--accent); }
  .lb .lb-none { margin: .6rem; font-size: .9rem; color: var(--color-muted); }
  .lb .lb-none[hidden] { display: none; }
  .lb .lb-row[hidden] { display: none; }
  .lb .lb-g[hidden] { display: none; }
  .lb .lb-gt {
    margin: .5rem .6rem .25rem; font-size: .72rem; font-weight: 700; color: var(--color-muted);
    text-transform: uppercase; letter-spacing: .06em;
  }
  /* "Other address" is the escape hatch, so it is coloured to stand apart from the places. */
  .lb .lb-g--other { margin-top: .3rem; border-top: 1px solid var(--color-border); padding-top: .3rem; }
  .lb .lb-g--other .lb-place { color: var(--accent); font-weight: 700; }
  .lb .lb-g--other .lb-row:hover .lb-place { color: #fff; }
  .lb .lb-row {
    display: flex; align-items: center; gap: .6rem; width: 100%;
    min-height: 40px; padding: .35rem .6rem; cursor: pointer;
    border: 0; border-radius: 9px; background: #fff; font: inherit; text-align: left;
  }
  .lb .lb-row:hover { background: var(--accent); }
  .lb .lb-ic { width: 20px; height: 20px; flex: 0 0 auto; fill: var(--accent); }
  .lb .lb-row:hover .lb-ic { fill: #fff; }
  .lb .lb-txt { display: flex; flex-direction: column; min-width: 0; line-height: 1.15; }
  .lb .lb-place { font-size: .95rem; color: var(--color-text); }
  .lb .lb-kind { font-size: .8rem; color: var(--color-muted); }
  .lb .lb-row:hover .lb-place,
  .lb .lb-row:hover .lb-kind { color: #fff; }

  /* ---- passengers counter --------------------------------------------------------- */
  .bf-pill--pax { position: relative; }
  #bf-pax.has-pxp .bf-lbl,
  #bf-pax.has-pxp .bf-pax-native { display: none; }
  .bf-pax-native { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
  .bf-pax-nl { font-size: .72rem; color: var(--color-muted); font-weight: 500; }

  .pxp {
    position: absolute; z-index: 60; top: calc(100% + 10px); left: 0;
    width: min(300px, calc(100vw - 2rem));
    background: #fff; border: 1px solid var(--accent); border-radius: 16px;
    padding: .9rem 1rem 1rem;
    box-shadow: 0 18px 44px rgba(9, 34, 66, .28);
    text-align: left; cursor: default;
  }
  .pxp[hidden] { display: none; }
  .pxp-row {
    display: flex; align-items: center; justify-content: space-between; gap: 1rem;
    padding: .55rem .1rem;
  }
  .pxp-row + .pxp-row { border-top: 1px solid var(--color-border); }
  .pxp-t { font-weight: 700; color: var(--navy); font-size: .98rem; }
  .pxp-t small { display: block; font-weight: 500; font-size: .78rem; color: var(--color-muted); margin-top: .1rem; }
  .pxp-step { display: inline-flex; align-items: center; gap: .1rem; flex: 0 0 auto; }
  .pxp-step b { min-width: 2.1rem; text-align: center; font-size: 1.05rem; font-variant-numeric: tabular-nums; color: var(--navy); }
  .pxp-b {
    width: 38px; height: 38px; flex: 0 0 auto; cursor: pointer; line-height: 1;
    font: inherit; font-size: 1.25rem; font-weight: 700;
    border: 1px solid var(--color-border); border-radius: 50%; background: #fff; color: var(--navy);
  }
  .pxp-b:hover:not(:disabled) { background: var(--accent); border-color: var(--accent); color: #fff; }
  .pxp-b:disabled { color: var(--color-disabled); border-color: var(--color-disabled-bg); cursor: default; }
  .pxp-note { margin: .5rem 0 .8rem; font-size: .8rem; color: var(--color-muted); }
  .pxp-done {
    width: 100%; min-height: 44px; cursor: pointer;
    border: 0; border-radius: 12px; background: var(--color-blue); color: #fff;
    font: inherit; font-weight: 700; font-size: 1rem;
  }
  .pxp-done:hover { background: var(--color-blue-dark); }

  .bf-book {
    background: var(--accent); color: #fff; border: none; border-radius: 12px;
    font-weight: 700; font-size: 1.05rem; padding: 0 .8rem; min-height: 15mm;
    cursor: pointer; flex: 0 1 4cm; transition: background .12s;
  }
  .bf-book:hover { background: var(--accent-dark); }
  .bf-book--wide { width: 100%; max-width: 420px; }

  /* "somewhere else" text fields — inside the blue band, below the pills */
  /* In the flow, under its own field: it pushes what follows down instead of covering it.
     The row is top-aligned (see .bf-fields--places) so the cell growing taller cannot drag
     its pill out of line with the pill beside it. */
  .bf-other { margin: .5rem 0 0; display: flex; flex-direction: column; gap: .25rem; }
  .bf-other[hidden] { display: none; }
  .bf-other-lbl { color: #fff; font-size: .82rem; font-weight: 500; }
  .bf-other-in {
    border: 0; border-radius: 10px; background: #fff; min-height: 44px;
    padding: 0 .9rem; font: inherit; font-size: .95rem; color: var(--color-text); width: 100%;
  }

  /* honeypot — off-screen rather than display:none, which some bots skip */
  .bf-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

  /* ---- step 2: the white details card -------------------------------------------- */
  .bf-form.bf-form--full .container { padding-top: 1.8rem; }
  .bd-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.2rem; align-items: start; }
  .bd-card {
    border: 1px solid var(--color-border); border-radius: 14px; background: #fff;
    padding: 1.1rem 1.2rem 1.3rem; margin: 0;
  }
  .bd-card legend {
    font-family: var(--font-head); font-weight: 700; color: var(--navy);
    font-size: 1.05rem; padding: 0 .45rem; margin-left: -.45rem;
  }
  .bd-row { display: grid; gap: .8rem; margin: .8rem 0 0; }
  .bd-row--2 { grid-template-columns: 1fr 1fr; }
  .bd-row--3 { grid-template-columns: repeat(3, 1fr); }
  .bd-f { display: flex; flex-direction: column; gap: .3rem; min-width: 0; }
  .bd-f[hidden] { display: none; }
  .bd-f label { font-size: .85rem; font-weight: 500; color: var(--color-muted); }
  .bd-f label em { color: var(--color-accent-ink); font-style: normal; }
  .bd-f input, .bd-f textarea {
    border: 1px solid var(--color-border); border-radius: 9px; background: #fff;
    min-height: 44px; padding: .55rem .75rem; font: inherit; font-size: .95rem;
    color: var(--color-text); width: 100%;
  }
  .bd-f textarea { min-height: 84px; resize: vertical; line-height: 1.5; }
  .bd-f input:focus, .bd-f textarea:focus { outline: 2px solid var(--color-focus); outline-offset: 2px; border-color: var(--color-focus); }
  .bd-f--sm input { max-width: 6.5rem; }
  .bd-seats { margin-top: 1rem; padding-top: .9rem; border-top: 1px dashed var(--color-border); }
  .bd-seats-t { font-size: .85rem; font-weight: 700; color: var(--navy); }
  .bd-consent { margin: 1.2rem 0 0; }
  .bd-consent label { display: flex; gap: .6rem; align-items: flex-start; font-size: .92rem; color: var(--color-muted); line-height: 1.5; }
  .bd-consent input { width: 22px; height: 22px; flex: 0 0 auto; margin-top: .1rem; accent-color: var(--accent); }
  .bd-error {
    margin: 0 0 1.1rem; padding: .85rem 1rem; border-radius: 10px;
    background: var(--color-warning-bg); border: 1px solid #f0dcc0; color: var(--color-warning);
    font-size: .95rem; line-height: 1.5;
  }
  .bd-error[hidden] { display: none; }
  .bd-send { margin: 1.1rem 0 .4rem; }
  .bd-nopay { margin: 0 0 1.6rem; font-size: .9rem; color: var(--color-muted); max-width: 60ch; }

  @media (max-width: 900px) {
    /* Two columns side by side, never wrapping:
       left = Return / One way, right = the 3 service radios */
    .bf-group { flex-direction: column; gap: .8rem; flex: 1 1 0; min-width: 0; }
    .bf-group--svc { flex: 1.35 1 0; }
    .bf-sep { height: auto; align-self: stretch; }
    .bf-fields { flex-wrap: wrap; width: 100%; gap: .55rem; }
    .bf-fields--places { flex-direction: column; align-items: stretch; }
    .bf-fields--places .bf-cell { width: 100%; }
    .bf-swap { height: auto; align-self: center; }
    /* No swap down here: stacked fields make the arrows read as clutter between them, and
       reordering two adjacent selects is quicker than reaching for a button. */
    .bf-swap { display: none; }
    .bf-fields--when .bf-cell--dates,
    .bf-fields--when .bf-cell--ret { flex: 1 1 calc(50% - .3rem); }
    /* Full width: two counters plus their labels do not fit in half a phone screen. */
    .bf-fields--when .bf-cell--pax { flex: 1 1 100%; }
    .bf-fields--when .bf-book { flex: 1 1 0; }
    .bf-fields--when.has-gap::after { display: none; }
    /* Down here "+ Add return trip" wraps onto two lines and outgrows its 15 mm, so Outbound
       is told to match whichever of the pair ends up taller instead of staying stubbornly
       short beside it. The button opts out — it has nothing to line up with. */
    .bf-fields--when { align-items: stretch; }
    .bf-fields--when .bf-book { align-self: flex-start; }
    .bf-cell--dates > .bf-pill,
    .bf-cell--ret > .bf-addret,
    .bf-cell--ret > .bf-pill { flex: 1 1 auto; }
    .bf-cell, .bf-pill { width: 100%; min-width: 0; }
    .bf-addret { min-height: 15mm; font-size: .9rem; }
    .bf-count-b { width: 28px; height: 28px; }
    /* 34mm each was sized for one counter in a wide cell; across a full-width pill the pair
       should simply share what there is. */
    .bf-count { max-width: none; }
    .bf-pill--split .bf-field:not(.bf-field--icon) { padding-left: .5rem; }
    /* Slim AlpineFleet-style fields: ~48px tall pills, small text & icons.
       48px, not 44px, because each pill now stacks a label over a control. */
    .bf { padding: 1.2rem 0 1.4rem; }
    .bf-pill { min-height: 15mm; border-radius: 10px; padding: 0 .25rem; }
    .bf-lbl, .bf-dt-lbl, .bf-dt-val { font-size: .9rem; }
    .bf-field { padding: .25rem .55rem; }
    .bf-input { font-size: .9rem; }
    .ic { width: 18px; height: 18px; left: .5rem; }
    /* The icon ends at 26px; 45px of indent was throwing away 19px of a pill that has none
       to spare, which is what pushed "+" over the border. */
    .bf-field--icon { padding-left: 32px; padding-right: .35rem; }
    /* The pill is full width down here, so the panel matches it instead of hanging off. */
    /* Sheet: pinned to the bottom edge, above everything, with its own dimmed backdrop.
       It lands in the same place whatever the visitor has scrolled to. */
    .bf-fields--when > .dtp {
      position: fixed; top: auto; right: 0; bottom: 0; left: 0; width: auto;
      max-height: 85vh; overflow-y: auto;
      border-width: 2px 0 0; border-radius: 18px 18px 0 0;
      padding: .5rem 1rem calc(1.1rem + env(safe-area-inset-bottom));
      box-shadow: 0 -14px 40px rgba(9, 34, 66, .32);
      z-index: 100;
    }
    .dtp-grip {
      display: block; width: 42px; height: 4px; margin: .1rem auto .6rem;
      border-radius: 2px; background: var(--color-border);
    }
    .dtp-time { flex-wrap: wrap; }
    .dtp-save { width: 100%; margin: .5rem 0 0; }
    .bf-div { margin: .45rem 0; }
    .bf-book { min-height: 48px; padding: .5rem; font-size: 1.05rem; border-radius: 10px; }
    .bf-book--wide { max-width: none; }
    .bd-grid { grid-template-columns: 1fr; }
  }

  @media (max-width: 560px) {
    .bd-row--2, .bd-row--3 { grid-template-columns: 1fr; }
    .bd-f--sm input { max-width: none; }
  }
