/* ==========================================================================
   corporate.traveda.com — Traveda for Business app chrome (corp-*)
   VOC's three-zone flow (sidebar / topbar / content) in Traveda's language:
   deep-evergreen sidebar, brass accents, parchment ground, Fraunces + Inter.
   ========================================================================== */

@font-face { font-family: 'Fraunces'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('/assets/corp/fonts/fraunces.woff2') format('woff2'); }
@font-face { font-family: 'Fraunces'; font-style: italic; font-weight: 100 900; font-display: swap;
  src: url('/assets/corp/fonts/fraunces-italic.woff2') format('woff2'); }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('/assets/corp/fonts/inter.woff2') format('woff2'); }

:root {
  --ink: #1E1B16;
  --evergreen: #0B211B;
  --evergreen-hi: #16342C;
  --brass: #C8A24B;
  --brass-text: #84682B;
  --ivory: #F5F1E8;
  --parchment: #FBF9F4;
  --paper: #FFFFFF;
  --muted: #5C665F;
  --hairline: rgba(24, 36, 32, .14);
  --hairline-dark: rgba(245, 241, 232, .16);
  --ok: #2E6B4F;
  --bad: #8C3B2E;
  /* Status chips carry their own background/foreground pair, so they have to be
     tokens too — a pale-green chip keeps its dark green text and would be
     unreadable the moment the surface under it goes dark. */
  --ok-bg: #EDF3EE;
  --ok-ink: #2E5B44;
  --bad-bg: #F7ECE9;
  --bad-ink: #8C3B2E;
  --warn-ink: #7A5B1E;
  --brass-numeral: #A07C2E;
  --brass-hi: #D4AF5E;
  --side-active: #EAD9AC;
  --evergreen-deep: #08170F;
  /* A primary button's fill is NOT the same role as the sidebar's surface, even
     though they are the same colour on parchment. On a dark ground an evergreen
     fill is darker than the card it sits on, so the button reads as a hole
     punched in the page rather than a raised control. */
  --btn-fill: #0B211B;
  --btn-fill-hi: #16342C;
  --btn-ink: #F5F1E8;
  /* A note surface that sits slightly WARMER than --paper. Swapping it to
     --paper would have been token-safe and would have thrown away the thing it
     was for, so it keeps its own token and a warm value in both themes. */
  --paper-warm: #FDFAF2;
  --serif: 'Fraunces', Georgia, serif;
  --sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
  --side-w: 232px;
  --topbar-h: 72px;
  --radius: 10px;
  /* One rhythm for the whole app: every gap, pad and stack step comes from
     here, so sections line up instead of being nudged per page. */
  --s1: 4px;  --s2: 8px;   --s3: 12px; --s4: 16px;
  --s5: 24px; --s6: 32px;  --s7: 48px; --s8: 64px;
  --shadow: 0 1px 2px rgba(24,36,32,.05), 0 8px 28px rgba(24,36,32,.07);
}

* { box-sizing: border-box; }
/* ---------- dark ----------------------------------------------------------
   The palette is redefined by ROLE, not re-skinned per component: every rule in
   these five stylesheets already draws its colour from a token, so the whole app
   turns over here. Two properties are deliberately preserved rather than
   inverted:

   - brass stays the brand accent. It is lifted a little because #C8A24B against
     a near-black ground reads muddier than it does on parchment.
   - --ivory stays light. It means "text on a dark surface" and is already
     correct in both themes; inverting it would break the sidebar and every
     brass button, which were dark-on-dark to begin with.

   Status chips carry their own bg/ink pair, so each gets a dark equivalent —
   a pale-green chip with dark green text is unreadable on a dark card. */
:root[data-theme="dark"] {
  --ink: #ECE7DC;
  --parchment: #12181A;
  --paper: #1A2124;
  --ivory: #F5F1E8;
  --evergreen: #0E2620;
  --evergreen-hi: #17392F;
  --evergreen-deep: #060F0C;
  --muted: #9BA8A2;
  --brass: #D9B65F;
  --brass-hi: #E8CC85;
  --brass-text: #D9B65F;
  --brass-numeral: #E0C170;
  --side-active: #F0DFB4;
  /* Lighter than --paper, so a button sits ON the card rather than in it. */
  --btn-fill: #2C3A34;
  --btn-fill-hi: #3A4C44;
  --btn-ink: #F5F1E8;
  --paper-warm: #1F2622;
  --hairline: rgba(236, 231, 220, .16);
  --hairline-dark: rgba(236, 231, 220, .16);
  --ok: #6FCF97;
  --ok-bg: rgba(111, 207, 151, .14);
  --ok-ink: #8FE0B0;
  --bad: #E88A78;
  --bad-bg: rgba(232, 138, 120, .14);
  --bad-ink: #F0A796;
  --warn-ink: #E3C57E;
  --shadow: 0 1px 2px rgba(0,0,0,.4), 0 8px 28px rgba(0,0,0,.45);
}

/* The browser's own widgets — form controls, scrollbars, the date picker —
   follow this, so an input does not render as a white slab on a dark page. */
:root[data-theme="dark"] { color-scheme: dark; }
:root:not([data-theme="dark"]) { color-scheme: light; }

/* The theme toggle sits in the sidebar's account nav and has to read as one of
   those links, not as a button dropped into a list of links. */
.corp-themetoggle {
  /* Matches `.corp-side-foot nav a` exactly — same size, tracking, case and
     colour — because it sits inside that nav and any difference reads as a
     mistake rather than as a different kind of control. */
  display: inline-block; margin-right: 12px; background: none; border: 0; padding: 0;
  font: 600 10.5px/2 var(--sans); letter-spacing: .12em; text-transform: uppercase;
  color: rgba(245,241,232,.65); cursor: pointer;
}
.corp-themetoggle:hover { color: var(--ivory); }
.corp-themetoggle:focus-visible { outline: 2px solid var(--brass); outline-offset: 2px; }

html, body { margin: 0; padding: 0; }
body {
  font: 400 15px/1.6 var(--sans); color: var(--ink); background: var(--parchment);
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; }
img { max-width: 100%; }
button { font: inherit; }

.corp-skip {
  position: absolute; left: -9999px; top: 0; z-index: 200;
  background: var(--evergreen); color: var(--ivory); padding: 10px 16px; border-radius: 0 0 8px 0;
}
.corp-skip:focus { left: 0; }

/* One focus treatment for the entire app — brass ring, never removed. */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--brass); outline-offset: 2px; border-radius: 4px;
}

/* ---------- app frame ---------- */
.corp-app { display: grid; grid-template-columns: var(--side-w) minmax(0, 1fr); min-height: 100vh; }

/* ---------- sidebar ---------- */
.corp-side {
  background: linear-gradient(180deg, var(--evergreen) 0%, var(--evergreen-deep) 100%); color: var(--ivory);
  display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh;
  border-right: 1px solid rgba(200,162,75,.14);
}
.corp-side::after { /* the club grain, 3% */
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .04;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)'/%3E%3C/svg%3E");
}
.corp-side > * { position: relative; z-index: 1; }
.corp-wordmark {
  font: 500 25px/1 var(--serif); letter-spacing: .01em; color: var(--ivory);
  text-decoration: none; display: block; padding: 30px 24px 24px;
}
.corp-wordmark small {
  display: block; margin-top: 8px; font: 600 9.5px/1 var(--sans);
  letter-spacing: .3em; text-transform: uppercase; color: var(--brass);
}
.corp-wordmark::after {
  content: ""; display: block; width: 28px; height: 1px;
  background: var(--brass); margin-top: 16px; opacity: .75;
}
.corp-navtoggle { display: none; }
.corp-nav { flex: 1; padding: 6px 0; }
.corp-nav a {
  display: flex; align-items: center; gap: 10px;
  padding: 13px 24px; text-decoration: none;
  font: 600 11px/1.3 var(--sans); letter-spacing: .16em; text-transform: uppercase;
  color: rgba(245, 241, 232, .7); border-left: 2px solid transparent;
  transition: color .15s ease, background .15s ease;
}
.corp-nav a:hover { color: var(--ivory); background: rgba(245,241,232,.04); }
/* The glyph is what makes a twelve-item list of uppercase words scannable —
   without it every row is the same shape and finding "Expense" means reading
   all of them. Dimmer than the label so it guides rather than shouts. */
.corp-nav-ico { flex: none; opacity: .62; transition: opacity .15s ease; }
.corp-nav a:hover .corp-nav-ico { opacity: .9; }
.corp-nav a[aria-current="page"] .corp-nav-ico { opacity: 1; }
.corp-nav a[aria-current="page"] {
  color: var(--side-active); border-left-color: var(--brass);
  background: linear-gradient(90deg, rgba(200,162,75,.16), rgba(200,162,75,0) 78%);
}
.corp-nav .corp-nav-sep {
  margin: 14px 24px; border: 0; border-top: 1px solid var(--hairline-dark);
}
/* These three sit on the evergreen sidebar in BOTH themes, so this is not a
   dark-mode fix — they were under AA (2.6-3.4:1) since before the palette
   work. .50 is the least that clears 4.5:1 against the lightest point of
   the gradient; the nav links above are .70, so these stay the quieter
   tier they were meant to be. */
.corp-nav .corp-nav-label {
  display: block; padding: 8px 24px 6px;
  font: 600 9px/1 var(--sans); letter-spacing: .26em; text-transform: uppercase;
  color: rgba(245,241,232,.5);
}
.corp-side-foot { padding: 16px 24px 20px; border-top: 1px solid var(--hairline-dark); }

/* Traveda's own products. Quieter than the primary nav on purpose: these are
   things we sell to the customer, not tools they work in, and they used to sit
   in the middle of the working nav. */
.corp-side-more { display: block; margin: 0 0 16px; }
.corp-side-more-label {
  display: block; margin-bottom: 8px;
  font: 600 8.5px/1 var(--sans); letter-spacing: .26em; text-transform: uppercase;
  color: rgba(245,241,232,.5);
}
/* ⚠ `.corp-side-foot nav a` sets uppercase for the account links and this block
   is a <nav> inside that foot, so that rule matches at (0,1,2) and beat a bare
   `.corp-side-more a` at (0,1,1). Qualify with the parent to outrank it —
   these are a different kind of link and must not inherit the shout. */
.corp-side-foot .corp-side-more a {
  display: block; margin-right: 0; padding: 5px 0; text-decoration: none;
  font: 400 12.5px/1.45 var(--sans); letter-spacing: 0; text-transform: none;
  color: rgba(245,241,232,.55);
}
.corp-side-foot .corp-side-more a:hover { color: var(--ivory); }
.corp-side-foot .corp-side-more a[aria-current="page"] { color: var(--side-active); }
.corp-side-user { font: 500 15px/1.35 var(--serif); letter-spacing: .01em; color: var(--ivory); margin: 0 0 2px; }
.corp-side-co { font: 400 12px/1.4 var(--sans); color: rgba(245,241,232,.55); margin: 0 0 10px; }
.corp-side-foot nav a {
  display: inline-block; margin-right: 12px; text-decoration: none;
  font: 600 10.5px/2 var(--sans); letter-spacing: .12em; text-transform: uppercase;
  color: rgba(245,241,232,.65);
}
.corp-side-foot nav a:hover { color: var(--ivory); }
.corp-side-legal { margin-top: 8px; font: 400 11px/1.6 var(--sans); color: rgba(245,241,232,.5); }
.corp-side-legal a { color: rgba(245,241,232,.55); }

/* ---------- main column ---------- */
.corp-main { min-width: 0; display: flex; flex-direction: column; }
.corp-content { flex: 1; padding: clamp(20px, 3vw, 36px); }
.corp-content--flush { padding: 0; }

/* page head */
.corp-h1 { font: 500 clamp(24px, 2.4vw, 30px)/1.2 var(--serif); letter-spacing: -.01em; margin: 0 0 6px; }
.corp-h1 em { font-style: italic; font-weight: 400; }
.corp-sub { color: var(--muted); margin: 0 0 22px; max-width: 620px; }
.corp-eyebrow {
  display: block; font: 600 10.5px/1 var(--sans); letter-spacing: .22em;
  text-transform: uppercase; color: var(--brass-text); margin-bottom: 10px;
}

/* ---------- cards / panels ---------- */
.corp-card {
  background: var(--paper); border: 1px solid var(--hairline);
  border-radius: var(--radius); box-shadow: var(--shadow);
}
.corp-card--pad { padding: clamp(18px, 2.4vw, 28px); }

/* ---------- forms ---------- */
.corp-field { margin-bottom: 16px; }
.corp-field label { display: block; font: 600 12px/1.4 var(--sans); margin-bottom: 6px; }
/* Fields read as fields: a tinted well with a defined edge. A white input on a
   white card is invisible — it looks like an empty box, not something to type
   in. Focus lifts the well to paper so the active field is the brightest thing
   on the page. */
.corp-input, .corp-select, .corp-textarea {
  width: 100%; padding: 11px 12px; border-radius: 8px;
  border: 1px solid var(--hairline); border-bottom-color: rgba(24, 36, 32, .26);
  background: var(--parchment); font: 400 14px/1.4 var(--sans); color: var(--ink);
  transition: background .12s ease, border-color .12s ease;
}
.corp-input::placeholder, .corp-textarea::placeholder { color: var(--muted); opacity: .75; }
.corp-input:hover, .corp-select:hover, .corp-textarea:hover { border-color: rgba(24, 36, 32, .3); }
.corp-input:focus, .corp-select:focus, .corp-textarea:focus {
  outline: 2px solid var(--brass); outline-offset: 1px;
  border-color: var(--brass); background: var(--paper);
}
.corp-select { appearance: none; -webkit-appearance: none; padding-right: 30px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%235C665F' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 12px center; }
.corp-btn {
  display: inline-block; border: 0; cursor: pointer; text-decoration: none; text-align: center;
  background: var(--btn-fill); color: var(--btn-ink);
  font: 600 12px/1 var(--sans); letter-spacing: .12em; text-transform: uppercase;
  padding: 14px 22px; border-radius: 999px;
}
.corp-btn:hover { background: var(--btn-fill-hi); }
.corp-btn--brass { background: var(--brass); color: var(--evergreen); }
.corp-btn--brass:hover { background: var(--brass-hi); }
.corp-btn--ghost { background: transparent; color: var(--ink); border: 1px solid var(--hairline); }
.corp-btn--ghost:hover { border-color: var(--ink); background: transparent; }
.corp-btn[disabled] { opacity: .5; cursor: not-allowed; }
.corp-note { font: 400 12.5px/1.6 var(--sans); color: var(--muted); }
.corp-error {
  background: var(--bad-bg); border: 1px solid rgba(140,59,46,.3); color: var(--bad);
  border-radius: 8px; padding: 10px 14px; margin-bottom: 16px; font-size: 13.5px;
}
.corp-flash {
  background: var(--ok-bg); border: 1px solid rgba(46,107,79,.3); color: var(--ok);
  border-radius: 8px; padding: 10px 14px; margin-bottom: 16px; font-size: 13.5px;
}

/* ---------- auth (login/register) — editorial photo ground ---------- */
.corp-auth {
  min-height: 100vh; display: grid; grid-template-columns: 1.15fr .95fr;
  background: var(--evergreen);
}
.corp-auth-brand {
  color: var(--ivory); position: relative; overflow: hidden;
  display: flex; flex-direction: column; justify-content: space-between;
  padding: clamp(28px, 4vw, 56px);
}
.corp-auth-brand::before { /* licensed photo under an evergreen scrim */
  content: ""; position: absolute; inset: 0; z-index: 0;
  background: url('/assets/corp/img/about-editorial.webp') center 40% / cover no-repeat;
}
.corp-auth-brand::after { /* scrim + grain live on one layer */
  content: ""; position: absolute; inset: 0; z-index: 1;
  background:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23n)' opacity='.05'/%3E%3C/svg%3E"),
    linear-gradient(112deg, rgba(8, 23, 15, .94) 0%, rgba(11, 33, 27, .72) 46%, rgba(11, 33, 27, .38) 100%),
    linear-gradient(0deg, rgba(8, 23, 15, .55) 0%, rgba(8, 23, 15, 0) 45%);
}
.corp-auth-brand > * { position: relative; z-index: 2; }
.corp-auth-kicker { font: 600 10px/1 var(--sans); letter-spacing: .3em; text-transform: uppercase; color: var(--brass); }
.corp-auth-brand h2 {
  font: 480 clamp(34px, 3.6vw, 56px)/1.08 var(--serif); letter-spacing: -.02em;
  margin: 0 0 18px; max-width: 520px; text-wrap: balance;
}
.corp-auth-brand h2 em { font-style: italic; font-weight: 400; color: var(--brass); }
.corp-auth-brand p { color: rgba(245, 241, 232, .78); max-width: 400px; font-size: 15px; line-height: 1.7; }
.corp-auth-ticks {
  display: flex; flex-wrap: wrap; gap: 10px 0; align-items: center; margin: 26px 0 0; padding: 0;
  list-style: none; font: 600 10.5px/1 var(--sans); letter-spacing: .2em; text-transform: uppercase;
  color: rgba(245, 241, 232, .82);
}
.corp-auth-ticks li { display: flex; align-items: center; }
.corp-auth-ticks li + li::before {
  content: ""; width: 4px; height: 4px; border-radius: 50%; background: var(--brass);
  margin: 0 14px; flex: none;
}
.corp-auth-panel {
  display: flex; align-items: center; justify-content: center;
  padding: clamp(24px, 4vw, 56px); background: var(--parchment); position: relative;
}
.corp-auth-panel > div {
  width: min(420px, 100%); background: var(--parchment);
}
/* On the wide layout the card sits ON the parchment panel, so it cannot also BE
   parchment — same-on-same left it defined by its drop shadow alone, which is
   what made it read as floating. Paper on parchment is what every other card in
   this product does (.tm-card, .cp-folio, .cp-ledger); the login card was the
   one exception. */
@media (min-width: 861px) {
  .corp-auth-panel > div { background: var(--paper); }
}
/* The folio frame. This used to carry translateX(clamp(-150px,-8vw,-60px)) to
   float the form over the seam between the photo and the parchment — but a
   transform moves the paint, not the layout box, so the card was centred in its
   column and THEN dragged left. Measured: at 1920 it overlapped the photo by
   0px and left a 374px dead gap on its right; at 1440, 0px and 231px. It never
   reached the seam at any common width — it just sat off-centre, which reads as
   a box floating loose rather than a deliberate frame. Centred in its own
   column, the card and its shadow do the framing on their own. */
@media (min-width: 861px) {
  .corp-auth-panel > div {
    border: 1px solid var(--hairline); border-radius: 14px;
    box-shadow: 0 2px 6px rgba(8, 23, 15, .12), 0 24px 64px rgba(8, 23, 15, .22);
    padding: clamp(28px, 2.6vw, 40px);
  }
}
.corp-auth-panel .corp-h1 { font-size: clamp(26px, 2.2vw, 32px); }
.corp-auth-rule { width: 30px; height: 2px; background: var(--brass); border: 0; margin: 0 0 18px; }

/* ---------- top search bar ---------- */
.corp-topbar {
  height: auto; min-height: var(--topbar-h);
  background: var(--paper); border-bottom: 1px solid var(--hairline);
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 12px clamp(14px, 2vw, 24px); position: sticky; top: 0; z-index: 60;
}
.corp-topbar .corp-tb-item { display: flex; align-items: center; gap: 8px; }
.corp-tb-dest { position: relative; flex: 1 1 240px; min-width: 200px; }
.corp-tb-dest input { width: 100%; }
.corp-tb-dates input { width: 118px; }
.corp-tb-num { width: 118px; }
.corp-tb-go {
  width: 46px; height: 46px; border-radius: 50%; border: 0; cursor: pointer;
  background: var(--evergreen); color: var(--ivory); font-size: 18px; line-height: 1;
}
.corp-tb-go:hover { background: var(--evergreen-hi); }

/* typeahead dropdown */
.corp-ta {
  position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 80;
  background: var(--paper); border: 1px solid var(--hairline); border-radius: 10px;
  box-shadow: var(--shadow); max-height: 320px; overflow-y: auto;
}
.corp-ta button {
  display: block; width: 100%; text-align: left; background: none; border: 0;
  padding: 10px 14px; cursor: pointer; font: 400 14px/1.4 var(--sans);
}
.corp-ta button:hover, .corp-ta button.is-hi { background: var(--ivory); }
.corp-ta small { color: var(--muted); margin-left: 6px; }

/* ---------- search page layout ---------- */
.corp-search-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 42%); min-height: calc(100vh - var(--topbar-h)); }
/* Before a search there is nothing to map. Give the width back to the content. */
.corp-search-body.is-nomap { grid-template-columns: minmax(0, 1fr); }
.corp-search-body.is-nomap > .corp-pane { display: none; }
.corp-results { padding: clamp(14px, 2vw, 22px); min-width: 0; }
.corp-results-head { display: flex; align-items: baseline; gap: 14px; flex-wrap: wrap; margin-bottom: 12px; }
.corp-results-head h1 { font: 500 20px/1.2 var(--serif); margin: 0; }
.corp-results-head .corp-note { margin-left: auto; }
.corp-notice {
  background: var(--ok-bg); border: 1px solid rgba(46,107,79,.25); color: var(--ok-ink);
  border-radius: 8px; padding: 9px 14px; margin-bottom: 14px; font-size: 13px;
}
.corp-empty { text-align: center; padding: 12vh 20px; }
.corp-empty h2 { font: 500 clamp(22px, 2.4vw, 30px)/1.25 var(--serif); margin: 0 0 8px; }
.corp-empty h2 strong { color: var(--brass-numeral); }
.corp-empty p { color: var(--muted); }

.corp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 14px; }
.corp-hotel {
  background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--radius);
  overflow: hidden; cursor: pointer; text-align: left; padding: 0; display: flex; flex-direction: column;
}
.corp-hotel:hover { box-shadow: var(--shadow); border-color: rgba(24,36,32,.28); }
.corp-hotel.is-active { outline: 2px solid var(--brass); }
.corp-hotel figure { margin: 0; aspect-ratio: 16/10; background: var(--ivory); }
.corp-hotel figure img { width: 100%; height: 100%; object-fit: cover; display: block; }
.corp-hotel .corp-hotel-meta { padding: 12px 14px 14px; display: flex; flex-direction: column; gap: 6px; flex: 1; }
.corp-hotel h3 { font: 600 14.5px/1.35 var(--sans); margin: 0; }
/* ⚠ Raw --brass on a white card is 2.41:1 — it fails AA for text (4.5) and
   also fails 1.4.11 for a graphical object carrying meaning (3.0). Stars are
   information, not decoration, so they take the text variant. --brass stays
   correct on the dark sidebar, where it measures 6.99:1. */
.corp-stars { color: var(--brass-text); font-size: 12px; letter-spacing: 2px; }
.corp-chips { display: flex; flex-wrap: wrap; gap: 5px; }
.corp-chip {
  font: 500 10.5px/1 var(--sans); color: var(--muted);
  background: var(--ivory); border-radius: 4px; padding: 4px 7px;
}
/* Wraps because a card can now carry two badges — a policy verdict and the
   company's own preferred marker — and a rigid row clipped the second one and
   forced the price to break mid-figure. */
.corp-hotel-price {
  margin-top: auto; display: flex; align-items: baseline; justify-content: space-between;
  flex-wrap: wrap; gap: 6px 8px;
}
.corp-hotel-price strong { white-space: nowrap; }
.corp-hotel-price .corp-note { font-size: 12px; }
.corp-hotel-price strong { font: 600 16px/1 var(--sans); }

.corp-pager { display: flex; gap: 6px; justify-content: center; margin: 18px 0 6px; }
.corp-pager button {
  min-width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--hairline);
  background: var(--paper); cursor: pointer; font: 600 12.5px/1 var(--sans);
}
.corp-pager button[aria-current="page"] { background: var(--evergreen); color: var(--ivory); border-color: var(--evergreen); }

/* right pane: map / hotel / checkout */
.corp-pane {
  border-left: 1px solid var(--hairline); background: var(--paper);
  position: sticky; top: var(--topbar-h); height: calc(100vh - var(--topbar-h));
  overflow-y: auto; min-width: 0;
}
#pane-map { height: 100%; }
#corp-map { height: 100%; min-height: 300px; }
.corp-map-pill {
  background: var(--evergreen); color: var(--ivory); border-radius: 999px;
  font: 600 11.5px/1 var(--sans); padding: 6px 10px; white-space: nowrap;
  box-shadow: 0 2px 8px rgba(24,36,32,.35); border: 1px solid rgba(245,241,232,.25);
}
.corp-map-pill.is-active { background: var(--brass); color: var(--evergreen); }

.corp-pane-inner { padding: clamp(16px, 2vw, 26px); }
.corp-pane-back {
  background: none; border: 0; cursor: pointer; color: var(--muted);
  font: 600 11px/1 var(--sans); letter-spacing: .14em; text-transform: uppercase;
  padding: 0 0 14px; display: inline-flex; align-items: center; gap: 6px;
}
.corp-pane-back:hover { color: var(--ink); }
.corp-gallery { position: relative; border-radius: var(--radius); overflow: hidden; aspect-ratio: 16/9; background: var(--ivory); }
.corp-gallery img { width: 100%; height: 100%; object-fit: cover; display: block; }
.corp-gallery .corp-gal-nav {
  position: absolute; top: 50%; transform: translateY(-50%);
  width: 36px; height: 36px; border-radius: 50%; border: 0; cursor: pointer;
  background: rgba(30,27,22,.55); color: var(--ivory); font-size: 15px;
}
.corp-gallery .corp-gal-nav:hover { background: rgba(30,27,22,.75); }
.corp-gal-prev { left: 10px; } .corp-gal-next { right: 10px; }
.corp-gal-count {
  position: absolute; right: 10px; bottom: 10px; background: rgba(30,27,22,.55);
  color: var(--ivory); font: 500 11px/1 var(--sans); border-radius: 999px; padding: 5px 9px;
}
.corp-pane h2 { font: 500 22px/1.25 var(--serif); margin: 16px 0 4px; }
.corp-addr { color: var(--muted); font-size: 13px; margin: 0 0 8px; }
.corp-desc { font-size: 13.5px; color: var(--ink); }
.corp-policies { font-size: 13px; color: var(--muted); }
.corp-policies strong { color: var(--ink); }

.corp-rooms { margin-top: 18px; border-top: 1px solid var(--hairline); }
.corp-room {
  display: flex; align-items: center; gap: 12px; padding: 13px 2px;
  border-bottom: 1px solid var(--hairline);
}
.corp-room-name { font: 600 13.5px/1.4 var(--sans); }
.corp-room-board { font-size: 12px; color: var(--muted); }
.corp-room-cxl { font-size: 11.5px; color: var(--ok); }
.corp-room-cxl.is-nonref { color: var(--bad); }
.corp-room-price { margin-left: auto; text-align: right; }
.corp-room-price strong { font-size: 15px; }
.corp-room .corp-btn { padding: 10px 16px; }

/* checkout */
.corp-summary {
  background: var(--ivory); border-radius: var(--radius); padding: 14px 16px; margin-bottom: 18px;
}
.corp-summary dl { display: grid; grid-template-columns: auto 1fr; gap: 4px 14px; margin: 0; font-size: 13px; }
.corp-summary dt { color: var(--muted); }
.corp-summary dd { margin: 0; font-weight: 600; }
.corp-total { display: flex; justify-content: space-between; align-items: baseline; border-top: 1px solid var(--hairline); margin-top: 10px; padding-top: 10px; }
.corp-total strong { font: 600 18px/1 var(--sans); }
.corp-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 14px; }
.corp-form-grid .corp-field--full { grid-column: 1 / -1; }
.corp-h3 { font: 600 12px/1 var(--sans); letter-spacing: .16em; text-transform: uppercase; color: var(--brass-text); margin: 20px 0 12px; }

/* confirmation */
.corp-confirm { text-align: center; padding: 8vh 20px; }
.corp-confirm h2 { font: 500 26px/1.2 var(--serif); margin: 12px 0 6px; }
.corp-confirm .corp-ref { font: 600 15px/1 var(--sans); color: var(--brass-text); }

/* ---------- bookings page ---------- */
.corp-split { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 20px; align-items: start; }
.corp-list { display: flex; flex-direction: column; }
.corp-list-item {
  display: flex; gap: 12px; align-items: center; text-align: left; width: 100%;
  background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--radius);
  padding: 14px 16px; margin-bottom: 10px; cursor: pointer;
}
.corp-list-item:hover { box-shadow: var(--shadow); }
.corp-list-item.is-active { outline: 2px solid var(--brass); }
.corp-badge {
  font: 600 10px/1 var(--sans); letter-spacing: .1em; text-transform: uppercase;
  border-radius: 999px; padding: 5px 9px; background: var(--ivory); color: var(--muted);
}
.corp-badge--ok { background: var(--ok-bg); color: var(--ok); }
.corp-badge--bad { background: var(--bad-bg); color: var(--bad); }
.corp-badge--warn { background: rgba(200,162,75,.18); color: var(--warn-ink); }

/* ---------- support ---------- */
.corp-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px; margin-bottom: 26px; }
.corp-tile { text-align: center; padding: 22px 16px; }
.corp-tile .corp-eyebrow { margin-bottom: 6px; }
.corp-tile p { margin: 4px 0 0; font-size: 13px; color: var(--muted); }
.corp-tile a { color: var(--ink); font-weight: 600; text-decoration: none; }
.corp-tile a:hover { text-decoration: underline; }
.corp-notices .corp-card { margin-bottom: 14px; }
.corp-notices h3 { margin: 0 0 4px; font: 600 16px/1.3 var(--sans); }
.corp-notices time { font-size: 12px; color: var(--muted); }

/* ---------- pillar pages ---------- */
.corp-pillars { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 14px; }
.corp-theme-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; margin: 18px 0; }
.corp-theme {
  border: 1px solid var(--hairline); border-radius: 8px; padding: 12px 14px; background: var(--paper);
  font: 600 13px/1.4 var(--sans); cursor: pointer;
}
.corp-theme input { margin-right: 8px; accent-color: var(--brass); }
.corp-theme small { display: block; font-weight: 400; color: var(--muted); }

/* dream weeks browser */
.corp-dw-filters { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 16px; }
.corp-dw-filters .corp-select, .corp-dw-filters .corp-input { width: auto; min-width: 180px; }
.corp-resort figure { aspect-ratio: 16/10; }

/* ---------- responsive ---------- */
@media (max-width: 1100px) {
  .corp-search-body { grid-template-columns: 1fr; }
  .corp-pane { position: fixed; inset: 0; z-index: 90; height: 100vh; border-left: 0; display: none; }
  .corp-pane.is-open { display: block; }
  /* ⚠ minmax(0, 1fr), not 1fr. `1fr` means `minmax(auto, 1fr)`, and auto keeps a
     grid item from shrinking below its own content — so the ledger stayed at its
     content width and pushed the page 30px past a 320px viewport (WCAG 1.4.10).
     The desktop rule above already used minmax(0, …); this override dropped it. */
  .corp-split { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 860px) {
  /* The sidebar becomes a two-line header: wordmark + account on top, the nav
     as one horizontally scrollable rail. It was consuming 230px of vertical
     space before a phone user saw any content. */
  .corp-app { grid-template-columns: 1fr; }
  .corp-side {
    position: sticky; top: 0; z-index: 70; height: auto;
    display: grid; grid-template-columns: auto 1fr; grid-template-areas: "mark acct" "nav nav";
    align-items: center; column-gap: var(--s3);
    padding: 0 var(--s4);
  }
  .corp-wordmark { grid-area: mark; padding: var(--s3) 0; font-size: 20px; }
  .corp-wordmark small { margin-top: 4px; letter-spacing: .24em; font-size: 8.5px; }
  .corp-wordmark::after { display: none; }

  /* A real menu, not a rail. The rail put eight of twelve destinations behind a
     swipe with no affordance; this shows all of them, grouped, in one tap. */
  .corp-navtoggle {
    grid-area: nav; display: flex; align-items: center; gap: 9px; width: 100%;
    background: none; border: 0; border-top: 1px solid var(--hairline-dark);
    margin-inline: calc(-1 * var(--s4)); padding: 13px var(--s4);
    color: rgba(245,241,232,.8); cursor: pointer;
    font: 600 10.5px/1 var(--sans); letter-spacing: .18em; text-transform: uppercase;
  }
  .corp-navtoggle-here {
    margin-left: auto; color: rgba(245,241,232,.5); letter-spacing: .08em;
    text-transform: none; font-weight: 400; font-size: 12px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 55%;
  }
  .corp-app.is-navopen .corp-navtoggle { color: var(--ivory); }

  .corp-nav {
    grid-area: nav; display: none; flex-direction: column; padding: 4px 0 10px;
    border-top: 1px solid var(--hairline-dark);
    margin-inline: calc(-1 * var(--s4)); padding-inline: 0;
    max-height: min(70vh, 560px); overflow-y: auto;
  }
  .corp-app.is-navopen .corp-nav { display: flex; }
  .corp-nav a {
    border-left: 2px solid transparent; border-bottom: 0;
    padding: 12px var(--s4); white-space: nowrap; background: none;
  }
  .corp-nav a[aria-current="page"] {
    border-left-color: var(--brass);
    background: linear-gradient(90deg, rgba(200,162,75,.16), rgba(200,162,75,0) 78%);
  }
  .corp-nav .corp-nav-label { padding-inline: var(--s4); }
  .corp-nav .corp-nav-sep { margin-inline: var(--s4); }
  /* The toggle occupies the nav row; the open panel needs its own row below it. */
  .corp-side { grid-template-areas: "mark acct" "nav nav" "menu menu"; }
  .corp-navtoggle { grid-area: nav; }
  .corp-nav { grid-area: menu; }
  .corp-side-more { display: none; }      /* reachable from Profile, not worth the width */

  .corp-side-foot {
    grid-area: acct; border-top: 0; padding: 0; text-align: right;
    display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
  }
  .corp-side-user { font-size: 13px; margin: 0; }
  .corp-side-co { display: none; }
  .corp-side-foot nav a { margin: 0 0 0 var(--s3); font-size: 9.5px; }
  .corp-side-legal { display: none; }

  .corp-auth { grid-template-columns: 1fr; }
  .corp-auth-brand { min-height: 200px; }
}

/* ---------- the search page's empty stage ----------
   It was a headline, five hardcoded leisure cities and then a large void. The
   void is now the traveller's own next trips, which is the most useful thing
   that can sit on a page they land on every day. */

.corp-next {
  max-width: 560px; margin: 40px auto 0; padding-top: 26px;
  border-top: 1px solid var(--hairline); text-align: left;
}
.corp-next-lab {
  font: 600 9.5px/1 var(--sans); letter-spacing: .24em; text-transform: uppercase;
  color: var(--brass-text); margin: 0 0 6px;
}
.corp-next-row {
  display: flex; align-items: baseline; gap: 16px; padding: 13px 2px;
  border-bottom: 1px solid var(--hairline); text-decoration: none; color: inherit;
}
.corp-next-row:last-child { border-bottom: 0; }
.corp-next-row:hover { background: var(--parchment); }
.corp-next-when { flex: none; width: 58px; }
.corp-next-when strong { display: block; font: 500 15px/1.2 var(--serif); color: var(--ink); }
.corp-next-when small { display: block; font: 400 11px/1.4 var(--sans); color: var(--muted); }
.corp-next-what { min-width: 0; flex: 1; }
.corp-next-what strong {
  display: block; font: 400 15px/1.35 var(--sans); color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.corp-next-what small { display: block; font: 400 12px/1.5 var(--sans); color: var(--muted); }
.corp-next-flag {
  flex: none; font: 600 9px/1 var(--sans); letter-spacing: .14em; text-transform: uppercase;
  color: var(--bad); border: 1px solid rgba(140,59,46,.35); background: rgba(140,59,46,.06);
  padding: 5px 8px 4px; border-radius: 3px; white-space: nowrap;
}

/* ---------- unused airline credit ----------
   Money the company already owns, shown where somebody is about to spend more.
   Brass rather than green: it is an opportunity, not a confirmation, and it
   cannot be spent here — the copy has to carry that and the styling must not
   contradict it. */
.corp-credit {
  max-width: 460px; margin: 26px auto 0; padding: 18px 20px 16px;
  border: 1px solid rgba(200,162,75,.45); border-radius: var(--radius);
  background: rgba(200,162,75,.07); text-align: left;
}
.corp-credit-lab {
  font: 600 9.5px/1 var(--sans); letter-spacing: .22em; text-transform: uppercase;
  color: var(--brass-text); margin: 0 0 6px;
}
.corp-credit-sum { font: 500 26px/1.1 var(--serif); color: var(--ink); margin: 0 0 10px; }
.corp-credit-list { list-style: none; margin: 0 0 12px; padding: 0; }
.corp-credit-list li {
  font: 400 13.5px/1.7 var(--sans); color: var(--ink);
  padding: 5px 0; border-bottom: 1px solid rgba(200,162,75,.22);
}
.corp-credit-list li:last-child { border-bottom: 0; }
.corp-credit-list strong { font-weight: 600; }
.corp-credit-exp { color: var(--muted); font-size: 12.5px; }
.corp-credit-exp.is-soon { color: var(--bad); font-weight: 500; }
.corp-credit-note { font: 400 12.5px/1.65 var(--sans); color: var(--muted); margin: 0; }

/* ---------- reduced motion ----------
   Someone who has asked their system for less motion has usually asked for a
   reason — vestibular disorders, migraine, or simply wanting a still page.
   Transitions and transforms are decoration here; nothing in this product
   conveys meaning through movement, so all of it can go without losing
   anything. Kept to near-zero rather than 0 so transitionend still fires. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
  /* Lifts and nudges are the motion people actually notice on hover. */
  .corp-suggest-pill:hover, .corp-route-pill:hover, .corp-hotel:hover,
  .corp-tb-go:hover, .cp-region:hover, .cp-gal-item:hover { transform: none !important; }
}
