/* ============================================================
   TripSkyWay Public Website - v1.20.0 Design System
   Premium, mobile-first, conversion-focused travel agency UI.
   ============================================================ */
:root{
  --tsw-primary:#0B5FFF; --tsw-primary-dark:#0942B8; --tsw-primary-050:#EEF3FF;
  --tsw-accent:#F59E0B; --tsw-accent-dark:#D97706;
  --tsw-ink:#0F172A; --tsw-body:#334155; --tsw-muted:#64748B; --tsw-line:#E5E9F0;
  --tsw-bg:#FFFFFF; --tsw-bg-soft:#F7F9FC; --tsw-white:#FFFFFF;
  --tsw-success:#059669; --tsw-danger:#DC2626;
  --tsw-radius:16px; --tsw-radius-sm:10px; --tsw-radius-lg:24px;
  --tsw-shadow-sm:0 1px 2px rgba(15,23,42,.06),0 1px 3px rgba(15,23,42,.08);
  --tsw-shadow:0 10px 30px rgba(15,23,42,.10);
  --tsw-shadow-lg:0 24px 60px rgba(15,23,42,.16);
  --tsw-container:1200px;
  --tsw-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body.tsw{margin:0;font-family:var(--tsw-font);color:var(--tsw-body);background:var(--tsw-bg);line-height:1.6;font-size:16px;-webkit-font-smoothing:antialiased}
.tsw img{max-width:100%;display:block}
.tsw a{color:var(--tsw-primary);text-decoration:none}
.tsw a:hover{color:var(--tsw-primary-dark)}
.tsw h1,.tsw h2,.tsw h3,.tsw h4{color:var(--tsw-ink);line-height:1.2;margin:0 0 .5em;font-weight:800;letter-spacing:-.02em}
.tsw h1{font-size:clamp(2rem,5vw,3.25rem)}
.tsw h2{font-size:clamp(1.6rem,3.4vw,2.35rem)}
.tsw h3{font-size:1.25rem}
.tsw p{margin:0 0 1rem}
.container{max-width:var(--tsw-container);margin:0 auto;padding:0 20px}
.section{padding:72px 0}
.section-soft{background:var(--tsw-bg-soft)}
.section-head{max-width:720px;margin:0 auto 44px;text-align:center}
.section-head.left{margin-left:0;text-align:left}
.section-head p{color:var(--tsw-muted);font-size:1.05rem;margin:0}
.eyebrow{display:inline-block;font-size:.8rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--tsw-primary);background:var(--tsw-primary-050);padding:6px 14px;border-radius:999px;margin-bottom:14px}
.text-center{text-align:center}
.visually-hidden{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* Buttons
   NOTE: selectors are scoped with `.tsw` so button text colours win over the
   generic `.tsw a{color:var(--tsw-primary)}` link rule (which previously made
   the white-on-primary CTA label invisible). */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:700;font-size:1rem;padding:13px 26px;border-radius:999px;border:2px solid transparent;cursor:pointer;transition:.18s ease;text-align:center;line-height:1.1;text-decoration:none}
.tsw a.btn{text-decoration:none}
.tsw .btn-primary,.tsw a.btn-primary{background:var(--tsw-primary);color:#fff}
.tsw .btn-primary:hover,.tsw a.btn-primary:hover{background:var(--tsw-primary-dark);color:#fff;transform:translateY(-2px);box-shadow:var(--tsw-shadow)}
.tsw .btn-accent,.tsw a.btn-accent{background:var(--tsw-accent);color:#3a2600}
.tsw .btn-accent:hover,.tsw a.btn-accent:hover{background:var(--tsw-accent-dark);color:#3a2600;transform:translateY(-2px);box-shadow:var(--tsw-shadow)}
.tsw .btn-outline,.tsw a.btn-outline{background:transparent;color:var(--tsw-primary);border-color:var(--tsw-primary)}
.tsw .btn-outline:hover,.tsw a.btn-outline:hover{background:var(--tsw-primary);color:#fff}
.tsw .btn-ghost,.tsw a.btn-ghost{background:rgba(255,255,255,.16);color:#fff;border-color:rgba(255,255,255,.55);backdrop-filter:blur(4px)}
.tsw .btn-ghost:hover,.tsw a.btn-ghost:hover{background:#fff;color:var(--tsw-ink)}
.tsw .btn-wa,.tsw a.btn-wa{background:#25D366;color:#052e16}
.tsw .btn-wa:hover,.tsw a.btn-wa:hover{background:#1eb257;color:#052e16;transform:translateY(-2px)}
.btn-lg{padding:16px 34px;font-size:1.05rem}
.btn-block{width:100%}

/* Accessibility: visible keyboard focus + skip link */
.tsw a:focus-visible,.tsw button:focus-visible,.tsw input:focus-visible,.tsw select:focus-visible,.tsw textarea:focus-visible,.tsw [tabindex]:focus-visible{outline:3px solid var(--tsw-primary);outline-offset:2px;border-radius:6px}
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;background:var(--tsw-primary);color:#fff;padding:10px 18px;border-radius:0 0 10px 0;font-weight:700}
.skip-link:focus{left:0}

/* Header */
.tsw-header{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.94);backdrop-filter:saturate(180%) blur(10px);border-bottom:1px solid var(--tsw-line)}
.tsw-header .bar{display:flex;align-items:center;justify-content:space-between;height:72px}
.tsw-logo{display:flex;align-items:center;gap:10px}
.tsw-logo img{height:40px;width:auto}
.tsw-nav{display:flex;align-items:center;gap:26px}
.tsw-nav a{color:var(--tsw-ink);font-weight:600;font-size:.98rem;position:relative;padding:6px 0}
.tsw-nav a:hover{color:var(--tsw-primary)}
.tsw-nav a::after{content:"";position:absolute;left:0;right:100%;bottom:-2px;height:2px;background:var(--tsw-primary);transition:right .2s ease}
.tsw-nav a:hover::after{right:0}
.header-cta{display:flex;align-items:center;gap:12px}
.nav-toggle{display:none;background:none;border:0;cursor:pointer;padding:8px;color:var(--tsw-ink)}
.nav-toggle svg{width:26px;height:26px}
.mobile-nav{display:none;position:fixed;inset:0;z-index:60;background:rgba(15,23,42,.5)}
.mobile-nav.open{display:block}
.mobile-nav .panel{position:absolute;top:0;right:0;height:100%;width:min(84vw,340px);background:#fff;padding:24px;box-shadow:var(--tsw-shadow-lg);overflow-y:auto;transform:translateX(0)}
.mobile-nav .panel a{display:block;padding:14px 6px;border-bottom:1px solid var(--tsw-line);color:var(--tsw-ink);font-weight:600}
.mobile-nav .panel .btn{margin-top:16px}
.mobile-nav-close{background:none;border:0;font-size:1.6rem;cursor:pointer;float:right;color:var(--tsw-muted)}

/* Hero slider */
.hero{position:relative;overflow:hidden;background:#0b1220}
.hero-track{position:relative;height:clamp(460px,72vh,720px)}
.hero-slide{position:absolute;inset:0;opacity:0;visibility:hidden;transition:opacity .7s ease;display:flex;align-items:center}
.hero-slide.active{opacity:1;visibility:visible}
.hero-slide .hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.hero-slide::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(6,12,28,.78) 0%,rgba(6,12,28,.45) 45%,rgba(6,12,28,.15) 100%)}
.hero-slide.align-center::after{background:linear-gradient(180deg,rgba(6,12,28,.35),rgba(6,12,28,.65))}
.hero-content{position:relative;z-index:2;color:#fff;max-width:620px}
.hero-slide.align-center .hero-content{margin:0 auto;text-align:center;max-width:760px}
.hero-slide.align-right .hero-content{margin-left:auto;text-align:right}
.hero-badge{display:inline-block;background:var(--tsw-accent);color:#3a2600;font-weight:800;letter-spacing:.08em;text-transform:uppercase;font-size:.78rem;padding:7px 16px;border-radius:999px;margin-bottom:18px}
.hero h1,.hero h2{color:#fff;margin-bottom:.35em;text-shadow:0 2px 20px rgba(0,0,0,.35)}
.hero .hero-title{font-size:clamp(2.1rem,5.4vw,3.6rem)}
.hero .hero-sub{font-size:1.35rem;font-weight:700;color:#fff}
.hero .hero-desc{font-size:1.1rem;color:rgba(255,255,255,.92);max-width:520px;margin-bottom:26px}
.hero-slide.align-center .hero-desc{margin-left:auto;margin-right:auto}
.hero-cta{display:flex;gap:14px;flex-wrap:wrap}
.hero-slide.align-center .hero-cta{justify-content:center}
.hero-arrow{position:absolute;top:50%;transform:translateY(-50%);z-index:5;background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.5);color:#fff;width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(4px);transition:.18s}
.hero-arrow:hover{background:#fff;color:var(--tsw-ink)}
.hero-arrow.prev{left:20px}.hero-arrow.next{right:20px}
.hero-dots{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);z-index:5;display:flex;gap:10px}
.hero-dot{width:11px;height:11px;border-radius:50%;background:rgba(255,255,255,.5);border:0;cursor:pointer;padding:0;transition:.2s}
.hero-dot.active{background:#fff;width:30px;border-radius:999px}
/* v1.28.0: Pause/Play control removed from the public hero. The .hero-pause
   rule was retained here for backwards-compat but is no longer rendered.
   v1.28.1: superseded by refined hero styles below - kept as a no-op class. */
.hero-pause{display:none !important}

/* Quick enquiry bar (lead capture) - v1.28.0 premium, compact, conversion-focused */
.quickbar{background:#fff;border-radius:var(--tsw-radius);box-shadow:var(--tsw-shadow-lg);padding:20px 22px;margin-top:-52px;position:relative;z-index:6;border:1px solid var(--tsw-line)}
.quickbar-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.quickbar-title{font-size:1.15rem;font-weight:800;color:var(--tsw-ink);margin:0;letter-spacing:-.01em}
.quickbar-sub{margin:0;color:var(--tsw-muted);font-size:.9rem;font-weight:600}
.quickbar form{margin:0}
.quickbar-fields{display:grid;grid-template-columns:1.3fr 1fr 1fr auto;gap:12px;align-items:end}
.quickbar .field{margin-bottom:0}
.quickbar .field label{font-size:.72rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--tsw-muted);display:block;margin-bottom:5px}
.quickbar .field input{padding:12px 14px}
.quickbar-submit{white-space:nowrap;height:48px}
.field-err{color:var(--tsw-danger);font-size:.78rem;font-weight:600;margin-top:5px}
.field input.is-invalid,.field input[aria-invalid="true"]{border-color:var(--tsw-danger);box-shadow:0 0 0 3px rgba(220,38,38,.12)}
.field input.is-invalid:focus{border-color:var(--tsw-danger);box-shadow:0 0 0 3px rgba(220,38,38,.18)}

/* Cards */
.grid{display:grid;gap:24px}
.grid-2{grid-template-columns:repeat(2,1fr)}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-4{grid-template-columns:repeat(4,1fr)}
.card{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);overflow:hidden;box-shadow:var(--tsw-shadow-sm);transition:.2s;display:flex;flex-direction:column}
.card:hover{transform:translateY(-4px);box-shadow:var(--tsw-shadow);border-color:#d7defc}
.card-media{position:relative;aspect-ratio:4/3;overflow:hidden;background:var(--tsw-bg-soft)}
.card-media img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.card:hover .card-media img{transform:scale(1.06)}
.card-tag{position:absolute;top:12px;left:12px;background:var(--tsw-accent);color:#3a2600;font-weight:800;font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;padding:5px 12px;border-radius:999px}
.card-body{padding:20px;display:flex;flex-direction:column;gap:8px;flex:1}
.card-body h3{margin:0}
.card-meta{display:flex;flex-wrap:wrap;gap:12px;color:var(--tsw-muted);font-size:.86rem;font-weight:600}
.card-meta span{display:inline-flex;align-items:center;gap:5px}
.card-desc{color:var(--tsw-body);font-size:.94rem;margin:0}
.card-foot{margin-top:auto;padding-top:14px;display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px solid var(--tsw-line)}
.price{color:var(--tsw-ink);font-weight:800;font-size:1.15rem}
.price small{display:block;color:var(--tsw-muted);font-weight:600;font-size:.72rem}
.price .from{color:var(--tsw-muted);font-weight:600;font-size:.78rem}
.dest-card{position:relative;border-radius:var(--tsw-radius);overflow:hidden;aspect-ratio:3/4;display:block;box-shadow:var(--tsw-shadow-sm)}
.dest-card img{width:100%;height:100%;object-fit:cover;transition:transform .5s}
.dest-card:hover img{transform:scale(1.08)}
.dest-card .overlay{position:absolute;inset:0;background:linear-gradient(180deg,rgba(0,0,0,0) 40%,rgba(0,0,0,.72));display:flex;flex-direction:column;justify-content:flex-end;padding:18px;color:#fff}
.dest-card .overlay h3{color:#fff;margin:0}
.dest-card .overlay span{opacity:.9;font-size:.85rem}

/* Features / how it works */
.feature{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);padding:26px;box-shadow:var(--tsw-shadow-sm);height:100%}
.feature .ico{width:52px;height:52px;border-radius:14px;background:var(--tsw-primary-050);color:var(--tsw-primary);display:flex;align-items:center;justify-content:center;margin-bottom:16px}
.feature .ico svg{width:26px;height:26px}
.feature h3{font-size:1.1rem;margin:0 0 6px}
.feature p{color:var(--tsw-muted);margin:0;font-size:.94rem}
.step{text-align:center;padding:20px}
.step .num{width:54px;height:54px;margin:0 auto 14px;border-radius:50%;background:var(--tsw-primary);color:#fff;font-weight:800;font-size:1.25rem;display:flex;align-items:center;justify-content:center}

/* Trust badges */
.trust{display:flex;flex-wrap:wrap;justify-content:center;gap:16px 40px;align-items:center}
.trust .badge{display:flex;align-items:center;gap:10px;color:var(--tsw-body);font-weight:600}
.trust .badge svg{width:22px;height:22px;color:var(--tsw-success)}

/* Testimonials */
.quote-card{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);padding:26px;box-shadow:var(--tsw-shadow-sm);height:100%;display:flex;flex-direction:column;gap:12px}
.stars{color:var(--tsw-accent);letter-spacing:2px;font-size:1.05rem}
.quote-card p{font-size:1rem;color:var(--tsw-body);margin:0}
.quote-author{display:flex;align-items:center;gap:12px;margin-top:auto}
.quote-author .av{width:44px;height:44px;border-radius:50%;background:var(--tsw-primary-050);color:var(--tsw-primary);display:flex;align-items:center;justify-content:center;font-weight:800}
.quote-author strong{color:var(--tsw-ink);display:block}
.quote-author span{color:var(--tsw-muted);font-size:.85rem}

/* FAQ accordion */
.accordion{max-width:820px;margin:0 auto}
.acc-item{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius-sm);margin-bottom:12px;overflow:hidden}
.acc-q{width:100%;text-align:left;background:none;border:0;padding:18px 22px;font-size:1.05rem;font-weight:700;color:var(--tsw-ink);cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:12px}
.acc-q .chev{transition:transform .2s;flex-shrink:0;color:var(--tsw-primary)}
.acc-item.open .acc-q .chev{transform:rotate(180deg)}
.acc-a{max-height:0;overflow:hidden;transition:max-height .28s ease;padding:0 22px}
.acc-item.open .acc-a{max-height:600px;padding-bottom:20px}
.acc-a p{margin:0;color:var(--tsw-body)}

/* CTA band */
.cta-band{background:linear-gradient(120deg,var(--tsw-primary),#3b76ff);color:#fff;border-radius:var(--tsw-radius-lg);padding:48px;text-align:center;box-shadow:var(--tsw-shadow)}
.cta-band h2{color:#fff}
.cta-band p{color:rgba(255,255,255,.92);max-width:620px;margin:0 auto 24px;font-size:1.1rem}
.cta-band .hero-cta{justify-content:center}

/* Forms */
.form-card{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);box-shadow:var(--tsw-shadow);padding:28px}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.field.full{grid-column:1 / -1}
.field label{font-size:.88rem;font-weight:700;color:var(--tsw-ink)}
.field .req{color:var(--tsw-danger)}
.field input,.field select,.field textarea{font-family:inherit;font-size:1rem;padding:12px 14px;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius-sm);background:#fff;color:var(--tsw-ink);transition:.15s;width:100%}
.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--tsw-primary);box-shadow:0 0 0 3px var(--tsw-primary-050)}
.field textarea{min-height:120px;resize:vertical}
.hp{position:absolute!important;left:-9999px;top:-9999px;height:0;width:0;opacity:0}
.alert{padding:14px 18px;border-radius:var(--tsw-radius-sm);margin-bottom:18px;font-weight:600}
.alert-success{background:#ECFDF5;color:#065F46;border:1px solid #A7F3D0}
.alert-error{background:#FEF2F2;color:#991B1B;border:1px solid #FECACA}

/* Breadcrumbs */
.crumbs{padding:16px 0;font-size:.88rem;color:var(--tsw-muted)}
.crumbs a{color:var(--tsw-muted)}
.crumbs a:hover{color:var(--tsw-primary)}
.crumbs .sep{margin:0 8px;opacity:.6}

/* Page hero (interior) */
.page-hero{position:relative;background:var(--tsw-ink);color:#fff;padding:64px 0}
.page-hero.with-img{padding:96px 0}
.page-hero .hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.5}
.page-hero::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(11,18,32,.35),rgba(11,18,32,.7))}
.page-hero .container{position:relative;z-index:2}
.page-hero h1{color:#fff;margin-bottom:8px}
.page-hero p{color:rgba(255,255,255,.9);max-width:640px;margin:0;font-size:1.1rem}

/* Package detail */
.pkg-layout{display:grid;grid-template-columns:1fr 360px;gap:36px;align-items:start}
.pkg-gallery img{border-radius:var(--tsw-radius);width:100%;aspect-ratio:16/9;object-fit:cover}
.pkg-block{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);padding:24px;margin-bottom:20px}
.pkg-block h2{font-size:1.4rem}
.chips{display:flex;flex-wrap:wrap;gap:10px}
.chip{background:var(--tsw-primary-050);color:var(--tsw-primary-dark);font-weight:600;font-size:.85rem;padding:6px 14px;border-radius:999px}
.list-check{list-style:none;padding:0;margin:0;display:grid;gap:10px}
.list-check li{position:relative;padding-left:30px;color:var(--tsw-body)}
.list-check li::before{content:"";position:absolute;left:0;top:3px;width:18px;height:18px;border-radius:50%;background:var(--tsw-success);-webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'><path d='M9 16.2l-3.5-3.5L4 14.2 9 19.2 20 8.2l-1.5-1.5z'/></svg>") center/70% no-repeat;mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'><path d='M9 16.2l-3.5-3.5L4 14.2 9 19.2 20 8.2l-1.5-1.5z'/></svg>") center/70% no-repeat}
.list-cross li::before{background:var(--tsw-danger)}
.itin-day{border-left:3px solid var(--tsw-primary);padding:4px 0 20px 22px;position:relative;margin-left:8px}
.itin-day::before{content:"";position:absolute;left:-9px;top:4px;width:15px;height:15px;border-radius:50%;background:var(--tsw-primary);border:3px solid #fff;box-shadow:0 0 0 2px var(--tsw-primary)}
.itin-day h4{margin:0 0 4px;color:var(--tsw-ink)}
.itin-day .daynum{font-size:.78rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--tsw-primary)}
.pkg-aside{position:sticky;top:92px}
.price-box{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);box-shadow:var(--tsw-shadow);padding:24px;margin-bottom:20px}
.price-box .big{font-size:2rem;font-weight:800;color:var(--tsw-ink)}
.price-box .note{color:var(--tsw-muted);font-size:.85rem}

/* Blog */
.article{max-width:820px;margin:0 auto}
.article img{border-radius:var(--tsw-radius);margin:18px 0}
.article h2{margin-top:1.6em}
.prose h2{font-size:1.5rem}.prose h3{font-size:1.2rem}
.prose ul,.prose ol{padding-left:22px;margin:0 0 1rem}
.prose a{text-decoration:underline}

/* Pagination */
.pagination{display:flex;gap:8px;justify-content:center;margin-top:40px;flex-wrap:wrap}
.pagination a,.pagination span{min-width:42px;height:42px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--tsw-line);border-radius:10px;color:var(--tsw-ink);font-weight:600;padding:0 12px}
.pagination a:hover{border-color:var(--tsw-primary);color:var(--tsw-primary)}
.pagination .current{background:var(--tsw-primary);color:#fff;border-color:var(--tsw-primary)}

/* Footer */
.tsw-footer{background:#0B1220;color:#B8C2D6;padding:64px 0 28px}
.tsw-footer h4{color:#fff;font-size:1rem;margin-bottom:16px;letter-spacing:.02em}
.footer-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr 1.4fr;gap:36px}
.tsw-footer a{color:#B8C2D6;display:block;padding:5px 0}
.tsw-footer a:hover{color:#fff}
.tsw-footer .brand img{height:42px;margin-bottom:14px;background:#fff;padding:6px 10px;border-radius:10px}
.footer-contact li{list-style:none;display:flex;gap:10px;margin-bottom:10px}
.footer-social{display:flex;gap:12px;margin-top:16px}
.footer-social a{width:38px;height:38px;border-radius:50%;background:rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;padding:0}
.footer-social a:hover{background:var(--tsw-primary)}
.footer-social svg{width:18px;height:18px}
.footer-bottom{border-top:1px solid rgba(255,255,255,.1);margin-top:44px;padding-top:22px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;font-size:.86rem}
.newsletter{display:flex;gap:8px;margin-top:12px}
.newsletter input{flex:1;padding:11px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.16);background:rgba(255,255,255,.06);color:#fff}
.newsletter input::placeholder{color:#8b97ad}

/* WhatsApp float */
.wa-float{position:fixed;right:20px;bottom:20px;z-index:70;width:58px;height:58px;border-radius:50%;background:#25D366;color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:var(--tsw-shadow-lg);transition:.2s}
.wa-float:hover{transform:scale(1.08);color:#fff}
.wa-float svg{width:30px;height:30px}

/* Responsive */
@media(max-width:980px){
  .grid-4{grid-template-columns:repeat(2,1fr)}
  .grid-3{grid-template-columns:repeat(2,1fr)}
  .pkg-layout{grid-template-columns:1fr}
  .pkg-aside{position:static}
  .footer-grid{grid-template-columns:1fr 1fr}
  /* Quickbar column stacking intentionally NOT here - see the 900px tier below.
     980px is a desktop/laptop width and the lead form must stay horizontal
     there (Destination | Your Name | Mobile Number | Get My Quote). */
}
@media(max-width:760px){
  .section{padding:48px 0}
  .tsw-nav,.header-cta .btn{display:none}
  .nav-toggle{display:inline-flex}
  .grid-2,.grid-3,.grid-4{grid-template-columns:1fr}
  .form-grid{grid-template-columns:1fr}
  .cta-band{padding:32px 22px}
  .hero-arrow{display:none}
  .quickbar{margin-top:-32px;padding:18px}
  .quickbar-fields{grid-template-columns:1fr}
  .quickbar-submit{grid-column:1 / -1;width:100%}
  .hero-slide.align-right .hero-content{text-align:left}
  .footer-grid{grid-template-columns:1fr}
  .hero-slide::after{background:linear-gradient(180deg,rgba(6,12,28,.4),rgba(6,12,28,.7))}
}
@media(prefers-reduced-motion:reduce){
  *{scroll-behavior:auto!important}
  .hero-slide{transition:none}
  .card:hover{transform:none}
}

/* v1.21.2 header hardening: text-mark logo fallback + sm-only helpers */
.tsw-logo-mark{display:inline-flex;width:34px;height:34px;align-items:center;justify-content:center;color:var(--tsw-primary,#0B5FFF);background:#e7f0ff;border-radius:10px}
.tsw-logo-text{font-weight:800;font-size:1.15rem;letter-spacing:.2px;color:var(--tsw-ink,#0f172a)}
.btn.btn-sm{padding:.45rem .7rem;font-size:.86rem}
.header-cta{display:flex;align-items:center;gap:10px}
@media (max-width:900px){ .hide-sm{display:none !important} }

/* ===== v1.24.0 CMS Draft Preview banner ===== */
body.tsw-preview{padding-top:0}
.tsw-preview-banner{position:sticky;top:0;z-index:9999;background:linear-gradient(90deg,#b45309,#d97706);color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.15)}
.tsw-preview-banner__inner{max-width:1200px;margin:0 auto;display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:10px 16px;font-size:.85rem;line-height:1.35}
.tsw-preview-banner__badge{background:#fff;color:#b45309;font-weight:800;letter-spacing:.06em;padding:4px 10px;border-radius:6px;font-size:.72rem;white-space:nowrap}
.tsw-preview-banner__text{flex:1;min-width:220px}
.tsw-preview-banner__exp{display:inline-block;opacity:.9;margin-left:6px}
.tsw-preview-banner__actions{display:flex;gap:8px;flex-wrap:wrap}
.tsw-preview-banner__btn{background:rgba(255,255,255,.18);color:#fff;text-decoration:none;padding:6px 12px;border-radius:6px;font-weight:600;border:1px solid rgba(255,255,255,.35);white-space:nowrap}
.tsw-preview-banner__btn:hover{background:rgba(255,255,255,.3)}
.tsw-preview-banner__btn--live{background:#fff;color:#b45309}

/* ============================================================
   v1.28.0 -> v1.28.2  Public homepage polish (retained history)
   Consolidated below. Latest wins.
   ============================================================ */

/* ============================================================
   v1.28.2 - PREMIUM HOMEPAGE POLISH
   • Compact 36px top information bar (desktop only)
   • Clean white main header with left logo / center nav / right CTA
   • Reference-quality LEFT-ALIGNED hero (560-600px desktop) with
     stronger dark scrim on the left, restrained title (58-68px),
     premium badge, subtle divider, refined arrows + bottom-center dots
   • Premium overlapping Quickbar (big heading, floating card, blue CTA)
   • Refined trust strip
   • WhatsApp NOT in header (floating only)
   ============================================================ */

/* --- Top information bar (v1.28.4 - WHITE contact text via .tsw-topbar-left a)
   Root cause of blue text in v1.28.3: the global `.tsw a{color:var(--tsw-primary)}`
   link rule (specificity 0,1,1) beat `.tsw-topbar-item{}` (0,1,0). We now use
   `.tsw-topbar-left a` and `.tsw-topbar a` (specificity 0,1,1) plus a
   compound `.tsw-topbar .tsw-topbar-item` (0,2,0) which decisively wins. */
.tsw-topbar{background:linear-gradient(180deg,#0B1B3A 0%,#0F2452 100%);color:#FFFFFF;font-size:.8rem;border-bottom:1px solid rgba(255,255,255,.04)}
.tsw-topbar-inner{display:flex;align-items:center;justify-content:space-between;gap:24px;min-height:36px;padding-top:5px;padding-bottom:5px}
.tsw-topbar-left{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.tsw-topbar a,
.tsw-topbar-left a,
.tsw-topbar .tsw-topbar-item{display:inline-flex;align-items:center;gap:8px;color:#FFFFFF;font-weight:500;letter-spacing:.005em;transition:color .15s,opacity .15s;text-decoration:none}
.tsw-topbar a:hover,
.tsw-topbar-left a:hover,
.tsw-topbar .tsw-topbar-item:hover{color:#FFFFFF;opacity:.85}
.tsw-topbar a:visited,
.tsw-topbar-left a:visited{color:#FFFFFF}
.tsw-topbar .tsw-topbar-item svg,
.tsw-topbar-left a svg{color:#FFFFFF;opacity:.9}
.tsw-topbar-right{display:flex;align-items:center;gap:22px}
.tsw-topbar-right a{color:#FFFFFF;font-weight:500;font-size:.8rem;letter-spacing:.005em;transition:opacity .15s;position:relative;text-decoration:none}
.tsw-topbar-right a:hover{color:#FFFFFF;opacity:.85}
.tsw-topbar-right a + a::before{content:"";position:absolute;left:-11px;top:50%;transform:translateY(-50%);width:1px;height:12px;background:rgba(255,255,255,.18)}
@media(max-width:900px){.tsw-topbar{display:none !important}}

/* --- Main header (v1.28.2) --------------------------------- */
.tsw-header{background:#fff;backdrop-filter:none;border-bottom:1px solid #EEF1F6;box-shadow:0 1px 0 rgba(15,23,42,.02);position:sticky;top:0;z-index:50}
.tsw-header .bar{height:76px;display:flex;align-items:center;justify-content:space-between;gap:20px}
.tsw-logo{display:flex;align-items:center;gap:10px;flex-shrink:0}
.tsw-logo img{height:44px;width:auto}
.tsw-logo-text{font-weight:800;font-size:1.15rem;color:var(--tsw-ink);letter-spacing:-.01em}
.tsw-logo-mark{color:var(--tsw-primary)}
.tsw-nav{display:flex;align-items:center;gap:30px;flex-wrap:nowrap}
.tsw-nav a{color:#0F172A;font-weight:600;font-size:.95rem;display:inline-flex;align-items:center;gap:8px;padding:6px 0;position:relative}
.tsw-nav a:hover{color:var(--tsw-primary)}
.tsw-nav a::after{content:"";position:absolute;left:0;right:100%;bottom:-4px;height:2px;background:var(--tsw-primary);transition:right .2s ease}
.tsw-nav a:hover::after{right:0}
.tsw-nav-badge{display:inline-flex;align-items:center;justify-content:center;background:var(--tsw-accent);color:#3a2600;font-size:.6rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;padding:2px 7px;border-radius:999px;line-height:1;box-shadow:0 4px 10px rgba(245,158,11,.35);transform:translateY(-9px)}
.header-cta{display:flex;align-items:center;gap:12px;flex-shrink:0}
.header-cta .btn-primary{padding:11px 22px;font-size:.95rem;border-radius:10px;box-shadow:0 6px 18px rgba(11,95,255,.28)}
.header-cta .btn-primary:hover{box-shadow:0 10px 26px rgba(11,95,255,.4)}
.nav-toggle{display:none;background:none;border:0;cursor:pointer;padding:8px;color:var(--tsw-ink)}
@media(max-width:1024px){.tsw-nav{gap:22px}.tsw-nav a{font-size:.9rem}}
@media(max-width:900px){
  .tsw-header .bar{height:64px}
  .tsw-logo img{height:38px}
  .tsw-nav{display:none}
  .header-cta .btn-primary{display:none}
  .nav-toggle{display:inline-flex}
}

/* --- Hero slider (v1.28.3 genuine left-column composition) - */
.hero{position:relative;overflow:hidden;background:#0a1428}
.hero-track{position:relative;height:clamp(520px,68vh,600px)}
.hero-slide{position:absolute;inset:0;opacity:0;visibility:hidden;transition:opacity .7s ease;display:flex;align-items:center}
.hero-slide.active{opacity:1;visibility:visible}
.hero-slide .hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center right}

/* Wider hero container so content genuinely sits ~10-13% from viewport edge */
.hero-slide > .container{max-width:1600px;width:100%;padding-left:clamp(20px,10vw,180px);padding-right:clamp(20px,6vw,120px);margin:0 auto;position:relative;z-index:2}

.hero-slide::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(6,12,28,.9) 0%,rgba(6,12,28,.72) 32%,rgba(6,12,28,.35) 62%,rgba(6,12,28,.1) 100%)}
.hero-slide.align-center::after{background:linear-gradient(180deg,rgba(6,12,28,.3),rgba(6,12,28,.72))}
.hero-slide.align-right::after{background:linear-gradient(-90deg,rgba(6,12,28,.9) 0%,rgba(6,12,28,.72) 32%,rgba(6,12,28,.35) 62%,rgba(6,12,28,.1) 100%)}

/* LEFT (default) - content anchored to the container's left edge */
.hero-content{position:relative;z-index:2;color:#fff;max-width:620px;margin:0;text-align:left}
/* CENTER - reset container padding + center content */
.hero-slide.align-center > .container{padding-left:20px;padding-right:20px;max-width:900px}
.hero-slide.align-center .hero-content{margin:0 auto;text-align:center;max-width:760px}
/* RIGHT - flip container padding + right-align content */
.hero-slide.align-right > .container{padding-left:clamp(20px,6vw,120px);padding-right:clamp(20px,10vw,180px)}
.hero-slide.align-right .hero-content{margin-left:auto;margin-right:0;text-align:right}

/* Premium badge - shares the same left edge as the content column */
.hero-badge{display:inline-flex;align-items:center;gap:6px;background:var(--tsw-accent);color:#3a2600;font-weight:800;letter-spacing:.1em;text-transform:uppercase;font-size:.7rem;padding:8px 16px;border-radius:999px;margin:0 0 20px;box-shadow:0 10px 28px rgba(245,158,11,.4)}
.hero-badge::before{content:"\2605";font-size:.9rem;line-height:1;margin-right:2px}

/* Title - constrained max-width so long headlines wrap intentionally */
.hero .hero-title{color:#fff;font-size:clamp(2.1rem,4.6vw,3.9rem);font-weight:800;letter-spacing:-.025em;line-height:1.06;margin:0 0 14px;text-shadow:0 2px 30px rgba(0,0,0,.35);max-width:650px}
.hero-slide.align-center .hero-title{margin-left:auto;margin-right:auto}
.hero-slide.align-right .hero-title{margin-left:auto;margin-right:0}

/* Subtitle */
.hero .hero-sub{font-size:1.05rem;font-weight:600;color:#fff;margin:0 0 12px;max-width:560px;text-shadow:0 2px 12px rgba(0,0,0,.35)}
.hero-slide.align-center .hero-sub{margin-left:auto;margin-right:auto}
.hero-slide.align-right .hero-sub{margin-left:auto;margin-right:0}

/* Subtle accent divider between subtitle and description */
.hero-content .hero-sub + .hero-desc,
.hero-content .hero-title + .hero-desc{position:relative}
.hero-content .hero-sub + .hero-desc::before,
.hero-content .hero-title + .hero-desc::before{content:"";display:block;width:64px;height:2px;background:linear-gradient(90deg,var(--tsw-accent),transparent);margin:0 0 16px;border-radius:2px}
.hero-slide.align-center .hero-content .hero-sub + .hero-desc::before,
.hero-slide.align-center .hero-content .hero-title + .hero-desc::before{margin-left:auto;margin-right:auto}
.hero-slide.align-right .hero-content .hero-sub + .hero-desc::before,
.hero-slide.align-right .hero-content .hero-title + .hero-desc::before{margin-left:auto;margin-right:0;background:linear-gradient(-90deg,var(--tsw-accent),transparent)}

/* Description */
.hero .hero-desc{font-size:.98rem;color:rgba(255,255,255,.9);line-height:1.65;max-width:560px;margin:0 0 28px}
.hero-slide.align-center .hero-desc{margin-left:auto;margin-right:auto}
.hero-slide.align-right .hero-desc{margin-left:auto;margin-right:0}

/* CTAs - share the same left edge as the content column */
.hero-cta{display:flex;gap:14px;flex-wrap:wrap;margin:0;justify-content:flex-start}
.hero-slide.align-center .hero-cta{justify-content:center}
.hero-slide.align-right .hero-cta{justify-content:flex-end}
.hero-cta .btn{border-radius:12px;font-weight:700;padding:14px 26px;font-size:1rem}
.hero-cta .btn-accent{box-shadow:0 14px 32px rgba(245,158,11,.42)}
.hero-cta .btn-accent:hover{box-shadow:0 18px 40px rgba(245,158,11,.55)}
.hero-cta .btn-accent .hero-cta-arrow{transition:transform .2s ease}
.hero-cta .btn-accent:hover .hero-cta-arrow{transform:translateX(4px)}
.hero-cta .btn-ghost{background:rgba(255,255,255,.1);border:1.5px solid rgba(255,255,255,.55);color:#fff;backdrop-filter:blur(4px)}
.hero-cta .btn-ghost:hover{background:#fff;color:var(--tsw-ink)}

/* Nav arrows */
.hero-arrow{position:absolute;top:50%;transform:translateY(-50%);z-index:5;width:44px;height:44px;background:rgba(255,255,255,.12);border:1.5px solid rgba(255,255,255,.55);color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(6px);transition:.18s}
.hero-arrow svg{width:18px;height:18px}
.hero-arrow:hover{background:#fff;color:var(--tsw-ink);border-color:#fff;transform:translateY(-50%) scale(1.06)}
.hero-arrow.prev{left:20px}.hero-arrow.next{right:20px}

/* Dots */
.hero-dots{position:absolute;bottom:26px;left:50%;transform:translateX(-50%);z-index:5;display:flex;gap:8px;align-items:center}
.hero-dot{width:8px;height:8px;border-radius:50%;background:rgba(255,255,255,.42);border:0;cursor:pointer;padding:0;transition:all .25s ease}
.hero-dot:hover{background:rgba(255,255,255,.7)}
.hero-dot.active{background:#fff;width:28px;border-radius:999px}

/* Play/Pause stays gone */
.hero-pause{display:none !important}

@media(max-width:1200px){
  .hero-slide > .container{padding-left:clamp(20px,6vw,80px);padding-right:20px}
}
@media(max-width:900px){
  .hero-track{height:clamp(500px,66vh,580px)}
  /* v1.28.4: push flex content upward so CTAs don't collide with dots */
  .hero-slide{padding-bottom:90px}
  .hero-slide > .container{padding-left:20px;padding-right:20px;max-width:100%}
  .hero-content{max-width:100%}
  .hero .hero-title{font-size:clamp(1.85rem,7vw,2.5rem);max-width:100%}
  .hero-arrow{width:38px;height:38px}
  .hero-arrow.prev{left:10px}.hero-arrow.next{right:10px}
  .hero-dots{bottom:28px}
}
@media(max-width:600px){
  .hero-slide{padding-bottom:100px}
  .hero-cta{gap:10px;width:100%;flex-direction:column}
  .hero-cta .btn{flex:0 0 auto;width:100%;min-width:0;padding:12px 18px;font-size:.95rem;justify-content:center}
  .hero-arrow{display:none}
  .hero-dots{bottom:24px;gap:6px}
  .hero-dot{width:7px;height:7px}
  .hero-dot.active{width:24px}
}

/* --- Quickbar (v1.28.4 - compact + STABLE validation slot) ---
   Root cause of the v1.28.3 shift: with `align-items:end` on the fields grid,
   showing the phone error made the mobile `.field` taller, so its input moved
   upward relative to the other inputs. Fix: every `.field` reserves a
   consistent 20px slot below the input; the error message uses that slot via
   absolute positioning so the input row stays perfectly aligned in both
   normal and error states. */
.quickbar-wrap{position:relative;z-index:6;margin-top:-32px}
.quickbar{background:#fff;border-radius:20px;box-shadow:0 24px 60px rgba(6,12,28,.2),0 8px 18px rgba(6,12,28,.06);padding:18px 22px;border:1px solid rgba(15,23,42,.05);max-width:1320px;margin:0 auto}
/* Head - inline on wide desktop, stacked on narrow screens */
.quickbar-head{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap;margin-bottom:14px}
.quickbar-title{font-size:clamp(1.2rem,1.8vw,1.6rem);font-weight:800;color:var(--tsw-ink);margin:0;letter-spacing:-.015em;line-height:1.2}
.quickbar-sub{margin:0;color:var(--tsw-muted);font-size:.88rem;font-weight:500}
.quickbar form{margin:0}
.quickbar-fields{display:grid;grid-template-columns:1.5fr 1fr 1fr auto;gap:12px;align-items:end}
.quickbar .field{margin-bottom:0;position:relative;padding-bottom:22px}
.quickbar .field label{font-size:.66rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:#475569;margin-bottom:6px;display:block}
.quickbar .field input{padding:12px 14px;border:1.5px solid #E2E8F0;border-radius:10px;background:#F8FAFC;font-weight:500;font-size:.95rem;color:var(--tsw-ink);transition:.15s;width:100%;height:46px;display:block}
.quickbar .field input::placeholder{color:#94A3B8}
.quickbar .field input:focus{background:#fff;border-color:var(--tsw-primary);box-shadow:0 0 0 3px rgba(11,95,255,.12);outline:none}
.quickbar .field input.is-invalid{border-color:var(--tsw-danger);background:#FFF7F7}
/* Error slot lives in the reserved 22px below the input; absolute so it
   NEVER pushes the input upward. In normal state the slot is invisible,
   preserving the horizontal alignment of the three inputs. */
.quickbar .field-err{position:absolute;left:0;right:0;bottom:0;color:var(--tsw-danger);font-size:.76rem;font-weight:600;line-height:1.2;margin:0}
.quickbar-submit{height:46px;border-radius:10px;padding:0 24px;font-weight:700;font-size:.95rem;box-shadow:0 10px 22px rgba(11,95,255,.32);white-space:nowrap;margin-bottom:22px}
.quickbar-submit:hover{box-shadow:0 14px 28px rgba(11,95,255,.42);transform:translateY(-1px)}

@media(max-width:1200px){
  .quickbar-head{align-items:flex-start;flex-direction:column;gap:2px}
}
@media(max-width:980px){
  .quickbar-wrap{margin-top:-28px}
  .quickbar{padding:18px 18px;border-radius:18px}
}
/* Quickbar stays a single horizontal row (Destination | Your Name | Mobile
   Number | Get My Quote) across the whole desktop/laptop range. It previously
   collapsed to two columns at 980px, which is a DESKTOP width - that pushed the
   button onto its own full-width row and roughly doubled the card height
   (213px -> 430px), producing the tall block of empty space. Stacking now
   begins at 900px, the same point at which the site already switches its
   desktop chrome (the top information bar hides at 900px), so the whole
   desktop-to-tablet transition happens on one coherent line. */
@media(max-width:900px){
  .quickbar-fields{grid-template-columns:1fr 1fr;gap:10px}
  .quickbar-submit{grid-column:1 / -1;width:100%;margin-top:0}
}
@media(max-width:600px){
  .quickbar-wrap{margin-top:-24px;padding-left:12px;padding-right:12px}
  .quickbar{padding:16px 16px;border-radius:16px}
  .quickbar-head{margin-bottom:12px}
  .quickbar-fields{grid-template-columns:1fr;gap:8px}
  .quickbar .field{padding-bottom:22px}
  .quickbar .field input{padding:12px 14px;height:46px;font-size:1rem}
}

/* --- Trust strip refinement --------------------------------- */
.trust{display:flex;flex-wrap:wrap;justify-content:center;gap:12px 36px;align-items:center;padding:16px 0}
.trust .badge{display:inline-flex;align-items:center;gap:10px;color:var(--tsw-body);font-weight:600;font-size:.92rem;background:transparent;border:0;padding:0}
.trust .badge svg{width:20px;height:20px;color:var(--tsw-success);flex-shrink:0;background:rgba(5,150,105,.1);border-radius:50%;padding:3px}
@media(max-width:600px){
  .trust{gap:10px 20px;justify-content:flex-start;padding:14px 0}
  .trust .badge{font-size:.88rem;flex:0 0 calc(50% - 10px)}
}




/* ==========================================================================
   Phase 1 - CMS-managed homepage sections (In The News, Trusted Partners,
   Career CTA). Reuses the existing tokens, card treatment and breakpoints so
   these sections match the rest of the site rather than introducing a new
   design language.
   ========================================================================== */

/* --- In The News --- */
.news-card{background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);box-shadow:var(--tsw-shadow-sm);overflow:hidden;height:100%;display:flex;flex-direction:column}
.news-media{aspect-ratio:16/9;overflow:hidden;background:var(--tsw-primary-050)}
.news-media img{width:100%;height:100%;object-fit:cover;display:block}
.news-body{padding:22px;display:flex;flex-direction:column;gap:8px;flex:1}
.news-meta{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:.8rem;color:var(--tsw-muted);text-transform:uppercase;letter-spacing:.04em}
.news-body h3{font-size:1.05rem;margin:0;line-height:1.4}
.news-body p{color:var(--tsw-muted);margin:0;font-size:.94rem}
.news-link{margin-top:auto;font-weight:600;font-size:.92rem}

/* --- Trusted Travel Partners --- */
.partner-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:18px;align-items:stretch}
.partner-item{display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--tsw-line);border-radius:var(--tsw-radius);padding:20px 16px;min-height:92px;box-shadow:var(--tsw-shadow-sm);transition:transform .18s ease,box-shadow .18s ease}
a.partner-item:hover{transform:translateY(-2px);box-shadow:var(--tsw-shadow)}
.partner-item img{max-width:100%;max-height:52px;object-fit:contain;display:block;filter:grayscale(1);opacity:.78;transition:filter .18s ease,opacity .18s ease}
a.partner-item:hover img{filter:grayscale(0);opacity:1}
.partner-name{font-weight:600;color:var(--tsw-muted);text-align:center;font-size:.95rem;line-height:1.3}

/* --- Career / Join Us CTA (softer variant of the closing CTA band) --- */
.cta-band-soft{background:#fff;color:inherit;border:1px solid var(--tsw-line);box-shadow:var(--tsw-shadow-sm)}
.cta-band-soft h2{color:var(--tsw-ink,#0f172a)}
.cta-band-soft p{color:var(--tsw-muted)}

@media(max-width:1200px){
  .partner-grid{grid-template-columns:repeat(4,1fr)}
}
@media(max-width:980px){
  .partner-grid{grid-template-columns:repeat(3,1fr)}
}
@media(max-width:600px){
  .partner-grid{grid-template-columns:repeat(2,1fr);gap:12px}
  .partner-item{min-height:76px;padding:16px 12px}
  .partner-item img{max-height:40px}
  .news-body{padding:18px}
}


/* ==========================================================================
   TripSkyWay — PHASE 2 PREMIUM HOMEPAGE
   APPEND THIS ENTIRE FILE TO THE END OF public/assets/css/website.css
   ==========================================================================
   Every rule below is scoped under .tsw-p2 (the homepage wrapper) so no other
   public page — Destinations, Packages, Blog, Contact, FAQ — can be affected.
   Nothing above this block in website.css is edited or overridden globally.

   Phase 1 CSS is untouched. Phase 1 tokens are reused where they exist.
   ========================================================================== */

.tsw-p2{
  /* Phase 2 editorial tokens — namespaced, cannot collide with --tsw-* */
  --p2-ivory:#F8F6F0;
  --p2-paper:#FBFAF8;
  --p2-sand:#F3F1EC;
  --p2-navy:#08152F;
  --p2-ink:#071228;
  --p2-blue:#111E8E;
  --p2-blue-dark:#0E1A79;
  --p2-gold:#FFA500;
  /* The gold above is decoration - rules, icons, badge grounds - and at
     1.97:1 on white it is emphatically not a text colour. This darker tone of
     the same hue reaches 5.34:1 on white and stays above 4.5:1 on every light
     ground the site uses, and it is what small gold TEXT uses. Kept as a token
     because it encodes a contrast decision, not just a colour. */
  --p2-gold-text:#946000;
  --p2-gold-soft:#8F5C00;
  --p2-gold-light:#FFC061; --p2-gold-press:#E08E00;
  --p2-body:#5A6472;
  --p2-muted:#636D7C;
  --p2-line:#E3E1DC;
  --p2-line-warm:#E3DBC9;
  --p2-line-faint:#EAE3D4;
  /* Newsreader is the approved display face. Until it is loaded (see
     IMPLEMENTATION-NOTES.md → Fonts) this falls back to Georgia, which is
     metrically close and present on every Hostinger-served client. */
  --p2-serif:Newsreader,Georgia,"Iowan Old Style","Palatino Linotype","Book Antiqua",serif;
  --p2-wrap:1320px;
}

/* ---------- Shared Phase 2 primitives ---------- */
.tsw-p2 .p2-wrap{max-width:var(--p2-wrap);margin:0 auto;padding:0 40px}
.tsw-p2 .p2-sec{padding:100px 0}
.tsw-p2 .p2-sec-ivory{background:var(--p2-ivory)}
.tsw-p2 .p2-sec-sand{background:var(--p2-sand)}
.tsw-p2 .p2-sec-navy{background:var(--p2-navy)}

.tsw-p2 .p2-eyebrow{display:flex;align-items:center;gap:14px;margin-bottom:18px}
.tsw-p2 .p2-eyebrow i{display:block;width:28px;height:1px;background:var(--p2-blue);flex:0 0 28px}
.tsw-p2 .p2-eyebrow span{font-size:11.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--p2-blue);font-weight:600;white-space:nowrap;
  /* reset the Phase 1 .eyebrow pill treatment if the class is ever combined */
  background:none;padding:0;border-radius:0;display:inline}
.tsw-p2 .p2-eyebrow-gold i{background:var(--p2-gold)}
.tsw-p2 .p2-eyebrow-gold span{color:var(--p2-gold-text)}
.tsw-p2 .p2-eyebrow-amber i{background:var(--p2-gold-soft)}
.tsw-p2 .p2-eyebrow-amber span{color:var(--p2-gold-soft)}
.tsw-p2 .p2-eyebrow-onnavy i{background:var(--p2-gold-light)}
.tsw-p2 .p2-eyebrow-onnavy span{color:var(--p2-gold-light);font-weight:500}

.tsw-p2 h2.p2-h2{font-family:var(--p2-serif);font-weight:300;font-size:47px;line-height:1.06;
  letter-spacing:-.024em;color:var(--p2-navy);margin:0 0 14px;text-wrap:balance}
.tsw-p2 .p2-sec-navy h2.p2-h2{color:#fff}
.tsw-p2 .p2-lede{margin:0;font-size:16.5px;line-height:1.68;color:var(--p2-body);max-width:52ch;text-wrap:pretty}
.tsw-p2 .p2-sec-navy .p2-lede{color:rgba(255,255,255,.66)}

.tsw-p2 .p2-head{display:flex;align-items:flex-end;justify-content:space-between;gap:40px;
  margin-bottom:42px;flex-wrap:wrap;text-align:left;max-width:none}
.tsw-p2 .p2-head-col{max-width:560px}

/* Text link with hairline rule — replaces pill buttons in editorial contexts */
.tsw-p2 a.p2-link{display:inline-flex;align-items:center;gap:10px;font-size:14.5px;font-weight:600;
  color:var(--p2-navy);border-bottom:1px solid #C9C5BC;padding-bottom:3px;white-space:nowrap;
  transition:color .16s ease,border-color .16s ease}
.tsw-p2 a.p2-link:hover{color:var(--p2-blue);border-bottom-color:var(--p2-blue)}
.tsw-p2 a.p2-link svg{width:15px;height:15px;flex:0 0 15px}
.tsw-p2 .p2-sec-navy a.p2-link{color:#fff;border-bottom-color:rgba(255,255,255,.35)}
.tsw-p2 .p2-sec-navy a.p2-link:hover{color:var(--p2-gold-light);border-bottom-color:var(--p2-gold-light)}

/* Squared editorial buttons — scoped, does not touch Phase 1 .btn */
.tsw-p2 .p2-btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  font-family:inherit;font-size:15px;font-weight:600;padding:16px 30px;border-radius:4px;
  border:1px solid transparent;cursor:pointer;line-height:1.1;text-decoration:none;transition:.18s ease}
.tsw-p2 a.p2-btn-primary,.tsw-p2 .p2-btn-primary{background:var(--p2-blue);color:#fff}
.tsw-p2 a.p2-btn-primary:hover{background:var(--p2-blue-dark);color:#fff}
.tsw-p2 a.p2-btn-outline,.tsw-p2 .p2-btn-outline{background:transparent;color:var(--p2-navy);border-color:var(--p2-navy)}
.tsw-p2 a.p2-btn-outline:hover{background:var(--p2-navy);color:#fff}
.tsw-p2 a.p2-btn-onimg{background:transparent;color:#fff;border-color:rgba(255,255,255,.45);font-weight:500}
.tsw-p2 a.p2-btn-onimg:hover{background:rgba(255,255,255,.1);color:#fff}
.tsw-p2 .p2-btn svg{width:16px;height:16px;flex:0 0 16px}

/* CMS content-volume note (dev/QA aid, hidden in production by default) */
.tsw-p2 .p2-note{display:none}

/* ==========================================================================
   1. QUICKBAR / PLANNER — Phase 2 presentation of the EXISTING Phase 1 form
   --------------------------------------------------------------------------
   The form markup, action, CSRF, honeypot and validation are unchanged. Only
   presentation is restyled, and only when the homepage carries .tsw-p2.
   Production already ships .quickbar-wrap{position:relative;z-index:6}, which
   is why the design-frame clipping bug does not exist here — the card already
   paints above the hero. The overlap is re-derived below against the real DOM:
   -32px on desktop (Phase 1 value, retained), with the heading given enough
   top padding that it can never sit inside the overlap band.
   ========================================================================== */
.tsw-p2 .quickbar-wrap{position:relative;z-index:6;margin-top:-92px}
.tsw-p2 .quickbar{background:#fff;border:1px solid var(--p2-line);border-radius:6px;
  box-shadow:0 30px 70px rgba(7,18,40,.14);padding:0;max-width:none;position:relative;z-index:2}
.tsw-p2 .quickbar-head{display:block;padding:26px 34px 20px;margin:0;border-bottom:1px solid #EFEDE8}
.tsw-p2 .quickbar-title{font-family:var(--p2-serif);font-weight:400;font-size:26px;line-height:1.2;
  letter-spacing:normal;color:var(--p2-navy);margin:0 0 6px}
.tsw-p2 .quickbar-sub{margin:0;font-size:14px;color:var(--p2-muted);font-weight:400}
.tsw-p2 .quickbar form{padding:26px 34px 30px}
.tsw-p2 .quickbar-fields{display:grid;grid-template-columns:1.4fr 1fr 1fr auto;gap:18px;align-items:end}
.tsw-p2 .quickbar .field{padding-bottom:22px}
.tsw-p2 .quickbar .field label{font-size:11px;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--p2-muted);margin-bottom:9px}
.tsw-p2 .quickbar .field input{height:48px;padding:0 14px;border:1px solid #DCD9D2;border-radius:4px;
  background:#fff;font-size:15px;font-weight:400;color:var(--p2-navy)}
.tsw-p2 .quickbar .field input:focus{border-color:var(--p2-blue);box-shadow:0 0 0 3px rgba(17,30,142,.12);background:#fff}
.tsw-p2 .quickbar-submit{height:48px;border-radius:4px;padding:0 28px;font-size:15px;font-weight:600;
  background:var(--p2-navy);color:#fff;border:0;box-shadow:none;margin-bottom:22px;white-space:nowrap}
.tsw-p2 .quickbar-submit:hover{background:var(--p2-blue);color:#fff;transform:none;box-shadow:none}
.tsw-p2 .p2-planner-chips{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:20px}
.tsw-p2 .p2-planner-chips b{font-size:12.5px;color:var(--p2-muted);font-weight:400;margin-right:4px}
.tsw-p2 .p2-planner-chips a{background:#F7F5F1;border:1px solid #E8E5DF;border-radius:999px;
  padding:7px 15px;font-size:13px;color:#3F4A5A}
.tsw-p2 .p2-planner-chips a:hover{border-color:var(--p2-blue);color:var(--p2-blue)}

/* ==========================================================================
   2. TRUST METRICS — five rule-separated figures, no cards
   ========================================================================== */
.tsw-p2 .p2-trust{padding:86px 0 78px}
.tsw-p2 .p2-trust-grid{display:grid;grid-template-columns:repeat(5,1fr);
  border-top:1px solid var(--p2-line);border-bottom:1px solid var(--p2-line)}
.tsw-p2 .p2-trust-cell{padding:36px 30px 34px;border-right:1px solid var(--p2-line)}
.tsw-p2 .p2-trust-cell:last-child{border-right:0}
.tsw-p2 .p2-trust-val{font-family:var(--p2-serif);font-weight:300;font-size:46px;line-height:1;
  color:var(--p2-navy);letter-spacing:-.02em;white-space:nowrap}
.tsw-p2 .p2-trust-lab{margin-top:12px;font-size:13px;color:var(--p2-muted);line-height:1.45}

/* ==========================================================================
   3. INTERNATIONAL DESTINATIONS — editorial mosaic (1 featured + n tiles)
   ========================================================================== */
.tsw-p2 .p2-mosaic{display:grid;grid-template-columns:1.55fr 1fr 1fr;grid-auto-rows:270px;gap:18px}
.tsw-p2 .p2-mosaic-feat{grid-row:span 2}
.tsw-p2 .p2-tile{position:relative;overflow:hidden;border-radius:4px;display:block;background:var(--p2-sand)}
.tsw-p2 .p2-tile img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .6s cubic-bezier(.2,.6,.2,1)}
.tsw-p2 .p2-tile:hover img{transform:scale(1.03)}
.tsw-p2 .p2-tile::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,0) 45%,rgba(7,18,40,.8) 100%)}
.tsw-p2 .p2-mosaic-feat.p2-tile::after{background:linear-gradient(180deg,rgba(7,18,40,0) 42%,rgba(7,18,40,.86) 100%)}
.tsw-p2 .p2-tile-cap{position:absolute;left:22px;right:22px;bottom:20px;z-index:2;color:#fff;display:block}
.tsw-p2 .p2-mosaic-feat .p2-tile-cap{left:32px;right:32px;bottom:30px}
.tsw-p2 .p2-tile-kick{display:block;font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--p2-gold-light);margin-bottom:12px}
.tsw-p2 .p2-tile-cap h3{font-family:var(--p2-serif);font-weight:400;font-size:24px;line-height:1.15;
  margin:0 0 5px;color:#fff;letter-spacing:normal}
.tsw-p2 .p2-mosaic-feat .p2-tile-cap h3{font-size:38px;line-height:1.1;margin-bottom:10px}
.tsw-p2 .p2-tile-meta{display:block;font-size:12.5px;color:rgba(255,255,255,.74)}
.tsw-p2 .p2-mosaic-feat .p2-tile-desc{display:block;margin:0 0 16px;font-size:15px;color:rgba(255,255,255,.8);max-width:380px}

/* ==========================================================================
   4. DOMESTIC DESTINATIONS — ranked index beside an image panel
   ========================================================================== */
.tsw-p2 .p2-dom{display:grid;grid-template-columns:1fr 1.05fr;gap:80px;align-items:start}
.tsw-p2 .p2-dom-list{border-top:1px solid rgba(255,255,255,.14)}
.tsw-p2 a.p2-dom-row{display:flex;align-items:center;gap:22px;padding:19px 4px;
  border-bottom:1px solid rgba(255,255,255,.14);color:#fff}
.tsw-p2 a.p2-dom-row:hover{background:rgba(255,255,255,.04);color:#fff}
.tsw-p2 .p2-dom-n{font-size:11.5px;color:rgba(255,255,255,.4);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;width:26px;flex:0 0 26px}
.tsw-p2 .p2-dom-name{font-family:var(--p2-serif);font-size:26px;font-weight:400;flex:1;color:#fff;min-width:0}
.tsw-p2 .p2-dom-sub{font-size:13px;color:rgba(255,255,255,.55)}
.tsw-p2 .p2-dom-row svg{width:16px;height:16px;flex:0 0 16px;stroke:rgba(255,255,255,.5)}
.tsw-p2 .p2-dom-panel{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.tsw-p2 .p2-dom-panel .p2-tile{height:200px}
.tsw-p2 .p2-dom-panel .p2-dom-lead{grid-column:span 2;height:330px}

/* ==========================================================================
   5. CURATED JOURNEYS — horizontal package rail (scroll-snap)

   Replaces the alternating editorial rows. Everything is namespaced .p2-cj-*.
   ========================================================================== */
/* ---- Section shell ------------------------------------------------------ */
.tsw-p2 .p2-cj-section{background:var(--p2-ivory)}
/* The eyebrow keeps its gold rule but takes navy text. Measured on this
   section's ivory ground, --p2-gold (#FFA500) as 11px/600 type comes out at
   1.83:1 - nowhere near AA - so gold stays decorative here and the word itself
   is navy at 16.77:1. Scoped to this section only; the shared .p2-eyebrow
   rules are untouched. */
.tsw-p2 .p2-cj-section .p2-eyebrow span{color:var(--p2-navy)}
.tsw-p2 .p2-cj-lede{max-width:390px}
.tsw-p2 .p2-cj{position:relative}

/* ---- The rail ----------------------------------------------------------- *
   Native scroll-snap does all the scrolling. JS only decorates it, so with
   scripting disabled the rail still swipes, trackpad-scrolls and keyboard-
   scrolls exactly the same. overflow-x:auto isolates the horizontal scroll to
   this element - the document itself never gains a horizontal scrollbar.
   The vertical padding is what keeps the card's hover lift and its inset
   focus ring from being clipped by that same overflow. */
.tsw-p2 .p2-cj-track{
  list-style:none;margin:0;padding:6px 0 14px;
  display:flex;align-items:stretch;gap:28px;
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;
  scrollbar-width:none;-ms-overflow-style:none;
}
.tsw-p2 .p2-cj-track::-webkit-scrollbar{display:none}
.tsw-p2 .p2-cj-item{flex:0 0 calc((100% - 56px)/3);min-width:0;display:flex;scroll-snap-align:start}

/* ---- Card --------------------------------------------------------------- */
.tsw-p2 a.p2-cj-card{display:flex;flex-direction:column;width:100%;color:inherit;
  background:var(--p2-paper);border:1px solid var(--p2-line);border-radius:5px;overflow:hidden;
  transition:border-color .2s ease,transform .3s cubic-bezier(.2,.6,.2,1),box-shadow .3s ease}
.tsw-p2 a.p2-cj-card:hover{color:inherit;border-color:#D9D2C2;transform:translateY(-3px);
  box-shadow:0 14px 34px rgba(8,21,47,.10)}
/* Inset ring: an outset one would be clipped by the rail's own overflow. */
.tsw-p2 a.p2-cj-card:focus-visible{outline:2px solid var(--p2-navy);outline-offset:-2px}

.tsw-p2 .p2-cj-media{position:relative;aspect-ratio:4/3;overflow:hidden;background:var(--p2-sand)}
.tsw-p2 .p2-cj-media img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .6s cubic-bezier(.2,.6,.2,1)}
.tsw-p2 a.p2-cj-card:hover .p2-cj-media img{transform:scale(1.04)}

/* Deliberate image-less state. A package with no hero_image of its own gets a
   typographic panel at the identical ratio - never a stand-in photograph of
   somewhere else, and never a layout shift. */
.tsw-p2 .p2-cj-media.is-noimg{background:linear-gradient(155deg,#08152F 0%,#16305C 62%,#1E3E74 100%)}
.tsw-p2 .p2-cj-noimg{position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:15px;padding:0 24px;text-align:center}
.tsw-p2 .p2-cj-noimg b{font-family:var(--p2-serif);font-weight:300;font-size:27px;line-height:1.16;
  letter-spacing:-.012em;color:#fff}
.tsw-p2 .p2-cj-noimg i{display:block;width:34px;height:1px;background:var(--p2-gold-light)}

.tsw-p2 .p2-cj-content{flex:1;display:flex;flex-direction:column;padding:26px 26px 24px}
.tsw-p2 .p2-cj-dest{font-size:11px;letter-spacing:.2em;text-transform:uppercase;font-weight:600;
  color:var(--p2-navy);margin-bottom:11px}
.tsw-p2 h3.p2-cj-title{font-family:var(--p2-serif);font-weight:400;font-size:23px;line-height:1.2;
  letter-spacing:-.012em;color:var(--p2-navy);margin:0 0 12px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.tsw-p2 .p2-cj-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 14px;
  font-size:13px;color:var(--p2-body)}
.tsw-p2 .p2-cj-meta i{display:block;width:1px;height:11px;background:#D8D2C4;flex:0 0 1px}
.tsw-p2 .p2-cj-sum{margin:0 0 22px;font-size:14.5px;line-height:1.62;color:var(--p2-body);
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}

.tsw-p2 .p2-cj-foot{margin-top:auto;display:flex;align-items:flex-end;justify-content:space-between;
  gap:16px;flex-wrap:wrap;padding-top:18px;border-top:1px solid var(--p2-line)}
.tsw-p2 .p2-cj-price{display:flex;flex-direction:column;gap:3px;min-width:0}
.tsw-p2 .p2-cj-price small{font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;
  font-weight:600;color:var(--p2-body)}
.tsw-p2 .p2-cj-price b{font-family:var(--p2-serif);font-weight:400;font-size:24px;line-height:1.08;
  letter-spacing:-.01em;color:var(--p2-navy)}
.tsw-p2 .p2-cj-price em{font-style:normal;font-size:12px;color:var(--p2-body)}
/* Gold is load-bearing only as a rule and an arrow here: at #FFA500 it does not
   reach AA as small body text, so every label stays navy or --p2-body. */
.tsw-p2 .p2-cj-go{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;
  color:var(--p2-navy);white-space:nowrap;padding-bottom:3px;border-bottom:1px solid var(--p2-gold)}
.tsw-p2 .p2-cj-go svg{width:15px;height:15px;flex:0 0 15px;color:var(--p2-gold);transition:transform .22s ease}
.tsw-p2 a.p2-cj-card:hover .p2-cj-go svg{transform:translateX(3px)}

/* ---- Controls ----------------------------------------------------------- *
   Rendered hidden and revealed by initCuratedCarousel(), so a JS-less visitor
   is never shown buttons that cannot work. */
.tsw-p2 .p2-cj-bar{display:flex;align-items:center;justify-content:flex-start;gap:22px;margin-top:22px}
.tsw-p2 .p2-cj-bar[hidden]{display:none}
.tsw-p2 .p2-cj-dots{display:flex;align-items:center;gap:2px}
.tsw-p2 button.p2-cj-dot{width:24px;height:24px;padding:0;border:0;background:none;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;border-radius:50%}
.tsw-p2 button.p2-cj-dot::before{content:"";width:7px;height:7px;border-radius:50%;background:#C9C1AE;
  transition:background .18s ease,transform .18s ease}
.tsw-p2 button.p2-cj-dot[aria-current="true"]::before{background:var(--p2-gold);transform:scale(1.3)}
.tsw-p2 button.p2-cj-dot:focus-visible{outline:2px solid var(--p2-navy);outline-offset:1px}
.tsw-p2 .p2-cj-nav{display:flex;align-items:center;gap:10px}
.tsw-p2 button.p2-cj-arrow{width:46px;height:46px;padding:0;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;
  background:transparent;color:var(--p2-navy);border:1px solid var(--p2-line-warm);border-radius:50%;
  transition:background .18s ease,border-color .18s ease,color .18s ease}
.tsw-p2 button.p2-cj-arrow svg{width:18px;height:18px}
.tsw-p2 button.p2-cj-arrow:hover:not(:disabled){background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 button.p2-cj-arrow:focus-visible{outline:2px solid var(--p2-navy);outline-offset:2px}
.tsw-p2 button.p2-cj-arrow:disabled{opacity:.38;cursor:default}

.tsw-p2 .p2-cj-cta{margin-top:44px;padding-top:34px;border-top:1px solid var(--p2-line-warm);text-align:center}

/* ==========================================================================
   6. TRAVEL STYLES — see the .p2-travel-styles-* block at the end of this file

   The old portrait tiles borrowed .p2-tile, which the international and
   inbound sections also use, so this section could not be restyled without
   reaching into them. The redesign has its own namespace instead; the rules
   that lived here are gone because nothing references them any more.
   ========================================================================== */

/* ==========================================================================
   7. WHY TRIPSKYWAY — approved editorial two-column, 43/57
   ========================================================================== */
.tsw-p2 .p2-why{background:var(--p2-ivory);padding:120px 0 0}
.tsw-p2 .p2-why-grid{display:grid;grid-template-columns:39fr 61fr;gap:96px;align-items:start}

/* ---- Left column: the editorial anchor -------------------------------- */
.tsw-p2 .p2-why-intro{position:sticky;top:120px;display:flex;flex-direction:column;align-items:flex-start}
/* The eyebrow word is navy: --p2-gold measures under AA as 11px type on this
   ivory ground, so gold stays on the rule, the lozenge and the numerals. */
.tsw-p2 .p2-why-eyebrow span{color:var(--p2-navy)}
.tsw-p2 h2.p2-why-heading{font-family:var(--p2-serif);font-weight:300;font-size:58px;line-height:1.04;
  letter-spacing:-.028em;color:var(--p2-navy);margin:0 0 34px;max-width:12ch;text-wrap:balance}

/* Hairline-and-lozenge rule between the heading and the supporting line. */
.tsw-p2 .p2-why-rule{display:flex;align-items:center;gap:10px;width:210px;
  color:var(--p2-gold);margin:0 0 32px}
.tsw-p2 .p2-why-rule i{flex:1 1 auto;height:1px;
  background:linear-gradient(90deg,rgba(255,165,0,0) 0%,rgba(255,165,0,.55) 100%)}
.tsw-p2 .p2-why-rule i:last-child{background:linear-gradient(90deg,rgba(255,165,0,.55) 0%,rgba(255,165,0,0) 100%)}
.tsw-p2 .p2-why-rule svg{width:22px;height:11px;flex:0 0 22px;display:block}

.tsw-p2 .p2-why-intro-text{margin:0 0 34px;font-size:17px;line-height:1.72;
  color:var(--p2-body);max-width:430px;text-wrap:pretty}
.tsw-p2 a.p2-why-team{display:inline-flex;align-items:center;gap:12px;font-size:15px;font-weight:600;
  color:var(--p2-navy);border-bottom:1px solid var(--p2-gold);padding:6px 16px 9px 0;
  transition:color .18s ease,border-color .18s ease}
.tsw-p2 a.p2-why-team:hover{color:var(--p2-gold);border-bottom-color:var(--p2-gold)}
.tsw-p2 a.p2-why-team:focus-visible{outline:2px solid var(--p2-navy);outline-offset:3px}
.tsw-p2 a.p2-why-team svg{width:15px;height:15px;flex:0 0 15px;transition:transform .2s ease}
.tsw-p2 a.p2-why-team:hover svg{transform:translateX(3px)}

/* Line-art landscape. Deliberately faint - it is texture, not content, and
   must never compete with the heading above it. */
.tsw-p2 .p2-why-illustration{display:block;width:100%;max-width:500px;height:auto;
  margin:56px 0 0;color:#BE9A5C;opacity:.52;pointer-events:none}

/* ---- Right column: the four benefit rows ------------------------------ */
.tsw-p2 .p2-why-rows{list-style:none;margin:0;padding:0;border-top:1px solid var(--p2-line-warm)}
.tsw-p2 .p2-why-item{display:grid;grid-template-columns:86px 74px 1fr;align-items:start;
  padding:44px 0;border-bottom:1px solid var(--p2-line-warm)}
.tsw-p2 .p2-why-item:last-child{border-bottom:0}
.tsw-p2 .p2-why-mark{display:contents}
/* Measured on this ivory ground: the brand gold #FFA500 is 1.83:1, so it
   cannot carry these numerals. They used to use a one-off #A97D28 (3.44:1 -
   over the 3:1 large-text bar and nothing more); they now use the shared
   --p2-gold-text at 4.94:1, which clears AA outright and is one less private
   literal in the stylesheet. The brand gold is unchanged everywhere else and
   still carries the rule, the lozenge, the icons and the CTA underline. */
.tsw-p2 .p2-why-number{font-family:var(--p2-serif);font-weight:300;font-size:48px;line-height:.92;
  letter-spacing:-.03em;color:var(--p2-gold-text)}
/* Soft disc behind the icon - the reference's quiet badge, built from the
   existing paper token rather than a new colour. */
.tsw-p2 .p2-why-icon{width:60px;height:60px;display:flex;align-items:center;justify-content:center;
  border-radius:50%;background:var(--p2-paper);border:1px solid var(--p2-line-warm);
  color:var(--p2-gold);box-shadow:0 6px 18px rgba(8,21,47,.05)}
.tsw-p2 .p2-why-icon svg{width:27px;height:27px;display:block;stroke-width:1.05;fill:none}
.tsw-p2 .p2-why-content{padding-left:34px;border-left:1px solid var(--p2-line-faint);min-width:0}
.tsw-p2 h3.p2-why-title{font-family:var(--p2-serif);font-weight:400;font-size:27px;line-height:1.2;
  letter-spacing:-.012em;color:var(--p2-navy);margin:0 0 12px;text-wrap:balance}
.tsw-p2 .p2-why-description{margin:0;font-size:16px;line-height:1.72;color:var(--p2-body);
  max-width:52ch;text-wrap:pretty}

/* Closing hairline - articulates the boundary with the ivory Process section
   that follows, without touching the Process markup. */
.tsw-p2 .p2-why-close{height:1px;background:var(--p2-line-warm);margin-top:104px}

/* ==========================================================================
   8. THE PROCESS — approved five-step continuous timeline
   ========================================================================== */
.tsw-p2 .p2-process{background:var(--p2-ivory);padding:126px 0 108px}

/* ---- Head -------------------------------------------------------------- */
.tsw-p2 .p2-process-head{max-width:660px;margin-bottom:78px}
/* Navy, not the shared .p2-eyebrow-amber gold. Scoped to this section only, so
   Offers and Customer Experiences keep the treatment they have; the gold still
   carries the rule beside it. (The 2.74:1 this comment used to cite was
   measured against the pre-brand #C08A2E. --p2-gold-soft is now #8F5C00 and
   clears AA at 5.25:1 on ivory, so this override is a compositional choice -
   navy heads read quieter here - and no longer an accessibility repair.) */
.tsw-p2 .p2-process-eyebrow span{color:var(--p2-navy)}
.tsw-p2 h2.p2-process-h2{font-family:var(--p2-serif);font-weight:300;font-size:58px;line-height:1.04;
  letter-spacing:-.028em;color:var(--p2-navy);margin:0 0 20px;max-width:16ch;text-wrap:balance}
.tsw-p2 .p2-process-lede{margin:0;font-size:16.5px;line-height:1.7;
  color:var(--p2-body);max-width:56ch;text-wrap:pretty}

/* ---- The timeline ------------------------------------------------------ *
   A real <ol>. --p2-step-count comes from the markup, so adding or removing a
   step in the CMS re-divides the row instead of breaking it. */
.tsw-p2 ol.p2-steps{list-style:none;margin:0;padding:0;
  display:grid;grid-template-columns:repeat(var(--p2-step-count,5),minmax(0,1fr));column-gap:0}
.tsw-p2 .p2-step{min-width:0}
.tsw-p2 .p2-step-mark{position:relative;display:block;height:34px}
.tsw-p2 .p2-step-mark i{position:absolute;display:block}
.tsw-p2 i.p2-step-rail{top:9px;left:6px;width:calc(100% - 6px);height:1px;background:var(--p2-line-warm)}
.tsw-p2 .p2-step.is-last i.p2-step-rail{width:0}
.tsw-p2 i.p2-step-ring{top:3px;left:0;width:13px;height:13px;border-radius:50%;
  border:1px solid var(--p2-gold);background:var(--p2-ivory)}
.tsw-p2 i.p2-step-dot{top:8px;left:5px;width:3px;height:3px;border-radius:50%;background:var(--p2-gold)}

.tsw-p2 .p2-step-body{padding:26px 44px 0 0}
.tsw-p2 .p2-step-num{display:block;font-family:var(--p2-serif);font-weight:300;font-size:60px;line-height:1;
  letter-spacing:-.03em;color:var(--p2-navy);margin-bottom:18px}
/* The icon sits on a soft disc, the same quiet badge the Why section uses,
   built from existing tokens rather than a new colour. */
.tsw-p2 .p2-step-icon{width:54px;height:54px;display:flex;align-items:center;justify-content:center;
  border-radius:50%;background:var(--p2-paper);border:1px solid var(--p2-line-warm);
  color:var(--p2-gold);margin-bottom:24px;box-shadow:0 6px 18px rgba(8,21,47,.05)}
.tsw-p2 .p2-step-icon svg{width:25px;height:25px;display:block;stroke-width:1.05;fill:none}
/* Two lines are reserved so a one-line title ("You travel") does not start its
   description a line above its neighbours' - the five descriptions have to
   begin on the same baseline for the row to read as a timeline. */
.tsw-p2 h3.p2-step-title{font-family:var(--p2-serif);font-weight:400;font-size:25px;line-height:1.2;
  letter-spacing:-.012em;color:var(--p2-navy);margin:0 0 12px;min-height:2.4em;text-wrap:balance}
.tsw-p2 .p2-step-text{margin:0;font-size:15.5px;line-height:1.7;color:var(--p2-body);text-wrap:pretty}

/* ---- Closing rule ------------------------------------------------------- */
.tsw-p2 .p2-process-foot{display:flex;align-items:center;justify-content:flex-end;gap:22px;margin:88px 0 0}
.tsw-p2 i.p2-process-rule{flex:1 1 auto;height:1px;background:var(--p2-line-warm)}
/* Was #8A8579, which measures 3.4:1 on this ground - under AA for 11px type.
   --p2-body is 5.55:1 here and is already the section's body colour, so no new
   value is introduced. */
.tsw-p2 .p2-process-foot span{font-size:11px;letter-spacing:.26em;text-transform:uppercase;
  font-weight:600;color:var(--p2-body);white-space:nowrap}
.tsw-p2 .p2-process-foot b{width:3px;height:3px;border-radius:50%;background:var(--p2-gold);flex:0 0 3px}

/* ==========================================================================
   9. CURRENT OFFERS — approved premium editorial redesign
   ==========================================================================
   Own .p2-of-* namespace. The retired markup leaned on .p2-offer-kick, which
   Customer Experiences also uses (see .p2-wall-quote below), so nothing shared
   is restyled here — .p2-offer-kick is left in place further down, now owned
   solely by the Customer Experiences quote card.

   Gold carries the rules, the badge outline and the icons. It never carries
   small body text here: the brand gold measures 1.83:1 on the section's ivory
   and 1.97:1 on the white cards, nowhere near AA, so the destination label is
   navy (18.12:1) and every metadata line is --p2-body (6:1) instead. */

/* One dominant offer left (~58%), two image-led recommendations right (~42%). */
.tsw-p2 .p2-of-grid{display:grid;grid-template-columns:1.26fr 1fr;gap:42px;align-items:stretch}
.tsw-p2 .p2-of-head{margin-bottom:48px}
/* Navy, not the shared .p2-eyebrow-amber gold - a compositional choice scoped
   to this section; the gold rule beside the word is decorative. (--p2-gold-soft
   is #8F5C00 since the brand pass and clears AA on ivory at 5.25:1; the
   "under AA" this comment used to claim was true only of the old #C08A2E.) */
.tsw-p2 .p2-of-eyebrow span{color:var(--p2-navy)}
.tsw-p2 .p2-of-lede{margin:16px 0 0;max-width:54ch}

/* Shared: the short gold hairline that separates a title block from its
   figures, and the small decorative metadata glyph. */
.tsw-p2 i.p2-of-rule{display:block;width:76px;height:1px;background:var(--p2-gold);
  margin:0 0 18px;flex:0 0 auto}
.tsw-p2 i.p2-of-rule-light{background:var(--p2-gold-light);margin-bottom:20px}
.tsw-p2 svg.p2-of-i{width:14px;height:14px;flex:0 0 14px;color:var(--p2-gold);
  margin-right:8px;vertical-align:-2px}

/* ---- Featured offer ----------------------------------------------------- *
   Type sits on the photograph under a vertical ink scrim, so every label is
   white on near-opaque #071228 rather than gold on ivory. */
.tsw-p2 a.p2-of-feat{position:relative;display:block;overflow:hidden;border-radius:6px;
  min-height:660px;color:#fff;background:var(--p2-ink);isolation:isolate}
.tsw-p2 a.p2-of-feat:hover{color:#fff}
.tsw-p2 .p2-of-feat-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.22,.61,.36,1)}
.tsw-p2 a.p2-of-feat:hover .p2-of-feat-img{transform:scale(1.035)}
/* The scrim tracks where the type actually sits, in TWO layers.
 *
 * The previous single vertical ramp was transparent across the top of the
 * card, which was fine while the title stayed short - but a long title pushes
 * the badge and the first lines up into the bare photograph, and over a bright
 * frame (snow, sky, water) they stopped being readable. Measured over a pure
 * white photograph the badge fell to 1.07:1 and the title to 4.70:1.
 *
 *   HORIZONTAL layer - the readability layer. Every label on this card sits
 *   between 6.7% and 60% of the card's width (measured from the rendered
 *   rects, and the title's own max-width:15ch keeps it there however long the
 *   package name is). White type needs the ink at ~0.62 alpha to clear AA over
 *   a white frame, so this layer holds >= 0.74 right across that band and only
 *   then falls away - the right third of the photograph stays clearly visible.
 *
 *   VERTICAL layer - keeps the existing bottom weight, so the price and CTA
 *   still sit on ink at the point where the horizontal ramp has thinned.
 *
 * Navy (--p2-navy #08152F) rather than near-black: it reads as a cinematic
 * editorial grade rather than a black filter. */
.tsw-p2 .p2-of-feat-scrim{position:absolute;inset:0;display:block;pointer-events:none;
  background:
    linear-gradient(180deg,rgba(8,21,47,0) 0%,rgba(8,21,47,0) 46%,
      rgba(8,21,47,.16) 76%,rgba(8,21,47,.30) 100%),
    linear-gradient(90deg,rgba(8,21,47,.90) 0%,rgba(8,21,47,.84) 34%,
      rgba(8,21,47,.74) 58%,rgba(8,21,47,.34) 78%,rgba(8,21,47,.04) 100%)}
/* Image-less fallback: the same proportions, a deep navy ground and a quiet
   gold wash — never another destination's photograph. */
.tsw-p2 a.p2-of-feat.is-noimg{background:
  radial-gradient(120% 90% at 12% 8%,rgba(255,165,0,.16) 0%,rgba(255,165,0,0) 58%),
  linear-gradient(160deg,#0E2145 0%,#071228 62%)}
.tsw-p2 a.p2-of-feat.is-noimg .p2-of-feat-scrim{
  background:linear-gradient(180deg,rgba(7,18,40,0) 40%,rgba(7,18,40,.55) 100%)}
.tsw-p2 .p2-of-feat-body{position:relative;z-index:2;display:flex;flex-direction:column;align-items:flex-start;
  height:100%;justify-content:flex-end;padding:46px 48px 44px;max-width:600px}

/* Restrained: a hairline label, not a promotional chip. No "SALE", no "% off",
   and it appears on the featured offer only. */
.tsw-p2 .p2-of-badge{display:inline-flex;align-items:center;margin-bottom:20px;
  font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;font-weight:600;
  color:var(--p2-gold-light);border:1px solid rgba(255,192,97,.5);
  padding:7px 13px;border-radius:2px}
.tsw-p2 h3.p2-of-feat-title{display:block;font-family:var(--p2-serif);font-weight:300;font-size:44px;
  line-height:1.1;letter-spacing:-.02em;color:#fff;margin:0 0 20px;max-width:15ch;text-wrap:balance}
.tsw-p2 .p2-of-feat-meta{display:flex;align-items:center;flex-wrap:wrap;gap:8px 22px;margin-bottom:18px;
  font-size:13px;letter-spacing:.02em;color:rgba(255,255,255,.86)}
.tsw-p2 .p2-of-feat-meta > span{display:inline-flex;align-items:center;white-space:nowrap}
.tsw-p2 .p2-of-feat-sum{display:block;font-size:15.5px;line-height:1.68;color:rgba(255,255,255,.82);
  margin-bottom:24px;max-width:44ch;text-wrap:pretty}
.tsw-p2 .p2-of-feat-price{display:flex;align-items:baseline;gap:10px;margin-bottom:26px;flex-wrap:wrap}
.tsw-p2 .p2-of-feat-price small{font-size:11.5px;letter-spacing:.18em;text-transform:uppercase;
  color:rgba(255,255,255,.74)}
.tsw-p2 .p2-of-feat-price b{font-family:var(--p2-serif);font-weight:400;font-size:34px;
  letter-spacing:-.015em;color:#fff}
.tsw-p2 .p2-of-feat-price em{font-style:normal;font-size:13px;color:rgba(255,255,255,.78)}
/* An outlined affordance rather than a filled button: the same restraint as
   the badge, and it reads as a link because it is one. */
.tsw-p2 .p2-of-feat-go{display:inline-flex;align-items:center;gap:12px;font-size:13.5px;font-weight:600;
  letter-spacing:.02em;color:#fff;padding:15px 26px;border:1px solid rgba(255,192,97,.55);
  border-radius:3px;transition:background-color .25s ease,border-color .25s ease}
.tsw-p2 .p2-of-feat-go svg{width:17px;height:17px;transition:transform .3s cubic-bezier(.22,.61,.36,1)}
.tsw-p2 a.p2-of-feat:hover .p2-of-feat-go{border-color:var(--p2-gold-light);background:rgba(255,192,97,.12)}
.tsw-p2 a.p2-of-feat:hover .p2-of-feat-go svg{transform:translateX(5px)}

/* ---- The two supporting offers ------------------------------------------ *
   Image-led editorial rows, not boxed cards: no border box, no shadow, no
   fill — the hairline alone does the separating. */
.tsw-p2 ul.p2-of-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}
.tsw-p2 .p2-of-row{flex:1;display:flex;min-width:0}
.tsw-p2 .p2-of-row + .p2-of-row{border-top:1px solid var(--p2-line-warm)}
.tsw-p2 a.p2-of-item{display:grid;grid-template-columns:200px minmax(0,1fr);gap:30px;
  align-items:stretch;width:100%;min-width:0;color:inherit;padding:30px 0}
.tsw-p2 .p2-of-row:first-child a.p2-of-item{padding-top:0}
.tsw-p2 .p2-of-row:last-child a.p2-of-item{padding-bottom:0}
.tsw-p2 a.p2-of-item:hover{color:inherit}
.tsw-p2 .p2-of-thumb{display:block;position:relative;overflow:hidden;border-radius:6px;
  min-height:260px;background:var(--p2-ink)}
.tsw-p2 .p2-of-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.22,.61,.36,1)}
.tsw-p2 a.p2-of-item:hover .p2-of-thumb img{transform:scale(1.05)}
/* Same designed panel as the featured card, at row scale. */
.tsw-p2 .p2-of-thumb.is-noimg{background:
  radial-gradient(120% 90% at 18% 10%,rgba(255,165,0,.18) 0%,rgba(255,165,0,0) 60%),
  linear-gradient(160deg,#0E2145 0%,#071228 64%)}
.tsw-p2 .p2-of-body{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;
  min-width:0}
.tsw-p2 .p2-of-row:first-child .p2-of-body{border-top:1px solid var(--p2-line-warm);padding-top:26px;
  justify-content:flex-start}
/* Navy, not gold: the brand gold measures 1.97:1 against the white this
   label actually sits on. Navy is 18.12:1. */
.tsw-p2 .p2-of-dest{display:block;margin-bottom:12px;font-size:11px;letter-spacing:.22em;
  text-transform:uppercase;font-weight:600;color:var(--p2-navy)}
.tsw-p2 h3.p2-of-title{display:block;font-family:var(--p2-serif);font-weight:400;font-size:26px;
  line-height:1.16;letter-spacing:-.014em;color:var(--p2-navy);margin:0 0 14px;text-wrap:pretty;
  transition:opacity .25s ease}
.tsw-p2 a.p2-of-item:hover h3.p2-of-title{opacity:.62}
.tsw-p2 .p2-of-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px 18px;margin-bottom:18px;
  font-size:13px;letter-spacing:.02em;color:var(--p2-body)}
.tsw-p2 .p2-of-meta > span{display:inline-flex;align-items:center;white-space:nowrap}
.tsw-p2 .p2-of-price{display:flex;align-items:baseline;gap:9px;margin-bottom:18px;flex-wrap:wrap}
.tsw-p2 .p2-of-price small{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--p2-body)}
.tsw-p2 .p2-of-price b{font-family:var(--p2-serif);font-weight:400;font-size:26px;
  letter-spacing:-.012em;color:var(--p2-navy)}
.tsw-p2 .p2-of-price em{font-style:normal;font-size:12.5px;color:var(--p2-body)}
.tsw-p2 .p2-of-go{display:inline-flex;align-items:center;gap:10px;font-size:12.5px;font-weight:600;
  letter-spacing:.02em;color:var(--p2-navy);border-bottom:1px solid var(--p2-gold);padding-bottom:5px}
.tsw-p2 .p2-of-go svg{width:16px;height:16px;transition:transform .3s cubic-bezier(.22,.61,.36,1)}
.tsw-p2 a.p2-of-item:hover .p2-of-go svg{transform:translateX(5px)}

/* .p2-offer-kick is retained below under Customer Experiences, which is now
   its only consumer. */
.tsw-p2 .p2-offer-kick{font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--p2-gold-soft);margin-bottom:16px}

/* ==========================================================================
   NEUTRAL NO-IMAGE STATES — package cards, destination cards, interior heroes
   ==========================================================================
   These replace three hard-coded photographic fallbacks that put the wrong
   picture in front of the visitor: /assets/images/website/pkg-maldives.jpg (a
   blue sports car) stood in for every package without a hero_image, and
   /assets/images/website/dest-bali.jpg (a Balinese temple) stood in for every
   destination without one - so Kashmir and Kerala both advertised Bali.

   Deliberately NOT coupled to the Phase 2 .p2-*-is-noimg panels: those live
   under the .tsw-p2 wrapper with their own namespaces, while .card-media and
   .dest-card are Phase 1 components. These rules use the Phase 1 tokens and
   sit outside the frozen Phase 1 block, so the frozen CSS is untouched and the
   existing .card-media (4/3) and .dest-card (3/4) boxes keep their dimensions.

   Every glyph is decorative and marked aria-hidden in the markup: the card
   link already carries the name in aria-label, the destination overlay in its
   <h3> and the interior hero in its <h1>. */
.card-media.is-noimg,
.dest-card.is-noimg{
  background:
    radial-gradient(120% 90% at 22% 12%,rgba(245,158,11,.16) 0%,rgba(245,158,11,0) 60%),
    linear-gradient(155deg,#16233D 0%,#0F172A 68%);
}
.tsw-noimg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  color:rgba(245,158,11,.42);pointer-events:none}
.tsw-noimg svg{width:34%;max-width:96px;height:auto;display:block}
.dest-card.is-noimg .tsw-noimg{align-items:flex-start;padding-top:16%}
/* The overlay gradient exists to lift white type off a photograph; over the
   flat panel it only muddies it, so it is softened rather than removed (the
   type keeps a ground either way). */
.dest-card.is-noimg .overlay{background:linear-gradient(180deg,rgba(0,0,0,0) 55%,rgba(0,0,0,.55))}

/* Interior hero: .page-hero already paints var(--tsw-ink) and its own scrim,
   and the 96px padding lives on .page-hero.with-img, so removing the <img>
   costs no height. This only stops the panel reading as a flat accident. */
.page-hero.with-img.is-noimg{
  background:
    radial-gradient(90% 140% at 12% 0%,rgba(245,158,11,.14) 0%,rgba(245,158,11,0) 62%),
    linear-gradient(155deg,#16233D 0%,#0F172A 70%);
}
.page-hero.with-img.is-noimg::after{background:linear-gradient(180deg,rgba(11,18,32,.10),rgba(11,18,32,.45))}


/* ==========================================================================
   10b. TRAVELLER STORIES — YouTube videos as portrait cards, played in place
   ==========================================================================
   Own .p2-vr-* namespace. Nothing shared is restyled: .p2-eyebrow-amber,
   .p2-cj-*, .p2-process-* and .p2-of-* are all untouched, and the
   only shared classes borrowed (.p2-sec, .p2-wrap, .p2-head, .p2-h2, .p2-lede)
   are used exactly as every other section uses them.

   The page ships with ZERO YouTube players: a card is YouTube's own still plus
   a play mark, and the privacy-enhanced player is mounted INTO THAT CARD only
   when someone clicks. At most one player exists at a time. YouTube's IFrame
   Player API is never loaded, so `script-src 'self'` is unchanged; the only CSP
   additions anywhere are `frame-src https://www.youtube-nocookie.com` and
   `img-src https://i.ytimg.com`. */
.tsw-p2 .p2-vr-head{margin-bottom:46px}
/* Navy, not the shared .p2-eyebrow-amber gold. Scoped to this section only;
   the gold rule beside it is decorative and stays. (--p2-gold-soft measures
   5.03:1 on this sand ground since the brand pass moved it to #8F5C00; the
   2.69:1 this comment used to cite belonged to the old #C08A2E.) */
.tsw-p2 .p2-vr-eyebrow span{color:var(--p2-navy)}
.tsw-p2 .p2-vr-lede{margin:16px 0 0;max-width:52ch}

/* ---- The rail ------------------------------------------------------------ */
.tsw-p2 .p2-vr-rail{position:relative}
.tsw-p2 ul.p2-vr-track{list-style:none;margin:0;padding:4px 0 6px;display:flex;gap:18px;
  overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;-ms-overflow-style:none;
  overscroll-behavior-x:contain}
.tsw-p2 ul.p2-vr-track::-webkit-scrollbar{display:none}
/* --p2-vr-count comes from the markup: fewer reviews than the rail can show
   share the row instead of leaving a gap, the same trick --p2-step-count uses
   in The Process. Five across on desktop. */
.tsw-p2 .p2-vr-item{--p2-vr-across:min(var(--p2-vr-count,5),5);
  flex:0 0 calc((100% - 18px * (var(--p2-vr-across) - 1)) / var(--p2-vr-across));
  min-width:0;scroll-snap-align:start}

/* ---- The card ------------------------------------------------------------ *
   Portrait, shortened to 3:4.35 so five of them do not make the section taller
   than the rest of the homepage rhythm. The 9:16 video window sits centred
   inside it - see "The video window" below. */
/* A <button>, not a link: opening the reel is an in-page action and the
   visitor is never sent to YouTube. The UA button styling is reset here so
   the card looks identical to the link it replaced. */
.tsw-p2 button.p2-vr-card{display:block;width:100%;padding:0;margin:0;font:inherit;text-align:inherit;
  border-radius:10px;overflow:hidden;cursor:pointer;-webkit-appearance:none;appearance:none;
  border:1px solid var(--p2-line);background:var(--p2-ink);color:inherit;
  transition:transform .45s cubic-bezier(.22,.61,.36,1),border-color .25s ease}
.tsw-p2 button.p2-vr-card:hover{transform:translateY(-3px);border-color:var(--p2-line-warm);color:inherit}
/* Keyboard focus must be visible - the card is the only control on the tile. */
.tsw-p2 button.p2-vr-card:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px;
  border-color:var(--p2-line-warm)}
.tsw-p2 .p2-vr-media{position:relative;display:block;aspect-ratio:3/4.35;overflow:hidden;
  background:
    radial-gradient(120% 80% at 50% 0%,rgba(255,165,0,.10) 0%,rgba(255,165,0,0) 58%),
    linear-gradient(158deg,#16294D 0%,#071228 66%)}

/* ---- The video window ----------------------------------------------------- *
   THE FIX FOR THE SIDE BARS.

   These stories are portrait videos, and the card is 3:4.35 - wider than 9:16.
   Previously the <iframe> filled the whole card, so YOUTUBE pillarboxed the
   video with ITS OWN black inside the frame, and that black met the card edge:
   two hard strips we could not style, because they are painted by a
   cross-origin document.

   The window below is 9:16 - the videos' own ratio - centred in the card. The
   video therefore fills its frame edge to edge and Youtube paints no bars at
   all; the space either side is OUR navy mat, with a soft radial warm-up above
   and a hairline around the screen so it reads as a deliberate cinematic
   frame. Nothing is stretched, nothing is cropped by us, and the traveller is
   never cut into.

   The still and the player share the identical rectangle, so pressing play
   swaps one for the other with no jump. `cover` on a 9:16 window also lands
   almost exactly on the portrait content inside YouTube's 4:3 hqdefault.jpg,
   which is what removes the baked-in bars from the still as well. */
.tsw-p2 .p2-vr-media img,
.tsw-p2 .p2-vr-media iframe,
.tsw-p2 .p2-vr-veil{position:absolute;top:50%;left:50%;
  transform:translate(-50%,-50%);height:100%;width:auto;aspect-ratio:9/16;max-width:100%;
  border-radius:7px;display:block}
.tsw-p2 .p2-vr-media img{object-fit:cover;
  transition:transform .6s cubic-bezier(.22,.61,.36,1)}
.tsw-p2 button.p2-vr-card:hover .p2-vr-media img{transform:translate(-50%,-50%) scale(1.04)}
/* Both stills failed (a private or removed video). The <img> is hidden by JS
   rather than left to paint the browser's broken-image glyph, and the card
   falls back to the designed panel above - never a photograph from elsewhere
   on the site. */
.tsw-p2 .p2-vr-media img[hidden]{display:none}
/* A gentle ink veil so the white play mark reads on any still, plus the
   hairline that separates the screen from the mat. Scoped to the window, so
   the mat itself stays clean. */
.tsw-p2 .p2-vr-veil{pointer-events:none;z-index:1;transition:opacity .25s ease;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.07);
  background:linear-gradient(180deg,rgba(8,21,47,.24) 0%,rgba(8,21,47,.06) 44%,rgba(8,21,47,.42) 100%)}

/* ---- The play mark -------------------------------------------------------- *
   Understated on purpose: a thin light ring, a translucent ink disc and a
   white glyph. It is the only interactive affordance on the card, so it stays
   plainly legible, but it never competes with the video behind it.

   The disc alpha is .48 rather than something lighter for a measured reason.
   A play mark is a user-interface component, so WCAG 1.4.11 asks for 3:1, and
   the worst ground it can ever sit on is a video frame that happens to be
   white. Sampled against a forced pure-white frame the white glyph measures
   2.50:1 at .34 and 3.62:1 at .48 - so .48 is the point where the mark stays
   legible on the brightest possible video while still reading as translucent
   over a dark one, where it measures 17.8:1. */
.tsw-p2 .p2-vr-play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;
  width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  border:1px solid rgba(255,255,255,.82);background:rgba(9,20,44,.48);color:#fff;
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);
  transition:background-color .25s ease,border-color .25s ease,transform .25s ease,opacity .25s ease}
.tsw-p2 .p2-vr-play svg{width:23px;height:23px;margin-left:2px}
.tsw-p2 button.p2-vr-card:hover .p2-vr-play,
.tsw-p2 button.p2-vr-card:focus-visible .p2-vr-play{background:rgba(9,20,44,.68);
  border-color:#fff;transform:translate(-50%,-50%) scale(1.04)}

/* The player, once a click has mounted it. Same rectangle as the still above,
   so nothing moves; z-index puts it over the veil and the play mark. */
.tsw-p2 .p2-vr-media iframe{border:0;background:transparent;z-index:3}
/* While a video plays the card stops behaving like a button: no lift, no zoom,
   and the play mark and veil get out of the way. */
.tsw-p2 button.p2-vr-card.is-playing{transform:none;cursor:default}
.tsw-p2 button.p2-vr-card.is-playing .p2-vr-play,
.tsw-p2 button.p2-vr-card.is-playing .p2-vr-veil{opacity:0;pointer-events:none}
.tsw-p2 button.p2-vr-card.is-playing:hover .p2-vr-media img{transform:translate(-50%,-50%)}

/* ---- Controls ------------------------------------------------------------ *
   Below the rail, matching the Travel Moments treatment: the rail spans the
   full wrap at every width, so a side arrow would sit over a card. */
.tsw-p2 .p2-vr-bar{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:28px}
.tsw-p2 .p2-vr-bar[hidden]{display:none}
.tsw-p2 button.p2-vr-nav{width:46px;height:46px;flex:0 0 46px;border-radius:50%;
  background:var(--p2-paper);border:1px solid var(--p2-line);color:var(--p2-navy);
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background-color .2s ease,border-color .2s ease,opacity .2s ease}
.tsw-p2 button.p2-vr-nav svg{width:19px;height:19px}
.tsw-p2 button.p2-vr-nav:hover:not(:disabled){background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 button.p2-vr-nav:disabled{opacity:.32;cursor:default}
.tsw-p2 .p2-vr-dots{display:flex;justify-content:center;gap:9px}
.tsw-p2 .p2-vr-dots[hidden]{display:none}
.tsw-p2 button.p2-vr-dot{width:8px;height:8px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:var(--p2-line-warm);transition:background-color .2s ease,transform .2s ease}
.tsw-p2 button.p2-vr-dot[aria-current="true"]{background:var(--p2-gold);transform:scale(1.25)}
.tsw-p2 button.p2-vr-nav:focus-visible,
.tsw-p2 button.p2-vr-dot:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}


/* ==========================================================================
   11b. GOOGLE REVIEWS — manually curated social proof
   ==========================================================================
   Own .p2-gr-* namespace. Nothing shared is restyled: .p2-vr-* (Traveller
   Stories), .p2-cj-*, .p2-of-* and .p2-process-* are all untouched, and the
   only shared classes borrowed (.p2-sec, .p2-wrap, .p2-head, .p2-h2, .p2-lede,
   .p2-eyebrow-amber) are used exactly as every other section uses them.

   The section makes no third-party request of any kind - no Google API, no
   Maps iframe, no script, no remote image. Everything below is local CSS over
   local markup, and the only outbound reference on the page is one <a href>
   to the business's Google listing. */
.tsw-p2 .p2-gr{background:var(--p2-ivory)}
/* One row, two columns, ONE rule underneath. The hairline used to sit only
   above the rating block, which made the score read as a widget parked beside
   the heading; running it under the whole row instead ties the two halves into
   a single header and gives the cards a clean edge to sit below. */
.tsw-p2 .p2-gr-head{display:flex;align-items:flex-end;justify-content:space-between;
  gap:48px;flex-wrap:wrap;margin-bottom:38px;padding-bottom:24px;
  border-bottom:1px solid var(--p2-line-warm)}
/* Navy, not the shared .p2-eyebrow-amber gold. Scoped to this section only;
   the gold rule beside it is decorative and stays. (--p2-gold-soft measures
   5.25:1 on this ivory ground since the brand pass moved it to #8F5C00; the
   2.69:1 this comment used to cite belonged to the old #C08A2E.) */
.tsw-p2 .p2-gr-eyebrow span{color:var(--p2-navy)}
.tsw-p2 .p2-gr-lede{margin:16px 0 0;max-width:52ch}

/* ---- The rating summary --------------------------------------------------- *
   Configured values, not a live feed. Sits opposite the heading on desktop and
   drops beneath it once the row can no longer hold both. */
.tsw-p2 .p2-gr-score{display:flex;align-items:flex-end;gap:18px;padding:0 0 2px}
.tsw-p2 .p2-gr-score-num{font-family:var(--p2-serif);font-weight:300;font-size:54px;line-height:1;
  color:var(--p2-navy);letter-spacing:-.02em}
.tsw-p2 .p2-gr-score-meta{padding-bottom:5px}
.tsw-p2 .p2-gr-score-meta p{margin:7px 0 0;font-size:13.5px;color:var(--p2-body);
  display:flex;align-items:center;gap:7px}
/* Five outlined stars, the first N filled. --p2-gold-light is decorative here,
   never a carrier of text: the score itself is navy at 15:1 beside it. */
.tsw-p2 .p2-gr-stars{display:inline-flex;gap:3px;font-size:15px;line-height:1;letter-spacing:0}
/* The filled star is a text glyph, so 4.5:1 is the bar, not the 3:1 WCAG
   1.4.11 asks of a graphic. Measured on the ivory this rail actually sits on:
   the brand orange #FFA500 is 1.83:1 and the earlier #AD8027 only 3.3:1 - both
   short. The shared --p2-gold-text (#946000) is 4.94:1 here and still reads as
   the same gold, so this section now uses the site's accessible gold rather
   than a literal of its own. */
.tsw-p2 .p2-gr-star{color:var(--p2-line-warm)}
.tsw-p2 .p2-gr-star.is-on{color:var(--p2-gold-text)}
.tsw-p2 .p2-gr-score .p2-gr-stars{font-size:18px}

/* ---- The rail ------------------------------------------------------------- */
.tsw-p2 .p2-gr-rail{position:relative}
.tsw-p2 ul.p2-gr-track{list-style:none;margin:0;padding:4px 0 6px;display:flex;gap:20px;
  overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;-ms-overflow-style:none;
  overscroll-behavior-x:contain;align-items:stretch}
.tsw-p2 ul.p2-gr-track::-webkit-scrollbar{display:none}
/* --p2-gr-count comes from the markup: fewer reviews than the rail can show
   share the row instead of leaving a gap. Four across on desktop. */
.tsw-p2 .p2-gr-item{--p2-gr-across:min(var(--p2-gr-count,4),4);
  flex:0 0 calc((100% - 20px * (var(--p2-gr-across) - 1)) / var(--p2-gr-across));
  min-width:0;max-width:400px;scroll-snap-align:start;display:flex}

/* ---- The card ------------------------------------------------------------- *
   Hairline border on paper, no drop shadow and no SaaS chrome. `stretch` on
   the item plus `flex:1` here is what keeps every card in a row the same
   height whatever the review length; margin-top:auto pins the byline to the
   bottom so the names line up across the row. */
.tsw-p2 .p2-gr-card{flex:1;display:flex;flex-direction:column;margin:0;
  background:var(--p2-paper);border:1px solid var(--p2-line);border-radius:10px;
  padding:24px 22px 20px;transition:border-color .25s ease,transform .35s ease}
.tsw-p2 .p2-gr-card:hover{border-color:var(--p2-line-warm);transform:translateY(-2px)}
/* ---- The Google mark ------------------------------------------------------ *
   Google's own four-colour "G", inline in the page. No external request, no
   Google script, nothing a blocker can break - and small enough to identify
   the source without dominating the card. */
.tsw-p2 .p2-gr-g{width:16px;height:16px;display:block;flex:0 0 16px}
.tsw-p2 .p2-gr-top{display:flex;align-items:center;justify-content:space-between;gap:12px}
.tsw-p2 .p2-gr-top .p2-gr-g{width:17px;height:17px;flex:0 0 17px}

/* ---- The review, previewed -------------------------------------------------
   The FULL review is always in the markup; this only clamps what is shown to
   four lines. Nothing is truncated in the database or the HTML, so a visitor
   without JavaScript reads the whole thing - the clamp is lifted by .is-open,
   which the Read more button toggles. The min-height reserves exactly one line
   so a one-line review and a four-line one still produce cards of a sane
   shape before the flex row equalises them. */
.tsw-p2 .p2-gr-text{font-family:var(--p2-serif);font-weight:300;font-size:15.5px;line-height:1.62;
  color:var(--p2-ink);margin:12px 0 0;text-wrap:pretty;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden}
.tsw-p2 .p2-gr-card.is-open .p2-gr-text{-webkit-line-clamp:unset;overflow:visible}

/* ---- Read more ------------------------------------------------------------ *
   A real button - it changes what is on screen, it does not navigate. Hidden
   until website.js has measured that the review genuinely overflows the clamp,
   so a short review never offers it. */
/* align-self keeps the button hugging its own words. Without it the flex
   column stretches it edge to edge and the underline reads as a divider rule
   rather than a link. */
.tsw-p2 button.p2-gr-more{align-self:flex-start;margin:9px 0 0;padding:0;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:12.5px;font-weight:600;letter-spacing:.01em;color:var(--p2-navy);
  border-bottom:1px solid var(--p2-line-warm);line-height:1.5;
  transition:border-color .2s ease,color .2s ease}
.tsw-p2 button.p2-gr-more:hover{border-bottom-color:var(--p2-navy)}
.tsw-p2 button.p2-gr-more:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
.tsw-p2 button.p2-gr-more[hidden]{display:none}
/* margin-top:auto pins the byline to the bottom of the card, and the flex
   stretch on the item is what makes every card in a row the same height. No
   min-height on the quote: it would only pad a short review with dead space,
   which is the opposite of what a single-review section needs. */
.tsw-p2 .p2-gr-by{display:block;margin-top:auto;padding-top:18px}
.tsw-p2 .p2-gr-name{display:block;font-size:14.5px;font-weight:600;color:var(--p2-navy)}
/* --p2-body, which reads as secondary against the navy name above it. (This
   used to be an accessibility repair - --p2-muted was #8A93A2 and measured
   2.97:1 here. The brand pass moved --p2-muted to #636D7C, which clears AA on
   every light ground the site uses, so the choice is now about hierarchy
   rather than legibility. Left as --p2-body: the date should stay quieter than
   the name, and it already is.) */
.tsw-p2 .p2-gr-when{display:block;font-size:12.5px;color:var(--p2-body);margin-top:2px}
.tsw-p2 .p2-gr-src{display:flex;align-items:center;gap:7px}
/* Plain-text attribution, not Google's logo or wordmark styling. */
/* "Google review" beside the mark: sentence case rather than the old
   letter-spaced caps, which read as a system label instead of an attribution. */
.tsw-p2 .p2-gr-src{margin-top:10px;padding-top:10px;border-top:1px solid var(--p2-line)}
.tsw-p2 .p2-gr-src > span{font-size:12px;letter-spacing:.01em;color:var(--p2-body)}

/* ---- Controls ------------------------------------------------------------- */
.tsw-p2 .p2-gr-bar{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:28px}
.tsw-p2 .p2-gr-bar[hidden]{display:none}
.tsw-p2 button.p2-gr-nav{width:46px;height:46px;flex:0 0 46px;border-radius:50%;
  background:var(--p2-paper);border:1px solid var(--p2-line);color:var(--p2-navy);
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  transition:background-color .2s ease,border-color .2s ease,opacity .2s ease}
.tsw-p2 button.p2-gr-nav svg{width:19px;height:19px}
.tsw-p2 button.p2-gr-nav:hover:not(:disabled){background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 button.p2-gr-nav:disabled{opacity:.32;cursor:default}
.tsw-p2 .p2-gr-dots{display:flex;justify-content:center;gap:9px}
.tsw-p2 .p2-gr-dots[hidden]{display:none}
.tsw-p2 button.p2-gr-dot{width:8px;height:8px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:var(--p2-line-warm);transition:background-color .2s ease,transform .2s ease}
.tsw-p2 button.p2-gr-dot[aria-current="true"]{background:var(--p2-gold);transform:scale(1.25)}
.tsw-p2 button.p2-gr-nav:focus-visible,
.tsw-p2 button.p2-gr-dot:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- The outbound CTA ----------------------------------------------------- *
   The editorial link treatment the rest of the site uses, not a button: it is
   navigation to somewhere else, and it is where the live review set actually
   lives. */
.tsw-p2 .p2-gr-cta-row{display:flex;justify-content:center;margin-top:34px}
.tsw-p2 a.p2-gr-cta{display:inline-flex;align-items:center;gap:9px;
  font-size:14.5px;font-weight:600;letter-spacing:.01em;color:var(--p2-navy);text-decoration:none;
  padding:13px 26px;border:1px solid var(--p2-line-warm);border-radius:999px;background:var(--p2-paper);
  transition:background-color .25s ease,border-color .25s ease,color .25s ease}
.tsw-p2 a.p2-gr-cta svg{width:17px;height:17px;transition:transform .25s ease}
.tsw-p2 a.p2-gr-cta:hover{background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 a.p2-gr-cta:hover svg{transform:translateX(3px)}
.tsw-p2 a.p2-gr-cta:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
/* The link's visible words are "See all reviews on Google"; this adds the
   destination for a screen-reader user without printing it on the page. */
.tsw-p2 .p2-gr-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}


/* ==========================================================================
   12. FAQ — hairline rows, no card stack
   ========================================================================== */
.tsw-p2 .p2-faq{max-width:900px;margin:0}
.tsw-p2 .p2-faq .acc-item{background:none;border:0;border-top:1px solid var(--p2-line);
  border-radius:0;margin:0;overflow:hidden}
.tsw-p2 .p2-faq .acc-item:last-child{border-bottom:1px solid var(--p2-line)}
.tsw-p2 .p2-faq .acc-q{padding:26px 0;font-family:var(--p2-serif);font-size:22px;font-weight:400;
  line-height:1.3;color:var(--p2-navy);letter-spacing:-.01em}
.tsw-p2 .p2-faq .acc-q .chev{color:var(--p2-gold-soft)}
.tsw-p2 .p2-faq .acc-a{padding:0}
.tsw-p2 .p2-faq .acc-item.open .acc-a{padding-bottom:26px}
.tsw-p2 .p2-faq .acc-a p{font-size:16px;line-height:1.7;color:var(--p2-body);max-width:66ch}

/* ==========================================================================
   13. TRAVEL INSPIRATION / MEDIA — feature + list, adapts to any count
   ========================================================================== */

/* ==========================================================================
   14. TRUSTED TRAVEL PARTNERS — grouped wordmark rail, no logo boxes
   ========================================================================== */
.tsw-p2 .p2-partners{padding:76px 0 72px}
.tsw-p2 .p2-partners-head{max-width:560px;margin:0 0 34px}
.tsw-p2 .p2-partners-head h2{font-family:var(--p2-serif);font-weight:300;font-size:38px;line-height:1.12;
  letter-spacing:-.024em;color:var(--p2-navy);margin:0 0 12px}
.tsw-p2 .p2-partners-head p{margin:0;font-size:16px;line-height:1.68;color:var(--p2-body)}

/* ==========================================================================
   15. CAREERS + FINAL CTA
   ========================================================================== */
.tsw-p2 .p2-career{display:grid;grid-template-columns:1fr 1fr;background:var(--p2-navy);
  border-radius:4px;overflow:hidden}
.tsw-p2 .p2-career-body{padding:56px 52px}
.tsw-p2 .p2-career-kick{font-size:11px;letter-spacing:.22em;text-transform:uppercase;
  color:var(--p2-gold-light);margin-bottom:20px}
.tsw-p2 .p2-career-body h2{font-family:var(--p2-serif);font-weight:300;font-size:38px;line-height:1.14;
  color:#fff;margin:0 0 16px;letter-spacing:-.02em}
.tsw-p2 .p2-career-body p{margin:0 0 30px;font-size:16px;line-height:1.68;
  color:rgba(255,255,255,.68);max-width:420px;text-wrap:pretty}
.tsw-p2 a.p2-btn-onnavy{background:#fff;color:var(--p2-navy);font-size:14.5px;padding:15px 28px}
.tsw-p2 a.p2-btn-onnavy:hover{background:var(--p2-gold-light);color:var(--p2-navy)}
.tsw-p2 .p2-career-img{position:relative;min-height:300px}
.tsw-p2 .p2-career-img img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

.tsw-p2 .p2-final{position:relative;padding:120px 0;overflow:hidden;background:var(--p2-ink)}
.tsw-p2 .p2-final>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.tsw-p2 .p2-final::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,.8),rgba(7,18,40,.9))}
.tsw-p2 .p2-final .p2-wrap{position:relative;z-index:2;text-align:center}
/* The Final CTA can now carry an optional eyebrow from the CMS. .p2-eyebrow is
   a left-aligned flex row everywhere else; this section is centred, so it is
   centred here too. The rule is inert until an administrator sets one - the
   element does not exist otherwise.

   The shared .p2-eyebrow span is white-space:nowrap, which is right for the
   short fixed labels every other section uses but not for arbitrary CMS text:
   a long eyebrow measured 460px inside a 375px viewport and pushed out of the
   frame. Wrapping is re-enabled HERE ONLY, so no other eyebrow changes. */
.tsw-p2 .p2-final .p2-final-eyebrow{justify-content:center;flex-wrap:wrap;max-width:100%}
.tsw-p2 .p2-final .p2-final-eyebrow span{white-space:normal;text-wrap:balance}
.tsw-p2 .p2-final h2{font-family:var(--p2-serif);font-weight:300;font-size:58px;line-height:1.08;
  letter-spacing:-.02em;color:#fff;margin:0 0 20px}
.tsw-p2 .p2-final p{margin:0 auto 38px;font-size:18px;line-height:1.65;
  color:rgba(255,255,255,.76);max-width:600px;text-wrap:pretty}
.tsw-p2 .p2-final-cta{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
.tsw-p2 .p2-final-cta .p2-btn{padding:17px 34px}

/* ==========================================================================
   RESPONSIVE — fluid tiers so intermediate widths behave naturally.
   1440 → 1280 → 1024 → 900 → 834/800/768 → 600 → 430/390
   ========================================================================== */

/* ---- 1280 ---- */
@media(max-width:1360px){
  /* Travel moments: four across. */
  .tsw-p2 .p2-wrap{padding:0 32px}
  .tsw-p2 h2.p2-h2{font-size:44px}
  .tsw-p2 .p2-why-grid{gap:72px}
  .tsw-p2 h2.p2-why-heading{font-size:52px}
  .tsw-p2 h2.p2-process-h2{font-size:52px}
  .tsw-p2 .p2-dom{gap:56px}
  .tsw-p2 .p2-step-body{padding-right:32px}
  .tsw-p2 .p2-step-num{font-size:54px}
  .tsw-p2 .p2-final h2{font-size:50px}
}

/* ---- 1024 tablet-landscape ---- */
@media(max-width:1120px){
  /* Video reviews: three across on tablet. */
  .tsw-p2 .p2-vr-head{margin-bottom:40px}
  .tsw-p2 .p2-vr-item{--p2-vr-across:min(var(--p2-vr-count,3),3);
    flex:0 0 calc((100% - 16px * (var(--p2-vr-across) - 1)) / var(--p2-vr-across))}
  /* Google Reviews: 3 across on tablet. */
  .tsw-p2 .p2-gr-item{--p2-gr-across:min(var(--p2-gr-count,3),3);
    flex:0 0 calc((100% - 20px * (var(--p2-gr-across) - 1)) / var(--p2-gr-across))}
  .tsw-p2 .p2-gr-head{gap:32px;margin-bottom:34px}
  .tsw-p2 ul.p2-vr-track{gap:16px}
  .tsw-p2 .p2-vr-play{width:48px;height:48px}
  .tsw-p2 .p2-vr-play svg{width:21px;height:21px}
  .tsw-p2 button.p2-vr-nav{width:42px;height:42px;flex:0 0 42px}
  /* Travel moments: featured hierarchy kept, three cards across. */
  .tsw-p2 .p2-sec{padding:84px 0}
  .tsw-p2 h2.p2-h2{font-size:40px}
  .tsw-p2 .quickbar-wrap{margin-top:-72px}
  .tsw-p2 .quickbar-fields{grid-template-columns:1fr 1fr;gap:16px}
  .tsw-p2 .quickbar-submit{grid-column:1 / -1;width:100%;margin-bottom:0}
  /* Mosaic → featured + 2 */
  .tsw-p2 .p2-mosaic{grid-template-columns:1fr 1fr;grid-auto-rows:220px}
  .tsw-p2 .p2-mosaic-feat{grid-column:span 2;grid-row:span 1}
  .tsw-p2 .p2-mosaic-feat .p2-tile-cap h3{font-size:30px}
  .tsw-p2 .p2-mosaic-feat .p2-tile-desc{display:none}
  /* Domestic: panel above list */
  .tsw-p2 .p2-dom{grid-template-columns:1fr;gap:34px}
  .tsw-p2 .p2-dom-panel .p2-dom-lead{height:260px}
  /* Curated Journeys: two cards across */
  .tsw-p2 .p2-cj-track{gap:24px}
  .tsw-p2 .p2-cj-item{flex:0 0 calc((100% - 24px)/2)}
  /* Why: two columns held, tightened. The illustration goes at this tier -
     below 1120 the left column is too narrow for it to read as anything but
     clutter under the CTA. */
  .tsw-p2 .p2-why{padding:84px 0 0}
  .tsw-p2 .p2-why-grid{gap:44px;grid-template-columns:40fr 60fr}
  .tsw-p2 .p2-why-intro{position:static}
  .tsw-p2 h2.p2-why-heading{font-size:38px;max-width:none}
  .tsw-p2 .p2-why-intro-text{font-size:15.5px;margin-bottom:26px;max-width:none}
  .tsw-p2 .p2-why-rule{width:170px;margin-bottom:24px}
  .tsw-p2 .p2-why-illustration{display:none}
  .tsw-p2 .p2-why-item{grid-template-columns:58px 50px 1fr;padding:26px 0}
  .tsw-p2 .p2-why-number{font-size:34px}
  .tsw-p2 .p2-why-icon{width:44px;height:44px}
  .tsw-p2 .p2-why-icon svg{width:21px;height:21px}
  .tsw-p2 .p2-why-content{padding-left:22px}
  .tsw-p2 h3.p2-why-title{font-size:20px}
  .tsw-p2 .p2-why-description{font-size:14.5px;line-height:1.65}
  .tsw-p2 .p2-why-close{margin-top:56px}
  /* Process: five-across becomes an even 2-column grid. Squeezing five
     editorial columns into a tablet made 13.5px body copy in ~150px tracks;
     two columns keep the type at a readable size. The rail is a horizontal
     device for a single row, so it retires here. */
  .tsw-p2 .p2-process{padding:88px 0 84px}
  .tsw-p2 .p2-process-head{margin-bottom:52px}
  .tsw-p2 h2.p2-process-h2{font-size:38px;max-width:20ch}
  .tsw-p2 ol.p2-steps{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:40px;row-gap:0}
  .tsw-p2 .p2-step-mark{display:none}
  .tsw-p2 .p2-step-body{padding:28px 0;border-top:1px solid var(--p2-line-warm)}
  .tsw-p2 .p2-step:nth-child(-n+2) .p2-step-body{border-top:0;padding-top:0}
  .tsw-p2 .p2-step-num{font-size:40px;margin-bottom:14px}
  .tsw-p2 .p2-step-icon{width:44px;height:44px;margin-bottom:16px}
  .tsw-p2 .p2-step-icon svg{width:21px;height:21px}
  .tsw-p2 h3.p2-step-title{font-size:21px;margin-bottom:8px;min-height:0}
  .tsw-p2 .p2-step-text{font-size:15px;line-height:1.65}
  .tsw-p2 .p2-process-foot{margin-top:44px;gap:18px}
  /* Current Offers - narrower gutter, smaller display type, same hierarchy. */
  .tsw-p2 .p2-of-grid{grid-template-columns:1.4fr 1fr;gap:32px}
  .tsw-p2 .p2-of-head{margin-bottom:42px}
  .tsw-p2 a.p2-of-feat{min-height:560px}
  .tsw-p2 .p2-of-feat-body{padding:34px 34px 32px;max-width:none}
  .tsw-p2 h3.p2-of-feat-title{font-size:33px;margin-bottom:16px;max-width:none}
  .tsw-p2 .p2-of-feat-meta{font-size:12.5px;gap:6px 16px;margin-bottom:15px}
  .tsw-p2 .p2-of-feat-sum{font-size:14.5px;margin-bottom:20px}
  .tsw-p2 .p2-of-feat-price{margin-bottom:22px}
  .tsw-p2 .p2-of-feat-price b{font-size:28px}
  .tsw-p2 .p2-of-feat-go{padding:13px 22px}
  .tsw-p2 a.p2-of-item{grid-template-columns:150px minmax(0,1fr);gap:22px;padding:24px 0}
  .tsw-p2 .p2-of-thumb{min-height:200px}
  .tsw-p2 h3.p2-of-title{font-size:23px;margin-bottom:12px}
  .tsw-p2 .p2-of-meta{font-size:12.5px;margin-bottom:14px}
  .tsw-p2 i.p2-of-rule{margin-bottom:14px}
  .tsw-p2 .p2-of-price b{font-size:22px}
  /* Wall */
  /* Media */
  /* Partners */
  .tsw-p2 .p2-partners{padding:64px 0 60px}
  /* Career + final */
  .tsw-p2 .p2-career-body{padding:34px 30px}
  .tsw-p2 .p2-career-body h2{font-size:28px}
  .tsw-p2 .p2-final{padding:84px 0}
  .tsw-p2 .p2-final h2{font-size:40px}
  .tsw-p2 .p2-final p{font-size:16px}
  /* Trust: 5 across but smaller */
  .tsw-p2 .p2-trust{padding:56px 0 52px}
  .tsw-p2 .p2-trust-cell{padding:22px 12px 20px}
  .tsw-p2 .p2-trust-val{font-size:28px}
  .tsw-p2 .p2-trust-lab{font-size:11.5px;margin-top:7px}
}

/* ---- 834 / 800 / 768 tablet-portrait ---- */
@media(max-width:900px){
  /* Video reviews: still three at the top of this band; the card is portrait
     so three stay comfortably legible down to 768. */
  .tsw-p2 .p2-vr-item{--p2-vr-across:min(var(--p2-vr-count,3),3);
    flex:0 0 calc((100% - 14px * (var(--p2-vr-across) - 1)) / var(--p2-vr-across))}
  /* The rating summary drops beneath the heading once the row cannot hold
     both, and the score shrinks with it. */
  .tsw-p2 .p2-gr-head{gap:22px;margin-bottom:30px}
  .tsw-p2 .p2-gr-score{width:100%;padding-top:4px}
  .tsw-p2 .p2-gr-item{max-width:none}
  .tsw-p2 .p2-gr-score-num{font-size:46px}
  .tsw-p2 .p2-gr-item{--p2-gr-across:min(var(--p2-gr-count,2),2);
    flex:0 0 calc((100% - 20px * (var(--p2-gr-across) - 1)) / var(--p2-gr-across))}
  .tsw-p2 ul.p2-vr-track{gap:14px}
  /* Travel moments: the featured photograph and its quote stack, so neither
     is squeezed to an unreadable measure; two cards across below. */
  /* Current Offers - the featured offer takes the full width and the two
     recommendations become full-width image-led rows beneath it, so the
     hierarchy survives without squeezing either column to an unreadable
     measure. */
  .tsw-p2 .p2-of-grid{grid-template-columns:1fr;gap:8px}
  .tsw-p2 a.p2-of-feat{min-height:520px}
  .tsw-p2 .p2-of-feat-body{max-width:640px}
  .tsw-p2 .p2-of-row:first-child .p2-of-body{border-top:0;padding-top:0;justify-content:center}
  .tsw-p2 a.p2-of-item,.tsw-p2 .p2-of-row:first-child a.p2-of-item{
    grid-template-columns:210px minmax(0,1fr);gap:28px;padding:30px 0}
  .tsw-p2 .p2-of-row:last-child a.p2-of-item{padding-bottom:0}
  .tsw-p2 .p2-of-row:first-child{border-top:1px solid var(--p2-line-warm)}
  .tsw-p2 .p2-of-thumb{min-height:210px}
  .tsw-p2 h3.p2-of-title{font-size:26px}
  .tsw-p2 .p2-wrap{padding:0 24px}
  .tsw-p2 .p2-sec{padding:64px 0}
  .tsw-p2 h2.p2-h2{font-size:34px}
  .tsw-p2 .p2-head{margin-bottom:32px;gap:24px}
  /* Planner: 2×2 with full-width CTA. The Phase 1 900px tier already stacks
     the fields; we keep the 2×2 and restore the overlap safely. */
  .tsw-p2 .quickbar-wrap{margin-top:-30px}
  .tsw-p2 .quickbar-head{padding:24px 26px 18px}
  .tsw-p2 .quickbar-title{font-size:22px}
  .tsw-p2 .quickbar form{padding:22px 26px 26px}
  .tsw-p2 .quickbar-fields{grid-template-columns:1fr 1fr;gap:14px}
  .tsw-p2 .quickbar-submit{grid-column:1 / -1;width:100%;height:50px;margin-bottom:0}
  .tsw-p2 .p2-planner-chips{display:none}
  /* Domestic on navy */
  .tsw-p2 .p2-dom-name{font-size:20px}
  .tsw-p2 .p2-dom-panel .p2-dom-lead{height:200px}
  .tsw-p2 .p2-dom-panel .p2-tile{height:120px}
  /* Wall → featured + 2-up */
  /* Media: stack */
  /* Career: stack, image first */
  .tsw-p2 .p2-career-img{order:-1;min-height:180px}
  /* Final */
  .tsw-p2 .p2-final{padding:56px 0}
  .tsw-p2 .p2-final h2{font-size:32px}
  .tsw-p2 .p2-final-cta{flex-direction:column}
  .tsw-p2 .p2-final-cta .p2-btn{width:100%;height:50px;padding:0 24px}
  /* Partners */
}

/* ---- 600 and below: mobile ---- */
@media(max-width:600px){
  /* Video reviews: about two per screen with a sliver of the third as the
     swipe affordance. Five desktop cards are never squeezed in here. */
  .tsw-p2 .p2-vr-head{margin-bottom:30px}
  .tsw-p2 .p2-vr-item{--p2-vr-across:min(var(--p2-vr-count,2),2);
    flex:0 0 calc((100% - 12px * (var(--p2-vr-across) - 1)) / var(--p2-vr-across) - 10px)}
  /* Phone: ONE card with a peek of the next, so the swipe is discoverable.
     The card is a block of text, so it gets nearly the full width rather than
     the two-up the video rail uses. */
  /* One card plus a peek. max-width is lifted here: the flex basis already
     keeps the card narrow, and the desktop cap would otherwise leave a gap. */
  .tsw-p2 .p2-gr-item{--p2-gr-across:1;flex:0 0 calc(100% - 42px);max-width:none}
  .tsw-p2 .p2-gr-head{padding-bottom:20px;margin-bottom:28px}
  .tsw-p2 ul.p2-gr-track{gap:14px}
  .tsw-p2 .p2-gr-card{padding:22px 20px 18px}
  .tsw-p2 .p2-gr-text{font-size:15.5px}
  .tsw-p2 .p2-gr-score-num{font-size:40px}
  .tsw-p2 .p2-gr-bar{margin-top:22px}
  .tsw-p2 button.p2-gr-nav{width:40px;height:40px;flex:0 0 40px}
  .tsw-p2 .p2-gr-cta-row{margin-top:26px}
  .tsw-p2 a.p2-gr-cta{width:100%;justify-content:center;padding:14px 20px}
  .tsw-p2 ul.p2-vr-track{gap:12px}
  .tsw-p2 .p2-vr-play{width:42px;height:42px}
  .tsw-p2 .p2-vr-play svg{width:19px;height:19px}
  .tsw-p2 .p2-vr-bar{margin-top:22px}
  .tsw-p2 button.p2-vr-nav{width:40px;height:40px;flex:0 0 40px}
  /* Travel moments: one moment at a time with a slice of the next as the
     swipe affordance. */
  .tsw-p2 .p2-wrap{padding:0 16px}
  .tsw-p2 .p2-sec{padding:44px 0}
  .tsw-p2 h2.p2-h2{font-size:30px;line-height:1.1}
  .tsw-p2 .p2-lede{font-size:15.5px}
  .tsw-p2 .p2-eyebrow span{font-size:11px;letter-spacing:.18em}
  /* Planner: one field per line, comfortable targets */
  .tsw-p2 .quickbar-wrap{margin-top:18px;padding:0 16px}
  .tsw-p2 .quickbar{border-radius:6px;box-shadow:0 16px 40px rgba(7,18,40,.1)}
  .tsw-p2 .quickbar-head{padding:18px 18px 14px}
  .tsw-p2 .quickbar-title{font-size:21px}
  .tsw-p2 .quickbar form{padding:18px}
  .tsw-p2 .quickbar-fields{grid-template-columns:1fr;gap:12px}
  .tsw-p2 .quickbar .field input{height:50px;font-size:16px}
  .tsw-p2 .quickbar-submit{height:50px;font-size:15px}
  /* Mosaic → featured + 2-up */
  .tsw-p2 .p2-mosaic{grid-template-columns:1fr 1fr;grid-auto-rows:150px;gap:12px}
  .tsw-p2 .p2-mosaic-feat{grid-column:span 2;height:290px}
  .tsw-p2 .p2-mosaic-feat .p2-tile-cap h3{font-size:27px}
  .tsw-p2 .p2-tile-cap{left:14px;right:14px;bottom:12px}
  .tsw-p2 .p2-mosaic-feat .p2-tile-cap{left:18px;right:18px;bottom:18px}
  .tsw-p2 .p2-tile-cap h3{font-size:18px}
  /* Domestic rows carry season + price stacked */
  .tsw-p2 a.p2-dom-row{gap:12px;padding:15px 0}
  .tsw-p2 .p2-dom-name{font-size:21px;line-height:1.15}
  .tsw-p2 .p2-dom-stack{flex:1;min-width:0}
  .tsw-p2 .p2-dom-stack .p2-dom-sub{display:block;font-size:11.5px;margin-top:2px}
  .tsw-p2 .p2-dom-panel{grid-template-columns:1fr 1fr}
  .tsw-p2 .p2-dom-panel .p2-dom-lead{height:210px}
  .tsw-p2 .p2-dom-panel .p2-tile{height:110px}
  /* Curated Journeys: one dominant card, ~46px of the next one showing.
     The card is a fraction of the rail's own width, so the rail never becomes
     wider than the wrap and the document cannot overflow sideways. */
  .tsw-p2 .p2-cj-track{gap:16px;padding:4px 0 12px}
  .tsw-p2 .p2-cj-item{flex:0 0 calc(100% - 62px)}
  .tsw-p2 .p2-cj-media{aspect-ratio:3/2}
  .tsw-p2 .p2-cj-content{padding:22px 20px 20px}
  .tsw-p2 h3.p2-cj-title{font-size:21px}
  .tsw-p2 .p2-cj-sum{-webkit-line-clamp:2;font-size:14px;margin-bottom:18px}
  .tsw-p2 .p2-cj-foot{flex-direction:column;align-items:flex-start;gap:14px}
  .tsw-p2 .p2-cj-bar{margin-top:18px}
  .tsw-p2 .p2-cj-cta{margin-top:32px;padding-top:26px}
  .tsw-p2 .p2-cj-noimg b{font-size:24px}
  /* Why: stacked. The number and the icon become one line above the copy,
     so a phone reads 01 -> icon -> title -> description rather than a
     squeezed three-column row. */
  .tsw-p2 .p2-why{padding:44px 0 0}
  .tsw-p2 .p2-why-grid{grid-template-columns:1fr;gap:0}
  .tsw-p2 h2.p2-why-heading{font-size:33px;line-height:1.06;margin-bottom:18px;max-width:none}
  .tsw-p2 .p2-why-rule{width:140px;margin-bottom:20px}
  .tsw-p2 .p2-why-intro-text{font-size:16px;margin-bottom:26px;max-width:none}
  .tsw-p2 a.p2-why-team{margin-bottom:34px}
  .tsw-p2 .p2-why-item{grid-template-columns:1fr;padding:26px 0;gap:0}
  .tsw-p2 .p2-why-mark{display:flex;align-items:center;gap:16px;margin-bottom:14px}
  .tsw-p2 .p2-why-number{font-size:38px;line-height:.92}
  .tsw-p2 .p2-why-icon{width:46px;height:46px;flex:0 0 46px}
  .tsw-p2 .p2-why-icon svg{width:23px;height:23px}
  .tsw-p2 .p2-why-content{padding-left:0;border-left:0}
  .tsw-p2 h3.p2-why-title{font-size:22px}
  .tsw-p2 .p2-why-description{font-size:15.5px;line-height:1.68;max-width:none}
  .tsw-p2 .p2-why-close{margin-top:8px}
  /* Process: vertical timeline. The rail returns as a vertical hairline down
     the left, with the number and icon on one line above the copy - a phone
     reads 01 -> icon -> title -> description. */
  .tsw-p2 .p2-process{padding:44px 0 40px}
  .tsw-p2 .p2-process-head{margin-bottom:34px}
  .tsw-p2 h2.p2-process-h2{font-size:33px;line-height:1.06;margin-bottom:16px;max-width:none}
  .tsw-p2 .p2-process-lede{font-size:16px;max-width:none}
  .tsw-p2 ol.p2-steps{grid-template-columns:1fr}
  .tsw-p2 .p2-step{display:grid;grid-template-columns:30px 1fr;column-gap:14px}
  .tsw-p2 .p2-step-mark{display:block;height:auto}
  .tsw-p2 i.p2-step-rail{top:9px;left:6px;width:1px;height:calc(100% + 26px);background:var(--p2-line-warm)}
  .tsw-p2 .p2-step.is-last i.p2-step-rail{height:0;width:1px}
  .tsw-p2 i.p2-step-ring{top:3px;left:0;width:13px;height:13px}
  .tsw-p2 i.p2-step-dot{top:8px;left:5px}
  .tsw-p2 .p2-step-body{padding:26px 0 30px;border-top:1px solid var(--p2-line-warm);
    display:grid;grid-template-columns:auto auto 1fr;align-items:center;
    grid-template-areas:"num icon ." "title title title" "text text text"}
  /* One column here, so only the very first step opens without a divider -
     the 2-column tablet rule that spares the first TWO must not carry over. */
  .tsw-p2 .p2-step:nth-child(-n+2) .p2-step-body{border-top:1px solid var(--p2-line-warm);padding-top:26px}
  .tsw-p2 .p2-step:first-child .p2-step-body{border-top:0;padding-top:0}
  .tsw-p2 .p2-step-num{grid-area:num;font-size:38px;line-height:.92;margin:0 14px 12px 0}
  .tsw-p2 .p2-step-icon{grid-area:icon;width:42px;height:42px;margin:0 0 12px}
  .tsw-p2 .p2-step-icon svg{width:21px;height:21px}
  .tsw-p2 h3.p2-step-title{grid-area:title;font-size:21px;margin-bottom:8px;min-height:0}
  .tsw-p2 .p2-step-text{grid-area:text;font-size:15.5px}
  .tsw-p2 .p2-process-foot{margin-top:6px;gap:10px;flex-wrap:wrap;justify-content:flex-start}
  .tsw-p2 i.p2-process-rule{flex:0 0 100%;margin-bottom:14px}
  .tsw-p2 .p2-process-foot span{font-size:10px;letter-spacing:.16em}
  /* Wall: featured + 2-up + quote */
  /* FAQ */
  .tsw-p2 .p2-faq .acc-q{font-size:19px;padding:20px 0}
  .tsw-p2 .p2-faq .acc-a p{font-size:15.5px}
  /* Media */
  /* Partners: two columns of wordmarks */
  .tsw-p2 .p2-partners{padding:44px 0 40px}
  .tsw-p2 .p2-partners-head{margin-bottom:26px}
  .tsw-p2 .p2-partners-head h2{font-size:26px}
  /* Career */
  .tsw-p2 .p2-career-body{padding:26px 18px 30px}
  .tsw-p2 .p2-career-body h2{font-size:26px}
  .tsw-p2 .p2-career-body p{font-size:14.5px;margin-bottom:20px}
  .tsw-p2 a.p2-btn-onnavy{width:100%;height:50px}
  /* Final */
  .tsw-p2 .p2-final{padding:52px 0}
  .tsw-p2 .p2-final h2{font-size:31px}
  .tsw-p2 .p2-final p{font-size:15px;margin-bottom:22px}
  /* Trust */
  .tsw-p2 .p2-trust{padding:34px 0 30px}
  /* Careers stacks only at phone width; the approved tablet is 2-column. */
  .tsw-p2 .p2-career{grid-template-columns:1fr}
  /* Trust 2x2 + full-width 5th.
     Moved out of the 900px tier: the approved tablet reference (768) keeps the
     trust strip FIVE-ACROSS, and only the approved mobile reference (390)
     stacks it 2x2 with a full-width fifth cell. Stacking at 900 made 768/834
     roughly 400px taller than the approved tablet composition. */
  /* Trust 2×2 + full-width 5th */
  .tsw-p2 .p2-trust-grid{grid-template-columns:1fr 1fr}
  .tsw-p2 .p2-trust-cell{border-bottom:1px solid var(--p2-line)}
  .tsw-p2 .p2-trust-cell:nth-child(2n){border-right:0}
  .tsw-p2 .p2-trust-cell:nth-child(5){grid-column:span 2;border-bottom:0;
    display:flex;align-items:baseline;gap:14px}
  .tsw-p2 .p2-trust-cell:nth-child(5) .p2-trust-lab{margin-top:0}
  .tsw-p2 .p2-trust-val{font-size:30px}
  .tsw-p2 .p2-trust-lab{font-size:12px}
}

/* ---- 430 / 390 ---- */
/* Current Offers — mobile vertical offer feed (<=767px per the approved spec).
   Placed after every earlier tier so it wins the cascade for this section; it
   touches nothing outside .p2-of-*. The photograph becomes a real block-level
   image with the type in a solid ink panel beneath it, so nothing has to stay
   legible over a busy picture at phone width. */
@media(max-width:767px){
  .tsw-p2 .p2-of-grid{grid-template-columns:1fr;gap:34px}
  .tsw-p2 .p2-of-head{margin-bottom:32px}
  .tsw-p2 a.p2-of-feat{min-height:0}
  .tsw-p2 .p2-of-feat-img{position:relative;height:280px}
  .tsw-p2 .p2-of-feat-scrim{top:auto;height:280px;
    background:linear-gradient(180deg,rgba(7,18,40,0) 0%,rgba(7,18,40,.18) 55%,rgba(7,18,40,.55) 100%)}
  .tsw-p2 a.p2-of-feat.is-noimg .p2-of-feat-scrim{inset:0;height:auto}
  .tsw-p2 .p2-of-feat-body{position:relative;height:auto;padding:26px 24px 30px;max-width:none;
    background:var(--p2-ink)}
  .tsw-p2 a.p2-of-feat.is-noimg .p2-of-feat-body{background:transparent;padding-top:120px}
  .tsw-p2 h3.p2-of-feat-title{font-size:30px;margin-bottom:16px;max-width:none}
  .tsw-p2 .p2-of-feat-meta{font-size:12.5px;margin-bottom:15px;gap:6px 16px}
  .tsw-p2 .p2-of-feat-sum{font-size:14.5px;margin-bottom:20px}
  .tsw-p2 .p2-of-feat-price{margin-bottom:22px}
  .tsw-p2 .p2-of-feat-price b{font-size:28px}
  .tsw-p2 .p2-of-feat-go{width:100%;justify-content:center;padding:14px 20px}
  /* Each recommendation becomes its own stacked entry: image, then type. */
  .tsw-p2 ul.p2-of-list{gap:34px}
  .tsw-p2 .p2-of-row{border-top:0}
  .tsw-p2 .p2-of-row + .p2-of-row{border-top:0}
  .tsw-p2 .p2-of-row:first-child{border-top:0}
  .tsw-p2 a.p2-of-item,.tsw-p2 .p2-of-row:first-child a.p2-of-item,
  .tsw-p2 .p2-of-row:last-child a.p2-of-item{grid-template-columns:1fr;gap:20px;padding:0}
  .tsw-p2 .p2-of-thumb{min-height:0;height:220px;border-radius:6px}
  .tsw-p2 .p2-of-thumb img{position:absolute}
  .tsw-p2 .p2-of-row:first-child .p2-of-body{border-top:0;padding-top:0}
  .tsw-p2 h3.p2-of-title{font-size:26px}
  .tsw-p2 .p2-of-price b{font-size:23px}
}

@media(max-width:440px){
  .tsw-p2 .p2-mosaic{grid-auto-rows:140px}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-cj-track{scroll-behavior:auto}
  .tsw-p2 a.p2-cj-card,.tsw-p2 .p2-cj-media img,.tsw-p2 .p2-cj-go svg,
  .tsw-p2 button.p2-cj-arrow,.tsw-p2 button.p2-cj-dot::before{transition:none}
  .tsw-p2 a.p2-cj-card:hover{transform:none;box-shadow:none}
  .tsw-p2 a.p2-cj-card:hover .p2-cj-media img,
  .tsw-p2 a.p2-cj-card:hover .p2-cj-go svg{transform:none}
  .tsw-p2 .p2-tile img,
  .tsw-p2 .p2-tile:hover img,
}

/* TSW_PHASE2_CSS_BUILD: PHASE2-PREMIUM-2026-08-17-01
   Source-verification marker only - no rule, no selector, no visual effect.
   If this line is absent when you open the live stylesheet directly, the
   server or a cache in front of it is still serving the OLD website.css. */

/* --------------------------------------------------------------------------
   PHASE 2 — approved line-break for The Process headline
   APPROVED-COPY.md specifies this heading as a deliberate two-line break on
   the comma:
       Five steps,
       one point of contact.
   The copy itself is CMS-owned and correctly escaped, so no <br> can be
   injected through it. Measured at the approved 58px/300 Newsreader:
   "one point of contact." is 507px and "Five steps, one point of" is 565px,
   so capping the measure between the two makes the break fall on the comma
   naturally, without touching the copy.
   Text-agnostic: a different CMS heading simply wraps inside the same measure.
   No effect below ~600px, where the container is already narrower.
   -------------------------------------------------------------------------- */
.tsw-p2 h2.p2-process-h2{max-width:16ch}

/* ==========================================================================
   PHASE 2 - HERO (approved treatment, scoped)
   --------------------------------------------------------------------------
   The hero markup is the FROZEN website.partials._hero and every string below
   comes from the existing website_hero_slides CMS record - no PHP was changed
   and no new field was added. What remained was purely Phase 1 *styling*: an
   amber pill badge with a star, a heavy sans headline and an amber CTA, none
   of which is the approved design.

   home.php renders that partial INSIDE .tsw-p2, so the approved treatment is
   applied as scoped overrides here. The frozen partial and the Phase 1 half of
   this stylesheet are both untouched, and every other page that uses .hero
   is unaffected because none of them carries the .tsw-p2 wrapper.
   ========================================================================== */

/* Eyebrow: gold rule + letterspaced caps, not an amber pill. */
.tsw-p2 .hero-badge{background:none;box-shadow:none;border-radius:0;padding:0;
  color:var(--p2-gold-light);font-weight:600;font-size:12px;letter-spacing:.2em;
  gap:14px;margin:0 0 22px}
.tsw-p2 .hero-badge::before{content:"";width:34px;height:1px;background:var(--p2-gold);
  margin:0;font-size:0;flex:0 0 34px}

/* The Phase 1 copy column is capped at 620px, which is narrower than the
   approved headline needs at 70px; widened just enough for the two-line break. */
.tsw-p2 .hero-content{max-width:700px}

/* Headline: Newsreader Light, no drop shadow.
   v1.28.5 polish pass: cap eased from 70px to 64px (still the same clamp
   floor/slope below 1306px, where 4.9vw stops being the binding term) -
   the desktop-polish brief called the 70px cap "slightly too dominant"
   for an editorial composition; tightened line-height to match. */
.tsw-p2 .hero .hero-title{font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(34px,4.9vw,64px);line-height:1.04;letter-spacing:-.015em;
  text-shadow:none;max-width:680px;margin:0 0 22px}
/* 680px is deliberate, not round: measured at the approved 70px/300, line 2
   "designed around you." is 645px and the whole headline is 1254px, so a
   measure between them puts the break after "thoughtfully" exactly as the
   reference shows. A 15ch measure resolved to 628px and wrapped to three
   lines, which pushed the CTAs under the planner card. */

/* Supporting copy: no amber gradient rule between headline and body. */
.tsw-p2 .hero-content .hero-title + .hero-desc::before,
.tsw-p2 .hero-content .hero-sub + .hero-desc::before{display:none}
.tsw-p2 .hero .hero-desc{font-size:17px;line-height:1.62;max-width:560px;
  color:rgba(255,255,255,.88);margin:0 0 32px}

/* CTAs: primary is the design's blue, secondary a quiet hairline. */
.tsw-p2 .hero-cta .btn{border-radius:2px;font-weight:600;font-size:15px;
  padding:15px 28px;letter-spacing:.01em}
.tsw-p2 .hero-cta .btn-accent{background:var(--p2-blue);color:#fff;box-shadow:none}
.tsw-p2 .hero-cta .btn-accent:hover{background:var(--p2-blue-dark);box-shadow:none}
.tsw-p2 .hero-cta .btn-ghost{background:transparent;border:1px solid rgba(255,255,255,.5);
  backdrop-filter:none}
.tsw-p2 .hero-cta .btn-ghost:hover{background:rgba(255,255,255,.12);color:#fff}

@media(max-width:900px){
  /* Keep the approved two-line headline at tablet: at ~38px the full string is
     ~681px and would sit on one line inside the 700px measure, where the
     reference clearly breaks after "thoughtfully". */
  .tsw-p2 .hero-content{max-width:560px}
  .tsw-p2 .hero-badge{font-size:11px;letter-spacing:.16em;margin-bottom:16px}
  .tsw-p2 .hero .hero-desc{font-size:15.5px;margin-bottom:24px}
  .tsw-p2 .hero .hero-title{margin-bottom:16px}
}
@media(max-width:600px){
  .tsw-p2 .hero .hero-title{max-width:100%}
  .tsw-p2 .hero .hero-desc{font-size:15px}
}

/* ==========================================================================
   PHASE 2 — NEWSREADER (self-hosted, per handoff FONTS.md "Route A")
   --------------------------------------------------------------------------
   The approved editorial serif. Self-hosted deliberately so that the frozen
   app/Views/website/layout.php is NOT touched and no third-party request is
   introduced on any page load.

   These are the VARIABLE files Google Fonts serves for Newsreader:
     wght axis 200-800, opsz axis 6-72 (matches FONTS.md exactly).
   One file therefore covers BOTH approved weights, 300 (Light, all large
   display type) and 400 (Regular, sub-headings and card titles).

   font-weight is declared as the real axis RANGE 200 800, not as two static
   values. A variable file declared "font-weight:300" would be clamped by the
   browser to a single instance and weight 400 would never resolve; the range
   lets `font-weight:300` and `font-weight:400` in the rules below both
   instantiate correctly off the same download.

   unicode-range splits the two Google subsets exactly as Google does, so the
   87KB latin-ext file is only fetched if an extended character actually
   appears. Latin-ext carries U+20B9 (rupee). In this implementation the rupee
   renders inside .p2-fact, which uses the Phase 1 sans stack, so the serif
   never needs it - the subset is kept purely so the glyph is available if a
   future serif element ever prints a price.

   Licence: SIL Open Font License 1.1 (Production Type). Free for commercial
   and web use, redistributable and embeddable; no UI attribution required.

   Falls back to Georgia if the files are missing, exactly as before, so a
   failed upload degrades rather than breaks.
   ========================================================================== */
@font-face{
  font-family:'Newsreader';
  src:url('/assets/fonts/newsreader-latin.woff2') format('woff2');
  font-weight:200 800;
  font-style:normal;
  font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:'Newsreader';
  src:url('/assets/fonts/newsreader-latin-ext.woff2') format('woff2');
  font-weight:200 800;
  font-style:normal;
  font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}


/* ==========================================================================
   PHASE 2 - PREMIUM HEADER
   --------------------------------------------------------------------------
   SCOPE NOTE: unlike the rest of the Phase 2 block these selectors are NOT
   nested under .tsw-p2, and that is deliberate. layout.php renders the header
   OUTSIDE the homepage wrapper, so it appears on every public page; scoping it
   to .tsw-p2 would restyle the homepage header only and leave every other page
   on the old treatment. Every selector below is header-specific
   (.tsw-header, .tsw-nav, .tsw-logo, .mobile-nav, .nav-toggle) and touches no
   generic element, so nothing outside the header is affected.

   The frozen first 610 lines of this file are untouched; these are overrides
   that win on source order.
   ========================================================================== */

.tsw-header{
  --h-paper:#FFFDF8;
  --h-navy:#08152F;
  --h-gold:#FFA500;
  --h-ink:#071228;
  /* The brand orange is 1.94:1 on this near-white header - it may fill a
     shape or draw a rule, but it can never carry a word. --h-gold-text is
     the same gold darkened to 5.32:1 for the hovered and current nav item. */
  --h-gold-text:#946000;
  --h-gold-lift:#C79A3C;
  --h-line:#EAE3D4;
  --h-muted:#5A6472;

  background:var(--h-paper);
  backdrop-filter:none;
  border-bottom:1px solid var(--h-line);
  box-shadow:0 8px 24px rgba(11,18,32,.06);
  position:sticky; top:0; z-index:50;
}
.tsw-header .bar{height:84px; gap:28px}

/* ---- Brand -------------------------------------------------------------- */
/* The real logo asset is preserved as-is - not recoloured, not replaced. */
.tsw-header .tsw-logo img{height:42px}
.tsw-header .tsw-logo{gap:12px}

/* ---- Navigation --------------------------------------------------------- */
.tsw-header .tsw-nav{
  gap:0;
  margin-left:auto; margin-right:auto;
  /* Hairline separating the brand from the navigation, as in the reference. */
  padding-left:22px;
  box-shadow:-1px 0 0 var(--h-line);
}
.tsw-header .tsw-nav a{
  font-family:var(--p2-serif,Georgia,serif);
  font-weight:400;
  font-size:17px;
  letter-spacing:.005em;
  color:var(--h-navy);
  padding:8px 18px;
  gap:9px;
  transition:color .22s ease;
}
/* Fine hairline dividers BETWEEN items only - never a leading or trailing rule */
.tsw-header .tsw-nav a + a{box-shadow:-1px 0 0 var(--h-line)}
.tsw-header .tsw-nav a:hover{color:var(--h-gold-text)}

/* Restrained gold underline, not a UI bar. Phase 1 drew a 2px primary-blue
   rule on hover; this replaces it with a 1px gold hairline. */
.tsw-header .tsw-nav a::after{
  height:1px; bottom:2px; background:var(--h-gold);
  left:18px; right:calc(100% - 18px);
  transition:right .26s cubic-bezier(.2,.6,.2,1);
}
.tsw-header .tsw-nav a:hover::after{right:18px}
.tsw-header .tsw-nav a.is-active{color:var(--h-gold-text)}
.tsw-header .tsw-nav a.is-active::after{right:18px}

.tsw-header .tsw-nav-caret{opacity:.55; margin-left:-2px}

/* ---- HOT badge: compact gold pill, white text --------------------------- */
.tsw-header .tsw-nav-badge{
  background:var(--h-gold); color:var(--h-ink);
  font-size:9.5px; font-weight:700; letter-spacing:.1em;
  padding:3px 7px; border-radius:3px;
  box-shadow:none;
  /* Phase 1 lifted this badge 9px like a superscript, which pushed it out of
     the link box and made it collide with the hairline divider that follows.
     It now sits on the link's own centre line. */
  transform:translateY(-1px);
}

/* ---- CTA: navy, white text, fine gold border ---------------------------- */
.tsw-header .header-cta .btn-primary{
  display:inline-flex; align-items:center; gap:9px;
  background:var(--h-navy); color:#fff;
  border:1px solid var(--h-gold);
  border-radius:6px;
  padding:13px 24px;
  font-family:var(--p2-serif,Georgia,serif);
  font-weight:400; font-size:16px; letter-spacing:.005em;
  box-shadow:0 6px 18px rgba(8,21,47,.16);
  transition:background .22s ease, border-color .22s ease, box-shadow .22s ease, transform .22s ease;
}
.tsw-header .header-cta .btn-primary:hover{
  background:#0E2249; border-color:var(--h-gold-lift);
  box-shadow:0 10px 24px rgba(8,21,47,.22);
  transform:translateY(-1px);
}
.tsw-header .header-cta .tsw-cta-icon{color:var(--h-gold-lift); flex:0 0 auto}

/* ---- Focus visibility (kept explicit for keyboard users) ---------------- */
.tsw-header .tsw-nav a:focus-visible,
.tsw-header .header-cta .btn-primary:focus-visible,
.tsw-header .nav-toggle:focus-visible,
.mobile-nav .panel a:focus-visible,
.mobile-nav-close:focus-visible{
  outline:2px solid var(--h-gold,#FFA500); outline-offset:3px; border-radius:2px;
}

/* ---- Hamburger ---------------------------------------------------------- */
.tsw-header .nav-toggle{
  color:var(--h-navy);
  border:1px solid var(--h-line);
  border-radius:6px;
  width:44px; height:44px;
  align-items:center; justify-content:center;
  transition:border-color .22s ease, color .22s ease;
}
.tsw-header .nav-toggle:hover{border-color:var(--h-gold); color:var(--h-gold)}

/* ==========================================================================
   Responsive. Phase 1 hid the nav at <=900px, which left 768-900 with no
   navigation at all; the approved tablet composition keeps it. The nav now
   condenses through the tablet range and only collapses to the hamburger
   below 768px.
   ========================================================================== */

@media(max-width:1400px){
  .tsw-header .tsw-nav a{padding:8px 15px; font-size:16.5px}
  .tsw-header .tsw-nav a::after{left:15px; right:calc(100% - 15px)}
  .tsw-header .tsw-nav a:hover::after,
  .tsw-header .tsw-nav a.is-active::after{right:15px}
}
@media(max-width:1200px){
  .tsw-header .bar{height:78px; gap:18px}
  .tsw-header .tsw-logo img{height:38px}
  .tsw-header .tsw-nav{padding-left:16px}
  .tsw-header .tsw-nav a{padding:8px 11px; font-size:15.5px}
  .tsw-header .tsw-nav a::after{left:11px; right:calc(100% - 11px)}
  .tsw-header .tsw-nav a:hover::after,
  .tsw-header .tsw-nav a.is-active::after{right:11px}
  .tsw-header .header-cta .btn-primary{padding:11px 18px; font-size:15px}
}
@media(max-width:1024px){
  .tsw-header .bar{height:72px; gap:12px}
  .tsw-header .tsw-logo img{height:34px}
  .tsw-header .tsw-nav{padding-left:12px}
  .tsw-header .tsw-nav a{padding:7px 8px; font-size:14.5px; gap:6px}
  .tsw-header .tsw-nav a::after{left:8px; right:calc(100% - 8px)}
  .tsw-header .tsw-nav a:hover::after,
  .tsw-header .tsw-nav a.is-active::after{right:8px}
  .tsw-header .tsw-nav-badge{font-size:9px; padding:2px 5px; transform:translateY(-6px)}
  .tsw-header .header-cta .btn-primary{padding:10px 14px; font-size:14px; gap:7px}
  .tsw-header .header-cta .tsw-cta-icon{display:none}
}
/* Tablet floor: keep the navigation visible and legible down to 768px. */
@media(max-width:900px){
  .tsw-header .tsw-nav{display:flex}
  .tsw-header .nav-toggle{display:none}
}
@media(max-width:860px){
  .tsw-header .tsw-nav a{padding:7px 6px; font-size:13.5px}
  .tsw-header .tsw-nav a::after{left:6px; right:calc(100% - 6px)}
  .tsw-header .tsw-nav a:hover::after,
  .tsw-header .tsw-nav a.is-active::after{right:6px}
  .tsw-header .header-cta .btn-primary{padding:9px 12px; font-size:13.5px}
  .tsw-header .tsw-logo img{height:31px}
}
/* Mobile: brand + hamburger only. */
@media(max-width:767px){
  .tsw-header .bar{height:64px; gap:10px}
  .tsw-header .tsw-nav{display:none; box-shadow:none; padding-left:0}
  .tsw-header .header-cta .btn{display:none}
  .tsw-header .nav-toggle{display:inline-flex}
  .tsw-header .tsw-logo img{height:32px}
}

/* ==========================================================================
   Mobile panel - warm ivory, navy hierarchy, comfortable tap targets.
   Uses the existing .open class that website.js already toggles; no JS change.
   ========================================================================== */
.mobile-nav{background:rgba(8,21,47,.46)}
.mobile-nav .panel{
  background:#FFFDF8;
  width:min(88vw,360px);
  padding:22px 24px 28px;
  box-shadow:-18px 0 48px rgba(11,18,32,.18);
}
.mobile-nav .mobile-nav-head{
  display:flex; align-items:center; justify-content:space-between;
  padding-bottom:16px; margin-bottom:8px;
  border-bottom:1px solid #EAE3D4;
}
.mobile-nav .mobile-nav-title{
  font-family:var(--p2-serif,Georgia,serif); font-weight:400;
  font-size:19px; color:#08152F; letter-spacing:.005em;
}
.mobile-nav .mobile-nav-close{
  float:none; font-size:26px; line-height:1; color:#5A6472;
  width:40px; height:40px; display:inline-flex; align-items:center; justify-content:center;
  border-radius:6px; transition:color .2s ease, background .2s ease;
}
.mobile-nav .mobile-nav-close:hover{color:#08152F; background:#F3F1EC}
.mobile-nav .panel a{
  font-family:var(--p2-serif,Georgia,serif); font-weight:400; font-size:17px;
  color:#08152F; padding:15px 2px; border-bottom:1px solid #EFEAE0;
  display:flex; align-items:center; gap:10px;
}
.mobile-nav .panel a:hover{color:#FFA500}
.mobile-nav .panel a.is-active{color:#FFA500}
.mobile-nav .panel .tsw-nav-badge{
  background:#FFA500; color:#071228; font-size:9.5px; font-weight:700;
  letter-spacing:.1em; padding:3px 7px; border-radius:3px; transform:none;
}
.mobile-nav .panel .btn-primary{
  margin-top:22px; background:#08152F; color:#fff;
  border:1px solid #FFA500; border-radius:6px;
  font-family:var(--p2-serif,Georgia,serif); font-weight:400; font-size:16px;
  padding:14px 20px; box-shadow:none;
}
.mobile-nav .panel .btn-primary:hover{background:#0E2249; border-color:#C79A3C}

@media(prefers-reduced-motion:reduce){
  .tsw-header .tsw-nav a,
  .tsw-header .tsw-nav a::after,
  .tsw-header .header-cta .btn-primary,
  .tsw-header .nav-toggle,
  .mobile-nav .panel a,
  .mobile-nav .mobile-nav-close{transition:none}
  .tsw-header .header-cta .btn-primary:hover{transform:none}
}


/* ==========================================================================
   PHASE 2 - HERO SLIDER, FINAL PREMIUM PASS
   --------------------------------------------------------------------------
   Refines the Hero introduced in the earlier "PHASE 2 - HERO (approved
   treatment)" block (typography, eyebrow, content measure) to the final
   approved cinematic reference: a gold primary CTA, editorial numbered
   pagination in place of dots, a very subtle Ken Burns image drift, a
   slightly slower cross-fade, a gradient tuned to the approved three-stop
   spec, and mobile arrows restored to match the approved mobile composition.

   Scope: every selector is .tsw-p2 .hero..., and _hero.php is rendered
   nowhere except the homepage (grep-verified against every view), so none of
   this can reach /destinations, /packages, /blog or any other page. Appended
   after the frozen Phase 1 half of this file - nothing above line 610 (and
   nothing in the earlier Phase 2 blocks) was edited, only added to.
   ========================================================================== */

/* ---- Track height: nudged toward the top of the brief's own 600-650px
   target so the CTA row and the planner's negative-margin overlap stop
   sitting ~15px apart, leaving room for the pagination row between them
   without covering the CTA or being covered by the planner card. -------- */
.tsw-p2 .hero-track{height:clamp(560px,70vh,650px)}

/* ---- Gradient: approved three-stop spec, right edge stays bright --------
   v1.28.6 readability pass. Measured contrast of white type against the
   90th-percentile (i.e. brightest, worst-case) pixels actually behind it,
   with the copy hidden so only the real background is sampled:

     slide              headline   description
     Travel, thoughtful   2.98        2.98
     Explore Maldives     3.01        2.98
     Discover Bali        7.95        4.66      <- darker image, was fine
     Experience Dubai     2.75        4.33      <- worst

   The bright turquoise lagoon slides were failing WCAG AA even for large
   text (3.0). Rather than darkening the whole frame - which would flatten
   exactly the imagery the hero is selling - a SECOND gradient is layered
   only across the copy column and is fully transparent by 78%, so the
   right side of the photograph keeps its original brightness. The
   approved three-stop spec below it is unchanged; this rides on top. */
.tsw-p2 .hero-slide::after{
  background:
    linear-gradient(90deg,
      rgba(4,18,35,.55) 0%,
      rgba(4,18,35,.42) 35%,
      rgba(4,18,35,.18) 60%,
      rgba(4,18,35,0) 78%),
    linear-gradient(90deg,
      rgba(4,18,35,.82) 0%,
      rgba(4,18,35,.30) 50%,
      rgba(4,18,35,0) 100%);
}
.tsw-p2 .hero-slide.align-right::after{
  background:
    linear-gradient(-90deg,
      rgba(4,18,35,.55) 0%,
      rgba(4,18,35,.42) 35%,
      rgba(4,18,35,.18) 60%,
      rgba(4,18,35,0) 78%),
    linear-gradient(-90deg,
      rgba(4,18,35,.82) 0%,
      rgba(4,18,35,.30) 50%,
      rgba(4,18,35,0) 100%);
}
.tsw-p2 .hero-slide.align-center::after{
  background:linear-gradient(180deg,rgba(4,18,35,.38),rgba(4,18,35,.72));
}

/* Second readability layer: a soft shadow carried by the glyphs themselves.
   The gradient above fixes the average background; this covers the case the
   gradient cannot - a bright highlight (sun glint, white sand, a villa roof)
   landing directly under a thin serif stroke. Wide and low-opacity so it
   reads as depth rather than as a drop shadow: the earlier Phase 2 rule set
   text-shadow:none, which is what this supersedes. */
.tsw-p2 .hero .hero-title{text-shadow:0 2px 14px rgba(2,10,22,.26)}
.tsw-p2 .hero .hero-desc{
  text-shadow:0 1px 10px rgba(2,10,22,.30);
  color:rgba(255,255,255,.92);
}
.tsw-p2 .hero-badge{text-shadow:0 1px 8px rgba(2,10,22,.28)}

/* ---- Cross-fade: slightly slower, calmer than the Phase 1 .7s ----------- */
.tsw-p2 .hero-slide{transition:opacity .9s ease}

/* ---- Ken Burns: the IMAGE carries the motion, content stays put --------- */
@keyframes tswp2KenBurns{from{transform:scale(1)}to{transform:scale(1.05)}}
.tsw-p2 .hero-slide.active .hero-img{
  animation:tswp2KenBurns 9s linear forwards;
  transform-origin:center;
  will-change:transform;
}

/* ---- Arrows: 52px circle, generous inset, white idle / gold hover ------- */
.tsw-p2 .hero-arrow{
  width:52px;height:52px;
  background:rgba(255,255,255,.08);
  border:1px solid rgba(255,253,248,.5);
  color:#fff;
  backdrop-filter:blur(6px);
  box-shadow:0 8px 24px rgba(4,18,35,.18);
}
.tsw-p2 .hero-arrow svg{width:19px;height:19px}
.tsw-p2 .hero-arrow.prev{left:44px}
.tsw-p2 .hero-arrow.next{right:44px}
.tsw-p2 .hero-arrow:hover,
.tsw-p2 .hero-arrow:focus-visible{
  background:rgba(255,165,0,.16);
  border-color:var(--p2-gold-light);
  color:var(--p2-gold-light);
  transform:translateY(-50%);
  box-shadow:0 10px 26px rgba(4,18,35,.24);
}
.tsw-p2 .hero-arrow:focus-visible{outline:2px solid var(--p2-gold-light);outline-offset:3px}

/* ---- Editorial pagination: 01 -- -- -- 0N, not circular dots ------------
   .hero-dots is the FROZEN element the frozen CSS makes position:absolute so
   it centers itself against .hero-track. Nesting it inside a new wrapper
   (to add the flanking "01"/"0N" numbers) would otherwise leave that frozen
   absolute rule pulling .hero-dots out of the wrapper entirely - the numbers
   would render as a stray empty row at the top of the hero and the bars
   would float correctly at the bottom, disconnected from each other. So the
   positioning job moves up one level: .hero-pagination now owns the
   bottom-center placement, and .hero-dots is put back into normal flow
   inside it (position/left/bottom/transform all explicitly reset - position
   alone is not enough, because the frozen transform:translateX(-50%) would
   still visually shift a static element). */
.tsw-p2 .hero-pagination{
  /* Left-aligned to match the text column, not centered under the whole
     hero: the approved reference shows it directly under the CTA row,
     sharing the content column's left edge. Matches the SAME clamp() the
     frozen .hero-slide > .container uses for padding-left, since
     .hero-pagination is a sibling of .hero-slide (not nested in its
     container) and every live slide uses align-left. */
  position:absolute;left:clamp(20px,10vw,180px);bottom:100px;z-index:5;
  display:flex;align-items:center;gap:12px;
}
.tsw-p2 .hero-pg-current,
.tsw-p2 .hero-pg-total{
  font-family:var(--tsw-font,inherit);
  font-size:12px;font-weight:600;letter-spacing:.04em;
  color:rgba(255,253,248,.72);min-width:16px;line-height:1;
}
.tsw-p2 .hero-dots{
  position:static;left:auto;bottom:auto;transform:none;
  display:flex;align-items:center;gap:8px;
}
.tsw-p2 .hero-dot{
  width:30px;height:2px;border-radius:1px;
  background:rgba(255,253,248,.32);
  transition:background .3s ease;
}
.tsw-p2 .hero-dot:hover{background:rgba(255,253,248,.55)}
.tsw-p2 .hero-dot.active{background:var(--p2-gold-light)}
/* Current-slide number tracks the active dot's position, purely decorative
   and progressively enhanced via :has() - see the comment in _hero.php. */
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(1).active) .hero-pg-current::after{content:"01"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(2).active) .hero-pg-current::after{content:"02"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(3).active) .hero-pg-current::after{content:"03"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(4).active) .hero-pg-current::after{content:"04"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(5).active) .hero-pg-current::after{content:"05"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(6).active) .hero-pg-current::after{content:"06"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(7).active) .hero-pg-current::after{content:"07"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(8).active) .hero-pg-current::after{content:"08"}
.tsw-p2 .hero-pagination:has(.hero-dot:nth-child(9).active) .hero-pg-current::after{content:"09"}

/* ---- CTAs: gold primary per the approved reference ----------------------
   The earlier Phase 2 Hero block made the primary CTA the design's blue;
   the approved final reference is a warm gold button instead. Overridden
   here rather than editing that block, so the change is traceable to this
   pass. */
.tsw-p2 .hero-cta .btn{border-radius:6px}
.tsw-p2 .hero-cta .btn-accent{
  background:var(--p2-gold);color:var(--p2-ink);
  box-shadow:0 10px 26px rgba(255,165,0,.28);
}
/* colour is restated here on purpose: the frozen `.tsw a.btn-accent:hover`
   sets color:#3a2600 at the same specificity, so a hover rule that changes only
   the background lets that brown win and the label shifts hue mid-hover. */
.tsw-p2 .hero-cta .btn-accent:hover{
  background:var(--p2-gold-press);color:var(--p2-ink);
  box-shadow:0 14px 32px rgba(255,165,0,.36);
  transform:translateY(-1px);
}
.tsw-p2 .hero-cta .btn-accent:focus-visible,
.tsw-p2 .hero-cta .btn-ghost:focus-visible{outline:2px solid var(--p2-gold-light);outline-offset:3px}
.tsw-p2 .hero-cta .btn-ghost{background:rgba(4,18,35,.18)}
.tsw-p2 .hero-cta .btn-ghost:hover{background:rgba(4,18,35,.32);border-color:#fff}

/* ---- Desktop composition (v1.28.6): a reserved pagination zone -----------
   THE BUG THIS REPLACES. The copy block used to be TOP-anchored
   (align-items:flex-start + padding-top) while .hero-pagination is
   BOTTOM-anchored (position:absolute; bottom). Two opposing anchors means
   the gap between them absorbs 100% of the description's height variance,
   and the live CMS descriptions vary by two whole lines:

     slide            desc   CTA -> pagination gap
     Travel...        3 ln   15px   <- cramped
     Explore Maldives 2 ln   70px
     Discover Bali    1 ln   98px   <- awkward void
     Experience Dubai 1 ln   98px

   So the same hero read as four different compositions, and the longest
   description drove the CTA into the pagination.

   THE FIX is two independent structural guarantees, no magic offsets:

   1. The copy block is now BOTTOM-anchored too, against a padding-bottom
      that reserves the pagination's own strip plus a deliberate gap (the
      vars below are the single source of truth - .hero-pagination reads
      the same --p2-hero-pg-bottom, so the reserve can never drift out of
      sync with where the pagination actually sits). Because both the CTA
      and the pagination are now measured from the SAME edge, the distance
      between them is invariant: a description can no longer push the CTA
      anywhere. Extra description height now grows UPWARD into the image,
      which has ~260px of unused headroom at the 3-line case.

   2. .hero-desc reserves a 3-line box (see the rule below), so 1-, 2- and
      3-line descriptions all occupy one predictable area and every slide
      resolves to the SAME composition - the headline stops jumping
      between slides.

   Together these make the layout resilient to description length instead
   of dependent on it. Desktop-only (>=1025px, the same boundary the
   tablet tier below already uses); tablet and mobile keep the centered
   composition already signed off for those tiers. */
@media(min-width:1025px){
  .tsw-p2 .hero{
    --p2-hero-pg-bottom:124px;  /* where the pagination strip sits */
    --p2-hero-pg-height:12px;   /* its own height */
    --p2-hero-pg-gap:30px;      /* deliberate CTA -> pagination breathing room */
  }
  .tsw-p2 .hero-slide{align-items:flex-end}
  .tsw-p2 .hero-slide > .container{
    padding-bottom:calc(
      var(--p2-hero-pg-bottom) + var(--p2-hero-pg-height) + var(--p2-hero-pg-gap)
    );
  }
  .tsw-p2 .hero-pagination{bottom:var(--p2-hero-pg-bottom)}

  /* Reserve the description's tallest realistic box (3 lines) so a short
     CMS description leaves the space rather than collapsing it. Expressed
     in the element's own line-height, not px, so it tracks any future
     type change: 3 x 1.62em. `lh` says the same thing natively and wins
     where supported - the calc() is the fallback, not a second value. */
  .tsw-p2 .hero .hero-desc{min-height:calc(3 * 1.62em)}
  @supports (height:1lh){
    .tsw-p2 .hero .hero-desc{min-height:3lh}
  }
}

/* ---- Tablet: 768-1024, its own composition, not a shrunk desktop -------- */
@media(max-width:1024px){
  .tsw-p2 .hero .hero-title{font-size:clamp(42px,5.6vw,52px)}
  .tsw-p2 .hero-content{max-width:500px}
  .tsw-p2 .hero .hero-desc{font-size:16px;max-width:480px}
  .tsw-p2 .hero-arrow{width:46px;height:46px}
  .tsw-p2 .hero-arrow svg{width:17px;height:17px}
  .tsw-p2 .hero-arrow.prev{left:10px}
  .tsw-p2 .hero-arrow.next{right:10px}
  .tsw-p2 .hero-cta .btn{padding:13px 24px;font-size:14.5px}
}
@media(max-width:900px){
  .tsw-p2 .hero-content{max-width:460px}
  /* At <=900px the frozen container padding drops to a flat 20px
     (.hero-slide > .container{padding-left:20px} in the frozen 900px tier),
     so the text column starts almost flush with the edge. Arrows vertically
     centered on the track (their position at every wider breakpoint) would
     then sit ON TOP of the description paragraph - the brief is explicit
     that arrows must never overlap content. There is no inset that fixes
     this while keeping them mid-image, so they move down to flank the
     pagination row instead, clearing the whole text column entirely (the
     text is vertically centered higher in the track; the pagination row
     already sits, by design, in the dead space between the CTA and the
     planner overlap). bottom:82px centers a 40-46px arrow on the same row
     as the 12px pagination pinned at bottom:100px. */
  .tsw-p2 .hero-arrow{top:auto;bottom:82px;transform:none}
  .tsw-p2 .hero-arrow:hover,
  .tsw-p2 .hero-arrow:focus-visible{transform:none}
}

/* ---- Mobile: <=600px. Arrows restored (the approved mobile reference
   shows them; the frozen Phase 1 600px tier hides them), own track height,
   own type scale. The rest of the mobile composition - which the brief
   calls "already substantially correct" - is left as Phase 1 shipped it. -- */
@media(max-width:600px){
  .tsw-p2 .hero-track{height:clamp(640px,82vh,740px)}
  .tsw-p2 .hero .hero-title{font-size:clamp(38px,10vw,48px);line-height:1.05}
  .tsw-p2 .hero-pg-current,
  .tsw-p2 .hero-pg-total{font-size:11px}
  .tsw-p2 .hero-dot{width:20px}
  .tsw-p2 .hero-dots{gap:6px}
  .tsw-p2 .hero-pagination{gap:8px}
  /* Arrows are .hero-track siblings of .hero-pagination in the markup, not
     children of it (nesting them would move their absolute-positioning
     context from .hero-track to the small pagination box and break the
     already-correct desktop/tablet offsets above). So instead of a true
     flex-grouped cluster, they stay track-level and right-anchor onto the
     same row as the pagination (bottom:82px, inherited from the 900px tier
     below), compact enough to clear the pagination's realistic width at
     this viewport - verified against the live CMS slide count. */
  .tsw-p2 .hero-arrow{
    display:flex !important;
    width:32px;height:32px;
  }
  /* The 1024px tablet tier above sets .hero-arrow.prev{left:10px} at the
     same specificity (.tsw-p2 .hero-arrow.prev, 3 classes) as these rules,
     so left must be explicitly reset to auto here or it would win by
     source order regardless of the right-anchoring below. */
  .tsw-p2 .hero-arrow.prev{left:auto;right:54px}
  .tsw-p2 .hero-arrow.next{left:auto;right:16px}
  .tsw-p2 .hero-arrow svg{width:13px;height:13px}
}

/* ---- Reduced motion: kill Ken Burns, shorten the fade, keep it usable --- */
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .hero-slide{transition:opacity .3s linear}
  .tsw-p2 .hero-slide.active .hero-img{animation:none;transform:none}
}

/* ==========================================================================
   PHASE 2 - HOMEPAGE PLANNER: CONCIERGE / QUICK ENQUIRY (v1.28.7)
   --------------------------------------------------------------------------
   Scope: every selector below is .tsw-p2 .quickbar..., and the quickbar only
   renders on the homepage, inside the .tsw-p2 wrapper. Appended after all
   existing CSS - the frozen Phase 1 half (lines 1-610), including the frozen
   .quickbar card/field/submit rules the v1.28.4 self-test asserts on
   verbatim, is not edited, only overridden where this component needs it.

   The card itself is deliberately untouched: .quickbar-wrap keeps its
   negative margin, so the approved hero overlap and every hero measurement
   signed off in v1.28.6 are unaffected.
   ========================================================================== */

/* ---- Head: copy left, segmented intent control right -------------------- */
.tsw-p2 .quickbar .qb-head-p2{
  display:flex;align-items:flex-start;justify-content:space-between;
  gap:24px;flex-wrap:wrap;margin-bottom:18px;
}
.tsw-p2 .quickbar .qb-head-copy{min-width:0}
.tsw-p2 .quickbar .qb-tabs{
  display:flex;gap:6px;padding:5px;border-radius:12px;
  background:#F1F4F8;border:1px solid rgba(8,21,47,.07);flex:0 0 auto;
}
.tsw-p2 .quickbar .qb-tab{
  display:flex;flex-direction:column;gap:2px;align-items:flex-start;
  padding:9px 16px;border:0;border-radius:9px;background:transparent;
  cursor:pointer;text-align:left;transition:background .18s ease,color .18s ease;
  font-family:inherit;color:var(--p2-navy);
}
.tsw-p2 .quickbar .qb-tab-t{
  display:flex;align-items:center;gap:7px;
  font-size:14px;font-weight:700;letter-spacing:-.005em;line-height:1.2;
}
.tsw-p2 .quickbar .qb-tab-s{font-size:11.5px;font-weight:500;color:var(--p2-muted);line-height:1.25}
.tsw-p2 .quickbar .qb-tab-icon{flex:0 0 auto;color:#94A3B8;transition:color .18s ease}
.tsw-p2 .quickbar .qb-tab:hover{background:rgba(255,255,255,.7)}
.tsw-p2 .quickbar .qb-tab.is-active{background:var(--p2-navy);color:#fff;box-shadow:0 6px 16px rgba(8,21,47,.18)}
.tsw-p2 .quickbar .qb-tab.is-active .qb-tab-s{color:rgba(255,255,255,.72)}
/* Gold stays an accent: it marks the primary journey's icon only. */
.tsw-p2 .quickbar .qb-tab.is-active .qb-tab-icon{color:var(--p2-gold-light)}
.tsw-p2 .quickbar .qb-tab:focus-visible{outline:2px solid var(--p2-blue);outline-offset:2px}

/* ---- Step rail ---------------------------------------------------------- */
.tsw-p2 .quickbar .qb-steps{
  display:flex;align-items:center;gap:0;list-style:none;margin:0 0 18px;padding:0;flex-wrap:wrap;
}
.tsw-p2 .quickbar .qb-steps li{display:flex;align-items:center}
/* The connector rule between steps, drawn on the li rather than as an extra
   element so the markup stays a plain ordered list. */
.tsw-p2 .quickbar .qb-steps li + li::before{
  content:"";width:clamp(16px,4vw,54px);height:1px;background:#D8DEE7;margin:0 12px;flex:0 0 auto;
}
.tsw-p2 .quickbar .qb-step{
  display:flex;align-items:center;gap:9px;background:none;border:0;padding:4px 2px;
  cursor:pointer;font-family:inherit;color:#94A3B8;font-size:13.5px;font-weight:600;
  transition:color .18s ease;
}
.tsw-p2 .quickbar .qb-step-n{
  width:24px;height:24px;border-radius:50%;flex:0 0 24px;
  display:flex;align-items:center;justify-content:center;
  background:#EEF2F7;color:#94A3B8;font-size:12px;font-weight:700;
  transition:background .18s ease,color .18s ease;
}
.tsw-p2 .quickbar .qb-step:hover{color:var(--p2-navy)}
.tsw-p2 .quickbar .qb-step.is-done .qb-step-n{background:#DCE4EF;color:var(--p2-navy)}
.tsw-p2 .quickbar .qb-step.is-active{color:var(--p2-navy)}
.tsw-p2 .quickbar .qb-step.is-active .qb-step-n{background:var(--p2-navy);color:#fff}
.tsw-p2 .quickbar .qb-step:focus-visible{outline:2px solid var(--p2-blue);outline-offset:2px;border-radius:6px}

/* ---- Field grids -------------------------------------------------------- */
.tsw-p2 .quickbar .qb-grid{display:grid;gap:14px;align-items:end}
.tsw-p2 .quickbar .qb-grid-4{grid-template-columns:1.4fr 1fr 1fr 1fr}
.tsw-p2 .quickbar .qb-grid-3{grid-template-columns:repeat(3,1fr)}
.tsw-p2 .quickbar .qb-grid-2{grid-template-columns:repeat(2,1fr)}
/* Selects are styled to match the frozen input treatment exactly, so the two
   control types sit on one line without looking like different systems. */
.tsw-p2 .quickbar .qb-grid select{
  width:100%;height:46px;padding:12px 38px 12px 14px;
  border:1.5px solid #E2E8F0;border-radius:10px;background-color:#F8FAFC;
  font-family:inherit;font-weight:500;font-size:.95rem;color:var(--tsw-ink);
  transition:.15s;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748B' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:16px 16px;
}
.tsw-p2 .quickbar .qb-grid select:focus{background-color:#fff;border-color:var(--p2-blue);box-shadow:0 0 0 3px rgba(17,30,142,.12);outline:none}
.tsw-p2 .quickbar .qb-grid .field input.is-invalid,
.tsw-p2 .quickbar .qb-grid .field select.is-invalid{border-color:var(--tsw-danger);background-color:#FFF7F7}
.tsw-p2 .quickbar .qb-opt{font-weight:600;color:#94A3B8;text-transform:none;letter-spacing:0}

/* ---- Actions ------------------------------------------------------------ */
.tsw-p2 .quickbar .qb-actions{display:flex;justify-content:flex-end;margin-top:16px}
.tsw-p2 .quickbar .qb-actions-split{justify-content:space-between;gap:12px}
.tsw-p2 .quickbar .qb-actions .btn{
  display:inline-flex;align-items:center;gap:8px;height:46px;padding:0 24px;
  border-radius:10px;font-weight:700;font-size:.95rem;
}
.tsw-p2 .quickbar .qb-actions .btn-primary{background:var(--p2-navy);border-color:var(--p2-navy);color:#fff;box-shadow:0 10px 22px rgba(8,21,47,.22)}
.tsw-p2 .quickbar .qb-actions .btn-primary:hover{background:#132a52;box-shadow:0 14px 28px rgba(8,21,47,.3);transform:translateY(-1px)}
.tsw-p2 .quickbar .qb-actions .btn-ghost{background:transparent;border:1.5px solid #DCE4EF;color:var(--p2-navy);box-shadow:none}
.tsw-p2 .quickbar .qb-actions .btn-ghost:hover{background:#F1F4F8;border-color:#C7D2E0;color:var(--p2-navy)}
.tsw-p2 .quickbar .qb-actions .btn:focus-visible{outline:2px solid var(--p2-blue);outline-offset:2px}

/* ---- Popular chips ------------------------------------------------------ */
.tsw-p2 .quickbar .qb-popular{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  margin-top:18px;padding-top:16px;border-top:1px solid #EEF2F7;
}
.tsw-p2 .quickbar .qb-popular-l{
  font-size:.7rem;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:var(--p2-muted);flex:0 0 auto;
}
.tsw-p2 .quickbar .qb-chips{display:flex;gap:8px;flex-wrap:wrap;min-width:0}
.tsw-p2 .quickbar .qb-chip{
  border:1px solid #E2E8F0;background:#F8FAFC;color:var(--p2-navy);
  padding:8px 15px;border-radius:999px;font-family:inherit;font-size:.83rem;font-weight:600;
  cursor:pointer;white-space:nowrap;transition:background .18s ease,border-color .18s ease,color .18s ease;
}
.tsw-p2 .quickbar .qb-chip:hover{background:#EEF2F7;border-color:#C7D2E0}
.tsw-p2 .quickbar .qb-chip.is-on{background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 .quickbar .qb-chip:focus-visible{outline:2px solid var(--p2-blue);outline-offset:2px}

/* ---- Panel / pane transition: short, and only opacity+transform --------- */
.tsw-p2 .quickbar .qb-panel[hidden],
.tsw-p2 .quickbar .qb-pane[hidden]{display:none}
.tsw-p2 .quickbar .qb-panel:not([hidden]),
.tsw-p2 .quickbar .qb-pane:not([hidden]){animation:tswp2QbIn .2s ease both}
@keyframes tswp2QbIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* ---- Tablet: 768-1024 --------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .quickbar .qb-head-p2{gap:16px}
  .tsw-p2 .quickbar .qb-tabs{width:100%}
  .tsw-p2 .quickbar .qb-tab{flex:1 1 0}
  .tsw-p2 .quickbar .qb-grid-4{grid-template-columns:repeat(2,1fr)}
  .tsw-p2 .quickbar .qb-grid-3{grid-template-columns:repeat(2,1fr)}
  .tsw-p2 .quickbar .qb-steps li + li::before{width:clamp(12px,2.5vw,28px);margin:0 8px}
  .tsw-p2 .quickbar .qb-step-l{font-size:13px}
}

/* ---- Mobile: <=767 ------------------------------------------------------ */
@media(max-width:767px){
  .tsw-p2 .quickbar .qb-head-p2{flex-direction:column;gap:14px;margin-bottom:16px}
  .tsw-p2 .quickbar .qb-tab{padding:9px 12px}
  .tsw-p2 .quickbar .qb-tab-t{font-size:13.5px}
  .tsw-p2 .quickbar .qb-tab-s{font-size:11px}
  .tsw-p2 .quickbar .qb-grid-4,
  .tsw-p2 .quickbar .qb-grid-3,
  .tsw-p2 .quickbar .qb-grid-2{grid-template-columns:1fr;gap:12px}
  .tsw-p2 .quickbar .qb-actions .btn{width:100%;justify-content:center}
  .tsw-p2 .quickbar .qb-actions-split{gap:10px}
  .tsw-p2 .quickbar .qb-actions-split .btn{flex:1 1 0}
  /* The step rail scrolls rather than wrapping into a ragged block. */
  .tsw-p2 .quickbar .qb-steps{
    flex-wrap:nowrap;overflow-x:auto;margin:0 -2px 16px;padding:0 2px 4px;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
  }
  .tsw-p2 .quickbar .qb-steps::-webkit-scrollbar{display:none}
  .tsw-p2 .quickbar .qb-steps li{flex:0 0 auto}
  .tsw-p2 .quickbar .qb-step-l{font-size:12.5px}
  .tsw-p2 .quickbar .qb-popular{
    flex-direction:column;align-items:flex-start;gap:10px;margin-top:16px;padding-top:14px;
  }
  .tsw-p2 .quickbar .qb-chips{
    flex-wrap:nowrap;overflow-x:auto;width:100%;padding-bottom:4px;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;
  }
  .tsw-p2 .quickbar .qb-chips::-webkit-scrollbar{display:none}
  .tsw-p2 .quickbar .qb-chip{flex:0 0 auto}
}

/* ---- Reduced motion ----------------------------------------------------- */
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .quickbar .qb-panel:not([hidden]),
  .tsw-p2 .quickbar .qb-pane:not([hidden]){animation:none}
  .tsw-p2 .quickbar .qb-tab,
  .tsw-p2 .quickbar .qb-step,
  .tsw-p2 .quickbar .qb-chip,
  .tsw-p2 .quickbar .qb-actions .btn{transition:none}
  .tsw-p2 .quickbar .qb-actions .btn-primary:hover{transform:none}
}

/* ==========================================================================
   PHASE 2 - PLANNER STEP 1: FIVE CONTROLS ON ONE DESKTOP BASELINE (v1.28.8)
   --------------------------------------------------------------------------
   Step 1 renders three sibling blocks - .qb-grid (the four fields),
   .qb-actions (the CTA) and .qb-popular - so the button was laid out on its
   own row, 86px below the inputs.

   Rather than move the button in the DOM (which would drag the approved
   tablet/mobile stacking along with it), the STEP-1 PANE becomes the grid
   and its two wrapper divs are dissolved with display:contents. The four
   fields and the button then become direct items of one five-column row.
   Both wrappers are plain <div>s carrying no role, so dissolving their
   boxes changes layout only, never semantics or the DOM.

   Everything here is inside @media(min-width:1025px), so tablet and mobile
   keep the composition already signed off - they never see these rules.

   Two details make the baseline exact rather than approximate:
     - the frozen .quickbar .field reserves a 22px error slot under every
       field, so align-items:end lines up the FIELD boxes, not the inputs.
       The button clears that slot with the same margin-bottom:22px the
       Phase 2 .quickbar-submit already uses for this exact purpose.
     - the selects were 46px while .tsw-p2 .quickbar .field input is 48px,
       so the row had two different control heights. The selects are raised
       to 48px to match the input, leaving the input itself untouched.
   ========================================================================== */
@media(min-width:1025px){
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"]{
    display:grid;
    /* The button's column now shares the row, so the four field columns are
       rebalanced to the widest text each actually has to show, measured at
       the narrowest desktop (1280) where the field budget is 855px:
         destination  needs 219 (placeholder) -> gets 240
         when         needs 199 ("Flexible - not sure yet") -> gets 205
         travellers   needs 116 -> gets 205
         trip type    needs 136 -> gets 205
       The three selects stay equal to each other, which is the balance the
       approved screenshot shows; only destination gives up the slack it had.
       At 1.4fr the when select clipped its own default option by 5px. */
    grid-template-columns:1.17fr 1fr 1fr 1fr auto;
    gap:14px;
    align-items:end;
  }
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] > .qb-grid,
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] > .qb-actions{display:contents}
  /* Popular right now keeps its own full-width row and its own rule/spacing. */
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] > .qb-popular{grid-column:1 / -1}

  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] .qb-grid select{height:48px}
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] .qb-actions .btn{
    height:48px;
    margin-bottom:22px;
  }
}

/* ==========================================================================
   PHASE 2 - PLANNER: STEP INDICATOR, HIDDEN-PANE FIX, MOBILE CTA (v1.28.9)
   ========================================================================== */

/* ---- 1. REGRESSION FIX from v1.28.8 -------------------------------------
   v1.28.8 gave step 1 `display:grid` so its five controls share one row.
   That selector - .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"] - has the
   SAME specificity (0,4,0) as the .tsw-p2 .quickbar .qb-pane[hidden] rule
   that hides an inactive pane, and being later in the file it won. So on
   desktop step 1 kept rendering underneath steps 2 and 3: the pane carried
   the hidden attribute but still painted, 184.6px tall. Mobile was never
   affected because the grid rule is desktop-only.

   Restricting the grid to panes that are NOT hidden fixes it at the source
   and keeps the approved v1.28.8 baseline exactly as it was. */
@media(min-width:1025px){
  .tsw-p2 .quickbar .qb-pane[data-qb-pane="1"][hidden]{display:none}
}

/* ---- 2. Step rail: only the ACTIVE step is shown ------------------------
   The JS already toggles .is-active on the step button, so the rail can be
   driven straight off that with :has() - no JS change, no second step
   system, and every <li> stays in the DOM so the existing click handlers
   and aria-current keep working. The connectors are dropped along with the
   inactive steps, since a single item has nothing to connect to. */
.tsw-p2 .quickbar .qb-steps li:not(:has(.qb-step.is-active)){display:none}
.tsw-p2 .quickbar .qb-steps li + li::before{content:none}
.tsw-p2 .quickbar .qb-steps .qb-step.is-active{cursor:default}

/* ---- 3. Mobile final CTA: one line, never a three-line block ------------
   .qb-actions-split gave both buttons flex:1 1 0, so they split the row
   50/50. Measured at 390px that hands "Send My Travel Request" 156px when
   its text + arrow + padding need 239px, and it wrapped to three lines
   inside a fixed 46px box. Back is given its natural width instead and the
   submit takes the remainder, with type and padding stepped down only as
   far as the narrowest viewport actually requires. */
@media(max-width:767px){
  .tsw-p2 .quickbar .qb-actions-split{gap:10px;align-items:stretch}
  .tsw-p2 .quickbar .qb-actions-split .btn{
    white-space:nowrap;min-width:0;height:48px;
  }
  .tsw-p2 .quickbar .qb-actions-split .qb-back{flex:0 0 auto;width:auto;padding:0 18px}
  .tsw-p2 .quickbar .qb-actions-split .qb-submit{flex:1 1 auto;width:auto;padding:0 16px}
}
@media(max-width:400px){
  .tsw-p2 .quickbar .qb-actions-split .btn{font-size:14px;gap:6px}
  .tsw-p2 .quickbar .qb-actions-split .qb-back{padding:0 14px}
  .tsw-p2 .quickbar .qb-actions-split .qb-submit{padding:0 12px}
}

/* ==========================================================================
   PHASE 2 - TRUST / VALUE PROPOSITION, PREMIUM PASS (v1.28.10)
   --------------------------------------------------------------------------
   The strip used to be five bare figures separated by hairlines. It now
   carries a section head, an icon and a supporting line per item, all
   CMS-driven, so it reads as "The TripSkyWay promise" rather than a
   dashboard statistics row.

   Restraint is deliberate: one hairline, one 1px gold rule under each value
   and a thin icon ring - no drop shadows, no filled gold, no gradients. The
   values keep the editorial serif already used by every Phase 2 heading, so
   no new font is introduced. Appended after all existing CSS; the frozen
   Phase 1 half is untouched and every selector stays .tsw-p2-scoped.
   ========================================================================== */
.tsw-p2 .p2-trust{padding:92px 0 84px;background:var(--p2-ivory,#FBFAF7)}

/* ---- Section head -------------------------------------------------------- */
.tsw-p2 .p2-trust-head{text-align:center;max-width:640px;margin:0 auto 52px}
.tsw-p2 .p2-trust-head .p2-eyebrow{justify-content:center;margin-bottom:16px}
.tsw-p2 .p2-trust-head .p2-h2{margin-bottom:12px}
.tsw-p2 .p2-trust-sub{margin:0;font-size:16px;line-height:1.6;color:var(--p2-muted)}

/* ---- Grid: five columns, wrapping cleanly rather than squeezing ---------- */
.tsw-p2 .p2-trust-grid{
  display:flex;flex-wrap:wrap;justify-content:center;
  gap:0;list-style:none;margin:0;padding:0;
  border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-trust-cell{
  flex:1 1 0;min-width:0;
  display:flex;flex-direction:column;align-items:center;text-align:center;
  padding:40px 26px 38px;
  border-right:1px solid var(--p2-line);
  border-bottom:1px solid var(--p2-line);
}
.tsw-p2 .p2-trust-cell:last-child{border-right:0}

/* ---- Icon: thin ring, never a filled badge ------------------------------- */
.tsw-p2 .p2-trust-ico{
  display:flex;align-items:center;justify-content:center;
  width:52px;height:52px;border-radius:50%;
  border:1px solid rgba(255,165,0,.34);
  color:var(--p2-gold);margin-bottom:22px;flex:0 0 auto;
}
.tsw-p2 .p2-trust-ico svg{width:23px;height:23px;stroke-width:1.15}

/* ---- Value: the editorial serif, with a hairline gold rule beneath ------- */
.tsw-p2 .p2-trust-val{
  font-family:var(--p2-serif);font-weight:300;font-size:38px;line-height:1.05;
  letter-spacing:-.018em;color:var(--p2-navy);
}
.tsw-p2 .p2-trust-val::after{
  content:"";display:block;width:26px;height:1px;
  background:var(--p2-gold);margin:14px auto 0;opacity:.55;
}
.tsw-p2 .p2-trust-lab{
  margin-top:14px;font-size:11px;font-weight:700;letter-spacing:.16em;
  text-transform:uppercase;color:var(--p2-gold-text);line-height:1.4;
}
.tsw-p2 .p2-trust-body{
  margin-top:12px;font-size:13.5px;line-height:1.62;color:var(--p2-muted);
  max-width:22ch;text-wrap:pretty;
}

/* ---- Tablet: 3 + 2, centred, never five squeezed columns ---------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-trust{padding:64px 0 58px}
  .tsw-p2 .p2-trust-head{margin-bottom:40px}
  .tsw-p2 .p2-trust-cell{flex:0 1 33.333%;padding:32px 20px 30px}
  /* The orphan row is centred by justify-content on the flex container, so
     the right-hand rule of the last item in each row is the only one to
     clear - handled generically below. */
  .tsw-p2 .p2-trust-cell:nth-child(3n){border-right:0}
  .tsw-p2 .p2-trust-val{font-size:32px}
  .tsw-p2 .p2-trust-ico{width:46px;height:46px;margin-bottom:18px}
  .tsw-p2 .p2-trust-ico svg{width:20px;height:20px}
}

/* ---- Mobile: two per row down to 430, one below ------------------------- */
@media(max-width:767px){
  .tsw-p2 .p2-trust{padding:48px 0 44px}
  .tsw-p2 .p2-trust-head{margin-bottom:32px;padding:0 4px}
  .tsw-p2 .p2-trust-sub{font-size:15px}
  .tsw-p2 .p2-trust-cell{flex:0 1 50%;padding:28px 14px 26px}
  .tsw-p2 .p2-trust-cell:nth-child(3n){border-right:1px solid var(--p2-line)}
  .tsw-p2 .p2-trust-cell:nth-child(2n){border-right:0}
  .tsw-p2 .p2-trust-val{font-size:27px}
  .tsw-p2 .p2-trust-lab{font-size:10px;letter-spacing:.13em;margin-top:11px}
  .tsw-p2 .p2-trust-body{font-size:12.5px;margin-top:9px;max-width:24ch}
  .tsw-p2 .p2-trust-ico{width:42px;height:42px;margin-bottom:15px}
  .tsw-p2 .p2-trust-ico svg{width:18px;height:18px}
}
@media(max-width:430px){
  .tsw-p2 .p2-trust-cell{flex:0 1 100%;padding:26px 16px 24px;border-right:0}
  .tsw-p2 .p2-trust-cell:nth-child(3n),
  .tsw-p2 .p2-trust-cell:nth-child(2n){border-right:0}
  .tsw-p2 .p2-trust-cell:last-child{border-bottom:0}
  .tsw-p2 .p2-trust-body{max-width:30ch}
}

/* The pre-existing 600px tier laid the OLD five-figure strip out as 2x2 plus a
   full-width fifth cell, and to do that it gave :nth-child(5) its own
   flex/baseline treatment. That rule still matches this markup and left the
   last item baseline-aligned while its four siblings were centred, so it is
   neutralised here rather than edited in place - the block above it stays
   exactly as Phase 2 shipped it. */
@media(max-width:600px){
  .tsw-p2 .p2-trust-cell:nth-child(5){
    display:flex;flex-direction:column;align-items:center;gap:0;
    grid-column:auto;border-bottom:1px solid var(--p2-line);
  }
  .tsw-p2 .p2-trust-cell:nth-child(5) .p2-trust-lab{margin-top:14px}
}
@media(max-width:430px){
  .tsw-p2 .p2-trust-cell:nth-child(5){border-bottom:0}
  .tsw-p2 .p2-trust-cell:nth-child(5) .p2-trust-lab{margin-top:11px}
}

/* ==========================================================================
   PHASE 2 - QUICKBAR -> TRUST SEPARATION, FINAL POLISH (v1.28.11)
   --------------------------------------------------------------------------
   MEASURED CAUSE. The distance from the planner card's bottom edge to the
   Trust section's top edge was exactly 0px at all nine tested widths. The
   Trust section's generous padding-top (92 / 64 / 48px) sits INSIDE its own
   ivory background, so it read as internal space, not as separation - the
   ivory band began on the card's bottom edge and the two blocks fused.

   FIX: the breathing space is moved OUTSIDE the background, as margin-top on
   the Trust section. Because it is added BEFORE the section rather than after
   the planner, .quickbar-wrap keeps its negative-margin hero overlap and the
   approved Hero -> Planner relationship is untouched - the planner does not
   move at all. body is white and the section is ivory, so the gap reads as a
   deliberate pause between two differently-coloured bands.

   The internal padding-top is reduced by roughly the amount the margin adds,
   so the section gains clear separation without becoming taller than the
   editorial rhythm wants. Literal px values follow the convention the other
   Phase 2 sections already use (.p2-sec{padding:100px 0}); the project has no
   spacing token to reference.

   Appended, .tsw-p2-scoped, no negative margins, no absolute positioning, no
   JS. The frozen Phase 1 half of this file is untouched.
   ========================================================================== */
.tsw-p2 .p2-trust{margin-top:60px;padding:64px 0 72px}

@media(max-width:1024px){
  .tsw-p2 .p2-trust{margin-top:52px;padding:48px 0 56px}
}
@media(max-width:767px){
  .tsw-p2 .p2-trust{margin-top:44px;padding:36px 0 44px}
}

/* ---- Header rhythm: tighten the head-to-grid gap now that the section
   starts lower, so the block stays calm rather than sprawling. ----------- */
.tsw-p2 .p2-trust-head{margin-bottom:46px}
@media(max-width:1024px){ .tsw-p2 .p2-trust-head{margin-bottom:36px} }
@media(max-width:767px){ .tsw-p2 .p2-trust-head{margin-bottom:28px} }

/* ---- Icon ring: measured at rgba(255,165,0,.34) it read as almost absent
   against the ivory. Lifted just enough to register as a drawn ring, still
   a hairline and still unfilled. ---------------------------------------- */
.tsw-p2 .p2-trust-ico{border-color:rgba(255,165,0,.46)}
.tsw-p2 .p2-trust-ico svg{stroke-width:1.2}

/* ---- Description: one step darker for legibility on ivory, size and
   measure unchanged. ---------------------------------------------------- */
.tsw-p2 .p2-trust-body{color:#6E6A62}

/* ==========================================================================
   PHASE 3A - INBOUND EXPERIENCE SECTION (v1.29)
   --------------------------------------------------------------------------
   For visitors travelling TO India. Deliberately quieter than the navy
   domestic block so the two read as different audiences rather than as the
   same section twice. Reuses the existing p2 tokens, type scale and eyebrow;
   no new font, no cards, no shadows. Appended and .tsw-p2-scoped; the frozen
   Phase 1 half of this file is untouched.
   ========================================================================== */
.tsw-p2 .p2-inb-head{max-width:640px;margin:0 0 44px}
.tsw-p2 .p2-inb-head .p2-lede{margin:0}

.tsw-p2 .p2-inb-grid{
  display:grid;grid-template-columns:repeat(3,1fr);gap:0;
  list-style:none;margin:0;padding:0;border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-inb-cell{border-bottom:1px solid var(--p2-line);border-right:1px solid var(--p2-line)}
.tsw-p2 .p2-inb-cell:nth-child(3n){border-right:0}
.tsw-p2 .p2-inb-link{
  display:flex;flex-direction:column;gap:6px;
  padding:26px 26px 24px;text-decoration:none;transition:background .2s ease;
}
.tsw-p2 .p2-inb-link:hover{background:var(--p2-ivory,#FBFAF7)}
.tsw-p2 .p2-inb-name{
  font-family:var(--p2-serif);font-weight:300;font-size:25px;line-height:1.15;
  letter-spacing:-.015em;color:var(--p2-navy);
}
.tsw-p2 .p2-inb-sub{font-size:13.5px;line-height:1.6;color:var(--p2-muted);text-wrap:pretty}

.tsw-p2 .p2-inb-pkgs{display:flex;flex-wrap:wrap;gap:14px;margin-top:34px}
.tsw-p2 .p2-inb-pkg{
  display:flex;flex-direction:column;gap:4px;
  padding:16px 22px;border:1px solid var(--p2-line);border-radius:4px;
  text-decoration:none;transition:border-color .2s ease,background .2s ease;
}
.tsw-p2 .p2-inb-pkg:hover{border-color:var(--p2-gold);background:var(--p2-ivory,#FBFAF7)}
.tsw-p2 .p2-inb-pkg-t{font-size:15px;font-weight:600;color:var(--p2-navy)}
/* The amount is rendered by tsw_price() in the package's OWN currency. */
.tsw-p2 .p2-inb-pkg-p{font-size:13px;color:var(--p2-gold);font-weight:600;letter-spacing:.01em}

@media(max-width:1024px){
  .tsw-p2 .p2-inb-head{margin-bottom:34px}
  .tsw-p2 .p2-inb-grid{grid-template-columns:repeat(2,1fr)}
  .tsw-p2 .p2-inb-cell:nth-child(3n){border-right:1px solid var(--p2-line)}
  .tsw-p2 .p2-inb-cell:nth-child(2n){border-right:0}
  .tsw-p2 .p2-inb-link{padding:22px 20px 20px}
  .tsw-p2 .p2-inb-name{font-size:22px}
}
@media(max-width:767px){
  .tsw-p2 .p2-inb-head{margin-bottom:26px}
  .tsw-p2 .p2-inb-grid{grid-template-columns:1fr}
  .tsw-p2 .p2-inb-cell:nth-child(3n),
  .tsw-p2 .p2-inb-cell:nth-child(2n){border-right:0}
  .tsw-p2 .p2-inb-link{padding:20px 4px 18px}
  .tsw-p2 .p2-inb-name{font-size:21px}
  .tsw-p2 .p2-inb-pkgs{flex-direction:column;gap:10px;margin-top:26px}
  .tsw-p2 .p2-inb-pkg{width:100%}
}

/* ==========================================================================
   PHASE F - TRAVEL EXPERIENCE LANDING PAGES (v1.30)
   --------------------------------------------------------------------------
   /travel/domestic, /travel/international, /travel/inbound.

   These pages reuse the site's existing wrappers (.p2-wrap, .p2-sec), type
   scale (.p2-h2, .p2-lede), eyebrow, buttons, accordion and BOTH card
   partials, so almost nothing new is styled here - only the page-specific
   hero, the reassurance grid, the process rail and the cross-links.

   Scoped to .tx-* classes which exist on no other page, so nothing here can
   reach the homepage, header or footer. Appended after all existing CSS; the
   frozen Phase 1 half of this file is untouched.
   ========================================================================== */

/* ---- Hero: editorial and typographic, NOT a copy of the homepage slider -- */
.tx-hero{
  background:var(--p2-ivory,#FBFAF7);
  border-bottom:1px solid var(--p2-line);
  padding:88px 0 76px;
}
.tx-hero-inner{max-width:820px}
.tx-hero .p2-eyebrow{margin-bottom:18px}
/* Scoped under .tsw-p2 so it outranks the namespace's own heading rules -
   unscoped, .tx-h1 lost to them and the headline rendered bold instead of the
   light Newsreader every other Phase 2 heading uses. */
.tsw-p2 .tx-h1{
  font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(38px,5.2vw,62px);line-height:1.04;letter-spacing:-.02em;
  color:var(--p2-navy);margin:0 0 20px;text-wrap:balance;
}
.tx-lede{
  font-size:17px;line-height:1.72;color:var(--p2-muted);
  max-width:620px;margin:0 0 32px;text-wrap:pretty;
}
.tx-hero-cta{display:flex;flex-wrap:wrap;gap:14px}
.tx-hero-cta .btn{border-radius:6px}
/* .btn-ghost is designed for the homepage hero, i.e. white text on a dark
   photograph. These heroes are ivory, so the same class rendered white-on-
   near-white and the secondary CTA was effectively invisible. Restated here
   as navy-on-ivory; the shared component is left alone. */
.tsw-p2 .tx-hero-cta .btn-ghost{
  background:transparent;border:1px solid #C9C5BC;color:var(--p2-navy);
  backdrop-filter:none;
}
.tsw-p2 .tx-hero-cta .btn-ghost:hover{
  background:#fff;border-color:var(--p2-navy);color:var(--p2-navy);
}
.tsw-p2 .tx-hero-cta .btn-accent{background:var(--p2-gold);color:var(--p2-ink);border-color:var(--p2-gold)}
.tsw-p2 .tx-hero-cta .btn-accent:hover{background:var(--p2-gold-press);color:var(--p2-ink);border-color:var(--p2-gold-press)}

/* A quiet tint per market so the three pages are distinguishable at a glance
   without inventing three different layouts. */
.tx-hero.tx-outbound{background:#F7F9FC}
.tx-hero.tx-inbound{background:#FAF7F2}

/* ---- Section rhythm ----------------------------------------------------- */
.tx-sec-h{margin:0 0 14px}
.tx-sec-lede{margin:0 0 34px;max-width:620px}
.tx-dests-sec .tx-sec-h,
.tx-pkgs-sec .tx-sec-h{margin-bottom:30px}
.tx-more{margin-top:32px}

/* ---- Reassurance points: hairline grid, no cards, no shadows ------------- */
.tx-points{
  display:grid;grid-template-columns:repeat(4,1fr);gap:0;
  list-style:none;margin:0;padding:0;border-top:1px solid var(--p2-line);
}
.tx-point{
  padding:30px 28px 28px;
  border-bottom:1px solid var(--p2-line);border-right:1px solid var(--p2-line);
}
.tx-point:nth-child(4n){border-right:0}
.tsw-p2 .tx-point-t{
  font-family:var(--p2-serif);font-weight:300;font-size:20px;line-height:1.28;
  color:var(--p2-navy);margin:0 0 10px;letter-spacing:-.012em;text-wrap:balance;
}
.tx-point-b{font-size:14px;line-height:1.65;color:var(--p2-muted);margin:0;text-wrap:pretty}

/* ---- Process rail on navy ----------------------------------------------- */
.tx-steps{
  display:grid;grid-template-columns:repeat(5,1fr);gap:0;
  list-style:none;margin:34px 0 0;padding:0;
}
.tx-step{
  display:flex;flex-direction:column;gap:12px;
  padding:26px 22px 24px;border-left:1px solid rgba(255,253,248,.16);
}
.tx-step:first-child{border-left:0;padding-left:0}
.tx-step-n{
  font-size:11px;font-weight:700;letter-spacing:.16em;
  color:var(--p2-gold-light);
}
.tx-step-t{font-size:14.5px;line-height:1.6;color:rgba(255,253,248,.9);text-wrap:pretty}

/* ---- FAQ ---------------------------------------------------------------- */
.tx-faq-wrap{max-width:820px}

/* ---- Cross-links to the other two experiences --------------------------- */
.tx-other-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-top:26px}
.tx-other{
  display:flex;align-items:center;gap:14px;
  padding:24px 26px;border:1px solid var(--p2-line);border-radius:4px;
  text-decoration:none;transition:border-color .2s ease,background .2s ease;
}
.tx-other:hover{border-color:var(--p2-gold);background:var(--p2-ivory,#FBFAF7)}
.tx-other-e{
  font-size:10.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  color:var(--p2-gold-text);flex:0 0 auto;
}
.tx-other-t{
  font-family:var(--p2-serif);font-weight:400;font-size:19px;
  color:var(--p2-navy);flex:1 1 auto;letter-spacing:-.01em;
}
.tx-other svg{width:20px;height:20px;color:var(--p2-navy);flex:0 0 auto}

/* ---- Closing CTA -------------------------------------------------------- */
.tx-final{background:var(--p2-ivory,#FBFAF7);border-top:1px solid var(--p2-line)}
.tx-final-inner{max-width:620px;text-align:center;margin:0 auto}
.tx-final-inner .p2-lede{margin:0 auto 28px}
.tx-final-inner .btn{border-radius:6px}
.tsw-p2 .tx-final-inner .btn-accent{background:var(--p2-gold);color:var(--p2-ink);border-color:var(--p2-gold)}
.tsw-p2 .tx-final-inner .btn-accent:hover{background:var(--p2-gold-press);color:var(--p2-ink);border-color:var(--p2-gold-press)}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1024px){
  .tx-hero{padding:64px 0 56px}
  .tx-points{grid-template-columns:repeat(2,1fr)}
  .tx-point:nth-child(4n){border-right:1px solid var(--p2-line)}
  .tx-point:nth-child(2n){border-right:0}
  .tx-steps{grid-template-columns:repeat(3,1fr)}
  .tx-step{border-left:1px solid rgba(255,253,248,.16);padding-left:22px}
  .tx-step:nth-child(3n+1){border-left:0;padding-left:0}
}

/* ---- Mobile ------------------------------------------------------------- */
@media(max-width:767px){
  .tx-hero{padding:44px 0 40px}
  .tx-lede{font-size:15.5px;margin-bottom:26px}
  .tx-hero-cta{flex-direction:column;gap:10px}
  .tx-hero-cta .btn{width:100%;justify-content:center}
  .tx-points{grid-template-columns:1fr}
  .tx-point{padding:24px 2px 22px;border-right:0}
  .tx-point:nth-child(4n),.tx-point:nth-child(2n){border-right:0}
  .tx-steps{grid-template-columns:1fr;margin-top:24px}
  .tx-step{border-left:0;padding:18px 0;border-top:1px solid rgba(255,253,248,.16)}
  .tx-step:first-child{border-top:0;padding-top:0}
  .tx-other-grid{grid-template-columns:1fr;gap:12px}
  .tx-other{padding:20px}
  .tx-other-t{font-size:17px}
  .tx-final-inner .btn{width:100%;justify-content:center}
}

/* ==========================================================================
   INTERNATIONAL EXPERIENCE - PREMIUM EDITORIAL REDESIGN (v1.31)
   --------------------------------------------------------------------------
   Scoped entirely to .p2-intl. The previous markup leaned on .p2-mosaic and
   .p2-tile, which the domestic, travel-styles and wall sections also use, so
   restyling those would have silently moved three other sections. Nothing
   shared is redefined below.

   Colours are the EXISTING Phase 2 tokens only - --p2-navy, --p2-ink,
   --p2-gold, --p2-gold-light, --p2-ivory, --p2-line, --p2-muted. No new brand
   colour is introduced.
   ========================================================================== */

.tsw-p2 .p2-intl{position:relative;background:var(--p2-ivory);overflow:hidden}
.tsw-p2 .p2-intl-inner{position:relative;z-index:1}

/* ---- Route motif: decorative, extremely low contrast, never over imagery -- */
.tsw-p2 .p2-intl-map{
  position:absolute;top:0;right:0;width:min(58%,780px);height:340px;
  color:var(--p2-gold);opacity:.16;pointer-events:none;z-index:0;
}
.tsw-p2 .p2-intl-map svg{width:100%;height:100%;display:block}

/* ---- Header -------------------------------------------------------------- */
.tsw-p2 .p2-intl-head{
  display:flex;align-items:flex-end;justify-content:space-between;
  gap:48px;margin-bottom:46px;
}
.tsw-p2 .p2-intl-head-col{max-width:620px}
.tsw-p2 .p2-intl-h2{margin:0 0 16px;max-width:12ch}
.tsw-p2 .p2-intl-lede{margin:0;max-width:520px}

/* Understated editorial link, not a filled button. */
.tsw-p2 .p2-intl-cta{
  flex:0 0 auto;padding-bottom:9px;border-bottom:1px solid var(--p2-gold);
  white-space:nowrap;
}
.tsw-p2 .p2-intl-cta:hover{border-bottom-color:var(--p2-navy)}

/* ---- Value indicators ---------------------------------------------------- */
.tsw-p2 .p2-intl-values{
  display:flex;flex-wrap:wrap;align-items:stretch;gap:0;
  list-style:none;margin:30px 0 0;padding:0;
}
.tsw-p2 .p2-intl-value{
  display:flex;align-items:flex-start;gap:11px;
  padding:2px 26px 2px 0;margin-right:26px;
  border-right:1px solid var(--p2-line);
}
.tsw-p2 .p2-intl-value:last-child{border-right:0;margin-right:0;padding-right:0}
.tsw-p2 .p2-intl-value svg{width:22px;height:22px;flex:0 0 22px;color:var(--p2-gold);margin-top:1px}
.tsw-p2 .p2-intl-value span{display:block;font-size:13px;line-height:1.5;color:var(--p2-muted)}
.tsw-p2 .p2-intl-value strong{display:block;font-weight:600;color:var(--p2-navy);font-size:13.5px}

/* ---- Editorial grid: feature beside a 2x2 ------------------------------- */
.tsw-p2 .p2-intl-grid{
  display:grid;grid-template-columns:1.5fr 1fr 1fr;grid-auto-rows:296px;gap:20px;
}
.tsw-p2 .p2-intl-feat{grid-row:span 2}

/* ---- Featured destination ----------------------------------------------- */
.tsw-p2 .p2-intl-feat{
  position:relative;display:block;overflow:hidden;border-radius:6px;
  background:var(--p2-ink);text-decoration:none;isolation:isolate;
}
.tsw-p2 .p2-intl-feat img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 .p2-intl-feat:hover img{transform:scale(1.03)}
/* One restrained scrim, no decorative gradient stack. */
.tsw-p2 .p2-intl-feat::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(7,18,40,0) 34%,rgba(7,18,40,.58) 62%,rgba(7,18,40,.92) 100%);
}
.tsw-p2 .p2-intl-flag{
  position:absolute;top:24px;left:24px;z-index:2;
  display:inline-block;padding:8px 14px;border-radius:3px;
  background:rgba(7,18,40,.72);border:1px solid rgba(255,192,97,.4);
  font-size:10.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  color:var(--p2-gold-light);
}
.tsw-p2 .p2-intl-feat-cap{
  position:absolute;left:34px;right:34px;bottom:32px;z-index:2;display:block;color:#fff;
}
.tsw-p2 .p2-intl-feat-name{
  display:block;font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(34px,3vw,46px);line-height:1.06;letter-spacing:-.015em;margin-bottom:10px;
}
.tsw-p2 .p2-intl-feat-kick{
  display:block;font-size:11.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  color:var(--p2-gold-light);margin-bottom:12px;
}
.tsw-p2 .p2-intl-feat-country{
  display:block;font-size:13.5px;color:rgba(255,255,255,.76);margin-bottom:22px;
}
.tsw-p2 .p2-intl-feat-foot{
  display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap;
  padding-top:20px;border-top:1px solid rgba(255,255,255,.18);
}
.tsw-p2 .p2-intl-feat-btn{
  display:inline-flex;align-items:center;gap:9px;
  padding:12px 22px;border-radius:4px;background:var(--p2-gold);color:var(--p2-ink);
  font-size:13.5px;font-weight:600;letter-spacing:.01em;
  transition:background .2s ease;
}
.tsw-p2 .p2-intl-feat:hover .p2-intl-feat-btn{background:var(--p2-gold-press)}
.tsw-p2 .p2-intl-feat-btn svg{width:17px;height:17px;flex:0 0 17px}
.tsw-p2 .p2-intl-feat-price{display:block;text-align:right}
.tsw-p2 .p2-intl-feat-price-l{
  display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(255,255,255,.6);margin-bottom:3px;
}
.tsw-p2 .p2-intl-feat-price-v{display:block;font-size:19px;font-weight:600;color:#fff;line-height:1.15}
/* The basis qualifies the figure, so it sits under it and stays quiet - it must
   not compete with the destination name. */
.tsw-p2 .p2-intl-feat-price-b{display:block;margin-top:3px;font-size:11.5px;color:rgba(255,255,255,.62)}

/* ---- Supporting cards ---------------------------------------------------- */
.tsw-p2 .p2-intl-card{
  position:relative;display:flex;flex-direction:column;overflow:hidden;
  border-radius:6px;background:var(--p2-ink);text-decoration:none;
  border:1px solid transparent;transition:border-color .25s ease;
}
.tsw-p2 .p2-intl-card:hover{border-color:rgba(255,165,0,.55)}
.tsw-p2 .p2-intl-card-media{
  position:absolute;inset:0;z-index:0;display:block;overflow:hidden;
}
.tsw-p2 .p2-intl-card-media img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 .p2-intl-card:hover .p2-intl-card-media img{transform:scale(1.04)}
.tsw-p2 .p2-intl-card-media::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,.06) 26%,rgba(7,18,40,.72) 62%,rgba(7,18,40,.95) 100%);
}
.tsw-p2 .p2-intl-card-body{
  position:relative;z-index:1;margin-top:auto;display:block;
  padding:22px 24px 22px;color:#fff;
}
.tsw-p2 .p2-intl-card-name{
  display:block;font-family:var(--p2-serif);font-weight:400;
  font-size:26px;line-height:1.12;letter-spacing:-.01em;margin-bottom:7px;
}
.tsw-p2 .p2-intl-card-country{
  display:block;font-size:12.5px;color:rgba(255,255,255,.72);
  padding-bottom:11px;margin-bottom:11px;border-bottom:1px solid rgba(255,255,255,.16);
}
.tsw-p2 .p2-intl-card-desc{
  display:block;font-size:13.5px;line-height:1.55;color:rgba(255,255,255,.82);
  margin-bottom:13px;
}
.tsw-p2 .p2-intl-card-cta{
  display:inline-flex;align-items:center;gap:7px;
  font-size:12.5px;font-weight:600;letter-spacing:.02em;color:var(--p2-gold-light);
}
.tsw-p2 .p2-intl-card-cta svg{width:15px;height:15px;flex:0 0 15px;transition:transform .25s ease}
.tsw-p2 .p2-intl-card:hover .p2-intl-card-cta svg{transform:translateX(3px)}

/* Keyboard focus must be as visible as hover - these are ordinary anchors. */
.tsw-p2 .p2-intl-feat:focus-visible,
.tsw-p2 .p2-intl-card:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Tablet -------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-intl-map{width:70%;height:270px;opacity:.13}
  .tsw-p2 .p2-intl-head{flex-direction:column;align-items:flex-start;gap:22px;margin-bottom:36px}
  .tsw-p2 .p2-intl-h2{max-width:none}
  .tsw-p2 .p2-intl-grid{grid-template-columns:1fr 1fr;grid-template-rows:380px;grid-auto-rows:250px}
  .tsw-p2 .p2-intl-feat{grid-column:span 2;grid-row:span 1}
  .tsw-p2 .p2-intl-feat-cap{left:26px;right:26px;bottom:26px}
  .tsw-p2 .p2-intl-feat::after{
    background:linear-gradient(180deg,rgba(7,18,40,0) 12%,rgba(7,18,40,.55) 40%,rgba(7,18,40,.88) 68%,rgba(7,18,40,.96) 100%);
  }
  /* 23px sat just under the 24px WCAG "large text" threshold, so the card name
     needed 4.5 rather than 3.0 and measured 1.98-3.63 over the imagery. 24px
     makes it large text AND the deeper scrim lifts it well clear. */
  .tsw-p2 .p2-intl-card-name{font-size:24px}
  .tsw-p2 .p2-intl-card-media::after{
    background:linear-gradient(180deg,rgba(7,18,40,.1) 14%,rgba(7,18,40,.6) 44%,rgba(7,18,40,.88) 72%,rgba(7,18,40,.97) 100%);
  }
}

/* ---- Mobile: single-column editorial flow, not a shrunken grid ----------- */
@media(max-width:767px){
  .tsw-p2 .p2-intl-map{width:100%;height:200px;opacity:.1}
  .tsw-p2 .p2-intl-head{margin-bottom:28px;gap:18px}
  .tsw-p2 .p2-intl-values{gap:14px;margin-top:24px;flex-direction:column}
  .tsw-p2 .p2-intl-value{
    border-right:0;border-bottom:1px solid var(--p2-line);
    margin-right:0;padding:0 0 14px;width:100%;
  }
  .tsw-p2 .p2-intl-value:last-child{border-bottom:0;padding-bottom:0}
  .tsw-p2 .p2-intl-head-col{display:contents}
  .tsw-p2 .p2-intl-head{flex-direction:column;align-items:flex-start}
  .tsw-p2 .p2-intl-head .p2-eyebrow{order:1}
  .tsw-p2 .p2-intl-h2{order:2}
  .tsw-p2 .p2-intl-lede{order:3}
  /* The link already clears WCAG 2.2 AA's 24x24 target minimum at 27x161, but a
     primary section CTA deserves a more comfortable thumb target on a phone.
     The padding enlarges the hit box and the equal negative margin cancels its
     layout effect, so the section's height is unchanged. */
  .tsw-p2 .p2-intl-cta{order:4;align-self:flex-start;padding-top:9px;margin-top:-9px}
  .tsw-p2 .p2-intl-values{order:5;margin-top:4px}

  /* Rows are auto-sized here, so a min-height grows its own track instead of
     spilling into the next one. */
  .tsw-p2 .p2-intl-grid{grid-template-columns:1fr;grid-template-rows:none;grid-auto-rows:auto;gap:14px}
  .tsw-p2 .p2-intl-feat{grid-column:auto;grid-row:auto;min-height:400px}
  .tsw-p2 .p2-intl-feat img{position:absolute;inset:0}
  .tsw-p2 .p2-intl-feat-cap{left:20px;right:20px;bottom:20px}
  .tsw-p2 .p2-intl-feat::after{
    background:linear-gradient(180deg,rgba(7,18,40,0) 10%,rgba(7,18,40,.62) 32%,rgba(7,18,40,.9) 60%,rgba(7,18,40,.97) 100%);
  }
  .tsw-p2 .p2-intl-card-media::after{
    background:linear-gradient(180deg,rgba(7,18,40,.08) 14%,rgba(7,18,40,.6) 44%,rgba(7,18,40,.9) 72%,rgba(7,18,40,.97) 100%);
  }
  .tsw-p2 .p2-intl-flag{top:18px;left:18px}
  .tsw-p2 .p2-intl-feat-foot{gap:14px}
  .tsw-p2 .p2-intl-feat-btn{width:100%;justify-content:center;padding:14px 20px}
  .tsw-p2 .p2-intl-feat-price{text-align:left;width:100%}

  .tsw-p2 .p2-intl-card{min-height:300px}
  .tsw-p2 .p2-intl-card-body{padding:20px}
  .tsw-p2 .p2-intl-card-name{font-size:24px}
}

/* Hover motion is decoration - remove it entirely when asked to. */
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-intl-feat img,
  .tsw-p2 .p2-intl-card-media img,
  .tsw-p2 .p2-intl-card-cta svg{transition:none}
  .tsw-p2 .p2-intl-feat:hover img,
  .tsw-p2 .p2-intl-card:hover .p2-intl-card-media img{transform:none}
  .tsw-p2 .p2-intl-card:hover .p2-intl-card-cta svg{transform:none}
}

/* ==========================================================================
   INTERNATIONAL SECTION - MOBILE & TABLET COMPOSITION (v1.32)
   --------------------------------------------------------------------------
   Below 1025px the featured destination becomes a compact, image-first
   landscape tile instead of the tall portrait card, the supporting cards run
   two-up, and the section CTA moves under the grid where a thumb reaches it.

   DESKTOP IS UNTOUCHED: every rule below lives inside a max-width query and
   every selector is .p2-intl-*, so no shared primitive and no other section
   can be reached from here.
   ========================================================================== */

/* The below-grid CTA exists in the markup at every width but is desktop-hidden,
   so exactly ONE of the two CTAs is ever rendered - never both. */
.tsw-p2 .p2-intl-more{display:none}

@media(max-width:1024px){
  /* --- one CTA, and it sits under the grid --------------------------------- */
  /* Written as a.p2-intl-cta, not .p2-intl-cta: the shared primitive is
     `.tsw-p2 a.p2-link` (0,2,1), which outranks a plain two-class selector
     (0,2,0) and kept the header CTA displayed. Matching the element part wins
     on source order without touching the shared rule. */
  .tsw-p2 a.p2-intl-cta{display:none}
  .tsw-p2 .p2-intl-more{
    display:flex;align-items:center;justify-content:center;gap:10px;
    margin-top:22px;padding:16px 22px;
    border:1px solid var(--p2-line-warm,#E3DBC9);border-radius:6px;
    background:transparent;color:var(--p2-navy);
    font-size:14.5px;font-weight:600;letter-spacing:.01em;text-decoration:none;
    transition:border-color .2s ease,background .2s ease;
  }
  .tsw-p2 .p2-intl-more:hover{border-color:var(--p2-gold);background:#fff}
  .tsw-p2 .p2-intl-more:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
  .tsw-p2 .p2-intl-more svg{width:17px;height:17px;flex:0 0 17px}

  /* The tablet featured card is ALREADY a compact landscape tile (786x380 at
     834px, roughly 2:1) and its row height is left exactly as it was. Forcing
     an aspect ratio here made it 540px at 1024px - taller, not more compact -
     so the only tablet change is where the CTA lives. */
}

/* ---- Mobile ------------------------------------------------------------- */
@media(max-width:767px){
  /* Landscape, not the previous 400px portrait block. 5:4 rather than 4:3
     because the caption needs roughly 170px and 4:3 left only 47px of clear
     photograph at 375px - an image-first tile has to actually show the image. */
  .tsw-p2 .p2-intl-feat{aspect-ratio:5/4;min-height:0}
  .tsw-p2 .p2-intl-feat-name{font-size:31px;margin-bottom:6px}
  /* 11.5px/.16em wrapped "Overwater villas & turquoise lagoons" onto a second
     line at 375-390px, costing 18px of image. This keeps it to one line. */
  .tsw-p2 .p2-intl-feat-kick{font-size:10px;letter-spacing:.1em;margin-bottom:8px}
  .tsw-p2 .p2-intl-feat-country{margin-bottom:13px;font-size:12.5px}
  /* Lighter than the old tall card needed: the caption now covers a smaller
     share of a shorter tile, so the scrim can start later and stay shallower
     while still measuring above AA (verified per width over the real image). */
  .tsw-p2 .p2-intl-feat::after{
    background:linear-gradient(180deg,rgba(7,18,40,0) 18%,rgba(7,18,40,.5) 42%,rgba(7,18,40,.86) 68%,rgba(7,18,40,.95) 100%);
  }
  .tsw-p2 .p2-intl-feat-foot{padding-top:13px;gap:12px;flex-wrap:nowrap;align-items:flex-end}
  /* Button and price share one row, as they already do at every other width -
     the previous full-width button stacked above the price was what made the
     mobile card so tall. */
  .tsw-p2 .p2-intl-feat-btn{width:auto;justify-content:center;padding:11px 16px;font-size:12.5px}
  .tsw-p2 .p2-intl-feat-price{text-align:right;width:auto;flex:0 0 auto}
  .tsw-p2 .p2-intl-feat-price-v{font-size:17px}

  /* --- supporting cards: two-up, name + country + CTA ---------------------- */
  .tsw-p2 .p2-intl-grid{grid-template-columns:1fr 1fr;gap:12px}
  .tsw-p2 .p2-intl-feat{grid-column:span 2}
  .tsw-p2 .p2-intl-card{min-height:216px}
  .tsw-p2 .p2-intl-card-body{padding:16px 15px}
  .tsw-p2 .p2-intl-card-name{font-size:21px;margin-bottom:5px}
  .tsw-p2 .p2-intl-card-country{
    padding-bottom:0;margin-bottom:9px;border-bottom:0;font-size:11.5px;
  }
  /* At roughly 165px per column the description would run four or five lines
     and crowd the tile, so the card stays name + country + CTA. The full
     description remains on the destination page the card links to. */
  .tsw-p2 .p2-intl-card-desc{display:none}
  .tsw-p2 .p2-intl-card-cta{font-size:11.5px}
  .tsw-p2 .p2-intl-card-cta svg{width:13px;height:13px;flex:0 0 13px}
  .tsw-p2 .p2-intl-more{margin-top:16px;padding:15px 20px;font-size:14px}
}

/* Narrow phones: two columns still fit, but the tiles need a little more room
   for the destination name before it wraps. */
@media(max-width:390px){
  /* The gold kicker measured 3.75-4.04 against AA's 4.5 at these widths, where
     the card is shortest and the caption sits highest in the frame. A slightly
     deeper mid-stop clears it without dimming the top of the photograph. */
  .tsw-p2 .p2-intl-feat::after{
    background:linear-gradient(180deg,rgba(7,18,40,0) 16%,rgba(7,18,40,.62) 38%,rgba(7,18,40,.9) 66%,rgba(7,18,40,.96) 100%);
  }
  .tsw-p2 .p2-intl-card-name{font-size:19.5px}
  .tsw-p2 .p2-intl-card{min-height:200px}
  .tsw-p2 .p2-intl-feat-name{font-size:28px}
  .tsw-p2 .p2-intl-feat-btn{padding:11px 13px;font-size:12px}
  .tsw-p2 .p2-intl-feat-price-v{font-size:16px}
}

/* ==========================================================================
   DOMESTIC "WITHIN INDIA" - EDITORIAL REDESIGN (v1.33)
   --------------------------------------------------------------------------
   Sibling of the international section, not a copy: international is ivory and
   image-led across the full width, domestic is navy with an editorial discovery
   column beside the imagery. Shared tokens only - no new brand colour.

   Everything is .p2-dom-*. The previous right panel used the shared .p2-tile,
   which _travel_styles.php and _experiences.php also use; that class is no
   longer referenced here and none of its rules are redefined.
   ========================================================================== */

.tsw-p2 .p2-dom{grid-template-columns:1fr 1.12fr;gap:64px;align-items:start}
.tsw-p2 .p2-dom-h2{margin:0 0 16px}
.tsw-p2 .p2-dom-lede{margin:0 0 36px;max-width:460px}
.tsw-p2 .p2-dom-cta{margin-top:30px}

/* ---- Discovery list: hairline rows, gold numerals ------------------------ */
.tsw-p2 .p2-dom-n{color:var(--p2-gold-light);opacity:.85;letter-spacing:.12em}
.tsw-p2 a.p2-dom-row{border-bottom:1px solid rgba(255,255,255,.12)}
.tsw-p2 .p2-dom-stack{display:flex;align-items:baseline;gap:16px;flex:1;min-width:0}
.tsw-p2 .p2-dom-sub{color:rgba(255,255,255,.52)}
.tsw-p2 a.p2-dom-row:hover svg{stroke:var(--p2-gold-light);transform:translateX(3px)}
.tsw-p2 .p2-dom-row svg{transition:transform .25s ease,stroke .25s ease}
.tsw-p2 a.p2-dom-row:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}

/* ---- Value indicators, on navy ------------------------------------------ */
.tsw-p2 .p2-dom-values{
  display:flex;flex-wrap:wrap;list-style:none;margin:44px 0 0;padding:0;gap:0;
  border-top:1px solid rgba(255,255,255,.12);padding-top:26px;
}
.tsw-p2 .p2-dom-value{
  display:flex;align-items:flex-start;gap:11px;
  padding-right:22px;margin-right:22px;border-right:1px solid rgba(255,255,255,.12);
}
.tsw-p2 .p2-dom-value:last-child{border-right:0;margin-right:0;padding-right:0}
.tsw-p2 .p2-dom-value svg{width:21px;height:21px;flex:0 0 21px;color:var(--p2-gold-light);margin-top:1px}
.tsw-p2 .p2-dom-value span{display:block;font-size:12.5px;line-height:1.5;color:rgba(255,255,255,.6)}
.tsw-p2 .p2-dom-value strong{display:block;font-weight:600;color:#fff;font-size:13px}

/* ---- Right panel -------------------------------------------------------- */
.tsw-p2 .p2-dom-panel{display:block}

.tsw-p2 .p2-dom-feat,
.tsw-p2 .p2-dom-card{
  position:relative;display:block;overflow:hidden;border-radius:6px;
  background:var(--p2-ink);text-decoration:none;isolation:isolate;
  border:1px solid rgba(255,255,255,.08);
}
.tsw-p2 .p2-dom-feat{height:420px}
.tsw-p2 .p2-dom-feat img,
.tsw-p2 .p2-dom-card img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 .p2-dom-feat:hover img{transform:scale(1.03)}
.tsw-p2 .p2-dom-feat::after{
  content:"";position:absolute;inset:0;z-index:1;
  /* Measured over the real photograph: at .55/56% the gold kicker scored 3.57
     against AA's 4.5. Deepened until it clears, and no further. */
  background:linear-gradient(180deg,rgba(4,12,28,0) 22%,rgba(4,12,28,.62) 46%,rgba(4,12,28,.9) 72%,rgba(4,12,28,.96) 100%);
}
/* A destination whose CMS image is empty still has to compose. No placeholder
   photograph is invented - the tile becomes a quiet navy panel instead. */
.tsw-p2 .p2-dom-feat.is-noimg,
.tsw-p2 .p2-dom-card.is-noimg{
  background:linear-gradient(160deg,#0E2247 0%,#081733 62%,#060F24 100%);
}
/* Without a photograph there is nothing for a tall frame to show, so the tile
   sizes to its own content instead of leaving a hollow navy rectangle. The
   caption stops being an overlay and simply flows. */
.tsw-p2 .p2-dom-feat.is-noimg{height:auto;aspect-ratio:auto;min-height:0;padding:60px 28px 26px}
.tsw-p2 .p2-dom-feat.is-noimg .p2-dom-feat-cap{position:static;left:auto;right:auto;bottom:auto}
.tsw-p2 .p2-dom-card.is-noimg{min-height:0;padding-top:34px}

/* A single supporting destination should not sit in half a row. */
.tsw-p2 .p2-dom-card:only-child{grid-column:1 / -1}
.tsw-p2 .p2-dom-feat.is-noimg::after,
.tsw-p2 .p2-dom-card.is-noimg .p2-dom-card-media::after{background:none}

.tsw-p2 .p2-dom-flag{
  position:absolute;top:20px;left:20px;z-index:2;
  display:inline-block;padding:7px 13px;border-radius:3px;
  background:rgba(4,12,28,.74);border:1px solid rgba(255,192,97,.38);
  font-size:10px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  color:var(--p2-gold-light);
}
.tsw-p2 .p2-dom-feat-cap{position:absolute;left:28px;right:28px;bottom:26px;z-index:2;display:block;color:#fff}
.tsw-p2 .p2-dom-feat-name{
  display:block;font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(30px,2.6vw,42px);line-height:1.06;letter-spacing:-.015em;margin-bottom:9px;
}
.tsw-p2 .p2-dom-feat-kick{
  display:block;font-size:11px;font-weight:700;letter-spacing:.15em;text-transform:uppercase;
  color:var(--p2-gold-light);margin-bottom:10px;
}
.tsw-p2 .p2-dom-feat-place,
.tsw-p2 .p2-dom-card-place{
  display:flex;align-items:center;gap:6px;
  font-size:13px;color:rgba(255,255,255,.72);
}
.tsw-p2 .p2-dom-feat-place svg,
.tsw-p2 .p2-dom-card-place svg{width:14px;height:14px;flex:0 0 14px;color:var(--p2-gold-light)}
.tsw-p2 .p2-dom-feat-place{margin-bottom:20px}
.tsw-p2 .p2-dom-feat-foot{
  display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;
}
.tsw-p2 .p2-dom-feat-btn{
  display:inline-flex;align-items:center;gap:9px;
  padding:12px 20px;border-radius:4px;background:var(--p2-gold);color:var(--p2-ink);
  font-size:13.5px;font-weight:600;transition:background .2s ease;
}
.tsw-p2 .p2-dom-feat:hover .p2-dom-feat-btn{background:var(--p2-gold-press)}
.tsw-p2 .p2-dom-feat-btn svg{width:17px;height:17px;flex:0 0 17px}
.tsw-p2 .p2-dom-feat-price{display:block;text-align:right}
.tsw-p2 .p2-dom-feat-price-l{
  display:block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;
  color:rgba(255,255,255,.58);margin-bottom:2px;
}
.tsw-p2 .p2-dom-feat-price-v{display:block;font-size:22px;font-weight:600;color:#fff;line-height:1.1}
.tsw-p2 .p2-dom-feat-price-b{display:block;margin-top:2px;font-size:11.5px;color:rgba(255,255,255,.58)}

/* ---- 2x2 supporting grid ------------------------------------------------ */
.tsw-p2 .p2-dom-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:16px}
.tsw-p2 .p2-dom-card{min-height:212px;display:flex;flex-direction:column}
.tsw-p2 .p2-dom-card-media{position:absolute;inset:0;z-index:0;display:block;overflow:hidden}
.tsw-p2 .p2-dom-card-media img{transition:transform .7s cubic-bezier(.2,.6,.2,1)}
.tsw-p2 .p2-dom-card:hover .p2-dom-card-media img{transform:scale(1.04)}
.tsw-p2 .p2-dom-card-media::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(4,12,28,.05) 22%,rgba(4,12,28,.62) 58%,rgba(4,12,28,.93) 100%);
}
.tsw-p2 .p2-dom-card-body{position:relative;z-index:1;margin-top:auto;display:block;padding:18px 20px;color:#fff}
.tsw-p2 .p2-dom-card-name{
  display:block;font-family:var(--p2-serif);font-weight:400;
  font-size:23px;line-height:1.12;margin-bottom:6px;
}
.tsw-p2 .p2-dom-card-place{margin-bottom:11px}
.tsw-p2 .p2-dom-card-cta{
  display:inline-flex;align-items:center;gap:7px;
  font-size:12.5px;font-weight:600;color:var(--p2-gold-light);
}
.tsw-p2 .p2-dom-card-cta svg{width:15px;height:15px;flex:0 0 15px;transition:transform .25s ease}
.tsw-p2 .p2-dom-card:hover .p2-dom-card-cta svg{transform:translateX(3px)}
.tsw-p2 .p2-dom-card:hover{border-color:rgba(255,192,97,.4)}

.tsw-p2 .p2-dom-feat:focus-visible,
.tsw-p2 .p2-dom-card:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* The below-grid CTA is desktop-hidden, so exactly one of the two shows. */
.tsw-p2 .p2-dom-more{display:none}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-dom{grid-template-columns:1fr;gap:34px}
  /* One CTA per breakpoint: the column link gives way to the one under the
     grid. Written as a.p2-dom-cta to outrank `.tsw-p2 a.p2-link` (0,2,1). */
  .tsw-p2 a.p2-dom-cta{display:none}
  .tsw-p2 .p2-dom-more{
    display:flex;align-items:center;justify-content:center;gap:10px;
    margin-top:24px;padding:16px 22px;
    border:1px solid rgba(255,192,97,.45);border-radius:6px;
    /* Gold-light on this navy measures 3.42 - below AA for 14px text. The gold
       stays as the border and the arrow; the label itself is white. */
    color:#fff;font-size:14.5px;font-weight:600;text-decoration:none;
    transition:border-color .2s ease,background .2s ease;
  }
  .tsw-p2 .p2-dom-more:hover{border-color:var(--p2-gold-light);background:rgba(255,255,255,.05)}
  .tsw-p2 .p2-dom-more:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
  .tsw-p2 .p2-dom-more svg{width:17px;height:17px;flex:0 0 17px;color:var(--p2-gold-light)}
  .tsw-p2 .p2-dom-values{margin-top:34px;padding-top:22px}
  .tsw-p2 .p2-dom-feat{height:auto;aspect-ratio:16/10;min-height:330px}
  .tsw-p2 .p2-dom-feat img{position:absolute;inset:0}
}

/* ---- Mobile ------------------------------------------------------------- */
@media(max-width:767px){
  /* The brief's mobile intent is that the featured destination becomes the
     dominant visual, so the imagery comes straight after the intro and the
     discovery list follows as an index. display:contents dissolves the left
     column so its children and the panel can be ordered together. */
  .tsw-p2 .p2-dom{display:flex;flex-direction:column;gap:0}
  .tsw-p2 .p2-dom-col{display:contents}
  .tsw-p2 .p2-dom .p2-eyebrow{order:1}
  .tsw-p2 .p2-dom-h2{order:2}
  .tsw-p2 .p2-dom-lede{order:3;margin-bottom:22px}
  .tsw-p2 .p2-dom-panel{order:4}
  .tsw-p2 .p2-dom-list{order:5;margin-top:26px}
  .tsw-p2 .p2-dom-values{order:6}
  .tsw-p2 .p2-dom-feat{aspect-ratio:5/4;min-height:0}
  .tsw-p2 .p2-dom-feat-cap{left:18px;right:18px;bottom:18px}
  .tsw-p2 .p2-dom-flag{top:16px;left:16px}
  .tsw-p2 .p2-dom-feat-name{font-size:29px;margin-bottom:6px}
  .tsw-p2 .p2-dom-feat-kick{font-size:9.5px;letter-spacing:.1em;margin-bottom:7px}
  .tsw-p2 .p2-dom-feat-place{margin-bottom:13px;font-size:12px}
  .tsw-p2 .p2-dom-feat-foot{gap:12px;flex-wrap:nowrap}
  .tsw-p2 .p2-dom-feat-btn{padding:11px 15px;font-size:12.5px}
  .tsw-p2 .p2-dom-feat-price-v{font-size:18px}
  .tsw-p2 .p2-dom-feat::after{
    background:linear-gradient(180deg,rgba(4,12,28,0) 16%,rgba(4,12,28,.6) 40%,rgba(4,12,28,.9) 68%,rgba(4,12,28,.96) 100%);
  }

  .tsw-p2 .p2-dom-grid{gap:12px;margin-top:12px}
  .tsw-p2 .p2-dom-card{min-height:190px}
  .tsw-p2 .p2-dom-card-body{padding:15px 14px}
  .tsw-p2 .p2-dom-card-name{font-size:20px;margin-bottom:4px}
  .tsw-p2 .p2-dom-card-place{margin-bottom:8px;font-size:11.5px}
  .tsw-p2 .p2-dom-card-cta{font-size:11.5px}
  .tsw-p2 .p2-dom-card-cta svg{width:13px;height:13px;flex:0 0 13px}

  /* The value strip reads as a stacked list on a phone. */
  .tsw-p2 .p2-dom-values{flex-direction:column;gap:13px;margin-top:26px;padding-top:20px}
  .tsw-p2 .p2-dom-value{
    border-right:0;border-bottom:1px solid rgba(255,255,255,.1);
    margin-right:0;padding:0 0 13px;width:100%;
  }
  .tsw-p2 .p2-dom-value:last-child{border-bottom:0;padding-bottom:0}
  .tsw-p2 .p2-dom-more{margin-top:18px;padding:15px 20px;font-size:14px}
}

@media(max-width:390px){
  .tsw-p2 .p2-dom-card-name{font-size:18.5px}
  .tsw-p2 .p2-dom-card{min-height:178px}
  .tsw-p2 .p2-dom-feat-name{font-size:26px}
  .tsw-p2 .p2-dom-feat-btn{padding:11px 12px;font-size:12px}
  .tsw-p2 .p2-dom-feat-price-v{font-size:17px}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-dom-feat img,.tsw-p2 .p2-dom-card-media img,
  .tsw-p2 .p2-dom-card-cta svg,.tsw-p2 .p2-dom-row svg{transition:none}
  .tsw-p2 .p2-dom-feat:hover img,.tsw-p2 .p2-dom-card:hover .p2-dom-card-media img{transform:none}
  .tsw-p2 .p2-dom-card:hover .p2-dom-card-cta svg,
  .tsw-p2 a.p2-dom-row:hover svg{transform:none}
}

/* ==========================================================================
   INBOUND "VISITING INDIA" - EDITORIAL REDESIGN (v1.34)
   --------------------------------------------------------------------------
   Third sibling of the market sections: international is ivory and image-led,
   domestic is navy with a discovery column, inbound is light and editorial -
   an index beside a dominant destination, then supporting cards, then the
   inbound package rail.

   Everything is .p2-inbound-*. The previous markup's .p2-inb-* rules are left
   untouched above (nothing references them any more) and no shared selector is
   redefined. Existing Phase 2 tokens only; no new brand colour.
   ========================================================================== */

.tsw-p2 .p2-inbound{background:var(--p2-paper,#FBFAF8)}

/* ---- Top: editorial index beside the featured destination --------------- */
.tsw-p2 .p2-inbound-top{
  display:grid;grid-template-columns:0.86fr 1.14fr;gap:56px;align-items:stretch;
}
.tsw-p2 .p2-inbound-h2{margin:0 0 16px;max-width:14ch}
.tsw-p2 .p2-inbound-lede{margin:0 0 30px;max-width:420px}

.tsw-p2 .p2-inbound-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--p2-line)}
.tsw-p2 .p2-inbound-list li{border-bottom:1px solid var(--p2-line)}
.tsw-p2 a.p2-inbound-row{
  display:flex;align-items:center;gap:18px;padding:15px 2px;
  text-decoration:none;color:var(--p2-navy);
}
.tsw-p2 a.p2-inbound-row:hover{color:var(--p2-gold)}
.tsw-p2 .p2-inbound-n{
  /* --p2-gold on this light ground measures 2.99, below AA for 11px text, so
     the numeral is navy and the gold accent lives on the arrow instead. */
  font-size:11px;font-weight:700;letter-spacing:.14em;color:var(--p2-navy);opacity:.55;
  flex:0 0 auto;min-width:22px;
}
.tsw-p2 .p2-inbound-row-name{
  font-family:var(--p2-serif);font-weight:400;font-size:20px;line-height:1.2;
  flex:1;min-width:0;
}
.tsw-p2 .p2-inbound-row svg{
  width:17px;height:17px;flex:0 0 17px;color:var(--p2-gold);
  transition:transform .25s ease;
}
.tsw-p2 a.p2-inbound-row:hover svg{transform:translateX(3px)}
.tsw-p2 a.p2-inbound-row:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}

/* The section's single primary CTA - an editorial link, not a filled button. */
.tsw-p2 a.p2-inbound-cta{
  display:inline-flex;align-items:center;gap:10px;margin-top:26px;
  padding-bottom:8px;border-bottom:1px solid var(--p2-gold);
  font-size:14.5px;font-weight:600;color:var(--p2-navy);text-decoration:none;
}
.tsw-p2 a.p2-inbound-cta:hover{border-bottom-color:var(--p2-navy)}
.tsw-p2 a.p2-inbound-cta svg{width:16px;height:16px;flex:0 0 16px;color:var(--p2-gold)}
.tsw-p2 a.p2-inbound-cta:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Featured destination ----------------------------------------------- */
.tsw-p2 .p2-inbound-feat,
.tsw-p2 .p2-inbound-card{
  position:relative;display:block;overflow:hidden;border-radius:6px;
  background:var(--p2-ink);text-decoration:none;isolation:isolate;
}
.tsw-p2 .p2-inbound-feat{height:470px}
.tsw-p2 .p2-inbound-feat img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 .p2-inbound-feat:hover img{transform:scale(1.03)}
.tsw-p2 .p2-inbound-feat::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(6,14,30,0) 22%,rgba(6,14,30,.66) 48%,rgba(6,14,30,.9) 72%,rgba(6,14,30,.95) 100%);
}
/* No photograph is invented for a destination whose CMS image is empty - the
   tile becomes a quiet navy panel that sizes to its own content. */
.tsw-p2 .p2-inbound-feat.is-noimg,
.tsw-p2 .p2-inbound-card.is-noimg{
  background:linear-gradient(160deg,#12294F 0%,#0A1B38 62%,#071228 100%);
}
.tsw-p2 .p2-inbound-feat.is-noimg{
  /* aspect-ratio must be cleared here: combined with min-height the ratio
     derives WIDTH from height (360 x 5/4 = 450px), which overflowed a 390px
     viewport. A card with no photograph has no ratio to preserve anyway. */
  aspect-ratio:auto;height:auto;min-height:360px;padding:64px 30px 28px;
  display:flex;flex-direction:column;justify-content:flex-end;
}
.tsw-p2 .p2-inbound-feat.is-noimg::after{background:none}
.tsw-p2 .p2-inbound-feat.is-noimg .p2-inbound-feat-cap{position:static;left:auto;right:auto;bottom:auto}
.tsw-p2 .p2-inbound-card.is-noimg{min-height:0;padding-top:38px}
.tsw-p2 .p2-inbound-card.is-noimg .p2-inbound-card-media::after{background:none}

.tsw-p2 .p2-inbound-flag{
  position:absolute;top:22px;left:22px;z-index:2;
  display:inline-block;padding:8px 14px;border-radius:3px;
  background:rgba(6,14,30,.72);border:1px solid rgba(255,192,97,.4);
  font-size:10px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  color:var(--p2-gold-light);
}
.tsw-p2 .p2-inbound-feat-cap{position:absolute;left:30px;right:30px;bottom:28px;z-index:2;display:block;color:#fff}
.tsw-p2 .p2-inbound-feat-name{
  display:block;font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(32px,2.8vw,46px);line-height:1.05;letter-spacing:-.015em;margin-bottom:9px;
}
.tsw-p2 .p2-inbound-feat-kick{
  display:block;font-size:11px;font-weight:700;letter-spacing:.15em;text-transform:uppercase;
  color:var(--p2-gold-light);margin-bottom:10px;
}
.tsw-p2 .p2-inbound-feat-place,
.tsw-p2 .p2-inbound-card-sub{display:flex;align-items:center;gap:6px;font-size:13px;color:rgba(255,255,255,.74)}
.tsw-p2 .p2-inbound-feat-place svg{width:14px;height:14px;flex:0 0 14px;color:var(--p2-gold-light)}
.tsw-p2 .p2-inbound-feat-place{margin-bottom:20px}
.tsw-p2 .p2-inbound-feat-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap}
.tsw-p2 .p2-inbound-feat-btn{
  display:inline-flex;align-items:center;gap:9px;padding:12px 20px;border-radius:4px;
  background:var(--p2-gold);color:var(--p2-ink);font-size:13.5px;font-weight:600;transition:background .2s ease;
}
.tsw-p2 .p2-inbound-feat:hover .p2-inbound-feat-btn{background:var(--p2-gold-press)}
.tsw-p2 .p2-inbound-feat-btn svg{width:17px;height:17px;flex:0 0 17px}
.tsw-p2 .p2-inbound-feat-price{display:block;text-align:right}
.tsw-p2 .p2-inbound-feat-price-l{display:block;font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:rgba(255,255,255,.58);margin-bottom:2px}
.tsw-p2 .p2-inbound-feat-price-v{display:block;font-size:22px;font-weight:600;color:#fff;line-height:1.1}
.tsw-p2 .p2-inbound-feat-price-b{display:block;margin-top:2px;font-size:11.5px;color:rgba(255,255,255,.58)}

/* ---- Sub-headings -------------------------------------------------------- */
.tsw-p2 .p2-inbound-subh{
  font-family:var(--p2-serif);font-weight:400;font-size:26px;line-height:1.2;
  color:var(--p2-navy);margin:56px 0 22px;letter-spacing:-.01em;
}

/* ---- Supporting destination cards --------------------------------------- */
/* auto-fit so one, two, three or four cards all compose - the grid is sized by
   the data, never padded out with invented destinations. */
.tsw-p2 .p2-inbound-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.tsw-p2 .p2-inbound-grid[data-count="1"]{grid-template-columns:1fr}
.tsw-p2 .p2-inbound-grid[data-count="1"] .p2-inbound-card{min-height:280px}
.tsw-p2 .p2-inbound-grid[data-count="2"]{grid-template-columns:repeat(2,1fr)}
.tsw-p2 .p2-inbound-grid[data-count="3"]{grid-template-columns:repeat(3,1fr)}
.tsw-p2 .p2-inbound-card{min-height:250px;display:flex;flex-direction:column}
.tsw-p2 .p2-inbound-card-media{position:absolute;inset:0;z-index:0;display:block;overflow:hidden}
.tsw-p2 .p2-inbound-card-media img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .7s cubic-bezier(.2,.6,.2,1)}
.tsw-p2 .p2-inbound-card:hover .p2-inbound-card-media img{transform:scale(1.04)}
.tsw-p2 .p2-inbound-card-media::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(6,14,30,.05) 24%,rgba(6,14,30,.62) 58%,rgba(6,14,30,.93) 100%);
}
.tsw-p2 .p2-inbound-card-body{position:relative;z-index:1;margin-top:auto;display:block;padding:18px 20px;color:#fff}
.tsw-p2 .p2-inbound-card-name{display:block;font-family:var(--p2-serif);font-weight:400;font-size:22px;line-height:1.14;margin-bottom:6px}
.tsw-p2 .p2-inbound-card-sub{display:block;font-size:12.5px;line-height:1.5;color:rgba(255,255,255,.78);margin-bottom:11px}
.tsw-p2 .p2-inbound-card-cta{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;color:var(--p2-gold-light)}
.tsw-p2 .p2-inbound-card-cta svg{width:15px;height:15px;flex:0 0 15px;transition:transform .25s ease}
.tsw-p2 .p2-inbound-card:hover .p2-inbound-card-cta svg{transform:translateX(3px)}
.tsw-p2 .p2-inbound-feat:focus-visible,
.tsw-p2 .p2-inbound-card:focus-visible,
.tsw-p2 .p2-inbound-pkg:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Package rail -------------------------------------------------------- */
.tsw-p2 .p2-inbound-pkghead{display:flex;align-items:flex-end;justify-content:space-between;gap:28px;flex-wrap:wrap}
.tsw-p2 .p2-inbound-pkghead .p2-inbound-subh{margin-bottom:6px}
.tsw-p2 .p2-inbound-pkglede{margin:0;font-size:14.5px;color:var(--p2-body)}
.tsw-p2 a.p2-inbound-pkglink{
  display:inline-flex;align-items:center;gap:8px;padding-bottom:6px;
  border-bottom:1px solid var(--p2-gold);white-space:nowrap;
  font-size:13.5px;font-weight:600;color:var(--p2-navy);text-decoration:none;
}
.tsw-p2 a.p2-inbound-pkglink:hover{border-bottom-color:var(--p2-navy)}
.tsw-p2 a.p2-inbound-pkglink svg{width:15px;height:15px;flex:0 0 15px;color:var(--p2-gold)}
.tsw-p2 a.p2-inbound-pkglink:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

.tsw-p2 .p2-inbound-pkgs{list-style:none;margin:22px 0 0;padding:0;display:grid;gap:14px}
.tsw-p2 a.p2-inbound-pkg{
  display:flex;align-items:center;gap:18px;padding:14px 20px 14px 14px;
  border:1px solid var(--p2-line);border-radius:6px;background:#fff;
  text-decoration:none;transition:border-color .2s ease,box-shadow .2s ease;
}
.tsw-p2 a.p2-inbound-pkg:hover{border-color:var(--p2-gold)}
.tsw-p2 .p2-inbound-pkg-media{
  flex:0 0 104px;width:104px;height:78px;border-radius:4px;overflow:hidden;
  background:linear-gradient(160deg,#12294F 0%,#0A1B38 100%);display:block;
}
.tsw-p2 .p2-inbound-pkg-media img{width:100%;height:100%;object-fit:cover;display:block}
.tsw-p2 .p2-inbound-pkg-body{flex:1;min-width:0;display:block}
.tsw-p2 .p2-inbound-pkg-t{display:block;font-size:15.5px;font-weight:600;color:var(--p2-navy);line-height:1.3}
.tsw-p2 .p2-inbound-pkg-dur{display:block;margin-top:3px;font-size:13.5px;font-weight:600;color:var(--p2-navy)}
.tsw-p2 .p2-inbound-pkg-sum{display:block;margin-top:5px;font-size:12.5px;color:var(--p2-body)}
.tsw-p2 .p2-inbound-pkg-price{flex:0 0 auto;text-align:right;display:block}
.tsw-p2 .p2-inbound-pkg-price-l{display:block;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--p2-body);font-weight:700}
.tsw-p2 .p2-inbound-pkg-price-v{display:block;font-size:21px;font-weight:700;color:var(--p2-navy);line-height:1.15}
.tsw-p2 .p2-inbound-pkg-price-b{display:block;font-size:12px;color:var(--p2-body)}

/* ---- Value strip --------------------------------------------------------- */
.tsw-p2 .p2-inbound-values{
  display:flex;flex-wrap:wrap;list-style:none;margin:44px 0 0;padding:26px 0 0;
  border-top:1px solid var(--p2-line);gap:0;
}
.tsw-p2 .p2-inbound-value{
  display:flex;align-items:flex-start;gap:11px;flex:1 1 200px;
  padding-right:22px;margin-right:22px;border-right:1px solid var(--p2-line);
}
.tsw-p2 .p2-inbound-value:last-child{border-right:0;margin-right:0;padding-right:0}
.tsw-p2 .p2-inbound-value svg{width:22px;height:22px;flex:0 0 22px;color:var(--p2-gold);margin-top:1px}
.tsw-p2 .p2-inbound-value span{display:block;font-size:12.5px;line-height:1.5;color:var(--p2-body)}
.tsw-p2 .p2-inbound-value strong{display:block;font-weight:600;color:var(--p2-navy);font-size:13px}

/* ---- Tablet -------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-inbound-top{grid-template-columns:1fr;gap:30px}
  .tsw-p2 .p2-inbound-h2{max-width:none}
  .tsw-p2 .p2-inbound-feat{height:auto;aspect-ratio:16/10;min-height:340px}
  .tsw-p2 .p2-inbound-feat img{position:absolute;inset:0}
  .tsw-p2 .p2-inbound-grid{grid-template-columns:repeat(2,1fr)}
  .tsw-p2 .p2-inbound-grid[data-count="3"]{grid-template-columns:repeat(2,1fr)}
  .tsw-p2 .p2-inbound-subh{margin-top:44px;font-size:24px}
}

/* ---- Mobile: single column, featured stays dominant ---------------------- */
@media(max-width:767px){
  .tsw-p2 .p2-inbound-top{gap:24px}
  .tsw-p2 .p2-inbound-lede{margin-bottom:22px}
  .tsw-p2 .p2-inbound-feat{aspect-ratio:5/4;min-height:0}
  .tsw-p2 .p2-inbound-feat.is-noimg{padding:52px 20px 20px}
  .tsw-p2 .p2-inbound-feat-cap{left:18px;right:18px;bottom:18px}
  .tsw-p2 .p2-inbound-flag{top:16px;left:16px}
  .tsw-p2 .p2-inbound-feat-name{font-size:29px;margin-bottom:6px}
  .tsw-p2 .p2-inbound-feat-kick{font-size:9.5px;letter-spacing:.1em;margin-bottom:7px}
  .tsw-p2 .p2-inbound-feat-place{margin-bottom:13px;font-size:12px}
  .tsw-p2 .p2-inbound-feat-foot{gap:12px;flex-wrap:nowrap}
  .tsw-p2 .p2-inbound-feat-btn{padding:11px 15px;font-size:12.5px}
  .tsw-p2 .p2-inbound-feat-price-v{font-size:18px}
  .tsw-p2 .p2-inbound-feat::after{
    background:linear-gradient(180deg,rgba(6,14,30,0) 16%,rgba(6,14,30,.62) 40%,rgba(6,14,30,.9) 68%,rgba(6,14,30,.96) 100%);
  }
  /* Two-up wherever the width allows, which it does from 375px. */
  .tsw-p2 .p2-inbound-grid,
  .tsw-p2 .p2-inbound-grid[data-count="1"],
  .tsw-p2 .p2-inbound-grid[data-count="3"]{grid-template-columns:repeat(2,1fr);gap:12px}
  .tsw-p2 .p2-inbound-card{min-height:200px}
  .tsw-p2 .p2-inbound-card-body{padding:15px 14px}
  .tsw-p2 .p2-inbound-card-name{font-size:19px;margin-bottom:4px}
  .tsw-p2 .p2-inbound-card-sub{font-size:11.5px;margin-bottom:8px}
  .tsw-p2 .p2-inbound-card-cta{font-size:11.5px}
  .tsw-p2 .p2-inbound-card-cta svg{width:13px;height:13px;flex:0 0 13px}
  .tsw-p2 .p2-inbound-subh{margin-top:36px;font-size:22px}

  .tsw-p2 .p2-inbound-pkghead{gap:14px}
  .tsw-p2 a.p2-inbound-pkg{flex-wrap:wrap;gap:12px;padding:12px}
  .tsw-p2 .p2-inbound-pkg-media{flex:0 0 76px;width:76px;height:60px}
  .tsw-p2 .p2-inbound-pkg-t{font-size:14.5px}
  .tsw-p2 .p2-inbound-pkg-price{flex:1 1 100%;text-align:left;border-top:1px solid var(--p2-line);padding-top:10px}
  .tsw-p2 .p2-inbound-pkg-price-v{font-size:19px}

  .tsw-p2 .p2-inbound-values{flex-direction:column;gap:13px;margin-top:34px;padding-top:20px}
  .tsw-p2 .p2-inbound-value{
    border-right:0;border-bottom:1px solid var(--p2-line);
    margin-right:0;padding:0 0 13px;width:100%;flex:1 1 auto;
  }
  .tsw-p2 .p2-inbound-value:last-child{border-bottom:0;padding-bottom:0}
}

@media(max-width:390px){
  .tsw-p2 .p2-inbound-feat-name{font-size:26px}
  .tsw-p2 .p2-inbound-card-name{font-size:17.5px}
  .tsw-p2 .p2-inbound-card{min-height:186px}
  .tsw-p2 .p2-inbound-feat-btn{padding:11px 12px;font-size:12px}
  .tsw-p2 .p2-inbound-feat-price-v{font-size:17px}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-inbound-feat img,.tsw-p2 .p2-inbound-card-media img,
  .tsw-p2 .p2-inbound-card-cta svg,.tsw-p2 .p2-inbound-row svg{transition:none}
  .tsw-p2 .p2-inbound-feat:hover img,.tsw-p2 .p2-inbound-card:hover .p2-inbound-card-media img{transform:none}
  .tsw-p2 .p2-inbound-card:hover .p2-inbound-card-cta svg,
  .tsw-p2 a.p2-inbound-row:hover svg{transform:none}
}


/* ==========================================================================
   TRAVEL STYLE LANDING PAGE — /travel-styles/{slug}

   Own namespace (.p2-ts-*). The package cards deliberately reuse .p2-cj-card
   from the Curated Journeys block above rather than restyling anything: same
   card, same image-less panel, same price treatment, one place to fix.
   Nothing here redefines a shared selector.
   ========================================================================== */
.tsw-p2 .p2-ts-hero{position:relative;overflow:hidden;background:var(--p2-navy);
  min-height:420px;display:flex;align-items:flex-end}
.tsw-p2 .p2-ts-hero-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;opacity:.5}
/* Scrim: the eyebrow, h1 and lede sit on a photograph, so the ground under
   them is darkened until white type clears AA rather than trusting the image. */
.tsw-p2 .p2-ts-hero::after{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,.45) 0%,rgba(7,18,40,.72) 55%,rgba(7,18,40,.92) 100%)}
.tsw-p2 .p2-ts-hero.is-noimg{background:linear-gradient(155deg,#08152F 0%,#16305C 62%,#1E3E74 100%)}
/* width:100% matters: .p2-ts-hero is a flex container, so without it the
   .p2-wrap child shrink-wraps to its text and margin:0 auto centres the whole
   block instead of left-aligning it inside a full-width wrap. */
.tsw-p2 .p2-ts-hero-inner{position:relative;z-index:2;width:100%;
  padding-top:88px;padding-bottom:58px}
.tsw-p2 h1.p2-ts-h1{font-family:var(--p2-serif);font-weight:300;font-size:52px;line-height:1.05;
  letter-spacing:-.026em;color:#fff;margin:0 0 16px;text-wrap:balance}
.tsw-p2 .p2-ts-lede{margin:0;font-size:17px;line-height:1.66;color:rgba(255,255,255,.88);
  max-width:56ch;text-wrap:pretty}

.tsw-p2 .p2-ts-intro{padding:56px 0 0}
.tsw-p2 .p2-ts-intro-t{max-width:70ch;font-size:17px}

.tsw-p2 .p2-ts-list{padding-top:56px}
.tsw-p2 .p2-ts-count{margin:6px 0 0;font-size:13px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-body)}
.tsw-p2 .p2-ts-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:28px;align-items:stretch}

/* Empty state: a published style that is simply not stocked yet. */
.tsw-p2 .p2-ts-empty{border:1px solid var(--p2-line);border-radius:5px;background:var(--p2-paper);
  padding:64px 40px;text-align:center}
.tsw-p2 .p2-ts-empty h3{font-family:var(--p2-serif);font-weight:400;font-size:29px;line-height:1.2;
  letter-spacing:-.015em;color:var(--p2-navy);margin:0 0 12px}
.tsw-p2 .p2-ts-empty p{margin:0 auto 26px;max-width:58ch;font-size:16px;line-height:1.7;color:var(--p2-body)}
.tsw-p2 .p2-ts-empty-cta{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}

.tsw-p2 .p2-ts-pager{display:flex;align-items:center;justify-content:center;gap:20px;
  margin-top:46px;padding-top:32px;border-top:1px solid var(--p2-line-warm);flex-wrap:wrap}
.tsw-p2 .p2-ts-pager-info{font-size:13.5px;color:var(--p2-body)}

/* Travel-style cross-links on the package detail page. */
.tsw-ts-links{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:18px 0 0}
.tsw-ts-links > span{font-size:11px;letter-spacing:.18em;text-transform:uppercase;
  font-weight:600;color:#5A6472}
.tsw-ts-links a{display:inline-flex;align-items:center;min-height:30px;padding:5px 13px;
  font-size:13.5px;font-weight:600;color:#08152F;background:#F3F1EC;border:1px solid #E3E1DC;
  border-radius:999px;transition:background .16s ease,border-color .16s ease}
.tsw-ts-links a:hover{background:#08152F;border-color:#08152F;color:#fff}
.tsw-ts-links a:focus-visible{outline:2px solid #08152F;outline-offset:2px}

@media(max-width:1120px){
  .tsw-p2 .p2-ts-grid{grid-template-columns:repeat(2,1fr);gap:24px}
  .tsw-p2 h1.p2-ts-h1{font-size:44px}
  .tsw-p2 .p2-ts-hero{min-height:360px}
  .tsw-p2 .p2-ts-hero-inner{padding-top:72px;padding-bottom:48px}
}
@media(max-width:760px){
  .tsw-p2 .p2-ts-grid{grid-template-columns:1fr;gap:20px}
}
@media(max-width:600px){
  .tsw-p2 .p2-ts-hero{min-height:300px}
  .tsw-p2 .p2-ts-hero-inner{padding-top:56px;padding-bottom:36px}
  .tsw-p2 h1.p2-ts-h1{font-size:34px}
  .tsw-p2 .p2-ts-lede{font-size:15.5px}
  .tsw-p2 .p2-ts-intro{padding-top:40px}
  .tsw-p2 .p2-ts-list{padding-top:40px}
  .tsw-p2 .p2-ts-empty{padding:44px 22px}
  .tsw-p2 .p2-ts-empty h3{font-size:24px}
  .tsw-p2 .p2-ts-empty-cta .p2-btn{width:100%}
  .tsw-p2 .p2-ts-pager{gap:14px;margin-top:34px;padding-top:24px}
}
@media(prefers-reduced-motion:reduce){
  .tsw-ts-links a{transition:none}
}


/* ==========================================================================
   TRAVEL STYLES — "How you travel" (premium editorial redesign)

   Own namespace throughout: .p2-travel-styles-* for the section, .p2-ts-card-*
   for a card. Nothing here touches .p2-tile, .p2-cj-*, .p2-intl-*, .p2-dom-*
   or .p2-inbound-*, so the international, inbound, domestic, curated-journeys
   and offers sections cannot be affected. Existing tokens only — no new
   colour system.
   ========================================================================== */
.tsw-p2 .p2-travel-styles{background:var(--p2-ivory)}

.tsw-p2 .p2-travel-styles-head{max-width:640px;margin-bottom:40px}
.tsw-p2 .p2-travel-styles-eyebrow{gap:10px}
.tsw-p2 .p2-travel-styles-crown{width:16px;height:16px;flex:0 0 16px;color:var(--p2-gold)}
/* The eyebrow word itself is navy: --p2-gold measures 1.83:1 on this ivory
   ground as 11px type, nowhere near AA. Gold stays on the rule and the crown. */
.tsw-p2 .p2-travel-styles-eyebrow span{color:var(--p2-navy)}
.tsw-p2 h2.p2-travel-styles-h2{margin-bottom:18px;max-width:14ch}
.tsw-p2 .p2-travel-styles-lede{margin:0;font-size:16.5px;line-height:1.7;
  color:var(--p2-body);max-width:52ch;text-wrap:pretty}

.tsw-p2 .p2-travel-styles-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}

/* ---- Card ---------------------------------------------------------------- *
   One anchor, everything else inside it. position:relative + the image pinned
   absolute means the card's height is set by its aspect-ratio, not by the
   photograph, so eight different source ratios still line up. */
.tsw-p2 a.p2-ts-card{position:relative;display:block;overflow:hidden;border-radius:15px;
  aspect-ratio:5/6;background:var(--p2-navy);color:#fff;isolation:isolate;
  transition:transform .3s cubic-bezier(.2,.6,.2,1),box-shadow .3s ease}
.tsw-p2 a.p2-ts-card:hover{color:#fff;transform:translateY(-4px);
  box-shadow:0 18px 40px rgba(8,21,47,.18)}
.tsw-p2 a.p2-ts-card:focus-visible{outline:3px solid var(--p2-navy);outline-offset:3px}
.tsw-p2 .p2-ts-card-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;transition:transform .55s cubic-bezier(.2,.6,.2,1)}
.tsw-p2 a.p2-ts-card:hover .p2-ts-card-img{transform:scale(1.05)}
/* Two stops, not one: the title sits about a third up the card, so the scrim
   has to be already dark there rather than only at the very bottom. */
.tsw-p2 .p2-ts-card-scrim{position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,.06) 0%,rgba(7,18,40,.34) 42%,
    rgba(7,18,40,.80) 72%,rgba(7,18,40,.93) 100%);
  transition:opacity .3s ease}
.tsw-p2 a.p2-ts-card:hover .p2-ts-card-scrim{opacity:1;
  background:linear-gradient(180deg,rgba(7,18,40,.16) 0%,rgba(7,18,40,.46) 42%,
    rgba(7,18,40,.86) 72%,rgba(7,18,40,.96) 100%)}

.tsw-p2 .p2-ts-card-body{position:absolute;inset:auto 0 0 0;z-index:2;
  display:grid;grid-template-columns:1fr auto;grid-template-areas:"icon icon" "text go";
  align-items:end;gap:14px;padding:22px}
.tsw-p2 .p2-ts-card-icon{grid-area:icon;justify-self:start;
  width:44px;height:44px;display:flex;align-items:center;justify-content:center;
  border-radius:50%;border:1px solid rgba(255,192,97,.55);
  background:rgba(8,21,47,.28);color:var(--p2-gold-light);margin-bottom:4px;
  backdrop-filter:blur(2px)}
.tsw-p2 .p2-ts-card-icon svg{width:21px;height:21px}
.tsw-p2 .p2-ts-card-text{grid-area:text;min-width:0}
.tsw-p2 h3.p2-ts-card-title{font-family:var(--p2-serif);font-weight:400;font-size:25px;
  line-height:1.14;letter-spacing:-.014em;color:#fff;margin:0 0 7px;text-wrap:balance}
/* Reserve two lines: the body is bottom-anchored, so a one-line description
   would float its title lower than a neighbour's and the row of titles would
   stop aligning. */
.tsw-p2 .p2-ts-card-desc{display:block;font-size:14px;line-height:1.45;
  min-height:2.9em;color:rgba(255,255,255,.90);text-wrap:pretty}
.tsw-p2 .p2-ts-card-go{grid-area:go;flex:0 0 auto;
  width:40px;height:40px;display:flex;align-items:center;justify-content:center;
  border-radius:50%;border:1px solid rgba(255,192,97,.62);color:var(--p2-gold-light);
  transition:background .26s ease,border-color .26s ease,color .26s ease}
.tsw-p2 .p2-ts-card-go svg{width:17px;height:17px}
.tsw-p2 a.p2-ts-card:hover .p2-ts-card-go{background:var(--p2-gold);
  border-color:var(--p2-gold);color:#fff}

/* ---- Editorial sign-off -------------------------------------------------- */
.tsw-p2 .p2-travel-styles-foot{display:flex;align-items:center;justify-content:center;
  gap:16px;margin:44px 0 0;color:var(--p2-line-warm)}
.tsw-p2 .p2-travel-styles-route{flex:1 1 auto;max-width:300px;height:24px;color:#CFC7B4}
.tsw-p2 .p2-travel-styles-route-r{transform:scaleY(-1)}
.tsw-p2 .p2-travel-styles-plane{width:20px;height:20px;flex:0 0 20px;color:#9FB0CE}
.tsw-p2 .p2-travel-styles-foot span{font-size:12px;letter-spacing:.2em;text-transform:uppercase;
  font-weight:600;color:var(--p2-body);white-space:nowrap}

@media(max-width:1199px){
  .tsw-p2 .p2-travel-styles-grid{grid-template-columns:repeat(2,1fr);gap:20px}
  .tsw-p2 a.p2-ts-card{aspect-ratio:16/11}
  .tsw-p2 h2.p2-travel-styles-h2{max-width:20ch}
}
@media(max-width:767px){
  .tsw-p2 .p2-travel-styles-grid{grid-template-columns:repeat(2,1fr);gap:12px}
  .tsw-p2 a.p2-ts-card{aspect-ratio:4/5}
  .tsw-p2 .p2-travel-styles-head{margin-bottom:28px}
  .tsw-p2 .p2-ts-card-body{padding:14px;gap:10px}
  .tsw-p2 .p2-ts-card-icon{width:34px;height:34px;margin-bottom:2px}
  .tsw-p2 .p2-ts-card-icon svg{width:17px;height:17px}
  .tsw-p2 h3.p2-ts-card-title{font-size:18px;margin-bottom:5px}
  .tsw-p2 .p2-ts-card-desc{font-size:12.5px;line-height:1.38;min-height:2.76em}
  .tsw-p2 .p2-ts-card-go{width:32px;height:32px}
  .tsw-p2 .p2-ts-card-go svg{width:14px;height:14px}
  .tsw-p2 .p2-travel-styles-foot{gap:10px;margin-top:30px}
  .tsw-p2 .p2-travel-styles-foot span{font-size:10.5px;letter-spacing:.14em;white-space:normal;text-align:center}
  .tsw-p2 .p2-travel-styles-route{max-width:70px}
}
@media(max-width:400px){
  .tsw-p2 .p2-ts-card-body{padding:12px}
  .tsw-p2 h3.p2-ts-card-title{font-size:16.5px}
  .tsw-p2 .p2-ts-card-desc{font-size:12px}
  .tsw-p2 .p2-travel-styles-route{display:none}
}
@media(prefers-reduced-motion:reduce){
  .tsw-p2 a.p2-ts-card,.tsw-p2 .p2-ts-card-img,
  .tsw-p2 .p2-ts-card-scrim,.tsw-p2 .p2-ts-card-go{transition:none}
  .tsw-p2 a.p2-ts-card:hover{transform:none;box-shadow:none}
  .tsw-p2 a.p2-ts-card:hover .p2-ts-card-img{transform:none}
}

/* ============================================================================
   TRAVEL JOURNAL  (.p2-bj-*)  -  homepage blog section
   ----------------------------------------------------------------------------
   A NEW, ISOLATED NAMESPACE. Every selector below is prefixed .tsw-p2 .p2-bj-
   so nothing here can reach Traveller Stories (.p2-vr-*), Google Reviews
   (.p2-gr-*), the FAQ, or the public /blog templates, which keep their own
   .card styling untouched. Only the shared design tokens and the shared
   .p2-sec / .p2-wrap / .p2-head / .p2-h2 / .p2-eyebrow / .p2-link primitives
   are reused - no primitive is redefined.

   The grid is auto-fit with a floor, so three published articles make three
   columns, two make two and one makes one WITHOUT a modifier class and without
   a stretched card - the section renders honestly at any count.
   ========================================================================== */
.tsw-p2 .p2-bj-head{margin-bottom:34px}

.tsw-p2 .p2-bj-grid{
  list-style:none;margin:0;padding:0;
  display:grid;gap:26px;
  grid-template-columns:repeat(auto-fit,minmax(290px,1fr));
}
/* One or two articles must not sprawl across the full 1320px wrap. */
.tsw-p2 .p2-bj-grid[data-tj-count="1"]{max-width:430px}
.tsw-p2 .p2-bj-grid[data-tj-count="2"]{max-width:880px}

.tsw-p2 .p2-bj-item{display:flex}

.tsw-p2 .p2-bj-card{
  position:relative;
  display:flex;flex-direction:column;width:100%;
  background:var(--p2-paper);
  border:1px solid var(--p2-line);
  border-radius:16px;overflow:hidden;
  transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease;
}
.tsw-p2 .p2-bj-card:hover{
  transform:translateY(-4px);
  border-color:var(--p2-line-warm);
  box-shadow:0 18px 40px -22px rgba(7,18,40,.28);
}
/* The focus ring belongs to the card, not just the small heading link. */
.tsw-p2 .p2-bj-card:focus-within{
  border-color:var(--p2-gold-soft);
  box-shadow:0 0 0 3px rgba(255,165,0,.28);
}

.tsw-p2 .p2-bj-media{position:relative;aspect-ratio:10/7;overflow:hidden;background:var(--p2-sand)}
.tsw-p2 .p2-bj-img{display:block;width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.tsw-p2 .p2-bj-card:hover .p2-bj-img{transform:scale(1.045)}
/* No cover image: a quiet tinted panel. Never a stock photograph pretending
   to be this article's own. */
.tsw-p2 .p2-bj-img-blank{
  background:linear-gradient(140deg,var(--p2-sand) 0%,var(--p2-ivory) 55%,#EFEADC 100%);
}
.tsw-p2 .p2-bj-card:hover .p2-bj-img-blank{transform:none}

.tsw-p2 .p2-bj-cat{
  position:absolute;left:12px;top:12px;
  display:inline-block;padding:5px 11px;border-radius:999px;
  background:rgba(251,250,248,.94);
  border:1px solid var(--p2-line-warm);
  color:#6B4E12;
  font-size:10.5px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;
}

.tsw-p2 .p2-bj-body{display:flex;flex-direction:column;flex:1;padding:20px 20px 18px}

.tsw-p2 h3.p2-bj-title{
  font-family:var(--p2-serif);font-weight:600;
  font-size:20px;line-height:1.28;letter-spacing:-.01em;
  margin:0 0 9px;color:var(--p2-navy);
}
.tsw-p2 .p2-bj-title a{color:inherit;text-decoration:none}
.tsw-p2 .p2-bj-title a::after{content:"";position:absolute;inset:0}
.tsw-p2 .p2-bj-title a:hover{color:var(--p2-ink)}
/* The stretched pseudo-element makes the whole card clickable, so the ring is
   drawn by :focus-within on the card above; suppress the doubled outline. */
.tsw-p2 .p2-bj-title a:focus-visible{outline:none}

.tsw-p2 .p2-bj-desc{
  margin:0 0 16px;color:var(--p2-body);
  font-size:14px;line-height:1.6;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}

.tsw-p2 .p2-bj-foot{
  margin-top:auto;padding-top:14px;border-top:1px solid var(--p2-line);
  display:flex;align-items:center;justify-content:space-between;gap:12px;
}
.tsw-p2 .p2-bj-date{color:var(--p2-body);font-size:12.5px;letter-spacing:.02em}
.tsw-p2 .p2-bj-go{
  display:inline-flex;align-items:center;gap:7px;
  color:#8A5F12;font-size:12px;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;
}
.tsw-p2 .p2-bj-go svg{width:15px;height:15px;transition:transform .28s ease}
.tsw-p2 .p2-bj-card:hover .p2-bj-go svg{transform:translateX(4px)}

@media(max-width:900px){
  .tsw-p2 .p2-bj-head{margin-bottom:26px}
  .tsw-p2 .p2-bj-grid{gap:20px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
}
@media(max-width:640px){
  .tsw-p2 .p2-bj-grid{grid-template-columns:1fr;gap:18px;max-width:none}
  .tsw-p2 .p2-bj-grid[data-tj-count="1"],
  .tsw-p2 .p2-bj-grid[data-tj-count="2"]{max-width:none}
  .tsw-p2 .p2-bj-media{aspect-ratio:16/10}
  .tsw-p2 .p2-bj-body{padding:17px 17px 15px}
  .tsw-p2 h3.p2-bj-title{font-size:18.5px}
  .tsw-p2 .p2-bj-desc{font-size:13.5px;-webkit-line-clamp:3}
}
@media(max-width:400px){
  .tsw-p2 .p2-bj-body{padding:15px}
  .tsw-p2 h3.p2-bj-title{font-size:17px}
  .tsw-p2 .p2-bj-go{font-size:11px;letter-spacing:.08em}
}
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-bj-card,.tsw-p2 .p2-bj-img,.tsw-p2 .p2-bj-go svg{transition:none}
  .tsw-p2 .p2-bj-card:hover{transform:none;box-shadow:none}
  .tsw-p2 .p2-bj-card:hover .p2-bj-img{transform:none}
  .tsw-p2 .p2-bj-card:hover .p2-bj-go svg{transform:none}
}

/* ============================================================================
   IN THE NEWS  (.p2-press-*)  -  compact press-coverage carousel
   ----------------------------------------------------------------------------
   A NEW, ISOLATED NAMESPACE. Every selector is prefixed .tsw-p2 .p2-press-, so
   nothing here reaches Traveller Stories (.p2-vr-*), Google Reviews (.p2-gr-*),
   Travel Journal (.p2-bj-*) or the FAQ. Only the shared tokens and the shared
   .p2-sec / .p2-wrap / .p2-h2 / .p2-eyebrow primitives are reused; none is
   redefined.

   THE POINT OF THIS SECTION IS THAT IT IS SMALL. It replaces a feature-plus-
   list layout with a 400px image and a 34px serif headline. Here the card is
   horizontal, the image is a fixed narrow column, and the type steps down -
   credibility does not need altitude.

   HOW THE PEEK WORKS, AND WHY IT AGREES WITH THE ENGINE
   ----------------------------------------------------
   The track carries padding-inline of --p2-press-peek and each item is
   flex-basis:100%, which resolves against the content box (rail width minus
   both paddings). So the lead card sits exactly between the paddings and its
   neighbours show through by the peek, less the gap.

   The shared carousel engine scrolls to i * stride, where stride is one card
   plus one gap. Item i's offsetLeft is peek + i * stride, so after that scroll
   the card lands at exactly `peek` from the left every time. scroll-padding-
   inline matches the peek so CSS snapping agrees with the engine instead of
   fighting it and yanking the card flush to the edge.
   ========================================================================== */
/* A scoped padding step-down. .p2-sec's shared 100px is left alone - every
   other section still gets it - but a media strip earns less altitude than a
   destination showcase, and this is where the section's compactness is won. */
.tsw-p2 .p2-press{--p2-press-peek:64px;--p2-press-gap:22px;padding:76px 0}
/* Centred, unlike the left-aligned heads elsewhere on this page, because the
   rail below is capped and centred - left-aligning the copy over a centred
   card left the two visibly out of register. Centring is also the pattern a
   press strip normally takes: it reads as one editorial unit rather than as a
   column of content with something floating beside it. */
.tsw-p2 .p2-press-head{max-width:620px;margin:0 auto 28px;text-align:center}
.tsw-p2 .p2-press-head .p2-eyebrow{justify-content:center}
.tsw-p2 h2.p2-press-h2{margin:0}
.tsw-p2 .p2-press-lede{margin:12px auto 0;max-width:48ch}

.tsw-p2 .p2-press-rail{position:relative;max-width:1000px;margin-inline:auto}

.tsw-p2 ul.p2-press-track{
  list-style:none;margin:0;display:flex;gap:var(--p2-press-gap);
  padding:2px var(--p2-press-peek) 6px;
  scroll-padding-inline:var(--p2-press-peek);
  overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;
  scrollbar-width:none;-ms-overflow-style:none;align-items:stretch;
}
.tsw-p2 ul.p2-press-track::-webkit-scrollbar{display:none}
.tsw-p2 .p2-press-item{flex:0 0 100%;min-width:0;scroll-snap-align:start;display:flex}

/* One published item: no rail, no peek, no snapping - a plain centred card. */
.tsw-p2 .p2-press-rail.is-solo ul.p2-press-track{
  padding-inline:0;overflow:visible;scroll-snap-type:none;
  max-width:820px;margin-inline:auto;
}

/* ---- The card ------------------------------------------------------------ *
   Horizontal: a narrow image column beside the words. Hairline border on
   paper, soft radius, no drop shadow. A card with no image simply loses the
   first column rather than showing an empty frame. */
.tsw-p2 .p2-press-card{
  flex:1;display:grid;grid-template-columns:236px minmax(0,1fr);
  background:var(--p2-paper);border:1px solid var(--p2-line);
  border-radius:14px;overflow:hidden;
  transition:border-color .25s ease,box-shadow .25s ease;
}
.tsw-p2 .p2-press-card.is-textonly{grid-template-columns:minmax(0,1fr)}
.tsw-p2 .p2-press-card:hover{border-color:var(--p2-line-warm);box-shadow:0 14px 32px -24px rgba(7,18,40,.3)}
.tsw-p2 .p2-press-card:focus-within{border-color:var(--p2-gold-soft);box-shadow:0 0 0 3px rgba(255,165,0,.28)}

/* The picture is absolutely positioned inside its cell ON PURPOSE. Left in
   normal flow it contributes its own intrinsic height to the grid row, and the
   row then grows to the photograph rather than to the words - measured at
   1440px, that alone made the card 356px tall when its text needed 200. Out of
   flow it contributes nothing, the row is sized by the body, and object-fit
   covers whatever height that turns out to be without distorting the image. */
.tsw-p2 .p2-press-media{position:relative;background:var(--p2-sand);overflow:hidden;min-height:170px}
.tsw-p2 .p2-press-media img{
  position:absolute;inset:0;display:block;width:100%;height:100%;
  object-fit:cover;object-position:center;
}

.tsw-p2 .p2-press-body{display:flex;flex-direction:column;padding:22px 26px 20px;min-width:0}

/* ---- Publication line ---------------------------------------------------- *
   The masthead is secondary to the headline by design: capped height, muted
   until hover. A publication with no logo gets a typographic treatment in the
   same slot so both look deliberate rather than one looking unfinished. */
.tsw-p2 .p2-press-top{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding-bottom:12px;margin-bottom:13px;border-bottom:1px solid var(--p2-line);
}
.tsw-p2 .p2-press-logo{display:inline-flex;align-items:center}
.tsw-p2 .p2-press-logo img{
  display:block;max-height:22px;max-width:132px;width:auto;height:auto;
  object-fit:contain;opacity:.82;transition:opacity .25s ease;
}
.tsw-p2 .p2-press-card:hover .p2-press-logo img{opacity:1}
.tsw-p2 .p2-press-pub{
  font-size:11px;font-weight:800;letter-spacing:.17em;text-transform:uppercase;
  color:#6B4E12;
}
.tsw-p2 .p2-press-date{margin-left:auto;font-size:12px;color:var(--p2-body);white-space:nowrap}
/* Name for assistive tech where the logo carries the branding visually. */
.tsw-p2 .p2-press-sr{position:absolute;width:1px;height:1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap}

.tsw-p2 h3.p2-press-title{
  font-family:var(--p2-serif);font-weight:600;
  font-size:21px;line-height:1.3;letter-spacing:-.01em;
  margin:0 0 9px;color:var(--p2-navy);
}
.tsw-p2 .p2-press-title a{color:inherit;text-decoration:none}
.tsw-p2 .p2-press-title a::after{content:"";position:absolute;inset:0}
.tsw-p2 .p2-press-card{position:relative}
.tsw-p2 .p2-press-title a:hover{color:var(--p2-ink)}
/* The stretched link makes the whole card clickable, so :focus-within above
   draws the ring; suppress the doubled outline on the anchor itself. */
.tsw-p2 .p2-press-title a:focus-visible{outline:none}

.tsw-p2 .p2-press-excerpt{
  margin:0 0 14px;color:var(--p2-body);font-size:14px;line-height:1.6;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.tsw-p2 .p2-press-go{
  margin-top:auto;display:inline-flex;align-items:center;gap:7px;
  color:#8A5F12;font-size:11.5px;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;
}
.tsw-p2 .p2-press-go svg{width:15px;height:15px;transition:transform .28s ease}
.tsw-p2 .p2-press-card:hover .p2-press-go svg{transform:translateX(4px)}

/* ---- Controls ------------------------------------------------------------ *
   Minimal and subtle: two arrows and small dots, nothing else. No autoplay,
   so no pause control is needed or drawn. */
.tsw-p2 .p2-press-bar{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:22px}
.tsw-p2 .p2-press-bar[hidden]{display:none}
.tsw-p2 button.p2-press-nav{
  width:40px;height:40px;flex:0 0 40px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  background:transparent;border:1px solid var(--p2-line-warm);color:var(--p2-navy);
  cursor:pointer;transition:background .25s ease,border-color .25s ease,color .25s ease;
}
.tsw-p2 button.p2-press-nav svg{width:17px;height:17px}
.tsw-p2 button.p2-press-nav:hover:not(:disabled){background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}
.tsw-p2 button.p2-press-nav:disabled{opacity:.32;cursor:default}
.tsw-p2 button.p2-press-nav:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
.tsw-p2 .p2-press-dots{display:flex;justify-content:center;gap:9px}
.tsw-p2 .p2-press-dots[hidden]{display:none}
.tsw-p2 button.p2-press-dot{
  width:8px;height:8px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:#C9C4B8;transition:background .25s ease,transform .25s ease;
}
.tsw-p2 button.p2-press-dot[aria-current="true"]{background:var(--p2-gold);transform:scale(1.25)}
.tsw-p2 button.p2-press-dot:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Responsive ---------------------------------------------------------- */
@media(max-width:1100px){
  .tsw-p2 .p2-press{--p2-press-peek:44px;padding:68px 0}
  .tsw-p2 .p2-press-card{grid-template-columns:200px minmax(0,1fr)}
  .tsw-p2 .p2-press-body{padding:20px 22px 18px}
}
@media(max-width:900px){
  /* One card at a time from here down: a peek this narrow reads as a glitch
     rather than as an affordance. */
  .tsw-p2 .p2-press{--p2-press-peek:0px;--p2-press-gap:16px;padding:60px 0}
  .tsw-p2 .p2-press-head{margin-bottom:22px}
  .tsw-p2 .p2-press-card{grid-template-columns:168px minmax(0,1fr)}
  .tsw-p2 .p2-press-media{min-height:150px}
  .tsw-p2 h3.p2-press-title{font-size:19px}
}
@media(max-width:640px){
  /* The image narrows to a magazine-style thumbnail rather than becoming a
     full-width banner. Measured at 390px: a 16/9 banner added 200px of height
     to a card whose words needed 165, and the section ended up TALLER on a
     phone than the oversized layout it replaced. A 118px column costs nothing
     vertically, and object-fit still crops without distorting. */
  .tsw-p2 .p2-press-card{grid-template-columns:118px minmax(0,1fr)}
  .tsw-p2 .p2-press-media{min-height:0}
  .tsw-p2 .p2-press-body{padding:16px 17px 15px}
  .tsw-p2 .p2-press-top{padding-bottom:10px;margin-bottom:11px;gap:8px}
  .tsw-p2 .p2-press-logo img{max-height:19px;max-width:104px}
  .tsw-p2 h3.p2-press-title{font-size:17px}
  .tsw-p2 .p2-press-excerpt{font-size:13.5px;-webkit-line-clamp:3;margin-bottom:12px}
  .tsw-p2 .p2-press-bar{gap:14px;margin-top:18px}
  .tsw-p2 button.p2-press-nav{width:38px;height:38px;flex:0 0 38px}
  /* An 8px dot is a fine mark and a poor target. The pseudo-element gives each
     one a 24x24 tap area without changing what is drawn; the gap widens to 16
     so the pitch is 24 and neighbouring targets meet without overlapping. */
  .tsw-p2 .p2-press-dots{gap:20px}
  .tsw-p2 button.p2-press-dot{position:relative}
  .tsw-p2 button.p2-press-dot::before{content:"";position:absolute;inset:-8px}
}
@media(max-width:430px){
  /* The date drops under the masthead rather than being squeezed beside it. */
  .tsw-p2 .p2-press-card{grid-template-columns:96px minmax(0,1fr)}
  .tsw-p2 .p2-press-top{gap:4px 10px}
  .tsw-p2 .p2-press-date{margin-left:0;flex-basis:100%}
  .tsw-p2 h3.p2-press-title{font-size:16.5px}
  .tsw-p2 .p2-press-excerpt{-webkit-line-clamp:2}
}
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-press-card,.tsw-p2 .p2-press-go svg,
  .tsw-p2 .p2-press-logo img,.tsw-p2 button.p2-press-nav,.tsw-p2 button.p2-press-dot{transition:none}
  .tsw-p2 .p2-press-card:hover .p2-press-go svg{transform:none}
  .tsw-p2 ul.p2-press-track{scroll-behavior:auto}
}

/* ============================================================================
   TRUSTED TRAVEL PARTNERS  (.p2-plogo*)  -  minimal logo rail
   ----------------------------------------------------------------------------
   Replaces the grouped wordmark rail. Marks only: no cards, no shadows, no
   borders around a logo, no arrows and no dots. A trust strip earns its place
   by being quiet, so everything that is not a logo is small or absent.

   LOGOS ONLY
   ----------
   There is no type in this rail. A partner whose artwork does not resolve is
   dropped before the markup is built, so there is no text-fallback state to
   style and every box below holds an <img>.

   CONSISTENT AREA, WHATEVER THE ARTWORK
   -------------------------------------
   Logos arrive at every conceivable size and aspect. Each one is given the
   same fixed box and told to fit inside it with object-fit:contain, so a wide
   wordmark and a square badge occupy the same visual weight and sit on the
   same centre line. Nothing is stretched and nothing is cropped.

   HOW MANY ARE VISIBLE
   --------------------
   --p2-pl-per is the only number that changes across breakpoints: six across
   on desktop, four on tablet, two and a half on a phone - the half is
   deliberate, because a partial logo at the edge is what tells a thumb the row
   scrolls.
   ========================================================================== */
.tsw-p2 .p2-plogos{--p2-pl-per:6;--p2-pl-gap:28px;position:relative}

.tsw-p2 ul.p2-plogos-track{
  list-style:none;margin:0;padding:0;
  display:flex;align-items:center;gap:var(--p2-pl-gap);
  overflow-x:auto;overscroll-behavior-x:contain;
  scrollbar-width:none;-ms-overflow-style:none;
}
.tsw-p2 ul.p2-plogos-track::-webkit-scrollbar{display:none}

/* Too few logos to fill the rail: centre them instead of leaving the row
   hugging the left edge with a wide gap beside it. The rail only gains
   .is-live once JavaScript has cloned the row for looping. */
.tsw-p2 .p2-plogos:not(.is-live) ul.p2-plogos-track{justify-content:center;flex-wrap:wrap;row-gap:18px}

.tsw-p2 .p2-plogo{
  flex:0 0 calc((100% - var(--p2-pl-gap) * (var(--p2-pl-per) - 1)) / var(--p2-pl-per));
  min-width:0;display:flex;align-items:center;justify-content:center;
  height:64px;
}
.tsw-p2 .p2-plogo-link{display:flex;align-items:center;justify-content:center;width:100%;height:100%}

/* Muted by default so the row reads as one quiet band rather than a wall of
   competing brand colours; full colour on hover, which is also the only
   feedback a logo needs. */
.tsw-p2 .p2-plogo img{
  display:block;max-height:34px;max-width:100%;width:auto;height:auto;
  object-fit:contain;
  filter:grayscale(1);opacity:.55;
  transition:filter .3s ease,opacity .3s ease;
}
.tsw-p2 .p2-plogo-link:hover img,
.tsw-p2 .p2-plogo-link:focus-visible img{filter:grayscale(0);opacity:1}
.tsw-p2 .p2-plogo-link:focus-visible{outline:2px solid var(--p2-gold);outline-offset:4px;border-radius:4px}

@media(max-width:1024px){
  .tsw-p2 .p2-plogos{--p2-pl-per:4;--p2-pl-gap:24px}
  .tsw-p2 .p2-plogo{height:58px}
  .tsw-p2 .p2-plogo img{max-height:30px}
}
@media(max-width:640px){
  .tsw-p2 .p2-plogos{--p2-pl-per:2.5;--p2-pl-gap:18px}
  .tsw-p2 .p2-plogo{height:52px}
  .tsw-p2 .p2-plogo img{max-height:27px}
  /* A wrapped, centred row of two on a phone reads better than one long line. */
  .tsw-p2 .p2-plogos:not(.is-live) .p2-plogo{flex-basis:calc((100% - var(--p2-pl-gap)) / 2)}
}
@media(prefers-reduced-motion:reduce){
  /* The rail never steps for these users - initPartnerRail() does not even
     clone the row - so smooth scrolling is switched off with it. */
  .tsw-p2 ul.p2-plogos-track{scroll-behavior:auto}
  .tsw-p2 .p2-plogo img{transition:none}
}


/* ============================================================================
   CAREERS  (.p2-job-*)  -  the public /careers pages
   ----------------------------------------------------------------------------
   Careers opts into the Phase 2 system the same way the homepage and the
   travel pages do: one .tsw-p2 wrapper, then .p2-wrap, .p2-sec, .p2-eyebrow,
   .p2-h2, .p2-lede and .p2-btn do the work. NO new tokens, NO new fonts, NO
   second design system - every colour, face and rhythm below is read from the
   variables the homepage already defines.

   What .p2-job-* adds is only what Careers genuinely has and no other page
   does: a role card, a metadata row and a form shell. Each inner page in this
   codebase carries a small namespace of its own for the same reason (.tx-* on
   the travel pages, .p2-ts-* on travel styles); this is that convention, not
   a departure from it.

   The hero deliberately mirrors .tx-hero - ivory ground, hairline base, light
   Newsreader headline - so an inner Careers page and an inner travel page read
   as the same website rather than as two templates.
   ========================================================================== */

/* ---- Hero --------------------------------------------------------------- */
.tsw-p2 .p2-job-hero{
  background:var(--p2-ivory);
  border-bottom:1px solid var(--p2-line);
  padding:88px 0 76px;
}
.tsw-p2 .p2-job-hero-inner{max-width:820px}
.tsw-p2 .p2-job-hero .p2-eyebrow{margin-bottom:18px}
/* Scoped under .tsw-p2 so it outranks the namespace's own heading rules;
   unscoped it loses to them and renders bold instead of the light Newsreader
   every other Phase 2 headline uses. */
.tsw-p2 .p2-job-h1{
  font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(38px,5.2vw,62px);line-height:1.04;letter-spacing:-.02em;
  color:var(--p2-navy);margin:0 0 20px;text-wrap:balance;
}
/* --p2-body, not --p2-muted, and it is what the shared .p2-lede primitive
   already uses. (When this was written --p2-muted was #8A93A2 and measured
   3.10:1 here, under the 4.5:1 AA needs for text this size. The brand pass has
   since moved --p2-muted to #636D7C, which clears AA on every light ground the
   site uses, so either would now be legible; --p2-body stays for consistency
   with the primitive.) */
.tsw-p2 .p2-job-lede{
  font-size:17px;line-height:1.72;color:var(--p2-body);
  max-width:620px;margin:0;text-wrap:pretty;
}

/* Role metadata: type, location, experience. A real <ul>, so it is a list to a
   screen reader; the bullet is drawn between items rather than before them. */
.tsw-p2 .p2-job-meta{
  list-style:none;margin:0 0 30px;padding:0;
  display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;
  font-size:14.5px;color:var(--p2-body);
}
.tsw-p2 .p2-job-meta li{display:flex;align-items:center;gap:16px}
.tsw-p2 .p2-job-meta li + li::before{
  content:"";width:3px;height:3px;border-radius:50%;
  background:var(--p2-gold);flex:0 0 3px;margin-left:-8px;
}
.tsw-p2 .p2-job-hero-cta{margin-top:2px}

/* Flash messages sit in the page gutter, not against the viewport edge. */
.tsw-p2 .p2-job-flash{padding-top:22px}
.tsw-p2 .p2-job-flash .alert{margin:0 0 10px}

/* ---- Role body: an editorial reading column ----------------------------- */
.tsw-p2 .p2-job-article{max-width:760px}
.tsw-p2 .p2-job-prose{
  font-size:17px;line-height:1.78;color:var(--p2-body);
  margin:0 0 8px;text-wrap:pretty;
}
.tsw-p2 h2.p2-job-h2{
  font-family:var(--p2-serif);font-weight:300;font-size:29px;line-height:1.2;
  letter-spacing:-.015em;color:var(--p2-navy);margin:38px 0 16px;
}
.tsw-p2 .p2-job-list{
  list-style:none;margin:0;padding:0;display:grid;gap:12px;
  font-size:16.5px;line-height:1.7;color:var(--p2-body);
}
.tsw-p2 .p2-job-list li{position:relative;padding-left:26px}
/* A gold hairline rather than a disc - the same restraint the rest of the
   Phase 2 pages use for list marks. */
.tsw-p2 .p2-job-list li::before{
  content:"";position:absolute;left:0;top:.72em;
  width:12px;height:1px;background:var(--p2-gold);
}
.tsw-p2 .p2-job-qual{
  margin:34px 0 0;padding:18px 22px;border-left:2px solid var(--p2-gold);
  background:var(--p2-paper);font-size:16px;line-height:1.65;color:var(--p2-body);
}
.tsw-p2 .p2-job-qual span{
  display:block;font-size:11.5px;letter-spacing:.18em;text-transform:uppercase;
  color:var(--p2-gold);font-weight:600;margin-bottom:6px;
}
.tsw-p2 .p2-job-cta{margin-top:40px}

/* ---- Role cards: ONE component, used on both pages ---------------------- */
.tsw-p2 .p2-job-grid{
  display:grid;gap:24px;
  grid-template-columns:repeat(3,minmax(0,1fr));
}
/* One or two roles must not stretch into a full-width slab. They are given a
   deliberate width instead, so a small list still looks composed. */
.tsw-p2 .p2-job-grid.is-one{grid-template-columns:minmax(0,600px)}
.tsw-p2 .p2-job-grid.is-two{grid-template-columns:repeat(2,minmax(0,1fr));max-width:900px}

.tsw-p2 .p2-job-card{
  position:relative;
  display:flex;flex-direction:column;gap:12px;
  background:var(--p2-paper);
  border:1px solid var(--p2-line);
  border-radius:16px;
  padding:30px 30px 28px;
  transition:transform .28s ease,box-shadow .28s ease,border-color .28s ease;
}
.tsw-p2 .p2-job-card:hover{
  transform:translateY(-4px);
  border-color:var(--p2-line-warm);
  box-shadow:0 18px 40px -22px rgba(7,18,40,.28);
}
/* The ring belongs to the card, not to the small heading link inside it. */
.tsw-p2 .p2-job-card:focus-within{
  border-color:var(--p2-gold-soft);
  box-shadow:0 0 0 3px rgba(255,165,0,.28);
}
.tsw-p2 .p2-job-card-t{
  font-family:var(--p2-serif);font-weight:300;font-size:23px;line-height:1.24;
  letter-spacing:-.012em;color:var(--p2-navy);margin:0;
}
.tsw-p2 .p2-job-card-t a{color:inherit;text-decoration:none}
.tsw-p2 .p2-job-card-t a:focus-visible{outline:none}
/* One link covers the whole card, so the card is a comfortable tap target
   while the accessibility tree still sees a single link named after the role. */
.tsw-p2 .p2-job-card-t a::after{content:"";position:absolute;inset:0;border-radius:16px}
.tsw-p2 .p2-job-card-meta{
  list-style:none;margin:0;padding:0;
  display:flex;flex-wrap:wrap;gap:6px 14px;
  font-size:13.5px;color:var(--p2-body);   /* AA at 13.5px; see note above */
}
.tsw-p2 .p2-job-card-meta li{display:flex;align-items:center;gap:14px}
.tsw-p2 .p2-job-card-meta li + li::before{
  content:"";width:3px;height:3px;border-radius:50%;
  background:var(--p2-line-warm);flex:0 0 3px;margin-left:-14px;
}
.tsw-p2 .p2-job-card-sum{
  margin:0;font-size:15.5px;line-height:1.65;color:var(--p2-body);text-wrap:pretty;
}
.tsw-p2 .p2-job-card-cta{
  margin-top:auto;padding-top:6px;
  display:inline-flex;align-items:center;gap:9px;
  font-size:14px;font-weight:600;color:var(--p2-navy);
  transition:color .18s ease,gap .18s ease;
}
.tsw-p2 .p2-job-card-cta svg{width:15px;height:15px;flex:0 0 15px}
.tsw-p2 .p2-job-card:hover .p2-job-card-cta{color:var(--p2-blue);gap:13px}

/* ---- Empty state -------------------------------------------------------- */
.tsw-p2 .p2-job-empty{
  border:1px dashed var(--p2-line-warm);border-radius:16px;
  background:var(--p2-paper);
  padding:52px 32px;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:18px;
}
.tsw-p2 .p2-job-empty p{
  margin:0;font-size:16.5px;line-height:1.68;color:var(--p2-body);max-width:46ch;
}

/* ---- Application form --------------------------------------------------- */
.tsw-p2 .p2-job-apply-head{max-width:620px;margin:0 0 38px}
.tsw-p2 .p2-job-apply-head .p2-h2{margin-bottom:14px}
.tsw-p2 .p2-job-form-card{
  max-width:760px;
  background:#fff;
  border:1px solid var(--p2-line);
  border-radius:16px;
  padding:40px;
}
.tsw-p2 .p2-sec-ivory .p2-job-form-card{background:#fff}
.tsw-p2 .p2-job-form{display:grid;gap:22px}
.tsw-p2 .p2-job-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:22px}
.tsw-p2 .p2-job-field{display:grid;gap:8px;min-width:0}
.tsw-p2 .p2-job-field label{
  font-size:13.5px;font-weight:600;letter-spacing:.01em;color:var(--p2-navy);
}
.tsw-p2 .p2-job-req{color:var(--p2-gold);font-weight:700}
.tsw-p2 .p2-job-field input,
.tsw-p2 .p2-job-field select,
.tsw-p2 .p2-job-field textarea{
  width:100%;max-width:100%;box-sizing:border-box;
  font-family:inherit;font-size:15.5px;color:var(--p2-ink);
  background:#fff;border:1px solid var(--p2-line);border-radius:6px;
  padding:0 14px;height:52px;
  transition:border-color .18s ease,box-shadow .18s ease;
}
.tsw-p2 .p2-job-field textarea{height:auto;min-height:150px;padding:14px;line-height:1.6;resize:vertical}
.tsw-p2 .p2-job-field input::placeholder,
.tsw-p2 .p2-job-field textarea::placeholder{color:var(--p2-body);opacity:.75}
/* A native select keeps its own control; only the chrome is restated so it
   matches the text inputs beside it. */
.tsw-p2 .p2-job-field select{appearance:none;-webkit-appearance:none;padding-right:42px;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235A6472' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat:no-repeat;background-position:right 14px center;background-size:16px}
/* The file control is the one input a browser will not style; it is given the
   same box as its neighbours and its button restated to match. */
.tsw-p2 .p2-job-field input[type="file"]{
  height:auto;padding:13px 14px;line-height:1.4;
  border-style:dashed;background:var(--p2-paper);
}
.tsw-p2 .p2-job-field input[type="file"]::file-selector-button{
  font-family:inherit;font-size:14px;font-weight:600;
  color:var(--p2-navy);background:#fff;
  border:1px solid var(--p2-line);border-radius:5px;
  padding:8px 16px;margin-right:14px;cursor:pointer;
  transition:border-color .18s ease,color .18s ease;
}
.tsw-p2 .p2-job-field input[type="file"]:hover::file-selector-button{
  border-color:var(--p2-navy);color:var(--p2-navy);
}
.tsw-p2 .p2-job-field input:focus,
.tsw-p2 .p2-job-field select:focus,
.tsw-p2 .p2-job-field textarea:focus{outline:none;border-color:var(--p2-gold-soft)}
.tsw-p2 .p2-job-field input:focus-visible,
.tsw-p2 .p2-job-field select:focus-visible,
.tsw-p2 .p2-job-field textarea:focus-visible,
.tsw-p2 .p2-job-form button:focus-visible,
.tsw-p2 .p2-job-card-t a:focus-visible{
  outline:2px solid var(--p2-gold);outline-offset:2px;
}
.tsw-p2 .p2-job-help{font-size:13px;line-height:1.5;color:var(--p2-body)}
.tsw-p2 .p2-job-actions{
  display:flex;align-items:center;gap:20px;flex-wrap:wrap;
  margin-top:4px;padding-top:24px;border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-job-note{margin:0;font-size:13px;line-height:1.5;color:var(--p2-body);max-width:34ch}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-job-hero{padding:64px 0 56px}
  .tsw-p2 .p2-job-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
  .tsw-p2 .p2-job-grid.is-one{grid-template-columns:minmax(0,520px)}
  .tsw-p2 .p2-job-form-card{padding:32px}
}

/* ---- Mobile ------------------------------------------------------------- */
@media(max-width:767px){
  .tsw-p2 .p2-job-hero{padding:44px 0 40px}
  .tsw-p2 .p2-job-lede{font-size:15.5px}
  .tsw-p2 .p2-job-meta{font-size:13.5px;margin-bottom:24px}
  .tsw-p2 .p2-job-hero-cta{width:100%}
  .tsw-p2 .p2-job-grid,
  .tsw-p2 .p2-job-grid.is-one,
  .tsw-p2 .p2-job-grid.is-two{grid-template-columns:minmax(0,1fr);max-width:none;gap:16px}
  .tsw-p2 .p2-job-card{padding:24px 22px 22px;border-radius:14px}
  .tsw-p2 .p2-job-card-t{font-size:20px}
  .tsw-p2 .p2-job-prose,
  .tsw-p2 .p2-job-list{font-size:15.5px}
  .tsw-p2 h2.p2-job-h2{font-size:24px;margin-top:30px}
  .tsw-p2 .p2-job-empty{padding:38px 22px;border-radius:14px}
  .tsw-p2 .p2-job-form-card{padding:24px 20px;border-radius:14px}
  .tsw-p2 .p2-job-row{grid-template-columns:minmax(0,1fr);gap:20px}
  /* 52px already clears the 44px tap-target minimum; kept explicit so a future
     change to the desktop height cannot quietly drop below it on a phone. */
  .tsw-p2 .p2-job-field input,
  .tsw-p2 .p2-job-field select{height:52px;font-size:16px}
  .tsw-p2 .p2-job-field textarea{font-size:16px}
  .tsw-p2 .p2-job-actions{flex-direction:column;align-items:stretch;gap:14px}
  .tsw-p2 .p2-job-actions .p2-btn{width:100%}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-job-card{transition:none}
  .tsw-p2 .p2-job-card:hover{transform:none}
  .tsw-p2 .p2-job-card:hover .p2-job-card-cta{gap:9px}
}

/* ============================================================================
   FOOTER  (.tsw-foot)  -  the final section of the Phase 2 page
   ----------------------------------------------------------------------------
   The footer's original rules live in the frozen Phase 1 block near the top of
   this file and are NOT edited. Everything here is additive and scoped to
   .tsw-foot, which the partial adds alongside .tsw-footer; where the two
   disagree the two-class selector wins on specificity. The markup also uses
   new foot-* class names, so the old .footer-grid / .footer-social /
   .footer-contact / .newsletter / .brand rules match nothing at all and there
   is no !important anywhere below.

   The <footer> also carries .tsw-p2, which brings the homepage's tokens into
   scope. Every .tsw-p2 rule in this stylesheet requires a p2-* class, so
   nothing else leaks in - only the variables and the .p2-wrap container, which
   is what puts the footer's edges on the same 1320px measure as the sections
   above it.
   ========================================================================== */
.tsw-foot{
  background:var(--p2-ink);
  color:rgba(255,255,255,.62);
  padding:88px 0 26px;
  /* The frozen rule sets 64px 0 28px on .tsw-footer; this replaces it. */
}

/* ---- Grid --------------------------------------------------------------- *
   Brand takes the wide column because it carries the mark, a paragraph and the
   social row; the two link columns are narrow because a list of five words
   does not need 300px; contact is wide again because it holds an address and
   the newsletter. The result is a footer that fills the measure instead of
   leaving a corridor of empty space in the middle. */
.tsw-foot .foot-grid{
  display:grid;
  grid-template-columns:1.7fr .9fr .9fr 1.5fr;
  gap:32px 48px;
  align-items:start;
}

/* ---- Brand -------------------------------------------------------------- */
.tsw-foot .foot-brand{max-width:340px}
/* The mark is dark blue and gold on transparency. brightness(0) crushes it to
   black and invert(1) lifts that to pure white, so it reads on the navy
   without the white plate it used to sit on - and without touching the file
   on disk. */
.tsw-foot .foot-logo{
  display:block;height:38px;width:auto;margin:0 0 20px;
  background:none;padding:0;border-radius:0;opacity:.94;
}
/* The footer used to whiten the logo with brightness(0) invert(1), which made
   it legible on the dark ground but flattened the orange airplane away with
   everything else - and the orange is a constant of the mark, not a decoration.
   The reversed artwork keeps it, so the filter is no longer applied here.
   It survives for one case only: a logo an administrator uploaded themselves,
   which has no reversed counterpart to reach for. See _brand_logo.php. */
.tsw-foot .foot-logo.is-tinted{filter:brightness(0) invert(1)}
.tsw-foot .foot-about{
  margin:0;font-size:14.5px;line-height:1.7;
  color:rgba(255,255,255,.58);max-width:34ch;text-wrap:pretty;
}

/* ---- Social ------------------------------------------------------------- *
   A quiet row of hairline squares rather than filled circles, so they read as
   part of the footer's type rather than as three floating buttons. */
.tsw-foot .foot-social{
  list-style:none;display:flex;gap:10px;margin:24px 0 0;padding:0;
}
.tsw-foot .foot-social a{
  display:inline-flex;align-items:center;justify-content:center;
  width:38px;height:38px;padding:0;border-radius:8px;
  border:1px solid rgba(255,255,255,.14);
  color:rgba(255,255,255,.72);background:none;
  transition:border-color .2s ease,color .2s ease,background .2s ease;
}
.tsw-foot .foot-social a:hover{
  border-color:var(--p2-gold);color:var(--p2-gold-light);background:rgba(255,165,0,.1);
}
.tsw-foot .foot-social svg{width:17px;height:17px}

/* ---- Column headings ---------------------------------------------------- *
   The eyebrow treatment the homepage uses for its section labels: small,
   letterspaced, upper-case, gold. This is the only place gold appears at rest,
   which is what keeps it an accent. */
/* Class-only, not `h4.foot-h`: these are h2 now (an h4 straight after the
   page's h2 content sections was a heading-level skip on every public page).
   Two classes still outrank `.tsw h2`, so the label keeps its own size and
   weight rather than picking up the page-heading clamp. */
.tsw-foot .foot-h{
  margin:0 0 18px;
  font-family:inherit;font-size:11.5px;font-weight:600;
  letter-spacing:.2em;text-transform:uppercase;
  color:var(--p2-gold-light);
}

/* ---- Link columns ------------------------------------------------------- */
.tsw-foot .foot-links{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.tsw-foot .foot-links a,
.tsw-foot .foot-contact a{
  display:inline-block;padding:5px 0;
  font-size:14.5px;line-height:1.5;
  color:rgba(255,255,255,.66);
  transition:color .18s ease;
}
.tsw-foot .foot-links a:hover,
.tsw-foot .foot-contact a:hover{color:#fff}

/* ---- Contact ------------------------------------------------------------ *
   A two-column grid per row rather than a flex gap, so the icon column is a
   fixed width and phone, email and address start on exactly the same x. */
.tsw-foot .foot-contact{list-style:none;margin:0;padding:0;display:grid;gap:12px}
.tsw-foot .foot-contact li{
  display:grid;grid-template-columns:18px 1fr;gap:12px;align-items:start;
  font-size:14.5px;line-height:1.6;color:rgba(255,255,255,.66);
}
.tsw-foot .foot-contact svg{width:16px;height:16px;margin-top:4px;color:var(--p2-gold);opacity:.85}
.tsw-foot .foot-contact a{padding:0}
.tsw-foot .foot-contact li > span{padding-top:1px;text-wrap:pretty}

/* ---- Newsletter --------------------------------------------------------- *
   Given a small label of its own and a hairline rule above, so it reads as the
   last item in the Get in touch column rather than as a stray form. */
.tsw-foot .foot-news{margin-top:28px;padding-top:24px;border-top:1px solid rgba(255,255,255,.1)}
.tsw-foot .foot-news-kick{
  margin:0 0 12px;font-size:12px;letter-spacing:.12em;text-transform:uppercase;
  color:rgba(255,255,255,.5);
}
.tsw-foot .foot-news-row{display:flex;gap:8px;align-items:stretch}
.tsw-foot .foot-news input{
  flex:1 1 auto;min-width:0;
  height:46px;padding:0 14px;
  font-family:inherit;font-size:14.5px;color:#fff;
  background:rgba(255,255,255,.05);
  border:1px solid rgba(255,255,255,.16);border-radius:6px;
  transition:border-color .18s ease,background .18s ease;
}
/* .42 measured 4.00:1 against the field, under AA's 4.5 for text this size.
   .58 measures 5.9:1 and still reads as placeholder rather than as a value. */
.tsw-foot .foot-news input::placeholder{color:rgba(255,255,255,.58)}
.tsw-foot .foot-news input:hover{border-color:rgba(255,255,255,.26)}
.tsw-foot .foot-news input:focus{outline:none;border-color:var(--p2-gold);background:rgba(255,255,255,.08)}
.tsw-foot .foot-news button{
  flex:0 0 auto;height:46px;padding:0 22px;
  font-family:inherit;font-size:14.5px;font-weight:600;line-height:1;
  color:var(--p2-ink);background:var(--p2-gold-light);
  border:1px solid var(--p2-gold-light);border-radius:6px;cursor:pointer;
  transition:background .18s ease,border-color .18s ease;
}
.tsw-foot .foot-news button:hover{background:#fff;border-color:#fff}

/* Visually hidden but available to a screen reader. */
.tsw-foot .foot-sr{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* ---- Bottom row --------------------------------------------------------- *
   THE FROZEN .tsw-footer a RULE SETS display:block, WHICH IS WHY THE TWO LEGAL
   LINKS STACKED VERTICALLY. Restored to inline here, so the row reads
   copyright on the left and Privacy - Terms on the right, on one line. */
.tsw-foot .foot-bottom{
  margin-top:64px;padding-top:24px;
  border-top:1px solid rgba(255,255,255,.1);
  display:flex;align-items:center;justify-content:space-between;
  gap:14px 28px;flex-wrap:wrap;
}
.tsw-foot .foot-copy{margin:0;font-size:13.5px;color:rgba(255,255,255,.5)}
.tsw-foot .foot-legal{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.tsw-foot .foot-legal a{
  display:inline-block;padding:0;font-size:13.5px;
  color:rgba(255,255,255,.6);transition:color .18s ease;
}
.tsw-foot .foot-legal a:hover{color:#fff}
.tsw-foot .foot-legal span{color:rgba(255,255,255,.55);font-size:13.5px}

/* ---- Focus -------------------------------------------------------------- */
/* Scoped to match the .foot-news input:focus rule above, which sets
   outline:none for the mouse case; without the extra class this lost on
   specificity and the field had no visible ring for keyboard users. */
.tsw-foot a:focus-visible,
.tsw-foot button:focus-visible,
.tsw-foot .foot-news input:focus-visible,
.tsw-foot .foot-news button:focus-visible{
  outline:2px solid var(--p2-gold-light);outline-offset:3px;border-radius:3px;
}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-foot{padding:64px 0 24px}
  /* Brand spans the top, the three remaining columns share the row beneath -
     the two link lists are short enough to sit side by side at this width. */
  .tsw-foot .foot-grid{grid-template-columns:1fr 1fr;gap:40px 40px}
  .tsw-foot .foot-brand{grid-column:1 / -1;max-width:520px}
  .tsw-foot .foot-reach{grid-column:1 / -1;max-width:520px}
  .tsw-foot .foot-bottom{margin-top:48px}
}

/* ---- Mobile ------------------------------------------------------------- */
@media(max-width:767px){
  .tsw-foot{padding:52px 0 22px}
  .tsw-foot .foot-grid{grid-template-columns:1fr;gap:34px}
  .tsw-foot .foot-brand,
  .tsw-foot .foot-reach{grid-column:auto;max-width:none}
  .tsw-foot .foot-about{max-width:none}
  .tsw-foot .foot-logo{height:34px;margin-bottom:16px}
  .tsw-foot .foot-h{margin-bottom:14px}
  .tsw-foot .foot-news{margin-top:24px;padding-top:20px}
  /* 16px stops iOS zooming the page when the field is focused. */
  .tsw-foot .foot-news input{font-size:16px}
  .tsw-foot .foot-bottom{
    margin-top:40px;flex-direction:column;align-items:flex-start;gap:12px;
  }
  /* 13.5px type is a 22px box, which is a poor thumb target. Padded to 40px
     on touch widths; the row still reads as one line because .foot-legal is a
     flex row and the padding is vertical only. */
  .tsw-foot .foot-legal{gap:14px;margin-left:-2px}
  .tsw-foot .foot-legal a{padding:9px 2px}
  /* Same reason for the navigation and contact links: 5px of padding gives a
     32px row, which is under the 40px a thumb wants. The lists gain a little
     height on phones and lose none of their density on desktop. */
  .tsw-foot .foot-links a{padding:9px 0}
  .tsw-foot .foot-contact li{gap:12px}
  .tsw-foot .foot-contact a{padding:4px 0}
}
@media(max-width:400px){
  /* Below this the two-button row starts to squeeze the input; stack instead. */
  .tsw-foot .foot-news-row{flex-direction:column}
  .tsw-foot .foot-news button{width:100%}
}
@media(prefers-reduced-motion:reduce){
  .tsw-foot .foot-social a,
  .tsw-foot .foot-links a,
  .tsw-foot .foot-contact a,
  .tsw-foot .foot-news input,
  .tsw-foot .foot-news button,
  .tsw-foot .foot-legal a{transition:none}
}

/* ============================================================================
   DESTINATIONS  (.p2-dest-*)  -  the public /destinations index
   ----------------------------------------------------------------------------
   The page opts into the Phase 2 system the same way the homepage and the
   travel pages do: .tsw-p2 for the tokens, .p2-wrap for the 1320px measure,
   and .p2-sec / .p2-eyebrow / .p2-h2 / .p2-lede / .p2-btn for everything they
   already cover. Only what this page genuinely adds is defined here.

   The Phase 1 rules this page used to rely on (.page-hero, .grid-3,
   .dest-card) live in the frozen block near the top of this file and are NOT
   edited - the new markup simply uses different class names, so they match
   nothing here and there is no !important anywhere below.

   The tile deliberately reproduces .p2-intl-card's spec - 6px radius, ink
   ground, gold hover border, .7s image ease - so a destination reads the same
   on this page as it does on the homepage, without this page depending on the
   homepage's international section.
   ========================================================================== */

/* ---- Hero: the established inner-page treatment, as on .tx-hero ---------- *
   Trimmed from 88/76 to 64/56. An index page's job is to get the reader to
   the grid; the travel heroes carry a CTA and earn their extra height, this
   one does not. The type scale, ground and hairline base are unchanged, so it
   still reads as the same family of page. */
.tsw-p2 .p2-dest-hero{
  background:var(--p2-ivory);
  border-bottom:1px solid var(--p2-line);
  padding:64px 0 56px;
}
.tsw-p2 .p2-dest-hero-inner{max-width:820px}
.tsw-p2 .p2-dest-hero .p2-eyebrow{margin-bottom:18px}
/* Scoped so it outranks the namespace's own heading rules; unscoped it renders
   bold instead of the light Newsreader every other Phase 2 headline uses. */
.tsw-p2 .p2-dest-h1{
  font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(38px,5.2vw,62px);line-height:1.04;letter-spacing:-.02em;
  color:var(--p2-navy);margin:0 0 20px;text-wrap:balance;
}
.tsw-p2 .p2-dest-lede-hero{
  font-size:17px;line-height:1.72;color:var(--p2-body);
  max-width:620px;margin:0;text-wrap:pretty;
}

/* The breadcrumb already carries 16px of its own padding, and .p2-sec adds a
   further 100px on top - together they left a large unexplained gap between
   the crumb and the filter row. The grid section starts at 36px instead; the
   100px rhythm is kept at the BOTTOM, where it separates the last group from
   the closing band. */
.tsw-p2 .p2-sec.p2-dest-sec{padding-top:36px}

/* ---- Category navigation ------------------------------------------------ *
   Ordinary links, not buttons - each one is a real URL. The active state is
   carried by weight, ground AND aria-current, never by colour alone. */
.tsw-p2 .p2-dest-nav{
  margin:0 0 44px;padding:0 0 22px;
  border-bottom:1px solid var(--p2-line);
}
/* One row, always. On a narrow phone the port scrolls sideways rather than
   letting the three chips wrap onto a second line; the scroll is contained,
   so it never becomes horizontal PAGE overflow. */
.tsw-p2 .p2-dest-nav-row{
  display:flex;gap:10px;
  overflow-x:auto;overscroll-behavior-x:contain;
  scrollbar-width:none;-ms-overflow-style:none;
  padding-bottom:2px;
}
.tsw-p2 .p2-dest-nav-row::-webkit-scrollbar{display:none}
.tsw-p2 a.p2-dest-tab{
  display:inline-flex;align-items:center;justify-content:center;
  flex:0 0 auto;white-space:nowrap;
  min-height:44px;padding:0 22px;
  font-size:14.5px;font-weight:600;line-height:1;
  color:var(--p2-body);background:transparent;
  border:1px solid var(--p2-line);border-radius:4px;
  transition:border-color .18s ease,color .18s ease,background .18s ease;
}
.tsw-p2 a.p2-dest-tab:hover{border-color:var(--p2-navy);color:var(--p2-navy)}
.tsw-p2 a.p2-dest-tab.is-active{
  background:var(--p2-navy);border-color:var(--p2-navy);color:#fff;
}
.tsw-p2 a.p2-dest-tab:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Group heading ------------------------------------------------------ */
.tsw-p2 .p2-dest-group + .p2-dest-group{margin-top:76px}
.tsw-p2 .p2-dest-group-head{
  display:flex;align-items:baseline;justify-content:space-between;
  gap:16px 28px;flex-wrap:wrap;margin-bottom:10px;
}
.tsw-p2 h2.p2-dest-h2{margin:0}
.tsw-p2 .p2-dest-count{
  margin:0;font-size:12px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--p2-muted);white-space:nowrap;
}
.tsw-p2 .p2-dest-lede{margin:0 0 34px}

/* ---- Grid --------------------------------------------------------------- *
   Four across on the 1320px measure gives a ~292px tile; at 3/4 that is a
   ~390px card - compact enough that a collection reads as a collection rather
   than as an oversized photo gallery, and tall enough for the caption block to
   breathe. */
.tsw-p2 .p2-dest-grid{
  display:grid;gap:22px;
  grid-template-columns:repeat(4,minmax(0,1fr));
}

/* ---- Tile --------------------------------------------------------------- */
.tsw-p2 a.p2-dest-card{
  position:relative;display:flex;flex-direction:column;overflow:hidden;
  aspect-ratio:3/4;
  border-radius:6px;background:var(--p2-ink);text-decoration:none;color:#fff;
  border:1px solid transparent;transition:border-color .25s ease;
}
.tsw-p2 a.p2-dest-card:hover{border-color:rgba(255,165,0,.55)}
.tsw-p2 a.p2-dest-card:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
.tsw-p2 .p2-dest-media{position:absolute;inset:0;z-index:0;display:block;overflow:hidden}
.tsw-p2 .p2-dest-media img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 a.p2-dest-card:hover .p2-dest-media img{transform:scale(1.04)}
/* The scrim is deep enough that a 24px name clears WCAG "large text" over any
   photograph in the set - the same correction the homepage tiles needed. */
.tsw-p2 .p2-dest-media::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(7,18,40,.06) 26%,rgba(7,18,40,.72) 62%,rgba(7,18,40,.95) 100%);
}
/* No photograph: a quiet ink panel with the site's pin mark, never another
   destination's picture. */
.tsw-p2 .p2-dest-noimg{
  position:absolute;inset:0;display:flex;align-items:flex-start;justify-content:center;
  padding-top:16%;color:rgba(255,255,255,.22);background:var(--p2-ink);
}
.tsw-p2 .p2-dest-noimg svg{width:30%;max-width:88px;height:auto;display:block}
.tsw-p2 a.p2-dest-card.is-noimg .p2-dest-media::after{
  background:linear-gradient(180deg,rgba(7,18,40,0) 40%,rgba(7,18,40,.72) 78%,rgba(7,18,40,.92) 100%);
}

.tsw-p2 .p2-dest-body{
  position:relative;z-index:1;margin-top:auto;display:block;
  padding:18px 18px 17px;
}
/* 25px keeps the name above the 24px WCAG large-text threshold over the
   scrim while fitting the narrower tile. A long name ("Himachal Pradesh")
   wraps rather than overflowing, and hyphens let it break if it must. */
.tsw-p2 .p2-dest-name{
  display:block;font-family:var(--p2-serif);font-weight:400;
  font-size:25px;line-height:1.1;letter-spacing:-.012em;margin-bottom:6px;
  overflow-wrap:anywhere;hyphens:auto;
}
.tsw-p2 .p2-dest-place{
  display:block;font-size:12px;line-height:1.4;color:rgba(255,255,255,.78);
  padding-bottom:9px;margin-bottom:9px;border-bottom:1px solid rgba(255,255,255,.16);
  overflow-wrap:anywhere;
}
.tsw-p2 .p2-dest-cta{
  display:inline-flex;align-items:center;gap:6px;
  font-size:12px;font-weight:600;letter-spacing:.02em;color:var(--p2-gold-light);
}
.tsw-p2 .p2-dest-cta svg{width:15px;height:15px;flex:0 0 15px;transition:transform .25s ease}
.tsw-p2 a.p2-dest-card:hover .p2-dest-cta svg{transform:translateX(3px)}

/* ---- Empty states ------------------------------------------------------- */
.tsw-p2 .p2-dest-empty{
  border:1px dashed var(--p2-line-warm);border-radius:14px;
  background:var(--p2-paper);
  padding:52px 32px;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:20px;
}
.tsw-p2 .p2-dest-empty p{
  margin:0;font-size:16.5px;line-height:1.68;color:var(--p2-body);max-width:46ch;
}
.tsw-p2 .p2-dest-empty.is-page{padding:72px 32px}

/* ---- Closing CTA -------------------------------------------------------- *
   Copy left, photograph right. The right half used to be empty ivory, which
   read as an unfinished section rather than as deliberate space. */
.tsw-p2 .p2-dest-cta-grid{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:56px;align-items:center;
}
.tsw-p2 .p2-dest-cta-body{max-width:520px}
.tsw-p2 .p2-dest-cta .p2-h2{margin-bottom:14px}
.tsw-p2 .p2-dest-cta .p2-lede{margin-bottom:30px}
.tsw-p2 .p2-dest-cta-media{
  position:relative;overflow:hidden;border-radius:8px;
  aspect-ratio:9/7;background:var(--p2-sand);
}
.tsw-p2 .p2-dest-cta-media img{
  width:100%;height:100%;object-fit:cover;display:block;
}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1024px){
  .tsw-p2 .p2-dest-hero{padding:52px 0 46px}
  /* Two across at this width gives a ~468px tile. A 3/4 crop there would be a
     620px tower, so the card turns landscape and stays around 375px tall. */
  .tsw-p2 .p2-dest-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
  .tsw-p2 a.p2-dest-card{aspect-ratio:5/4}
  .tsw-p2 .p2-dest-nav{margin-bottom:38px}
  .tsw-p2 .p2-dest-group + .p2-dest-group{margin-top:60px}
  .tsw-p2 .p2-dest-cta-grid{gap:36px}
}

/* ---- Mobile: still TWO across ------------------------------------------- *
   Deliberately not one column. Two compact tiles per row keep a phone reader
   scanning a collection rather than scrolling a stack of billboards; the
   portrait crop returns because each tile is only ~165px wide. */
@media(max-width:767px){
  .tsw-p2 .p2-dest-hero{padding:40px 0 34px}
  .tsw-p2 .p2-dest-lede-hero{font-size:15.5px}
  .tsw-p2 .p2-sec.p2-dest-sec{padding-top:26px}
  .tsw-p2 .p2-dest-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  /* 4/7 keeps the tile inside the 280-340px band across the phone range:
     ~291px at 375, ~303 at 390, ~338 at 430. 5/9 measured 347 at 430. */
  .tsw-p2 a.p2-dest-card{aspect-ratio:4/7;border-radius:5px}
  .tsw-p2 .p2-dest-body{padding:13px 12px 12px}
  /* Below the 24px large-text threshold the name needs the full 4.5:1, which
     the deepened scrim below provides. */
  .tsw-p2 .p2-dest-name{font-size:18px;line-height:1.14;margin-bottom:4px}
  .tsw-p2 .p2-dest-place{font-size:11px;padding-bottom:7px;margin-bottom:7px}
  .tsw-p2 .p2-dest-cta{font-size:11px;gap:5px}
  .tsw-p2 .p2-dest-cta svg{width:13px;height:13px;flex:0 0 13px}
  .tsw-p2 .p2-dest-media::after{
    background:linear-gradient(180deg,rgba(7,18,40,.1) 18%,rgba(7,18,40,.7) 52%,rgba(7,18,40,.94) 100%);
  }
  .tsw-p2 .p2-dest-noimg svg{width:34%;max-width:60px}
  .tsw-p2 .p2-dest-nav{margin-bottom:30px;padding-bottom:18px}
  /* The row is a scroller here; the negative margin lets the first and last
     chip sit flush with the page gutter while still scrolling edge to edge. */
  .tsw-p2 .p2-dest-nav-row{gap:8px;margin:0 -16px;padding:0 16px 2px}
  .tsw-p2 a.p2-dest-tab{padding:0 16px;font-size:14px}
  /* 375 and 390 are the two widths the design targets; at 16px of chip padding
     the three chips measure 371px and the last one is clipped by 12px on a 375
     screen. Tighter chips fit all three without touching the 44px tap height.
     Narrower than this the row simply scrolls, which is what it is built for. */
  @media(max-width:400px){
    .tsw-p2 a.p2-dest-tab{padding:0 11px}
  }
  .tsw-p2 .p2-dest-group + .p2-dest-group{margin-top:44px}
  .tsw-p2 .p2-dest-lede{margin-bottom:22px}
  .tsw-p2 .p2-dest-empty{padding:38px 22px}
  .tsw-p2 .p2-dest-empty.is-page{padding:48px 22px}
  /* Stacked, copy first. The picture keeps a real height so it reads as part
     of the composition rather than as a strip - but that height comes from the
     ratio alone. A min-height here would fight the aspect-ratio: the box would
     solve for width instead (200px x 16/10 = a 320px floor), and on a 320px
     phone that floor is wider than the 288px content column, which turned the
     whole page into a horizontal scroller. */
  .tsw-p2 .p2-dest-cta-grid{grid-template-columns:minmax(0,1fr);gap:26px}
  .tsw-p2 .p2-dest-cta-body{max-width:none}
  .tsw-p2 .p2-dest-cta-media{aspect-ratio:16/10;width:100%}
  .tsw-p2 .p2-dest-cta .p2-btn{width:100%}
}
@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-dest-media img,
  .tsw-p2 a.p2-dest-card,
  .tsw-p2 .p2-dest-cta svg,
  .tsw-p2 a.p2-dest-tab{transition:none}
  .tsw-p2 a.p2-dest-card:hover .p2-dest-media img{transform:none}
}

/* ==========================================================================
   /packages and /offers - the listing pages
   ==========================================================================
   Phase 2, opted into by the .tsw-p2 wrapper the views carry. Everything here
   is a NEW name in the .p2-pl-* namespace, so no rule below can be reached by
   any page that does not render partials._p2_listing. The Phase 1 rules the
   old listing used (.page-hero, .grid-3, .card, .pagination) live in the
   frozen block at the top of this file and are untouched - /blog still renders
   .pagination and must keep it.

   THE COLUMN COUNT IS THE POINT. Five across on a desktop with a sidebar means
   a ~172px column, so the card is designed for that width rather than shrunk
   into it: one image, a tight metadata stack, no inner button. Nothing carries
   a fixed height - a renamed package must be able to run to three lines and
   push the card taller instead of clipping.
   ========================================================================== */

/* Available to screen readers, invisible on screen. Used for the things a
   sighted reader gets from layout: "Active filters:", "remove this filter",
   "current page". */
.tsw-p2 .p2-pl-vh{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;
}

/* ---- Hero --------------------------------------------------------------- *
   The /destinations treatment exactly: ivory ground, hairline base, 64/56.
   A listing's hero should hand the reader to the grid, not fill the screen. */
.tsw-p2 .p2-pl-hero{
  background:var(--p2-ivory);
  border-bottom:1px solid var(--p2-line);
  padding:64px 0 56px;
}
.tsw-p2 .p2-pl-hero-inner{max-width:820px}
.tsw-p2 .p2-pl-h1{
  font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(38px,5.2vw,62px);line-height:1.04;letter-spacing:-.02em;
  color:var(--p2-navy);margin:0 0 20px;text-wrap:balance;
}
.tsw-p2 .p2-pl-hero-lede{
  font-size:17px;line-height:1.72;color:var(--p2-body);
  max-width:620px;margin:0;text-wrap:pretty;
}

/* The breadcrumb brings its own 16px and .p2-sec would add 100 on top, which
   is the empty band this page used to open with. 36 at the top; the full
   rhythm is kept at the bottom, where it separates the grid from the CTA. */
.tsw-p2 .p2-sec.p2-pl-sec{padding-top:36px}

/* ---- Layout: sidebar + results ------------------------------------------ */
.tsw-p2 .p2-pl-form{display:block}
.tsw-p2 .p2-pl-layout{
  display:grid;grid-template-columns:260px minmax(0,1fr);
  gap:32px;align-items:start;
}
.tsw-p2 .p2-pl-main{min-width:0}

/* ---- Sidebar ------------------------------------------------------------ */
.tsw-p2 .p2-pl-side{
  background:#fff;border:1px solid var(--p2-line);border-radius:6px;
  /* Sticky to the grid, not to the page: `top` clears the sticky site header
     and max-height keeps the panel inside the viewport, so a long filter list
     scrolls within itself instead of running under the footer. */
  position:sticky;top:104px;
  max-height:calc(100vh - 128px);
  display:flex;flex-direction:column;
}
.tsw-p2 .p2-pl-side-head{
  display:flex;align-items:center;justify-content:space-between;
  padding:16px 18px;border-bottom:1px solid var(--p2-line);flex:0 0 auto;
}
.tsw-p2 .p2-pl-side-h{
  font-family:var(--p2-serif);font-weight:400;font-size:19px;line-height:1;
  color:var(--p2-navy);margin:0;letter-spacing:-.01em;
}
.tsw-p2 .p2-pl-side-body{padding:16px 18px 4px;overflow-y:auto;flex:1 1 auto}
.tsw-p2 .p2-pl-side-foot{
  padding:14px 18px;border-top:1px solid var(--p2-line);flex:0 0 auto;
  display:flex;flex-direction:column;gap:10px;align-items:stretch;
}
.tsw-p2 .p2-pl-side-foot .p2-pl-apply{width:100%;padding:12px 18px;font-size:14px}
.tsw-p2 a.p2-pl-clear{
  text-align:center;font-size:13px;font-weight:600;color:var(--p2-body);
  text-decoration:underline;text-underline-offset:3px;padding:4px;
}
.tsw-p2 a.p2-pl-clear:hover{color:var(--p2-blue)}

/* The close control belongs to the mobile drawer only. */
.tsw-p2 .p2-pl-close{display:none}

/* ---- Fields ------------------------------------------------------------- */
.tsw-p2 .p2-pl-field{margin-bottom:20px}
.tsw-p2 .p2-pl-legend{
  display:block;font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-navy);margin:0 0 9px;padding:0;
}
.tsw-p2 .p2-pl-hint{font-size:11.5px;line-height:1.45;color:var(--p2-body);margin:7px 0 0}

.tsw-p2 .p2-pl-search{position:relative;display:block}
.tsw-p2 .p2-pl-search svg{
  position:absolute;left:11px;top:50%;transform:translateY(-50%);
  width:15px;height:15px;color:var(--p2-muted);pointer-events:none;
}
.tsw-p2 .p2-pl-search input{
  width:100%;font-family:inherit;font-size:14px;color:var(--p2-navy);
  padding:10px 12px 10px 33px;background:var(--p2-paper);
  border:1px solid var(--p2-line);border-radius:4px;
}
.tsw-p2 .p2-pl-search input::placeholder{color:var(--p2-muted)}

.tsw-p2 .p2-pl-select{
  width:100%;font-family:inherit;font-size:14px;color:var(--p2-navy);
  padding:10px 12px;background:var(--p2-paper);
  border:1px solid var(--p2-line);border-radius:4px;
}

/* Radio groups. <fieldset>/<legend> so the group has a name of its own. */
.tsw-p2 .p2-pl-fs{border:0;margin:0 0 20px;padding:0;min-width:0}
.tsw-p2 .p2-pl-opt{display:flex;align-items:flex-start;gap:9px;padding:4px 0}
.tsw-p2 .p2-pl-opt input{
  flex:0 0 auto;margin:2px 0 0;width:15px;height:15px;
  accent-color:var(--p2-blue);cursor:pointer;
}
.tsw-p2 .p2-pl-opt label{
  font-size:13.5px;line-height:1.4;color:var(--p2-body);cursor:pointer;
}
/* The applied option is named in words in the chip row above the grid as well,
   so weight here is reinforcement rather than the only signal. */
.tsw-p2 .p2-pl-opt input:checked + label{color:var(--p2-navy);font-weight:600}

.tsw-p2 .p2-pl-side input:focus-visible,
.tsw-p2 .p2-pl-side select:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}

/* ---- Results bar -------------------------------------------------------- */
.tsw-p2 .p2-pl-bar{
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  flex-wrap:wrap;padding-bottom:16px;margin-bottom:20px;
  border-bottom:1px solid var(--p2-line);
}
.tsw-p2 .p2-pl-count{margin:0;font-size:14px;color:var(--p2-body)}
.tsw-p2 .p2-pl-count b{color:var(--p2-navy);font-weight:600}
.tsw-p2 .p2-pl-tools{display:flex;align-items:center;gap:10px}

.tsw-p2 .p2-pl-sort{display:flex;align-items:center;gap:8px}
.tsw-p2 .p2-pl-sort-l{
  font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-navy);
}
/* The sort control and its Apply button are one row, so they share a height.
   Both were sized by padding alone and came out at 33px, under the 36px this
   site holds its controls to; the mobile rules already used 40. */
.tsw-p2 .p2-pl-sort .p2-pl-select{width:auto;min-width:168px;min-height:38px;padding:0 10px;font-size:13.5px}
.tsw-p2 .p2-pl-sortgo{
  display:inline-flex;align-items:center;justify-content:center;
  font-family:inherit;font-size:13px;font-weight:600;color:var(--p2-navy);
  background:transparent;border:1px solid var(--p2-navy);border-radius:4px;
  min-height:38px;padding:0 16px;cursor:pointer;transition:background .16s ease,color .16s ease;
}
.tsw-p2 .p2-pl-sortgo:hover{background:var(--p2-navy);color:#fff}
.tsw-p2 .p2-pl-sortgo:focus-visible,
.tsw-p2 .p2-pl-sort select:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}

/* The drawer toggle. A real checkbox: focusable, announced, and named by the
   label beside it. Off-screen rather than display:none so the keyboard can
   still reach it; the label carries the focus ring on its behalf. */
.tsw-p2 .p2-pl-fx{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}
.tsw-p2 .p2-pl-fbtn{display:none}
.tsw-p2 .p2-pl-fx:focus-visible + .p2-pl-fbtn{outline:2px solid var(--p2-gold);outline-offset:2px}

/* ---- Active filter chips ------------------------------------------------ */
.tsw-p2 .p2-pl-chips{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 20px}
.tsw-p2 a.p2-pl-chip{
  display:inline-flex;align-items:center;gap:7px;
  font-size:12.5px;font-weight:600;color:var(--p2-navy);
  background:var(--p2-sand);border:1px solid var(--p2-line-warm);
  border-radius:999px;padding:6px 12px;transition:.16s ease;
}
.tsw-p2 a.p2-pl-chip svg{width:11px;height:11px;flex:0 0 11px;color:var(--p2-body)}
.tsw-p2 a.p2-pl-chip:hover{border-color:var(--p2-navy);background:#fff}
.tsw-p2 a.p2-pl-chip:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 a.p2-pl-chip-clear{
  font-size:12.5px;font-weight:600;color:var(--p2-blue);
  text-decoration:underline;text-underline-offset:3px;padding:6px 2px;
}
.tsw-p2 a.p2-pl-chip-clear:hover{color:var(--p2-blue-dark)}

/* ---- The grid ----------------------------------------------------------- *
   Five across is the desktop requirement. minmax(0,1fr) rather than auto so a
   long unbroken word can never widen a column past its share. */
.tsw-p2 .p2-pl-grid{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:16px;
}

/* ---- The card ----------------------------------------------------------- */
.tsw-p2 .p2-pl-card{display:flex}
.tsw-p2 a.p2-pl-card-link{
  display:flex;flex-direction:column;width:100%;
  background:#fff;border:1px solid var(--p2-line);border-radius:6px;
  overflow:hidden;color:inherit;text-decoration:none;
  transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease;
}
.tsw-p2 a.p2-pl-card-link:hover{
  border-color:var(--p2-gold);
  box-shadow:0 10px 26px rgba(7,18,40,.09);
  transform:translateY(-2px);
}
.tsw-p2 a.p2-pl-card-link:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

.tsw-p2 .p2-pl-media{
  display:block;position:relative;overflow:hidden;
  aspect-ratio:4/3;background:var(--p2-sand);
}
.tsw-p2 .p2-pl-media img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 a.p2-pl-card-link:hover .p2-pl-media img{transform:scale(1.05)}

/* The image-less state. Deliberate and captioned - not a broken icon, and not
   another destination's photograph standing in for the missing one. */
.tsw-p2 .p2-pl-media.is-noimg{background:var(--p2-navy)}
.tsw-p2 .p2-pl-noimg{
  position:absolute;inset:0;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:7px;
  color:rgba(255,255,255,.5);
}
.tsw-p2 .p2-pl-noimg svg{width:26px;height:26px;color:var(--p2-gold)}
.tsw-p2 .p2-pl-noimg-t{
  font-size:10.5px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;
  color:rgba(255,255,255,.62);padding:0 8px;text-align:center;
}

/* Badge: the editor's own offer_label, never a computed discount. Top-left,
   away from the price, and capped so a long label cannot cover the picture. */
.tsw-p2 .p2-pl-badge{
  position:absolute;top:8px;left:8px;z-index:2;
  display:inline-block;max-width:calc(100% - 16px);
  font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--p2-ink);background:var(--p2-gold-light);
  border-radius:3px;padding:4px 8px;line-height:1.15;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

.tsw-p2 .p2-pl-body{
  display:flex;flex-direction:column;flex:1 1 auto;
  padding:12px 13px 13px;gap:0;
}
/* Real text at 10.5px needs 4.5:1, and the brand gold gives 3.12:1 on the
   card's white ground - so small gold text uses --p2-gold-text. --p2-gold
   itself is deliberately unchanged: it is decoration everywhere else, and
   restyling it would reach every Phase 2 page including the homepage. */
.tsw-p2 .p2-pl-place{
  display:block;font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;
  font-weight:600;color:var(--p2-gold-text);margin-bottom:6px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.tsw-p2 .p2-pl-title{
  display:block;font-family:var(--p2-serif);font-weight:400;
  font-size:16px;line-height:1.22;letter-spacing:-.01em;
  color:var(--p2-navy);margin-bottom:7px;
  overflow-wrap:anywhere;
}
.tsw-p2 a.p2-pl-card-link:hover .p2-pl-title{color:var(--p2-blue)}
.tsw-p2 .p2-pl-meta{display:flex;flex-wrap:wrap;gap:4px 8px;margin-bottom:8px}
.tsw-p2 .p2-pl-meta-i{
  font-size:11.5px;font-weight:600;color:var(--p2-body);
  background:var(--p2-sand);border-radius:3px;padding:3px 7px;line-height:1.2;
}
/* Two lines of teaser, then it stops. The clamp is on the text, not the card,
   so the card itself is never a fixed height. */
.tsw-p2 .p2-pl-desc{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;font-size:12.5px;line-height:1.5;color:var(--p2-body);
  margin-bottom:11px;
}
/* margin-top:auto pins the price to the bottom, so prices line up across a row
   whatever the titles above them did. */
.tsw-p2 .p2-pl-foot{
  display:flex;align-items:flex-end;justify-content:space-between;gap:8px;
  margin-top:auto;padding-top:9px;border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-pl-price{display:flex;flex-direction:column;min-width:0}
.tsw-p2 .p2-pl-from{
  font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--p2-body);font-weight:600;
}
.tsw-p2 .p2-pl-price b{
  font-size:16px;font-weight:600;color:var(--p2-navy);line-height:1.2;
  letter-spacing:-.01em;
}
.tsw-p2 .p2-pl-go{
  flex:0 0 26px;width:26px;height:26px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:var(--p2-sand);color:var(--p2-navy);
  transition:background .18s ease,color .18s ease;
}
.tsw-p2 .p2-pl-go svg{width:13px;height:13px}
.tsw-p2 a.p2-pl-card-link:hover .p2-pl-go{background:var(--p2-blue);color:#fff}

/* ---- Empty state -------------------------------------------------------- */
.tsw-p2 .p2-pl-empty{
  text-align:center;padding:60px 28px;
  border:1px dashed var(--p2-line-warm);border-radius:8px;background:var(--p2-paper);
}
.tsw-p2 .p2-pl-empty svg{width:34px;height:34px;color:var(--p2-gold);margin-bottom:14px}
.tsw-p2 .p2-pl-empty-h{
  font-family:var(--p2-serif);font-weight:300;font-size:30px;line-height:1.1;
  color:var(--p2-navy);margin:0 0 10px;letter-spacing:-.02em;
}
.tsw-p2 .p2-pl-empty-p{
  font-size:15px;line-height:1.65;color:var(--p2-body);
  margin:0 auto 22px;max-width:44ch;
}

/* ---- Pagination --------------------------------------------------------- *
   A restyle for THIS listing only. partials._pagination and its .pagination
   rules are untouched, because /blog renders them. */
.tsw-p2 .p2-pl-pager{
  display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
  margin-top:44px;padding-top:28px;border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-pl-pg{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:40px;min-height:40px;padding:0 12px;
  font-size:14px;font-weight:600;color:var(--p2-navy);
  border:1px solid var(--p2-line);border-radius:4px;
  transition:border-color .16s ease,background .16s ease,color .16s ease;
}
.tsw-p2 a.p2-pl-pg:hover{border-color:var(--p2-navy)}
.tsw-p2 a.p2-pl-pg:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 .p2-pl-pg.is-current{background:var(--p2-navy);border-color:var(--p2-navy);color:#fff}

/* ---- Closing CTA -------------------------------------------------------- *
   The /destinations composition, so the three index pages close alike. */
.tsw-p2 .p2-pl-cta-grid{
  display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:56px;align-items:center;
}
.tsw-p2 .p2-pl-cta-body{max-width:520px}
.tsw-p2 .p2-pl-cta .p2-h2{margin-bottom:14px}
.tsw-p2 .p2-pl-cta .p2-lede{margin-bottom:30px}
.tsw-p2 .p2-pl-cta-media{
  position:relative;overflow:hidden;border-radius:8px;
  aspect-ratio:9/7;background:var(--p2-sand);
}
.tsw-p2 .p2-pl-cta-media img{width:100%;height:100%;object-fit:cover;display:block}

/* ---- Below the five-column band ----------------------------------------- *
   The sidebar still fits here, so it stays; two columns give the card a
   comfortable width rather than five cramped ones. */
@media(max-width:1239px){
  .tsw-p2 .p2-pl-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
  .tsw-p2 .p2-pl-media{aspect-ratio:16/10}
  .tsw-p2 .p2-pl-title{font-size:18px}
  .tsw-p2 .p2-pl-desc{font-size:13px}
}

/* ---- Tablet and phone: the sidebar becomes a drawer --------------------- */
@media(max-width:1023px){
  .tsw-p2 .p2-pl-hero{padding:52px 0 44px}
  .tsw-p2 .p2-sec.p2-pl-sec{padding-top:28px}
  .tsw-p2 .p2-pl-layout{grid-template-columns:minmax(0,1fr);gap:0}

  /* Off-canvas until the toggle is checked. It is a panel with its own
     scroll, so a long filter list never scrolls the page behind it. */
  .tsw-p2 .p2-pl-side{
    position:fixed;top:0;left:0;bottom:0;z-index:70;
    width:min(340px,88vw);max-height:none;border-radius:0;
    border:0;border-right:1px solid var(--p2-line);
    transform:translateX(-101%);
    transition:transform .26s cubic-bezier(.2,.7,.2,1);
    box-shadow:0 0 40px rgba(7,18,40,.18);
  }
  .tsw-p2 .p2-pl-form:has(.p2-pl-fx:checked) .p2-pl-side{transform:none}

  /* The scrim closes the drawer too - it is the same label as the button. */
  .tsw-p2 .p2-pl-close{
    display:inline-flex;align-items:center;justify-content:center;
    width:36px;height:36px;margin:-8px -8px -8px 0;
    border-radius:4px;color:var(--p2-navy);cursor:pointer;
  }
  .tsw-p2 .p2-pl-close svg{width:17px;height:17px}
  .tsw-p2 .p2-pl-close:hover{background:var(--p2-sand)}

  .tsw-p2 .p2-pl-fbtn{
    display:inline-flex;align-items:center;gap:8px;
    min-height:40px;padding:0 14px;cursor:pointer;
    font-size:13.5px;font-weight:600;color:var(--p2-navy);
    background:#fff;border:1px solid var(--p2-navy);border-radius:4px;
  }
  .tsw-p2 .p2-pl-fbtn svg{width:15px;height:15px}
  .tsw-p2 .p2-pl-fbtn:hover{background:var(--p2-navy);color:#fff}

  .tsw-p2 .p2-pl-sort-l{display:none}
  .tsw-p2 .p2-pl-sort .p2-pl-select{min-width:0;min-height:40px}
  .tsw-p2 .p2-pl-sortgo{min-height:40px}

  .tsw-p2 .p2-pl-cta-grid{grid-template-columns:minmax(0,1fr);gap:26px}
  .tsw-p2 .p2-pl-cta-body{max-width:none}
  /* The ratio alone sets the height. A min-height here would fight it: the box
     would solve for width instead and overflow a narrow phone. */
  .tsw-p2 .p2-pl-cta-media{aspect-ratio:16/10;width:100%}
  .tsw-p2 .p2-pl-cta .p2-btn{width:100%}
}

/* ---- Phone -------------------------------------------------------------- *
   Two columns, deliberately. One column turns a catalogue into a very long
   scroll and loses the sense of a set. */
@media(max-width:767px){
  .tsw-p2 .p2-pl-hero{padding:40px 0 32px}
  .tsw-p2 .p2-sec.p2-pl-sec{padding-top:22px}
  .tsw-p2 .p2-pl-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .tsw-p2 .p2-pl-media{aspect-ratio:4/3}
  .tsw-p2 .p2-pl-body{padding:10px 11px 11px}
  .tsw-p2 .p2-pl-title{font-size:15px;margin-bottom:6px}
  .tsw-p2 .p2-pl-place{font-size:10px;margin-bottom:5px}
  .tsw-p2 .p2-pl-meta{gap:4px 6px;margin-bottom:7px}
  .tsw-p2 .p2-pl-meta-i{font-size:11px;padding:3px 6px}
  /* The period chip is the first thing to go when the column is this narrow:
     nights are the fact that distinguishes two cards side by side. */
  .tsw-p2 .p2-pl-meta-period{display:none}
  .tsw-p2 .p2-pl-desc{display:none}
  .tsw-p2 .p2-pl-price b{font-size:15px}

  .tsw-p2 .p2-pl-bar{gap:12px;padding-bottom:14px;margin-bottom:16px}
  .tsw-p2 .p2-pl-count{width:100%;order:-1}
  .tsw-p2 .p2-pl-tools{width:100%;gap:8px}
  .tsw-p2 .p2-pl-sort{flex:1 1 auto;min-width:0}
  .tsw-p2 .p2-pl-sort .p2-pl-select{flex:1 1 auto;width:100%}
  .tsw-p2 .p2-pl-empty{padding:44px 20px}
  .tsw-p2 .p2-pl-empty-h{font-size:25px}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-pl-media img,
  .tsw-p2 a.p2-pl-card-link,
  .tsw-p2 .p2-pl-side{transition:none}
  .tsw-p2 a.p2-pl-card-link:hover{transform:none}
  .tsw-p2 a.p2-pl-card-link:hover .p2-pl-media img{transform:none}
}

/* ==========================================================================
   Inner pages - the shared Phase 2 shell
   ==========================================================================
   About, Contact, Get a Quote, FAQ, Blog, Blog detail, Privacy, Terms,
   Thank you, 404, Destination detail and Package detail all shipped in the
   Phase 1 language: a navy .page-hero, a bold system-sans H1, .section and a
   1200px .container. Beside the homepage - Newsreader, ivory, 1320px - they
   read as a different website.

   This block gives them the homepage's language without rewriting each page's
   body. Two things are happening:

     1. NEW NAMES for the frame: .p2-ip-hero, .p2-ip-sec, .p2-ip-layout and so
        on. These replace .page-hero / .section / .container in the markup.

     2. SCOPED RESTYLES of the Phase 1 markup that stays - .prose, .form-card,
        .accordion, .chips, .pkg-block, .price-box. Every one of those rules
        is written `.tsw-p2 .p2-ip-body <legacy class>`, so it can only apply
        inside a converted page's wrapper. An unconverted page, /blog's
        .pagination, or any admin screen carrying the same class names is
        untouched, and the frozen Phase 1 definitions are never edited.

   The result: one hero language, one heading font, one container, one form,
   one card - across the whole public site.
   ========================================================================== */

/* ---- Hero: plain (content pages) ---------------------------------------- */
.tsw-p2 .p2-ip-hero{
  background:var(--p2-ivory);
  border-bottom:1px solid var(--p2-line);
  padding:64px 0 56px;
}
.tsw-p2 .p2-ip-hero-inner{max-width:820px}
.tsw-p2 .p2-ip-h1{
  font-family:var(--p2-serif);font-weight:300;
  font-size:clamp(36px,5vw,58px);line-height:1.05;letter-spacing:-.02em;
  color:var(--p2-navy);margin:0 0 18px;text-wrap:balance;
}
.tsw-p2 .p2-ip-lede{
  font-size:17px;line-height:1.72;color:var(--p2-body);
  max-width:620px;margin:0;text-wrap:pretty;
}

/* ---- Hero: with a photograph (detail pages) ----------------------------- *
   The picture is the ground, not a decoration, so the type sits on a scrim
   heavy enough to keep it readable over any image. Where a record has no
   photograph the ink ground carries the type on its own - the same rule the
   cards follow: never another destination's picture standing in. */
.tsw-p2 .p2-ip-hero.has-img{
  position:relative;background:var(--p2-ink);border-bottom:0;
  padding:0;overflow:hidden;isolation:isolate;
}
.tsw-p2 .p2-ip-hero-img{position:absolute;inset:0;z-index:0}
.tsw-p2 .p2-ip-hero-img img{width:100%;height:100%;object-fit:cover;display:block}
.tsw-p2 .p2-ip-hero.has-img::after{
  content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(7,18,40,.34) 0%,rgba(7,18,40,.62) 55%,rgba(7,18,40,.86) 100%);
}
.tsw-p2 .p2-ip-hero.has-img .p2-ip-hero-inner{
  position:relative;z-index:2;padding:120px 0 52px;max-width:760px;
}
.tsw-p2 .p2-ip-hero.has-img .p2-ip-h1{color:#fff}
.tsw-p2 .p2-ip-hero.has-img .p2-ip-lede{color:rgba(255,255,255,.8)}
.tsw-p2 .p2-ip-hero.has-img .p2-eyebrow span{color:var(--p2-gold-light)}
.tsw-p2 .p2-ip-hero.has-img .p2-eyebrow i{background:var(--p2-gold-light)}
.tsw-p2 .p2-ip-hero-meta{
  margin:16px 0 0;font-size:13.5px;color:rgba(255,255,255,.72);
  display:flex;flex-wrap:wrap;gap:6px 14px;
}

/* The breadcrumb carries its own 16px and .p2-sec would add 100 on top. */
.tsw-p2 .p2-sec.p2-ip-sec{padding-top:40px}

/* ---- Two-column body: content + sticky aside ---------------------------- */
.tsw-p2 .p2-ip-layout{
  display:grid;grid-template-columns:minmax(0,1fr) 360px;
  gap:56px;align-items:start;
}
.tsw-p2 .p2-ip-main{min-width:0}
.tsw-p2 .p2-ip-aside{position:sticky;top:104px;min-width:0}

/* A single-column reading measure for legal pages and articles. */
.tsw-p2 .p2-ip-narrow{max-width:760px}

/* ---- Editorial prose ---------------------------------------------------- */
.tsw-p2 .p2-ip-body .prose,
.tsw-p2 .p2-ip-prose{font-size:16.5px;line-height:1.78;color:var(--p2-body)}
.tsw-p2 .p2-ip-body .prose > * + *,
.tsw-p2 .p2-ip-prose > * + *{margin-top:20px}
.tsw-p2 .p2-ip-body .prose h2,
.tsw-p2 .p2-ip-prose h2{
  font-family:var(--p2-serif);font-weight:300;font-size:32px;line-height:1.16;
  letter-spacing:-.02em;color:var(--p2-navy);margin:42px 0 14px;
}
.tsw-p2 .p2-ip-body .prose h3,
.tsw-p2 .p2-ip-prose h3{
  font-family:var(--p2-serif);font-weight:400;font-size:23px;line-height:1.25;
  color:var(--p2-navy);margin:32px 0 10px;
}
.tsw-p2 .p2-ip-body .prose a,
.tsw-p2 .p2-ip-prose a{color:var(--p2-blue);text-decoration:underline;text-underline-offset:3px}
.tsw-p2 .p2-ip-body .prose a:hover,
.tsw-p2 .p2-ip-prose a:hover{color:var(--p2-blue-dark)}
.tsw-p2 .p2-ip-body .prose ul,
.tsw-p2 .p2-ip-body .prose ol,
.tsw-p2 .p2-ip-prose ul,
.tsw-p2 .p2-ip-prose ol{padding-left:22px}
.tsw-p2 .p2-ip-body .prose li + li,
.tsw-p2 .p2-ip-prose li + li{margin-top:8px}
.tsw-p2 .p2-ip-body .prose blockquote,
.tsw-p2 .p2-ip-prose blockquote{
  border-left:2px solid var(--p2-gold);padding-left:22px;margin-left:0;
  font-family:var(--p2-serif);font-size:20px;line-height:1.55;color:var(--p2-navy);
}
.tsw-p2 .p2-ip-body .prose img,
.tsw-p2 .p2-ip-prose img{max-width:100%;height:auto;border-radius:8px}

/* ---- Section headings inside a converted body --------------------------- */
.tsw-p2 .p2-ip-body h2,
.tsw-p2 .p2-ip-h2{
  font-family:var(--p2-serif);font-weight:300;font-size:34px;line-height:1.12;
  letter-spacing:-.022em;color:var(--p2-navy);margin:0 0 16px;text-wrap:balance;
}
.tsw-p2 .p2-ip-body h3{
  font-family:var(--p2-serif);font-weight:400;font-size:21px;line-height:1.25;
  color:var(--p2-navy);
}
.tsw-p2 .p2-ip-body .pkg-block + .pkg-block{margin-top:44px}
.tsw-p2 .p2-ip-body .pkg-block > h2{margin-bottom:14px}

/* ---- Panels: the aside card and every form card ------------------------- */
.tsw-p2 .p2-ip-body .form-card,
.tsw-p2 .p2-ip-body .price-box,
.tsw-p2 .p2-ip-panel{
  background:#fff;border:1px solid var(--p2-line);border-radius:12px;padding:28px;
}
.tsw-p2 .p2-sec-ivory .p2-ip-body .form-card,
.tsw-p2 .p2-sec-ivory .p2-ip-panel{background:#fff}
.tsw-p2 .p2-ip-body .form-card + .form-card,
.tsw-p2 .p2-ip-body .price-box + .form-card{margin-top:20px}
.tsw-p2 .p2-ip-body .form-card > h2,
.tsw-p2 .p2-ip-body .form-card > h3,
.tsw-p2 .p2-ip-panel > h2,
.tsw-p2 .p2-ip-panel > h3{
  font-family:var(--p2-serif);font-weight:400;font-size:21px;line-height:1.2;
  color:var(--p2-navy);margin:0 0 14px;
}

/* ---- Forms: one control language, matching the Careers form ------------- *
   The lead form partial is shared with pages outside this system, so its
   markup is left exactly as it is and only restyled in here. */
.tsw-p2 .p2-ip-body .lead-form .form-grid{display:grid;gap:18px;grid-template-columns:repeat(2,minmax(0,1fr))}
.tsw-p2 .p2-ip-body .lead-form .field{display:grid;gap:8px;min-width:0}
.tsw-p2 .p2-ip-body .lead-form .field.full{grid-column:1/-1}
.tsw-p2 .p2-ip-body .lead-form .field label{
  font-size:13.5px;font-weight:600;letter-spacing:.01em;color:var(--p2-navy);
}
.tsw-p2 .p2-ip-body .lead-form .field .req{color:var(--p2-gold-text);font-weight:700}
.tsw-p2 .p2-ip-body .lead-form .field input,
.tsw-p2 .p2-ip-body .lead-form .field select,
.tsw-p2 .p2-ip-body .lead-form .field textarea{
  width:100%;max-width:100%;box-sizing:border-box;
  font-family:inherit;font-size:15px;color:var(--p2-ink);
  background:#fff;border:1px solid var(--p2-line);border-radius:6px;
  padding:0 14px;height:50px;
  transition:border-color .18s ease,box-shadow .18s ease;
}
.tsw-p2 .p2-ip-body .lead-form .field textarea{height:auto;min-height:120px;padding:13px 14px;line-height:1.6;resize:vertical}
.tsw-p2 .p2-ip-body .lead-form .field input::placeholder,
.tsw-p2 .p2-ip-body .lead-form .field textarea::placeholder{color:var(--p2-body);opacity:.72}
.tsw-p2 .p2-ip-body .lead-form .field select{appearance:none;-webkit-appearance:none;padding-right:42px;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235A6472' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat:no-repeat;background-position:right 14px center;background-size:16px}
.tsw-p2 .p2-ip-body .lead-form .field input:focus,
.tsw-p2 .p2-ip-body .lead-form .field select:focus,
.tsw-p2 .p2-ip-body .lead-form .field textarea:focus{
  outline:none;border-color:var(--p2-blue);box-shadow:0 0 0 3px rgba(17,30,142,.14);
}
.tsw-p2 .p2-ip-body .lead-form .field input:focus-visible,
.tsw-p2 .p2-ip-body .lead-form .field select:focus-visible,
.tsw-p2 .p2-ip-body .lead-form .field textarea:focus-visible{
  outline:2px solid var(--p2-gold);outline-offset:2px;
}
.tsw-p2 .p2-ip-body .lead-form .field-err{color:#B4232A;font-size:12.5px;font-weight:600}
.tsw-p2 .p2-ip-body .lead-form .hp{position:absolute;left:-9999px;width:1px;height:1px;opacity:0}

/* The form's own submit adopts the Phase 2 primary button. */
.tsw-p2 .p2-ip-body .lead-form button[type="submit"],
.tsw-p2 .p2-ip-body .lead-form .btn-primary{
  display:inline-flex;align-items:center;justify-content:center;gap:10px;width:100%;
  font-family:inherit;font-size:15px;font-weight:600;line-height:1.1;
  padding:16px 28px;border-radius:4px;border:1px solid transparent;
  background:var(--p2-blue);color:#fff;cursor:pointer;transition:background .18s ease;
}
.tsw-p2 .p2-ip-body .lead-form button[type="submit"]:hover{background:var(--p2-blue-dark)}
.tsw-p2 .p2-ip-body .lead-form button[type="submit"]:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}

/* ---- Alerts ------------------------------------------------------------- */
.tsw-p2 .p2-ip-body .alert{
  border-radius:8px;padding:14px 18px;font-size:14.5px;line-height:1.55;
  border:1px solid var(--p2-line);background:var(--p2-paper);color:var(--p2-navy);
  margin-bottom:22px;
}
.tsw-p2 .p2-ip-body .alert-success{border-color:#BFE3CE;background:#F1FAF4;color:#12603A}
.tsw-p2 .p2-ip-body .alert-error{border-color:#F0C9CB;background:#FDF3F3;color:#8E1B22}

/* ---- Accordion (FAQ, and the FAQ block on a package) -------------------- */
.tsw-p2 .p2-ip-body .accordion{border-top:1px solid var(--p2-line)}
.tsw-p2 .p2-ip-body .acc-item{border-bottom:1px solid var(--p2-line)}
.tsw-p2 .p2-ip-body .acc-q{
  width:100%;display:flex;align-items:center;justify-content:space-between;gap:24px;
  background:transparent;border:0;cursor:pointer;text-align:left;
  padding:22px 2px;font-family:var(--p2-serif);font-weight:400;
  font-size:19px;line-height:1.35;color:var(--p2-navy);
  transition:color .16s ease;
}
.tsw-p2 .p2-ip-body .acc-q:hover{color:var(--p2-blue)}
.tsw-p2 .p2-ip-body .acc-q:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 .p2-ip-body .acc-q .chev{
  flex:0 0 auto;color:var(--p2-gold-text);font-size:14px;line-height:1;
  transition:transform .22s ease;
}
.tsw-p2 .p2-ip-body .acc-item.open .acc-q .chev{transform:rotate(180deg)}
/* No bottom padding in the base rule: max-height:0 collapses the CONTENT of a
   closed row but not its padding, so a bottom pad here left a visible gap
   under every collapsed question. The open state adds it back below. */
.tsw-p2 .p2-ip-body .acc-a{font-size:15.5px;line-height:1.72;color:var(--p2-body);padding:0 2px;max-width:74ch}
.tsw-p2 .p2-ip-body .acc-a p{margin:0}

/* ---- Metadata chips ----------------------------------------------------- */
.tsw-p2 .p2-ip-body .chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:26px}
.tsw-p2 .p2-ip-body .chip{
  font-size:12.5px;font-weight:600;color:var(--p2-body);
  background:var(--p2-sand);border:1px solid var(--p2-line-warm);
  border-radius:999px;padding:7px 14px;line-height:1.2;
}

/* ---- Tick / cross lists ------------------------------------------------- */
.tsw-p2 .p2-ip-body .list-check{list-style:none;padding:0;margin:0;display:grid;gap:11px}
.tsw-p2 .p2-ip-body .list-check li{
  position:relative;padding-left:28px;font-size:15.5px;line-height:1.6;color:var(--p2-body);
}
/* The Phase 1 mark is a masked SVG tick filled with the success green. This
   recolours it rather than replacing it: an earlier attempt swapped in a
   border-drawn chevron but left the inherited background and mask in place,
   and the two treatments fought - the result was a small green fragment. Every
   property the frozen rule sets is therefore restated here. */
.tsw-p2 .p2-ip-body .list-check li::before{
  content:"";position:absolute;left:0;top:.18em;width:17px;height:17px;
  border:0;border-radius:0;transform:none;
  background:var(--p2-gold);
  -webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'><path d='M9 16.2l-3.5-3.5L4 14.2 9 19.2 20 8.2l-1.5-1.5z'/></svg>") center/78% no-repeat;
  mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'><path d='M9 16.2l-3.5-3.5L4 14.2 9 19.2 20 8.2l-1.5-1.5z'/></svg>") center/78% no-repeat;
}
/* Phase 1 renders an exclusion with the same tick in red, which reads as an
   inclusion at a glance. An exclusion gets a cross. */
.tsw-p2 .p2-ip-body .list-cross li::before{
  background:var(--p2-muted);
  -webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round'><path d='M6 6l12 12M18 6L6 18'/></svg>") center/62% no-repeat;
  mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round'><path d='M6 6l12 12M18 6L6 18'/></svg>") center/62% no-repeat;
}

/* ---- Itinerary day ------------------------------------------------------ */
.tsw-p2 .p2-ip-body .itin-day{
  position:relative;padding:0 0 24px 34px;border-left:1px solid var(--p2-line);margin-left:11px;
}
.tsw-p2 .p2-ip-body .itin-day:last-child{border-left-color:transparent;padding-bottom:0}
.tsw-p2 .p2-ip-body .itin-day .daynum{
  position:absolute;left:-11px;top:0;width:22px;height:22px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:var(--p2-navy);color:#fff;font-size:11px;font-weight:700;
}
.tsw-p2 .p2-ip-body .itin-day h4{
  font-family:var(--p2-serif);font-weight:400;font-size:18px;line-height:1.3;
  color:var(--p2-navy);margin:0 0 6px;
}
.tsw-p2 .p2-ip-body .itin-day p{font-size:15px;line-height:1.65;color:var(--p2-body)}

/* ---- Price box ---------------------------------------------------------- */
.tsw-p2 .p2-ip-body .price-box .from{
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-body);
}
.tsw-p2 .p2-ip-body .price-box .big{
  font-family:var(--p2-serif);font-weight:400;font-size:38px;line-height:1.1;
  letter-spacing:-.02em;color:var(--p2-navy);margin-top:4px;
}
.tsw-p2 .p2-ip-body .price-box .note{font-size:13px;color:var(--p2-body);margin-top:6px}
.tsw-p2 .p2-ip-body .price-box .card-tag{
  font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--p2-ink);background:var(--p2-gold-light);border-radius:3px;padding:4px 9px;
}

/* ---- Blog card ---------------------------------------------------------- *
   The listing card's proportions and metadata language, in a three-across
   editorial grid - so a blog card and a package card read as relatives. */
.tsw-p2 .p2-ip-bgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:26px}
.tsw-p2 a.p2-ip-bcard{
  display:flex;flex-direction:column;background:#fff;
  border:1px solid var(--p2-line);border-radius:6px;overflow:hidden;
  color:inherit;text-decoration:none;
  transition:border-color .18s ease,box-shadow .18s ease,transform .18s ease;
}
.tsw-p2 a.p2-ip-bcard:hover{
  border-color:var(--p2-gold);box-shadow:0 10px 26px rgba(7,18,40,.09);transform:translateY(-2px);
}
.tsw-p2 a.p2-ip-bcard:focus-visible{outline:2px solid var(--p2-gold);outline-offset:3px}
.tsw-p2 .p2-ip-bmedia{display:block;aspect-ratio:16/10;overflow:hidden;background:var(--p2-sand)}
.tsw-p2 .p2-ip-bmedia img{
  width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .7s cubic-bezier(.2,.6,.2,1);
}
.tsw-p2 a.p2-ip-bcard:hover .p2-ip-bmedia img{transform:scale(1.05)}
.tsw-p2 .p2-ip-bbody{display:flex;flex-direction:column;flex:1 1 auto;padding:20px 22px 22px}
.tsw-p2 .p2-ip-bcat{
  display:block;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-gold-text);margin-bottom:9px;
}
.tsw-p2 .p2-ip-btitle{
  display:block;font-family:var(--p2-serif);font-weight:400;font-size:21px;
  line-height:1.24;letter-spacing:-.01em;color:var(--p2-navy);margin-bottom:10px;
}
.tsw-p2 a.p2-ip-bcard:hover .p2-ip-btitle{color:var(--p2-blue)}
.tsw-p2 .p2-ip-bexc{
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  font-size:14px;line-height:1.6;color:var(--p2-body);margin-bottom:14px;
}
.tsw-p2 .p2-ip-bdate{
  margin-top:auto;padding-top:12px;border-top:1px solid var(--p2-line);
  font-size:12px;color:var(--p2-body);
}

/* ---- Empty state -------------------------------------------------------- */
.tsw-p2 .p2-ip-empty{
  text-align:center;padding:60px 28px;
  border:1px dashed var(--p2-line-warm);border-radius:8px;background:var(--p2-paper);
}
.tsw-p2 .p2-ip-empty-h{
  font-family:var(--p2-serif);font-weight:300;font-size:30px;line-height:1.1;
  color:var(--p2-navy);margin:0 0 10px;letter-spacing:-.02em;
}
.tsw-p2 .p2-ip-empty p{font-size:15px;line-height:1.65;color:var(--p2-body);margin:0 auto 22px;max-width:44ch}

/* ---- Centred single-message page (thank you, 404) ----------------------- */
.tsw-p2 .p2-ip-centre{
  min-height:52vh;display:flex;align-items:center;justify-content:center;text-align:center;
}
.tsw-p2 .p2-ip-centre-inner{max-width:620px;margin:0 auto}
.tsw-p2 .p2-ip-centre .p2-eyebrow{justify-content:center}
.tsw-p2 .p2-ip-centre-actions{
  display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:28px;
}
.tsw-p2 .p2-ip-mark{
  width:64px;height:64px;border-radius:50%;margin:0 auto 24px;
  display:flex;align-items:center;justify-content:center;
  background:var(--p2-sand);color:var(--p2-gold);
}
.tsw-p2 .p2-ip-mark svg{width:28px;height:28px}
/* The big ghost numeral. A contrast sweep flags it at 1.38:1, and that is
   correct arithmetic but the wrong conclusion: it is aria-hidden, it carries
   no information the page does not already state in its <h1> and its <title>,
   and darkening it to 3:1 would turn a watermark into a headline competing
   with the sentence that actually explains what happened. Left as decoration
   deliberately - WCAG 1.4.3 exempts incidental text - and noted here so the
   next sweep does not "fix" it. */
.tsw-p2 .p2-ip-code{
  font-family:var(--p2-serif);font-weight:300;font-size:88px;line-height:1;
  letter-spacing:-.03em;color:var(--p2-line-warm);margin:0 0 6px;
}

/* ---- Closing CTA band --------------------------------------------------- */
.tsw-p2 .p2-ip-ctaband{
  background:var(--p2-navy);border-radius:12px;padding:48px 44px;
  margin-top:56px;text-align:center;
}
.tsw-p2 .p2-ip-ctaband h2{
  font-family:var(--p2-serif);font-weight:300;font-size:32px;line-height:1.12;
  color:#fff;margin:0 0 12px;letter-spacing:-.02em;
}
.tsw-p2 .p2-ip-ctaband p{
  font-size:16px;line-height:1.65;color:rgba(255,255,255,.72);
  margin:0 auto 26px;max-width:52ch;
}

/* ---- Tablet ------------------------------------------------------------- */
@media(max-width:1023px){
  .tsw-p2 .p2-ip-hero{padding:52px 0 44px}
  .tsw-p2 .p2-ip-hero.has-img .p2-ip-hero-inner{padding:96px 0 44px}
  .tsw-p2 .p2-sec.p2-ip-sec{padding-top:30px}
  .tsw-p2 .p2-ip-layout{grid-template-columns:minmax(0,1fr);gap:40px}
  .tsw-p2 .p2-ip-aside{position:static}
  .tsw-p2 .p2-ip-bgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
}

/* ---- Phone -------------------------------------------------------------- */
@media(max-width:767px){
  .tsw-p2 .p2-ip-hero{padding:38px 0 32px}
  .tsw-p2 .p2-ip-hero.has-img .p2-ip-hero-inner{padding:72px 0 34px}
  .tsw-p2 .p2-sec.p2-ip-sec{padding-top:24px}
  .tsw-p2 .p2-ip-body .form-card,
  .tsw-p2 .p2-ip-body .price-box,
  .tsw-p2 .p2-ip-panel{padding:22px}
  .tsw-p2 .p2-ip-body .lead-form .form-grid{grid-template-columns:minmax(0,1fr)}
  .tsw-p2 .p2-ip-body h2,
  .tsw-p2 .p2-ip-h2{font-size:27px}
  .tsw-p2 .p2-ip-body .prose h2,
  .tsw-p2 .p2-ip-prose h2{font-size:26px}
  .tsw-p2 .p2-ip-body .acc-q{font-size:17px;padding:18px 2px;gap:16px}
  .tsw-p2 .p2-ip-bgrid{grid-template-columns:minmax(0,1fr);gap:16px}
  .tsw-p2 .p2-ip-ctaband{padding:34px 24px;margin-top:40px}
  .tsw-p2 .p2-ip-ctaband h2{font-size:25px}
  .tsw-p2 .p2-ip-code{font-size:64px}
  .tsw-p2 .p2-ip-body .price-box .big{font-size:32px}
}

@media(prefers-reduced-motion:reduce){
  .tsw-p2 .p2-ip-bmedia img,
  .tsw-p2 a.p2-ip-bcard,
  .tsw-p2 .p2-ip-body .acc-q .chev{transition:none}
  .tsw-p2 a.p2-ip-bcard:hover{transform:none}
  .tsw-p2 a.p2-ip-bcard:hover .p2-ip-bmedia img{transform:none}
}

/* ---- Inner-page odds and ends ------------------------------------------- */

/* A record with no photograph: the ink ground carries the type on its own.
   The scrim still paints, so the heading contrast is identical either way. */
.tsw-p2 .p2-ip-hero.has-img.is-noimg{background:var(--p2-ink)}

/* Direct-contact list in the Contact aside. */
.tsw-p2 .p2-ip-contact{list-style:none;padding:0;margin:0;display:grid;gap:16px}
.tsw-p2 .p2-ip-contact li{
  display:flex;align-items:flex-start;gap:12px;
  font-size:14.5px;line-height:1.55;color:var(--p2-body);
}
.tsw-p2 .p2-ip-contact svg{flex:0 0 17px;width:17px;height:17px;margin-top:2px;color:var(--p2-gold)}
.tsw-p2 .p2-ip-contact a{color:var(--p2-navy);font-weight:600}
.tsw-p2 .p2-ip-contact a:hover{color:var(--p2-blue)}

/* WhatsApp is a secondary action wherever it appears in a panel: the primary
   action is the form beside it, so it takes the outline button, not a third
   button colour of its own. */
.tsw-p2 a.p2-ip-wa{width:100%;margin-top:20px;padding:13px 20px;font-size:14.5px}

.tsw-p2 .p2-ip-panel-note{font-size:13.5px;line-height:1.6;color:var(--p2-body);margin:-6px 0 18px}
.tsw-p2 .p2-ip-ref{font-size:14.5px;color:var(--p2-body);margin:18px 0 0}
.tsw-p2 .p2-ip-ref strong{color:var(--p2-navy)}

/* Packages inside a destination or under a package: two of the listing card
   across in the main column, which is roughly the width it is designed for. */
.tsw-p2 .p2-ip-pkgs{margin-top:52px}
.tsw-p2 .p2-ip-pkgs-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.tsw-p2 .p2-ip-more{margin-top:64px}

/* /blog keeps the site's own pagination partial - restyled here only, because
   the same partial is rendered elsewhere. */
.tsw-p2 .p2-ip-body .pagination{
  display:flex;flex-wrap:wrap;gap:8px;justify-content:center;
  margin-top:48px;padding-top:30px;border-top:1px solid var(--p2-line);
}
.tsw-p2 .p2-ip-body .pagination a,
.tsw-p2 .p2-ip-body .pagination span{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:40px;min-height:40px;padding:0 12px;
  font-size:14px;font-weight:600;color:var(--p2-navy);
  border:1px solid var(--p2-line);border-radius:4px;background:transparent;
  transition:border-color .16s ease,background .16s ease,color .16s ease;
}
.tsw-p2 .p2-ip-body .pagination a:hover{border-color:var(--p2-navy)}
.tsw-p2 .p2-ip-body .pagination a:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 .p2-ip-body .pagination .current{
  background:var(--p2-navy);border-color:var(--p2-navy);color:#fff;
}

@media(max-width:1023px){
  .tsw-p2 .p2-ip-pkgs-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
}
@media(max-width:767px){
  .tsw-p2 .p2-ip-pkgs{margin-top:40px}
  .tsw-p2 .p2-ip-pkgs-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .tsw-p2 .p2-ip-more{margin-top:44px}
}

/* ---- Resets for what the Phase 1 rules still carry ---------------------- *
   Restyling a legacy class only changes the properties actually restated.
   Everything else the frozen rule sets survives - a box shadow, a full border,
   a margin, an absolutely positioned ::before. Each of those showed up as a
   visible artefact, so each is reset here rather than left to chance. The
   frozen definitions themselves are untouched; these only apply inside a
   converted page's .p2-ip-body. */

/* .acc-item ships a full border, a white ground, a radius and a bottom margin,
   which together drew a Phase 1 box around every Phase 2 accordion row. */
.tsw-p2 .p2-ip-body .acc-item{
  background:transparent;border:0;border-bottom:1px solid var(--p2-line);
  border-radius:0;margin-bottom:0;overflow:hidden;
}
/* The open/closed mechanism (max-height + overflow) is deliberately left as it
   is: that is what the site's accordion script drives. */
.tsw-p2 .p2-ip-body .acc-item.open .acc-a{padding-bottom:24px}

/* Both panels ship a Phase 1 drop shadow; Phase 2 panels are flat with a
   hairline. Both also ship a bottom margin that fought the grid gap. */
.tsw-p2 .p2-ip-body .form-card,
.tsw-p2 .p2-ip-body .price-box{box-shadow:none;margin-bottom:0}

/* .pkg-block ships margin-bottom:20px, which added to the 44px rhythm above. */
.tsw-p2 .p2-ip-body .pkg-block{margin-bottom:0}

/* .itin-day paints its own blue dot in a ::before. The Phase 2 treatment uses
   a numbered marker in .daynum instead, so the inherited dot is removed - it
   was drawing on top of the number. */
.tsw-p2 .p2-ip-body .itin-day::before{display:none}
.tsw-p2 .p2-ip-body .itin-day .daynum{letter-spacing:0;text-transform:none}

/* .field ships margin-bottom:14px, which doubled with the form grid's gap. */
.tsw-p2 .p2-ip-body .lead-form .field{margin-bottom:0}

/* ---- /travel/* card grids ------------------------------------------------ *
   The travel landing pages rendered the Phase 1 .grid-3 / .card components,
   which is why a package looked like one thing there and another thing on
   /packages. They now render the same Phase 2 destination tile and listing
   card as the rest of the site; these are the grids those cards need.

   Four destination tiles across matches /destinations. Packages go five across
   here because the section has the full container width - no sidebar - which
   is the width the listing card is designed for. */
.tsw-p2 .p2-tx-dgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:22px}
.tsw-p2 .p2-tx-pgrid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:18px}

/* The ladders match the pages these components come from, so the same tile
   never shows four across here and two across on /destinations at one width:
   destinations drop to two at 1024 exactly as /destinations does, and packages
   drop to two below 1240 exactly as /packages does. */
@media(max-width:1239px){
  .tsw-p2 .p2-tx-pgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
}
@media(max-width:1024px){
  .tsw-p2 .p2-tx-dgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
}
@media(max-width:767px){
  .tsw-p2 .p2-tx-dgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
  .tsw-p2 .p2-tx-pgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
}

/* ---- /destinations search ------------------------------------------------ *
   Deliberately light: one field, one button, sitting above the category tabs.
   A listing page earns a sidebar; an index of nine destinations does not, and
   a large search panel here would compete with the grid it exists to serve.
   It reuses the field language the packages sidebar already established. */
.tsw-p2 .p2-dest-search{display:block;margin-bottom:22px}
.tsw-p2 .p2-dest-search-l{
  display:block;font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--p2-navy);margin-bottom:9px;
}
.tsw-p2 .p2-dest-search-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.tsw-p2 .p2-dest-search-field{position:relative;display:block;flex:0 1 380px;min-width:0}
.tsw-p2 .p2-dest-search-field svg{
  position:absolute;left:12px;top:50%;transform:translateY(-50%);
  width:15px;height:15px;color:var(--p2-muted);pointer-events:none;
}
.tsw-p2 .p2-dest-search-field input{
  width:100%;box-sizing:border-box;font-family:inherit;font-size:14.5px;
  color:var(--p2-navy);background:var(--p2-paper);
  border:1px solid var(--p2-line);border-radius:4px;
  padding:0 14px 0 34px;height:44px;
}
.tsw-p2 .p2-dest-search-field input::placeholder{color:var(--p2-muted)}
.tsw-p2 .p2-dest-search-field input:focus{
  outline:none;border-color:var(--p2-blue);box-shadow:0 0 0 3px rgba(17,30,142,.14);
}
.tsw-p2 .p2-dest-search-field input:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 .p2-dest-search-go{
  flex:0 0 auto;font-family:inherit;font-size:13.5px;font-weight:600;
  color:var(--p2-navy);background:transparent;
  border:1px solid var(--p2-navy);border-radius:4px;
  min-height:44px;padding:0 20px;cursor:pointer;
  transition:background .16s ease,color .16s ease;
}
.tsw-p2 .p2-dest-search-go:hover{background:var(--p2-navy);color:#fff}
.tsw-p2 .p2-dest-search-go:focus-visible{outline:2px solid var(--p2-gold);outline-offset:2px}
.tsw-p2 a.p2-dest-search-clear{
  flex:0 0 auto;font-size:13px;font-weight:600;color:var(--p2-body);
  text-decoration:underline;text-underline-offset:3px;
  min-height:44px;display:inline-flex;align-items:center;padding:0 4px;
}
.tsw-p2 a.p2-dest-search-clear:hover{color:var(--p2-blue)}
.tsw-p2 .p2-dest-search-hint{font-size:11.5px;line-height:1.45;color:var(--p2-body);margin:8px 0 0}

/* The search empty state reuses the page's own empty block, plus a heading -
   "nothing matched" and "nothing published" are different situations and read
   differently, but they should not look like two different designs. */
.tsw-p2 .p2-dest-empty-h{
  font-family:var(--p2-serif);font-weight:300;font-size:30px;line-height:1.1;
  letter-spacing:-.02em;color:var(--p2-navy);margin:0 0 10px;
}

@media(max-width:767px){
  .tsw-p2 .p2-dest-search{margin-bottom:18px}
  .tsw-p2 .p2-dest-search-field{flex:1 1 100%}
  .tsw-p2 .p2-dest-search-row{gap:8px}
  .tsw-p2 .p2-dest-search-go{flex:1 1 auto}
  .tsw-p2 .p2-dest-empty-h{font-size:25px}
}

/* ==========================================================================
   Brand palette — the Phase 1 remnants
   ==========================================================================
   The public site still renders a handful of Phase 1 components, and the most
   prominent of them is the header's "Get a Free Quote" CTA, which appears on
   every page. They take their colour from --tsw-primary, declared in the
   frozen block at the top of this file.

   Those tokens are re-declared here rather than edited there. The frozen block
   stays byte-identical (md5 17eccab5a262ebeeadf699bc7e3bd057), a later
   declaration simply wins, and the result is one brand blue across the whole
   public site instead of a header button in the old azure beside Phase 2
   buttons in the brand indigo.

   website.css is loaded only by the public layout, so nothing in the admin,
   the portal or the supplier area is reached by this.
   ========================================================================== */
/* The token re-declarations that used to sit here have moved to brand.css,
   which every layout loads after this file and which now carries the whole
   brand ramp. Two stylesheets declaring --tsw-primary was exactly the
   duplication this phase exists to remove. The frozen block above is still
   never edited - brand.css wins the same way this block used to. */

/* The top bar's gradient is hard-coded in the frozen block, so it is restated
   here on the new navy. The two ends keep their original relationship. */
.tsw-topbar{background:linear-gradient(180deg,#08152F 0%,#0C1E45 100%)}

/* The Phase 1 button glows are hard-coded rgba of the old blue, inside the
   frozen block. Restated here so a brand-navy button does not carry an azure
   shadow. The Phase 2 focus rings above were re-hued the same way. */
.header-cta .btn-primary{box-shadow:0 6px 18px rgba(17,30,142,.28)}
.header-cta .btn-primary:hover{box-shadow:0 10px 26px rgba(17,30,142,.4)}
.quickbar .field input:focus{box-shadow:0 0 0 3px rgba(17,30,142,.12)}
.quickbar-submit{box-shadow:0 10px 22px rgba(17,30,142,.32)}
.quickbar-submit:hover{box-shadow:0 14px 28px rgba(17,30,142,.42)}

/* The lettermark tile is the fallback the header draws only when no logo has
   been uploaded to the CMS - TripSkyWay has one, so this is never on screen
   here. Re-hued anyway: its ground was a tint of the old azure, and a fresh
   install should not open on an off-brand badge. The glyph inside already
   follows --tsw-primary. */
.tsw-logo-mark{background:var(--tsw-primary-050)}

/* ---- The skip link had never been visible ------------------------------- *
   Found by the contrast sweep, and it predates this pass: the frozen block
   sets `.skip-link{background:var(--tsw-primary);color:#fff}` at (0,1,0), but
   the generic `.tsw a{color:var(--tsw-primary)}` above it is (0,1,1) and wins.
   The link therefore painted the brand blue on the brand blue - 1:1 - so the
   one affordance a keyboard user reaches first was invisible when focused.
   It read the same way before the palette moved (#0B5FFF on #0B5FFF); only
   the hex changed. Restated here at (0,1,1) so it can actually win. */
.tsw a.skip-link{color:#fff}
.tsw a.skip-link:focus{outline:2px solid var(--p2-gold,#FFA500);outline-offset:2px}

/* ==========================================================================
   Cookie consent  (public site only - the admin has no tracking to consent to)
   ==========================================================================
   Built from the existing tokens, so it inherits the brand automatically:
   brand.css re-points --tsw-primary to the navy after this file loads.

   A bar, not a modal. It does not overlay the page, trap focus or block
   navigation - the visitor can keep reading and decide later. Everything is
   prefixed .tsw-consent-*; no global selector is introduced.

   Accept and Reject share one class on purpose. Same size, same weight, same
   colour: refusing has to be exactly as easy as agreeing.
   ========================================================================== */
.tsw-consent{
  position:fixed;left:0;right:0;bottom:0;z-index:120;
  background:var(--tsw-white);border-top:1px solid var(--tsw-line);
  box-shadow:var(--tsw-shadow-lg);
  /* The panel can grow taller than a phone; cap it and scroll inside rather
     than pushing content off-screen. */
  max-height:85vh;overflow-y:auto;
}
/* .tsw-consent sets a display, which would otherwise beat the UA rule for the
   hidden attribute and leave the bar permanently on screen. */
.tsw-consent[hidden]{display:none}
.tsw-consent-inner{
  max-width:var(--tsw-container);margin:0 auto;padding:18px 20px;
  display:flex;flex-wrap:wrap;align-items:flex-start;gap:16px 24px;
}
.tsw-consent-body{flex:1 1 320px;min-width:0}
/* Two classes, not one. The banner's headings are a real <h2>/<h3> for the
   document outline, but `.tsw h2` (0,1,1) would otherwise win on specificity
   and render the bar's title at the 37.6px page-heading size with a matching
   margin. Scoping under .tsw-consent takes it to (0,2,0). */
.tsw-consent .tsw-consent-title{
  font-size:1.05rem;font-weight:800;color:var(--tsw-ink);
  line-height:1.3;letter-spacing:normal;margin:0 0 4px;
}
.tsw-consent-text{margin:0;font-size:.925rem;color:var(--tsw-body);line-height:1.55}
.tsw-consent-actions{
  flex:0 1 auto;display:flex;flex-wrap:wrap;align-items:center;gap:10px;
}
.tsw-consent-btn{
  font:inherit;font-size:.9rem;font-weight:700;line-height:1.2;
  padding:11px 18px;min-height:44px;   /* a comfortable touch target */
  border:1px solid var(--tsw-primary);border-radius:var(--tsw-radius-sm);
  background:var(--tsw-primary);color:#fff;cursor:pointer;
  transition:background .18s ease,color .18s ease;
}
.tsw-consent-btn:hover{background:var(--tsw-primary-dark);border-color:var(--tsw-primary-dark);color:#fff}
.tsw-consent-btn-outline{background:transparent;color:var(--tsw-primary)}
.tsw-consent-btn-outline:hover{background:var(--tsw-primary);color:#fff}

/* ---- Preferences panel -------------------------------------------------- */
.tsw-consent-prefs{
  flex:1 1 100%;min-width:0;
  border-top:1px solid var(--tsw-line);margin-top:4px;padding-top:16px;
}
.tsw-consent-prefs[hidden]{display:none}
.tsw-consent .tsw-consent-subtitle{
  font-size:.95rem;font-weight:800;color:var(--tsw-ink);
  line-height:1.3;letter-spacing:normal;margin:0 0 12px;
}
.tsw-consent-subtitle:focus-visible{outline:3px solid var(--tsw-primary);outline-offset:3px;border-radius:6px}
.tsw-consent-list{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;margin-bottom:16px}
@media (min-width:860px){
  /* minmax(0,...) not 1fr: a 1fr track's auto minimum is its content's
     min-content, so a long description would widen the track past the bar. */
  .tsw-consent-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px 24px}
}
.tsw-consent-row{min-width:0}
.tsw-consent-rowhead{display:flex;align-items:center;gap:9px;margin-bottom:4px}
.tsw-consent-check{width:17px;height:17px;flex:0 0 auto;accent-color:var(--tsw-primary);cursor:pointer}
.tsw-consent-check:disabled{cursor:default}
.tsw-consent-label{
  font-size:.9rem;font-weight:700;color:var(--tsw-ink);cursor:pointer;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.tsw-consent-check:disabled + .tsw-consent-label{cursor:default}
.tsw-consent-always{
  font-size:.7rem;font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--tsw-body);background:var(--tsw-bg-soft);
  border:1px solid var(--tsw-line);border-radius:999px;padding:2px 8px;
}
.tsw-consent-desc{margin:0;font-size:.83rem;line-height:1.5;color:var(--tsw-body)}

@media (max-width:640px){
  .tsw-consent-inner{padding:16px;gap:14px}
  .tsw-consent-actions{width:100%}
  /* The two decisions share one row, still 44px tall and still identical to
     each other. Stacking all three cost a whole button's height and pushed the
     collapsed bar to 57% of a 375x667 screen; side by side it is 49%. */
  .tsw-consent-actions .tsw-consent-btn{flex:1 1 calc(50% - 5px);padding:11px 12px}
  .tsw-consent-actions .tsw-consent-btn-outline{flex:1 1 100%}
  .tsw-consent-prefs .tsw-consent-btn{width:100%}
}

/* ---- Footer entry point ------------------------------------------------- */
/* Matches .foot-legal a exactly, so the row reads as one set of links even
   though this one is a button (it opens a control, it does not navigate). */
.tsw-foot .foot-legal-btn{
  display:inline-block;padding:0;margin:0;border:0;background:none;
  font:inherit;font-size:13.5px;color:rgba(255,255,255,.6);cursor:pointer;
  transition:color .18s ease;
}
.tsw-foot .foot-legal-btn:hover{color:#fff}
@media (max-width:640px){
  .tsw-foot .foot-legal-btn{padding:9px 2px}
}
