/* ==========================================================================
   NORIKO — design system stylesheet
   Tokens and rules per design-system/noriko/MASTER.md
   ========================================================================== */

/* ---------- Tokens ---------- */
:root {
  /* Brand — reds sampled from NORIKO packaging artwork */
  --noriko-red: #E50607;
  --noriko-red-deep: #B00406;

  /* Neutrals are cool, not cream. NORIKO's packaging is white, gloss and
     high-contrast — a supermarket shelf. A warm cream ground made the reds
     read dusty and put the site on the default AI palette. */
  --ink: #0F1413;
  --ink-soft: #414B49;
  --ink-mute: #5F6A68;   /* darkened so it clears 4.5:1 on --paper-2, not just --paper */
  --paper: #F6F8F8;
  --paper-2: #EAEFEE;
  --card: #FFFFFF;
  --line: #D7DEDD;

  /* Worlds — pan-Asian, not nation-specific */
  --cook-deep: #16362C;      /* deep pantry green, the Cook ground */
  --cook-lift: #1E4B3D;
  --steel: #1B2A31;          /* HoReCa ground */
  --steel-lift: #263A44;
  --cream: #FFF6E6;

  /* Snack flavour bands — sampled from the actual NORIKO snack packaging.
     The range already codes flavour by band colour; the site reuses that system. */
  --band-spicy:   #E11B22;
  --band-mala:    #E8A317;
  --band-sweet:   #B5397F;
  --band-pepper:  #7DBE3C;
  --chilli:       #FF7A18;

  /* JUZO flavours — sampled from the actual cup artwork.
     Each pair: -fill is the true cup colour; -ink is the darkened tone that
     clears 4.5:1 for text on cream. Never use -fill for text. */
  --juzo-strawberry:     #D80000;
  --juzo-strawberry-ink: #B00000;
  --juzo-lychee:         #F06C90;
  --juzo-lychee-ink:     #B32B50;
  --juzo-peach:          #F06C00;
  --juzo-peach-ink:      #A84A00;
  --juzo-pineapple:      #FCC000;
  --juzo-pineapple-ink:  #8A6800;
  --juzo-grape:          #84B400;
  --juzo-grape-ink:      #4F6B00;
  --juzo-blueberry:      #3C0C84;
  --juzo-blueberry-ink:  #3C0C84;

  --veg-green: #1E8A3C;
  --nonveg-brown: #8A4B2A;

  /* Type */
  --font-display: 'Bricolage Grotesque', 'Segoe UI', system-ui, sans-serif;
  --font-body: 'Inter Tight', system-ui, -apple-system, 'Segoe UI', sans-serif;

  /* Space */
  --space-1: 4px;  --space-2: 8px;  --space-3: 12px; --space-4: 16px;
  --space-5: 24px; --space-6: 32px; --space-7: 48px; --space-8: 64px;
  --space-9: 96px; --space-10: 128px;

  --radius-sm: 4px;
  --radius: 10px;
  --radius-lg: 18px;
  --radius-pill: 999px;

  --container: 1280px;
  --ease: cubic-bezier(.2,.6,.2,1);
  --shadow-card: 0 1px 2px rgba(20,16,14,.05), 0 12px 28px -18px rgba(20,16,14,.35);
  --shadow-lift: 0 2px 6px rgba(20,16,14,.07), 0 26px 50px -24px rgba(20,16,14,.42);
}

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

/* [hidden] must beat any class that sets `display`.
   The UA rule `[hidden]{display:none}` loses to `.spec-row{display:grid}`, so
   filtered rows kept rendering. Anything the JS hides needs this guard. */
[hidden] { display: none !important; }


html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

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

/* Focus — visible everywhere, never removed */
:focus-visible {
  outline: 3px solid var(--noriko-red);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
.on-dark :focus-visible,
.world-snack :focus-visible { outline-color: #FFFFFF; }

.skip-link {
  position: absolute; left: var(--space-4); top: -100px;
  background: var(--ink); color: #fff; padding: var(--space-3) var(--space-5);
  border-radius: var(--radius); z-index: 200; font-weight: 600;
  transition: top 180ms var(--ease);
}
.skip-link:focus { top: var(--space-4); }

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

/* ---------- Layout ---------- */
.container {
  width: 100%; max-width: var(--container);
  margin-inline: auto; padding-inline: var(--space-5);
}

/* Grid items default to min-width:auto, which lets wide content push a track
   past the viewport. Every grid in this system is allowed to shrink instead. */
.doors > *, .product-grid > *, .juzo__grid > *, .snack__rail > *,
.horeca__grid > *, .cta-band__grid > *, .footer__grid > *, .spec-row > *,
.inspo-grid > *, .world-row > * {
  min-width: 0;
}
.section { padding-block: var(--space-9); }

/* The red rule — the constant across every world */
.rule {
  display: block; width: 44px; height: 2px;
  background: var(--noriko-red); border: 0; margin: 0 0 var(--space-5);
}
.on-dark .rule, .world-snack .rule { background: #fff; }

/* ---------- Type ---------- */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: -0.03em;
  line-height: 1.04;
  margin: 0 0 var(--space-4);
  text-wrap: balance;
}
h1 { font-size: clamp(2.75rem, 6.2vw, 4.75rem); font-weight: 800; }
h2 { font-size: clamp(2rem, 4vw, 3.25rem); }
h3 { font-size: clamp(1.3rem, 2vw, 1.7rem); }

p { margin: 0 0 var(--space-4); max-width: 64ch; }

.eyebrow {
  font-family: var(--font-body);
  font-size: .8125rem; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase;
  color: var(--noriko-red-deep); margin: 0 0 var(--space-3);
}
.on-dark .eyebrow { color: rgba(255,255,255,.82); }

.lede {
  max-width: 56ch;
  font-size: clamp(1.0625rem, 1.5vw, 1.3125rem);
  line-height: 1.5;
  color: var(--ink-soft);
}
/* The snack world is a dark surface too — it must inherit every on-dark rule */
.on-dark .lede { color: rgba(255,255,255,.86); }
/* NORIKO red has no contrast headroom: white on #E50607 is exactly 4.81:1, so any
   alpha at all drops body text below AA. Everything on red is fully opaque white.
   Scoped with :not() so white cards sitting on the red ground keep dark text. */
.world-snack .lede,
.world-snack > .container > p,
.world-snack > .container > .snack__head p,
.world-snack h2,
.world-snack .snack__head h3,
.world-snack .eyebrow { color: #fff; }

.num { font-variant-numeric: tabular-nums; }

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex; align-items: center; gap: var(--space-2);
  min-height: 46px; padding: 11px var(--space-6);
  font-family: var(--font-body); font-size: 1rem; font-weight: 600;
  border-radius: var(--radius-pill); border: 1px solid transparent;
  text-decoration: none; cursor: pointer;
  transition: background-color 180ms var(--ease), color 180ms var(--ease),
              border-color 180ms var(--ease), transform 180ms var(--ease);
}
.btn:hover { transform: translateY(-1px); }
.btn svg { width: 18px; height: 18px; flex: none; }

.btn--primary { background: var(--noriko-red); color: #fff; box-shadow: 0 6px 16px -12px rgba(229,6,7,.8); }
.btn--primary:hover { background: #C40506; }

.btn--ink { background: var(--ink); color: #fff; box-shadow: 0 6px 16px -12px rgba(15,20,19,.8); }
.btn--ink:hover { background: #000; }

.btn--ghost { border-color: currentColor; color: var(--ink); }
.btn--ghost:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }

.on-dark .btn--ghost, .world-snack .btn--ghost { color: #fff; }
.on-dark .btn--ghost:hover, .world-snack .btn--ghost:hover { background: #fff; color: var(--ink); border-color: #fff; }

.btn--square { border-radius: var(--radius-sm); }

.link-arrow {
  display: inline-flex; align-items: center; gap: var(--space-2);
  min-height: 44px;
  font-weight: 600; text-decoration: none;
  border-bottom: 2px solid var(--noriko-red); padding-bottom: 2px;
  transition: gap 180ms var(--ease);
}
.link-arrow:hover { gap: var(--space-3); }
.on-dark .link-arrow { border-bottom-color: #fff; }

/* ==========================================================================
   Audience bar + masthead
   Pattern verified on Kikkoman USA (Home Cooking / Foodservice / Manufacturers)
   ========================================================================== */
.audience-bar { background: var(--ink); color: #fff; font-size: .875rem; }
.audience-bar .container {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-4); min-height: 44px; flex-wrap: wrap;
}
.audience-switch { display: flex; align-items: center; gap: var(--space-1); }
.audience-switch__label {
  color: rgba(255,255,255,.6); margin-right: var(--space-2);
  font-size: .8125rem; letter-spacing: .04em;
}
.audience-switch a {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 0 var(--space-4); color: rgba(255,255,255,.75);
  text-decoration: none; font-weight: 600;
  border-bottom: 3px solid transparent;
  transition: color 180ms var(--ease), border-color 180ms var(--ease);
}
.audience-switch a:hover { color: #fff; }
/* current audience marked by colour AND underline AND text — not colour alone */
.audience-switch a[aria-current] {
  color: #fff; border-bottom-color: var(--noriko-red);
}
.audience-switch a[aria-current]::after {
  content: " — you are here"; font-weight: 400; font-size: .75rem;
  color: rgba(255,255,255,.55); margin-left: var(--space-2);
}
.audience-bar__aside {
  display: flex; align-items: center; gap: var(--space-5);
  color: rgba(255,255,255,.7);
}
/* min-height clears the 24px WCAG 2.2 pointer-target floor */
.audience-bar__aside a {
  display: inline-flex; align-items: center; min-height: 44px;
  color: #fff; text-decoration: none; font-weight: 500;
}
.audience-bar__aside a:hover { text-decoration: underline; }

.masthead {
  position: sticky; top: 0; z-index: 100;
  background: rgba(246,248,248,.94);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}
.masthead .container {
  display: flex; align-items: center; gap: var(--space-6); min-height: 80px;
}

/* ==========================================================================
   Brand logo — the OFFICIAL artwork only.
   assets/brand/noriko-logo-full.svg is transcoded verbatim from
   "noriko logo.ai". Never substitute a font, redraw it, recolour it, or
   apply shadow/glow/outline/stroke. Never alter its aspect ratio.
   ========================================================================== */
.brand {
  display: inline-flex; align-items: center;
  text-decoration: none; line-height: 0;
  /* Clear space: the logo is never crowded against nav, edges or buttons */
  padding: var(--space-2) var(--space-3);
  margin-inline-start: calc(var(--space-3) * -1);
}
/* 52px keeps the のりこ strokes at ~13px and the brush wordmark at ~34px.
   Measured: the five kana strokes stay as five separate ink regions down to
   11px, so 52px carries real margin rather than sitting on the limit. */
.brand img {
  height: 52px; width: auto;   /* width:auto preserves the exact aspect ratio */
  display: block;
}
/* The logo's wordmark is near-black, so it may only sit on a light surface.
   No reversed/white version has been supplied, and one must not be invented,
   so on dark grounds the logo gets its own light container instead. */
.brand--on-dark {
  background: var(--paper);
  border-radius: var(--radius);
  padding: var(--space-4) var(--space-5);
  margin-inline-start: 0;
}
.brand--footer img { height: 52px; }

.nav { display: flex; align-items: center; gap: var(--space-2); margin-left: auto; }
.nav a {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 0 var(--space-4); text-decoration: none; font-weight: 500;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  transition: background-color 180ms var(--ease), border-color 180ms var(--ease);
}
.nav a:hover { background: var(--paper-2); }
.nav a[aria-current="page"] {
  font-weight: 700;
  background: var(--card);
  border-color: var(--line);
}

.nav-toggle {
  display: none; margin-left: auto;
  min-width: 48px; min-height: 48px; align-items: center; justify-content: center;
  background: none; border: 1px solid var(--line); border-radius: var(--radius);
  cursor: pointer; color: var(--ink);
}

/* ==========================================================================
   Hero — the shelf, not a statement about the shelf.
   The brand line stays on top but compact; the three worlds run full-bleed
   beneath it as a triptych so the packaging carries the opening screen.
   Packshots were 6% of the first viewport; the triptych puts them near 20%.
   ========================================================================== */
.hero { position: relative; background: var(--ink); color: #fff; overflow: hidden; }
.hero__inner { padding-block: 72px 56px; position: relative; z-index: 1; }
.hero h1 { color: #fff; margin-bottom: var(--space-4); }

/* Three-word brand statement. Each word carries its world's colour — the same
   colour that world uses in the panel directly below it. */
.hero__words {
  font-family: var(--font-display); font-weight: 800;
  font-size: clamp(2.5rem, 6.5vw, 5.25rem); line-height: 1;
  letter-spacing: -0.045em; margin: 0 0 var(--space-4); max-width: none;
  display: flex; flex-wrap: wrap; gap: 0 .28em;
}
.hero__words span { display: inline-block; }
.hero__words .w-cook  { color: #7FD4B4; }
.hero__words .w-snack { color: #FF7C61; }
.hero__words .w-drink { color: #F7C948; }

.hero__lede { max-width: 52ch; }
.hero__actions { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-top: var(--space-5); }
.hero::before {
  content: ""; position: absolute; right: -10%; top: -30%;
  width: 46vw; height: 46vw; max-width: 560px; max-height: 560px;
  background: radial-gradient(circle, rgba(229,6,7,.20) 0%, rgba(229,6,7,0) 70%);
  pointer-events: none;
}

/* --- The triptych: full-bleed, edge to edge, product-dominant --- */
.hero__worlds {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 1px; background: rgba(255,255,255,.14);
  border-top: 1px solid rgba(255,255,255,.14);
}
.hero__world {
  position: relative; display: flex; flex-direction: column;
  text-decoration: none; overflow: hidden;
  padding: var(--space-7) var(--space-6) var(--space-6);
  transition: filter 220ms var(--ease);
}
.hero__world--cook  { background: var(--cook-deep); color: #fff; }
.hero__world--snack { background: var(--band-spicy); color: #fff; }
.hero__world--drink { background: var(--cream); color: var(--ink); }
.hero__world:hover { filter: brightness(1.06); }

.hero__world__media {
  flex: 1; display: flex; align-items: center; justify-content: center;
  min-height: 0; margin-bottom: var(--space-5);
}
.hero__world__media img {
  max-height: 340px; width: auto; max-width: 100%; object-fit: contain;
  filter: drop-shadow(0 16px 24px rgba(0,0,0,.24));
}
.hero__world__foot {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3);
}
.hero__world__foot strong {
  display: block; font-family: var(--font-display);
  font-size: clamp(1.375rem, 2.2vw, 1.875rem); letter-spacing: -.025em;
}
.hero__world__foot span { font-size: .875rem; opacity: .82; display: block; }
.hero__world__foot svg { width: 22px; height: 22px; flex: none; transition: transform 180ms var(--ease); }
.hero__world:hover .hero__world__foot svg { transform: translateX(4px); }

/* ==========================================================================
   Spice scale — a real device from the packaging (1×/2×/3× Spicy).
   Always paired with a text level; never colour or icon count alone.
   ========================================================================== */
.spice {
  display: inline-flex; align-items: center; gap: var(--space-2);
  font-size: .8125rem; font-weight: 600;
}
.spice__pips { display: inline-flex; gap: 2px; }
.spice__pips i {
  width: 7px; height: 7px; border-radius: 50%;
  background: currentColor; opacity: .25;
}
.spice__pips i.on { opacity: 1; }

/* Diet mark — veg / non-veg, per Indian packaging law */
.diet {
  display: inline-flex; align-items: center; gap: var(--space-2);
  color: var(--ink-mute); font-size: .8125rem;
}
.diet i {
  width: 14px; height: 14px; border-radius: 2px;
  display: inline-flex; align-items: center; justify-content: center; flex: none;
}
.diet--veg i { border: 1.5px solid var(--veg-green); }
.diet--veg i::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--veg-green); }
.diet--nonveg i { border: 1.5px solid var(--nonveg-brown); }
.diet--nonveg i::before {
  content: ""; width: 0; height: 0;
  border-left: 4px solid transparent; border-right: 4px solid transparent;
  border-bottom: 7px solid var(--nonveg-brown);
}

/* ==========================================================================
   Asset placeholder — used where real photography does not exist yet.
   Deliberately visible: a factually honest gap beats an invented image.
   ========================================================================== */
.needs-photo {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--space-2); text-align: center;
  border: 2px dashed rgba(20,16,14,.28); border-radius: var(--radius);
  background: repeating-linear-gradient(45deg,
    rgba(20,16,14,.03) 0 10px, transparent 10px 20px);
  color: var(--ink-soft); padding: var(--space-5); min-height: 160px;
}
.needs-photo strong {
  font-family: var(--font-body); font-size: .75rem; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
}
.needs-photo span { font-size: .8125rem; max-width: 26ch; line-height: 1.45; }
/* The dark variant is opt-in via .needs-photo--dark rather than inherited from
   an .on-dark ancestor — light tiles (the cream Drink tile) sit inside the dark
   hero, and inheriting would have put white text on cream. */
.needs-photo--dark {
  border-color: rgba(255,255,255,.45); color: #fff;
  background: repeating-linear-gradient(45deg,
    rgba(255,255,255,.08) 0 10px, transparent 10px 20px);
}

/* ==========================================================================
   Editorial rhythm
   The page must not read as identical stacked modules. These components give
   sections different shapes: asymmetric features, full-bleed bands, product
   overlap and varied heading placement.
   ========================================================================== */

/* Section rhythm: alternating padding so the page breathes unevenly */
.section--loose { padding-block: var(--space-10); }
.section--snug  { padding-block: var(--space-7); }

/* Centred heading variant, used sparingly to break the left-aligned run */
.section-head--center {
  flex-direction: column; align-items: center; text-align: center;
  max-width: 60ch; margin-inline: auto;
}
.section-head--center .rule { margin-inline: auto; }
.section-head--center p { margin-inline: auto; }

/* Tinted section, used to keep two adjacent light sections from merging */
.section--tint { background: var(--paper-2); border-block: 1px solid var(--line); }

/* --- Breadcrumb: the site is now 2+ levels deep --- */
.crumbs { padding-block: var(--space-5) 0; }
.crumbs ol {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2);
  list-style: none; margin: 0; padding: 0; font-size: .875rem;
}
.crumbs li { display: flex; align-items: center; gap: var(--space-2); color: var(--ink-mute); }
.crumbs a { display: inline-flex; align-items: center; min-height: 32px; color: var(--ink-soft); }
.crumbs a:hover { color: var(--ink); }
.crumbs svg { width: 14px; height: 14px; opacity: .55; }
.crumbs [aria-current="page"] { color: var(--ink); font-weight: 600; }

/* --- Page intro: lighter than the homepage hero --- */
.page-head { padding-block: var(--space-8); }
.page-head h1 { font-size: clamp(2.25rem, 5vw, 3.75rem); max-width: 18ch; }
.page-head .lede { max-width: 56ch; }

/* Retail hero: consumer energy without turning the page into a poster */
.retail-head { display:grid; grid-template-columns:minmax(0,.9fr) minmax(460px,1.1fr); align-items:center; gap:clamp(48px,7vw,112px); }
.retail-head__copy { padding-block:var(--space-4); }
.retail-head h1 { max-width:10ch; font-size:clamp(3.1rem,5.7vw,6.25rem); line-height:.92; letter-spacing:-.065em; }
.retail-head .lede { max-width:42ch; margin-top:var(--space-5); font-size:clamp(1.05rem,1.35vw,1.25rem); }
.retail-head__trade { display:inline-flex; align-items:center; gap:10px; margin-top:var(--space-5); color:var(--ink-soft); font-size:.92rem; font-weight:600; text-underline-offset:4px; }
.retail-head__trade span { color:var(--noriko-red); font-size:1.15em; }
.retail-head__visual {
  position:relative; min-height:510px; margin:0; overflow:hidden;
  border-radius:32px; isolation:isolate;
  background:linear-gradient(145deg,#f5efe5 0 58%,#ded8f2 58% 100%);
  box-shadow:0 24px 70px rgba(33,32,25,.16);
}
.retail-head__visual::before { content:""; position:absolute; inset:18px; border:1px solid rgba(16,24,22,.18); border-radius:22px; z-index:-1; }
.retail-head__visual::after { content:""; position:absolute; width:420px; height:420px; right:-145px; top:-175px; border-radius:50%; background:rgba(68,38,145,.1); z-index:-1; }
.retail-head__stamp { position:absolute; left:34px; top:32px; color:var(--ink); font-family:var(--font-display); font-size:.8rem; font-weight:700; line-height:1.05; letter-spacing:.13em; text-transform:uppercase; transform:rotate(-2deg); }
.retail-head__stamp strong { display:block; margin-top:5px; color:#42178f; font-size:1.45rem; letter-spacing:-.03em; text-transform:none; }
.retail-head__orbit { position:absolute; border:1px solid rgba(66,23,143,.2); border-radius:50%; z-index:-1; }
.retail-head__orbit--one { width:260px; height:260px; left:-82px; bottom:-84px; }
.retail-head__orbit--two { width:165px; height:165px; right:34px; top:60px; }
.retail-head__pack { position:absolute; bottom:48px; display:block; object-fit:contain; filter:drop-shadow(0 22px 18px rgba(74,14,9,.28)); }
.retail-head__pack--fish { left:9%; width:25%; height:64%; transform:rotate(-7deg); }
.retail-head__pack--tofu { left:34%; width:25%; height:61%; transform:rotate(4deg); mix-blend-mode:multiply; }
.retail-head__pack--juzo { right:5%; width:37%; height:72%; transform:rotate(-2deg); }
.retail-head__visual figcaption { position:absolute; left:34px; bottom:24px; color:rgba(16,24,22,.72); font-size:.72rem; font-weight:700; letter-spacing:.1em; text-transform:uppercase; }

@media (max-width: 980px) {
  .retail-head { grid-template-columns:1fr; gap:var(--space-7); }
  .retail-head h1 { max-width:11ch; }
  .retail-head__visual { min-height:460px; }
}
@media (max-width: 560px) {
  .retail-head h1 { font-size:clamp(2.8rem,14vw,4.25rem); }
  .retail-head__visual { min-height:390px; border-radius:24px; }
  .retail-head__stamp { left:25px; top:25px; }
  .retail-head__pack { bottom:42px; }
  .retail-head__pack--fish { left:5%; width:28%; }
  .retail-head__pack--tofu { left:31%; width:28%; }
  .retail-head__pack--juzo { right:1%; width:42%; }
  .retail-head__visual figcaption { left:25px; bottom:18px; font-size:.62rem; }
}

/* --- Jump links to the worlds --- */
.jump { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-6); }
.jump a {
  display: inline-flex; align-items: center; gap: var(--space-3);
  min-height: 48px; padding: 0 var(--space-5);
  border-radius: var(--radius-pill); border: 1px solid var(--line);
  background: var(--card); text-decoration: none; font-weight: 600;
  transition: border-color 180ms var(--ease), transform 180ms var(--ease);
}
.jump a:hover { border-color: var(--ink); transform: translateY(-1px); }
.jump i { width: 12px; height: 12px; border-radius: 50%; flex: none; background: var(--dot); }

/* --- Asymmetric world rows ---
   NOT used on the homepage: Cook/Snack/Drink already appear in the hero tiles and
   in their own dedicated sections, so a third pass was repetition and delayed the
   visitor reaching real products. Retained for the Retail hub page. --- */
.world-row {
  position: relative;
  display: grid; grid-template-columns: 1fr 1fr;
  align-items: center; gap: var(--space-8);
  border-radius: var(--radius-lg); overflow: hidden;
  padding: var(--space-8);
  text-decoration: none;
  transition: transform 260ms var(--ease), box-shadow 260ms var(--ease);
}
.world-row + .world-row { margin-top: var(--space-5); }
.world-row:hover { transform: translateY(-2px); box-shadow: var(--shadow-card); }
/* Alternate which side the product sits on */
.world-row--flip .world-row__media { order: 2; }
.world-row--cook  { background: var(--cook-deep); color: #fff; }
.world-row--snack { background: var(--band-spicy); color: #fff; }
.world-row--drink { background: var(--cream); color: var(--ink); }

.world-row__media {
  display: flex; align-items: center; justify-content: center;
  min-height: 260px; position: relative;
}
.world-row__media img {
  max-height: 300px; width: auto; object-fit: contain;
  filter: drop-shadow(0 22px 34px rgba(20,16,14,.32));
  /* Scale beyond the row so products feel physical, not catalogued */
  transform: scale(1.06);
}
.world-row__count {
  display: inline-block; margin-bottom: var(--space-2);
  font-family: var(--font-body); font-size: .75rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase;
  padding: 3px var(--space-3); border-radius: var(--radius-pill);
  border: 1px solid currentColor; opacity: .72;
}
.world-row h3 { font-size: clamp(2rem, 3.6vw, 3rem); margin-bottom: var(--space-3); }
.world-row p { font-size: 1.0625rem; margin-bottom: var(--space-5); max-width: 42ch; }
.world-row--cook p, .world-row--snack p { color: rgba(255,255,255,.88); }
.world-row--snack p { color: #fff; }
.world-row--drink p { color: var(--ink-soft); }
.world-row__go { display: inline-flex; align-items: center; gap: var(--space-2); font-weight: 700; }
.world-row__go svg { width: 20px; height: 20px; transition: transform 180ms var(--ease); }
.world-row:hover .world-row__go svg { transform: translateX(4px); }

/* --- Featured Cook product: one large, three supporting --- */
.cook-feature {
  display: grid; grid-template-columns: 1.15fr .85fr;
  gap: var(--space-8); align-items: center;
  background: var(--paper-2); border: 1px solid var(--line);
  border-radius: var(--radius-lg); padding: var(--space-8);
  margin-bottom: var(--space-5);
}
.cook-feature__media {
  position: relative; aspect-ratio: 4/3; border-radius: var(--radius);
  overflow: hidden; background: #fff;
}
.cook-feature__media img,
.cook-feature__media .dish {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: contain; padding: var(--space-5);
  transition: opacity 320ms var(--ease);
}
/* The pack is drawn `contain` so nothing is cropped off it; the dish behind
   fills the frame, panned onto the food by --dish-focus. This box is 4:3, so
   the crop here is far gentler than on the 4:5 cards. */
.cook-feature__media .dish {
  opacity: 0; padding: 0;
  object-fit: cover; object-position: var(--dish-focus, 50% 50%);
}
.cook-feature:hover .dish, .cook-feature:focus-within .dish { opacity: 1; }
.cook-feature:hover .pack, .cook-feature:focus-within .pack { opacity: 0; }
.cook-feature h3 { font-size: clamp(1.75rem, 3vw, 2.5rem); }

/* --- Full-bleed editorial band --- */
.band {
  position: relative; overflow: hidden;
  background: var(--ink); color: #fff;
}
.band__grid {
  display: grid; grid-template-columns: .85fr 1.15fr;
  gap: var(--space-8); align-items: center;
}
.band__figure {
  position: relative; aspect-ratio: 16/10;
  border-radius: var(--radius-lg); overflow: hidden;
}
.band__figure img { width: 100%; height: 100%; object-fit: cover; }

/* --- Inspiration cards: light, no fabricated recipe metadata --- */
.inspo-grid {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-5); list-style: none; padding: 0; margin: 0;
}
.inspo-card {
  position: relative; display: flex; flex-direction: column;
  background: var(--card); border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: hidden;
  transition: box-shadow 220ms var(--ease), border-color 220ms var(--ease),
              transform 220ms var(--ease);
}
.inspo-card:hover, .inspo-card:focus-within {
  transform: translateY(-3px);
  box-shadow: var(--shadow-lift); border-color: var(--ink);
}
/* Absolute-positioned image inside a relative aspect box. A percentage height on
   a child of an aspect-ratio parent is circular and falls back to intrinsic size,
   which made these cards ~50% taller than intended on mobile. */
.inspo-card__media {
  position: relative; aspect-ratio: 3/2; background: var(--paper-2);
}
.inspo-card__media > .recipe-photo {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; padding: 0;
}
.inspo-card__body { padding: var(--space-5); display: flex; flex-direction: column; flex: 1; }
.inspo-card h3 { font-size: 1.125rem; margin-bottom: var(--space-2); }
.inspo-card h3 a { text-decoration: none; }
.inspo-card h3 a::after { content: ""; position: absolute; inset: 0; }
.inspo-card p { font-size: .9375rem; color: var(--ink-soft); margin: 0; }
.inspo-card__tag {
  margin-top: auto; padding-top: var(--space-4); font-size: .8125rem;
  color: var(--ink-mute); font-weight: 600;
}

/* ========================================================================== Recipes */
.recipe-hero { padding-block:var(--space-7) var(--space-9); }
.recipe-hero__grid { display:grid; grid-template-columns:1fr 1fr; gap:var(--space-8); align-items:center; }
.recipe-hero__image { position:relative; margin:0; border-radius:var(--radius-lg); overflow:hidden; aspect-ratio:3/2; }
.recipe-hero__image > .recipe-photo { width:100%; height:100%; object-fit:cover; }
.recipe-hero h1 { font-size:clamp(2.5rem,5vw,4.5rem); max-width:13ch; }
.recipe-summary { display:flex; flex-wrap:wrap; gap:var(--space-2); margin:var(--space-6) 0; }
.recipe-summary span { padding:7px 12px; border:1px solid var(--line); border-radius:var(--radius-pill); background:var(--card); font-size:.875rem; font-weight:600; }
.recipe-body { background:var(--card); border-block:1px solid var(--line); }
.recipe-layout { display:grid; grid-template-columns:.78fr 1.22fr; gap:var(--space-9); align-items:start; }
.recipe-panel { padding:var(--space-7); background:var(--paper-2); border-radius:var(--radius-lg); }
.recipe-panel h2, .recipe-method h2 { font-size:clamp(1.75rem,3vw,2.5rem); }
.recipe-ingredients { margin:0; padding-left:1.2em; display:grid; gap:var(--space-3); }
.recipe-method ol { margin:0; padding:0; list-style:none; counter-reset:steps; display:grid; gap:var(--space-6); }
.recipe-method li { counter-increment:steps; position:relative; padding-left:52px; }
.recipe-method li::before { content:counter(steps); position:absolute; left:0; top:-3px; width:34px; height:34px; display:grid; place-items:center; border-radius:50%; background:var(--noriko-red); color:#fff; font-weight:700; }
.recipe-method li strong { display:block; font-family:var(--font-display); font-size:1.08rem; margin-bottom:4px; }
.recipe-products { margin-top:var(--space-8); padding-top:var(--space-6); border-top:1px solid var(--line); }
.recipe-products__links { display:flex; flex-wrap:wrap; gap:var(--space-3); }
.recipe-note { margin-top:var(--space-7); padding:var(--space-5); border-left:3px solid var(--noriko-red); background:var(--paper); }
@media (max-width:800px) {
  .recipe-hero__grid, .recipe-layout { grid-template-columns:1fr; gap:var(--space-7); }
  .recipe-hero__image { order:-1; }
  .recipe-panel { padding:var(--space-5); }
}

/* ==========================================================================
   Audience split — the two doors
   ========================================================================== */
.doors { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-5); }
.door {
  position: relative; display: flex; flex-direction: column;
  min-height: 340px; padding: var(--space-7);
  border-radius: var(--radius-lg); text-decoration: none; overflow: hidden;
  transition: transform 220ms var(--ease), box-shadow 220ms var(--ease);
}
.door:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); }
.door--retail { background: var(--paper-2); color: var(--ink); border: 1px solid var(--line); }
.door--horeca { background: var(--steel); color: #fff; }
.door__visual { position:relative; height:190px; display:block; margin:calc(var(--space-7) * -1) calc(var(--space-7) * -1) var(--space-5); overflow:hidden; }
.door__visual::after { content:""; position:absolute; inset:35% 0 0; background:linear-gradient(to bottom,transparent,rgba(8,18,16,.72)); }
.door__visual img { display:block; width:100%; height:100%; object-fit:cover; transition:transform 450ms var(--ease); }
.door__visual--retail { background:
  radial-gradient(circle at 16% 24%,rgba(255,255,255,.7) 0 5px,transparent 6px),
  radial-gradient(circle at 38% 63%,rgba(255,255,255,.45) 0 8px,transparent 9px),
  radial-gradient(circle at 55% 18%,rgba(255,255,255,.5) 0 4px,transparent 5px),
  linear-gradient(118deg,#ff5864 0%,#ef233c 52%,#9f0016 100%); }
.door__visual--retail::after { inset:0; background:linear-gradient(90deg,rgba(96,0,13,.18),transparent 58%); }
.door__visual--retail img { position:absolute; z-index:1; right:8%; bottom:-55px; width:auto; height:265px; object-fit:contain; filter:drop-shadow(0 16px 18px rgba(83,0,11,.32)); }
.door__visual-copy { position:absolute; z-index:2; left:var(--space-5); top:32px; display:flex; flex-direction:column; color:#fff; }
.door__visual-copy strong { font-family:var(--font-display); font-size:clamp(2.2rem,4vw,3.4rem); line-height:.86; letter-spacing:-.06em; }
.door__visual-copy small { margin-top:8px; font-size:.78rem; font-weight:800; letter-spacing:.12em; text-transform:uppercase; }
.door__visual--horeca img { object-position:center 47%; }
.door:hover .door__visual img { transform:scale(1.035); }
.door:hover .door__visual--retail img { transform:translateY(-5px) rotate(2deg); }
.door__visual-label { position:absolute; z-index:1; left:var(--space-5); bottom:var(--space-4); color:#fff; font-size:.72rem; font-weight:800; letter-spacing:.12em; text-transform:uppercase; }
.door h3 { font-size: clamp(1.75rem, 3vw, 2.5rem); margin-bottom: var(--space-3); }
.door p { font-size: 1rem; margin-bottom: var(--space-5); }
.door--horeca p { color: rgba(255,255,255,.76); }
.door__tags {
  margin-top: auto; display: flex; flex-wrap: wrap; gap: var(--space-2);
  list-style: none; padding: 0;
}
.door__tags li {
  font-size: .8125rem; padding: var(--space-1) var(--space-3);
  border-radius: var(--radius-pill); border: 1px solid currentColor; opacity: .72;
}
.door__go { display: inline-flex; align-items: center; gap: var(--space-2); font-weight: 700; }
.door:hover .door__go svg { transform: translateX(4px); }
.door__go svg { width: 20px; height: 20px; transition: transform 180ms var(--ease); }

.band__figure { overflow:hidden; border-radius:var(--radius-lg); min-height:420px; }
.band__figure > img { width:100%; height:100%; min-height:420px; object-fit:cover; display:block; }

.catalogue-request { margin-top:var(--space-6); padding:var(--space-5); border:1px solid rgba(255,255,255,.2); border-radius:var(--radius-lg); background:rgba(255,255,255,.06); }
.catalogue-request > label { display:block; margin-bottom:10px; color:#fff; font-weight:700; }
.catalogue-request__row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:10px; }
.catalogue-request input { min-width:0; min-height:48px; padding:0 14px; border:1px solid rgba(255,255,255,.35); border-radius:var(--radius-pill); background:#fff; color:var(--ink); font:inherit; }
.catalogue-request__row .btn { margin:0; white-space:nowrap; }
.catalogue-request__note, .catalogue-request__status { margin:10px 0 0; font-size:.78rem; color:rgba(255,255,255,.7); }
.catalogue-request__status { min-height:1.35em; color:#fff; }
@media (max-width:640px) {
  .door__visual { height:170px; }
  .catalogue-request__row { grid-template-columns:1fr; }
  .catalogue-request__row .btn { width:100%; justify-content:center; }
}

/* ==========================================================================
   Product cards — pack crossfades to dish (NORIKO's signature interaction)
   ========================================================================== */
.section-head {
  display: flex; align-items: flex-end; justify-content: space-between;
  gap: var(--space-5); margin-bottom: var(--space-7); flex-wrap: wrap;
}
.section-head p { margin-bottom: 0; }

.product-grid {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-5);
  list-style: none; padding: 0; margin: 0;
}
.product-card {
  display: flex; flex-direction: column; height: 100%;
  background: var(--card); border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: hidden;
  transition: box-shadow 220ms var(--ease), transform 220ms var(--ease),
              border-color 220ms var(--ease);
}
.product-card:hover,
.product-card:focus-within {
  transform: translateY(-2px);
  box-shadow: var(--shadow-card);
  border-color: var(--noriko-red);
}
.product-card__media {
  position: relative; aspect-ratio: 4/5; background: #fff; overflow: hidden;
}
.product-card__media img {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: contain; padding: var(--space-4);
  transition: opacity 300ms var(--ease);
}
/* The dish layer may be an <img> (real food photography) or a placeholder
   block until that photography exists. Both must stack over the packshot. */
.product-card__media .dish {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; padding: 0; opacity: 0;
  /* The card is 4:5 and the dish imagery is 3:2, so this crops ~47% of the
     width. That is deliberate. --dish-focus (`dish_focus` in products.json) is
     set to 100% on every supplied image, panning the crop hard right onto the
     food and leaving the pack out of frame.

     `contain` was tried on 28 Aug 2026 to show the whole image and reverted:
     it rendered 244×162 inside a 305px box — 71px of bar top and bottom — and
     the dish read as a small floating thumbnail. Nothing is lost by cropping
     the pack out here, because the pack IS the card's resting state; the hover
     exists to show the food. Decision recorded in VERIFIED-FACTS. */
  object-position: var(--dish-focus, 50% 50%);
  transition: opacity 300ms var(--ease);
}
.product-card__media span.dish {
  border-radius: 0; border-width: 0;
  background: var(--paper-2);
  background-image: repeating-linear-gradient(45deg,
    rgba(20,16,14,.05) 0 10px, transparent 10px 20px);
}
.product-card:hover .dish,
.product-card:focus-within .dish { opacity: 1; }
.product-card:hover .pack,
.product-card:focus-within .pack { opacity: 0; }
/* Under reduced motion the crossfade is instant, and focus still reveals the dish */
@media (prefers-reduced-motion: reduce) {
  .product-card__media img { transition: none; }
  .product-card:hover { transform: none; } .door:hover { transform: none; }
  .btn:hover { transform: none; }
}
.product-card__flag {
  position: absolute; top: var(--space-3); left: var(--space-3); z-index: 2;
  display: inline-flex; align-items: center; gap: var(--space-1);
  background: var(--ink); color: #fff;
  font-size: .6875rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  padding: 5px var(--space-3); border-radius: var(--radius-pill);
}
.product-card__flag--cook { background: var(--cook-deep); }
.product-card__flag--snack { background: var(--noriko-red); }
.product-card__flag--drink { background: var(--yuzu); color: var(--ink); }
.product-card__body { padding: var(--space-5); display: flex; flex-direction: column; flex: 1; }
.product-card__body h3 { font-size: 1.125rem; margin-bottom: var(--space-2); }
.product-card__body h3 a { text-decoration: none; }
.product-card__body h3 a::after { content: ""; position: absolute; inset: 0; }
.product-card { position: relative; }
.product-card__taste {
  font-size: .9375rem; color: var(--ink-soft); margin-bottom: var(--space-4);
}
.product-card__meta {
  margin-top: auto; display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3); padding-top: var(--space-4); border-top: 1px solid var(--line);
  font-size: .875rem;
}
.product-card__size { font-weight: 600; }
.hint-hover {
  font-size: .8125rem; color: var(--ink-mute);
  display: inline-flex; align-items: center; gap: var(--space-2);
}
.hint-hover svg { width: 15px; height: 15px; }

/* ==========================================================================
   JUZO band
   ========================================================================== */
/* ==========================================================================
   JUZO — the colour moment.
   The flavour colour is a solid block behind the cup, not a wash across the
   section. A radial tint bleeding into cream desaturated everything: the cup
   and the copy both sank into the backdrop. Concentrating the colour keeps
   the product forward and the text on a stable, readable ground.
   ========================================================================== */
.juzo { position: relative; overflow: hidden; background: var(--cream); }
.juzo__grid {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: .92fr 1.08fr;
  gap: var(--space-8); align-items: center;
}
.juzo h2 span { color: var(--juzo-active-ink, var(--juzo-blueberry-ink)); transition: color 300ms var(--ease); }

.juzo__spec {
  display: flex; flex-wrap: wrap; gap: var(--space-6);
  margin: var(--space-5) 0; padding: var(--space-4) 0;
  border-block: 1px solid rgba(15,20,19,.14);
}
.juzo__spec div strong {
  display: block; font-family: var(--font-display); font-size: 1.75rem; letter-spacing: -.02em;
}
.juzo__spec div span { font-size: .8125rem; color: var(--ink-soft); }

.flavours {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-2); list-style: none; padding: 0; margin: var(--space-5) 0 0;
}
.flavours button {
  width: 100%; min-height: 48px;
  display: flex; align-items: center; gap: var(--space-3);
  padding: var(--space-3) var(--space-4); border-radius: var(--radius);
  background: rgba(255,255,255,.82); border: 1px solid rgba(15,20,19,.14);
  font-family: var(--font-body); font-weight: 600; font-size: .9375rem;
  color: var(--ink); cursor: pointer; text-align: left;
  transition: border-color 180ms var(--ease), transform 180ms var(--ease),
              box-shadow 180ms var(--ease);
}
.flavours button:hover { transform: translateY(-1px); background: #fff; }
.flavours button[aria-pressed="true"] {
  background: #fff;
  border-color: var(--chip);
  box-shadow: inset 0 0 0 1px var(--chip);
}
.flavours button[aria-pressed="true"] .flavours__tick { opacity: 1; }
.flavours i { width: 16px; height: 16px; border-radius: 50%; flex: none; background: var(--chip); }
.flavours__name { flex: 1; white-space: nowrap; }
.flavours__tick { opacity: 0; flex: none; width: 16px; height: 16px; color: var(--ink); }

/* The colour block. Bleeds off the right edge so it reads as a field, not a card. */
.juzo__stage {
  position: relative; display: flex; align-items: center; justify-content: center;
  min-height: 500px; border: 1px solid rgba(15,20,19,.10);
  border-radius: var(--radius-lg);
  background: var(--juzo-active, var(--juzo-blueberry));
  transition: background-color 420ms var(--ease);
  margin-right: 0;
}
.juzo__cup {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  opacity: 0; transform: scale(.94) translateY(12px);
  transition: opacity 420ms var(--ease), transform 420ms var(--ease);
  pointer-events: none;
}
.juzo__cup.is-active { opacity: 1; transform: none; }
.juzo__cup img {
  max-height: 455px; width: auto; object-fit: contain;
  filter: drop-shadow(0 18px 26px rgba(0,0,0,.28));
}

/* Boba drifting on the colour block, in white so they read on every flavour */
.juzo__boba { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
.juzo__boba i {
  position: absolute; border-radius: 50%;
  background: #fff; opacity: .13;
  animation: bobaFloat 7s ease-in-out infinite;
}
.juzo__boba i:nth-child(n+4) { display: none; }
@keyframes bobaFloat {
  0%, 100% { transform: translateY(0) }
  50%      { transform: translateY(-16px) }
}
@media (prefers-reduced-motion: reduce) {
  .juzo__boba i { animation: none; }
  .juzo__cup { transition: none; }
}

/* ==========================================================================
   Snack — built on the range's own flavour-band system
   ========================================================================== */
.snack__rail {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-4);
}
.snack-card {
  position: relative; display: flex; flex-direction: column;
  background: #fff; border: 1px solid rgba(15,20,19,.08);
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: none; color: var(--ink);
  transition: transform 200ms var(--ease), box-shadow 200ms var(--ease);
}
.snack-card:hover, .snack-card:focus-within { transform: translateY(-2px); box-shadow: var(--shadow-card); }
/* The band across the top mirrors the flavour band on the physical pack */
.snack-card__band { height: 6px; }
.snack-card__media {
  aspect-ratio: 3/4; display: flex; align-items: center; justify-content: center;
  padding: var(--space-3); background: #fff;
}
/* Absolute-positioned, for the same reason as .inspo-card__media: a percentage
   height on a child of an aspect-ratio parent is circular and the image falls
   back to its intrinsic size (666px inside a 157px card on mobile). */
.snack-card__media { position: relative; }
.snack-card__media img {
  position: absolute; inset: var(--space-3);
  width: calc(100% - var(--space-6)); height: calc(100% - var(--space-6));
  object-fit: contain;
  transition: opacity 280ms var(--ease), transform 380ms var(--ease);
}
/* Hover previews use plated food photography where available; other cards
   retain a faithful crop from their physical pack artwork. */
.snack-card__media .snack-card__food {
  inset: 0; width: 100%; height: 100%; padding: 0;
  object-fit: cover;
  object-position: var(--food-focus, 50% 66%);
  opacity: 0;
  transform: scale(1.02);
}
.snack-card:hover .snack-card__media > img:not(.snack-card__food),
.snack-card:focus-within .snack-card__media > img:not(.snack-card__food) {
  opacity: 0;
}
.snack-card:hover .snack-card__food,
.snack-card:focus-within .snack-card__food {
  opacity: 1;
  transform: scale(1);
}
/* Some supplied portrait photographs contain stray leaves at the left edge.
   Because object-fit centres the narrow photo inside a wider card, clipping the
   image box itself misses those marks. Cover only the contaminated white strip;
   the product and its right edge remain fully visible. */
.snack-card__media:has(img[src$="big-latiao.webp"])::after,
.snack-card__media:has(img[src$="kiss-burn.webp"])::after,
.snack-card__media:has(img[src$="konjac-hot.webp"])::after,
.snack-card__media:has(img[src$="konjac-sour.webp"])::after {
  content: "";
  position: absolute;
  z-index: 1;
  inset: 0 auto 0 0;
  width: 16%;
  background: #fff;
  pointer-events: none;
  transition: opacity 220ms var(--ease);
}
.snack-card:hover .snack-card__media::after,
.snack-card:focus-within .snack-card__media::after { opacity:0; }
.snack-card__body { padding: var(--space-2) var(--space-5) var(--space-5); }
.snack-card__body h3 { min-height: 2.4em; font-size: 1rem; margin-bottom: var(--space-3); line-height: 1.2; }
.snack-card__body h3 a { text-decoration: none; }
.snack-card__body h3 a::after { content: ""; position: absolute; inset: 0; }
.snack-card__meta {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-2); flex-wrap: wrap; font-size: .8125rem; color: var(--ink-soft);
}
.snack-card__weight { font-weight: 700; color: var(--ink); }

@media (prefers-reduced-motion: reduce) {
  .snack-card__media img { transition: none; }
}

/* ==========================================================================
   SNACK band
   ========================================================================== */
.snack {
  padding-block: var(--space-7);
  background: var(--paper);
  color: #fff;
}
.snack > .container {
  width: calc(100% - var(--space-7));
  padding: var(--space-8) var(--space-6);
  background: var(--noriko-red);
  border-radius: var(--radius-lg);
}
.snack h2 { color: #fff; }
.snack__head {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8);
  align-items: end; margin-bottom: var(--space-7);
}
/* The heat scale legend — the pack markings only, no invented descriptions.
   Panel darkens rather than lightens the red: a white overlay would raise the
   ground luminance and push white text below 4.5:1. */
.snack__scale {
  display: flex; flex-direction: column; gap: var(--space-3);
  background: rgba(0,0,0,.22); border: 1px solid rgba(255,255,255,.32);
  border-radius: var(--radius); padding: var(--space-5);
}
.snack__scale h3 { font-size: .9375rem; margin: 0; color: #fff; }
.snack__scale ul {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: var(--space-4);
}
.snack__scale li { display: flex; align-items: center; }
.snack__scale .spice { color: #fff; }

/* Staggered snack grid — lifts alternate cards so the row is not a flat line */
@media (min-width: 761px) {
  .snack__rail > li:nth-child(even) { transform: translateY(var(--space-6)); }
}

/* ==========================================================================
   HoReCa band — dense spec rows, deliberately not a consumer grid
   ========================================================================== */
.horeca { background: var(--steel); color: #fff; }
.horeca h2 { color: #fff; }
.horeca__grid { display: grid; grid-template-columns: .9fr 1.1fr; gap: var(--space-9); }
.horeca__banner { margin:var(--space-6) 0 0; overflow:hidden; border:1px solid rgba(255,255,255,.18); border-radius:var(--radius-lg); background:rgba(255,255,255,.04); box-shadow:0 24px 60px rgba(0,0,0,.22); }
.horeca__banner img { display:block; width:100%; height:auto; object-fit:contain; }
.spec-table {
  background: rgba(255,255,255,.035);
  border: 1px solid rgba(255,255,255,.14); border-radius: var(--radius-lg);
  overflow: hidden;
}
.spec-table__head, .spec-row {
  display: grid; grid-template-columns: 52px 1fr 108px 126px;
  gap: var(--space-4); align-items: center; padding: var(--space-4);
}
.spec-table__head {
  font-size: .75rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(255,255,255,.6); border-bottom: 1px solid rgba(255,255,255,.14);
}
.spec-row {
  border-bottom: 1px solid rgba(255,255,255,.09);
  transition: background-color 180ms var(--ease);
}
.spec-row:last-child { border-bottom: 0; }
.spec-row:hover { background: rgba(255,255,255,.045); }
.spec-row img {
  width: 52px; height: 52px; object-fit: contain;
  background: #fff; border-radius: var(--radius); padding: 4px;
}
.spec-row__name { font-weight: 600; }
.spec-row__name span { display: block; font-size: .8125rem; font-weight: 400; color: rgba(255,255,255,.62); }
/* Ashokasha's foodservice range spans several brands. Anything not NORIKO is
   labelled, so nothing on a NORIKO site reads as NORIKO when it isn't. */
.spec-row__brand {
  display: inline-block; margin-left: var(--space-2);
  padding: 1px var(--space-2); border-radius: var(--radius-sm);
  border: 1px solid rgba(255,255,255,.32);
  font-size: .6875rem; font-weight: 600; letter-spacing: .04em;
  color: rgba(255,255,255,.82); vertical-align: middle;
}
.spec-row__size { font-weight: 700; }
.spec-row__cta {
  min-height: 40px; padding: 0 var(--space-4);
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: #fff; font-weight: 600; font-size: .875rem;
  border: 1px solid rgba(255,255,255,.4); border-radius: var(--radius-pill);
  cursor: pointer; font-family: var(--font-body);
  transition: background-color 180ms var(--ease), border-color 180ms var(--ease), color 180ms var(--ease);
}
.spec-row__cta:hover { background: #fff; color: var(--steel); border-color: #fff; }
.spec-row__cta[aria-pressed="true"] { background: var(--noriko-red); border-color: var(--noriko-red); color: #fff; }

/* ---- Category filter: built to absorb the full professional catalogue ----
   Wraps rather than scrolls, so adding categories never breaks the layout. */
.filters {
  display: flex; flex-wrap: wrap; gap: var(--space-2);
  margin-bottom: var(--space-4);
}
.filters button {
  min-height: 38px; padding: 0 var(--space-4);
  background: transparent; color: rgba(255,255,255,.86);
  border: 1px solid rgba(255,255,255,.28); border-radius: var(--radius-pill);
  font-family: var(--font-body); font-size: .875rem; font-weight: 600;
  cursor: pointer; white-space: nowrap;
  transition: background-color 180ms var(--ease), color 180ms var(--ease),
              border-color 180ms var(--ease);
}
.filters button:hover { border-color: #fff; color: #fff; }
/* Active state carries colour, fill AND aria-pressed — not colour alone */
.filters button[aria-pressed="true"] {
  background: #fff; color: var(--steel); border-color: #fff;
}
/* The homepage previews the catalogue; this reveals the rest in place. */
.spec-more {
  width: 100%; min-height: 48px; margin-top: var(--space-3);
  background: transparent; color: #fff;
  border: 1px solid rgba(255,255,255,.4); border-radius: var(--radius-pill);
  font-family: var(--font-body); font-size: .9375rem; font-weight: 600;
  cursor: pointer;
  transition: background-color 180ms var(--ease), border-color 180ms var(--ease);
}
.spec-more:hover { background: rgba(255,255,255,.1); border-color: #fff; }

.spec-table__none {
  margin: 0; padding: var(--space-6) var(--space-4);
  text-align: center; color: rgba(255,255,255,.66); font-size: .9375rem;
}

/* ---- Enquiry basket: review panel + details, no prices anywhere ---- */
.enquiry {
  margin-top: var(--space-5);
  background: rgba(0,0,0,.18); border: 1px solid rgba(255,255,255,.18);
  border-radius: var(--radius-lg); padding: var(--space-6);
}
.enquiry__head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--space-3); margin-bottom: var(--space-4);
}
.enquiry__head h3 { font-size: 1rem; margin: 0; color: #fff; }
.enquiry__count { font-size: .875rem; color: rgba(255,255,255,.72); }
.enquiry__list { list-style: none; margin: 0 0 var(--space-4); padding: 0; display: grid; gap: var(--space-2); }
.enquiry__list li {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3); font-size: .875rem;
  padding: var(--space-2) var(--space-3);
  background: rgba(255,255,255,.07); border-radius: var(--radius-sm);
}
.enquiry__list .num { color: rgba(255,255,255,.75); }
.enquiry__remove {
  min-width: 32px; min-height: 32px; display: inline-flex;
  align-items: center; justify-content: center;
  background: none; border: 1px solid rgba(255,255,255,.3);
  border-radius: var(--radius-sm); color: #fff; cursor: pointer;
  font-family: var(--font-body); font-size: .8125rem; padding: 0 var(--space-2);
}
.enquiry__remove:hover { background: rgba(255,255,255,.16); }
.enquiry__empty { font-size: .875rem; color: rgba(255,255,255,.66); margin: 0 0 var(--space-4); }
.enquiry__form { display: grid; gap: var(--space-3); }
.enquiry__row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); }
.field { display: grid; gap: var(--space-1); }
.field label { font-size: .8125rem; font-weight: 600; color: rgba(255,255,255,.86); }
.field input {
  min-height: 44px; padding: 0 var(--space-3);
  background: rgba(255,255,255,.95); color: var(--ink);
  border: 1px solid rgba(255,255,255,.3); border-radius: var(--radius);
  font-family: var(--font-body); font-size: 1rem;
}
.field input:focus-visible { outline: 3px solid #fff; outline-offset: 2px; }
.enquiry__note { font-size: .8125rem; color: rgba(255,255,255,.66); margin: 0; }

.horeca__cats { list-style: none; padding: 0; margin: var(--space-5) 0 var(--space-6); display: grid; gap: var(--space-2); }
.horeca__cats li { display: flex; align-items: center; gap: var(--space-3); color: rgba(255,255,255,.82); font-size: .9375rem; }
.horeca__cats svg { width: 16px; height: 16px; color: var(--noriko-red); flex: none; }

/* About — a centred, single-column statement.

   Its neighbours are the 3-up inspiration grid and the 2-panel contact band, so
   this is deliberately neither: one measured column down the middle (§4b).
   .section-head--center is used exactly twice on the site — the Doors and here.

   There is still no verified company history. The block stays narrow rather than
   padded out with restated copy: the numeric credential strip that once sat near
   here was removed for saying nothing the hero had not already said. */
.about {
  background: var(--paper-2);
  border-block: 1px solid var(--line);
}
.about__body {
  max-width: 62ch; margin-inline: auto; text-align: center;
}
/* The opening line carries the positioning, so it takes display type. */
.about__statement {
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(1.1875rem, 2vw, 1.625rem);
  letter-spacing: -.02em; line-height: 1.3;
  color: var(--ink); margin-bottom: var(--space-5);
}
.about__body p { margin-inline: auto; }
.about__body p + p { color: var(--ink-soft); }
.about__body a { color: var(--noriko-red-deep); text-decoration: underline; }
.about__body a:hover { text-decoration: none; }

/* The gap is meant to be read, so it is centred under the prose, not tucked away. */
.about__gap {
  max-width: 62ch; margin: var(--space-7) auto 0;
  text-align: left;
}
.about__gap span { max-width: none; }

.about__actions { margin-top: var(--space-7); text-align: center; }

.cta-band { background: var(--ink); color: #fff; }
.cta-band__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); }
.cta-panel {
  padding: var(--space-6) 0 0;
  border-top: 1px solid rgba(255,255,255,.22);
  background: transparent;
}
.cta-panel h3 { color: #fff; }
.cta-panel p { color: rgba(255,255,255,.74); font-size: .9375rem; }

.contact-intro { margin-bottom:var(--space-7); max-width:58ch; }
.contact-grid { display:grid; grid-template-columns:minmax(0,1.45fr) minmax(250px,.55fr); gap:var(--space-9); align-items:start; }
.contact-form { padding:var(--space-7); background:#fff; color:var(--ink); border-radius:var(--radius-lg); }
.contact-form__grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--space-5); margin-bottom:var(--space-6); }
.contact-form label { display:flex; flex-direction:column; gap:8px; min-width:0; }
.contact-form label > span { font-size:.78rem; font-weight:700; letter-spacing:.08em; text-transform:uppercase; }
.contact-form label small { color:var(--ink-mute); font-size:.72rem; font-weight:400; letter-spacing:0; text-transform:none; }
.contact-form input, .contact-form select, .contact-form textarea { width:100%; border:1px solid var(--line-strong); border-radius:10px; background:var(--paper); color:var(--ink); font:inherit; padding:12px 14px; }
.contact-form select { min-height:116px; }
.contact-form textarea { resize:vertical; min-height:140px; }
.contact-form input:focus, .contact-form select:focus, .contact-form textarea:focus { outline:3px solid rgba(234,29,38,.18); border-color:var(--noriko-red); }
.contact-form__wide { grid-column:1 / -1; }
.contact-form__status { min-height:1.5em; margin-top:var(--space-3); color:var(--ink-soft); font-size:.875rem; }
.contact-details { padding-top:var(--space-6); border-top:1px solid rgba(255,255,255,.25); }
.contact-details h3 { color:#fff; font-size:clamp(1.8rem,3vw,2.6rem); }
.contact-details p { color:rgba(255,255,255,.76); }
.contact-details dl { margin-top:var(--space-7); }
.contact-details dl div { padding-block:var(--space-4); border-top:1px solid rgba(255,255,255,.16); }
.contact-details dt { color:rgba(255,255,255,.55); font-size:.72rem; font-weight:700; letter-spacing:.12em; text-transform:uppercase; }
.contact-details dd { margin-top:6px; color:#fff; font-size:1.05rem; }
.contact-details a { color:#fff; text-underline-offset:3px; }

.footer { background: var(--ink); color: rgba(255,255,255,.7); padding-block: var(--space-9) var(--space-6); border-top: 1px solid rgba(255,255,255,.12); }
.footer__grid { display: grid; grid-template-columns: 1.55fr 1fr 1fr 1fr; gap: var(--space-7); }
.footer h4 {
  font-family: var(--font-body); font-size: .8125rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: #fff; margin-bottom: var(--space-4);
}
.footer ul { list-style: none; padding: 0; margin: 0; display: grid; gap: var(--space-3); }
.footer a { color: rgba(255,255,255,.7); text-decoration: none; display: inline-block; padding: 2px 0; }
.footer a:hover { color: #fff; text-decoration: underline; }
.footer .wordmark { color: #fff; margin-bottom: var(--space-4); }
.footer__note { font-size: .875rem; max-width: 42ch; }
.footer__base {
  margin-top: var(--space-7); padding-top: var(--space-5);
  border-top: 1px solid rgba(255,255,255,.12);
  display: flex; justify-content: space-between; gap: var(--space-4);
  flex-wrap: wrap; font-size: .8125rem;
}

/* ---------- Entrance animation ----------
   Fail-safe: content is visible by default. The hidden start state is only
   applied once JS has confirmed it can observe and reveal it, so a failed
   observer, a JS error, or no JS at all can never leave the page blank. */
.js-reveal .reveal { opacity: 0; transform: translateY(16px); }
.js-reveal .reveal.is-in {
  opacity: 1; transform: none;
  transition: opacity 420ms var(--ease), transform 420ms var(--ease);
}
@media (prefers-reduced-motion: reduce) {
  .js-reveal .reveal { opacity: 1; transform: none; transition: none; }
}

/* ========================================================================== 
   Responsive
   ========================================================================== */
/* Desktop density: comfortable at the browser's true 100% zoom. The earlier
   campaign scale made each module fill a screen; this keeps the brand prominent
   while allowing the next piece of content to remain visible. */
@media (min-width: 901px) {
  :root { --container: 1180px; }
  body { font-size: 16px; }

  .section { padding-block: 72px; }
  .section--loose { padding-block: 88px; }
  .section--snug { padding-block: 40px; }

  h1 { font-size: clamp(2.6rem, 4.6vw, 4rem); }
  h2 { font-size: clamp(1.9rem, 3.2vw, 2.75rem); }
  h3 { font-size: clamp(1.25rem, 1.7vw, 1.55rem); }
  .lede { font-size: clamp(1rem, 1.2vw, 1.125rem); }

  .audience-bar .container { min-height: 38px; }
  .audience-switch a,
  .audience-bar__aside a { min-height: 38px; }

  .masthead .container { min-height: 76px; }
  .brand { padding: 4px 8px; margin-inline-start: -8px; }
  .brand img { height: 64px; }
  .nav { gap: 2px; }
  .nav a { min-height: 40px; padding-inline: 12px; font-size: .95rem; }

  .hero__inner { padding-block: 44px 40px; }
  .hero__words { font-size: clamp(2.5rem, 5.3vw, 4.35rem); }
  .hero__actions { margin-top: 20px; }
  .hero__world { padding: 32px 24px 24px; }
  .hero__world__media { margin-bottom: 16px; }
  .hero__world__media img { max-height: 280px; }
  .hero__world__foot strong { font-size: clamp(1.25rem, 1.8vw, 1.625rem); }

  .page-head { padding-block: 52px; }
  .page-head h1 { font-size: clamp(2.25rem, 4vw, 3.25rem); }
  .retail-head { gap: clamp(40px, 5vw, 72px); }
  .retail-head h1 { font-size: clamp(2.75rem, 4.7vw, 4.8rem); }
  .retail-head__visual { min-height: 420px; }

  .world-row { padding: 40px; }
  .world-row__media img { max-height: 280px; }
  .world-row h3 { font-size: clamp(1.8rem, 2.8vw, 2.5rem); }

  .recipe-hero { padding-block: 36px 56px; }
  .recipe-hero__grid { gap: 48px; }
  .recipe-hero h1 { font-size: clamp(2.35rem, 4vw, 3.6rem); }
  .recipe-hero__image { max-height: 360px; }

  .pdp { grid-template-columns: minmax(320px, 440px) minmax(0, 1fr); gap: 48px; }
  .pdp__info h1 { font-size: clamp(2rem, 3vw, 2.75rem); }
  .pdp__actions { margin-top: 32px; }

  .about-hero__grid { min-height: 540px; padding-block: 64px; }
  .about-hero h1 { font-size: clamp(2.7rem, 5vw, 4.5rem); }
}

@media (max-width: 1024px) {
  .product-grid { grid-template-columns: repeat(3, 1fr); }
  .footer__grid { grid-template-columns: 1fr 1fr; }
  .horeca__grid, .juzo__grid, .cta-band__grid, .snack__head,
  .cook-feature, .band__grid { grid-template-columns: 1fr; } .inspo-grid { grid-template-columns: repeat(2, 1fr); }
  .contact-grid { grid-template-columns:1fr; gap:var(--space-7); }
  .snack__rail { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .section--loose { padding-block: var(--space-8); }
  .world-row { grid-template-columns: 1fr; gap: var(--space-5); padding: var(--space-6); }
  .world-row--flip .world-row__media { order: 0; }
  .world-row__media { min-height: 0; }
  .world-row__media img { max-height: 220px; transform: none; }
  }

/* The seven-item nav needs ~620px; below this it must collapse to the toggle
   or it pushes the masthead past the viewport. */
@media (max-width: 900px) {
  .nav { display: none; }
  .nav.is-open {
    display: flex; flex-direction: column; align-items: stretch;
    position: absolute; top: 100%; left: 0; right: 0;
    background: var(--paper); border-bottom: 1px solid var(--line);
    padding: var(--space-3); gap: var(--space-1);
    box-shadow: var(--shadow-card);
  }
  .nav.is-open a { border-radius: var(--radius); }
  .nav-toggle { display: inline-flex; }
  .masthead .container { position: relative; gap: var(--space-3); min-height: 76px; }
  .brand img { height: 46px; }   /* kana ~11.6px — still five distinct strokes */
  .brand { padding-inline: var(--space-2); margin-inline-start: calc(var(--space-2) * -1); }
}

@media (max-width: 760px) {
  body { font-size: 16px; }
  .section { padding-block: var(--space-7); }
  .product-grid { grid-template-columns: repeat(2, 1fr); } .inspo-grid, .doors { grid-template-columns: 1fr; }
  /* Mobile: tighten vertical rhythm — long empty runs read as unfinished */
  .section--loose { padding-block: var(--space-7); }
  .snack { padding-block: var(--space-5); }
  .snack > .container {
    width: calc(100% - var(--space-5));
    padding: var(--space-7) var(--space-5);
  }
  .world-row { padding: var(--space-5); }
  .world-row__media img { max-height: 190px; }
    .cook-feature { padding: var(--space-5); }
  .enquiry__row { grid-template-columns: 1fr; }
  .hero__inner { padding-block: var(--space-7) var(--space-7); }
  /* Mobile: the triptych stacks. Panels go side-on so the packshot still
     reads at size rather than shrinking into three thin strips. */
  .hero__worlds { grid-template-columns: 1fr; }
  .hero__world { flex-direction: row; align-items: center; gap: var(--space-4);
                 padding: var(--space-4) var(--space-5); }
  .hero__world__media { flex: 0 0 40%; margin-bottom: 0; }
  .hero__world__media img { max-height: 150px; }
  .hero__world__foot { flex: 1; }
  .flavours { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .flavours button {
    gap: var(--space-2);
    padding-inline: var(--space-3);
    font-size: .875rem;
  }
  .juzo__stage { min-height: 360px; margin-right: 0; }
  .juzo__cup img { max-height: 320px; }

  /* Snacks become a swipeable snap rail on mobile. Eight stacked cards ran to
     ~3,100px of scroll; the rail keeps packs large and browsable instead.
     The rail scrolls, never the page body. */
  .snack__rail {
    display: flex; gap: var(--space-3);
    overflow-x: auto; overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    /* Bleed to the screen edge so the next card peeks — signals scrollability */
    margin-inline: calc(var(--space-5) * -1);
    padding: var(--space-1) var(--space-5) var(--space-4);
  }
  .snack__rail > li {
    flex: 0 0 62%; scroll-snap-align: start;
    transform: none;
  }
  .snack-card__body { padding: var(--space-2) var(--space-4) var(--space-4); }
  /* Spec rows reflow — never a horizontal scroll on mobile */
  .spec-table__head { display: none; }
  .spec-row {
    grid-template-columns: 56px 1fr; grid-template-areas:
      "img name" "size size" "cta cta";
    gap: var(--space-3); padding: var(--space-4);
  }
  .spec-row img { grid-area: img; }
  .spec-row__name { grid-area: name; }
  .spec-row__size { grid-area: size; }
  .spec-row__cta { grid-area: cta; width: 100%; }
  .audience-switch a[aria-current]::after { content: none; }
  .audience-bar__aside { display: none; }
}

@media (max-width: 420px) {
  /* Two-up, not one-up: four full-width cards ran to ~3,400px of scroll.
     A 4:5 packshot at ~157px is still clearly readable. */
  .product-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); }
  .product-card__body { padding: var(--space-4); }
  .product-card__taste { font-size: .875rem; }
  .inspo-card__media { aspect-ratio: 2/1; }
  .footer__grid { grid-template-columns: 1fr; }
  /* Two columns keeps flavour browsing thumb-friendly rather than a long list */
  .flavours { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .juzo__spec { gap: var(--space-4); }
  .hero__actions, .owner-story__actions { align-items: stretch; }
  .hero__actions .btn, .owner-story__actions .btn { justify-content: center; }
  .cta-panel .btn { width: 100%; justify-content: center; }
  .contact-form { padding:var(--space-5); }
  .contact-form__grid { grid-template-columns:1fr; }
  .contact-form__wide { grid-column:auto; }
}

/* ============================================================================
   PRODUCT DETAIL PAGE (products/*.html)
   Generated by tools/build-products.py from assets/data/products.json.

   Pack first, specification second — the same order as the product card, given
   room. The dish placeholder is NOT a hover layer here: on a detail page the
   missing photography is stated outright, because hover-only information fails
   §7 and the gap is meant to be read.
   ========================================================================== */

.pdp {
  display: grid; grid-template-columns: 5fr 7fr;
  gap: var(--space-8); align-items: start;
}

.pdp__figure { position: sticky; top: var(--space-5); }

.pdp__media {
  position: relative; aspect-ratio: 4/5;
  background: var(--card); border: 1px solid var(--line);
  border-radius: var(--radius-lg); overflow: hidden;
}
/* Absolute inside a relative aspect box — never a percentage height in an
   aspect-ratio parent. See MASTER.md §4c. */
.pdp__media .pack {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: contain; padding: var(--space-6);
}
/* Four supplied photos include unwanted fragments in the empty outer margin.
   Trim only that margin; the product package itself remains untouched. */
.pdp__media .pack[src*="big-latiao.webp"] { clip-path: inset(0 0 0 6%); }
.pdp__media .pack[src*="kiss-burn.webp"] { clip-path: inset(0 3% 0 3%); }
.pdp__media .pack[src*="konjac-hot.webp"] { clip-path: inset(0 0 0 7%); }
.pdp__media .pack[src*="konjac-sour.webp"] { clip-path: inset(0 0 0 5%); }
/* The snack world codes flavour by band colour on the physical pack. */
.pdp__band {
  position: absolute; inset-inline: 0; top: 0; height: 8px; z-index: 2;
}
.pdp__gap { margin-top: var(--space-4); }
.pdp__gap span { max-width: 40ch; }

/* "Pack → what it becomes" (§1). On a card that is a hover crossfade; here both
   are shown at once, so the information is never hover-only. Editorial 3:2. */
.pdp__dish { margin: var(--space-4) 0 0; }
.pdp__dish img {
  display: block; width: 100%; height: auto; aspect-ratio: 3/2;
  object-fit: cover; border-radius: var(--radius-lg);
  border: 1px solid var(--line); background: var(--card);
}
.pdp__dish figcaption {
  margin-top: var(--space-2);
  font-size: .8125rem; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--ink-mute);
}

.pdp__info h1 {
  /* The homepage h1 scale is a brand statement; a product name is not. */
  font-size: clamp(2.1rem, 3.6vw, 3.1rem);
}
/* Inline-flex + min-height keeps the world link a ≥24px pointer target (§7);
   as a bare inline it measured 52×16. */
.pdp__info .eyebrow a {
  display: inline-flex; align-items: center; min-height: 24px;
  color: inherit; text-decoration: none;
}
.pdp__info .eyebrow a:hover { text-decoration: underline; }

/* Brand attribution. The foodservice catalogue spans brands, and this is
   NORIKO's site — so anything that is not NORIKO says so plainly, not in small
   print (§0b). Steel ground, not red: this is information, not a signal. */
.pdp__brand {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3);
  margin: 0 0 var(--space-4);
  font-size: .9375rem; color: var(--ink-soft);
}
.pdp__brand span {
  display: inline-flex; align-items: center; min-height: 24px;
  padding: 2px var(--space-3);
  background: var(--steel); color: #fff;
  border-radius: var(--radius-sm);
  font-weight: 700; letter-spacing: .04em;
}

.product-card__brand {
  margin: 0 0 var(--space-2);
  font-size: .75rem; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-mute);
}

.pdp__chips {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--space-3) var(--space-5);
  margin: var(--space-5) 0 0;
}
.chip {
  display: inline-flex; align-items: center; min-height: 32px;
  padding: 4px var(--space-4);
  border: 1px solid var(--line); border-radius: var(--radius-pill);
  background: var(--card);
  font-size: .875rem; font-weight: 600; color: var(--ink);
}
.chip--size { font-weight: 700; }

.pdp__price { margin: var(--space-6) 0 0; }
.pdp__price > .num {
  font-family: var(--font-display); font-weight: 800;
  font-size: 2.1rem; letter-spacing: -0.03em; color: var(--ink);
}
.pdp__price-note {
  display: block; margin-top: var(--space-1);
  font-size: .875rem; color: var(--ink-soft);
}

.pdp__actions {
  display: flex; flex-wrap: wrap; gap: var(--space-3);
  margin-top: var(--space-7);
}
.pdp__enquiry-note {
  flex-basis: 100%;
  max-width: 42rem;
  margin: var(--space-1) 0 0;
  color: var(--ink-soft);
  font-size: .9rem;
  line-height: 1.55;
}

/* ---------- Specification blocks ---------- */

/* Reading measure for the spec sections — the container is 1280px, which is far
   too wide for an ingredients paragraph. */
.pdp-cols > .factlist,
.pdp-cols > .ingredients,
.pdp-cols > .allergens,
.pdp-cols > .warnings,
.pdp-cols > .note,
.pdp-cols > .nutri-wrap { max-width: 78ch; }

.pdp__sub {
  font-size: 1.0625rem; font-weight: 700;
  letter-spacing: .08em; text-transform: uppercase;
  font-family: var(--font-body);
  margin: var(--space-7) 0 var(--space-3);
}

.factlist { margin: 0; }
.factlist__row {
  display: grid; grid-template-columns: 20rem 1fr; gap: var(--space-5);
  padding: var(--space-4) 0; border-bottom: 1px solid var(--line);
}
.factlist__row:first-child { border-top: 1px solid var(--line); }
.factlist dt { color: var(--ink-mute); font-size: .9375rem; }
.factlist dd { margin: 0; color: var(--ink); font-weight: 600; }

.ingredients { color: var(--ink-soft); line-height: 1.65; }

.allergens {
  border-inline-start: 3px solid var(--noriko-red);
  padding: var(--space-3) 0 var(--space-3) var(--space-4);
  background: var(--paper-2); color: var(--ink);
}

/* A nutrition table is genuinely tabular data and must not force the page to
   scroll sideways at 375px — it scrolls inside its own box instead. */
.nutri-wrap { overflow-x: auto; }
.nutri {
  width: 100%; border-collapse: collapse;
  background: var(--card); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.nutri th, .nutri td {
  text-align: left; padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--line); font-size: .9375rem;
}
.nutri thead th {
  background: var(--paper-2); color: var(--ink);
  font-size: .75rem; letter-spacing: .1em; text-transform: uppercase;
}
.nutri tbody th { font-weight: 500; color: var(--ink-soft); }
.nutri td { text-align: right; font-weight: 600; }
.nutri tr:last-child th, .nutri tr:last-child td { border-bottom: 0; }

.warnings { margin: 0; padding-inline-start: var(--space-5); }
.warnings li {
  margin-bottom: var(--space-3); max-width: 78ch;
  color: var(--ink-soft); font-size: .9375rem; line-height: 1.6;
}

.note {
  font-size: .875rem; color: var(--ink-soft); line-height: 1.6;
  margin-top: var(--space-4);
}
/* Same visual language as .needs-photo: an open question, deliberately visible. */
.note--warn {
  border-inline-start: 3px dashed var(--noriko-red-deep);
  background: var(--paper-2); color: var(--ink);
  padding: var(--space-4);
}
.note--warn strong { color: var(--noriko-red-deep); }

@media (max-width: 1024px) {
  .pdp { grid-template-columns: 1fr; gap: var(--space-7); }
  .pdp__figure { position: static; max-width: 460px; }
  .factlist__row { grid-template-columns: 14rem 1fr; }
}

@media (max-width: 640px) {
  .pdp__media .pack { padding: var(--space-5); }
  /* Label above value — two columns at 375px leaves neither enough room */
  .factlist__row { grid-template-columns: 1fr; gap: var(--space-1); }
  .pdp__actions .btn { width: 100%; justify-content: center; }
  .pdp__chips { gap: var(--space-3) var(--space-4); }
}

/* ========================================================================== 
   About NORIKO page
   ========================================================================== */
.about-hero { position: relative; overflow: hidden; background: var(--ink); }
.about-hero::before { content:""; position:absolute; width:540px; height:540px; border:1px solid rgba(255,255,255,.08); border-radius:50%; right:-160px; top:-250px; }
.about-hero__grid { min-height: 650px; display:grid; grid-template-columns: 1.06fr .94fr; align-items:center; gap:var(--space-8); padding-block:var(--space-9); }
.about-hero__copy { position:relative; z-index:2; }
.about-hero h1 { color:#fff; font-size:clamp(2.8rem,6vw,5.7rem); max-width:12ch; }
.about-hero .lede { max-width:52ch; color:rgba(255,255,255,.78); margin-top:var(--space-5); }
.about-hero__facts { display:flex; flex-wrap:wrap; gap:var(--space-3); margin-top:var(--space-7); }
.about-hero__facts span { border:1px solid rgba(255,255,255,.16); border-radius:var(--radius-pill); padding:9px 14px; color:rgba(255,255,255,.72); font-size:.84rem; }
.about-hero__facts strong { color:#fff; margin-right:5px; }
.about-hero__visual { position:relative; height:500px; }
.about-hero__halo { position:absolute; width:390px; height:390px; border-radius:50%; background:var(--noriko-red); opacity:.94; left:50%; top:50%; transform:translate(-50%,-50%); }
.about-hero__pack { position:absolute; object-fit:contain; filter:drop-shadow(0 28px 38px rgba(0,0,0,.38)); }
.about-hero__pack--cook { height:350px; width:auto; left:2%; bottom:10%; transform:rotate(-7deg); }
.about-hero__pack--snack { height:315px; width:auto; left:38%; top:4%; transform:rotate(5deg); z-index:2; }
.about-hero__pack--drink { height:350px; width:auto; right:0; bottom:5%; transform:rotate(7deg); z-index:3; }

.about-story__grid { display:grid; grid-template-columns:.92fr 1.08fr; gap:var(--space-8); align-items:start; }
.about-story h2 { max-width:11ch; font-size:clamp(2.4rem,4vw,4rem); line-height:.98; }
.about-story__route { position:relative; display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:18px; max-width:510px; margin:clamp(40px,6vw,82px) 0 0; padding:0; list-style:none; }
.about-story__route::before { content:""; position:absolute; left:14px; right:14px; top:14px; height:2px; background:linear-gradient(90deg,var(--noriko-red),rgba(234,29,38,.25)); }
.about-story__route li { position:relative; padding-top:36px; }
.about-story__route li::before { content:""; position:absolute; top:8px; left:8px; width:14px; height:14px; border:4px solid var(--paper); border-radius:50%; background:var(--noriko-red); box-shadow:0 0 0 1px var(--noriko-red); }
.about-story__route span { display:block; margin-bottom:7px; color:var(--noriko-red); font-size:.66rem; font-weight:800; letter-spacing:.14em; }
.about-story__route strong { display:block; font-family:var(--font-display); font-size:clamp(.82rem,1.2vw,1rem); line-height:1.15; }
.about-story__copy { max-width:68ch; padding-top:78px; }
.about-story__lead { font-family:var(--font-display); font-weight:600; font-size:clamp(1.28rem,2.1vw,1.8rem); line-height:1.32; letter-spacing:-.02em; color:var(--ink); }
.about-story__copy p + p, .owner-story p + p { color:var(--ink-soft); margin-top:var(--space-4); }

.about-world-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:var(--space-5); margin-top:var(--space-7); }
.about-world { min-height:480px; display:flex; flex-direction:column; border-radius:var(--radius-lg); overflow:hidden; text-decoration:none; transition:transform 220ms var(--ease), box-shadow 220ms var(--ease); }
.about-world:hover { transform:translateY(-2px); box-shadow:var(--shadow-card); }
.about-world--cook { background:var(--cook-deep); color:#fff; }
.about-world--snack { background:var(--band-spicy); color:#fff; }
.about-world--drink { background:var(--cream); color:var(--ink); }
.about-world__label { padding:var(--space-5) var(--space-5) 0; font-size:.78rem; text-transform:uppercase; letter-spacing:.12em; font-weight:700; opacity:.78; }
.about-world__media { min-height:260px; flex:1; display:flex; justify-content:center; align-items:center; padding:var(--space-6); }
.about-world__media img { max-height:260px; width:auto; object-fit:contain; filter:drop-shadow(0 15px 22px rgba(15,20,19,.22)); }
.about-world__body { padding:0 var(--space-5) var(--space-6); }
.about-world__body strong { font-family:var(--font-display); display:block; font-size:1.65rem; letter-spacing:-.02em; }
.about-world__body span { display:block; margin-top:8px; opacity:.82; }

.about-principle { padding-block:var(--space-9); background:var(--steel); }
.about-principle__grid { display:grid; grid-template-columns:.8fr 1.2fr; gap:var(--space-9); align-items:start; }
.about-principle h2 { color:#fff; font-size:clamp(2.5rem,5vw,4.5rem); }
.about-principle p { color:rgba(255,255,255,.75); max-width:62ch; }
.about-principle p + p { margin-top:var(--space-5); }

.owner-story__grid { display:grid; grid-template-columns:minmax(0,.88fr) minmax(0,1.12fr); gap:clamp(36px,5vw,80px); max-width:1280px; align-items:start; }
.owner-story__grid > div:last-child { width:100%; max-width:680px; margin-inline:0; }
.owner-story__mark { width:100%; min-height:0; aspect-ratio:1/1; display:flex; align-items:center; justify-content:center; background:var(--paper-2); border:1px solid var(--line); border-radius:var(--radius-lg); position:relative; overflow:hidden; }
.owner-story__mark img { width:100%; height:100%; object-fit:cover; transform:none; }
.owner-story__brand-lockup {
  position:absolute; right:4.7%; top:17.4%; z-index:2;
  width:24%; height:22%; padding:12px;
  display:flex; align-items:center; justify-content:center;
}
.owner-story__brand-kicker { display:block; margin-bottom:8px; color:#5f3e1d; font-size:clamp(.48rem,.72vw,.64rem); font-weight:800; letter-spacing:.15em; text-transform:uppercase; }
.owner-story__brand-row { display:flex; flex-direction:column; align-items:center; gap:7px; }
.owner-story__brand-lockup strong {
  font-family:var(--font-display); color:#1d140c; font-size:clamp(.78rem,1.25vw,1.08rem); letter-spacing:-.025em;
}
.owner-story__brand-row i { display:flex; width:64%; height:1px; align-items:center; justify-content:center; background:#8b1d18; position:relative; }
.owner-story__brand-row i::after { content:""; position:absolute; right:-2px; top:-3px; width:7px; height:7px; transform:rotate(45deg); border-top:1px solid #8b1d18; border-right:1px solid #8b1d18; }
.owner-story__brand-row i span { padding:0 5px; background:#b68b49; color:#5d391c; font:700 .47rem/1 var(--font-body); font-style:normal; text-transform:uppercase; }
.owner-story__brand-lockup img { width:82%; height:auto; max-height:58px; object-fit:contain; }
.owner-story__journey { position:absolute; left:32px; right:32px; bottom:32px; display:grid; grid-template-columns:1fr auto 1fr auto 1fr; align-items:center; gap:10px; }
.owner-story__journey span { display:flex; flex-direction:column; min-width:0; }
.owner-story__journey strong { font-family:var(--font-display); font-size:clamp(.82rem,1.2vw,1rem); line-height:1.1; color:var(--ink); }
.owner-story__journey small { margin-top:4px; font-size:.66rem; text-transform:uppercase; letter-spacing:.12em; color:var(--ink-mute); }
.owner-story__journey i { font-style:normal; color:var(--noriko-red); font-weight:800; }
.owner-story h2 { font-size:clamp(2rem,3vw,2.75rem); line-height:1.04; max-width:20ch; }
.owner-story .about-story__lead { max-width:46ch; font-size:clamp(1.08rem,1.35vw,1.28rem); line-height:1.42; }
.owner-story p:not(.eyebrow):not(.about-story__lead) { font-size:.95rem; line-height:1.62; }
.owner-story__company-link { color:inherit; text-decoration-color:var(--noriko-red); text-decoration-thickness:.08em; text-underline-offset:.1em; }
.owner-story__company-link:hover { color:var(--noriko-red); }
.owner-story__actions { display:flex; flex-wrap:wrap; gap:12px; margin-top:var(--space-6); }
.owner-story__actions .btn { margin-top:0; }

@media (max-width: 960px) {
  .about-hero__grid, .about-story__grid, .about-principle__grid, .owner-story__grid { grid-template-columns:1fr; gap:var(--space-7); }
  .about-story__copy { padding-top:0; }
  .about-story__route { margin-top:var(--space-7); }
  .about-hero__grid { padding-block:var(--space-8); }
  .about-hero__visual { height:360px; }
  .about-hero__halo { width:280px; height:280px; }
  .about-hero__pack--cook { height:245px; }
  .about-hero__pack--snack { height:220px; }
  .about-hero__pack--drink { height:245px; }
  .about-world-grid { grid-template-columns:1fr; }
  .about-world { min-height:0; }
  .owner-story__grid > div:last-child { max-width:68ch; }
  .owner-story__mark { min-height:0; aspect-ratio:1/1; }
  .owner-story__mark img { width:100%; height:100%; object-fit:cover; transform:none; }
  .owner-story__journey { left:20px; right:20px; bottom:22px; }
  .owner-story__brand-lockup {
    left:auto; right:4.7%; top:17.4%; bottom:auto; width:24%; height:22%;
    padding:9px; border:0; border-radius:0; background:transparent; box-shadow:none; backdrop-filter:none;
  }
  .owner-story__brand-lockup img { width:84%; max-height:54px; }
}

/* Dedicated HoReCa story */
.horeca__story-link{display:inline-flex;margin:var(--space-4) 0 var(--space-2);color:#fff}.pro-hero{background:linear-gradient(120deg,#0d1414 0%,#10201f 58%,#321211 100%);overflow:hidden}.pro-hero__grid{min-height:min(760px,calc(100vh - 150px));padding-block:clamp(40px,6vw,82px);display:grid;grid-template-columns:minmax(0,1.05fr) minmax(340px,.72fr);align-items:center;gap:clamp(36px,7vw,110px)}.pro-hero__copy h1{max-width:820px;margin:.35em 0;color:#fff;font-size:clamp(3rem,5.5vw,6.3rem);line-height:.91;letter-spacing:-.06em}.pro-hero__copy .lede{max-width:760px;color:rgba(255,255,255,.78)}.pro-hero__actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:var(--space-6)}.pro-hero__visual{position:relative;margin:0;justify-self:end;width:min(100%,470px);border-radius:28px;overflow:hidden;background:#f4eee6;box-shadow:0 36px 90px rgba(0,0,0,.42);transform:rotate(1.25deg)}.pro-hero__visual img{display:block;width:100%;max-height:630px;object-fit:cover;object-position:center 48%}.pro-hero__visual figcaption{position:static;padding:14px 18px 16px;display:flex;align-items:baseline;justify-content:space-between;gap:16px;border:0;background:#f4eee6;color:#101616}.pro-hero__visual figcaption strong{font-size:.88rem}.pro-hero__visual figcaption span{max-width:210px;color:#57605f;font-size:.72rem;line-height:1.35;text-align:right}
.pro-ecosystem{padding:24px 0;background:var(--noriko-red);color:#fff}.pro-ecosystem .container{display:flex;align-items:center;gap:32px}.pro-ecosystem p{margin:0;max-width:190px;font-size:.72rem;font-weight:800;letter-spacing:.13em;line-height:1.25;text-transform:uppercase}.pro-ecosystem__rail{flex:1;display:flex;gap:9px;overflow-x:auto;scrollbar-width:none}.pro-ecosystem__rail::-webkit-scrollbar{display:none}.pro-ecosystem__rail span{flex:none;padding:10px 15px;border:1px solid rgba(255,255,255,.38);border-radius:999px;font-size:.82rem;font-weight:700}
.pro-section-head{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(280px,.65fr);gap:clamp(30px,7vw,110px);align-items:end;margin-bottom:var(--space-7)}.pro-section-head h2{max-width:780px;margin:.25em 0 0}.pro-section-head>.lede{margin:0;font-size:clamp(1.05rem,1.5vw,1.35rem)}.pro-proof__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.pro-proof-card{min-height:315px;display:grid;grid-template-columns:38% 1fr;overflow:hidden;border:1px solid var(--line);border-radius:22px;background:#fff}.pro-proof-card__mark{position:relative!important;padding:26px!important;align-self:stretch!important;display:flex;flex-direction:column;justify-content:space-between;background:linear-gradient(145deg,#122321,#193d35);color:#fff}.pro-proof-card:nth-child(2) .pro-proof-card__mark{background:linear-gradient(145deg,#22201b,#51431f)}.pro-proof-card:nth-child(3) .pro-proof-card__mark{background:linear-gradient(145deg,#291313,#6d1e1b)}.pro-proof-card:nth-child(4) .pro-proof-card__mark{background:linear-gradient(145deg,#17202b,#274f67)}.pro-proof-card__mark>span{font-size:.67rem;font-weight:800;letter-spacing:.14em;color:rgba(255,255,255,.65)}.pro-proof-card__mark svg{width:clamp(72px,8vw,112px);height:auto;margin:auto;fill:none;stroke:currentColor;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.pro-proof-card__mark small{font-size:.68rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.72)}.pro-proof-card__copy{padding:clamp(22px,3vw,38px);align-self:end}.pro-proof-card__copy>span{color:var(--noriko-red);font-size:.68rem;font-weight:800;letter-spacing:.12em}.pro-proof-card h3{margin:.45em 0 .35em;font-size:clamp(1.5rem,2.3vw,2.35rem);line-height:1}.pro-proof-card p{margin:0;color:var(--muted)}
.pro-network{background:var(--steel);color:#fff}.pro-network h2,.pro-network h3{color:#fff}.pro-network .pro-section-head .lede{color:rgba(255,255,255,.7)}.pro-network__hub{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.pro-network__centre{grid-column:1/-1;min-height:170px;display:grid;place-content:center;justify-items:center;border:1px solid rgba(255,255,255,.16);border-radius:24px;background:radial-gradient(circle at 50% 100%,rgba(235,25,36,.3),transparent 50%),#111b1f}.pro-network__centre img{width:190px;filter:brightness(0) invert(1)}.pro-network__centre span{margin-top:5px;color:rgba(255,255,255,.62);font-size:.75rem;letter-spacing:.13em;text-transform:uppercase}.pro-network__hub article{position:relative;min-height:220px;padding:30px;border:1px solid rgba(255,255,255,.15);border-radius:20px;background:rgba(255,255,255,.045)}.pro-network__hub article::before{content:"";position:absolute;top:-17px;left:50%;width:1px;height:17px;background:rgba(255,255,255,.3)}.pro-network__hub article strong{display:block;font-size:1.45rem}.pro-network__hub article span{display:block;margin:9px 0 20px;color:#ff9c88;font-size:.76rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em}.pro-network__hub article p{margin:0;color:rgba(255,255,255,.68)}
.pro-range__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:250px;gap:14px}.pro-range-card{position:relative;overflow:hidden;border-radius:20px;color:#fff}.pro-range-card--wide{grid-column:span 2}.pro-range-card img{width:100%;height:100%;object-fit:cover;transition:transform .55s ease}.pro-range-card::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 36%,rgba(7,12,12,.86))}.pro-range-card span{position:absolute;z-index:1;inset:auto 22px 20px;display:grid}.pro-range-card strong{font-size:1.45rem}.pro-range-card small{color:rgba(255,255,255,.74)}.pro-range-card:hover img{transform:scale(1.035)}
.pro-supply{background:#f0f3f2}.pro-supply h2{max-width:850px}.pro-supply__steps{list-style:none;padding:0;margin:var(--space-7) 0 0;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));border-top:1px solid var(--line)}.pro-supply__steps li{position:relative;padding:34px 28px 8px 0}.pro-supply__steps li::before{content:"";position:absolute;top:-5px;left:0;width:9px;height:9px;border-radius:50%;background:var(--noriko-red)}.pro-supply__steps span{color:var(--noriko-red);font-size:.7rem;font-weight:800}.pro-supply__steps strong{display:block;margin:13px 0 8px;font-size:1.25rem}.pro-supply__steps p{max-width:275px;margin:0;color:var(--muted)}.pro-cta{background:linear-gradient(130deg,#111a1e,#25373e)}.pro-cta h2{color:#fff}.pro-cta__grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(380px,.8fr);gap:clamp(40px,8vw,120px);align-items:center}.pro-cta__grid>div .lede{color:rgba(255,255,255,.7)}.pro-cta .catalogue-request{margin:0}
@media(max-width:900px){.pro-hero__grid{min-height:0;grid-template-columns:1fr}.pro-hero__visual{width:min(100%,560px);justify-self:start;transform:none}.pro-hero__visual img{max-height:500px;object-position:center 36%}.pro-section-head,.pro-cta__grid{grid-template-columns:1fr;gap:24px}.pro-proof__grid{grid-template-columns:1fr}.pro-network__hub{grid-template-columns:1fr}.pro-network__hub article::before{display:none}.pro-range__grid{grid-template-columns:repeat(2,minmax(0,1fr))}.pro-supply__steps{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.pro-hero__copy h1{font-size:clamp(2.75rem,14vw,4.25rem)}.pro-hero__actions .btn{width:100%;justify-content:center}.pro-hero__visual figcaption{display:grid}.pro-hero__visual figcaption span{max-width:none;text-align:left}.pro-ecosystem .container{display:block}.pro-ecosystem p{margin-bottom:14px;max-width:none}.pro-proof-card{grid-template-columns:1fr}.pro-proof-card__mark{min-height:180px}.pro-proof-card__mark svg{position:absolute;right:24px;top:34px}.pro-network__hub article{min-height:0}.pro-range__grid{grid-template-columns:1fr;grid-auto-rows:230px}.pro-range-card--wide{grid-column:auto}.pro-supply__steps{grid-template-columns:1fr}.pro-supply__steps li{border-bottom:1px solid var(--line)}}

/* Product-to-recipe connections */
.pdp-recipes{margin-top:clamp(24px,4vw,42px);padding-top:22px;border-top:1px solid var(--line)}
.pdp-recipes>.eyebrow{margin:0 0 12px}
.pdp-recipes__list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.pdp-recipe-link{min-width:0;display:grid;grid-template-columns:92px 1fr;align-items:center;gap:13px;overflow:hidden;border:1px solid var(--line);border-radius:14px;background:#fff;color:var(--ink);transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}
.pdp-recipe-link:hover{transform:translateY(-2px);border-color:rgba(235,16,22,.45);box-shadow:0 12px 26px rgba(17,23,22,.08)}
.pdp-recipe-link img{width:92px;height:74px;object-fit:cover}
.pdp-recipe-link>span{min-width:0;display:grid;gap:5px;padding:8px 10px 8px 0}
.pdp-recipe-link strong{font-size:.86rem;line-height:1.08}
.pdp-recipe-link small{color:var(--noriko-red);font-size:.7rem;font-weight:700}
.pdp-recipe-link small b{font-size:.9rem}
@media(max-width:620px){.pdp-recipes__list{grid-template-columns:1fr}.pdp-recipe-link{grid-template-columns:108px 1fr}.pdp-recipe-link img{width:108px;height:82px}}

/* Recipe collection invitation */
.recipe-invite{margin-top:clamp(34px,6vw,76px);display:grid;grid-template-columns:minmax(0,.8fr) minmax(420px,1.2fr);overflow:hidden;border-radius:26px;background:#111a19;color:#fff}
.recipe-invite__copy{position:relative;padding:clamp(30px,5vw,64px);background:radial-gradient(circle at 85% 12%,rgba(255,190,35,.24),transparent 34%),linear-gradient(145deg,#10221e,#131817)}
.recipe-invite__copy .eyebrow{color:#ffcf45}
.recipe-invite__copy h3{margin:.35em 0 .4em;font-size:clamp(2.2rem,4vw,4.25rem);line-height:.92;letter-spacing:-.045em}
.recipe-invite__copy>p:not(.eyebrow){max-width:520px;color:rgba(255,255,255,.72)}
.recipe-invite__count{display:flex;align-items:center;gap:14px;margin-top:clamp(28px,5vw,58px)}
.recipe-invite__count strong{font-size:clamp(3rem,5vw,5.5rem);line-height:.75;color:#ffcf45}
.recipe-invite__count span{font-size:.72rem;font-weight:750;letter-spacing:.1em;line-height:1.35;text-transform:uppercase;color:rgba(255,255,255,.68)}
.recipe-invite__form{padding:clamp(30px,5vw,58px);display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-content:center;gap:18px;background:#eef2f0;color:var(--ink)}
.recipe-invite__form label{display:grid;gap:7px}
.recipe-invite__form label>span{font-size:.73rem;font-weight:750;letter-spacing:.08em;text-transform:uppercase}
.recipe-invite__form label small{color:var(--muted);font-weight:500;text-transform:none;letter-spacing:0}
.recipe-invite__form input,.recipe-invite__form textarea{width:100%;padding:13px 14px;border:1px solid var(--line-strong);border-radius:10px;background:#fff;color:var(--ink);font:inherit}
.recipe-invite__form textarea{min-height:116px;resize:vertical}
.recipe-invite__form input:focus,.recipe-invite__form textarea:focus{outline:3px solid rgba(234,29,38,.16);border-color:var(--noriko-red)}
.recipe-invite__wide{grid-column:1/-1}
.recipe-invite__submit{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.recipe-invite__submit p{min-height:1.4em;margin:0;color:var(--muted);font-size:.82rem}
@media(max-width:900px){.recipe-invite{grid-template-columns:1fr}.recipe-invite__form{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:620px){.recipe-invite__form{grid-template-columns:1fr}.recipe-invite__wide{grid-column:auto}.recipe-invite__submit .btn{width:100%;justify-content:center}}
