/* The booking form's stylesheet — Zurich → St. Anton (the working copy).
 *
 * Lifted out of the component so that changing it rewrites one file instead of every page
 * that carries the form, and so the ~29 KB stops being inlined into each of them. It is
 * loaded from <head> by Base.astro, which is handed `bookingCss` by whatever renders a form.
 *
 * There is no Astro scoping out here, so every selector must stay inside the form's own
 * namespace: .bf-*, .dtp-*, .lb-*, .bd-*, plus .ic and .has-dtp, which nothing else on the
 * site uses. Two exceptions are deliberately global — .dtp-back and body.dtp-full — because
 * script puts them on <body>.
 *
 * Stable filename on purpose: see the Cache-Control override in public/.htaccess.
 */
.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; }

  /* ---- passengers: a folded field and the panel behind it -----------------------------
     Without script the two number boxes are the field. With it, they are hidden and the
     button takes their place — one line that says who is travelling. */
  #bf-pax.has-pxp .bf-lbl,
  #bf-pax.has-pxp .bf-pax-native,
  #bf-pax-ret.has-pxp .bf-lbl,
  #bf-pax-ret.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; }
  .bf-pax-n { width: 3.5rem; }
  .bf-pax-btn {
    display: flex; flex-direction: column; justify-content: center; gap: .1rem;
    width: 100%; min-width: 0; margin: 0; padding: 0; border: 0; background: none;
    font: inherit; text-align: left; cursor: pointer; color: var(--color-text);
  }
  .bf-pax-btn[hidden] { display: none; }
  /* Same two lines as every other pill: what the field is, then what it says. */
  .bf-pax-head {
    font-size: .82rem; font-weight: 500; line-height: 1.15; color: var(--color-text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }
  .bf-pax-val {
    font-size: .95rem; line-height: 1.25; color: var(--color-text);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  }

  .pxp {
    position: absolute; z-index: 60; top: calc(100% + 10px); left: 0;
    width: min(320px, calc(100vw - 2rem));
    background: #fff; border: 1px solid var(--color-blue); 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: 500; color: var(--navy); font-size: 1rem; }
  .pxp-t small { display: block; font-weight: 400; font-size: .8rem; color: var(--color-muted); margin-top: .1rem; }
  .pxp-step { display: inline-flex; align-items: center; gap: .15rem; 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);
  }
  /* 40px round targets — a thumb needs them, and the panel has the room the pill did not. */
  .pxp-b {
    display: inline-flex; align-items: center; justify-content: center;
    width: 40px; height: 40px; 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(--color-blue); border-color: var(--color-blue); color: #fff; }
  .pxp-b:disabled { color: var(--color-disabled); border-color: var(--color-disabled-bg); cursor: default; }
  @media (hover: none) {
    /* A tap would leave the last button filled blue, as if it were still pressed. */
    .pxp-b:hover:not(:disabled) { background: #fff; border-color: var(--color-border); color: var(--navy); }
  }
  .pxp-note { margin: .5rem 0 .8rem; font-size: .8rem; color: var(--color-muted); }
  .pxp-note:empty { display: none; }
  .pxp-done {
    width: 100%; min-height: 44px; cursor: pointer;
    border: 0; border-radius: 12px; background: var(--color-blue); color: #fff;
    font: inherit; font-weight: 500; font-size: 1rem;
  }
  .pxp-done:hover { background: var(--color-blue-dark); }


  .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. */
  /* Out of the pointer's reach. It keeps the value and still submits; a phone that answered
     a touch on it was changing the airport instead of opening our list. */
  .bf-field--route.js .bf-input {
    position: absolute; inset: 0; width: 100%; height: 100%;
    opacity: 0; z-index: 2; pointer-events: none;
  }
  /* The thing a finger actually lands on: the whole field, and nothing else. */
  .bf-route-btn {
    position: absolute; inset: 0; width: 100%; height: 100%;
    margin: 0; padding: 0; border: 0; background: none; cursor: pointer; z-index: 3;
    -webkit-tap-highlight-color: transparent;
    /* No pause to see whether a second tap is coming to zoom. */
    touch-action: manipulation;
  }
  .bf-route-btn:focus-visible { outline: 2px solid var(--color-blue); outline-offset: -2px; border-radius: 10px; }
  .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-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; }
  /* Set while the full-screen picker is up. Global, because it lands on <body>. */
  body.dtp-full, body.lb-full { overflow: hidden; }
  .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-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
  /* Desktop closes by clicking away from the panel, so the button is only in the way here. */
  .dtp-x { display: none; }
  .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; }

  /* ---- the scrolling year (phones only) ----------------------------------------------
     One month after another down the panel, the way Google and the booking sites do it.
     The panel is already the whole screen there, and the thumb is already scrolling — so
     27 December and 3 January, the commonest week of the season, land on one screen instead
     of either side of a "next month" tap. Script adds .is-list; on a desktop it never does,
     and the grid above stays exactly as it was. */
  .dtp-days.is-list { display: block; }
  .dtp-m + .dtp-m { margin-top: 1.3rem; }
  .dtp-m-t {
    margin: 0 0 .45rem; padding: .1rem 0;
    font-size: 1rem; font-weight: 700; color: var(--navy);
  }
  .dtp-m-g { 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-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-day.is-blank { visibility: hidden; }
  .dtp-day:disabled { background: #fff; color: var(--color-disabled); cursor: default; }
  .dtp-day:not(:disabled):hover { background: var(--color-blue); color: #fff; }
  .dtp-day.is-on { background: var(--color-blue); color: #fff; font-weight: 700; }
  @media (hover: none) {
    /* A tap would otherwise leave the last day looked at filled blue, as if chosen. */
    .dtp-day:not(:disabled):not(.is-on):hover { background: #fff; color: var(--navy); }
  }

  /* 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; }
  /* Desktop closes by clicking away, so the header is only in the way here. */
  .lb-head { 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-top { position: sticky; top: 0; z-index: 5; background: #fff; }
  .lb .lb-search {
    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; }
  /* Each heading in its group's own colour, so the three sections of a seventy-place list
     separate at a glance. The orange is the darker of the two the site keeps: at .72rem the
     bright one sits at 2.1:1 on white, which is a shade of nothing at that size. */
  .lb .lb-gt {
    margin: .5rem .6rem .25rem; font-size: .72rem; font-weight: 700; color: var(--color-muted);
    text-transform: uppercase; letter-spacing: .06em;
  }
  .lb .lb-g[data-gkind="airport"] .lb-gt { color: var(--color-blue); }
  .lb .lb-g[data-gkind="station"] .lb-gt { color: #e2002a; }
  .lb .lb-g[data-gkind="place"] .lb-gt { color: var(--color-accent-ink); }
  /* "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); }
  /* Each mark in its own colour, so the eye sorts the list before it reads it: planes in the
     funnel's blue, trains in ÖBB red, everywhere else the orange they already had. */
  .lb .lb-ic { width: 20px; height: 20px; flex: 0 0 auto; fill: var(--accent); }
  .lb .lb-ic[data-svg="plane"] { fill: var(--color-blue); }
  .lb .lb-ic[data-svg="train"] { fill: #e2002a; }
  .lb .lb-row:hover .lb-ic,
  .lb .lb-row:hover .lb-ic[data-svg] { 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; }
    /* 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. */
    /* The whole screen, not a sheet over the page. A half-height panel left the form
       showing behind it, and on a small phone the calendar and the clock together did not
       fit in what was left — the Save button ended up below the fold. */
    .bf-fields--when > .dtp {
      position: fixed; inset: 0; width: auto; height: 100%;
      max-height: none; overflow-y: auto; overscroll-behavior: contain;
      border: 0; border-radius: 0; box-shadow: none;
      padding: 0 1rem calc(1.4rem + env(safe-area-inset-bottom));
      z-index: 100;
    }
    /* A grip says "drag me down". Nothing drags here any more — the back arrow is the way out. */
    .dtp-grip { display: none; }

    /* ---- the place list, full screen ---------------------------------------------------
       A dropdown under the field left two or three rows of seventy-three places visible once
       the keyboard came up — and the only way out was to tap "outside", which is exactly
       where the keyboard was. Same shape as the date panel, so the two fields beside each
       other behave alike. */
    .lb {
      position: fixed; inset: 0; z-index: 100;
      width: auto; max-width: none; max-height: none; height: 100%;
      margin: 0; padding: 0 1rem calc(1rem + env(safe-area-inset-bottom));
      border: 0; border-radius: 0; box-shadow: none;
      overflow-y: auto; overscroll-behavior: contain;
    }
    .lb-top { margin: 0 -1rem; }
    .lb-head {
      display: flex; align-items: center; justify-content: space-between; gap: .5rem;
      padding: .7rem .35rem .7rem 1rem;
      padding-top: calc(.7rem + env(safe-area-inset-top));
      background: #fff; border-bottom: 1px solid var(--color-border);
    }
    /* Big enough to be the obvious way out, and off to the right where a panel's close
       normally sits. 48px of target for a 30px mark. */
    .lb-x {
      display: inline-flex; align-items: center; justify-content: center;
      width: 48px; height: 48px; flex: 0 0 auto; margin: 0; padding: 0;
      border: 0; background: none; cursor: pointer; color: var(--navy);
      -webkit-tap-highlight-color: transparent;
    }
    .lb-x svg { width: 30px; height: 30px; fill: currentColor; }
    .lb-x:active svg { opacity: .55; }
    .lb-head-t {
      min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
      font-size: 1.05rem; font-weight: 700; color: var(--navy);
    }
    /* Under the header rather than at the very top, so it stays reachable while scrolling. */
    .lb .lb-search { margin: 0 0 .2rem; padding: .6rem 1rem; border-radius: 0; }
    .lb .lb-row { min-height: 48px; }

    /* Nothing to page through when every month is already below the last one. The two boxes
       beside them stay: in list mode they stop redrawing and start jumping. */
    .dtp-nav { display: none; }
    /* The weekday strip belongs to all eighteen grids, so it follows them down the screen.
       Script sets its top to the height of the sticky header above it. */
    .dtp-wd {
      position: sticky; z-index: 3; top: 0;
      margin: 0 -1rem; padding: .4rem 1rem;
      background: #fff; border-bottom: 1px solid var(--color-border);
    }
    .dtp-head {
      position: sticky; top: 0; z-index: 4;
      margin: 0 -1rem; padding: .7rem .35rem .7rem 1rem;
      padding-top: calc(.7rem + env(safe-area-inset-top));
      background: #fff; border-bottom: 1px solid var(--color-border);
    }
    /* Same mark, same size, same corner as the place list's. */
    .dtp-x {
      display: inline-flex; align-items: center; justify-content: center;
      width: 48px; height: 48px; flex: 0 0 auto; margin: 0; padding: 0;
      border: 0; background: none; cursor: pointer; color: var(--navy);
      -webkit-tap-highlight-color: transparent;
    }
    .dtp-x svg { width: 30px; height: 30px; fill: currentColor; }
    .dtp-x:active svg { opacity: .55; }
    .dtp-title { margin: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 1.05rem; }
    .dtp-note { margin-top: .7rem; }
    .dtp-time { flex-wrap: wrap; }
    .dtp-save { width: 100%; margin: .5rem 0 0; }
    .bf-div { margin: .45rem 0; }
    /* 15mm, the height every pill and the "add return trip" button already stand at. At
       48px this one sat 9px short of the button beside it, which reads as a mistake
       rather than a hierarchy. */
    .bf-book { min-height: 15mm; 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; }
  }
