/* brand.css — the Nabad wordmark, defined once.
 *
 * Before this file the mark drifted per page: 20px and ink-black with a dot
 * inside the app, 28px and purple with NO dot on the landing page, 26px on
 * the legal pages, and missing entirely on a few. Every page carried its own
 * copy of the rules, so they drifted apart quietly.
 *
 * Canonical mark: pulsing brand dot + "Nabad" in Permanent Marker, at one
 * size and one colour everywhere. Both class names are covered — `.wordmark`
 * (app pages) and `.logo` (marketing/legal) — so no page has to be re-marked
 * up to pick this up.
 *
 * Loaded LAST in <head> so it wins over each page's inline styles.
 */

/* ===================================================================
   The palette, defined once for the whole site.
   ===================================================================
   Every page carried its own copy of these tokens, and they had drifted
   into three different versions of the same brand: --coral was #FF6BC0 on
   eight pages and #FF4FB8 on four, --cyan was #0098B8 on six and #00C8E6
   on two, and two pages still ran green-tinted neutrals (#0E1B17,
   #4D6660, #E4ECE9) left over from an earlier look. That green cast under
   everything is most of why the site read cooler than it was meant to.

   This file loads last, so these values win on every page and the inline
   copies become vestigial. Change a colour here and it changes everywhere.

   Nabad is purple and pink, with a hint of blue:

     PURPLE   the identity. Primary actions, links, the wordmark.
     PINK     what is happening now. Live rooms, open surveys.
     BLUE     the hint. Closed and past things, secondary information.
     ORANGE   one exception, and only in Trash. A warning has to sit
              outside the family or it stops reading as a warning.

   The three brand hues are evenly spread across the cool half of the
   wheel (blue 229, purple 271, pink 326), which is what makes them read
   as one system rather than three choices. Blue used to be teal at hue
   190, which sat outside the family and looked green next to the pink.

   Every -text value clears 4.5:1 on white and on its own tint, so any of
   them can carry small text. The bright values are for fills, dots and
   underlines, not for sentences.
   =================================================================== */
:root {
  /* Purple — the identity. Named --teal for historical reasons; the
     --purple aliases below say what it actually is. */
  --teal-dark: #6B1FC2;   /* 8.1:1 on white */
  --teal: #A44BFF;
  --teal-light: #F8F0FF;
  --brand: #6B1FC2;

  /* Bubblegum — live, open, happening now. Candy rather than magenta:
     the old pink and the old purple were both deep and cool and sat on the
     page as one mass. */
  --coral: #FF6BC0;
  --coral-text: #CC1478;  /* 5.3:1 on white, 4.8:1 on its tint */
  --coral-light: #FFF0F8;

  /* Sky — the hint of blue. Was an indigo, which sat one hue from the
     purple and pooled with it. This is the blue from the homepage ribbon. */
  --cyan: #35A8F0;
  --cyan-text: #1E6FC4;   /* 5.1:1 on white, 4.6:1 on its tint */
  --cyan-light: #EBF6FE;

  /* Orange — Trash in the interface, and the fourth series colour in a
     chart. Mango rather than the burnt red-orange it was: at bar size the
     old one read brown, which is nobody's idea of a brand colour. The -text
     value is the only one dark enough to carry small type on the tint, and
     it is deliberately not the same orange. */
  --orange: #FFB02E;
  --orange-text: #AD5304;  /* 5.2:1 on white, 4.8:1 on its tint */
  --orange-light: #FFF5E6;

  /* Endings — End session, Delete, Closed. There is no red in Nabad. A red
     button tells a host they are about to do something wrong, and ending a
     session you meant to end is not wrong. So the deep pink already in the
     set carries it: firm, unmistakably not the blue you just clicked to go
     live, and not alarming. --ruby stays as an alias so nothing that already
     refers to it breaks. */
  --end: #CC1478;         /* 5.3:1 on white, 4.8:1 on its tint */
  --end-light: #FFF0F8;
  --ruby: #CC1478;
  --ruby-text: #CC1478;
  --ruby-light: #FFF0F8;

  /* Yes — verified, done, correct. The one affirmative colour, and the only
     green in Nabad. It was five near-identical greens invented separately in
     two files (#15803D, #126A33, #16A34A, #1F7A4D, #0A7D55), which is how a
     palette stops being a palette. Green is not a brand colour here and never
     appears as one; it says a thing has been checked, and nothing else.
     Anything that is merely a language, a state, or a series colour must not
     reach for it. */
  --yes: #15803D;         /* white on it is 5.0:1 */
  --yes-hover: #126A33;
  --yes-text: #166534;    /* 7.1:1 on white, 6.8:1 on its tint */
  --yes-light: #F0FDF4;
  --yes-edge: #86EFAC;

  /* Live — Present, Join, the live pill. The one thing on a page you can
     walk into, so it is the brightest colour in the set. */
  --now: #35A8F0;
  --now-light: #EBF6FE;
  --now-text: #1E6FC4;

  /* Neutrals, warm rather than green. */
  --ink: #1A1A1A;
  --ink-soft: #5F5E5A;
  --ink-mute: #6E6C66;
  --bg: #FCFCF9;
  --line: #EDEAE4;
  --line-soft: #F4F2ED;
  --white: #FFFFFF;

  --error: #C0392B;
  --error-bg: #FCEBE8;

  /* Aliases some pages use for the same things. */
  --text: #1A1A1A;
  --muted: #5F5E5A;
  --border: #EDEAE4;

  /* Series colours, in the order a chart should use them: purple, pink,
     blue, orange, then a light purple when a fifth is needed. The AI caps
     word-cloud clusters at five, so five is the real ceiling, not four.
     Each carries a -from for where its bar gradient starts, and a -bg tint.

     Bars run LIGHT to DEEP, not deep to light, for two reasons. Most of a
     bar's area is then the pale end, so a screen of results reads open
     rather than heavy. And the percentage moves inside the bar and turns
     white once the bar passes 80%, landing on the right-hand end, where the
     deep colour is.

     Orange is the exception and has to be. A mango light enough to look like
     mango cannot carry white text: white on #F5901E is 2.4:1. So the number
     on an orange bar is near-black instead, which reads at 6.2:1 on the deep
     end and 11.3:1 on the pale one. Every other series keeps white. */
  --series-1: #6B1FC2;  --series-1-mid: #A44BFF;  --series-1-from: #DCAEFF;  --series-1-bg: #F8F0FF;
  --series-2: #CC1478;  --series-2-mid: #FF6BC0;  --series-2-from: #FFC4E8;  --series-2-bg: #FFF0F8;
  --series-3: #1E6FC4;  --series-3-mid: #35A8F0;  --series-3-from: #A8E0FF;  --series-3-bg: #EBF6FE;
  --series-4: #D9700F;  --series-4-mid: #FFB02E;  --series-4-from: #FFE0A0;  --series-4-bg: #FFF5E6;
  --series-5: #8A27D9;  --series-5-mid: #C77CF5;  --series-5-from: #E4BBFF;  --series-5-bg: #F8EFFE;

  /* Honest names, same values. New code can use these; the old names stay
     so twelve files do not have to be rewritten to change a colour. */
  --purple-dark: #6B1FC2;
  --purple: #A44BFF;
  --purple-light: #F8F0FF;
  --pink: #FF6BC0;
  --pink-text: #CC1478;
  --pink-light: #FFF0F8;
}

/* == What a button's colour means ===================================
   Pink is for making something that did not exist a moment ago: a new
   session, a new survey, one more question. Purple is for acting on
   something already there: present it, edit it, share it, close it.

   Two reasons this lives here rather than in each page.

   One: these buttons sit in four files under four different class names
   (.primary-btn, .btn btn-primary, .btn-join, an inline style), so a rule
   written per page drifts the moment one page is rewritten. That already
   happened once, which is how the dashboard ended up all purple while the
   editor went all pink.

   Two: brand.css loads last on every page, so this wins without needing
   !important. The ID selectors beat the class rules they override.

   The pink is --pink-text #CC1478, never --pink #FF6BC0: white on the
   bright pink is 3.4:1 and fails, white on this one is 5.8:1 and passes.
   =================================================================== */
/* Purple makes something that did not exist a moment ago. */
#addQBtn,
.primary-btn[data-create],
.btn-create {
  background: var(--purple-dark, #6B1FC2);
  border-color: var(--purple-dark, #6B1FC2);
  color: #FFFFFF;
}

/* Sep 12 2026: the dashboard's two shelf buttons are the exception, and the
   reason is hierarchy rather than meaning. They still make something that did
   not exist a moment ago, so they stay purple, but a FILLED purple sat beside
   a filled purple Present on every card below them, and the page's
   once-a-day action ended up looking exactly like the card's every-time one.
   Purple on the purple tint: 7.27:1, loudest thing in the shelf heading,
   no longer loudest on the screen. `.primary-btn[data-create]` above is the
   empty-state button and KEEPS the fill — on a shelf with nothing on it, it
   is the only thing to press. */
#newSessionBtn,
#newSurveyBtn {
  background: #FFFFFF;
  border-color: #EADCFB;
  color: var(--purple-dark, #6B1FC2);
}

/* The bright sky is a room with people in it right now. Join and Present
   are the two doors into one, so they are the same colour on purpose. */
/* Ink, not white. The new palette is lighter than the one it replaced:
   white on this blue is 2.6:1 and fails outright, ink is 6.6:1. Keep the
   bright fill, darken the letters — the same call the Join button on the
   homepage already makes. */
.btn-join,
#presentBtn,
.btn-present {
  background: var(--now, #35A8F0);
  border-color: var(--now, #35A8F0);
  color: var(--ink, #1A1A1A);
}

/* The deep pink stops something. These were ghost buttons or family-coloured
   ones, which made End session look exactly as inviting as Present: the only
   thing telling them apart was the word on the button. */
#endBtn,
.btn-end,
.btn-danger,
.danger-btn,
button[data-danger],
.confirm-delete {
  background: var(--end, #CC1478);
  border-color: var(--end, #CC1478);
  color: #FFFFFF;
}

#newSessionBtn:hover,
#newSurveyBtn:hover { background: #F1E5FF; border-color: #DFC9F7; filter: none; }

#addQBtn:hover,
.primary-btn[data-create]:hover,
.btn-create:hover,
.btn-join:hover,
#presentBtn:hover,
.btn-present:hover,
#endBtn:hover,
.btn-end:hover,
.btn-danger:hover,
.danger-btn:hover,
button[data-danger]:hover,
.confirm-delete:hover {
  filter: brightness(1.08);
}

:root {
  --blue: #35A8F0;
  --blue-text: #1E6FC4;
  --blue-light: #EBF6FE;
}

.wordmark,
a.logo,
.logo {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
  font-family: 'Permanent Marker', 'Bricolage Grotesque', cursive;
  font-weight: 400;
  font-size: 22px;
  letter-spacing: 0.01em;
  line-height: 1;
  /* Fallbacks matter: the marketing pages don't all define --ink. */
  color: var(--ink, #0E1B17);
}

.wordmark:hover,
a.logo:hover,
.logo:hover { opacity: .85; }

/* The dot is the mark. Two class names exist in the wild — `.dot` inside the
   app and `.logo-pulse` on the marketing and legal pages — so both are styled
   here rather than re-marking up four pages. Fixed gradient rather than a
   variable, because the colour tokens are named --teal-dark / --coral on some
   pages for historical reasons and don't exist at all on others. */
.wordmark .dot,
a.logo .dot,
.logo .dot,
.wordmark .logo-pulse,
a.logo .logo-pulse,
.logo .logo-pulse {
  width: 11px;
  height: 11px;
  border-radius: 50%;
  flex-shrink: 0;
  background: linear-gradient(135deg, #6B1FC2, #FF4FB8);
  animation: nabad-pulse 1.6s ease-in-out infinite;
}

@keyframes nabad-pulse {
  0%, 100% { transform: scale(1);    opacity: 1;   }
  50%      { transform: scale(1.18); opacity: .72; }
}

@media (prefers-reduced-motion: reduce) {
  .wordmark .dot, a.logo .dot, .logo .dot,
  .wordmark .logo-pulse, a.logo .logo-pulse, .logo .logo-pulse { animation: none; }
}

/* Permanent Marker has no Arabic glyphs — fall back to the Arabic stack so
   the mark doesn't render in a default serif on Arabic pages. */
html[lang="ar"] .wordmark,
html[lang="ar"] a.logo,
html[lang="ar"] .logo {
  font-family: 'IBM Plex Sans Arabic', 'Cairo', 'Bricolage Grotesque', sans-serif;
  font-weight: 700;
}

/* Persian rides on every direction and mirroring fix Arabic paid for, but not
   on its face. IBM Plex Sans Arabic does draw پ چ ژ گ, yet not the way a
   Persian reader expects to see them. Vazirmatn is the de facto Persian UI
   typeface and is on Google Fonts, so it costs one more family in the link
   tag that every page already carries. Arabic keeps Plex. */
html[lang="fa"] .wordmark,
html[lang="fa"] a.logo,
html[lang="fa"] .logo {
  font-family: 'Vazirmatn', 'IBM Plex Sans Arabic', 'Bricolage Grotesque', sans-serif;
  font-weight: 700;
}

/* Everything brand.css sets in Inter, Persian pages set in Vazirmatn. Page
   <style> blocks are parsed after this file, so each page carries its own
   html[lang="fa"] body rule too; this one covers the shared components
   (the account menu, the top bar) that live only here. */
html[lang="fa"] body,
html[lang="fa"] .nb-bar,
html[lang="fa"] .acct-menu,
html[lang="fa"] .acct-btn {
  font-family: 'Vazirmatn', 'IBM Plex Sans Arabic', system-ui, sans-serif;
}

/* ── Account menu (public/account-menu.js) ─────────────────────────────────
   Lives here rather than in each page's inline <style> so the avatar looks
   the same on the dashboard, the account page and anywhere it's added next.
   Logical properties throughout so it flips correctly in Arabic. */
.acct { position: relative; display: inline-block; }

.acct-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  border-radius: 50%;
  line-height: 1;
}
/* A head-and-shoulders figure, not initials. Initials were taken from the
   first two characters of the email local part, so scarlettjebara@ read as
   "SC" — letters that are not anyone's initials, and meaningless for an
   address that starts with a number or a non-Latin script. A pale tint keeps
   the avatar from becoming a third saturated block beside Join and Create. */
.acct-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  overflow: hidden;
  /* The disc and the stroke live here, not inside the SVG, so the avatar
     follows --teal-dark with everything else instead of pinning a hex of
     its own and going stale the next time the palette moves. */
  background: var(--teal-light);
  color: var(--teal-dark);
}
.acct-avatar svg { display: block; width: 100%; height: 100%; }
.acct-btn:hover .acct-avatar { filter: brightness(1.08); }
.acct-btn:focus-visible { outline: 3px solid #6B1FC2; outline-offset: 3px; }

.acct-menu {
  position: absolute;
  inset-block-start: calc(100% + 10px);
  inset-inline-end: 0;
  min-width: 232px;
  background: #fff;
  border: 1px solid var(--border, #E5E2DD);
  border-radius: 12px;
  box-shadow: 0 12px 32px rgba(0, 0, 0, .12);
  padding: 6px;
  z-index: 200;
  font-family: 'Inter', 'IBM Plex Sans Arabic', system-ui, sans-serif;
}
.acct-head { padding: 10px 12px 8px; border-bottom: 1px solid var(--border, #E5E2DD); margin-bottom: 6px; }
.acct-email {
  font-size: 13px;
  color: var(--ink-soft, #5F5E5A);
  word-break: break-all;
  line-height: 1.35;
}
.acct-item {
  display: flex;
  align-items: center;
  gap: 11px;
  width: 100%;
  padding: 10px 12px;
  border: 0;
  border-radius: 8px;
  background: none;
  font: inherit;
  font-size: 14px;
  font-weight: 500;
  color: var(--ink, #1A1A1A);
  text-align: start;
  text-decoration: none;
  cursor: pointer;
}
.acct-item:hover { background: var(--bg, #FAFAF7); }
.acct-item:focus-visible { outline: 3px solid #6B1FC2; outline-offset: -3px; }
/* Icons are inline SVG. They used to be emoji and box-drawing characters
   (🗓 👤 ▭ ⇥), and ▭ and ⇥ have no glyph in the default Windows UI font, so
   two of the four rendered as empty tofu boxes. SVG cannot fail to load and
   inherits colour, which is what makes Sign out red without a second rule. */
.acct-ico {
  width: 18px;
  height: 18px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: #6B1FC2;
  flex-shrink: 0;
}
.acct-ico svg { display: block; }
.acct-signout .acct-ico { color: #C0392B; }
.acct-sep { height: 1px; background: var(--border, #E5E2DD); margin: 6px 4px; }
.acct-signout { color: #C0392B; }

/* ── The hidden attribute must always win ─────────────────────────────────
   `hidden` is only display:none at the browser's default specificity, so any
   class or element rule that sets display beats it — which is how a hidden
   "Manage billing" button stayed visible on the account page, and how the
   presenter panel once rendered its idle and active states stacked on top of
   each other. brand.css is loaded last on every page, so this fixes it
   everywhere at once. Nothing in this codebase shows an element by setting
   style.display while leaving the hidden attribute on (checked), so making
   this !important is safe. */
[hidden] { display: none !important; }


/* ── Language switcher (public/lang-menu.js) ───────────────────────────────
   Lived inline on eight pages, in two different versions. One copy now, so
   the control cannot drift again, and the dashboard gets it by loading the
   script rather than by growing a ninth variant. */
/* The pill row is source material for the script, not a control anyone is
   meant to look at. lang-menu.js is deferred, so without this the seven
   language codes paint first and are swapped a moment later, which is the
   flash of EN / عربي / FR / ES / RU / DE / PT reported on the home page.
   Hiding it up front costs nothing: switching language is JavaScript either
   way, so a page whose script never arrives could not switch from the pills
   either. lang-menu.js keeps adding .lang-orig-hidden for the same reason,
   so a page that ever stops loading brand.css still behaves. */
.lang-toggle, .lang-switch { display: none !important; }
.lang-orig-hidden { display: none !important; }
.lang-dd { position: relative; display: inline-block; font-family: inherit; }
.lang-dd-btn { display: inline-flex; align-items: center; gap: 7px; background: var(--bg, #FAFAF7); border: 1px solid var(--border, #E5E2DD); border-radius: 10px; padding: 7px 12px; font-size: 14px; font-weight: 600; color: var(--text, #1A1A1A); cursor: pointer; line-height: 1; }
.lang-dd-btn:hover { border-color: var(--teal-dark, #6B1FC2); }
.lang-dd-caret { font-size: 10px; color: var(--muted, #5F5E5A); transition: transform .15s; }
.lang-dd.open .lang-dd-caret { transform: rotate(180deg); }
.lang-dd-menu { position: absolute; top: calc(100% + 6px); inset-inline-end: 0; min-width: 156px; background: #fff; border: 1px solid var(--border, #E5E2DD); border-radius: 12px; box-shadow: 0 12px 32px rgba(0,0,0,.14); padding: 6px; display: none; z-index: 1000; }
.lang-dd.open .lang-dd-menu { display: block; }
.lang-dd-item { display: flex; align-items: center; gap: 9px; width: 100%; background: transparent; border: none; border-radius: 8px; padding: 9px 12px; font-size: 14px; font-weight: 600; color: var(--text, #1A1A1A); cursor: pointer; text-align: start; }
.lang-dd-item:hover { background: var(--teal-light, #F8F0FF); color: var(--teal-dark, #6B1FC2); }
.lang-dd-item.active { color: var(--teal-dark, #6B1FC2); }
html[dir="rtl"] .lang-dd-menu { inset-inline-end: auto; inset-inline-start: 0; }
/* The globe carries the meaning the codes cannot: "EN" reads as a language
   only to someone who already knows. Inline SVG, never the emoji — 🌐 and
   friends rendered as empty boxes on Windows in the account menu. */
.lang-dd-globe { width: 16px; height: 16px; flex-shrink: 0; color: var(--teal-dark, #6B1FC2); }
.lang-dd-item { justify-content: space-between; }
.lang-dd-code { font-size: 11px; font-weight: 800; color: var(--muted, #5F5E5A); }
.lang-dd-item.active .lang-dd-code { color: var(--teal-dark, #6B1FC2); }

/* Wide bars name the language; narrow ones show its code. A globe on its own
   says "languages exist here", not which one you are reading, and a visitor
   who landed in a language the browser picked for them cannot tell whether
   anything needs changing. Two letters cost about 24px and answer that. */
.lang-dd-abbr { display: none; font-size: 12.5px; font-weight: 800; letter-spacing: .02em; }
@media (max-width: 700px) {
  .lang-dd-btn .lang-dd-cur { display: none; }
  .lang-dd-btn .lang-dd-abbr { display: inline; }
}


/* ── The bar (every page) ──────────────────────────────────────────────────
   Eleven pages, four different paddings, two element names, and sticky on
   three of them. A host moving from the site into the app watched the bar
   change height and then scroll away, which is what "the nav is not
   consistent" actually was.

   One rule now, and because brand.css loads last it wins over each page's
   own inline copy without eleven separate edits. Values are the home page's,
   since that is the design everything else was being compared against.
   `nav` gets the class rather than the element, so a <nav> somewhere inside
   a page cannot accidentally inherit a page-level bar. */
.topbar,
.nb-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  /* A fixed height, not fixed padding. Padding alone still let the bar
     grow around whichever control a page happened to put in it, so the
     home page sat 13px taller than the dashboard and the bar jumped as
     you moved between them. */
  min-height: 74px;
  padding: 0 40px;
  background: var(--white, #fff);
  border-bottom: 1px solid var(--border, #E5E2DD);
  position: sticky;
  top: 0;
  z-index: 100;
}

/* 40px of side padding is generous on a phone, where it is most of the
   screen. The bar keeps its height so it does not jump between pages. */
@media (max-width: 640px) {
  .topbar,
  .nb-bar { padding: 0 16px; }
}

/* ── The right-hand cluster ────────────────────────────────────────────────
   topbar.js gathers the language switcher and the account menu into one
   `.topbar-right`. That class was styled in exactly one place, inside
   dashboard.html, so on account.html and help.html it was a plain block div
   and the two controls stacked on top of each other.

   The auto inline-start margin is the second half. site-menu.js appends its
   hamburger to the bar itself when a page has no `.nav-in`, which made three
   children of a `space-between` row and stranded this cluster in the middle
   of the bar. Pushing it to the end keeps it beside the menu button however
   many children the bar ends up with. Logical margin, so Arabic and Persian
   mirror correctly. */
.topbar-right,
.nb-bar-right {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.topbar > .topbar-right,
.nb-bar > .nb-bar-right { margin-inline-start: auto; }

/* ── Phones keep a way in ──────────────────────────────────────────
   The bar dropped "Log in" below its phone breakpoint on the homepage and on
   every marketing page, leaving "Start free" as the only action. A host who
   already has an account and opens the site on a phone, which is where most
   arrivals are, was offered no way back in.

   Log in keeps its button box on phones. It first came back as plain text to
   save room, and read as a stray word rather than the way in. It stays a
   button and buys the room elsewhere: the secondary section links step aside,
   as the homepage has always done with .nav-links, and every control in the
   row gives up a few pixels of padding. Without that the bar overflows its
   own row on a narrow phone in every language, worst in Arabic and French
   where the label is longest.

   The `nav` prefix is load-bearing. Each page carries its own `.nav-in .btn`
   rules, two classes deep and parsed after this file, and three of them hide
   `.nav-in .btn-ghost` outright at phone widths. `nav .nav-in a[href=...]`
   outranks all of them without reaching for !important. */
@media (max-width: 720px) {
  nav .nav-in .nav-link { display: none; }

  /* :not([hidden]) is not decoration. nav-auth.js sets hidden on these once
     /api/auth/me confirms a session, and a bare display:inline-flex here is
     three selectors deep, so it would outrank the [hidden] attribute and show
     a signed-in host a Log in button. This project has shipped that exact bug
     before, which is why index.html carries a global [hidden] guard. */
  nav .nav-in a[href="/login.html"]:not([hidden]) {
    display: inline-flex;
    padding: 8px 11px;
    font-size: 13px;
  }

  /* What is left has to fit beside it on a 360px screen. */
  nav .nav-in .btn-primary { padding: 9px 11px; font-size: 13.5px; }
  nav .nav-in .logo, nav .nav-in .brand { font-size: 15.5px; }
  nav .nav-in { gap: 8px; }
}

/* Below 480 the bar gives up the last of its slack rather than pushing a
   control off the edge. 480 rather than 400 because the language landing
   pages gained a language control, and in French at 430px that was the
   difference between one row and two. */
@media (max-width: 480px) {
  nav .nav-in { gap: 5px; padding-inline: 10px; }
  nav .nav-in .btn-primary { padding: 9px 8px; font-size: 12.5px; }
  nav .nav-in a[href="/login.html"] { font-size: 12.5px; }
  nav .nav-in .logo, nav .nav-in .brand { font-size: 15px; }
  nav .nav-in .lang-dd-btn { padding: 7px 7px; }
  nav .nav-in .lang-dd-btn .lang-dd-caret { display: none; }

  /* Globe alone, no two-letter code. Below 400px the language landing pages
     carry mark + language + Log in + Start free + menu on one row, and in
     French or Arabic that row is about 20px too wide. The code is the
     cheapest thing to drop: the button still announces the language through
     its aria-label, and the open menu still ticks the current one. */
  nav .nav-in .lang-dd-btn .lang-dd-abbr { display: none; }
}
