/* ==========================================================================
   Hattefisk - coming soon
   Tokens: black bg matches the hat-tile sprites exactly (no seams, no
   gradient behind them - see .hero). Warm white for content cards, brand
   red for accents. Buttons default to --red-deep (white text >= 4.5:1);
   bright --red is reserved for decorative/large type.
   Type: Permanent Marker (brush, latin-only, brand wordmark + COMING SOON
   stay English in every language) for the poster-style headline, Caveat
   (handwritten, Cyrillic) for the small eyebrow labels, Inter (Cyrillic +
   Latin Extended) for body/UI. All three self-hosted in assets/fonts/.
   ========================================================================== */

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("fonts/Inter-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215;
}

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("fonts/Inter-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
  font-family: "Caveat";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("fonts/Caveat-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122;
}

@font-face {
  font-family: "Caveat";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("fonts/Caveat-cyrillic.woff2") format("woff2");
  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}

@font-face {
  font-family: "Permanent Marker";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("fonts/PermanentMarker-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+2000-206F, U+2122;
}

:root {
  --black: #000000;
  --ink: #141210;
  --warm-white: #f7f1e4;
  --warm-white-dim: #e9e0cd;
  --red: #ef3d20;
  --red-deep: #b32914;
  --red-deep-hover: #8f2000;
  --grey: #9a9186;
  --grey-dim: #5c584f;
  --line: rgba(247, 241, 228, 0.14);

  --font-display: "Permanent Marker", "Segoe Script", cursive;
  --font-script: "Caveat", "Segoe Script", cursive;
  --font-body: "Inter", "Helvetica Neue", Arial, sans-serif;

  --gutter: 20px;
  --radius-lg: 28px;
  --radius-md: 18px;
  --radius-sm: 10px;

  --safe-t: env(safe-area-inset-top, 0px);
  --safe-b: env(safe-area-inset-bottom, 0px);
  --safe-l: env(safe-area-inset-left, 0px);
  --safe-r: env(safe-area-inset-right, 0px);
}

@media (min-width: 720px) {
  :root {
    --gutter: 40px;
  }
}

@media (min-width: 1200px) {
  :root {
    --gutter: 64px;
  }
}

/* ---- Reset ------------------------------------------------------------ */

*,
*::before,
*::after {
  box-sizing: border-box;
}

/* Black on <html> AND <body>, not just the sections: on iOS Safari
   (and desktop Safari) an overscroll/rubber-band past the top or
   bottom of the document reveals the viewport background, not any
   section's background - without this, that reveals white/default
   instead of a seamless black. */
html {
  background: #000000;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  margin: 0;
  min-height: 100dvh;
  background: var(--black);
  color: var(--warm-white);
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.5;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
}

img {
  max-width: 100%;
  display: block;
}

a {
  color: inherit;
}

button {
  font: inherit;
  color: inherit;
}

h1, h2, h3, p, figure {
  margin: 0;
}

ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Visible focus ring everywhere, no silent removal */
:focus-visible {
  outline: 2px solid var(--red);
  outline-offset: 3px;
  border-radius: 4px;
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  top: -100%;
  left: var(--gutter);
  z-index: 100;
  background: var(--red-deep);
  color: var(--warm-white);
  padding: 10px 16px;
  border-radius: var(--radius-sm);
  font-weight: 600;
}

.skip-link:focus {
  top: calc(var(--safe-t) + 10px);
}

/* ---- Top bar: lang switch ---------------------------------------------- */

.topbar {
  position: sticky;
  top: 0;
  z-index: 20;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: calc(var(--safe-t) + 12px) calc(var(--gutter) + var(--safe-r)) 12px calc(var(--gutter) + var(--safe-l));
  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0));
  pointer-events: none;
}

/* Lightweight text-link language switcher, shared by header and footer.
   No pill background: small, does not compete with the hero. */
.lang-links {
  display: flex;
  align-items: center;
  gap: 6px;
  pointer-events: auto;
}

.lang-links span {
  color: var(--grey-dim);
  font-size: 0.72rem;
}

.lang-links button {
  appearance: none;
  border: none;
  background: transparent;
  color: var(--grey);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  padding: 4px 2px;
  cursor: pointer;
  transition: color 0.15s ease;
}

.lang-links button:hover {
  color: var(--warm-white);
}

.lang-links button[aria-pressed="true"] {
  color: var(--red);
}

/* No footer-specific .lang-links override needed: the footer is on the
   same black background as the header (see .footer below), so the base
   .lang-links rules above already fit both places. */

/* ---- Hero --------------------------------------------------------------- */

.hero {
  /* Capped, not a pure 100vh: on a tall phone (844px+) with the sticky
     topbar taking its own space above, a pure 100vh hero plus flex
     centering left a huge dead-air gap below the form note before the
     catering card (round 4 fix - was ~171px, well past a comfortable
     section break). The cap keeps the poster-style vertical centering
     on short/typical screens while stopping the hero from ballooning on
     tall ones. */
  min-height: min(100svh, 720px);
  min-height: min(100vh, 720px);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: calc(var(--safe-t) + 8px) calc(var(--gutter) + var(--safe-r)) calc(var(--safe-b) + 16px) calc(var(--gutter) + var(--safe-l));
  position: relative;
  background: var(--black); /* solid black, matches the hat sprites exactly: no gradient behind the tile */
}

.hero-main {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 30px;
  margin-top: 26px;
}

.hero-visual {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.hat-stage-wrap {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  /* Breathing room for the motion strokes and speech bubble, so they do
     not press against the mascot or clip against the page edge. Extra
     top margin clears the speech bubble for every hat, including the
     tallest ones (wasabi, soy, chili). */
  margin: 40px 46px 0;
}

@media (min-width: 1024px) {
  .hat-stage-wrap {
    margin: 26px 72px 0;
  }
}

.hat-stage {
  position: relative;
  width: clamp(150px, 34vw, 190px);
  height: clamp(150px, 34vw, 190px);
}

.hat-frame {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  opacity: 0;
  transform: scale(0.9);
  transition: opacity 0.35s ease, transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.hat-frame.is-active {
  opacity: 1;
  transform: scale(1);
}

@media (prefers-reduced-motion: reduce) {
  .hat-frame {
    transition: none;
  }
}

/* Comic-style motion strokes flanking the mascot, like the poster */
.motion-strokes {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  color: var(--warm-white);
  opacity: 0.9;
  pointer-events: none;
}

.motion-strokes--left {
  left: clamp(-44px, -13vw, -32px);
}

.motion-strokes--right {
  right: clamp(-44px, -13vw, -32px);
}

/* Speech bubble, poster-style, top-right of the mascot, clear of its hat.
   The mascot art (assets/hats-cut/) keeps a consistent body baseline and a
   generous top margin per tile, but the tallest hats (wasabi, soy, chili)
   still reach further up than the rest - the bubble sits well clear of
   even those, verified against every tile in the hero rotation. */


/* Vertical kanji beside the mascot - desktop only, too tight on mobile */
.kanji {
  display: none;
}

@media (min-width: 1024px) {
  .kanji {
    display: block;
    writing-mode: vertical-rl;
    font-family: var(--font-body);
    font-weight: 700;
    font-size: 1.3rem;
    letter-spacing: 0.25em;
    color: var(--warm-white);
    opacity: 0.85;
    margin-right: 38px;
  }
}

.brush-heading {
  font-family: var(--font-display);
  color: var(--warm-white);
  font-size: clamp(2rem, 11vw, 3.1rem);
  line-height: 0.85;
  transform: rotate(-3deg);
  position: relative;
  /* Bottom margin clears the red brush-stroke underline (it extends to
     -0.32em below the text, see .brush-stroke) before the wordmark starts -
     otherwise the stroke and "HATTEFISK" collide on narrow screens. */
  margin: 0 0 0.55em;
}

.brush-heading .brush-stroke {
  position: absolute;
  left: 50%;
  bottom: -0.32em;
  transform: translateX(-50%);
  width: 78%;
  color: var(--red);
  z-index: -1;
}

.wordmark {
  font-family: var(--font-display);
  font-weight: 400;
  color: var(--red);
  font-size: clamp(2.1rem, 10vw, 3.4rem);
  line-height: 0.95;
  margin: 0 0 10px;
  text-wrap: balance;
}

.hero-tagline {
  font-family: var(--font-script);
  font-weight: 700;
  font-size: clamp(1.5rem, 6.5vw, 2.3rem);
  line-height: 1.05;
  color: var(--warm-white);
  max-width: 22ch;
  margin: 0 auto 4px;
  text-wrap: balance;
}

.hero-line {
  font-family: var(--font-body);
  font-size: clamp(0.9rem, 3vw, 1.02rem);
  font-weight: 500;
  color: var(--warm-white-dim);
  max-width: 34ch;
  margin: 0 auto 22px;
  text-wrap: balance;
}

.hero-form {
  width: 100%;
  max-width: 380px;
  margin: 0 auto;
}

/* ---- Shared form styles -------------------------------------------------- */

/* Every element on this page is centered (round 4 feedback) - labels,
   field text, hints - so a plain .field-row centers by default. */
.field-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
  text-align: center;
}

/* Hero newsletter field: its own label is visually hidden (the placeholder
   + button carry the meaning), so the visible pieces - input, button, hint
   text below - also center horizontally as a group, not just their text. */
.field-row--center {
  align-items: center;
  text-align: center;
}

.optional-marker {
  font-weight: 400;
  color: var(--grey-dim);
}

.inline-form {
  display: flex;
  gap: 8px;
  align-items: stretch;
}

@media (max-width: 420px) {
  .inline-form {
    flex-direction: column;
  }
}

label {
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--grey);
}

input,
select,
textarea {
  font-family: var(--font-body);
  font-size: 16px; /* never smaller: prevents iOS auto-zoom */
  background: var(--warm-white);
  color: var(--ink);
  border: 2px solid transparent;
  border-radius: var(--radius-sm);
  padding: 13px 14px;
  width: 100%;
  text-align: center;
  transition: border-color 0.15s ease;
}

/* <select> is the odd one out: `text-align` alone centers the dropdown's
   own popup list in some engines but not the closed control's chosen
   value - WebKit/Blink need `text-align-last` for that closed-state text. */
select {
  text-align-last: center;
}

input::placeholder,
textarea::placeholder {
  color: var(--grey-dim);
  text-align: center;
}

input:focus,
select:focus,
textarea:focus {
  border-color: var(--red);
}

textarea {
  min-height: 96px;
  resize: vertical;
}

.btn {
  appearance: none;
  border: none;
  border-radius: var(--radius-sm);
  background: var(--red-deep);
  color: var(--warm-white);
  font-weight: 700;
  font-size: 0.95rem;
  padding: 13px 20px;
  cursor: pointer;
  white-space: nowrap;
  transition: background-color 0.15s ease, transform 0.1s ease;
}

.btn:hover {
  background: var(--red-deep-hover);
}

.btn:active {
  transform: scale(0.98);
}

.btn:disabled {
  opacity: 0.7;
  cursor: progress;
}

.form-note {
  font-size: 0.78rem;
  color: var(--grey);
  margin-top: 4px;
  text-align: center;
}

/* Consent line under the hero newsletter button: readable size (not the
   10px-ish micro-copy this could have shrunk to), light grey on the black
   hero background, ending in a visible underlined link to /privacy. */
.form-consent {
  font-size: 0.82rem;
  line-height: 1.45;
  color: var(--grey);
  max-width: 34ch;
  margin: 10px auto 0;
  text-align: center;
}

.form-consent-link {
  display: inline-block;
  color: var(--warm-white);
  text-decoration: underline;
  text-underline-offset: 3px;
  font-weight: 600;
  white-space: nowrap;
}

.form-consent-link:hover {
  color: var(--red);
}

.form-status {
  min-height: 1.2em;
  font-size: 0.85rem;
  font-weight: 600;
  margin-top: 8px;
  text-align: center;
}

.form-status--success {
  color: #8fd18f;
}

.form-status--error {
  color: #ff8a73;
}

/* Honeypot: present in the DOM/tab order removed, hidden visually and from
   assistive tech (parent is aria-hidden). No visible label text needed. */
.hp-field {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ---- Sections ------------------------------------------------------------- */

.section {
  padding: 56px calc(var(--gutter) + var(--safe-r)) 56px calc(var(--gutter) + var(--safe-l));
}

.section-inner {
  max-width: 760px;
  margin: 0 auto;
  text-align: center;
}

.section-title {
  /* Caveat, not Permanent Marker: these headings are localized (about,
     catering), and Permanent Marker has no Cyrillic glyphs - Russian
     text would silently fall back to a mismatched generic cursive font.
     Permanent Marker stays reserved for the English-only brand lockup
     (.wordmark, .brush-heading). */
  font-family: var(--font-script);
  font-weight: 700;
  font-size: clamp(2.1rem, 7.5vw, 2.9rem);
  /* Body copy's 1.5 line-height is much too loose for this large brush
     script when it wraps (e.g. the two-line catering heading) - tighten
     to match the display type's own proportions. */
  line-height: 1.1;
  margin-bottom: 14px;
  color: var(--warm-white);
}

.section-body {
  font-size: 1.02rem;
  color: var(--warm-white-dim);
  max-width: 56ch;
  margin-left: auto;
  margin-right: auto;
}

/* ---- Catering / B2B -------------------------------------------------------- */

/* The page is black everywhere outside the hero (round 4 feedback: the
   black background must be unbroken, so nothing but black can show
   during an iOS Safari rubber-band overscroll top or bottom). The
   catering block used to be a full-bleed warm-white section; now the
   section stays black and only a centered card inside it carries the
   warm-white surface. */
.section--catering {
  background: var(--black);
  /* Tighter than the default .section 56px: the hero above already ends
     with its own note/breathing room, so the full section padding on
     top of that made too large a gap before the catering card. */
  padding-top: 40px;
}

.catering-card {
  background: var(--warm-white);
  color: var(--ink);
  border-radius: var(--radius-lg);
  padding: 36px 26px;
  max-width: 480px;
  margin: 0 auto;
}

.catering-card .section-title {
  color: var(--ink);
}

.catering-card .section-body {
  color: var(--grey-dim);
}

.catering-cta {
  margin-top: 26px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
}

/* The "or email us directly" line is itself a mailto: link (the address
   is baked into the translated sentence, see b2b.or_email). */
.catering-direct {
  font-size: 0.9rem;
  color: var(--red-deep);
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- Catering dialog (native <dialog>) ------------------------------------ */

.catering-dialog {
  border: none;
  padding: 0;
  background: transparent;
  color: var(--ink);
  width: min(560px, 100%);
  max-width: 100%;
  margin: auto;
  max-height: 100dvh;
}

.catering-dialog::backdrop {
  background: rgba(0, 0, 0, 0.6);
}

.catering-dialog[open] {
  animation: catering-dialog-in 200ms ease-out;
}

@media (prefers-reduced-motion: reduce) {
  .catering-dialog[open] {
    animation: none;
  }
}

@keyframes catering-dialog-in {
  from {
    opacity: 0;
    transform: translateY(16px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.catering-dialog-inner {
  position: relative;
  background: var(--warm-white);
  color: var(--ink);
  padding: 26px 22px calc(var(--safe-b) + 22px);
  max-height: 92dvh;
  overflow-y: auto;
  border-radius: var(--radius-lg);
  text-align: center;
}

.dialog-close {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(20, 18, 16, 0.06);
  color: var(--ink);
  cursor: pointer;
}

.dialog-close:hover {
  background: rgba(20, 18, 16, 0.12);
}

.catering-dialog-title {
  text-wrap: balance;
  margin-top: 6px;
  /* Symmetric, not padding-right only: the title is centered text, so a
     one-sided pad to clear .dialog-close (top-right) would shift the
     whole centered block left instead of just carving out the corner. */
  padding-inline: 30px;
  /* .section-title defaults to white (it is meant for text directly on
     the black page); the dialog card is warm-white, so it needs the
     dark ink color instead. */
  color: var(--ink);
}

.catering-dialog-intro {
  margin: 0 auto 22px;
  color: var(--grey-dim);
}

.catering-form {
  display: block;
}

.catering-fields {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
  text-align: center;
}

/* [hidden] and a class-based `display` rule have equal specificity, and
   this stylesheet loads after the UA default - without this, toggling
   the `hidden` property from JS would silently do nothing. */
.catering-fields[hidden] {
  display: none;
}

@media (min-width: 1024px) {
  .catering-fields {
    grid-template-columns: 1fr 1fr;
  }
  .catering-fields .field-row--full {
    grid-column: 1 / -1;
  }
}

.catering-submit-row {
  margin-top: 4px;
}

.catering-success {
  text-align: center;
  padding: 20px 0 4px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}

.catering-success[hidden] {
  display: none;
}

.catering-success-title {
  font-family: var(--font-script);
  font-weight: 700;
  font-size: 1.5rem;
  color: var(--red-deep);
}

.catering-success-text {
  font-size: 1.02rem;
  color: var(--grey-dim);
  margin-bottom: 6px;
}

/* The B2B form lives inside the <dialog>, on the warm-white panel - not on
   the black page. The global field style (warm-white fill, transparent
   border) is built for the dark hero and would make every field invisible
   here, so fields get a white fill and a real border on this surface. */
.catering-dialog input,
.catering-dialog select,
.catering-dialog textarea {
  background: #ffffff;
  border-color: rgba(20, 18, 16, 0.18);
}

.catering-dialog label {
  color: var(--grey-dim);
}

.catering-dialog .form-note {
  color: var(--grey-dim);
}

/* Mobile: bottom sheet, near full height, rounded top only */
@media (max-width: 639px) {
  .catering-dialog {
    width: 100%;
    margin: auto 0 0;
  }

  .catering-dialog-inner {
    border-radius: 24px 24px 0 0;
    max-height: 92dvh;
  }
}

/* ---- Footer -------------------------------------------------------------
   Compact and centered: email, location, language, social (hidden while
   empty), copyright. One column, small type, ~200px tall on mobile.
   Black, like the rest of the page (round 4 fix): a cream full-width
   footer was the other spot where the black background broke, right
   before the very bottom edge an iOS Safari overscroll would reveal. */

.footer {
  background: var(--black);
  color: var(--warm-white);
  padding: 22px calc(var(--gutter) + var(--safe-r)) calc(var(--safe-b) + 20px) calc(var(--gutter) + var(--safe-l));
  border-top: 1px solid var(--line);
}

.footer-inner {
  max-width: 480px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: 8px;
  align-items: center;
  text-align: center;
}

.footer-email {
  font-weight: 700;
  font-size: 0.95rem;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.footer-location {
  font-size: 0.85rem;
  color: var(--grey);
}

.footer-privacy {
  font-size: 0.78rem;
  color: var(--grey);
  text-decoration: underline;
  text-underline-offset: 3px;
  margin-top: 2px;
}

.footer-privacy:hover {
  color: var(--warm-white);
}

.footer-inner .lang-links {
  margin-top: 6px;
}

.social-row {
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
  justify-content: center;
  margin-top: 4px;
}

.social-row[hidden] {
  display: none;
}

.social-link {
  width: 34px;
  height: 34px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--warm-white);
  color: var(--ink);
  transition: background-color 0.15s ease;
}

.social-link:hover {
  background: var(--red);
}

.footer-fine {
  margin-top: 6px;
  font-size: 0.72rem;
  color: var(--grey);
  opacity: 0.8;
}

/* ---- Privacy page --------------------------------------------------------- */

/* Black page background (same as everywhere else, see .hero for why), a
   single narrow reading column inside a warm-white card so ten sections of
   legal text stay comfortable to read, left-aligned (unlike the rest of the
   site, which centers everything - a wall of centered paragraphs is much
   harder to read than a left-aligned column). */
.privacy-page {
  min-height: 100dvh;
  background: var(--black);
}

.privacy-main {
  padding: calc(var(--safe-t) + 32px) calc(var(--gutter) + var(--safe-r)) calc(var(--safe-b) + 48px) calc(var(--gutter) + var(--safe-l));
  display: flex;
  justify-content: center;
}

.privacy-card {
  background: var(--warm-white);
  color: var(--ink);
  border-radius: var(--radius-lg);
  max-width: 680px;
  width: 100%;
  padding: 32px 24px 40px;
}

@media (min-width: 720px) {
  .privacy-card {
    padding: 48px 56px 56px;
  }
}

.privacy-title {
  font-family: var(--font-script);
  font-weight: 700;
  font-size: clamp(2rem, 6vw, 2.6rem);
  line-height: 1.1;
  color: var(--red-deep);
  text-align: left;
  margin-bottom: 6px;
}

.privacy-updated {
  font-size: 0.85rem;
  color: var(--grey-dim);
  margin-bottom: 20px;
}

.privacy-intro {
  font-size: 1.02rem;
  color: var(--ink);
  line-height: 1.6;
  margin-bottom: 32px;
}

.privacy-section {
  margin-bottom: 28px;
}

.privacy-section-title {
  font-family: var(--font-script);
  font-weight: 700;
  font-size: 1.35rem;
  line-height: 1.2;
  color: var(--ink);
  margin-bottom: 8px;
}

.privacy-section-body {
  font-size: 0.98rem;
  line-height: 1.65;
  color: var(--grey-dim);
  /* Source copy uses a plain "\n" between paragraphs/list lines (see
     _tools/privacy-source.json) - pre-line turns each newline into a
     visual break without needing to split the string into <p> tags on
     every language switch. */
  white-space: pre-line;
}

.privacy-back {
  display: inline-block;
  margin-top: 8px;
  font-weight: 700;
  color: var(--red-deep);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* ---- Desktop composition ------------------------------------------------------ */

@media (min-width: 1024px) {
  /* Desktop hero stays on the same vertical, centered axis as the poster:
     COMING SOON, mascot, HATTEFISK, subhead, form - one column, just
     scaled up. No side-by-side split. */
  .hero {
    padding-top: calc(var(--safe-t) + 20px);
  }

  .hero-main {
    margin-top: 0;
    gap: 40px;
  }

  .hat-stage {
    width: clamp(260px, 22vw, 380px);
    height: clamp(260px, 22vw, 380px);
  }

  .hero-copy {
    display: flex;
    flex-direction: column;
    align-items: center;
    max-width: 560px;
  }

  .brush-heading {
    font-size: clamp(3rem, 6vw, 4.6rem);
  }

  .wordmark {
    font-size: clamp(2.8rem, 5vw, 4.4rem);
  }

  .hero-tagline {
    font-size: clamp(2rem, 3.4vw, 2.6rem);
    max-width: 26ch;
  }

  .hero-line {
    margin: 0 auto 28px;
  }

  .hero-form {
    margin: 0 auto;
  }

  .section-inner {
    max-width: 640px;
  }

  .footer-inner {
    max-width: 640px;
  }
}
