@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Manrope:wght@400;500;600;700;800&display=swap');

:root{--ink:#171b25;--muted:#686b73;--blue-text:#25304c;--blue-deep:#182137;--blue:#a7b9e7;--sand:#f5f3ec;--paper:#fff;--line:#e1e3e8;--orange:#e17a48;--radius:18px;--shadow:0 18px 45px rgba(26,33,49,.09)}
*{box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:92px}
body{margin:0;background:var(--paper);color:var(--ink);font-family:'DM Sans',Arial,sans-serif;font-size:15px;line-height:1.55}
a{color:inherit;text-decoration:none}
button,input,select{font:inherit}
.container{width:min(1160px,calc(100% - 48px));margin-inline:auto}
.site-header{height:78px;padding:0 max(24px,calc((100% - 1240px)/2));display:flex;align-items:center;gap:42px;border-bottom:1px solid rgba(255,255,255,.12);background:var(--blue-deep);color:white;position:relative;z-index:5}
.brand{display:flex;align-items:center;gap:8px;font-family:Manrope,sans-serif;font-size:19px;font-weight:800;letter-spacing:-.7px;white-space:nowrap}.brand>span:last-child{color:var(--blue);margin-left:-8px}.brand-mark{display:grid;place-items:center;width:32px;height:32px;border-radius:10px;background:var(--blue);color:var(--blue-deep);font-size:17px}.brand-name{color:inherit;margin-left:0}.brand-logo{height:34px;width:auto;max-width:min(220px,45vw);object-fit:contain;display:block}.main-nav{display:flex;align-items:center;gap:31px;margin:auto}.main-nav a{color:rgba(255,255,255,.78);font-size:13px;font-weight:600;transition:color .2s}.main-nav a:hover,.header-phone:hover{color:var(--blue)}.header-phone{font-size:13px;font-weight:700}.menu-toggle{display:none}
.hero{min-height:530px;background:#17213a url('https://images.unsplash.com/photo-1533105079780-92b9be482077?auto=format&fit=crop&w=2000&q=85') center 48%/cover;position:relative;isolation:isolate;overflow:hidden;color:#fff;display:flex;align-items:center;padding:72px max(24px,calc((100% - 1160px)/2)) 104px}.hero-video{position:absolute;z-index:-2;inset:0;overflow:hidden;pointer-events:none}.hero-video iframe{position:absolute;left:50%;top:50%;width:max(100vw,177.78vh);height:max(100vh,56.25vw);transform:translate(-50%,-50%);border:0}.hero-copy{max-width:640px}.hero .eyebrow,.hero h1,.hero h1 em,.hero-lede,.hero-points,.hero-note p,.hero .text-link{text-shadow:0 2px 18px rgba(6,12,26,.6),0 1px 3px rgba(6,12,26,.75)}.eyebrow{text-transform:uppercase;letter-spacing:1.9px;color:#7b8aaf;font-size:10px;font-weight:700;margin:0 0 14px}.hero h1,.section h2,.faq-layout h2,.contact-section h2{font-family:Manrope,sans-serif;letter-spacing:-2px;line-height:1.08;font-weight:700}.hero h1{font-size:clamp(43px,6vw,70px);margin:0 0 20px}.hero h1 em{font-style:normal;color:var(--blue)}.hero-lede{font-size:16px;max-width:490px;color:rgba(255,255,255,.76);line-height:1.75}.hero-actions{display:flex;align-items:center;gap:25px;margin-top:29px}.button{display:inline-flex;align-items:center;justify-content:center;gap:22px;min-height:48px;padding:0 21px;border:0;border-radius:9px;font-weight:700;font-size:12px;cursor:pointer;transition:transform .2s,background .2s}.button:hover{transform:translateY(-2px)}.button-light{background:var(--blue);color:var(--blue-deep)}.button-dark{background:var(--blue-text);color:#fff}.button-dark:hover{background:var(--blue-deep)}.text-link{font-size:12px;font-weight:700;color:#fff}.text-link span{color:var(--blue);padding-left:4px}.hero-points{display:flex;gap:22px;margin-top:43px;color:rgba(255,255,255,.7);font-size:10px;font-weight:600}.hero-points span:first-letter{color:var(--blue)}.hero-note{position:absolute;right:max(38px,calc((100% - 1110px)/2));bottom:93px;border:1px solid rgba(255,255,255,.28);padding:14px 19px;border-radius:12px;background:rgba(255,255,255,.1);backdrop-filter:blur(12px);display:flex;gap:12px;align-items:center}.hero-note p{font-size:11px;line-height:1.55;margin:0;color:rgba(255,255,255,.9)}.note-icon{color:var(--blue);font-size:22px}
.booking-panel{position:relative;margin-top:-43px;z-index:2;border-radius:var(--radius);background:#fff;box-shadow:var(--shadow);overflow:hidden}.booking-tabs{display:flex;gap:3px;padding:0 26px;border-bottom:1px solid var(--line)}.booking-tab{height:55px;padding:0 18px;border:0;border-bottom:2px solid transparent;background:none;color:#787b81;font-size:12px;font-weight:700;cursor:pointer}.booking-tab.is-active{border-color:var(--orange);color:var(--blue-deep)}.booking-content{padding:22px 26px 24px}.search-panel{display:none;grid-template-columns:1.3fr 1fr 1fr auto;align-items:end;gap:13px}.search-panel.is-active{display:grid}.search-panel label{display:grid;gap:6px;color:#585b63;font-size:10px;font-weight:700}.search-panel select,.search-panel input{width:100%;height:44px;padding:0 12px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);outline:none;font-size:12px}.search-panel select:focus,.search-panel input:focus{border-color:#8c94a7;box-shadow:0 0 0 3px rgba(140,148,167,.14)}.search-panel .button{white-space:nowrap}.search-panel:has([name=participants]){grid-template-columns:1.7fr 1fr .8fr auto}.search-feedback{grid-column:1/-1;min-height:0;margin:0;color:var(--blue-text);font-size:11px}

/* The transfer panel is two autocomplete fields, a swap control, a date and a
   button -- five cells, where the older dropdown version had four. The swap sits
   on the gap between the two ends rather than taking a cell of its own, so it
   reads as the relationship between them. */
.transfer-search{grid-template-columns:1.15fr auto 1.15fr 1fr auto;align-items:start}
.transfer-search .geo-field{align-self:stretch}
.transfer-search .geo-list{width:auto}
/* The date label and the button align with the inputs, not with the taller
   autocomplete cells that now sit beside them. */
.transfer-search>label{align-self:start}
.transfer-search>.button{align-self:start;height:44px}
.transfer-search .geo-attribution,.transfer-search .search-feedback{grid-column:1/-1}
/* The list of published transfers leads the panel on a row of its own, above the
   two ends it fills in. */
.transfer-search .transfer-route-field{grid-column:1/-1}
.notice{margin:22px 0 0;padding:13px 17px;border:1px solid #ebd4ac;background:#fff9ed;border-radius:10px;color:#6f5222;font-size:13px}
.section{padding-block:88px}.section-tint{background:var(--sand);padding-block:82px}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:30px;margin-bottom:32px}.section-heading h2,.faq-layout h2,.contact-section h2{font-size:clamp(30px,4vw,43px);margin:0}.section-heading>p{max-width:390px;color:var(--muted);font-size:13px;margin:0 0 4px}.category-row{display:flex;flex-wrap:wrap;gap:8px;margin:-7px 0 23px}.category-pill{padding:6px 11px;border-radius:30px;border:1px solid var(--line);color:#686b73;font-size:10px;font-weight:600}.card-grid{display:grid;gap:18px}.vehicle-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.vehicle-card,.route-card,.tour-card{background:#fff;border:1px solid var(--line);border-radius:13px;overflow:hidden;transition:transform .22s,box-shadow .22s}.vehicle-card:hover,.route-card:hover,.tour-card:hover{transform:translateY(-4px);box-shadow:var(--shadow)}.vehicle-image{height:174px;background:#eff0f3;display:grid;place-items:center;position:relative;overflow:hidden}.vehicle-image img{width:100%;height:100%;object-fit:cover;mix-blend-mode:multiply}.vehicle-image>span:not(.image-badge){color:#9a9da5;font-size:11px}.image-badge{position:absolute;top:12px;left:12px;background:var(--blue);border-radius:20px;padding:5px 9px;font-size:9px;font-weight:700;color:var(--blue-deep)}.card-body{padding:17px}.card-kicker{margin:0 0 5px;color:#878a91;text-transform:uppercase;letter-spacing:1px;font-size:9px;font-weight:700}.card-body h3,.route-card h3{font-family:Manrope,sans-serif;font-size:17px;line-height:1.3;letter-spacing:-.4px;margin:0}.vehicle-specs{display:flex;flex-wrap:wrap;gap:6px;margin:13px 0 17px}.vehicle-specs span{padding:4px 7px;background:#f2f3f6;border-radius:4px;color:#666971;font-size:9px}.card-bottom{display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px solid #ebecf0;padding-top:13px}.price{display:flex;align-items:baseline;gap:5px;margin:0}.price strong{font-family:Manrope,sans-serif;font-size:19px;letter-spacing:-.6px}.price span{color:#828690;font-size:9px}
/* The stay total sits under the daily rate once both dates are known. It is the
   number the guest actually pays, so it is given more weight than the per-day
   figure above it while staying visually secondary to the vehicle name. */
.price-block{display:grid;gap:2px;min-width:0}.price-total{color:var(--blue-text);font-size:11px;font-weight:700;line-height:1.4}.price-total[hidden]{display:none}.arrow-link{width:31px;height:31px;border-radius:50%;display:grid;place-items:center;background:#e3e7f2;color:var(--blue-text);font-size:16px}.feature-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:30px;padding:20px 22px;background:#f4f5f8;border-radius:12px}.feature-strip>div{display:flex;gap:11px;align-items:flex-start}.feature-check{width:21px;height:21px;flex:0 0 21px;display:grid;place-items:center;border-radius:50%;background:#cfd7eb;color:#434c64;font-size:11px}.feature-strip p{margin:0;display:grid;gap:3px}.feature-strip strong{font-size:11px}.feature-strip small{font-size:10px;color:#757880;line-height:1.5}.feature-strip-three{grid-template-columns:repeat(4,1fr)}
.route-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.route-card{padding:19px;background:#fff}.route-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:17px}.route-label{color:#545c70;text-transform:uppercase;letter-spacing:1px;font-size:9px;font-weight:700}.route-distance,.duration{color:#7f828a;font-size:10px}.route-card h3{font-size:15px}.route-arrow{padding:0 7px;color:var(--orange)}.route-card>p{min-height:42px;margin:11px 0 17px;color:var(--muted);font-size:11px}.route-card .card-bottom{padding-top:12px}.route-card .price strong{font-size:17px}.card-cta{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;height:31px;padding:0 14px;border-radius:16px;background:var(--blue-text);color:#fff;font-size:11px;font-weight:700;text-decoration:none;white-space:nowrap;transition:background .2s,transform .2s}.card-cta:hover{background:var(--blue-deep);transform:translateY(-2px)}.transfer-fleet{display:grid;grid-template-columns:1.5fr repeat(auto-fit,minmax(130px,1fr));align-items:center;gap:18px;padding:22px 25px;margin-top:24px;border-radius:12px;background:#e2e5ec}.transfer-fleet h3{margin:0;font-family:Manrope,sans-serif;font-size:16px}.transfer-fleet p:not(.eyebrow){margin:6px 0 0;color:var(--muted);font-size:11px}.transfer-fleet .eyebrow{margin-bottom:6px}.fleet-type{display:grid;gap:3px;border-left:1px solid #cbcfd8;padding-left:17px}.fleet-type strong{font-size:12px}.fleet-type span,.fleet-type small{font-size:10px;color:#767981}.tour-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.tour-image{height:174px;position:relative;background:#e3e6ed;overflow:hidden}.tour-image img{width:100%;height:100%;object-fit:cover}.tour-region{position:absolute;left:12px;bottom:12px;padding:5px 9px;background:rgba(24,33,55,.87);border-radius:20px;color:white;font-size:9px}.tour-card .card-body h3{font-size:15px;min-height:39px}.tour-card .card-body>p{min-height:49px;margin:9px 0 16px;color:var(--muted);font-size:11px}.tour-card .price{display:grid;gap:0}.tour-card .price strong{font-size:17px}.tour-card .price span{font-size:9px}.tour-card .arrow-link{flex:0 0 31px}
/* Whole excursion card is one link to its detail page. */
.tour-link{display:block;height:100%;color:inherit}
.tour-link:hover{text-decoration:none}
.tour-link:hover .tour-image img{transform:scale(1.04)}
.tour-image img{transition:transform .3s}
/* Car image opens the rental request form.
   No height:100% here: this link wraps only the photo, and the grid card stretches
   its children, so a percentage height would leave a blank band under the image. */
.vehicle-image-link{display:block;color:inherit}
.vehicle-image-link:hover{text-decoration:none}
.vehicle-image-link:hover img{transform:scale(1.04)}
.vehicle-image img{transition:transform .3s}

.section-dark{background:var(--blue-deep);color:#fff;padding-block:78px}.faq-layout{display:grid;grid-template-columns:.75fr 1.25fr;gap:80px}.faq-layout .eyebrow{color:var(--blue)}.faq-intro{max-width:280px;color:rgba(255,255,255,.6);font-size:12px;margin-top:17px}.faq-list details{border-bottom:1px solid rgba(255,255,255,.15);padding:14px 0}.faq-list summary{display:flex;justify-content:space-between;gap:20px;list-style:none;cursor:pointer;font-size:12px;font-weight:600}.faq-list summary::-webkit-details-marker{display:none}.faq-list summary span{color:var(--blue);font-size:17px}.faq-list details[open] summary span{transform:rotate(45deg)}.faq-list details p{margin:10px 25px 2px 0;color:rgba(255,255,255,.67);font-size:11px;line-height:1.7}
.contact-section{padding-block:70px;display:flex;justify-content:space-between;align-items:center;gap:40px}.contact-section h2{font-size:36px}.contact-section>div:first-child>p:last-child{max-width:520px;color:var(--muted);font-size:12px}.contact-actions{display:grid;justify-items:start;gap:8px}.contact-actions .button{margin-bottom:5px}.contact-phone{font-weight:700;font-size:14px}.contact-actions>span{color:var(--muted);font-size:10px}.site-footer{min-height:126px;padding:26px max(24px,calc((100% - 1160px)/2));background:#131b2e;color:#fff;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:20px}.brand-footer{font-size:16px}.brand-footer .brand-mark{width:28px;height:28px}.brand-footer .brand-logo{height:28px;max-width:170px}.site-footer p{color:rgba(255,255,255,.55);font-size:11px}.site-footer small{color:rgba(255,255,255,.45);font-size:9px;text-align:right}
[hidden]{display:none!important}
@media(max-width:900px){.site-header{gap:20px}.main-nav{gap:18px}.vehicle-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.route-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.search-panel,.search-panel:has([name=participants]){grid-template-columns:repeat(2,minmax(0,1fr))}.search-panel .button{width:100%}
/* The two ends stay on one row with the swap between them; the date and the
   button drop underneath rather than forcing the fields to stay in one column. */
.transfer-search{grid-template-columns:1fr auto 1fr}.transfer-search>label{grid-column:1/3}.transfer-search>.button{grid-column:3/-1;grid-row:2}.transfer-search .search-panel,.transfer-search .button{width:auto}.transfer-fleet{grid-template-columns:repeat(2,1fr)}.transfer-fleet>div:first-child{grid-column:1/-1}.faq-layout{gap:40px}}
@media(max-width:620px){.container{width:min(100% - 32px,520px)}.site-header{height:66px;padding-inline:16px;gap:12px}.brand{font-size:17px;margin-right:auto}.menu-toggle{display:block;border:1px solid rgba(255,255,255,.25);border-radius:7px;background:transparent;color:#fff;padding:7px 10px;font-size:11px}.main-nav{display:none;position:absolute;left:0;right:0;top:66px;padding:15px 20px 20px;background:var(--blue-deep);align-items:flex-start;flex-direction:column;gap:14px}.main-nav.is-open{display:flex}.header-phone{display:none}.hero{min-height:510px;padding:60px 22px 118px;background-position:58% center}.hero h1{font-size:47px}.hero-lede{font-size:14px}.hero-note{right:18px;bottom:27px}.hero-points{gap:12px;flex-wrap:wrap;margin-top:30px;font-size:9px}.booking-panel{width:calc(100% - 24px);margin-top:-25px}.booking-tabs{padding-inline:10px}.booking-tab{flex:1;padding-inline:7px;font-size:10px}.booking-content{padding:16px}.search-panel,.search-panel:has([name=participants]){grid-template-columns:1fr 1fr;gap:10px}.search-panel label:first-child{grid-column:1/-1}.search-panel .button{grid-column:1/-1}
/* Stacked, the swap turns into a full-width rule between the two ends, so it
   still reads as "these two are reversible". */
.transfer-search{grid-template-columns:1fr;gap:10px}.transfer-search>label,.transfer-search>.button{grid-column:1/-1;grid-row:auto}.transfer-search>.button{width:100%}.section,.section-tint{padding-block:58px}.section-heading{display:block;margin-bottom:23px}.section-heading h2,.faq-layout h2{font-size:32px}.section-heading>p{margin-top:12px;font-size:12px}.vehicle-grid,.route-grid,.tour-grid{grid-template-columns:1fr}.vehicle-image,.tour-image{height:205px}.feature-strip,.feature-strip-three{grid-template-columns:1fr 1fr;gap:15px;padding:17px}.transfer-fleet{grid-template-columns:1fr 1fr;padding:18px;gap:15px}.fleet-type{padding-left:12px}.faq-layout{grid-template-columns:1fr;gap:19px}.faq-intro{margin-top:9px}.contact-section{padding-block:50px;display:grid}.contact-section h2{font-size:32px}.site-footer{grid-template-columns:1fr;gap:7px;padding:25px 18px}.site-footer small{text-align:left}.site-footer p{margin:2px 0}}
.booking-main{min-height:calc(100vh - 204px);padding-block:35px 75px}.back-link{color:#5d626e;font-weight:700;font-size:11px}.booking-title{margin:30px 0 24px}.booking-title h1{font:700 clamp(29px,4vw,42px)/1.15 Manrope,sans-serif;letter-spacing:-1.3px;margin:0}.booking-title>p:last-child{color:var(--muted);font-size:12px}.booking-layout{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(300px,.8fr);gap:22px;align-items:start}.booking-col-form{padding:27px;background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 8px 28px rgba(25,32,48,.04)}.booking-col-side{display:grid;gap:18px;align-content:start;min-width:0}.booking-actions{grid-column:1/-1;display:grid;gap:10px}.booking-col-form h2,.quote-card h2{font:700 17px Manrope,sans-serif;margin:0 0 15px}.booking-col-form h2:not(:first-of-type){margin-top:27px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px}.form-grid label{display:grid;gap:6px;font-size:10px;font-weight:700;color:#595d66}.form-grid label>span{font-weight:400;color:#888b91}.form-grid input,.form-grid select,.form-grid textarea{width:100%;border:1px solid #dcdfe5;border-radius:7px;padding:11px 12px;background:#fff;color:var(--ink);font:400 12px 'DM Sans',sans-serif;outline:0}.form-grid input:focus,.form-grid select:focus,.form-grid textarea:focus{border-color:#8d94a4;box-shadow:0 0 0 3px rgba(140,148,167,.13)}.form-grid textarea{resize:vertical}.field-wide{grid-column:1/-1}.submit-booking{margin-top:0}.submit-booking:disabled{opacity:.65;cursor:wait}.form-feedback{margin:0;color:#36425f;font-size:12px;line-height:1.6}.route-summary{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:12px 14px;margin-bottom:15px;border-radius:8px;background:#eef0f6;font-size:11px}.route-summary strong{white-space:nowrap}.quote-card{padding:27px;background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 8px 28px rgba(25,32,48,.04);position:sticky;top:22px}.quote-card .eyebrow{margin-bottom:7px}.quote-card h2{font-size:20px}.quote-item{font-size:12px;font-weight:600}.quote-lines{display:grid;gap:0;margin:14px 0 0;padding:0}.quote-line{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:7px 0;font-size:11px}.quote-line+.quote-line{border-top:1px solid #eaecf1}.quote-line dt{color:#595d66;min-width:0}.quote-line dd{margin:0;font-weight:700;white-space:nowrap}.quote-line.is-extra dt{padding-left:12px;color:#5d626e}.quote-line.is-sum dt{font-weight:700;color:var(--ink)}.quote-line.is-sum dd{color:var(--blue-text)}.quote-total{display:flex;align-items:center;justify-content:space-between;border-block:1px solid var(--line);padding:16px 0;margin:14px 0}.quote-total span{color:var(--muted);font-size:11px}.quote-total strong{font:700 24px Manrope,sans-serif}.quote-note{color:#525b71;font-size:11px;line-height:1.6}.quote-disclaimer{color:#81848a;font-size:10px;line-height:1.6;border-top:1px solid var(--line);padding-top:14px;margin-top:18px}.quote-card .contact-phone{font-size:11px}
@media(max-width:720px){.booking-layout{grid-template-columns:1fr}.booking-col-side{grid-row:2}.quote-card{position:static}.booking-col-form,.quote-card{padding:20px}}

/* Voucher popup shown on public/booking.php once a request is stored. A native
   <dialog> supplies the backdrop, focus trap and Esc-to-close, so only the card
   itself is styled here. The [open] selector also covers the no-showModal
   fallback, which opens the element as a plain block. */
.voucher-modal{width:min(430px,calc(100% - 32px));padding:0;border:0;border-radius:16px;background:transparent;color:var(--ink);box-shadow:0 24px 60px rgba(16,23,40,.28)}
.voucher-modal::backdrop{background:rgba(16,23,40,.55);backdrop-filter:blur(2px)}
.voucher-modal-inner{padding:32px 30px 26px;border-radius:16px;background:#fff;text-align:center}
.voucher-modal-mark{display:grid;place-items:center;width:52px;height:52px;margin:0 auto 15px;border-radius:50%;background:#e4e8f3;color:var(--blue-deep);font-size:25px;font-weight:700;line-height:1}
.voucher-modal h2{margin:0 0 9px;font:800 21px/1.25 Manrope,sans-serif;letter-spacing:-.6px}
.voucher-modal-text{margin:0 0 15px;color:var(--muted);font-size:12px;line-height:1.65}
.voucher-modal-codelabel{margin:0 0 7px;color:var(--muted);font-size:11px;font-weight:700;letter-spacing:.4px;text-transform:uppercase}
/* The code is the one thing the client must be able to read off the screen, so
   it is the largest text in the popup. */
.voucher-modal-code{margin:0 0 13px;padding:14px 10px;border:1px dashed #b3b9c9;border-radius:11px;background:#f1f3f8;font:800 27px/1.1 Manrope,sans-serif;letter-spacing:2.5px;color:var(--blue-deep);word-break:break-all}
.voucher-modal-note{margin:0 0 20px;color:var(--muted);font-size:11px;line-height:1.6}
.voucher-modal-actions{display:grid;gap:9px}
.voucher-modal-actions .button{width:100%}
.button-ghost-dark{border:1px solid #dcdfe5;background:#fff;color:var(--ink)}
.button-ghost-dark:hover{border-color:#949eb8;background:#f5f6fa;transform:translateY(-2px)}
.voucher-modal-close{padding:0;border:0;background:none;color:var(--muted);font-size:11px;font-weight:700;cursor:pointer;text-decoration:underline}
.voucher-modal-close:hover{color:var(--ink)}
@media(max-width:620px){.voucher-modal-inner{padding:26px 20px 22px}.voucher-modal-code{font-size:23px;letter-spacing:1.5px}}
/* Rental extras picker on public/booking.php */
.booking-extras{margin:0;padding:16px 18px;border:1px solid #dcdfe5;border-radius:14px;background:#fff;box-shadow:0 8px 28px rgba(25,32,48,.04)}
.booking-extras legend{padding:0 6px;color:var(--ink);font:700 14px Manrope,sans-serif}
.booking-extras legend span{color:#888b91;font:400 11px 'DM Sans',sans-serif}
.booking-extras-intro{margin:0 0 12px;color:var(--muted);font-size:11px;line-height:1.6}
.booking-extras ul{display:grid;gap:7px;margin:0;padding:0;list-style:none}
.booking-extras label{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:10px;padding:9px 11px;border:1px solid #e2e5eb;border-radius:8px;background:#fff;cursor:pointer;transition:border-color .15s,background .15s}
.booking-extras label:hover{border-color:#b3b9c9}
.booking-extras input{width:16px;height:16px;accent-color:var(--blue-text);cursor:pointer}
.booking-extras-name{font-size:12px;font-weight:600;color:var(--ink)}
.booking-extras-price{font-size:11px;color:#5d626e;font-weight:600;white-space:nowrap}
@media(max-width:620px){.booking-page .site-footer{margin-top:0}.form-grid{grid-template-columns:1fr}.field-wide{grid-column:auto}.route-summary{align-items:flex-start;flex-direction:column}.booking-extras label{grid-template-columns:auto 1fr}.booking-extras-price{grid-column:2}}
/* FAQ answers are split into one tab per service. */
.faq-tabs{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:12px}
.faq-tab{padding:8px 15px;border:1px solid rgba(255,255,255,.22);border-radius:30px;background:transparent;color:rgba(255,255,255,.72);font-size:11px;font-weight:700;cursor:pointer;transition:background .2s,color .2s,border-color .2s}
.faq-tab:hover{border-color:rgba(255,255,255,.5);color:#fff}
.faq-tab[aria-selected="true"]{background:var(--blue);border-color:var(--blue);color:var(--blue-deep)}
.faq-tab:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.faq-panels{min-height:120px}
@media(max-width:620px){.faq-tabs{gap:6px}.faq-tab{padding:7px 12px;font-size:10px}}

/* SEO copy blocks. The paragraphs carry the target keywords, so they read as a
   short sales pitch rather than a keyword list: three columns on desktop, stacked
   on mobile, matching the rest of the page rhythm. */
.seo-intro{padding-block:56px 8px}
.seo-intro-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:34px}
.seo-intro-grid h2{font-family:Manrope,sans-serif;font-size:17px;letter-spacing:-.5px;line-height:1.35;margin:0 0 9px}
.seo-intro-grid p{margin:0;color:var(--muted);font-size:12.5px;line-height:1.75}
.seo-copy{max-width:760px;margin:0 0 26px;color:var(--muted);font-size:13px;line-height:1.8}
.seo-copy h2{font-family:Manrope,sans-serif;font-size:19px;letter-spacing:-.5px;margin:0 0 10px;color:var(--ink)}
.seo-copy strong{color:var(--blue-deep);font-weight:700}
@media(max-width:900px){.seo-intro-grid{grid-template-columns:1fr;gap:24px}}

/* Editable dropdown (public/assets/js/editable-select.js) for the home-page search
   panels. The agency publishes ~38 pickup points and 30 destinations, and on a
   phone that list is unusable one flick at a time, so the fields filter as the
   visitor types. Typing a place that is not published is allowed on purpose: the
   pickup point is whatever the guest says it is, and the agency confirms it.

   The widget keeps the original <select> in the DOM as the backing store, hidden
   and with its own required removed, so the value keeps reaching the code that
   already reads it (form.elements.pickup.value) and through the query string into
   booking.php. Without JS the class is never applied and the native select renders
   as it always did. */
.editable-select{position:relative}
.editable-select .editable-select-native{display:none}
/* The panel already styles .search-panel input at (0,1,1), so these selectors need
   one more class to win without relying on source order. */
.editable-select .editable-select-input{width:100%;height:44px;padding:0 34px 0 12px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);outline:none;font-size:12px}
.editable-select .editable-select-input::placeholder{color:#9a9da5}
.editable-select .editable-select-input:focus{border-color:#8c94a7;box-shadow:0 0 0 3px rgba(140,148,167,.14)}
.editable-select.is-custom .editable-select-input{border-color:#d9b393;border-style:dashed}
.editable-select .editable-select-toggle{position:absolute;top:0;right:0;width:34px;height:44px;display:grid;place-items:center;padding:0;border:0;background:none;color:#787b81;font-size:11px;line-height:1;cursor:pointer;transition:transform .15s ease}
.editable-select .editable-select-toggle:hover{color:var(--ink)}
.editable-select .editable-select-toggle:focus-visible{outline:2px solid #8c94a7;outline-offset:-2px}
.editable-select.is-open .editable-select-toggle{transform:rotate(180deg)}
/* position:fixed is what keeps the popup out of .booking-panel's overflow:hidden;
   the list is a direct child of <body> and is placed from the field's own rect. */
.editable-select-list{position:fixed;z-index:60;left:0;top:0;width:0;max-height:216px;margin:0;padding:5px;overflow-y:auto;overscroll-behavior:contain;list-style:none;border:1px solid var(--line);border-radius:9px;background:#fff;box-shadow:0 16px 38px rgba(26,33,49,.16)}
.editable-select-option{display:flex;align-items:center;gap:8px;padding:8px 9px;border-radius:6px;color:var(--ink);font-size:12px;cursor:pointer}
.editable-select-option:hover,.editable-select-option.is-active{background:#eef1f8;color:var(--blue-deep)}
.editable-select-option[aria-selected="true"]{font-weight:700}
/* The "use what I typed" row is a real option, so it is styled apart rather than
   looking like an error message. */
.editable-select-create{padding:8px 9px;border-radius:6px;color:var(--blue-text);font-size:11.5px;font-weight:700;cursor:pointer}
.editable-select-create:hover,.editable-select-create.is-active{background:#eef1f8}
.editable-select-create span{font-weight:400;color:var(--muted)}
.editable-select-empty{padding:9px;color:var(--muted);font-size:11.5px;font-style:italic}
.editable-select-status{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@media(max-width:620px){.editable-select-list{max-height:184px}}

/* Currency switcher (public/assets/js/currency.js). It is injected into .main-nav
   so the one definition covers every public page whose header is written out by
   hand. Three fixed choices do not need the filtering widget above, and a native
   select here is the right weight: it works on a phone, it is announced
   correctly, and the chosen currency is remembered without any of it showing up
   in the URL. It is kept disabled until a rate table is in hand, so it never
   relabels a number it cannot convert. */
.currency-switch{display:flex;align-items:center}
.currency-switch-select{height:30px;padding:0 6px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--ink);font:700 11px 'DM Sans',sans-serif;cursor:pointer}
.currency-switch-select:disabled{opacity:.5;cursor:not-allowed}
.currency-switch-select:focus-visible{outline:2px solid #8c94a7;outline-offset:2px}
/* The header is dark on the home page hero and light elsewhere, so the switcher
   takes its border from the surface it lands on rather than assuming one. */
.site-header .currency-switch-select{border-color:rgba(23,27,37,.16)}
@media(max-width:620px){.currency-switch-select{height:28px;font-size:10px}}
/* ---------------------------------------------------------------- route cards
   Redesigned as pickup / drop-off, the journey between them, then one priced
   vehicle row per class. The old .route-top/.route-distance/.route-arrow rules
   are left in place above because .transfer-fleet still uses part of the group. */

.route-card{display:flex;flex-direction:column;gap:.85rem}

.route-endpoints{
  display:flex;flex-direction:column;gap:.6rem;
  border:1px solid rgba(23,27,37,.12);border-radius:14px;
  padding:.85rem .95rem;background:rgba(255,255,255,.66);
}
.route-endpoint{display:flex;align-items:flex-start;gap:.6rem;margin:0}
/* A plain dot rather than an emoji pin: it inherits the panel's colour and
   cannot shift the row's baseline the way a glyph from another font does. */
.route-pin{
  flex:0 0 auto;width:9px;height:9px;margin-top:.45rem;border-radius:50%;
  background:#8c94a7;box-shadow:0 0 0 3px rgba(140,148,167,.18);
}
.route-pin.is-destination{background:#171b25;box-shadow:0 0 0 3px rgba(23,27,37,.14)}
.route-endpoint-text{display:flex;flex-direction:column;min-width:0}
.route-endpoint-text small{
  font-size:11px;letter-spacing:.08em;text-transform:uppercase;
  color:#6b7284;font-weight:600;
}
/* Long airport and resort names wrap to two lines instead of stretching the
   card or clipping the destination. */
.route-endpoint-text strong{font-size:.95rem;line-height:1.35;overflow-wrap:anywhere}

.route-journey{
  display:flex;justify-content:center;align-items:center;
  margin:0;font-size:.8rem;font-weight:600;color:#6b7284;
}
.route-journey::before,.route-journey::after{content:"";width:1px;height:14px;background:rgba(23,27,37,.14);margin:0 .6rem}

.route-options{display:flex;flex-direction:column;gap:.5rem;margin-top:auto}
.route-option{
  display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:.75rem;
  padding:.7rem .8rem;border:1px solid rgba(23,27,37,.12);border-radius:12px;
  background:#fff;
}
.route-option-car{display:flex;flex-direction:column;min-width:0}
.route-option-car strong{font-size:.95rem;line-height:1.25}
.route-option-car small{font-size:.78rem;color:#6b7284}
/* The amount is the reason the vehicle rows are separate, so it is right
   aligned and the digit width is fixed to keep the rows from twitching. */
.route-option-price{margin:0;text-align:right}
.route-option-price strong{
  display:block;font-size:1.05rem;white-space:nowrap;
  font-variant-numeric:tabular-nums;
}
.route-option .card-cta{white-space:nowrap}

@media(max-width:520px){
  .route-option{grid-template-columns:1fr auto;row-gap:.55rem}
  .route-option .card-cta{grid-column:1/-1;text-align:center}
}

/* Address autocomplete. The two ends of a transfer are searched side by side,
   so they are a grid of their own rather than two more cells in .form-grid.
   position:relative on the field is what lets the suggestion list float over
   the fields below it instead of pushing the form down as it opens. */
.geo-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px;margin-top:13px}
.geo-field{position:relative;display:grid;gap:6px;min-width:0}
.geo-field label{font-size:10px;font-weight:700;color:#595d66}
.geo-field label span{font-weight:400;color:#888b91}
.geo-field>input{width:100%;border:1px solid #dcdfe5;border-radius:7px;padding:11px 12px;background:#fff;color:var(--ink);font:400 12px 'DM Sans',sans-serif;outline:0}
/* The chosen-place ring is the only cue that the address has coordinates behind
   it, and it has to survive being the field that is not focused. */
.geo-field>input:focus{border-color:#8d94a4;box-shadow:0 0 0 3px rgba(140,148,167,.13)}
.geo-field.is-chosen>input{border-color:#9fb59a;background:#fbfdfa}
/* The row of controls that shares the input's line: "my location" on the left,
   clear on the right. Only rendered when the markup asks for them, so a field
   without them keeps the input's full width. */
.geo-tools{display:flex;align-items:center;gap:6px;margin-top:-2px}
.geo-tool{display:inline-flex;align-items:center;gap:5px;padding:0;border:0;background:none;color:var(--blue-text);font:700 10px 'DM Sans',sans-serif;cursor:pointer}
.geo-tool:hover{color:var(--blue-deep);text-decoration:underline}
.geo-tool:focus-visible{outline:2px solid #8c94a7;outline-offset:2px;border-radius:3px}
.geo-tool svg{width:12px;height:12px;fill:currentColor;flex:0 0 auto}
/* Spinner on the locate button while the browser is asking for a fix. The ring
   is what stops the button looking inert during the one moment a guest is
   waiting on the OS rather than on us. */
.geo-tool.is-busy svg{animation:geo-spin 900ms linear infinite}
@keyframes geo-spin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.geo-tool.is-busy svg{animation:none}}

/* position:fixed, not absolute: the widget is used inside .booking-panel, which
   sets overflow:hidden and would clip the list against the panel's rounded
   corner. The list is a child of <body> placed from the field's own rect. */
.geo-list{position:fixed;z-index:60;margin:0;padding:5px;max-height:264px;overflow-y:auto;overscroll-behavior:contain;list-style:none;border:1px solid #dcdfe5;border-radius:9px;background:#fff;box-shadow:0 16px 38px rgba(26,33,49,.16)}
.geo-option{display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:6px;cursor:pointer;font-size:12px}
/* is-active is driven by aria-activedescendant, so the keyboard highlight and
   the announced option are the same one by construction. */
.geo-option.is-active{background:#eef0f6}
.geo-option-icon{flex:0 0 auto;display:grid;place-items:center;width:15px;height:15px;color:#7b8aaf}
.geo-icon{width:100%;height:100%;fill:currentColor}
.geo-option-label{min-width:0;flex:1 1 auto;overflow-wrap:anywhere}
.geo-option-note{flex:0 0 auto;font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;color:#7b8aaf}
/* The three non-result lines: loading, empty and error. All of them are real
   states rather than "nothing", so each says something. */
.geo-option-empty{padding:9px 10px;font-size:11px;line-height:1.5;color:var(--muted)}
.geo-option-empty.is-busy{color:var(--blue-text)}
.geo-option-empty.is-error{color:#a33f2a}
.geo-status{font-size:10px;line-height:1.5;color:var(--muted);min-height:0}
.geo-status.is-busy{color:var(--blue-text)}
.geo-status.is-error{color:#a33f2a}
.geo-route{margin:13px 0 0;padding:11px 13px;border-radius:8px;background:#eef0f6;color:var(--blue-text);font-size:11px;font-weight:600}
/* Tabular figures keep the line from shifting as the numbers arrive. */
.geo-route.is-busy{color:#5d626e;font-weight:400}

/* The swap control sits between the two ends, so it is positioned on the grid
   gap rather than taking a cell of its own. */
.geo-swap{display:grid;place-items:center;width:30px;height:30px;padding:0;border:1px solid #dcdfe5;border-radius:50%;background:#fff;color:var(--blue-text);cursor:pointer;align-self:center;justify-self:center;transition:transform .18s ease,border-color .15s ease}
.geo-swap:hover{border-color:#8c94a7;color:var(--blue-deep)}
.geo-swap:focus-visible{outline:2px solid #8c94a7;outline-offset:2px}
.geo-swap svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}

/* OpenStreetMap's licence requires the attribution to be visible wherever the
   data is shown, which here means next to the fields rather than in the footer
   where nobody looks. */
.geo-attribution{display:block;margin-top:8px;color:#8b8f98;font-size:9px;line-height:1.5}
.geo-attribution a{color:inherit}

/* Stacked, the swap lands on its own row between the two fields, which is where
   it is wanted: it reads as "these two are reversible" rather than as a control
   that belongs to the field above it. */
@media(max-width:620px){.geo-grid{grid-template-columns:1fr}.geo-swap{width:100%;height:26px;border-radius:13px}.geo-swap svg{transform:rotate(90deg)}}

/* On-demand transfer booking ------------------------------------------------ */
/* The journey the guest is booking, restated at the top of the form. A distance
   is shown with the wording that says where it came from, because "48 km" means
   something quite different when the agency measured it and when a router did. */
.journey-facts{display:grid;gap:0;margin:0 0 4px;padding:0}
.journey-facts>div{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:9px 0;font-size:11px}
.journey-facts>div+div{border-top:1px solid #eaecf1}
.journey-facts dt{flex:0 0 auto;color:var(--muted)}
.journey-facts dd{margin:0;font-weight:700;text-align:right;min-width:0}
.journey-note{margin:10px 0 0;color:#81848a;font-size:10px;line-height:1.6}

/* One card per vehicle class rather than a select: every class stays visible with
   its own figure, so choosing is comparing. The radio itself is the control -- the
   card is its label -- which keeps it keyboard-operable and announced as a group
   without any of the scripting a custom widget would need. */
.vehicle-choices{display:grid;gap:9px;margin:0;padding:0;border:0}
.vehicle-choice{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:13px;padding:14px;border:1px solid #dcdfe5;border-radius:9px;background:#fff;cursor:pointer;transition:border-color .15s,box-shadow .15s}
.vehicle-choice:hover{border-color:#b9bfcc}
.vehicle-choice:focus-within{border-color:#8d94a4;box-shadow:0 0 0 3px rgba(140,148,167,.13)}
.vehicle-choice:has(input:checked){border-color:var(--ink);box-shadow:0 0 0 1px var(--ink)}
.vehicle-choice input{width:17px;height:17px;margin:0;accent-color:var(--ink)}
.vehicle-choice-body{display:grid;gap:3px;min-width:0}
.vehicle-choice-body strong{font-size:12px}
.vehicle-choice-body small{color:var(--muted);font-size:10px;line-height:1.5}
.vehicle-choice-price{text-align:right;white-space:nowrap}
.vehicle-choice-price strong{font:700 15px Manrope,sans-serif}
/* The same figure's return price, shown under the one-way one only while aller-retour
   is chosen. Stacked rather than side by side so the second amount reads as a second
   line of the same price, not as another class in the list. */
.vehicle-choice-price small{display:block;margin-top:3px;font-size:10px;line-height:1.4;color:var(--muted)}
.vehicle-choice-price small[hidden]{display:none}

/* One way or return. The same card treatment as the vehicle classes, because it is
   the same kind of choice -- two things, both priced, either one picked -- and it
   sits directly above them. */
.trip-choices{display:grid;gap:9px;margin:0 0 22px;padding:0;border:0}
.trip-choices>legend{padding:0;margin-bottom:9px;font:700 11px Manrope,sans-serif;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.trip-choice{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:13px;padding:14px;border:1px solid #dcdfe5;border-radius:9px;background:#fff;cursor:pointer;transition:border-color .15s,box-shadow .15s}
.trip-choice:hover{border-color:#b9bfcc}
.trip-choice:focus-within{border-color:#8d94a4;box-shadow:0 0 0 3px rgba(140,148,167,.13)}
.trip-choice:has(input:checked){border-color:var(--ink);box-shadow:0 0 0 1px var(--ink)}
.trip-choice input{width:17px;height:17px;margin:0;accent-color:var(--ink)}
.trip-choice-body{display:grid;gap:3px;min-width:0}
.trip-choice-body strong{font-size:12px}
.trip-choice-body small{color:var(--muted);font-size:10px;line-height:1.5}
/* The compact form on the route-based page, which sits inside a form grid rather than
   owning a column: the label carries the radio, so it keeps the grid's own rhythm and
   needs no body wrapper. */
.trip-choices .form-grid{gap:9px}
.trip-choices .trip-choice{gap:10px;align-items:start;padding:12px}
.trip-choices .trip-choice small{display:block;margin-top:3px;font-size:10px;line-height:1.5;color:var(--muted)}

/* Why a class will not do, said before the server refuses the whole booking. */
.vehicle-hint{margin:10px 0 0;padding:9px 11px;border-radius:7px;background:#fdf3e7;color:#8a5a17;font-size:11px;line-height:1.6}
.vehicle-hint[hidden]{display:none}

/* The season in force, named where the customer is about to read a price that is not
   the one they may have seen on the catalogue. Tinted rather than boxed so it reads as
   an explanation of the prices below it, not as one more thing to fill in. */
.trip-season-note{margin:0 0 20px;padding:11px 14px;border-radius:8px;border-left:3px solid var(--ink);background:#eef0f6;color:#3d4250;font-size:11px;line-height:1.6}
.section .trip-season-note{max-width:640px;margin:0 0 20px}
.quote-line.is-season dt,.quote-line.is-season dd{color:var(--blue-text)}
.quote-line[hidden]{display:none}

/* Available to screen readers only: the visible group is the set of cards, and the
   legend that names it must not be read out as a stray word between the heading
   and the first price. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media(max-width:620px){.vehicle-choice{grid-template-columns:auto minmax(0,1fr)}.vehicle-choice-price{grid-column:2;text-align:left}}
