/* Good Time To Go — the one stylesheet. Every colour is a token; every token
   is contrast-measured. Zero hex literals in components (§15 of the pack). */
@font-face{
  font-family:'Fraunces';
  src:url('/fonts/fraunces-latin.woff2') format('woff2-variations');
  font-weight:600 800;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC,U+2122,U+2212;
}
:root{
  /* Native widget chrome — select popups, date pickers, checkboxes, scrollbars,
     autofill — is drawn by the BROWSER, not this stylesheet. color-scheme is how
     the page tells it which way to draw them; without it, dark mode gets a
     browser-default popup with the page's light text painted into it, which is
     the illegible dropdown Philip photographed on /countries. Mirrored in all
     three theme blocks exactly like the variables. */
  color-scheme:light;
  --brand:#0FA3A3; --brand-ink:#0A6B6B; --brand-deep:#075252;
  --accent:#F0A202; --accent-ink:#8F5A00;
  /* ── THE GROUND, and it is the bigger half of "boring in light mode" ──────
     18 Aug 2026, with Claude Design. I had diagnosed the map's dark fills. The
     other half, and the larger one: PURE WHITE IS THE ENEMY. On white a fill has
     to go dark to be seen at all, and dark is where chroma dies. Off white, the
     same fill can sit at mid-lightness where chroma actually lives - so the ground
     has to move before the fills can.
     The old --surf #F4F7F7 failed for two reasons: it was 1% off white, so it was
     not a real step, and it was COOL. A surface has to be a real step and a warm
     one. Warm paper is also half of "travel-inspired", which is substantially a
     warm feeling rather than a subject. */
  --ink:#14201F; --muted:#5A6B6B; --bg:#FAF8F4; --surf:#F1EDE4; --line:#6E8686;
  --line-soft:#E2DDD3;
  --good:#1D6639; --good-bg:#DCF2E4;
  --cheap:#8F5A00; --cheap-bg:#FCEFCE;
  --avoid:#A6321F; --avoid-bg:#FAE3DE;
  /* AREA FILLS, a different job from the three above - 18 Aug 2026. Philip:
     "especially when I open it and I look at it in LIGHT MODE. It's just so boring."
     The diagnosis: --good/--cheap/--avoid were chosen to pass 4.5:1 as TEXT, then
     used to fill whole COUNTRIES on the world map. A country is not text. Dark
     forest, brown and brick across a white map is exactly the drab it looked. Dark
     mode never had the problem because its three are already vivid, which is why the
     same map looks alive there.
     Splitting them is safe HERE AND NOWHERE ELSE, because the site's standing rule is
     that COLOUR NEVER CARRIES MEANING ALONE - every state also has a glyph and words -
     so a fill owes legibility, not text contrast. Text keeps --good/--cheap/--avoid. */
  /* TEAL IS PROMOTED: it stops being decoration and becomes the "good" state.
     The identity colour and the primary data state are the same thing - which is
     the name of the site. Amber becomes a data hue (the cheap sweet spot), which
     is why it can no longer also be the button. */
  /* The FINAL set from the handoff, not the first proposal. Claude Design
     recomputed these against both the paper AND the land tone so every fill
     clears 3:1 as a graphical object (WCAG 1.4.11) on either ground - the
     first set cleared paper and not land. Deliberately NOT recording the
     ratios here: it published them as literal text on its own handoff frame
     and every palette change silently invalidated them. A number in a comment
     rots. Recompute from the hexes if you need it. */
  /* cheap-fill recomputed 18 Aug 2026 (BRAND-PACKAGE.md): hue 38->42, saturation
     to 100% - as golden as the contrast guard allows. 3.70:1 on paper, 3.04:1 on
     land, both verified independently twice. Lightness had no headroom. */
  --good-fill:#0B8C8C; --cheap-fill:#AA7700; --avoid-fill:#C4441F;
  --land-fill:#E7E2D6;
  --sp-xs:16px; --sp-sm:28px; --sp-md:52px; --sp-lg:88px;
  --r-chip:8px; --r-btn:10px; --r-card:14px;
  --display:'Fraunces',Georgia,'Times New Roman',serif;
  --body:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    color-scheme:dark;
    --ink:#E6EDED; --muted:#9BB0B0; --bg:#0E1414; --surf:#151E1E; --line:#5F7878; --brand-deep:#125A5A;
    --line-soft:#2A3838;
    --brand-ink:#0FA3A3; --accent-ink:#F0A202;
    --good:#4ADE80; --good-bg:#12301F;
    --cheap:#FBBF24; --cheap-bg:#332608;
    --avoid:#F87171; --avoid-bg:#3A1512;
    --good-fill:#2BD4D4; --cheap-fill:#FBBF24; --avoid-fill:#FF7A5C;
    --land-fill:#17403F;
  }
}
[data-theme="dark"]{
  color-scheme:dark;
  --ink:#E6EDED; --muted:#9BB0B0; --bg:#0E1414; --surf:#151E1E; --line:#5F7878; --brand-deep:#125A5A;
  --line-soft:#2A3838;
  --brand-ink:#0FA3A3; --accent-ink:#F0A202;
  --good:#4ADE80; --good-bg:#12301F;
  --cheap:#FBBF24; --cheap-bg:#332608;
  --avoid:#F87171; --avoid-bg:#3A1512;
  --good-fill:#2BD4D4; --cheap-fill:#FBBF24; --avoid-fill:#FF7A5C;
  --land-fill:#17403F;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation:none!important;transition:opacity .01ms!important}
}
body{margin:0;background:var(--bg);color:var(--ink);font:16px/1.65 var(--body);
  -webkit-font-smoothing:antialiased}
.wrap{max-width:1120px;margin:0 auto;padding:0 20px}
a{color:var(--brand-ink)}
:focus-visible{outline:2px solid var(--line);outline-offset:2px;border-radius:4px}
.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- header ---------- */
header.site{position:sticky;top:0;background:var(--bg);z-index:30;
  border-bottom:1px solid transparent;transition:border-color .2s}
header.site.stuck{border-bottom-color:var(--line)}
.bar{display:flex;align-items:center;gap:14px;min-height:64px}
.lockup{display:flex;align-items:center;gap:10px;text-decoration:none;color:inherit;margin-right:auto}
.lockup svg{flex:0 0 auto}
.lockstack{display:flex;flex-direction:column;gap:1px}
/* THE tagline (BRAND-PACKAGE.md): permanent brand furniture beside the wordmark.
   Never a page H1, never a campaign headline. Hidden on narrow navs - the
   wordmark carries the nav alone below ~600px. */
.lockup .tagline{font-size:10.5px;color:var(--muted);letter-spacing:.01em;white-space:nowrap}
@media (max-width:600px){ .lockup .tagline{display:none} }
.name{font-family:var(--display);font-weight:800;font-size:19px;letter-spacing:-.02em;
  color:var(--brand-ink);white-space:nowrap}
nav.main{display:flex;gap:4px;align-items:center}
nav.main a{color:var(--ink);text-decoration:none;font-weight:650;font-size:14.5px;
  padding:9px 11px;border-radius:var(--r-chip)}
nav.main a:hover{background:var(--surf)}
nav.main a[aria-current="page"]{color:var(--brand-ink);background:var(--surf)}
.themebtn{background:none;border:1px solid var(--line);color:var(--ink);border-radius:var(--r-btn);
  width:40px;height:40px;cursor:pointer;display:grid;place-items:center;font-size:16px;flex:0 0 auto}
/* ---------- the menu on small screens ----------
   MEASURED, 9 Aug 2026, not guessed: the six links need 365px, and the bar has
   218px at 320px wide rising to 378px at 480px. So "Method" and the whole
   light/dark button were pushed off the right of every phone screen, and at 600px
   it was worse still because the wordmark reappears at 561px and takes the room
   back. Below 700px the links now live behind a button.
   A real <button aria-expanded>, not <details>/<summary>: browsers auto-open a
   collapsed <details> during find-in-page, so the menu would spring open when
   someone searched the page, and removing the disclosure triangle (which any
   hamburger must) breaks state announcement in several screen readers.
   With JavaScript off, the <noscript> block in the head puts the links back as a
   wrapping row, so nothing is ever unreachable. */
.navtoggle{display:none;background:none;border:1px solid var(--line);color:var(--ink);
  border-radius:var(--r-btn);width:40px;height:40px;cursor:pointer;place-items:center;
  flex:0 0 auto;padding:0}
.navtoggle:hover{border-color:var(--brand-ink)}
.navtoggle[aria-expanded="true"]{background:var(--surf);border-color:var(--brand-ink)}
@media(max-width:700px){
  .bar{position:relative}
  .navtoggle{display:grid}
  nav.main{position:absolute;top:100%;left:0;right:0;z-index:31;display:none;
    flex-direction:column;align-items:stretch;gap:2px;
    padding:8px 0 14px;background:var(--bg);border-bottom:1px solid var(--line)}
  nav.main[data-open]{display:flex}
  nav.main a{padding:12px 10px;font-size:15.5px}
}
@media(max-width:380px){
  .name{display:none}
}

/* ---------- type ---------- */
h1{font-family:var(--display);font-weight:800;letter-spacing:-.02em;line-height:1.1;
  font-size:clamp(30px,4.6vw,44px);margin:0 0 14px}
h2.sec{font-family:var(--display);font-size:clamp(22px,3.2vw,30px);font-weight:700;
  letter-spacing:-.015em;margin:0 0 6px}
.eyebrow{font-size:11.5px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);
  font-weight:700;margin:0 0 8px}
.lede{font-size:clamp(16.5px,2vw,19px);color:var(--muted);max-width:46ch;margin:0 0 22px}
.secsub{color:var(--muted);margin:0 0 20px;max-width:62ch}
.prose{max-width:68ch}
.prose p{margin:0 0 14px}
.num{font-variant-numeric:tabular-nums}

/* ---------- buttons & forms ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:var(--r-btn);
  padding:12px 18px;font:inherit;font-weight:650;text-decoration:none;cursor:pointer;
  border:1px solid transparent;min-height:44px}
.btn.primary{background:var(--brand-ink);color:var(--bg)}
.btn.primary:hover{filter:brightness(1.08)}
.btn.ghost{background:none;color:var(--ink);border-color:var(--line)}
.btn.ghost:hover{background:var(--surf)}
/* The "Continue with Google" button, to Google's own branding spec (their 2023 neutral
   theme: white fill, #747775 border, #1F1F1F text, the four-colour G at 18px), with
   their documented dark variant below. Philip's ask, 13 Aug 2026: the first version was
   a plain ghost button and "felt a little bit fake" — he was right, and Google publishes
   exactly what this should look like, so it looks like that. The G's four colours are
   fixed by their guidelines and must never be recoloured to match the site. */
.gbtn{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  background:#fff;border:1px solid #747775;border-radius:var(--r-btn);
  padding:11px 16px;min-height:44px;font:inherit;font-weight:600;color:#1f1f1f;
  text-decoration:none;cursor:pointer}
.gbtn:hover{background:#f8f9fa}
.gbtn svg{flex:0 0 18px}
[data-theme="dark"] .gbtn{background:#131314;border-color:#8e918f;color:#e3e3e3}
[data-theme="dark"] .gbtn:hover{background:#1e1f20}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]) .gbtn{background:#131314;border-color:#8e918f;color:#e3e3e3}
  :root:not([data-theme="light"]) .gbtn:hover{background:#1e1f20}}
label.f{display:block;font-weight:650;font-size:14px;margin:0 0 6px}
/* Deliberately broad: the /tools inputs are bare <input> and <input type=date>,
   which the old [type=text],[type=search] selector missed — so they kept a white
   browser-default background in dark mode while the selects beside them went dark. */
/* .ordtemp is excluded for the same reason a checkbox is: this rule dresses a
   field as a FORM BOX, and the reader's temperature is not a form box — it is a
   word inside a sentence-shaped door ("the label carries the number; the number
   is the editor", Claude Design, 24 Aug 2026). Excluding it here beats fighting
   this rule's specificity from a class, which is what four :not()s are worth. */
input:not([type=checkbox]):not([type=radio]):not([type=button]):not([type=submit]):not(.ordtemp),
select{width:100%;min-height:46px;font:inherit;color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:var(--r-chip);padding:10px 12px}
/* lets the native date picker and its icon follow the theme too */
@media (prefers-color-scheme:dark){html:not([data-theme="light"]) input[type=date]{color-scheme:dark}}
/* THE POPUP IS THE BROWSER'S; THE OPTIONS ARE OURS — 21 Aug 2026, sitewide and
   permanent. Philip photographed the sentence tokens' dropdown in dark mode:
   Chromium drew its popup white while the options inherited the theme's pale
   ink and the sentence's 26px display serif — giant pale rows on white.
   color-scheme is declared in all three theme blocks and did NOT protect the
   popup, and a transparent select hands it no author background either. So
   every option carries its own colours and its own quiet typography: readable
   in both themes whatever base any browser derives. The popup is a system
   moment, not the sentence — body face, 16px, no echo of the token's register.
   Safari and iOS ignore option styling and draw their own readable pickers —
   this rule is inert there BY DESIGN; do not "fix" Safari later.
   deploy-gttg.sh's option guard asserts this rule exists, so a refactor cannot
   drop it silently. */
select option{color:var(--ink);background:var(--bg);font-family:var(--body);font-size:16px;font-weight:400}
select optgroup{color:var(--ink);background:var(--bg);font-family:var(--body);font-size:13px;font-style:normal}
select option:disabled{color:var(--muted)}
select:-webkit-autofill{-webkit-text-fill-color:var(--ink)}
input::placeholder{color:var(--muted)}
.field{margin-bottom:14px}

/* ---------- cards ---------- */
.card{border:1px solid var(--line-soft);border-radius:var(--r-card);background:var(--bg);padding:20px}
.card.surface{background:var(--surf)}
.tiny{font-size:13px;color:var(--muted)}
.small{font-size:14.5px}

/* Commercial links. The label is deliberately not subtle: the ASA's objection in
   MailOnline (2022) was that a reader could reach the click without having seen the
   disclosure, so this sits before the link in reading order and is sized to be read
   rather than skimmed past. It uses the "cheap" colour pair because that is already
   the site's money colour and it inherits the dark theme for free. Do not restyle it
   to be quieter. */
.adtag{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;line-height:1;padding:4px 6px;margin-right:7px;
  border-radius:4px;background:var(--cheap-bg);color:var(--cheap);
  vertical-align:baseline;white-space:nowrap}
.adlink{text-decoration:underline;text-underline-offset:2px}

/* ---------- month strip ---------- */
.months{display:grid;grid-template-columns:repeat(12,1fr);gap:5px}
@media(max-width:640px){.months{grid-template-columns:repeat(6,1fr)}}
.m{border-radius:var(--r-chip);padding:8px 2px;text-align:center;font-size:12.5px;font-weight:700;
  display:flex;flex-direction:column;align-items:center;gap:2px;min-height:48px;justify-content:center}
.m .g{font-size:13px;line-height:1}
.m.good{background:var(--good-bg);color:var(--good)}
.m.cheap{background:var(--cheap-bg);color:var(--cheap)}
.m.avoid{background:var(--avoid-bg);color:var(--avoid)}
.m.mid{background:transparent;color:var(--muted);border:1px solid var(--line-soft)}
.key{display:flex;gap:14px;flex-wrap:wrap;margin-top:12px;font-size:13px;color:var(--muted)}
.key b{color:var(--ink)}
.verdict{font-size:15px;font-weight:650;margin:12px 0 2px}
.updated{font-size:12.5px;color:var(--muted);margin-top:8px}
.updated a{color:var(--muted)}

/* mini strip on cards — decorative duplicate of the verdict text, aria-hidden */
/* A card mini needs one fixed point, not twelve labels: the notch. The eye then
   counts two or three cells to the coloured block instead of seven. */
.mini{display:flex;gap:2px;margin:8px 0 6px;align-items:flex-end;height:13px}
.mini i{flex:1;height:8px;border-radius:2px;background:var(--surf);border:1px solid var(--line-soft)}
.mini i.now{height:13px}
/* The seasonal strip is a row of filled BARS, so it takes the area colours too -
   same argument as the map, and it keeps the two reading as one system. Claude
   Design's point, 18 Aug: the month strip and the map should share a visual
   language, or the site looks like two products. */
.mini i.good{background:var(--good-fill);border-color:var(--good-fill)}
.mini i.cheap{background:var(--cheap-fill);border-color:var(--cheap-fill)}
.mini i.avoid{background:var(--avoid-fill);border-color:var(--avoid-fill)}

/* ---------- hero ---------- */
.hero{display:grid;gap:26px;padding:30px 0 34px;align-items:start}
@media(min-width:920px){.hero{grid-template-columns:45fr 55fr;gap:44px;padding:44px 0 40px}}
.hero .free{font-size:13.5px;color:var(--muted);margin:14px 0 0}
.switch{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 14px}
.switch button{font:inherit;font-weight:650;font-size:13.5px;border:1px solid var(--line);
  background:none;color:var(--ink);border-radius:999px;padding:8px 13px;cursor:pointer;min-height:38px}
.switch button[aria-pressed="true"]{background:var(--brand-ink);color:var(--bg);border-color:var(--brand-ink)}
#stripwrap{transition:opacity .12s ease}
.suggest{font-size:13px;color:var(--muted);margin-top:6px}

/* ---------- country grid (good this month) ---------- */
.cgrid{display:grid;gap:12px}
@media(min-width:560px){.cgrid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:900px){.cgrid{grid-template-columns:repeat(4,1fr)}}
a.ccard{display:block;border:1px solid var(--line-soft);border-radius:var(--r-card);padding:16px;
  text-decoration:none;color:var(--ink);background:var(--bg)}
a.ccard:hover{border-color:var(--brand-ink)}
.ccard .nm{font-family:var(--display);font-weight:700;font-size:17px;display:flex;gap:8px;align-items:center;justify-content:space-between}
/* span.band is the $-band marker; section.band (§4.2) is the full-bleed page band.
   Unscoped, each leaked onto the other — the section's 52px padding inflated the
   marker inside every hcard/ccard/qcard, hollowing the top of the card. */
span.band{font-size:13px;font-weight:700;color:var(--muted);letter-spacing:.04em}
.ccard .vd{font-size:13.5px;color:var(--muted);margin-top:4px}

/* ---------- tools section ---------- */
.lead-tool{border:1px solid var(--line-soft);border-radius:var(--r-card);padding:22px;background:var(--surf);
  display:grid;gap:18px;margin-bottom:14px}
@media(min-width:820px){.lead-tool{grid-template-columns:1fr 1fr;align-items:center}}
.lead-tool h3{font-family:var(--display);font-size:22px;font-weight:700;margin:0 0 8px}
.trows{display:grid;gap:10px}
a.trow{display:flex;gap:14px;align-items:center;border:1px solid var(--line-soft);border-radius:var(--r-card);
  padding:14px 16px;text-decoration:none;color:var(--ink)}
a.trow:hover{border-color:var(--brand-ink)}
.trow svg{flex:0 0 auto;color:var(--brand-ink)}
.trow .t{font-weight:700}
.trow .s{font-size:13.5px;color:var(--muted)}

/* ---------- route output ---------- */
.stop{display:flex;gap:14px;border:1px solid var(--line-soft);border-radius:var(--r-card);
  padding:14px 16px;margin-bottom:10px;align-items:flex-start}
.stop .no{font-family:var(--display);font-weight:800;font-size:20px;color:var(--brand-ink);
  min-width:30px;text-align:center}
.stop .nm{font-weight:700}
.stop .why{font-size:13.5px;color:var(--muted)}

/* ---------- the span, and the time still open (docs/plans/PLANNER-REBUILD.md) ----
   The trip the traveller owns is their TIME. Before this, /plan showed a list of
   stops, and a list that is too short still looks finished — six months came back
   as five stops covering 25 days and never mentioned the other 157. A bar cannot
   hide its own empty half. */
.span{display:flex;height:20px;border-radius:var(--r-chip);overflow:hidden;
  border:1px solid var(--line-soft);background:var(--surf);margin:6px 0 4px}
.span i{display:block;height:100%}
.span .fill{background:var(--brand-ink)}
/* Hatching, not a flat tint: an empty stretch must not read as a second category
   of destination. Colour never carries the meaning alone — the label says "open". */
.span .open{background:repeating-linear-gradient(45deg,
  transparent,transparent 5px,var(--line) 5px,var(--line) 6px)}
.spanlab{display:flex;justify-content:space-between;gap:10px;
  font-size:12.5px;color:var(--muted);margin-bottom:16px}
.openpanel{border:1px solid var(--line-soft);border-left:3px solid var(--brand-ink);
  border-radius:var(--r-card);padding:16px 18px;margin:16px 0;background:var(--surf)}
.openpanel h3{margin:0 0 3px;font-family:var(--display);font-weight:800;font-size:23px}
.openpanel .when{font-size:13px;color:var(--muted);margin:0 0 10px}
.openpanel p.arith{margin:0;font-size:14.5px}
.levers{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
.levers .btn{flex:1 1 auto}
.stop .len{font-size:13px;color:var(--muted);white-space:nowrap;margin-left:10px}
/* The towns and cities a traveller names inside a stop. Chips, because each one
   is a separate thing they chose and each has to be removable on its own. */
.placelist{margin-top:6px;display:flex;flex-wrap:wrap;gap:6px;align-items:baseline}
.placechip{display:inline-flex;gap:5px;align-items:baseline;padding:2px 8px;
  border:1px solid var(--line-soft);border-radius:var(--r-chip);background:var(--surf)}
.placechip .linkish{font-size:15px;line-height:1}
@media (max-width:560px){ .levers{flex-direction:column} .levers .btn{width:100%} }

/* ---------- lists ---------- */
.rowlist a{display:flex;gap:10px;align-items:baseline;justify-content:space-between;
  padding:11px 4px;border-bottom:1px solid var(--line-soft);text-decoration:none;color:var(--ink)}
.rowlist a:hover .cn{color:var(--brand-ink)}
.rowlist .cn{font-weight:650}
.rowlist .cv{font-size:13px;color:var(--muted);text-align:right}

/* ---------- glance table ---------- */
table.glance{width:100%;border-collapse:collapse;font-size:14.5px}
.glance th{text-align:left;font-size:12px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--muted);padding:8px 8px 8px 0;width:auto;white-space:nowrap;vertical-align:top}
/* Below 380px "EMERGENCY NUMBERS *" cannot sit beside its value without wrapping
   out of alignment, so the table stacks instead. */
@media (max-width:379px){
  table.glance,.glance tbody,.glance tr,.glance th,.glance td{display:block;width:auto}
  .glance th{white-space:normal;padding:10px 0 2px}
  .glance td{padding:0 0 10px}
}
.glance td{padding:8px 0;border-bottom:1px solid var(--line-soft)}
.glance tr:last-child td{border-bottom:none}

/* ── THE WEATHER TABLE WEARS THE MONTH ────────────────────────────────────────
   23 Aug 2026. Philip: this table "looks like it's been done by a two year old".
   The deeper fault under the flatness (Claude Design): it was the only surface on
   the site where a month appeared stripped of its grade.

   COLOUR MARKS THE MONTH, NEVER THE DATA. The edge and the month name carry the
   state; the figures stay in ink so nobody reads a temperature as a verdict. The
   glyph sits beside the name, so colour is never alone. */
.glance.wx tr.wxm th{border-left:4px solid transparent;padding-left:10px;
  color:var(--ink);font-weight:700;letter-spacing:.04em}
.glance.wx tr.wxm .wxg{font-style:normal;margin-right:5px;font-size:12px}
.wxm-cheap th{border-left-color:var(--cheap) !important;color:var(--cheap) !important}
.wxm-good  th{border-left-color:var(--good)  !important;color:var(--good)  !important}
.wxm-avoid th{border-left-color:var(--avoid) !important;color:var(--avoid) !important}
.wxm-mid   th{border-left-color:var(--line-soft) !important;color:var(--muted) !important}
.glance.wx td.wxrain{white-space:nowrap}
.glance.wx td.wxrain .cwxbar{display:inline-block;vertical-align:middle;margin-right:7px}
.glance.wx td.wxrain .cwxmm{font-variant-numeric:tabular-nums}
.wxkey{margin-top:10px;color:var(--muted)}
.wxkey .wxk{font-weight:700}
.wxkey .wxk-cheap{color:var(--cheap)}
.wxkey .wxk-good{color:var(--good)}
.wxkey .wxk-avoid{color:var(--avoid)}
.wxkey .wxk-mid{color:var(--muted)}
/* The stacked layout below 380px loses the row edge, so the name keeps the colour
   and gains a rule of its own. */
@media (max-width:379px){
  .glance.wx tr.wxm th{border-left:0;border-top:3px solid currentColor;padding-left:0}
}

/* ---------- official links ---------- */
.official a.row{display:flex;justify-content:space-between;gap:10px;align-items:center;
  border:1px solid var(--line);border-radius:var(--r-chip);padding:12px 14px;margin-bottom:8px;
  text-decoration:none;color:var(--ink);font-weight:650;font-size:14.5px}
.official a.row:hover{border-color:var(--brand-ink)}
.official .ext{color:var(--muted);font-weight:400;font-size:13px}

/* ── THE LETTERHEAD BAND ──────────────────────────────────────────────────────
   23 Aug 2026. Every interior page opens on the same deep ground the homepage
   uses, so the site reads as one product page beyond page. SHALLOW on purpose:
   the homepage's tall map-led hero stays the hero, and this is the letterhead.

   It also fixes the loudest fault in the audit, which was not colour at all: on
   /method and /tools the prose sat in a 590px column hard against the left margin
   with the right half of a 1280px screen blank. A full-bleed band gives the page a
   top edge that spans the screen, so the measure below it reads as a deliberate
   column rather than an abandoned one. */
/* A SPECIMEN: the real thing the page is describing, rendered full measure at the
   point the prose names it. Claude Design's ruling, and its attack on my first
   idea: a fixed right rail desynchronises -- it shows the star while the reader is
   four paragraphs deep in the cross. Inline, the evidence arrives exactly when it
   is meant. */
/* A row of computed figures -- a specimen for a page whose subject is what the
   site holds. Display type on the number so it reads as evidence rather than as
   decoration, and the caption underneath carries the honest remainder. */
.figrow{display:flex;flex-wrap:wrap;gap:26px 44px}
.figc{display:flex;flex-direction:column;gap:2px}
.figc .fign{font-family:var(--display);font-weight:800;letter-spacing:-.02em;
  font-size:clamp(30px,4vw,44px);line-height:1;color:var(--brand-ink)}
.figc .figw{color:var(--muted);font-size:14px;max-width:22ch}
@media (max-width:560px){ .figrow{gap:18px 26px} }
figure.specimen{margin:18px 0 22px;padding:16px 0 0;border-top:1px solid var(--line-soft)}
figure.specimen figcaption{margin-top:10px;color:var(--muted);font-size:14px;
  max-width:60ch}
section.block.banded{padding-top:4px}
.pband{background:#06282A;color:#F3EFE7;padding:38px 0 32px;margin-bottom:var(--sp-md)}
.pband .pb-h1{font-family:var(--display);font-weight:800;letter-spacing:-.03em;
  line-height:1.03;margin:0;color:#FFFDF9;
  font-size:clamp(34px,5.2vw,60px)}
.pband .pb-sub{color:#BFD9D7;max-width:56ch;margin:14px 0 0;
  font-size:clamp(15px,1.7vw,18px);line-height:1.5}
/* The band is the same ground in both themes, exactly as the homepage hero is --
   Philip already likes the vivid version and there is no reason to withhold it
   from light-mode readers (BRAND-PACKAGE, 18 Aug 2026). */
@media (max-width:560px){
  .pband{padding:26px 0 22px}
  .pband .pb-sub{margin-top:10px}
}

/* ---------- sections & footer ---------- */
section.block{padding:26px 0}
footer.site{border-top:1px solid var(--line);margin-top:30px;padding:26px 0 46px;
  font-size:14px;color:var(--muted)}
footer.site a{color:var(--muted)}
.flinks{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:12px}
.notice{border:0;border-top:2px solid var(--brand-ink);background:none;padding:14px 0 0;
  margin:18px 0;border-radius:0;font-size:15px;line-height:1.65;color:var(--ink);max-width:64ch}
.warnbox{background:var(--cheap-bg);color:var(--cheap);border-radius:var(--r-chip);
  padding:11px 14px;font-size:14px;font-weight:600;margin-top:12px}

/* ============ /tools ============ */
.muted{color:var(--muted)}
.btn.small{padding:6px 12px;font-size:13px;min-height:32px}
.toolgrid{display:grid;gap:26px}
/* min-width:0 is not tidying. A grid item's automatic minimum is min-content, so
   these cards refused to shrink below 376px and pushed /tools 6px past a 390px
   phone — sideways scroll, live, for weeks. Nothing inside actually needs the room:
   released, the card sits at its track width of 350 and every control still fits.
   Found by measuring a render at a fixed viewport; the markup gives no hint. */
.toolgrid > .tool{min-width:0}
.tool{border:1px solid var(--line-soft);border-radius:var(--r-card);padding:20px 18px;background:var(--bg)}
.tool > h2{margin:0 0 4px;font-size:20px}
.tool > p.intro{margin:0 0 16px;color:var(--muted);font-size:15px;max-width:58ch}
.f2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.f3{display:grid;grid-template-columns:1fr auto 1fr;gap:10px;align-items:end}
@media (max-width:520px){.f3{grid-template-columns:1fr auto 1fr;gap:8px}
  .f3 .swapbtn{align-self:end}}
.cvout{font-size:26px;font-weight:700;margin:16px 0 2px;line-height:1.25;font-variant-numeric:tabular-nums}
.cvout .unknown{font-size:16px;font-weight:600;color:var(--avoid)}
.cvcheat{margin-top:12px;color:var(--muted);font-size:14px;line-height:1.9;font-variant-numeric:tabular-nums}
.swapbtn{border:1px solid var(--line);background:var(--surf);color:var(--ink);border-radius:var(--r-btn);
  min-height:44px;min-width:44px;cursor:pointer;font-size:17px}
.swapbtn:hover{background:var(--bg)}
/* Same measure as .check li, so the rules stop where the text stops instead of
   running the full container width over half-width paragraphs. */
.step{border-top:1px solid var(--line-soft);padding:16px 0 0;margin:20px 0 0;max-width:68ch}
.step h3{margin:0 0 4px;font-size:15px}
.step p{margin:0;color:var(--muted);font-size:15px;line-height:1.65;max-width:62ch}
.dcbig{border-radius:var(--r-card);padding:18px;margin-top:18px;border:1px solid var(--line-soft)}
.dcbig.ok{background:var(--good-bg);border-color:var(--good)}
.dcbig.tight{background:var(--cheap-bg);border-color:var(--cheap)}
.dcbig.over{background:var(--avoid-bg);border-color:var(--avoid)}
.dcbig .n{font-size:38px;font-weight:800;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink)}
.dcbig .n span{font-size:19px;font-weight:600;color:var(--muted)}
.dcbig .l{margin-top:8px;font-size:15px;line-height:1.55;color:var(--ink)}
.err{color:var(--avoid);font-size:14px;font-weight:600;min-height:20px;margin-top:6px}
#dc-list{display:grid;gap:8px;margin:14px 0}
#dc-list .trow{display:flex;align-items:center;justify-content:space-between;gap:12px;
  border:1px solid var(--line);border-radius:var(--r-chip);padding:10px 12px}

/* ============ country page: the survival kit ============ */
.kit{display:grid;gap:18px;margin-top:4px}
.kit h3{margin:0 0 6px;font-size:16px}
.kit ul{margin:0;padding-left:20px;display:grid;gap:8px}
.kit li{font-size:15px;line-height:1.6;color:var(--ink);max-width:66ch}
.phrases{width:100%;border-collapse:collapse;margin-top:10px;font-size:15px}
.phrases th{text-align:left;font-size:12px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);font-weight:700;padding:0 10px 8px 0;border-bottom:1px solid var(--line)}
.phrases td{padding:9px 10px 9px 0;border-bottom:1px solid var(--line);vertical-align:top}
.phrases td.native{font-weight:650}
.phrases td.say{color:var(--muted);font-style:italic;white-space:nowrap}
@media (max-width:560px){.phrases td.say{white-space:normal}}

/* ============ /checklists ============ */
.check{margin:0;padding:0;list-style:none;display:grid;gap:2px}
/* display:flex promoted every inline <a> AND each surrounding text node to a flex
   item, so a sentence containing a link rendered as three ragged columns. A grid with
   two explicit cells (control, text) cannot do that. */
.check li{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start;
  padding:11px 0;border-bottom:1px solid var(--line-soft);font-size:15px;line-height:1.6;max-width:68ch}
.check li input[type=checkbox]{width:19px;height:19px;min-height:0;margin:2px 0 0;padding:0;
  accent-color:var(--brand-ink);cursor:pointer}
.check li label{cursor:pointer}
.check li:has(input:checked) label{color:var(--muted);text-decoration:line-through;
  text-decoration-thickness:1px;text-decoration-color:var(--line)}
.checkcount{font-size:13px;color:var(--muted);font-weight:650;margin-left:8px;
  font-variant-numeric:tabular-nums}
/* /account's recently-removed rows. Deliberately NOT .check: that grid exists for a
   control in an auto-width FIRST column, so a button placed after the text landed in
   a second grid row, stretched across a column sized by that row's own text, and
   centred its label — which read as one row indented and the others not. Here the
   text leads and the control sits at the end, keeping its own width. Caught by
   looking at the page, not at the markup. */
.putback{margin:0;padding:0;list-style:none;display:grid;gap:2px}
.putback li{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:baseline;
  padding:11px 0;border-bottom:1px solid var(--line-soft);font-size:15px;line-height:1.6;
  max-width:68ch}
.putback li .linkish{white-space:nowrap}
/* the page reads as one 68ch column; small print that runs the full container
   width breaks the column's right edge */
body[data-page=checklists] .tiny{max-width:68ch}

/* a source that publishes nothing for this country — stated, not hidden, not faked */
.official .row.dead{opacity:.62;cursor:default;border-style:dashed}
.official .row.dead .ext{font-style:italic}

/* ============ the four researched dossiers ============ */
.costs{border:1px solid var(--line-soft);border-radius:var(--r-card);padding:16px 18px;margin:18px 0 6px;
  background:var(--surf)}
.costs h3{margin:0 0 10px;font-size:15px}
.costrow{display:flex;justify-content:space-between;align-items:baseline;gap:16px;
  padding:9px 0;border-bottom:1px solid var(--line)}
.costrow:last-of-type{border-bottom:none}
.costrow .k{font-size:15px}
.costrow .v{font-weight:700;font-size:17px;white-space:nowrap}
.costs .tiny{margin:10px 0 0}
.dossier h3{margin:20px 0 6px;font-size:16px}
.dossier p{margin:0;font-size:15px;line-height:1.7;color:var(--ink);max-width:64ch}

/* ============ /quiz ============ */
/* The quiz is a picker, so it is furniture: centred, like /plan's search bar.
   Left-pinned it left the right half of a desktop screen empty at every step. */
.quiz{max-width:640px;margin:0 auto}
.qnum{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);
  font-weight:700;margin:0 0 6px}
.qstep h2.sec{margin-top:0}
.qhint{color:var(--muted);font-size:15px;line-height:1.6;max-width:56ch;margin:0 0 18px}
.qopts{display:grid;gap:10px}
.qopts button{display:flex;flex-direction:column;align-items:flex-start;gap:3px;text-align:left;
  width:100%;min-height:56px;padding:14px 16px;font:inherit;cursor:pointer;color:var(--ink);
  background:var(--bg);border:1px solid var(--line-soft);border-radius:var(--r-btn)}
.qopts button:hover{background:var(--surf);border-color:var(--brand-ink)}
.qopts button:focus-visible{outline:3px solid var(--brand);outline-offset:2px}
.qopts button b{font-size:16px;font-weight:700}
.qopts button span{font-size:14px;color:var(--muted)}
.qopts{grid-template-columns:1fr}
#q-month{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
#q-month button.mo{min-height:52px;align-items:center;justify-content:center;font-weight:650;font-size:15px}
@media (max-width:420px){#q-month{grid-template-columns:repeat(2,1fr)}}
.qnav{display:flex;gap:10px;margin-top:22px}
.qres{display:grid;gap:12px;margin-top:18px}
.qcard{display:flex;gap:14px;align-items:flex-start;padding:16px;text-decoration:none;color:inherit;
  border:1px solid var(--line-soft);border-radius:var(--r-card);background:var(--bg)}
.qcard:hover{border-color:var(--brand-ink);background:var(--surf)}
.qcard .rank{flex:0 0 auto;width:30px;height:30px;border-radius:50%;background:var(--brand-ink);
  color:var(--bg);display:grid;place-items:center;font-weight:800;font-size:15px}
.qcard .body{flex:1;min-width:0}
/* the band sat hard right of a wide card, reading as unrelated to the name */
.qcard .nm{display:flex;align-items:baseline;gap:10px;font-weight:700;font-size:17px;
  margin-bottom:8px;flex-wrap:wrap}
.qcard .nm .band{font-weight:700;color:var(--muted)}
.qcard .body{max-width:62ch}
.qcard .why{margin-top:8px;font-size:14px;color:var(--muted);line-height:1.55}

/* [hidden] must actually hide. .btn sets display:inline-flex, which beats the
   browser default [hidden]{display:none} — so hidden buttons stayed visible.
   Caught on the quiz's Back button appearing on the results step. */
[hidden]{display:none !important}


/* ==================================================================
   SURFACE HIERARCHY  (Claude Design §4.1)
   Sixteen rules used border:1px solid var(--line) — the strongest
   hairline in the system — on every box type on the site. When the
   strongest treatment is on everything, nothing is emphasised and the
   page reads as a form. Those are now --line-soft, and this ladder
   provides the emphasis, with the rule that L4 appears ONCE per page.
   ================================================================== */
.g1{border:1px solid var(--line-soft);border-radius:var(--r-card);background:var(--bg)}
.g2{border:1px solid var(--line-soft);border-radius:var(--r-card);background:var(--surf)}
.g3{background:var(--surf);border-radius:var(--r-card);padding:24px;border:0}
.g4{background:var(--brand-deep);color:#fff;border-radius:var(--r-card);padding:28px;border:0}
.g4 h2,.g4 h3,.g4 .stat{color:#fff}
.g4 a{color:#fff;text-decoration:underline;text-underline-offset:3px}
.g4 .eyebrow{color:#BFE3E3}
.g4 p,.g4 .statlabel,.g4 .tiny{color:#D8ECEC}

/* ==================================================================
   FULL-BLEED BANDS  (§4.2)
   Every section on the site sat inside the same 1120px column with the
   same left edge — twenty screens of one identical measure. The band
   runs edge to edge; the content stays on the grid.
   Cap: two tinted and one deep band per page, or it is noise again.
   ================================================================== */
section.band{padding:var(--sp-md) 0}
section.band.tint{background:var(--surf)}
section.band.deep{background:var(--brand-deep);color:#fff}
section.band.deep h1,section.band.deep h2,section.band.deep h3,section.band.deep .stat{color:#fff}
section.band.deep .eyebrow{color:#BFE3E3}
section.band.deep a{color:#fff;text-underline-offset:3px}
section.band.deep p,section.band.deep .lede,section.band.deep .tiny,section.band.deep .statlabel{color:#D8ECEC}
section.band.deep .notice{border-top-color:#BFE3E3;color:#D8ECEC}

/* ==================================================================
   TYPE SCALE AND THE NUMBERS  (§4.3)
   The site is full of genuinely interesting figures — "45 countries in
   their best season", "176 of 196", "£1,300–2,050" — every one of them
   set as 16px muted body copy. A data product that whispers its data
   reads as a brochure about a data product.
   ================================================================== */
/* 18 Aug 2026, with Claude Design: Philip said the site 'feels like a child
   website'. Its four-part decode named a compressed type scale first - 'a 32px
   h1 is the number one tell' - and the cap here was 58px, so Fraunces was being
   used too small to show its character. The mockup runs 76px on the home hero.
   The display serif is this site's authority and its distinction from every
   all-sans travel tool: BIGGER, never traded for a friendly sans. */
h1{font-size:clamp(36px,6.4vw,64px);line-height:1.03;letter-spacing:-.03em}
/* 64px, not the mockup's 76px, and the reason matters for whoever raises it next:
   the hero headline currently sits in a HALF-WIDTH column beside the month card,
   and at 76px "Know where to go, when, and what it'll cost." runs to four lines
   and eats the fold. 76px is right for the map-led hero, where the headline gets
   the full width. Raise it WITH that layout, not before it. */
h2.sec{font-size:clamp(25px,3.6vw,36px);line-height:1.15;letter-spacing:-.02em}
.lede{font-size:clamp(17px,2.1vw,20px);line-height:1.5}
.stat{font-family:var(--display);font-weight:800;font-size:clamp(40px,7vw,68px);
  line-height:.95;letter-spacing:-.03em;font-variant-numeric:tabular-nums;display:block;
  color:var(--brand-ink)}
.statlabel{font-size:14.5px;color:var(--muted);margin:6px 0 0;max-width:28ch;line-height:1.45}
.statrow{display:grid;gap:var(--sp-sm);grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  margin:var(--sp-xs) 0}

/* pacing (§4.4) — three values instead of one */
section.block{padding:var(--sp-sm) 0}
section.block.major{padding:var(--sp-lg) 0}
section.block.minor{padding:var(--sp-xs) 0}

/* ==================================================================
   THE MONTH STRIP IS THE LOGO  (§5)
   It was styled like a form control. On the hero and at the top of a
   country page it is the artefact that answers the page's question.
   ================================================================== */
.months.lead{gap:6px}
.months.lead .m{min-height:62px;font-size:13.5px;border-radius:10px}
.months.lead .m .g{font-size:17px;font-weight:800}
@media (max-width:640px){.months.lead .m{min-height:56px}}
.mini{gap:2.5px;margin:10px 0 8px;height:17px}
.mini i{height:11px;border-radius:2.5px}
.mini i.now{height:17px}
/* month cells deep-link to /when#<month> (§8) */
.months a.m{text-decoration:none;color:inherit}
.months a.m:hover{outline:2px solid var(--brand-ink);outline-offset:1px}
/* Today on the full strip: the tag sits OUTSIDE the cell (the cell already holds
   a month name; two labels in one box is a collision) and the cell carries
   aria-current="date". Set client-side from the device clock — a marker baked at
   build time would go stale mid-month on a service-worker-cached page. */
.months{margin-top:20px}
.months .m.today{position:relative}
.months .m.today::after{content:"now";position:absolute;top:-17px;left:50%;
  translate:-50% 0;font-size:10px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink)}
@media (max-width:640px){.months{row-gap:22px}}

/* price band, given a visual form (§6.3) — it is the product's second
   promise and it was 13px letter-spaced footnote type */
.bandviz{display:flex;gap:3px;align-items:center;margin:10px 0 0}
.bandviz i{width:15px;height:15px;border-radius:3px;background:var(--line-soft)}
.bandviz i.on{background:var(--brand-ink)}
.bandviz .lb{margin-left:10px;font-size:14.5px;color:var(--muted)}

/* explicit hover states — filter:brightness() is unpredictable across themes (§8) */
.btn.primary:hover{background:var(--brand-deep);filter:none}
[data-theme="dark"] .btn.primary:hover{background:var(--brand);filter:none}

/* ==================================================================
   FLAGS  (Claude Design D4)
   Windows has no flag emoji. Chrome and Edge there render a regional
   indicator pair as bare letters, so on a large share of desktops the
   only per-country colour on the site vanishes into grey letter-pairs.
   app.js detects support once; where it is missing we show a designed
   ISO tile instead of leaving it to the platform.
   ================================================================== */
.flag{display:inline-block}
.flag .ft{display:none}
.no-flag-emoji .flag .fe{display:none}
.no-flag-emoji .flag .ft{display:inline-grid;place-items:center;
  min-width:26px;height:19px;padding:0 4px;border-radius:4px;
  background:var(--brand-ink);color:var(--bg);
  font:800 11px/1 var(--body);letter-spacing:.06em;
  font-variant-numeric:tabular-nums;vertical-align:-3px}
.no-flag-emoji h1 .flag .ft{min-width:38px;height:28px;font-size:15px;vertical-align:-4px}

/* brand emblems, replacing the emoji in section headings (Design D3).
   Emoji render as different artwork on every OS — handing a hand-drawn
   identity to Apple and Microsoft to draw. The pack forbids these below 40px. */
.stamp{color:var(--brand-ink);flex:0 0 auto}
.toolhead{display:flex;gap:14px;align-items:center;margin:0 0 4px}
.toolhead h2{margin:0}
/* Page-title emblem row: one stamp beside the h1, never more (BRAND-PACKAGE.md -
   density is capped at two stamps per viewport and none share a block). */
.pagehead{display:flex;gap:14px;align-items:center}
.pagehead h1{margin:0}
.pagehead .stamp{flex:none;color:var(--muted)}

/* ==================================================================
   /countries — a filter bar and a scannable row  (Design D6 / §6.1)
   196 rows with no search on the one page that lists everything.
   ================================================================== */
.filterbar{position:sticky;top:60px;z-index:20;background:var(--bg);
  padding:12px 0;border-bottom:1px solid var(--line-soft);margin-bottom:6px;
  display:grid;gap:10px}
.ftoggles{display:flex;gap:8px;flex-wrap:wrap}
.ftoggles button{font:inherit;font-size:13.5px;font-weight:650;cursor:pointer;
  padding:8px 14px;min-height:38px;border-radius:999px;color:var(--ink);
  background:var(--bg);border:1px solid var(--line-soft)}
.ftoggles button:hover{border-color:var(--brand-ink)}
.ftoggles button[aria-pressed="true"]{background:var(--brand-ink);color:var(--bg);
  border-color:var(--brand-ink)}
.rgroup{position:sticky;top:118px;z-index:10;background:var(--bg);
  font-family:var(--display);font-weight:700;font-size:19px;margin:26px 0 0;
  padding:10px 0 6px;border-bottom:1px solid var(--line)}
.rgroup .tiny{color:var(--muted);font-weight:600;margin-left:6px}
.rowlist a{display:grid;grid-template-columns:1fr auto auto;gap:14px;align-items:center;
  padding:12px 4px;border-bottom:1px solid var(--line-soft)}
.rowlist .mini{width:132px;margin:0;display:flex}
.rowlist .mini i{flex:1}
@media (max-width:620px){
  .rowlist a{grid-template-columns:1fr auto}
  .rowlist .mini{display:none}
  .rgroup{top:126px}
}

/* /when — the verdict column was ragged right-aligned prose (D5) */
.rowlist .cv{font-size:13px;color:var(--muted);text-align:right;white-space:nowrap;
  font-variant-numeric:tabular-nums}
@media (max-width:420px){.rowlist .cv{white-space:normal;max-width:14ch}}
/* tighten the shortlist card: name, strip, reason should read as one unit */
.qcard{padding:14px 16px}
.qcard .nm{margin-bottom:2px}
.qcard .mini{margin:8px 0 6px}
.qcard .why{margin-top:2px}

/* ============ /contact ============ */
.mailbig{display:inline-block;font-family:var(--display);font-weight:800;
  font-size:clamp(21px,3.6vw,30px);letter-spacing:-.02em;color:var(--brand-ink);
  word-break:break-all;text-underline-offset:4px}
.changelog{display:grid;gap:0;margin-top:6px}
.chg{border-top:1px solid var(--line-soft);padding:18px 0}
.chg:last-child{border-bottom:1px solid var(--line-soft)}
.chg .when{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);
  font-weight:700;margin:0 0 4px}
.chg h3{margin:0 0 6px;font-size:17px}
.chg p{margin:0;font-size:15px;line-height:1.65;color:var(--muted);max-width:62ch}

/* ============ homepage: where's good from where you are ============ */
.fromline{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px;margin:4px 0 22px;
  font-size:15px;color:var(--muted)}
.fromline b{color:var(--ink)}
.linkish{background:none;border:0;padding:0;font:inherit;color:var(--brand-ink);
  cursor:pointer;text-decoration:underline;text-underline-offset:3px;min-height:0}
.linkish:hover{color:var(--ink)}
.fromline select{width:auto;min-width:220px;min-height:40px;font-size:15px}
.hband{margin:0 0 26px}
.hband > h3{font-family:var(--display);font-size:19px;font-weight:700;margin:0 0 2px;
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.hband > h3 .far{font-family:var(--body);font-size:13px;font-weight:600;color:var(--muted)}
.hband > p.none{font-size:15px;color:var(--muted);margin:6px 0 0;max-width:60ch}
.hgrid{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));margin-top:12px}
.hcard{display:block;padding:16px;text-decoration:none;color:inherit;
  border:1px solid var(--line-soft);border-radius:var(--r-card);background:var(--bg)}
.hcard:hover{border-color:var(--brand-ink);background:var(--surf)}
.hcard .nm{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-weight:700;font-size:17px}
.hcard .nm .band{color:var(--muted);font-size:14px}
.hcard .why{margin-top:8px;font-size:14px;color:var(--muted);line-height:1.5}
.hcard .km{font-variant-numeric:tabular-nums}
/* the value badge — glyph first, colour second, per the season-signal rule */
.vbadge{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:999px;
  font-size:12px;font-weight:700;background:var(--cheap-bg);color:var(--cheap);
  border:1px solid var(--cheap)}
.hcard.value{border-color:var(--cheap)}

/* ---- /storage: the clear control ----
   Claude Design's rule, and it is right: a destructive action rendered as a timid
   ghost link signals you would rather they didn't. Full strength, above the rows,
   with the consequence stated beside it rather than hidden behind a modal. */
.wipeline{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-sm);margin:var(--sp-md) 0}
.wipeline .tiny{margin:0;max-width:44ch}
.glance.store td.st{white-space:nowrap;padding-left:var(--sp-md)}
.glance.store .rowclear{margin-left:var(--sp-xs);font-size:.92em}
.glance.store .yes{color:var(--good)}
/* This table pushed the page 23px wider than a 390px phone, so /storage — the one
   page that cannot afford to look careless — scrolled sideways. Two nowraps did it:
   every .glance header is nowrap, and "ON YOUR DEVICE NOW" is long; and the status
   cell is nowrap so "Stored · Clear" could not fold. The stacking rule below 379px
   never reached a 390px screen. Fixed here, for this table only, at the width where
   it is actually tight. Found by measuring a render — the markup looked perfect.
   The status cell keeps its nowrap where the tick and its button share a line, so
   the row still reads as one statement. */
@media (max-width:560px){
  .glance.store th{white-space:normal}
  .glance.store td.st{padding-left:var(--sp-sm)}
}
@media (max-width:440px){
  .glance.store td.st{white-space:normal}
}
.btn:disabled{opacity:.55;cursor:default;filter:none}

/* ---- grouped footer ----
   Claude Design: eleven flat links buried the useful set under the legal set.
   Three groups, named for what the reader is looking for rather than for us. */
.flinks{display:flex;flex-wrap:wrap;gap:var(--sp-sm) var(--sp-md);align-items:flex-start}
.fgroup{display:flex;flex-direction:column;gap:6px;min-width:11rem}
.fhead{margin:0 0 2px;font-size:.78rem;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted)}
.fgroup a{text-decoration:none}
.fgroup a:hover{text-decoration:underline}

/* ===========================================================================
   The browse page — doors, lens, reducers, rows
   ===========================================================================
   ON CENTRING, because Philip asked and it is a real question with two answers.

   The CONTROL BLOCK is centred. It is not reading matter, it is a front door, and
   centring it says "start here" — which is exactly the impression Philip found
   missing when he said the page looked left-hung.

   The ROWS are left-aligned and always will be. Centred rows give every line a
   ragged left edge, so the eye has to hunt for where each one begins. Over 196 rows
   that cost compounds into precisely the "meaningless" feeling we are fixing. Centre
   the furniture, never the data. */
.browsehead{text-align:center;max-width:56ch;margin:0 auto 26px}
.browsehead .lede{margin-left:auto;margin-right:auto;max-width:52ch}
.eyebrow.center{text-align:center}

/* DOORS — named starting points. One tap sets the whole query, because Philip asked
   for a page that suggests, and a row of chips does not suggest, it waits. */
.doors{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin:0 0 30px}
/* the map: a key-less link always; a click-to-load card only when the Embed key
   exists. Nothing loads from Google until the visitor chooses it. */
.maprow{margin:12px 0 0}
.mapcard{border:1px dashed var(--line-soft);border-radius:var(--r-card);padding:18px;
  margin:14px 0 0;text-align:center}
.mapcard .tiny{margin:8px 0 0}
.mapbtns{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.mapcard .maploader[aria-pressed="true"]{background:var(--surf);border-color:var(--brand-ink)}
.mapframe:not(:empty){margin-top:14px}
.mapcard iframe{width:100%;height:380px;border:0;border-radius:var(--r-chip)}

/* the warm-coast door's printed rule; shown only while that claim is on screen */
.doorrule{text-align:center;max-width:64ch;margin:-18px auto 26px}

/* The band cluster: four multi-pick chips reading as ONE control, the $ legend
   riding beside them. Zero picked means any price — and so does all four. */
.bandpick{display:inline-flex;gap:5px;align-items:center;padding:4px 8px 4px 4px;
  border:1px dashed var(--line-soft);border-radius:var(--r-btn)}
.bandpick .red.band{min-width:46px;font-variant-numeric:tabular-nums;padding:8px 8px}
.bandpick .red.band[aria-pressed="true"]{background:var(--cheap-bg);color:var(--cheap);
  border-color:var(--cheap);border-style:solid}
.bandlb{font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);max-width:9em;line-height:1.25}

/* The month-state cluster: four multi-pick chips reading as ONE control, built to match
   the price bands sitting beside it. Zero picked means any kind of month, and so does
   all four — the same rule as the bands, so the two clusters behave identically.

   Each chip wears ITS OWN state colour when pressed, so the control and the ticks in the
   rows below agree at a glance. Colour never carries the meaning alone (WCAG 1.4.1):
   every chip keeps the glyph the country pages already use — ★ ✓ ✕ and no mark. */
.statepick{display:inline-flex;gap:5px;align-items:center;flex-wrap:wrap;
  padding:4px 8px 4px 4px;border:1px dashed var(--line-soft);border-radius:var(--r-btn)}
.statepick .red.st{padding:8px 10px}
.statepick .red.st[aria-pressed="true"]{border-style:solid}
.statepick .red.st[data-st="cheap"][aria-pressed="true"]{background:var(--cheap-bg);
  color:var(--cheap);border-color:var(--cheap)}
.statepick .red.st[data-st="good"][aria-pressed="true"]{background:var(--good-bg);
  color:var(--good);border-color:var(--good)}
.statepick .red.st[data-st="avoid"][aria-pressed="true"]{background:var(--avoid-bg);
  color:var(--avoid);border-color:var(--avoid)}
/* No --mid variable exists, and inventing one would be a colour with no meaning behind
   it. An unmarked month is the absence of a mark, so its pressed state is the plain ink
   border — deliberately the quietest of the four. */
.statepick .red.st[data-st="mid"][aria-pressed="true"]{background:var(--surf);
  color:var(--ink);border-color:var(--ink)}
@media(max-width:700px){.statepick .red.st{font-size:12.5px;padding:7px 8px}}

/* The order row: judgement, chosen in the open. Single-select. */
.orderrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:center;
  margin:12px 0 0}
.orderlb{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  color:var(--muted);margin-right:2px}
.ord{background:none;border:1px dashed var(--line-soft);color:var(--ink);font:inherit;
  font-size:13.5px;font-weight:650;padding:8px 12px;border-radius:999px;cursor:pointer;
  min-height:38px}
.ord:hover{border-color:var(--brand-ink)}
.ord[aria-pressed="true"]{background:var(--brand-ink);color:var(--bg);
  border-color:var(--brand-ink);border-style:solid}
@media(max-width:700px){.ord{font-size:12.5px;padding:7px 10px}
  .bandlb{display:none}}
.door{display:flex;flex-direction:column;align-items:center;gap:3px;
  padding:13px 20px;border:1px solid var(--line-soft);border-radius:var(--r-btn);
  background:var(--surf);color:var(--ink);font:inherit;font-weight:600;font-size:15px;
  cursor:pointer;transition:border-color .12s,transform .12s}
.door:hover{border-color:var(--brand);transform:translateY(-1px)}
.door .dn{font-weight:400;font-size:12.5px;color:var(--muted)}

/* THE LENS — the month. It never removes a country, it changes what they all mean,
   and it doubles as the axis so no separate month legend is needed. */
.lens{text-align:center;margin:0 0 18px}
.lensq{font-family:var(--display);font-size:20px;font-weight:700;margin:0 0 12px}
.mpick{display:flex;flex-wrap:wrap;gap:7px;justify-content:center}
.mchip{padding:9px 15px;border:1px solid var(--line-soft);border-radius:999px;
  background:transparent;color:var(--ink);font:inherit;font-size:14.5px;cursor:pointer}
.mchip:hover{border-color:var(--brand)}
.mchip.on{background:var(--brand-ink);border-color:var(--brand-ink);color:#fff;font-weight:600}

/* REDUCERS — these DO take rows away, so they are drawn differently from the lens.
   Six identical chips would say "we are six of a kind" and rebuild the filter panel.
   Labelled as complete thoughts, not fields: "Cheap", not "Budget:". */
.reducers{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;align-items:center;
  margin:0 0 14px;padding-top:16px;border-top:1px solid var(--line-soft)}
.red{padding:8px 14px;border:1px dashed var(--line-soft);border-radius:var(--r-chip);
  background:transparent;color:var(--muted);font:inherit;font-size:14px;cursor:pointer}
.red:hover{color:var(--ink);border-color:var(--brand)}
.red[aria-pressed="true"]{border-style:solid;border-color:var(--brand);
  background:var(--surf);color:var(--ink);font-weight:600}
/* !important, deliberately and with the reason written down. The global form rule
   above is `input:not([type=checkbox]):not([type=radio]):not([type=button]):not([type=submit])`,
   which is specificity (0,4,1) and sets width:100%. It is broad on purpose — it was
   widened so the /tools date inputs stopped rendering white in dark mode — so the fix
   is not to narrow it. These two are inline controls in a centred row, not form
   fields in a column, and beating (0,4,1) any other way means a five-part selector
   chain that nobody will understand in six months. */
select.red.sel,input.red.find{border-style:solid;cursor:auto;width:auto!important;
  min-height:40px;padding:8px 12px;font-size:14px;border-color:var(--line-soft);
  background:transparent}
input.red.find{min-width:200px}
/* ── THE TWO FIGURES A BROWSING ROW CARRIES ───────────────────────────────────
   23 Aug 2026. Philip: "warm can mean anything to anyone... show the average
   temperature during that month, and therefore people can make their own decision
   whether they think it's warm or not rather than us guessing."

   So there is no adjective here and there must never be one. Tabular numerals so
   the column scans, and the cell is sized to the widest real string in the data --
   Mongolia in January, which is -17°/-29° with a TRUE minus.
   docs/plans/WEATHER-IN-THE-OPEN.md */
.cwx{display:flex;flex-direction:column;gap:4px;font-size:12.5px;
  font-variant-numeric:tabular-nums;color:var(--muted);white-space:nowrap;
  align-self:center}
/* The DAY carries the weight and the NIGHT is quieter, so the pair reads as
   day-then-night without a word of explanation. Borrowed from every phone weather
   app on earth, which is exactly why it needs no teaching. */
.cwxt{color:var(--muted);font-weight:600}
.cwxt .cwxhi{color:var(--ink);font-weight:700}
.cwxt .cwxlo{color:var(--muted);font-weight:600}
.cwxm{font-style:normal;font-weight:400;color:var(--muted);margin-right:6px;
  text-transform:uppercase;font-size:10.5px;letter-spacing:.04em}
/* THE CLOCK, not an adjective. Philip, 23 Aug 2026: "warm can mean anything to
   anyone" -- so the row says WHEN, and the reader decides what it means. Quiet,
   because the number is the fact and the label is only its anchor. */
.cwxw{font-style:normal;font-weight:400;color:var(--muted);font-size:10.5px;
  letter-spacing:.02em;margin:0 3px 0 0}
.cwxw + span + .cwxw{margin-left:9px}
.cwxsep{color:var(--line-soft);margin:0 1px}
.cwxr{display:flex;align-items:center;gap:7px}
/* One track, one scale, everywhere. The fill is a hard-stop gradient so 0 mm is
   genuinely nothing rather than a hairline that would read as "a little rain".
   The bar is decoration: aria-hidden in the markup, and the NUMBER is the fact. */
.cwxbar{flex:0 0 auto;width:44px;height:5px;border-radius:3px;
  background:linear-gradient(90deg,var(--line) 0 calc(var(--f,0) * 1%),
    var(--line-soft) calc(var(--f,0) * 1%) 100%)}
/* A clipped bar is MARKED, or 229 mm and 895 mm are the same picture. */
.cwxbar.clip{clip-path:polygon(0 0,calc(100% - 5px) 0,100% 50%,calc(100% - 5px) 100%,0 100%)}
.axis .awx{display:flex;flex-direction:column;gap:4px;font-size:10px;
  text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.axis .awx i{font-style:normal}
.wxnote{max-width:70ch;margin:14px auto 0;text-align:center}
.wxnote .tempslot{white-space:nowrap}

.readback{text-align:center;color:var(--muted);font-size:14.5px;margin:0 0 22px}
.readback b{color:var(--ink)}

/* ── THE COMMAND BAR ─────────────────────────────────────────────────────────
   22 Aug 2026. CENTRED, because it is furniture and not data -- Philip's layout
   rule is centre the furniture, never the data rows.

   The input is 16px and says so explicitly: below 16px, iOS Safari zooms the
   whole page on focus, which on a filter box means the list you were reading
   jumps away the moment you go to narrow it. Same reasoning that put 16px on the
   select options. */
.cbar{display:flex;gap:8px;max-width:56ch;margin:0 auto 10px;align-items:stretch}
.cbar input[type=search]{flex:1 1 auto;min-width:0;padding:11px 14px;font:inherit;
  font-size:16px;color:var(--ink);background:var(--bg);
  border:1px solid var(--line-soft);border-radius:var(--r-chip)}
.cbar input[type=search]::placeholder{color:var(--muted)}
.cbar input[type=search]:focus{outline:2px solid var(--brand);outline-offset:1px;
  border-color:var(--brand)}
.cbar button{flex:0 0 auto;white-space:nowrap}
.cbar-read{text-align:center;max-width:60ch;margin:0 auto 6px;font-size:14.5px;
  color:var(--ink)}
.cbar-read b{color:var(--ink)}
/* What it could NOT use, in the quieter voice -- present, never shouted. */
.cbar-miss{color:var(--muted)}
.cbar-note{text-align:center;max-width:60ch;margin:0 auto 20px}
.cbar-pick{font-size:inherit}
/* On a phone the button takes its own line rather than squeezing the input to
   nothing; a search field narrower than its own placeholder is unusable. */
@media (max-width:540px){
  .cbar{flex-wrap:wrap}
  .cbar input[type=search]{flex:1 1 100%}
  .cbar button{flex:1 1 100%}
}

/* ROWS — left aligned, and the sentence leads. */
.rowlist{display:block}
/* One column template shared by the rows and the axis ruler above them, so the
   ruler's Jan/Dec/now can never drift off the band they label. The strip column
   was 74px; 132px is Claude Design's mocked width, the sentence column absorbs
   the difference, and a texture twice as wide is itself easier to read. */
/* Five columns since 23 Aug 2026: the weather cell takes its width from the
   sentence's 2fr, which is the only column with slack. */
.rowlist a.crow,.axis{display:grid;
  grid-template-columns:minmax(150px,1.1fr) minmax(0,2fr) 132px 112px 84px;
  gap:16px;padding:13px 4px}
.rowlist a.crow{align-items:center;border-bottom:1px solid var(--line-soft);
  text-decoration:none;color:inherit}
.rowlist a.crow:hover{background:var(--surf)}
/* Saved countries. An inset accent rather than a glyph: on this site the star
   already means the cheap sweet spot and the tick means peak season, so a third
   symbol in the same row would be a third thing to decode. Inset shadow, not a
   border, so nothing shifts when a row is saved or unsaved. */
.rowlist a.crow[data-saved]{box-shadow:inset 3px 0 0 var(--brand)}
.rowlist a.crow[data-saved] .cn{padding-left:9px}
.savewrap{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0 0}
/* ---------- the save button on a country page ----------
   It shipped wearing `.red` — the dashed, muted chip the country list uses for its
   FILTER controls — so the one control on the page that belongs to the reader was
   dressed as a subtle filter and read as decoration. Philip, 14 Aug 2026: "it's
   hardly visible... it's very easy for anyone to miss that". A wrong-component bug,
   not a matter of taste, and the same family as `<a class="btn">` rendering as bare
   text: a class that nearly fits is worse than none, because it looks deliberate.

   Now a real primary button. State is carried by fill AND by the glyph, never by
   colour alone (WCAG 1.4.1): a hollow star to save, a filled star once saved, with
   the loud fill dropping away so "done" does not keep shouting. The glyph is a
   pseudo-element so the button's own text stays exactly "Save X" / "Saved" — for the
   tests that read it and for the name a screen reader announces. */
.savebtn{font-size:16.5px;padding:13px 22px}
.savebtn::before{content:"\2606";font-size:19px;line-height:1}
.btn.primary.savebtn[aria-pressed="true"]{background:var(--surf);color:var(--ink);
  border-color:var(--brand)}
.savebtn[aria-pressed="true"]::before{content:"\2605";color:var(--brand)}
/* A recovery key shown inside a sentence, so the reader can match the shape of the
   thing in their hand against the thing we are asking for. */
.rkey{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  letter-spacing:.04em;white-space:nowrap;color:var(--ink)}
/* The key column on /storage. These are literal strings — gttg-theme, gttg_csrf —
   that a reader can go and look for in their own browser, so they are set as code
   rather than as prose. The class had been used there for months with NO RULE
   BEHIND IT, which is exactly how invented CSS hides: it looks deliberate in the
   markup, it is invisible to every test, and it renders as plausible nothing.
   Written 16 Aug 2026. overflow-wrap because the longest of them is wider than the
   column on a narrow phone, and a table that scrolls sideways is worse than a
   wrapped key. */
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13.5px;letter-spacing:.01em;color:var(--ink);overflow-wrap:anywhere}
.rowlist a.crow .cn{font-weight:700}
.rowlist a.crow .csay{color:var(--muted);font-size:14.5px}
.rowlist a.crow .ccost{text-align:right;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
/* the strip as texture: read as a shape, not decoded twelve times per row.
   THE NOTCH (agreed with Claude Design, Aug 2026): the month in question is marked
   by GEOMETRY, never colour — colour is fully spent on state. A taller cell rises
   from a shared baseline into reserved headroom; the band itself stays 8px. On
   /countries the notch follows the picker (defaulting to today); on a month page
   it is the page's month. Today is marked once per page, as a tick in the axis
   ruler — a tick per row is noise, a tick per page is an anchor. */
.ctex{display:flex;gap:2px;height:13px;align-items:flex-end;position:relative}
.ctex i{flex:1;border-radius:2px;background:var(--line-soft);height:8px}
.ctex i.now{height:13px}
.ctex i.good{background:var(--good-fill)}
.ctex i.cheap{background:var(--cheap-fill)}
.ctex i.avoid{background:var(--avoid-fill)}
.ctex i.mid{background:var(--line-soft);opacity:.5}
/* THE AXIS RULER: the strip's header, once per page. Three readable anchors —
   "Jan" left, "Dec" right, "now" (a tick) over today's column — never twelve
   ambiguous letters. It also carries the colour key, because it is the cheapest
   place on the page for a legend: it is already the strip's header. */
.axis{align-items:end;padding-bottom:7px;border-bottom:1px solid var(--line);
  font-size:11px;font-weight:700;color:var(--muted)}
.axis .akey{font-weight:600;letter-spacing:.01em;align-self:end}
.axis .akey b{font-weight:700}
.axis .akey b.kg{color:var(--good)}
.axis .akey b.kc{color:var(--cheap)}
.axis .akey b.ka{color:var(--avoid)}
.axis .aband{position:relative;height:30px}
.axis .aband .a1,.axis .aband .a2{position:absolute;bottom:0;letter-spacing:.04em;
  text-transform:uppercase;font-size:10px}
.axis .aband .a1{left:0}
.axis .aband .a2{right:0}
.axis .tick{position:absolute;bottom:0;width:2px;height:9px;background:var(--ink);
  border-radius:1px;translate:-50% 0}
.axis .tick b{position:absolute;bottom:11px;left:50%;translate:-50% 0;font-size:10px;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink)}
.axis .tick.noword b{display:none}
/* at the calendar's ends the anchor itself becomes the now-label */
.axis .aband .a1.isnow,.axis .aband .a2.isnow{color:var(--ink);font-weight:800}
/* the $ legend lives in the cost column's own header — a different scale from the
   month glyphs, so it never joins their key line */
.axis .ak{display:flex;flex-direction:column;gap:2px;align-items:flex-end;
  font-size:9.5px;font-weight:700;letter-spacing:.02em;white-space:nowrap}
/* the one-line $ key for surfaces with no column header (cards, and lists on a
   phone, where the ruler is hidden) */
.bandkey{max-width:none}
@media(min-width:701px){.axis + .bandkey{display:none}}
/* the named seam between the sweet-spot rows and the peak top-up in the hero box */
.seam{margin:10px 0 4px;font-size:11px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--line-soft);
  padding-bottom:5px}

/* the twenty the Foreign Office warns about: stated, never buried. A page that tells
   you bad news earns the belief that makes the good news worth reading. */
.rowlist a.crow.danger .csay{color:var(--avoid);font-weight:600}
.rowlist a.crow.danger{background:color-mix(in srgb,var(--avoid-bg) 55%,transparent)}
@media(max-width:700px){
  .rowlist a.crow{grid-template-columns:1fr auto;gap:4px 12px;padding:14px 4px}
  .rowlist a.crow .cn{grid-column:1}
  .rowlist a.crow .ccost{grid-column:2;grid-row:1}
  .rowlist a.crow .csay{grid-column:1/-1}
  /* The figures join the strip's row rather than adding a fourth line: a phone row
     that grows a line stops being scannable, which is the whole point of a list. */
  .rowlist a.crow .ctex{grid-column:1;margin-top:6px;align-self:center}
  .rowlist a.crow .cwx{grid-column:2;margin-top:6px;text-align:right;align-items:flex-end}
  .axis .awx{display:none}
  /* On a phone the band runs full width under its row, so the page-top ruler's
     column disappears — instead the anchors travel WITH the data: Jan and Dec
     under each band's ends. The notch still marks the month in question; today's
     tick does not repeat 196 times. */
  .axis{display:none}
  #clist .ctex,.mlist .ctex{margin-bottom:13px}
  #clist .ctex i:first-child::after,.mlist .ctex i:first-child::after{content:"Jan";left:0}
  #clist .ctex i:last-child::after,.mlist .ctex i:last-child::after{content:"Dec";right:0}
  #clist .ctex i:first-child::after,#clist .ctex i:last-child::after,
  .mlist .ctex i:first-child::after,.mlist .ctex i:last-child::after{
    position:absolute;top:15px;font-size:9.5px;font-weight:700;letter-spacing:.05em;
    text-transform:uppercase;color:var(--muted)}
  .door{flex:1 1 44%;font-size:14px;padding:11px 12px}
  input.red.find{min-width:0;flex:1 1 100%;width:100%!important}
}

/* The hero box list. Same row as the rest of the site, but inside a card that is a
   third of the page width — so the four columns stack into two lines rather than
   being squeezed until the sentence truncates. */
.rowlist.herorows a.crow{grid-template-columns:1fr auto;gap:2px 10px;padding:10px 0}
.rowlist.herorows a.crow:first-child{padding-top:0}
.rowlist.herorows a.crow:last-child{border-bottom:0;padding-bottom:0}
.rowlist.herorows a.crow .cn{grid-column:1;font-size:15.5px}
.rowlist.herorows a.crow .ccost{grid-column:2;grid-row:1}
.rowlist.herorows a.crow .csay{grid-column:1/-1;font-size:13.5px}
.rowlist.herorows a.crow .ctex{grid-column:1/-1;height:10px;margin-top:4px}
.rowlist.herorows a.crow .ctex i{height:6px}
.rowlist.herorows a.crow .ctex i.now{height:10px}
.rowlist.herorows a.crow:hover{background:transparent}
.rowlist.herorows a.crow:hover .cn{color:var(--brand-ink)}

/* The trip search. Was a 560px column with the right half of the page empty and the
   button below the fold. A row of short questions is the shape every travel site
   uses, and the whole thing fits on one screen. */
.planbar{display:grid;grid-template-columns:repeat(3,1fr);gap:16px 20px;align-items:start;
  max-width:none;margin-bottom:8px}
.planbar .field{margin:0}
.planbar .field.go{grid-column:1/-1;display:flex;justify-content:center;margin-top:4px}
.planbar .field.go .btn{min-width:240px}
@media(max-width:820px){.planbar{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.planbar{grid-template-columns:1fr}
  .planbar .field.go .btn{width:100%;min-width:0}}

/* ── the world map (phase 3b of plan-editing) ─────────────────────────────────
   Our own SVG from Natural Earth (public domain) — no third party, no key.
   Colour NEVER carries the meaning alone (WCAG 1.4.1, the site's standing
   rule): tapping a country states its month-kind in words in the bar below
   before anything is added, and the legend pairs every colour with its glyph. */
.wmap{position:relative;border:1px solid var(--line-soft);border-radius:12px;
  overflow:hidden;background:var(--surf);touch-action:none;user-select:none}
.wmap svg{display:block;width:100%;height:auto;max-height:62vh}
/* Context landmasses get their own tone rather than the rule colour: at map size
   the two jobs are different, and land that reads as a hairline rule looks unfinished. */
.wm-ctx{fill:var(--land-fill)}
.wm-cty{fill:var(--land-fill);stroke:var(--bg);stroke-width:.6;cursor:pointer}
/* The map fills use the AREA colours, not the text ones - see the palette note.
   This is the one surface where the difference is visible at size. */
.wm-cty.st-good{fill:var(--good-fill)}
.wm-cty.st-cheap{fill:var(--cheap-fill)}
.wm-cty.st-avoid{fill:var(--avoid-fill)}
.wm-cty.st-mid{fill:var(--muted);fill-opacity:.45}
.wm-cty.inroute{stroke:var(--ink);stroke-width:2;vector-effect:non-scaling-stroke}
.wm-cty.wm-sel{stroke:var(--ink);stroke-width:2.5;vector-effect:non-scaling-stroke}
.wm-halo{fill:transparent;cursor:pointer}
.wm-dot{pointer-events:none;fill:var(--ink);fill-opacity:.55}
.wmapbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px;min-height:34px}
.wmchips{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:8px}

/* ---- the counting notice ------------------------------------------------
   A notice with a refusal, not a consent gate — PECR Schedule A1 para 5 allows
   statistics for improving the service without consent, provided there is clear
   information and a simple, free way to object. So it sits at the bottom, does not
   trap focus, and never covers the page: nothing here is being withheld until the
   reader answers, so behaving as though it were would be theatre.

   THE TWO BUTTONS ARE DELIBERATELY IDENTICAL. Same size, same weight, same colour.
   Making refusal quieter than acceptance is the pattern the ICO singles out, it
   fails para 5's own "simple means of objecting", and it is not what this site is. */
.cbanner{position:fixed;left:0;right:0;bottom:0;z-index:60;background:var(--surf);
  border-top:1px solid var(--line-soft);box-shadow:0 -6px 24px rgba(0,0,0,.10)}
.cbanner[hidden]{display:none}
.cbanner-in{display:flex;gap:14px 22px;align-items:center;flex-wrap:wrap;
  padding-top:14px;padding-bottom:calc(14px + env(safe-area-inset-bottom))}
.cbanner p{margin:0;flex:1 1 320px;font-size:14.5px;line-height:1.55;color:var(--ink)}
.cbanner-do{display:flex;gap:10px;flex:0 0 auto}
.cbanner-do button{font:inherit;font-weight:650;font-size:14.5px;min-height:44px;
  padding:10px 18px;border-radius:var(--r-btn);border:1px solid var(--line);
  background:var(--bg);color:var(--ink);cursor:pointer}
.cbanner-do button:hover{background:var(--surf);filter:brightness(.97)}
/* On a phone the row becomes two full-width buttons — still identical to each other,
   and still 44px, which is the smallest thing a thumb can be asked to hit. */
@media (max-width:560px){
  .cbanner-do{width:100%}
  .cbanner-do button{flex:1 1 0}
}

/* The cookies table, and it is the /storage lesson repeating exactly. Every .glance
   header is nowrap and the stacking rule only fires below 379px, so on a 390px phone
   three nowrap headers — "WHAT IT IS CALLED", "WHAT IT DOES", "HOW LONG IT LASTS" —
   pushed the page sideways. Found the same way as last time: by measuring a render,
   because the markup looked perfect. Same fix, for this table only, at the width where
   it is actually tight.

   The name column additionally must not break MID-WORD: gttg_session rendered as
   "gttg_sess / ion" at desktop width, which reads as a typo rather than a cookie. */
@media (max-width:560px){
  .glance.ck th{white-space:normal}
}
.glance.ck td.mono{white-space:nowrap}

/* ---- the map hero -------------------------------------------------------
   Dark in both themes on purpose (see the note in build.py). The map is cropped
   to a letterbox by viewBox rather than by CSS: Antarctica and the high Arctic
   carry no country we cover, so showing them only shrinks everything that matters.
   3600x1400 becomes 0 47 3600 1120, which is 3.21:1. */
.maphero{background:#06282A;color:#F3EFE7;padding:44px 0 0;margin-bottom:var(--sp-md)}
.mh-eyebrow{font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  color:#7FC9C6;font-weight:700;margin:0 0 14px;font-family:var(--body)}
.mh-h1{font-family:var(--display);font-weight:800;letter-spacing:-.03em;line-height:1.0;
  font-size:clamp(38px,7.2vw,76px);margin:0 0 16px;color:#FFFDF9;max-width:16ch}
.mh-sub{color:#BFD9D7;max-width:56ch;font-size:clamp(15px,1.7vw,18px);line-height:1.5;margin:0}
.mh-strip-wrap{margin-top:30px}
.mh-good{font-family:var(--display);font-size:clamp(20px,2.6vw,28px);font-weight:700;
  margin:0 0 10px;color:#FFFDF9}
/* Twelve cells, not a dropdown: it is the same visual language as the seasonal band
   on every country page, so the system reads as one thing rather than two. */
.mh-strip{display:grid;grid-template-columns:repeat(12,1fr);gap:3px;margin-bottom:18px}
.mh-strip .mhcell{font:inherit;font-size:11.5px;font-weight:700;letter-spacing:.06em;
  padding:9px 0;min-height:38px;border:1px solid #17403F;background:#0B3335;color:#8FBFBD;
  cursor:pointer;border-radius:5px;position:relative;overflow:hidden}
.mh-strip .mhcell:hover{background:#124446;color:#DCEFEE}
/* Selection is an OUTLINE, not an amber fill: the amber inside a cell is the
   sparkline bar (the data), and the strategy session's layer rule is that the
   selected-month state and the count-fill must never share a channel — an amber
   selected cell would swallow its own bar. */
.mh-strip .mhcell[aria-pressed="true"]{background:#124446;border-color:#FFFDF9;
  color:#FFFDF9}
/* The sparkline bar: each cell's price-dip count, bottom-anchored, square-root
   scaled with a floor in the build so July's 3 stays a visible nub. The number
   itself rides in the cell's aria-label — the bar is never the only carrier. */
.mh-strip .mh-bar{position:absolute;left:5px;right:5px;bottom:3px;background:#FBBF24;
  opacity:.5;border-radius:2px 2px 1px 1px;pointer-events:none}
.mh-strip .mhcell[aria-pressed="true"] .mh-bar{opacity:.95}
.mh-spark-cap{margin:-10px 0 16px;font-size:11.5px;color:#8FBFBD}
/* The kicker (saying #5) and its live month tag - the month is NAMED here in words
   on both widths, which is what let "Good to go in {month}" retire. */
.mh-kick{font-family:var(--display);font-size:clamp(18px,2.2vw,24px);font-weight:700;
  color:#FFFDF9;margin:0 0 10px;display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.mh-mtag{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;
  font-weight:400;color:#8FBFBD;letter-spacing:.04em}
.mh-stand{display:block;font-size:clamp(17px,2vw,22px);color:#DCEFEE;font-weight:600;
  margin:0 0 6px}
/* The tagline's mobile home: the nav has no room for a third line at phone width,
   so the brand line leads the hero body instead - small, above the H1, only there. */
.mh-tagline-m{display:none}
@media (max-width:600px){
  .mh-tagline-m{display:block;font-size:12.5px;letter-spacing:.06em;color:#7FC9C6;
    margin:0 0 10px}
}
/* The conditional reassurance in the readout - thin months only (see app.js). */
.mh-r-note{font-size:12px;color:#BFD9D7;margin:6px 0 0}
.mh-lsrc{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;
  color:#8FBFBD;margin-left:10px}
@media (max-width:700px){ .mh-lsrc{display:none} }
/* Tick demotion on the hero map (fill-opacity, never element opacity - the country
   hairline must not fade): the calmer teal underneath is what makes the amber dips
   the focal point instead of a rounding error. Avoid stays full strength. */
.mh-map .wm-cty.st-good{fill-opacity:.7}
.mh-map{width:100%;overflow:hidden;background:#06282A;line-height:0}
.mh-map svg{display:block;width:100%;height:auto}
.mh-map .wm-ctx{fill:#17403F}
.mh-map .wm-cty{fill:#17403F;stroke:#06282A;stroke-width:.6;cursor:pointer}
.mh-map .wm-cty.st-good{fill:#2BD4D4}
.mh-map .wm-cty.st-cheap{fill:#FBBF24}
.mh-map .wm-cty.st-avoid{fill:#FF7A5C}
.mh-map .wm-cty.st-mid{fill:#245150}
.mh-map .wm-cty:hover{stroke:#FFFDF9;stroke-width:1.6;vector-effect:non-scaling-stroke}
.mh-map .wm-dot{pointer-events:none;fill:#BFD9D7;fill-opacity:.75}
.mh-map .wm-halo{fill:transparent;cursor:pointer}
.mh-legend{margin:14px 0 0;font-size:13px;color:#BFD9D7}
.mh-legend b{color:#FFFDF9}
.mh-legend .sw{display:inline-block;width:11px;height:11px;border-radius:3px;
  margin-right:5px;vertical-align:-1px}
.mh-chips{margin:8px 0 0;padding-bottom:26px;color:#8FBFBD}
.mh-chips button{font:inherit;font-size:12.5px;background:none;border:0;color:#7FC9C6;
  cursor:pointer;padding:2px 4px;text-decoration:underline}
/* A 350px phone would give a 109px strip of world, which is not a map. It scrolls
   sideways inside its own box instead - the page itself never does. */
@media (max-width:700px){
  .mh-map{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .mh-map svg{width:780px;max-width:none}
  .mh-strip{grid-template-columns:repeat(6,1fr)}
}

/* ---- the hero map's readout and its dawn line -------------------------- */
.mh-mapwrap{position:relative}
.mh-readout{position:absolute;left:max(24px,calc((100% - 1180px)/2));top:18px;z-index:2;
  width:250px;pointer-events:none;background:rgba(6,40,42,.86);border:1px solid #17403F;
  border-radius:10px;padding:12px 14px;backdrop-filter:blur(3px)}
.mh-r-hint{margin:0;font-size:13px;color:#8FBFBD}
.mh-r-name{font-family:var(--display);font-size:26px;font-weight:800;letter-spacing:-.02em;
  line-height:1.1;margin:0 0 4px;color:#FFFDF9}
.mh-r-state{margin:0 0 6px;font-size:13.5px;font-weight:700;color:#DCEFEE}
.mh-r-state .g{margin-right:5px}
.mh-r-src{margin:0;font-size:12px;color:#8FBFBD}
@media (max-width:700px){ .mh-readout{display:none} }

/* The dawn line: fills arrive west to east on load, which is the seasons being
   revealed rather than decoration - and it is the one piece of motion neither
   reference can copy, because neither has world data to animate. Anyone who has
   asked their system not to animate gets the finished map immediately. */
.mh-map .wm-cty{transition:fill .45s ease}
.mh-map.dawn .wm-cty{fill:#17403F}
@media (prefers-reduced-motion:reduce){
  .mh-map .wm-cty{transition:none}
  .mh-map.dawn .wm-cty{fill:inherit}
}

/* The weather table grew High and Low on 21 Aug 2026 (ERA5). Six columns fit a
   390px phone without sideways scroll, but at 14.5px the three temperatures sat
   almost touching - legible, misparseable. A smaller size plus a real gutter
   keeps every column readable; the last cell gives its gutter back so the table
   still ends flush. */
@media (max-width:560px){
  table.glance.wx{font-size:13px}
  .glance.wx td{padding-right:9px}
  .glance.wx td:last-child{padding-right:0}
  /* The rain bar arrived on 23 Aug and pushed a 390px phone 26px sideways. It is
     decoration next to the number, so it gives its width up first rather than the
     figures giving up theirs. */
  /* Thailand's rain runs to three digits where Spain's is two, so the widest real
     table is the one that has to fit -- 5px over at 390px until these came in. */
  .glance.wx td.wxrain .cwxbar{width:15px;margin-right:4px}
  .glance.wx tr.wxm th{padding-left:6px}
  .glance.wx tr.wxm .wxg{margin-right:3px}
  .glance.wx td{padding-right:7px}
  .glance.wx td.wxrain .cwxmm{letter-spacing:-.01em}
}

/* ============ /plan: THE SENTENCE, NOT A FORM — 21 Aug 2026 ============
   The controls ARE the selects they always were, styled as the underlined words
   of a spoken sentence, so phones keep their native pickers and screen readers
   keep their labels. Big type on purpose: the sentence is the hero of the page. */
.plansay .say{font-family:Fraunces,serif;font-size:clamp(20px,3.2vw,30px);line-height:1.5;margin:2px 0}
select.tok{appearance:none;-webkit-appearance:none;border:0;background:transparent;
  font:inherit;color:inherit;padding:0 2px;max-width:100%;
  /* Inline and sized to the CURRENT value, not the longest option and never the
     card: without these two lines the page's own select styling stretched every
     token full-width and the sentence rendered as a broken list. field-sizing is
     the modern behaviour; the width:auto fallback sizes to the longest option,
     which is wordy but still a sentence. */
  display:inline-block;width:auto;min-height:0;field-sizing:content;
  border-bottom:2px dashed var(--accent);border-radius:0;cursor:pointer}
select.tok:focus{outline:2px solid var(--accent);outline-offset:2px}
#p-fromnote{font-family:var(--sans, system-ui, sans-serif)}
#p-fine{margin-top:12px}
#p-fine summary{cursor:pointer;font-size:14px;color:var(--muted)}
/* The route, grouped by month. The month is a heading the way a person says a
   trip: "October we're in Laos". */
.pmonth{margin:20px 0 4px;padding-bottom:4px;border-bottom:1px solid var(--line-soft);
  font-family:Fraunces,serif;font-size:18px;letter-spacing:.02em}
/* Open time is part of the route, in its own voice — dashed, never alarming. */
.stop.gap{border:1px dashed var(--line);border-radius:var(--r-card,12px);
  padding:10px 12px;background:transparent}
.stop.gap .no{opacity:.45}
.heldwhy{color:var(--muted)}
/* One Change fold per stop; the verbs live inside it. */
.ptools{display:inline-block;margin-left:8px}
.ptools summary{cursor:pointer;display:inline;color:var(--muted)}
.ptools[open] summary{color:inherit}
.ptools span{display:inline-block;margin-left:6px}

/* The shelf: three duration-shaped starts on the pristine /plan arrival
   (PLAN-SIMPLIFICATION.md §8). Cards on desktop, one thumb-row on phones. */
#p-shelf{margin:14px 0 0}
.shelflabel{margin:0 0 8px}
.shelfrow{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.shelfcard{text-align:left;font:inherit;color:var(--ink);background:var(--bg);
  border:1px solid var(--line-soft);border-radius:var(--r-card);padding:12px 14px;
  cursor:pointer;display:flex;flex-direction:column;gap:4px}
.shelfcard b{font-family:var(--display);font-size:18px;font-weight:600}
.shelfcard:hover{border-color:var(--line)}
@media (max-width:700px){
  .shelfrow{display:flex;overflow-x:auto;padding-bottom:6px;-webkit-overflow-scrolling:touch}
  .shelfcard{min-width:74%}
}

/* ============ THE TRIP PAGE as the planner's sibling — 21 Aug 2026 ============
   The trip's own map in the homepage's band: route countries in their month's
   colour, everything else dim, numbered capitals joined in order. */
.triphero{background:#06282A;color:#F3EFE7;padding:36px 0 0;margin-bottom:var(--sp-sm)}
.triphero .wrap{padding-bottom:18px}
.tr-eyebrow{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;letter-spacing:.08em;
  text-transform:uppercase;color:#BFD9D7;margin:0 0 10px}
.tr-namerow{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px 16px;margin:0}
.tr-name{font-family:var(--display);font-weight:800;letter-spacing:-.03em;line-height:1.02;
  font-size:clamp(34px,5.6vw,64px);color:#FFFDF9;margin:0;overflow-wrap:anywhere}
.tr-rename{font:inherit;font-size:14px;color:#BFD9D7;background:transparent;border:1px solid #3C6463;
  border-radius:999px;padding:5px 12px;cursor:pointer}
.tr-rename:hover{color:#FFFDF9;border-color:#BFD9D7}
.tr-sum{color:#BFD9D7;font-size:clamp(15px,1.7vw,18px);margin:12px 0 0;max-width:64ch;line-height:1.5}
.tr-sum b{color:#FFFDF9;font-weight:600}
.tr-map{width:100%;overflow:hidden;background:#06282A;line-height:0;margin-top:18px}
.tr-map svg{display:block;width:100%;height:auto;max-height:520px}
.tr-map .wm-ctx{fill:#17403F}
.tr-map .wm-cty{fill:#17403F;stroke:#06282A;stroke-width:.6}
.tr-map .wm-cty.tm-dim{fill:#17403F;fill-opacity:.55}
.tr-map .wm-cty.inroute{stroke:#FFFDF9;stroke-width:1.4;vector-effect:non-scaling-stroke;cursor:pointer}
.tr-map .wm-cty.st-good{fill:#2BD4D4}
.tr-map .wm-cty.st-cheap{fill:#FBBF24}
.tr-map .wm-cty.st-avoid{fill:#FF7A5C}
.tr-map .wm-cty.st-mid{fill:#5E7F7E}
.tr-map .tm-line{fill:none;stroke:#FFFDF9;stroke-opacity:.85;stroke-linejoin:round;stroke-linecap:round;stroke-dasharray:6 7}
.tr-map .tm-pin{cursor:pointer}
.tr-map .tm-pin circle{fill:#FFFDF9;stroke:#06282A}
.tr-map .tm-pin text{fill:#06282A;font-family:var(--body);font-weight:700}
.tr-legend{margin:12px 0 0;font-size:13px;color:#BFD9D7;line-height:1.7}
.tr-legend .sw{display:inline-block;width:11px;height:11px;border-radius:3px;vertical-align:-1px;margin:0 5px 0 0}
.tr-legend b{color:#FFFDF9}
/* The plan and its furniture: two columns on desktop, one on phones. */
.tripgrid{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(280px,1fr);gap:18px;align-items:start}
@media (max-width:900px){.tripgrid{grid-template-columns:1fr}}
.tripgrid .card{max-width:none}
/* A stop on the trip page wears its month's colour as a left edge and a plain
   badge a child can read. */
.tstop{border-left:5px solid var(--line-soft)}
.tstop.st-cheap{border-left-color:var(--cheap)}
.tstop.st-good{border-left-color:var(--good)}
.tstop.st-avoid{border-left-color:var(--avoid)}
.tbadge{display:inline-block;font-size:12.5px;padding:2px 9px;border-radius:999px;margin-left:6px;
  background:var(--surf);color:var(--muted)}
.tbadge.st-cheap{background:var(--cheap-bg);color:var(--cheap)}
.tbadge.st-good{background:var(--good-bg);color:var(--good)}
.tbadge.st-avoid{background:var(--avoid-bg);color:var(--avoid)}
.tr-map .tm-home{fill:#06282A;stroke:#BFD9D7;stroke-dasharray:3 3}
/* On the trip page the strip's one job is "this is when we go": a ring on the month. */
.tstop .mini i.now{height:16px;outline:2px solid var(--ink);outline-offset:1px;border-radius:3px}
.tr-name-input{font-family:var(--display);font-weight:800;letter-spacing:-.03em;line-height:1.02;
  font-size:clamp(30px,5vw,56px);color:#FFFDF9;background:transparent;border:0;border-bottom:2px dashed #BFD9D7;
  padding:0 2px;width:100%;max-width:22ch;min-height:0;border-radius:0}
.tr-name-input:focus{outline:2px solid var(--accent);outline-offset:4px}
.tr-name[data-editable="1"]{cursor:text}
.tr-name[data-editable="1"]:hover{text-decoration:underline dashed #BFD9D7;text-underline-offset:8px}
.tr-pencil{font-size:.5em;color:#BFD9D7;margin-left:10px;vertical-align:middle;font-weight:400}
.tr-renamebtns{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:8px}
.tripmain,.triprail{min-width:0}
.tr-flags{font-size:1.15em;letter-spacing:.06em;margin-right:4px}
.tripgrid.solo{grid-template-columns:1fr}
.tripgrid.solo .tripmain{max-width:780px}

/* ═══ THE ITINERARY (/plan) — 24 August 2026 ══════════════════════════════════
   docs/plans/THE-PLANNER-THAT-PLANS.md · designed with Claude Design.
   Philip: "IT SHOULD ALL BE LISTED. IT SHOULD ALL BE SHOWN." So there is no
   disclosure anywhere in here: every control a stay owns is on the stay's row at
   desktop width, and the row stacks rather than folds on a phone. */
.itinband{border:1px solid var(--line-soft);border-left:3px solid var(--brand-ink);
  border-radius:var(--r-card);padding:16px 18px;margin:22px 0 4px;background:var(--surf)}
.itinh{margin:0;font-family:var(--display);font-weight:800;
  font-size:clamp(21px,3vw,29px);letter-spacing:-.02em;line-height:1.18}
/* The start date is a WORD in the sentence, like every token on the card above —
   one grammar for the page, not a form field bolted under a headline. */
.istartbtn{font:inherit;color:var(--brand-ink);background:none;border:0;padding:0;
  cursor:pointer;border-bottom:2px dotted currentColor}
.istartbtn:hover{border-bottom-style:solid}
.itinsum{margin:8px 0 0;font-size:15px}
.itinslack{margin:4px 0 0;font-size:13px;color:var(--muted)}
.itinstart{margin:10px 0 0;display:flex;gap:8px;align-items:center;flex-wrap:wrap}

.itinlist{list-style:none;margin:6px 0 0;padding:0}
/* MONTH HEADERS, and Claude Design's reason is structural rather than visual:
   two 30-night stays cannot print under one header, so the defect Philip
   photographed becomes impossible to draw. The YEAR sits here too, which is what
   kills the old yearless %12 wrap. */
.imonth{display:flex;gap:10px;align-items:baseline;margin:22px 0 6px;
  padding-bottom:5px;border-bottom:1px solid var(--line-soft);
  font-family:var(--display);font-size:18px;letter-spacing:.02em}

.istay{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;
  border:1px solid var(--line-soft);border-left:3px solid var(--line);
  border-radius:var(--r-card);padding:12px 14px;margin-bottom:10px;background:var(--bg)}
/* The month's own state, as the same left edge the trip page's stops already
   wear. Colour never carries meaning alone here: the words and the strip below
   say the identical thing. */
.istay.st-cheap{border-left-color:var(--cheap-fill)}
.istay.st-good{border-left-color:var(--good-fill)}
.istay.st-avoid{border-left-color:var(--avoid-fill)}
.istay.dragging{opacity:.45}
.istay.over{border-color:var(--brand-ink);box-shadow:0 0 0 2px var(--brand-ink) inset}
.igrip{grid-row:1/3;align-self:start;color:var(--muted);cursor:grab;
  font-size:17px;line-height:1.4;padding:2px 2px 0 0;user-select:none}
.igrip:active{cursor:grabbing}
.imain{min-width:0}
.iname{font-weight:700;display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}
.iname a{text-decoration:none;color:inherit}
.iname a:hover{color:var(--brand-ink)}
.iplace{font-weight:400;color:var(--muted)}
.idup{font-size:12px;font-weight:400;color:var(--muted)}
.imeta{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap;margin-top:2px}
.idates{font-variant-numeric:tabular-nums}
.inightslab{font-size:13px;color:var(--muted)}
.iwhy{font-size:13.5px;color:var(--muted);margin-top:3px}

/* The verbs. Every one of them visible — this is the row that replaced a
   <details><summary>Change</summary> nobody could find the bottom of. */
.iedit{grid-column:2;display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;
  margin-top:8px;padding-top:8px;border-top:1px dashed var(--line-soft)}
.istep{display:inline-flex;align-items:center;gap:2px}
.iact{font:inherit;line-height:1;cursor:pointer;color:var(--ink);background:var(--bg);
  border:1px solid var(--line-soft);border-radius:8px;padding:5px 9px;min-width:32px}
.iact:hover:not(:disabled){border-color:var(--brand-ink);color:var(--brand-ink)}
.iact:disabled{opacity:.35;cursor:default}
.ifield{font:inherit;color:var(--ink);background:var(--bg);border:1px solid var(--line-soft);
  border-radius:8px;padding:5px 8px}
.i-n{width:4.5em;text-align:center;font-variant-numeric:tabular-nums}
.i-place{flex:1 1 12em;min-width:9em}
.iverbs{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-left:auto}
.itinadd{margin:16px 0 0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}

/* THE PICKER. Claude Design ruled a 196-row select "a wall at any reading
   level"; I added the floor that a child can scroll a list and cannot spell
   "Uzbekistan", so it opens on judged chips and typing only accelerates. */
.ipickpanel{grid-column:1/3}
.ipick{border:1px solid var(--line-soft);border-radius:var(--r-card);
  padding:12px 14px;margin-top:10px;background:var(--surf)}
.ipick .ifield{width:100%;max-width:26em}
.ipickrows{display:grid;grid-template-columns:repeat(auto-fill,minmax(15em,1fr));
  gap:6px;margin-top:10px;max-height:19em;overflow-y:auto}
.ipickrow{font:inherit;text-align:left;cursor:pointer;color:var(--ink);
  background:var(--bg);border:1px solid var(--line-soft);border-left:3px solid var(--line);
  border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:2px}
.ipickrow:hover{border-color:var(--brand-ink)}
.ipickrow.st-cheap{border-left-color:var(--cheap-fill)}
.ipickrow.st-good{border-left-color:var(--good-fill)}
.ipickrow.st-avoid{border-left-color:var(--avoid-fill)}
.ipickrow .ipn{font-weight:650}
.ipickrow .ipw,.ipickrow .ipdup{font-size:12.5px;color:var(--muted)}

@media (max-width:760px){
  /* The row stacks; it never folds. A phone gets fewer columns, not fewer
     controls — hiding a verb on a small screen is the disclosure this rebuild
     exists to remove, wearing a responsive hat. */
  .istay{grid-template-columns:auto 1fr}
  .iedit{flex-direction:column;align-items:stretch}
  .iverbs{margin-left:0;justify-content:flex-start}
  .i-place{flex:1 1 auto;width:100%}
  .ipickrows{grid-template-columns:1fr}
}

/* ═══ THE READING RAIL — 24 August 2026 ══════════════════════════════════════
   docs/plans/THE-BLAND-PAGES.md element (b), ruled by Claude Design and measured
   as missing on 24 Aug: the letterhead band shipped and the LAYOUT never did, so
   "half the screen is empty" survived the fix that was supposed to end it.
   /afford's body ran x=98..680 of 1280 for 1,140px of scroll.

   Claude Design's spec, adopted: ~660 measure + ~340 rail, 48px gap, centred —
   AND the clause that stops this becoming decoration: THE RAIL MUST BE
   FUNCTIONAL, NOT DECORATIVE. A page with nothing rail-worthy gets the honest
   wide column below instead of a faked rail. */
.pagegrid{display:grid;grid-template-columns:minmax(0,660px) minmax(0,340px);
  gap:48px;align-items:start;max-width:1100px;margin:0 auto}
.pagegrid > .measure{min-width:0}
.pagegrid > .rail{min-width:0;position:sticky;top:18px}
.rail .card{padding:16px 18px}
.railhead{font-size:12px;text-transform:uppercase;letter-spacing:.08em;
  color:var(--muted);margin:0 0 8px}
/* An honest wide column beats a faked rail — Claude Design's clause, made a
   class so the choice is visible in the source rather than implied by absence. */
.measure-wide{max-width:760px;margin:0 auto}
@media (max-width:900px){
  .pagegrid{grid-template-columns:1fr;gap:26px;max-width:760px}
  .pagegrid > .rail{position:static}
}
/* The strip rides the meta line at the same 132px the /countries rows use — a
   12-month strip stretched to a 1,100px row reads as a chart of something, and
   it is not a chart, it is a glance. */
.istay .mini{width:132px;margin:0;flex:0 0 auto}
.istay .mini i{flex:1}
.istepu{font-size:13px;color:var(--muted);margin-left:4px}
@media (max-width:620px){ .istay .mini{width:112px} }
/* Real dates on a saved trip's stop — their own class, not .why: overloading the
   reason line with something that is not a reason made the reason assertion read
   a date, which is the check doing its job. */
.tstop .tdates{font-weight:700;font-variant-numeric:tabular-nums;margin-top:4px}
/* The rail's jump-nav: where you are on a long list, and how far you've got.
   The counts already existed and were stranded beside their own headings, where
   only one could be seen at a time; here they are the state of the whole page. */
.jumpnav{list-style:none;margin:0;padding:0;display:grid;gap:2px}
.jumpnav li{display:flex;justify-content:space-between;gap:10px;align-items:baseline;
  padding:7px 0;border-bottom:1px solid var(--line-soft)}
.jumpnav li:last-child{border-bottom:0}
.jumpnav a{text-decoration:none;color:var(--ink);font-weight:600}
.jumpnav a:hover{color:var(--brand-ink)}
.jumpnav .checkcount{font-size:12.5px;color:var(--muted);white-space:nowrap}
/* THE READING FIELDS ARE THE EDITORS (Claude Design's guard, 24 Aug): no second
   representation of anything. The country NAME is the button that changes it,
   the place text IS its own field, and the length is the typed integer. */
.icountry{font:inherit;font-weight:700;color:var(--ink);background:none;border:0;
  padding:0;cursor:pointer;border-bottom:2px dotted var(--line);display:inline-flex;
  gap:6px;align-items:baseline}
.icountry:hover,.icountry[aria-expanded="true"]{color:var(--brand-ink);border-bottom-color:currentColor}
.iname .i-place{font:inherit;border-color:transparent;background:none;padding:3px 6px;
  min-width:11em;max-width:18em}
.iname .i-place:hover{border-color:var(--line-soft)}
.iname .i-place:focus{border-color:var(--brand-ink);background:var(--bg)}
.igo{text-decoration:none;color:var(--muted);font-size:13px}
.igo:hover{color:var(--brand-ink)}
/* The three rare verbs: always visible so nothing is hidden, quiet so twenty
   rows do not become a toolbar. */
.iverb{font:inherit;font-size:13px;color:var(--muted);background:none;border:0;
  padding:4px 6px;cursor:pointer;border-radius:6px}
.iverb:hover:not(:disabled){color:var(--brand-ink);background:var(--surf)}
.iverb:disabled{opacity:.3;cursor:default}
.itintoast{margin:8px 0 0;font-size:13px;font-weight:650;color:var(--brand-ink)}
/* The sheet's long tail — the select's one virtue, kept. */
.ipicktail{max-height:15em}
/* A specimen in the rail keeps its evidence job and loses its page-width habits. */
.railspec{margin:0;padding:14px 16px;border:1px solid var(--line-soft);
  border-radius:var(--r-card);background:var(--surf)}
.railspec figcaption{font-size:13px;color:var(--muted);margin-top:10px}
.railspec .figrow{gap:14px 18px}

/* ═══ THE ORDER ROW, IN THREE FAMILIES — 24 August 2026 ══════════════════════
   docs/plans/SORTING-THE-WEATHER.md · Claude Design: "Group, don't cut. A row
   stops being a row when you must read all of it to use it; grouping restores
   the glance." WHEN · WHAT MATTERS · WHERE — three choices, not seven buttons. */
.orderrow{display:flex;flex-wrap:wrap;gap:10px 22px;align-items:baseline}
.ordfam{display:flex;flex-wrap:wrap;gap:6px;align-items:baseline}
.ordfamlb{font-style:normal;font-size:11.5px;text-transform:uppercase;
  letter-spacing:.07em;color:var(--muted);white-space:nowrap;margin-right:2px}
/* The month the fact-doors read. Rain and an afternoon mean nothing without one,
   and on /countries the month moves under the reader — so it is declared, never
   assumed. */
.ordmonth{font-weight:600;text-transform:none;letter-spacing:0;color:var(--ink)}
.ord[disabled]{opacity:.4;cursor:default}
/* THE LABEL IS THE EDITOR (Claude Design, 24 Aug 2026): the reader's number sits
   INSIDE the door as part of its label, not bolted to the side of it — one
   representation of one fact, which is the same rule the planner's stays follow.
   There is no default value: a prefilled 25 would be our line in a friendlier
   font, and the line is exactly what this control refuses to own. */
.ordclose{display:inline-flex;align-items:baseline;gap:0;
  border:1px solid var(--line-soft);border-radius:999px;background:var(--bg);
  padding:0 14px 0 0;transition:background .12s ease}
.ordclose .ord{border:0;background:none;padding:8px 2px 8px 14px;border-radius:999px 0 0 999px}
.ordclose .ord[aria-pressed="true"]{background:none;color:inherit}
.ordclose:has(.ord[aria-pressed="true"]){background:var(--brand-ink);border-color:var(--brand-ink)}
.ordclose:has(.ord[aria-pressed="true"]) .ord,
.ordclose:has(.ord[aria-pressed="true"]) .ordtemp,
.ordclose:has(.ord[aria-pressed="true"]) .orddeg{color:var(--bg)}
.ordtemp{font:inherit;font-size:13.5px;font-weight:650;width:2.6em;text-align:right;
  border:0;background:none;color:inherit;padding:8px 0;
  font-variant-numeric:tabular-nums;-moz-appearance:textfield}
.ordtemp::-webkit-outer-spin-button,.ordtemp::-webkit-inner-spin-button{
  -webkit-appearance:none;margin:0}
.ordtemp::placeholder{color:inherit;opacity:.45}
.orddeg{font-style:normal;font-size:13.5px;font-weight:650;color:inherit;padding-left:1px}
.ordclose:focus-within{outline:2px solid var(--brand-ink);outline-offset:1px}
.ordtemp[disabled],.ordclose:has(.ord[disabled]){opacity:.4}
@media (max-width:620px){
  .orderrow{gap:12px 14px}
  .ordfam{width:100%}
}
/* A <button> will not let its text wrap the way the bold word it replaced did, so
   the twelve-month table grew 7px past a 390 screen — caught by the standing
   "nothing scrolls sideways on a phone" check, which is why that check exists.
   The headings stay full-size where there is room and shrink where there is not;
   they are still the controls, just narrower ones. */
.wxsort{white-space:normal;max-width:100%}
@media (max-width:430px){
  /* The base .glance cell padding is 8px 8px 8px 0 — asymmetric on purpose — so
     setting both sides ADDS 4px on the left where there was none. Only the right
     comes down here, and the heading type with it. */
  table.glance.wx{font-size:13px}
  .wxsort{font-size:12px;letter-spacing:-.015em}
  .glance.wx th,.glance.wx td{padding-right:4px}
}
/* THE EVIDENCE FOR THE ORDER (Claude Design's release condition, 24 Aug 2026).
   The site sorts on tenths and prints whole degrees, so while the warmth door
   runs every row prints how far it is from the reader's own number. Without it
   a reader who asked for 25 sees 26 above 25 and cannot check it by reading —
   and checking by reading is the standard this whole design stands on. */
.cwxoff{font-size:11.5px;color:var(--muted);white-space:nowrap;
  font-variant-numeric:tabular-nums;margin-left:6px}
/* A greyed door with no words is a dead control; these two say why they sleep. */
.ordwake{font-style:normal;font-size:12px;color:var(--muted);margin-left:6px}
