:root{
  /* App column width. A comfortable phone width by default; widened on tablet /
     landscape screens (below) so pages use the space instead of a narrow strip. */
  --app-w: 430px;
  /* ── TYPE SCALE (7 steps) ───────────────────────────────────────────────────
     These MUST match the scale in CLAUDE.md: 14 / 16 / 18 / 22 / 26 / 32 / 40.
     They previously declared a different scale (12/13/15/16/20/24/32) that
     nothing used, so the tokens described one design and the app rendered
     another. Use these instead of hardcoding a px value. */
  --text-caption: 14px;     /* timestamps, fine print */
  --text-small: 14px;       /* muted helper text */
  --text-body: 16px;        /* default body text */
  --text-body-lg: 18px;     /* inputs, emphasized body */
  --text-title: 22px;       /* card titles, section headers */
  --text-display: 26px;     /* screen titles */
  --text-hero: 32px;        /* big moments */
  --text-mega: 40px;        /* the largest step */
  /* ── RADIUS SCALE (4 steps) ─────────────────────────────────────────────── */
  --radius-sm: 12px;        /* chips, small controls */
  --radius-md: 16px;        /* cards, buttons, inputs */
  --radius-lg: 22px;        /* sheets, big cards */
  --radius-full: 999px;     /* pills, avatars */
  /* ── SPACING SCALE (4px base rhythm) ────────────────────────────────────── */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;
  --space-6: 32px;
  /* ── COLORS, calmer, more Apple/Airbnb restrained ──────────────────────── */
  --obsidian: #F7F7F7;
  --obsidian-2: #FFFFFF;
  --glass: rgba(0,0,0,0.03);
  --glass-strong: rgba(0,0,0,0.055);
  --gold: #C8963C;
  --gold-bright: #A87A28;
  --gold-btn:#D8B26B;
  --gold-btn-bright:#F2D9A6;
  --cyan: #1B9E8E;
  --coral: #E0593C;
  --ink: #222222;
  --ash: #717171;
  --line: rgba(0,0,0,0.08);
  --line-strong: rgba(0,0,0,0.14);
  --bar-bg: rgba(255,255,255,0.92);
  --shadow-card: 0 1px 2px rgba(0,0,0,0.08);
  --shadow-float: 0 6px 20px rgba(0,0,0,0.12);
}
body.dark-mode{
  --obsidian:#0B0B0F;
  --obsidian-2:#16161C;
  --glass: rgba(255,255,255,0.055);
  --glass-strong: rgba(255,255,255,0.10);
  --gold:#D8B26B;
  --gold-bright:#F2D9A6;
  --cyan:#5FE3D3;
  --coral:#FF8F70;
  --ink:#F5F3EE;
  --ash:#9A97A3;
  --line: rgba(255,255,255,0.09);
  --line-strong: rgba(255,255,255,0.16);
  --bar-bg: rgba(11,11,15,0.86);
  --shadow-card: 0 1px 3px rgba(0,0,0,0.4);
  --shadow-float: 0 8px 30px rgba(0,0,0,0.5);
}

/* ── ACCESSIBILITY: visible focus ring for keyboard navigation ──────────────── */
:focus-visible{ outline:2px solid var(--gold); outline-offset:2px; border-radius:4px; }
button:focus:not(:focus-visible), input:focus:not(:focus-visible){ outline:none; }
*{box-sizing:border-box;}
/* Form controls don't inherit the page font by default, which is why almost
   every button/input rule used to re-declare the full Sora stack. Declaring
   it once here means new controls get the right font automatically. */
button, input, select, textarea{ font-family:inherit; }
html,body{margin:0;padding:0;}
body{
  font-family:'Sora', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
  background:var(--obsidian);
  color:var(--ink);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  letter-spacing:-0.01em;
}
.phone{
  max-width:var(--app-w);
  margin:0 auto;
  min-height:100vh;
  background:
    radial-gradient(900px 500px at 15% -10%, rgba(216,178,107,0.16), transparent 60%),
    radial-gradient(700px 500px at 110% 10%, rgba(95,227,211,0.10), transparent 55%),
    var(--obsidian);
  position:relative;
  overflow:hidden;
  box-shadow:0 0 80px rgba(0,0,0,0.6);
}
.screen{
  display:none;
  min-height:100vh;
  padding:24px 20px 96px;
  animation:fadeIn .4s ease;
  position:relative;
}
.screen.active{display:block;}
/* Screens whose actions float in a fixed footer need extra scroll room, or the
   footer masks the last of the content (the Americas cuisine chips were being
   covered). The footer is ~111px tall and sits 24px off the bottom. */
.screen-actions{
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  width:100%; max-width:var(--app-w); z-index:50;
  padding:14px 20px calc(14px + env(safe-area-inset-bottom, 0px));
  background:var(--obsidian-2); border-top:1px solid var(--line);
}
.screen.has-actions{ padding-bottom:180px; }
/* Ingredient groups on the dish preview, quiet aisle headings, hairline
   separated, so the list scans without competing with the ingredients. */
.ing-group + .ing-group{ margin-top:18px; padding-top:14px; border-top:1px solid var(--line); }
.ing-group-label{
  font-size:14px; font-weight:700; color:var(--ash);
  letter-spacing:0.02em; margin-bottom:8px;
}
.ing-group-count{
  font-weight:600; color:var(--ash); opacity:0.65; margin-left:4px;
}
/* Airbnb category strip: icon above a small label, greyed until active, with a
   short underline marking the current one. Replaces two large filled pills,
   which shouted far louder than a filter row should. */
.ab-cat-row{
  display:flex; gap:28px; align-items:flex-end;
  border-bottom:1px solid var(--line);
  margin-bottom:14px; overflow-x:auto; scrollbar-width:none;
}
.ab-cat-row::-webkit-scrollbar{ display:none; }
/* Explore top tabs: clean text underline tabs (reference style), icons hidden. */
.ab-cat{
  display:flex; flex-direction:row; align-items:flex-end;
  background:none; border:none; padding:2px 2px 12px; cursor:pointer;
  color:var(--ash); opacity:0.85; white-space:nowrap;
  border-bottom:3px solid transparent; margin-bottom:-1px;
  transition:color .15s ease, opacity .15s ease, border-color .15s ease;
}
.ab-cat svg{ display:none; }
.ab-cat span{ font-size:18px; font-weight:600; }
.ab-cat.selected{ color:var(--ink); opacity:1; border-bottom-color:var(--gold-btn); }
.ab-cat.selected span{ font-weight:700; }
/* Photo credits list, a quiet reference page, not a browsing surface. */
.credit-row{
  display:flex; gap:14px; align-items:center; padding:14px 2px;
  border-bottom:1px solid var(--line);
}
.credit-row:last-child{ border-bottom:none; }
.credit-thumb{
  width:52px; height:52px; border-radius:14px; flex-shrink:0; overflow:hidden;
  background:var(--glass); display:flex; align-items:center; justify-content:center;
  font-size:24px;
}
.credit-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
.credit-text{ flex:1; min-width:0; }
.credit-dish{ font-size:16px; font-weight:600; color:var(--ink); }
.credit-meta{ font-size:14px; color:var(--ash); margin-top:2px; }
.credit-link{
  font-size:14px; color:var(--ash); text-decoration:underline;
  text-underline-offset:3px; display:inline-block; margin-top:3px;
}
/* Pack progress on the cooking screen, under the step progress bar. */
.cook-pack-progress{
  text-align:center; margin:10px 0 0;
  font-size:14px; font-weight:600; color:var(--ash);
}
/* "Dish 2 of 4" on the finish screen while working through a holiday pack. */
.pack-progress-pill{
  display:inline-block; margin:0 0 8px;
  padding:6px 14px; border-radius:var(--radius-full);
  background:var(--glass-strong); border:1px solid var(--line);
  font-size:14px; font-weight:600; color:var(--ash);
}
@keyframes fadeIn{from{opacity:0; transform:translateY(10px);} to{opacity:1; transform:translateY(0);}}
/* ── SKELETON LOADERS ──────────────────────────────────────────────────────── */
@keyframes shimmer{ 0%{background-position:-400px 0;} 100%{background-position:400px 0;} }
.skeleton{
  background:linear-gradient(90deg, var(--glass) 25%, var(--glass-strong) 50%, var(--glass) 75%);
  background-size:800px 100%; animation:shimmer 1.4s linear infinite; border-radius:16px;
}
.skel-card{ display:flex; gap:12px; padding:12px 0; align-items:center; }
.skel-thumb{ width:58px; height:58px; border-radius:16px; flex-shrink:0; }
.skel-lines{ flex:1; display:flex; flex-direction:column; gap:8px; }
.skel-line{ height:12px; border-radius:16px; }
.skel-line.short{ width:45%; }
.skel-line.med{ width:70%; }
.skel-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:2px; }
.skel-tile{ aspect-ratio:1/1; border-radius:16px; }
/* ── BEGINNER SAFETY & CONFIDENCE ──────────────────────────────────────────── */
.safety-callout{
  display:flex; align-items:flex-start; gap:10px; padding:10px 0 10px 12px;
  border-left:3px solid var(--coral); margin:12px 0 0;
  font-size:14px; line-height:1.5; color:var(--ash);
}
.safety-callout svg{ flex-shrink:0; margin-top:1px; }
.safety-callout.grownup{ background:none; border-color:rgba(88,86,214,0.45); }
.beginner-tip{
  display:flex; align-items:flex-start; gap:8px; padding:10px 12px; border-radius:16px;
  background:rgba(95,227,211,0.08); border:1px solid rgba(95,227,211,0.25); margin:8px 0;
  font-size:16px; line-height:1.5; color:var(--ink);
}
.technique-link{
  color:var(--cyan); text-decoration:underline; text-underline-offset:2px; cursor:pointer; font-weight:600;
}
/* Ingredient wiki links: deliberately quieter than technique links so a long
   ingredient list doesn't turn into a wall of colour. A dotted underline in the
   secondary ink reads as "there's more here" without shouting. */
.ingredient-link{
  color:var(--ink); cursor:pointer;
  text-decoration:underline; text-decoration-style:dotted;
  text-decoration-color:var(--ash); text-underline-offset:3px;
}
.ing-wiki-sub{
  margin-top:16px; padding:12px 14px; border-radius:14px;
  background:var(--glass); font-size:14px; line-height:1.5; color:var(--ink);
}
.ing-wiki-sub-label{ display:block; font-weight:600; color:var(--ash); margin-bottom:2px; }
.ing-wiki-usedin{ margin-top:18px; }
.ing-wiki-usedin-label{
  font-size:14px; font-weight:700; color:var(--ash);
  text-transform:uppercase; letter-spacing:0.04em; margin-bottom:10px;
}
.ing-wiki-chips{ display:flex; flex-wrap:wrap; gap:8px; }
.ing-wiki-chip{
  padding:8px 14px; border-radius:var(--radius-full);
  background:var(--glass); border:1px solid var(--line);
  color:var(--ink); font-size:14px; font-weight:500; cursor:pointer;
  font-family:inherit;
}
.ing-wiki-chip:hover{ border-color:var(--line-strong); }
/* "About this dish" wiki-article blocks, quiet labels, generous line height. */
.about-block{ margin-bottom:22px; }
.about-block:last-child{ margin-bottom:0; }
.about-label{
  font-size:14px; font-weight:700; color:var(--ash);
  text-transform:uppercase; letter-spacing:0.04em; margin-bottom:8px;
}
.encourage-banner{
  text-align:center; padding:14px 4px; margin:12px 0;
  font-size:16px; font-weight:600; color:var(--ash);
}
.toggle-switch{
  width:48px; height:28px; border-radius:var(--radius-full); background:var(--line-strong); position:relative;
  flex-shrink:0; cursor:pointer; transition:background .2s ease;
}
.toggle-switch::after{
  content:''; position:absolute; top:3px; left:3px; width:22px; height:22px; border-radius:50%;
  background:#fff; transition:transform .2s cubic-bezier(.4,0,.2,1); box-shadow:0 1px 3px rgba(0,0,0,0.3);
}
.toggle-switch.on{ background:var(--gold-btn); }
.toggle-switch.on::after{ transform:translateX(20px); }
.follow-btn{
  flex-shrink:0; padding:8px 18px; border-radius:var(--radius-full); border:none; cursor:pointer;
  background:var(--gold-btn); color:#1A1306; font-size:16px; font-weight:700;
  transition:all .15s ease;
}
.follow-btn.following{
  background:var(--glass-strong); color:var(--ink); border:1px solid var(--line-strong);
}
.welcome-dot{
  width:8px; height:8px; border-radius:50%; background:var(--line-strong); transition:all .25s ease;
}
.welcome-dot.active{ background:var(--gold-btn); width:24px; border-radius:var(--radius-full); }

h1,h2,h3{margin:0; letter-spacing:-0.01em; font-weight:600;}
.eyebrow{
  
  font-size:14px;
  letter-spacing:0.14em;
  text-transform:uppercase;
  color:var(--cyan);
  margin-bottom:7px;
  display:block;
}
p{line-height:1.55; margin:0;}
.muted{color:var(--ash);}

/* ---------- Buttons & chips ---------- */
.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  
  font-weight:600; font-size:16px;
  padding:15px 20px; border-radius:var(--radius-full); border:none; cursor:pointer;
  width:100%; letter-spacing:-0.01em;
  transition:transform .15s cubic-bezier(.4,0,.2,1), background .15s ease, opacity .15s ease;
}
.btn:active, .chip:active, .back-btn:active, .icon-btn-sm:active,
.shopping-check:active, .mic-btn:active, .timer-btn:active, .bottom-tab:active,
.cal-meal-pick:active, .shopping-item:active, .recipe-card:active,
.settings-row:active, .mode-option:active{
  transform:scale(0.97); opacity:0.9;
}
.chip, .back-btn, .shopping-check, .shopping-item, .recipe-card,
.settings-row, .mode-option{
  transition:transform .12s ease, background .12s ease, opacity .12s ease;
}
/* Small circular/icon buttons get a tighter press */
.back-btn:active, .icon-btn-sm:active, .mic-btn:active{ transform:scale(0.90); }
/* Inputs and selectors should not visually "press" */
input:active, textarea:active, select:active{ transform:none; opacity:1; }
.btn-primary{background:var(--gold-btn); color:#1A1306; box-shadow:0 3px 10px rgba(0,0,0,0.12);}
.btn-primary:active{transform:scale(0.98);}
.btn-primary.btn-disabled, .btn-primary:disabled{background:var(--glass-strong); color:var(--ash); box-shadow:none; cursor:default;}
.btn-shine{ position:relative; overflow:hidden; animation:btnGlowPulse 2.4s ease-in-out infinite; }
.btn-shine::after{
  content:''; position:absolute; top:0; left:-60%; width:45%; height:100%;
  background:linear-gradient(115deg, transparent, rgba(255,255,255,0.75), transparent);
  transform:skewX(-22deg);
  animation:shineSweep 3.4s ease-in-out infinite;
}
.btn-shine:disabled::after, .btn-shine:disabled{ animation:none; }
@keyframes shineSweep{
  0%{left:-60%;}
  28%{left:130%;}
  100%{left:130%;}
}
@keyframes btnGlowPulse{
  0%,100%{box-shadow:0 3px 10px rgba(0,0,0,0.12);}
  50%{box-shadow:0 5px 16px rgba(0,0,0,0.16);}
}
.btn-spin-icon{
  display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px;
  border-radius:50%; border:1.5px dashed rgba(26,19,6,0.55); margin-right:6px;
  animation:hubSpin 1.8s linear infinite; flex-shrink:0;
}
.btn-spin-core{
  width:6px; height:6px; border-radius:50%; background:#1A1306;
}

/* start-cooking transition: hat jumps, then "drives away" off-screen */
.start-transition{
  position:fixed; inset:0; max-width:var(--app-w); margin:0 auto; z-index:95;
  background:rgba(10,10,13,0.82); backdrop-filter:blur(3px);
  opacity:0; pointer-events:none; transition:opacity .15s ease; overflow:hidden;
}
.start-transition.show{opacity:1; pointer-events:auto;}
.st-hat-icon{
  position:absolute; top:50%; left:-15%; width:0; height:0; opacity:0;
  transform:translateY(-50%);
}
.st-hat-icon.st-walk{
  width:96px; height:96px; opacity:1;
  filter:drop-shadow(0 14px 16px rgba(0,0,0,0.5));
  animation: stWalkAcross 1.6s cubic-bezier(.4,0,.3,1) forwards;
}
@keyframes stWalkAcross{
  0%{   left:-12%; transform:translateY(-50%) translateY(0px) rotate(-6deg) scale(0.7); opacity:0;}
  8%{   opacity:1;}
  15%{  left:8%;   transform:translateY(-50%) translateY(-22px) rotate(8deg) scale(1.05);}
  28%{  left:26%;  transform:translateY(-50%) translateY(0px) rotate(-5deg) scale(1);}
  40%{  left:42%;  transform:translateY(-50%) translateY(-20px) rotate(8deg) scale(1);}
  53%{  left:58%;  transform:translateY(-50%) translateY(0px) rotate(-5deg) scale(1);}
  66%{  left:74%;  transform:translateY(-50%) translateY(-18px) rotate(8deg) scale(1);}
  80%{  left:90%;  transform:translateY(-50%) translateY(0px) rotate(-4deg) scale(0.95);}
  100%{ left:112%; transform:translateY(-50%) translateY(-8px) rotate(4deg) scale(0.85); opacity:0.5;}
}
.btn-ghost{background:var(--glass); border:1.5px solid var(--line-strong); color:var(--ink); backdrop-filter:blur(10px);}
.btn-ghost.selected{background:var(--gold-btn); color:#1A1306; border-color:transparent;}
.btn-row{display:flex; gap:10px;}
.underline-tabs{
  display:flex; gap:24px; border-bottom:1px solid var(--line); padding:0 2px;
}
.parallel-banner{
  padding:8px 16px 0; display:flex; flex-direction:column; gap:6px;
}
.parallel-chip{
  display:flex; align-items:center; gap:10px; padding:10px 12px;
  background:var(--glass-strong); border:1px solid var(--line); border-radius:16px;
  font-size:16px; cursor:pointer; transition:background .15s ease;
}
.parallel-chip:active{ background:var(--line); }
.parallel-chip.ready{ border-color:rgba(52,199,89,0.5); background:rgba(52,199,89,0.12); }
.parallel-chip-time{ font-size:16px; color:var(--gold-btn); font-weight:700; }
.parallel-chip-time.ready{ color:#34C759; }
/* Spelled-out prep detail for beginners, sits between the step text and the
   "Ready when" cue, a touch muted so the main instruction stays the hero. */
.step-detail{
  font-size:16px; line-height:1.55; margin:10px 0 0; color:var(--ash);
}
.step-card.current .step-detail{ font-size:17px; }
/* "Plan ahead" callout on the dish page, soaks, marinades, proving. Warm gold
   so it reads as helpful heads-up, not an error. */
.makeahead-callout{
  display:flex; gap:10px; align-items:flex-start;
  margin:14px 0 2px; padding:12px 14px;
  background:rgba(216,178,107,0.12); border:1px solid rgba(216,178,107,0.4);
  border-radius:14px; font-size:15px; line-height:1.45; color:var(--ink);
}
.makeahead-ic{ font-size:18px; line-height:1.2; flex-shrink:0; }
.step-cue{
  margin-top:16px; padding:14px 0 0; border-top:1px solid var(--line);
}
.step-cue-row{ display:flex; gap:8px; align-items:flex-start; }
.step-cue-icon{ font-size:14px; flex-shrink:0; line-height:1.5; opacity:0.7; }
/* Inline and muted, an uppercase bold block here read as a second headline
   and pulled attention away from the step itself. */
.step-cue-label{
  font-weight:600; color:var(--ash); margin-right:6px;
}
.step-cue p{ font-size:14px; line-height:1.5; margin:0; color:var(--ash); }
.step-why-btn{
  background:none; border:none; padding:8px 0 0; margin:0; cursor:pointer;
  color:var(--ash); font-size:14px; font-weight:600; text-decoration:underline;
  
 border-radius:var(--radius-full);}
.step-why{ max-height:0; overflow:hidden; transition:max-height .3s ease; }
.step-why.open{ max-height:240px; }
.step-why p{
  font-size:14px; line-height:1.55; margin:8px 0 0; color:var(--ash);
  padding-top:8px; border-top:1px solid var(--line);
}
.profile-stat-line{
  display:flex; align-items:center; flex-wrap:wrap; gap:8px;
  font-size:16px; color:var(--ash); font-weight:500;
}
.profile-stat-line b{ color:var(--ink); font-weight:700; }
.profile-stat-dot{ opacity:0.4; }
.social-auth-btn{
  position:relative; display:flex; align-items:center; justify-content:center;
  width:100%; padding:15px 48px; margin-bottom:12px;
  background:var(--obsidian-2); border:1px solid var(--ink); border-radius:var(--radius-full);
  color:var(--ink); font-size:16px; font-weight:600; cursor:pointer;
  
}
.social-auth-btn:active{ background:var(--glass); }
.social-auth-logo{
  position:absolute; left:20px; top:50%; transform:translateY(-50%);
  width:20px; height:20px;
}
.section-row .section-arrow{
  width:34px; height:34px; border-radius:50%; flex-shrink:0;
  background:var(--glass); border:none; cursor:pointer;
  display:flex; align-items:center; justify-content:center; color:var(--ink);
}
.section-row .section-arrow:active{ background:var(--glass-strong); }
/* Airbnb-style listing card: image on top, text beneath, no container box */
/* Airbnb listing card: photo first, text beneath, no container box or shadow.
   The photo does the selling; the type stays quiet underneath it. */
.ab-card{ cursor:pointer; }
.ab-card-img{
  width:100%; aspect-ratio:1/1; border-radius:16px; overflow:hidden;
  background:var(--glass); position:relative; margin-bottom:10px;
  /* Soft shimmer placeholder shown until the photo paints over it */
  background-image:linear-gradient(100deg, var(--glass) 30%, rgba(180,180,180,0.16) 50%, var(--glass) 70%);
  background-size:200% 100%; animation:cardShimmer 1.3s ease-in-out infinite;
}
@keyframes cardShimmer{ 0%{ background-position:200% 0; } 100%{ background-position:-200% 0; } }
@media (prefers-reduced-motion: reduce){ .ab-card-img{ animation:none; } }
.ab-card-img img{
  width:100%; height:100%; object-fit:cover; display:block; position:relative;
  animation:cardImgFade .35s ease both;
}
@keyframes cardImgFade{ from{ opacity:0; } to{ opacity:1; } }
.ab-card-fallback{
  width:100%; height:100%; display:flex; align-items:center; justify-content:center;
  font-size:40px;
  background:linear-gradient(140deg, rgba(216,178,107,0.22), rgba(95,227,211,0.10)), var(--obsidian-2);
}
.ab-card-lock{
  position:absolute; top:8px; left:8px; font-size:15px;
  background:rgba(0,0,0,0.55); border-radius:50%; width:26px; height:26px;
  display:flex; align-items:center; justify-content:center; backdrop-filter:blur(4px);
}
/* The heart sits on the image, top-right, Airbnb's save affordance. */
.ab-heart{
  position:absolute; top:6px; right:6px; width:34px; height:34px;
  background:none; border:none; padding:0; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,0.3));
}
.ab-heart:active{ transform:scale(0.88); }
/* Airbnb clamps its titles to one line, but a dish name carries more meaning
   than a listing name does, so allow two before truncating. */
.ab-card-title{
  font-size:16px; font-weight:600; color:var(--ink); line-height:1.3;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden;
}
.ab-card-meta{ font-size:14px; color:var(--ash); margin-top:1px; }
.ab-card-figure{ font-size:14px; color:var(--ink); margin-top:3px; }
.ab-card-figure b{ font-weight:600; }
.ab-card-flag{ font-size:14px; color:var(--coral); margin-top:3px; }
.ab-card.locked .ab-card-img{ opacity:0.55; }
/* Two-up browsing grid. Airbnb uses one big column on phones, but a recipe
   library is browsed far more quickly, so two keeps the photos large without
   turning 130 dishes into an endless scroll. */
.ab-card-grid{
  display:grid;
  /* minmax(0,1fr), not 1fr: a plain 1fr keeps an "auto" minimum, so a long
     dish name stretches its column and the two stop being equal. */
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:20px 14px; margin-top:12px;
}
.ab-profile-card{
  display:flex; gap:20px; align-items:stretch;
  background:var(--obsidian-2); border-radius:22px; padding:24px 20px;
  box-shadow:var(--shadow-card); margin-bottom:20px;
}
.ab-profile-left{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; }
.ab-profile-left .profile-avatar{
  width:92px; height:92px; font-size:40px; display:flex; align-items:center;
  justify-content:center; margin-bottom:12px; cursor:pointer;
}
.ab-profile-name{ font-size:26px; font-weight:700; letter-spacing:-0.02em; color:var(--ink); line-height:1.15; }
.ab-profile-sub{ font-size:16px; color:var(--ash); margin-top:2px; }
.ab-profile-view-link{ margin-top:8px; background:none; border:none; padding:0; cursor:pointer; font-family:inherit; font-size:14px; font-weight:600; color:var(--cyan); }
.ab-profile-stats{ flex:1; display:flex; flex-direction:column; justify-content:center; }
.ab-stat{ padding:10px 0; border-bottom:1px solid var(--line); }
.ab-stat.last{ border-bottom:none; }
.ab-stat b{ display:block; font-size:22px; font-weight:700; color:var(--ink); line-height:1.1; }
.ab-stat span{ font-size:16px; color:var(--ink); }
/* Airbnb settings rows: icon, label, chevron, generous height */
.ab-row{
  display:flex; align-items:center; gap:16px; width:100%;
  padding:20px 2px; background:none; border:none; border-bottom:1px solid var(--line);
  cursor:pointer; text-align:left; color:var(--ink); font-size:16px;
  
}
.ab-row:last-child{ border-bottom:none; }
.ab-row-label{ flex:1; }
/* Button labels should never break onto a second line */
.btn{ white-space:nowrap; }
.onboard-head{
  display:flex; align-items:center; gap:12px; margin-bottom:24px;
}
.onboard-head .onboard-progress-track{ flex:1; }
.onboard-head .theme-toggle-btn{
  position:static; flex-shrink:0; width:36px; height:36px;
}
.onboard-head .back-btn{ flex-shrink:0; margin:0; }
.cat-chip-row{
  display:flex; gap:10px; margin-bottom:16px; padding:2px;
}
.cat-chip{
  display:inline-flex; align-items:center; justify-content:center; gap:7px;
  flex:1; white-space:nowrap;
  padding:13px 20px; border-radius:var(--radius-full);
  background:var(--obsidian-2); border:1px solid var(--line);
  color:var(--ink); font-size:16px; font-weight:600; cursor:pointer;
  
  box-shadow:0 1px 2px rgba(0,0,0,0.05);
}
.cat-chip.selected{ background:var(--gold-btn); border-color:transparent; color:#1A1306; }
.cat-chip svg{ flex-shrink:0; }
.cuisine-group-label{
  font-size:14px; font-weight:700; color:var(--ash);
  letter-spacing:0.02em; margin:18px 0 10px;
}
.cuisine-group-label:first-child{ margin-top:4px; }
.cuisine-group-row{ display:flex; flex-wrap:wrap; gap:8px; }
.ab-tile-row{ display:flex; gap:12px; margin-bottom:12px; }
.ab-tile{
  flex:1; background:var(--obsidian-2); border:none; border-radius:20px;
  padding:20px 16px 18px; cursor:pointer; text-align:left;
  box-shadow:var(--shadow-card);
  display:flex; flex-direction:column; min-height:150px;
}
/* margin-bottom:auto pushes the title/sub to the bottom so all four tiles line
   up identically whether their subtitle is one line or two. */
.ab-tile-art{ font-size:32px; margin-bottom:auto; }
.ab-tile-title{ font-size:18px; font-weight:700; color:var(--ink); }
.ab-tile-sub{ font-size:14px; color:var(--ash); margin-top:2px; }
.ab-wide-card{
  display:flex; align-items:center; gap:16px; width:100%;
  background:var(--obsidian-2); border:none; border-radius:20px;
  padding:20px; cursor:pointer; text-align:left; margin-bottom:28px;
  box-shadow:var(--shadow-card);
  
}
.ab-wide-art{ font-size:40px; flex-shrink:0; }
.ab-wide-title{ font-size:18px; font-weight:700; color:var(--ink); }
.ab-wide-sub{ font-size:14px; color:var(--ash); margin-top:3px; }
/* ── AIRBNB-STYLE LISTING (recipe detail) ── */
.listing-topbar{
  position:absolute; top:0; left:0; right:0; z-index:20;
  display:flex; align-items:center; justify-content:space-between;
  padding:14px 16px; pointer-events:none;
}
.listing-topbar > *{ pointer-events:auto; }
.listing-icon-btn{
  width:38px; height:38px; border-radius:50%; flex-shrink:0;
  background:rgba(255,255,255,0.92); backdrop-filter:blur(8px);
  border:none; cursor:pointer; color:#222;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 2px 8px rgba(0,0,0,0.18);
}
.listing-gallery{
  display:flex; overflow-x:auto; scroll-snap-type:x mandatory;
  -webkit-overflow-scrolling:touch; scrollbar-width:none;
  aspect-ratio:4/3; background:var(--glass);
}
.listing-gallery::-webkit-scrollbar{ display:none; }
.listing-gallery-slide{
  flex:0 0 100%; scroll-snap-align:start; height:100%;
  display:flex; align-items:center; justify-content:center;
  background:var(--glass); overflow:hidden;
}
.listing-gallery-slide img{ width:100%; height:100%; object-fit:cover; display:block; }
.listing-gallery-slide .fallback-emoji{ font-size:76px; }
.listing-gallery-count{
  position:relative; margin-top:-44px; margin-right:16px; margin-bottom:22px;
  display:flex; justify-content:flex-end; pointer-events:none;
}
.listing-gallery-count span{
  background:rgba(0,0,0,0.62); color:#fff; font-size:14px; font-weight:600;
  padding:5px 11px; border-radius:var(--radius-full);
}
.listing-body{ padding:0 24px; }
.listing-title{
  font-size:32px; font-weight:700; letter-spacing:-0.02em; line-height:1.15; letter-spacing:-0.02em;
  color:var(--ink); margin:0 0 12px;
}
.listing-facts{ font-size:18px; color:var(--ink); margin:0 0 12px; }
.listing-rating-row{ display:flex; align-items:center; gap:8px; margin-bottom:20px; font-size:16px; }
.listing-rating{ font-weight:700; color:var(--ink); }
.listing-dot{ color:var(--ash); }
.listing-link{
  background:none; border:none; padding:0; cursor:pointer;
  color:var(--ink); font-size:16px; font-weight:600;
  text-decoration:underline; text-underline-offset:3px;
  
}
.listing-chip-row{ display:flex; flex-wrap:wrap; gap:10px; }
.listing-chip{
  border:1px solid var(--line-strong); border-radius:var(--radius-full);
  padding:8px 14px; font-size:14px; color:var(--ink); font-weight:500;
}
.listing-divider{ height:1px; background:var(--line); margin:36px 0; }
.listing-h2{
  font-size:22px; font-weight:700; letter-spacing:-0.01em;
  color:var(--ink); margin:0 0 20px;
}
.listing-body-text{ font-size:16px; font-weight:400; line-height:1.65; color:var(--ink); margin:0; }
.listing-outline-btn{
  display:flex; align-items:center; justify-content:center; gap:8px;
  width:100%; padding:15px; background:var(--glass); border:none;
  border-radius:16px; color:var(--ink); font-size:16px; font-weight:600;
  cursor:pointer; 
}
.listing-outline-btn:active{ background:var(--glass-strong); }
.listing-bottom-bar{
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  width:100%; max-width:var(--app-w); z-index:50;
  display:flex; align-items:center; justify-content:space-between; gap:14px;
  padding:14px 22px calc(14px + env(safe-area-inset-bottom, 0px));
  background:var(--obsidian-2); border-top:1px solid var(--line);
}
.listing-bottom-left{ flex-shrink:0; min-width:0; }
.listing-bottom-time{ font-size:18px; font-weight:700; color:var(--ink); text-decoration:underline; text-underline-offset:3px; white-space:nowrap; }
.listing-bottom-sub{ font-size:14px; color:var(--ash); margin-top:2px; white-space:nowrap; }
.listing-bottom-bar .btn-primary{ white-space:nowrap; flex-shrink:0; }
/* Cook notes */
.cook-note{ padding:18px 0; }

.cook-note-head{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.cook-note-avatar{
  width:38px; height:38px; border-radius:50%; background:var(--glass);
  display:flex; align-items:center; justify-content:center; font-size:18px; flex-shrink:0;
}
.cook-note-name{ font-size:16px; font-weight:600; color:var(--ink); }
.cook-note-date{ font-size:14px; color:var(--ash); }
.cook-note-text{ font-size:16px; line-height:1.55; color:var(--ink); margin:0; }
/* Chef bio card */
.chef-card{
  display:flex; gap:18px; align-items:stretch;
  background:var(--obsidian-2); border-radius:20px; padding:24px 20px;
  box-shadow:var(--shadow-card);
}
.chef-card-left{ flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; }
.chef-avatar{
  width:84px; height:84px; border-radius:50%; background:var(--glass);
  display:flex; align-items:center; justify-content:center; font-size:40px; margin-bottom:12px;
}
.chef-name{ font-size:22px; font-weight:700; color:var(--ink); line-height:1.15; }
.chef-title{ font-size:14px; color:var(--ash); margin-top:3px; }
.chef-stats{ flex:1; display:flex; flex-direction:column; justify-content:center; }
.chef-stat{ padding:10px 0; border-bottom:1px solid var(--line); }
.chef-stat:last-child{ border-bottom:none; }
.chef-stat b{ display:block; font-size:22px; font-weight:700; color:var(--ink); line-height:1.1; }
.chef-stat span{ font-size:14px; color:var(--ink); }
/* ── AIRBNB-STYLE SEARCH SHEET ── */
.search-sheet{
  position:fixed; inset:0; max-width:var(--app-w); margin:0 auto; z-index:300;
  background:var(--obsidian);
  display:none; flex-direction:column;
}
.search-sheet.show{ display:flex; animation:searchSheetIn .28s cubic-bezier(.2,.8,.2,1); }
@keyframes searchSheetIn{ from{ opacity:0; transform:translateY(16px); } to{ opacity:1; transform:none; } }
.search-sheet-head{
  display:flex; align-items:center; justify-content:flex-end;
  padding:16px 20px 8px; flex-shrink:0;
}
.search-sheet-close{
  width:38px; height:38px; border-radius:50%;
  background:var(--obsidian-2); border:1px solid var(--line);
  cursor:pointer; color:var(--ink);
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 1px 3px rgba(0,0,0,0.08);
}
.search-sheet-scroll{
  flex:1; overflow-y:auto; padding:8px 16px 16px;
  -webkit-overflow-scrolling:touch;
}
.search-card{
  background:var(--obsidian-2); border-radius:22px;
  padding:28px 22px; margin-bottom:18px;
  box-shadow:0 2px 10px rgba(0,0,0,0.06);
}
.search-card-title{
  font-size:26px; font-weight:700; letter-spacing:-0.02em; letter-spacing:-0.02em;
  color:var(--ink); margin:0 0 18px;
}
.search-card-sub{ font-size:16px; color:var(--ash); margin:-12px 0 18px; }
.search-field-wrap{ position:relative; margin-bottom:8px; }
.search-field-icon{
  position:absolute; left:20px; top:50%; transform:translateY(-50%);
  width:18px; height:18px; stroke:var(--ash); pointer-events:none;
}
.search-field{
  width:100%; padding:18px 20px 18px 52px;
  border-radius:16px; background:var(--obsidian-2);
  border:1px solid var(--line-strong); color:var(--ink);
  
  font-size:16px;
}
.search-field:focus{ outline:none; border-color:var(--ink); }
.search-result-row{
  display:flex; align-items:center; gap:14px; width:100%;
  padding:14px 2px; background:none; border:none; cursor:pointer;
  text-align:left; color:var(--ink);
  
}
.search-result-art{
  width:48px; height:48px; border-radius:14px; flex-shrink:0;
  background:var(--glass); display:flex; align-items:center; justify-content:center;
  font-size:22px; overflow:hidden;
}
.search-result-art img{ width:100%; height:100%; object-fit:cover; }
.search-result-name{ font-size:16px; font-weight:600; }
.search-result-meta{ font-size:14px; color:var(--ash); margin-top:2px; }
.search-sheet-foot{
  display:flex; align-items:center; justify-content:space-between;
  padding:16px 20px calc(16px + env(safe-area-inset-bottom, 0px));
  background:var(--obsidian-2); border-top:1px solid var(--line); flex-shrink:0;
}
.search-clear{
  background:none; border:none; padding:0; cursor:pointer;
  color:var(--ink); font-size:16px; font-weight:600;
  text-decoration:underline; text-underline-offset:3px;
  
}
.cook-dock{
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  max-width:var(--app-w); width:100%; z-index:40;
  background:var(--bar-bg); backdrop-filter:blur(16px);
  border-top:1px solid var(--line);
}
.cook-dock .cook-controls{
  position:static; transform:none; max-width:none; width:100%;
  background:none; backdrop-filter:none; border-top:none;
  padding:12px 18px calc(18px + env(safe-area-inset-bottom, 0px));
}
.cook-another-btn{
  display:flex; align-items:center; justify-content:center; gap:8px;
  width:calc(100% - 36px); margin:12px 18px 0; padding:13px;
  background:var(--glass); border:1px solid var(--line);
  border-radius:var(--radius-full); color:var(--ink);
  font-size:16px; font-weight:600; cursor:pointer;
  
}
.cook-another-btn:active{ background:var(--glass-strong); }
.pack-ing-row{
  display:flex; align-items:flex-start; gap:16px;
  padding:14px 0;
}
.pack-ing-left{ flex:1; min-width:0; }
.pack-ing-name{ font-size:16px; color:var(--ink); line-height:1.45; }
.pack-ing-from{ font-size:14px; color:var(--ash); margin-top:3px; }
.pack-ing-qty{
  flex-shrink:0; max-width:42%; text-align:right;
  font-size:16px; color:var(--ash); line-height:1.45;
}
/* ── Airbnb trips-style calendar timeline ── */


/* the connector line between day cards */







/* ── AIRBNB TRIPS ITINERARY (calendar) ── */
/* Big gap BETWEEN days, tight spacing WITHIN a day. */



.cal-day-header span:first-child{ font-size:22px; font-weight:700; letter-spacing:-0.01em; color:var(--ink); }
/* The stops for one day sit close together in a single card */











/* Up next banner */
.cal-up-label{ font-size:14px; font-weight:700; color:var(--ash); letter-spacing:0.02em; margin-bottom:10px; }
.cal-up-card{
  display:flex; align-items:center; gap:16px; width:100%;
  background:var(--obsidian-2); border:none; border-radius:20px;
  padding:16px; cursor:pointer; text-align:left;
  box-shadow:0 4px 18px rgba(0,0,0,0.10);
  
}
.cal-up-photo{
  width:64px; height:64px; border-radius:16px; flex-shrink:0;
  background:var(--glass); overflow:hidden;
  display:flex; align-items:center; justify-content:center; font-size:32px;
}
.cal-up-photo img{ width:100%; height:100%; object-fit:cover; }
.cal-up-name{ font-size:18px; font-weight:700; color:var(--ink); line-height:1.2; }
.cal-up-when{ font-size:14px; color:var(--ash); margin-top:3px; }
/* ── AIRBNB TRIPS TIMELINE (left rail + event cards) ── */
.cal-day-block{
  display:flex; gap:14px; position:relative;
  padding-bottom:8px;
}
/* the vertical connector line running down the rail */
.cal-day-block::before{
  content:''; position:absolute; left:19px; top:34px; bottom:-8px;
  width:1.5px; background:var(--line-strong);
}
.cal-day-block:last-child::before{ display:none; }
.cal-rail{
  flex-shrink:0; width:40px; display:flex; flex-direction:column;
  align-items:center; padding-top:2px; position:relative; z-index:1;
}
.cal-rail-weekday{ font-size:14px; font-weight:600; color:var(--ash); margin-bottom:4px; }
.cal-rail-num{
  width:34px; height:34px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  font-size:16px; font-weight:600; color:var(--ink);
  background:var(--obsidian);
}
.cal-rail-num.today{
  background:var(--gold-btn); color:#1A1306; font-weight:700;
  box-shadow:0 0 0 4px rgba(200,150,60,0.18);
}
.cal-stop-name.slot-spinning{ opacity:0.55; color:var(--gold-btn); }
.cal-day-content{ flex:1; min-width:0; padding-bottom:20px; }
.cal-day-header{
  display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;
}
.cal-day-header span:first-child{ font-size:16px; font-weight:700; color:var(--ink); }
/* stops for a day: tight gaps between same-day cards */
.cal-day-stops{ display:flex; flex-direction:column; gap:0; }
/* Flat rows + hairlines, like Airbnb Trips. Four filled cards per day, seven
   days deep, made the week read as a wall of grey blocks. */
.cal-stop{
  display:flex; align-items:center; gap:14px;
  background:none; border-radius:0; padding:14px 2px;
  border-bottom:1px solid var(--line);
  box-shadow:none; cursor:pointer;
  transition:background .15s ease;
}
.cal-stop:last-child{ border-bottom:none; }
.cal-stop:active{ background:var(--glass); }
.cal-stop-photo{
  width:56px; height:56px; border-radius:14px; flex-shrink:0;
  background:var(--glass); overflow:hidden;
  display:flex; align-items:center; justify-content:center; font-size:26px;
}
.cal-stop-photo img{ width:100%; height:100%; object-fit:cover; }
.cal-stop-photo-empty{
  font-size:26px; font-weight:300; color:var(--ash);
  border:1.5px dashed var(--line-strong); background:none;
}
.cal-stop-text{ flex:1; min-width:0; }
.cal-stop-name{ font-size:16px; font-weight:600; color:var(--ink); line-height:1.35;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cal-stop-name.muted{ font-weight:500; }
.cal-stop-meal{ font-size:14px; color:var(--ash); margin-top:2px; }
.cal-stop-empty{ box-shadow:none; background:none; }
.picker-quick-row{
  display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px;
  padding-bottom:16px; border-bottom:1px solid var(--line);
}
.picker-quick{
  display:inline-flex; align-items:center; gap:6px;
  padding:10px 14px; border-radius:var(--radius-full);
  background:var(--glass); border:1px solid var(--line);
  color:var(--ink); font-size:14px; font-weight:600; cursor:pointer;
  
}
.picker-quick:active{ background:var(--glass-strong); transform:scale(0.97); }
.cal-stop-special{ background:none; box-shadow:none; }
.cal-stop-photo-special{
  background:none; border:1.5px dashed var(--line-strong); font-size:26px;
}
/* ── Airbnb "What this place offers" list (used for the step preview) ── */
.offers-row{
  display:flex; align-items:center; gap:18px;
  padding:14px 0;
}
.offers-icon{
  width:24px; height:24px; flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
  font-size:22px; color:var(--ink);
}
.offers-icon svg{ width:24px; height:24px; stroke:var(--ink); stroke-width:1.6; }
.offers-label{
  flex:1; min-width:0;
  font-size:16px; font-weight:400; color:var(--ink); line-height:1.4;
}
.offers-meta{ flex-shrink:0; font-size:16px; color:var(--ash); }
.ing-name{
  display:inline-flex; align-items:center; gap:8px;
  flex:1; min-width:0; padding-right:12px;
  font-size:16px; color:var(--ink);
}
.ing-qty{ flex-shrink:0; font-size:16px; color:var(--ash); text-align:right; }
.ing-sub-btn{
  width:28px; height:28px; border-radius:50%; flex-shrink:0; padding:0;
  background:var(--glass); border:none; cursor:pointer; color:var(--ash);
  display:inline-flex; align-items:center; justify-content:center;
}
.ing-sub-btn svg{ width:12px; height:12px; }
.ing-sub-btn:active{ background:var(--glass-strong); color:var(--ink); }
.ing-sub-tip{
  font-size:16px; color:var(--ash); line-height:1.5;
  margin:-4px 0 10px; padding-left:2px;
}
/* ── SHOPPING LIST: clean, scannable, one text colour ── */
.shopping-cat-header{
  display:flex; align-items:center; gap:10px; width:100%;
  padding:26px 2px 10px; background:none; border:none; cursor:pointer;
  color:var(--ink); font-size:18px; font-weight:700; letter-spacing:-0.01em;
  
}
.shopping-cat-header span:first-of-type{ flex:1; text-align:left; }
.shopping-cat-count{ font-size:14px; font-weight:500; color:var(--ash); }
.shopping-cat-chevron{ transition:transform .2s ease; flex-shrink:0; }
.shopping-cat-chevron.collapsed{ transform:rotate(-90deg); }
.shopping-item{
  display:flex; align-items:center; gap:14px;
  padding:15px 2px; cursor:pointer;
}
.shopping-check{
  width:24px; height:24px; border-radius:7px; flex-shrink:0;
  border:1.5px solid var(--line-strong); background:none;
  display:flex; align-items:center; justify-content:center;
  font-size:14px; color:transparent; transition:all .15s ease;
}
.shopping-item.checked .shopping-check{
  background:var(--ink); border-color:var(--ink); color:#fff;
}
.shopping-text{ flex:1; min-width:0; }
.shopping-name{ font-size:16px; color:var(--ink); line-height:1.45; }
.shopping-item.checked .shopping-name{ color:var(--ash); text-decoration:line-through; }
.shopping-sub{ font-size:14px; color:var(--ash); margin-top:2px; }
.shopping-total{ flex-shrink:0; font-size:16px; color:var(--ash); }
.shopping-info-btn{
  width:34px; height:34px; border-radius:50%; flex-shrink:0; padding:0;
  background:none; border:none; cursor:pointer; color:var(--ash);
  display:flex; align-items:center; justify-content:center; font-size:14px;
}
.shopping-info-btn svg{ width:14px; height:14px; }
.shopping-info-btn:active{ color:var(--ink); }
.shopping-remove{
  width:34px; height:34px; flex-shrink:0; padding:0;
  background:none; border:none; cursor:pointer; color:var(--ash); font-size:14px;
}
/* Airbnb's truncate + "Show more" pattern for long copy */
.clamp-3{
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical;
  overflow:hidden;
}
.show-more-btn{
  display:block; width:100%; margin-top:14px; padding:14px;
  background:var(--glass); border:none; border-radius:12px;
  color:var(--ink); font-size:16px; font-weight:600; cursor:pointer;
  
}
.show-more-btn:active{ background:var(--glass-strong); }
/* Airbnb underlines its inline text links with a clear offset */
.text-link{
  color:var(--ink); font-weight:600; text-decoration:underline;
  text-underline-offset:3px; cursor:pointer; background:none; border:none; padding:0;
  
}
.log-month{
  font-size:14px; font-weight:700; color:var(--ash);
  letter-spacing:0.02em; margin:26px 0 12px;
}
.log-month:first-child{ margin-top:4px; }
/* Cards in a list get consistent breathing room from one rule, not inline margins */
.recipe-card + .recipe-card{ margin-top:10px; }
/* Pull-to-refresh indicator */
.ptr-indicator{
  height:0; overflow:hidden; display:flex; align-items:center; justify-content:center;
  transition:height .22s ease;
}
.ptr-spinner{
  width:22px; height:22px; border-radius:50%;
  border:2px solid var(--line-strong); border-top-color:var(--gold-btn);
  opacity:0.4; transition:opacity .2s ease;
}
.ptr-indicator.ready .ptr-spinner{ opacity:1; }
.ptr-indicator.refreshing .ptr-spinner{ opacity:1; animation:ptrSpin .7s linear infinite; }
@keyframes ptrSpin{ to{ transform:rotate(360deg); } }
.prep-progress{ height:4px; background:var(--line); border-radius:4px; overflow:hidden; }
.prep-progress-fill{ height:100%; width:0%; background:var(--gold-btn); border-radius:4px; transition:width .3s ease; }
.prep-item{
  display:flex; align-items:center; gap:12px; padding:14px 4px;
  cursor:pointer;
}

.prep-item input{ width:20px; height:20px; flex-shrink:0; accent-color:var(--gold-btn); cursor:pointer; }
.prep-item input:checked + .prep-item-name{ opacity:0.45; text-decoration:line-through; }
.prep-item-name{ flex:1; font-size:16px; transition:opacity .15s ease; }
.prep-item-qty{ font-size:16px; color:var(--ash); flex-shrink:0; }
.rescue-btn{
  width:46px; height:46px; border-radius:50%; flex-shrink:0;
  background:var(--glass); border:1px solid var(--line);
  color:var(--ash); cursor:pointer; display:flex; align-items:center; justify-content:center;
}
.rescue-btn svg{ width:20px; height:20px; }
.rescue-btn:active{ background:var(--glass-strong); color:var(--ink); }
.rescue-row{
  display:flex; align-items:center; gap:14px; width:100%;
  padding:16px 4px; background:none; border:none;
  cursor:pointer; color:var(--ink); font-size:16px; font-weight:500;
  
}

.rescue-row:active{ opacity:0.6; }
.rescue-back{
  background:none; border:none; color:var(--ash); font-size:16px; cursor:pointer; padding:0 0 8px;
  
}
.rescue-fix{ padding:0 0 16px; margin-bottom:16px; border-bottom:1px solid var(--line); }
.rescue-avoid{ padding:0; }
.rescue-fix-label{
  font-size:14px; font-weight:700; letter-spacing:0.04em; text-transform:uppercase;
  color:var(--ash); margin-bottom:8px;
}
.rescue-fix p, .rescue-avoid p{ font-size:16px; line-height:1.6; margin:0; color:var(--ink); }
.dish-switch-btn{
  display:flex; align-items:center; gap:5px; padding:8px 12px;
  background:var(--glass); border:1px solid var(--line); border-radius:var(--radius-full);
  color:var(--ink); font-size:14px; font-weight:600; cursor:pointer;
  
}
.dish-switch-btn:active{ background:var(--glass-strong); }
.dish-switch-row{
  display:flex; align-items:center; gap:14px; width:100%;
  padding:12px 4px; background:none; border:none;
  cursor:pointer; text-align:left; color:var(--ink);
  
}
.dish-switch-row:last-child{ border-bottom:none; }
.dish-switch-row:active{ opacity:0.6; }
.dish-switch-row:disabled{ opacity:0.35; cursor:default; }
.dish-switch-row.is-current{ opacity:1; }
.dish-switch-emoji{ font-size:26px; flex-shrink:0; }
.dish-switch-meta{ flex:1; display:flex; flex-direction:column; gap:3px; min-width:0; }
.dish-switch-name{ font-size:16px; font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dish-switch-status{ font-size:16px; color:var(--ash); }
.dish-switch-status.timing{ color:var(--gold-btn); }
.dish-switch-status.ready{ color:#34C759; font-weight:600; }
.dish-switch-status.current{ color:var(--ink); }
.dish-switch-status.done{ color:var(--ash); }
.cook-another-btn{
  display:flex; align-items:center; justify-content:center; gap:8px;
  width:calc(100% - 32px); margin:10px 16px 0; padding:13px;
  background:var(--glass); border:1px solid var(--line);
  border-radius:var(--radius-full); color:var(--ink); font-size:16px; font-weight:600; cursor:pointer;
  
}
.cook-another-btn:active{ background:var(--glass-strong); }
.underline-tab{
  background:none; border:none; padding:12px 0; cursor:pointer;
  font-size:18px; font-weight:600; color:var(--ash);
  position:relative; transition:color .15s ease;
}
.underline-tab.active{ color:var(--ink); font-weight:700; }
.underline-tab.active::after{
  content:''; position:absolute; left:0; right:0; bottom:-1px; height:3px;
  background:var(--gold-btn); border-radius:3px;
}
.cal-header-btn{
  display:inline-flex; align-items:center; gap:5px;
  height:34px; padding:0 12px; border-radius:var(--radius-full);
  background:var(--glass); border:1px solid var(--line);
  color:var(--ink); font-size:16px; font-weight:600;
  
  cursor:pointer; transition:background .15s ease, transform .1s ease;
}
.cal-header-btn:active{ transform:scale(0.95); background:var(--glass-strong); }
.cal-header-btn svg{ flex-shrink:0; }
.btn-row .btn{width:auto; flex:1;}

.chip{
  display:inline-block; padding:9px 14px; margin:0 8px 8px 0;
  border-radius:var(--radius-full); border:1.5px solid var(--line-strong);
  font-size:16px; font-weight:600; cursor:pointer; background:var(--glass); color:var(--ink);
  transition:all .15s ease;
}
.chip.selected{background:var(--gold-btn); color:#1A1306; border-color:transparent;}
.chip.warn{border-color:rgba(255,143,112,0.45); color:var(--coral);}
.chip.warn.selected{background:linear-gradient(135deg,#FFB199, var(--coral)); border-color:transparent; color:#2A0F08;}
.chip.chip-locked{opacity:0.5; cursor:default;}
.chip.chip-locked.selected{opacity:1;}

/* ---------- Top bar ---------- */
.topbar{display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:20px;}
.back-btn{font-size:22px; background:var(--glass); border:1px solid var(--line); border-radius:50%; width:36px; height:36px; cursor:pointer; color:var(--ink);}
.theme-toggle-btn{
  position:absolute; top:24px; right:20px; z-index:5;
  width:36px; height:36px; border-radius:50%; background:var(--glass); border:1px solid var(--line);
  display:flex; align-items:center; justify-content:center; cursor:pointer; color:var(--ink); padding:0;
}
.theme-toggle-btn svg{width:18px; height:18px;}
.dots{display:flex; gap:6px;}
.dot{width:7px; height:7px; border-radius:50%; background:var(--line-strong);}
.dot.on{background:var(--gold-btn);}
.onboard-progress-track{
  flex:1; height:4px; border-radius:var(--radius-full); background:var(--glass-strong); overflow:hidden; margin-left:12px;
}
.onboard-progress-fill{
  height:100%; border-radius:var(--radius-full); background:var(--gold-btn);
  transition:width .55s cubic-bezier(.2,.8,.2,1);
}

/* ---------- Onboarding ---------- */
.brandmark{
  font-weight:600; font-size:32px; font-style:normal;
  margin-bottom:4px; color:var(--ink); letter-spacing:-0.02em;
}
.tagline{color:var(--ash); font-size:16px; margin-bottom:30px; letter-spacing:0.01em;}
.home-greeting-headline{
  font-weight:600; font-size:22px; color:var(--ink); line-height:1.4;
}
.home-greeting-headline .sous-prefix{
  font-weight:600; font-style:italic; font-size:1.15em;
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
}
.section-label{font-weight:700; font-size:18px; letter-spacing:-0.01em; letter-spacing:-0.01em; color:var(--ink); margin:32px 0 14px;}

/* ---------- Home ---------- */
.special-card{
  border-radius:22px; margin-bottom:24px; position:relative; overflow:hidden;
  border:1px solid var(--line-strong);
  min-height:230px; display:flex; flex-direction:column; justify-content:flex-end;
  padding:20px;
}
.special-card .bg-img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:0;}
.special-card .bg-overlay{
  position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg, rgba(10,10,13,0.15) 0%, rgba(10,10,13,0.55) 55%, rgba(10,10,13,0.94) 100%);
}
.special-card .content{position:relative; z-index:2;}
.special-card h2{font-size:26px; margin-bottom:8px; color:var(--ink); font-weight:600;}
.special-card p{color:#D8D4C8; font-size:16px; margin-bottom:16px;}
.special-card .btn-primary{width:auto; padding:12px 20px; font-size:16px;}

.meal-tabs{display:flex; gap:4px; margin-bottom:20px; overflow-x:auto; background:var(--glass); border:1px solid var(--line); border-radius:16px; padding:4px;}
.meal-tab{
  flex:1; text-align:center; padding:10px 6px; border-radius:var(--radius-full);
  font-size:16px; font-weight:600; border:1px solid transparent; cursor:pointer; white-space:nowrap;
  background:transparent; color:var(--ash); transition:all .15s ease;
}
.meal-tab.active{background:var(--glass-strong); color:var(--gold-btn); border-color:rgba(216,178,107,0.4);}
.meal-tab:active{transform:scale(0.97);}

.wheel-wrap{display:flex; flex-direction:column; align-items:center; margin:12px 0 28px;}
.wheel-outer{position:relative; width:270px; height:270px; margin-bottom:24px;}
.wheel-glow{
  position:absolute; inset:-16px; border-radius:50%;
  background:radial-gradient(circle, rgba(216,178,107,0.16), rgba(216,178,107,0.04) 55%, transparent 72%);
  z-index:0;
}
.wheel-svg{position:relative; z-index:1; display:block; filter:drop-shadow(0 10px 28px rgba(0,0,0,0.4));}
.wheel-seg-label{
  font-weight:700; fill:#fff;
  paint-order:stroke; stroke:rgba(0,0,0,0.35); stroke-width:0.4px;
}
.wheel-hub{
  position:absolute; top:50%; left:50%; width:66px; height:66px; margin:-33px;
  border-radius:50%; background:conic-gradient(from 0deg, #3a3a42, #1a1a20, #3a3a42, #1a1a20, #3a3a42, #1a1a20, #3a3a42);
  border:2px solid var(--gold); display:flex; align-items:center; justify-content:center; z-index:3;
  box-shadow:0 4px 16px rgba(0,0,0,0.5), inset 0 2px 4px rgba(255,255,255,0.1);
}
.wheel-hub-ring{
  position:absolute; width:46px; height:46px; border-radius:50%;
  border:1.5px solid rgba(216,178,107,0.5);
}
.wheel-hub-core{
  width:28px; height:28px; border-radius:50%;
  background:radial-gradient(circle at 35% 30%, var(--gold-bright), var(--gold-btn));
  box-shadow:0 0 12px rgba(242,217,166,0.6), inset 0 -2px 4px rgba(120,90,40,0.5);
  animation:hubPulse 2.4s ease-in-out infinite;
}
@keyframes hubSpin{ from{transform:rotate(0deg);} to{transform:rotate(360deg);} }
@keyframes hubPulse{ 0%,100%{transform:scale(1); opacity:1;} 50%{transform:scale(1.08); opacity:0.9;} }
.wheel-stopper{
  position:absolute; top:-18px; left:50%; transform:translateX(-50%); z-index:4;
  filter:drop-shadow(0 3px 6px rgba(0,0,0,0.6)) drop-shadow(0 0 8px rgba(242,217,166,0.7));
  transform-origin:50% 20%;
}
.wheel-stopper.flick{ animation:pointerFlick 0.12s cubic-bezier(.3,.7,.4,1); }
@keyframes pointerFlick{
  0%{ transform:translateX(-50%) rotate(0deg); }
  40%{ transform:translateX(-50%) rotate(14deg); }
  100%{ transform:translateX(-50%) rotate(0deg); }
}

/* recipe cards grid */
/* Airbnb separates list items with space and a hairline, not a filled box.
   A column of grey blocks reads heavy; the divider carries the separation. */
.recipe-card{
  display:flex; gap:14px; align-items:center; padding:14px 2px;
  border:none; border-bottom:1px solid var(--line); margin-bottom:0;
  cursor:pointer; background:none;
  transition:background .15s ease;
}
.recipe-card:last-child{ border-bottom:none; }
.recipe-card:active{ background:var(--glass); }
.recipe-thumb{
  width:58px; height:58px; border-radius:16px; flex-shrink:0; overflow:hidden;
  background:var(--obsidian-2); border:1px solid var(--line); position:relative;
}
.recipe-thumb img{width:100%; height:100%; object-fit:cover; display:block;}
.recipe-card .meta{flex:1;}
.recipe-card-time{flex-shrink:0; font-size:14px; color:var(--ash); text-align:right; padding-left:6px; white-space:nowrap;}
.cook-post-card{
  background:var(--glass); border:1px solid var(--line); border-radius:22px; overflow:hidden; margin-bottom:16px;
}
.cook-post-header{display:flex; align-items:center; gap:10px; padding:12px;}
.cook-post-photo{width:100%; display:block; max-height:340px; object-fit:cover; cursor:pointer;}
.cook-post-footer{display:flex; align-items:center; justify-content:space-between; padding:10px 12px;}
.cook-post-rating{font-size:16px; font-weight:600; color:var(--ink);}
.cook-post-share-btn{
  display:flex; align-items:center; gap:6px; background:var(--glass-strong); border:1px solid var(--line-strong);
  border-radius:var(--radius-full); padding:7px 14px; font-size:16px; font-weight:600; color:var(--ink); cursor:pointer;
  margin-left:auto;
}
.recipe-card .meta h3{font-size:16px; margin-bottom:3px; color:var(--ink);}
.recipe-card .meta span{font-size:14px; color:var(--ash);}
.recipe-card.locked{opacity:0.55;}
.lock-tag{font-size:14px;}
.allergy-flag{
  display:inline-flex; align-items:center; gap:5px; font-size:14px; font-weight:700; color:var(--coral);
  margin-top:4px;
}
.level-pill{
  display:inline-flex; align-items:center; gap:5px;
  font-size:14px; font-weight:600; color:var(--ash);
  white-space:nowrap; flex-shrink:0;
}
.level-pill-dot{
  width:7px; height:7px; border-radius:50%; flex-shrink:0;
}
.recipe-meta-row{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:1px;
}
.recipe-meta-row > span:first-child{ color:var(--ash); }

/* ---------- Recipe detail ---------- */
.hero-thumb{
  width:100%; height:190px; border-radius:22px; overflow:hidden; margin-bottom:20px;
  position:relative; border:1px solid var(--line-strong);
}
.hero-thumb img{width:100%; height:100%; object-fit:cover; display:block;}
.hero-thumb .hero-fallback{
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center; font-size:88px;
  background:linear-gradient(140deg, rgba(216,178,107,0.24), rgba(95,227,211,0.10)), var(--obsidian-2);
}
.recipe-time-est{
  display:inline-flex; align-items:center; gap:5px; font-size:16px; font-weight:700; color:var(--cyan);
  background:var(--glass); border:1px solid var(--line-strong); border-radius:var(--radius-full); padding:5px 12px; margin-bottom:16px;
}
.servings-stepper{
  display:flex; align-items:center; gap:12px; margin-bottom:8px;
}
.servings-stepper button{
  width:34px; height:34px; border-radius:16px; background:var(--glass-strong); border:1.5px solid var(--line-strong);
  color:var(--ink); font-size:22px; font-weight:700; cursor:pointer; line-height:1;
}
.servings-stepper #servings-count{
  font-size:22px; font-weight:700; color:var(--gold-btn); min-width:20px; text-align:center;
}
.allergy-warn-triangle{display:inline-flex; vertical-align:-3px; margin-left:6px; cursor:default;}
.warn-banner{
  background:rgba(255,143,112,0.10); border:1.5px solid rgba(255,143,112,0.4); color:var(--coral);
  border-radius:16px; padding:12px 14px; font-size:16px; font-weight:600; margin-bottom:16px;
}
.ingredient-row{display:flex; justify-content:space-between; align-items:flex-start; gap:12px; padding:14px 0;}
.settings-group{
  margin:0 20px 8px;
}
.settings-group .settings-row{ border-bottom:1px solid var(--line); }
.settings-group .settings-row:last-child{ border-bottom:none; }
.settings-row{
  display:flex; align-items:center; gap:14px; padding:18px 20px;
  border-bottom:1px solid var(--line); min-height:66px;
}
/* Let the middle text column shrink so a long label's toggle can't get shoved
   off the right edge (min-width defaults to auto on flex items). */
.settings-row > div{ min-width:0; }
.settings-row:last-child{ border-bottom:none; }
.settings-row-icon{
  width:36px; height:36px; border-radius:16px; flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
}
/* Label sits left and never wraps; the muted description takes the remaining
   space, right-aligned, like an Airbnb/iOS settings row. Previously the label
   had flex:1 while the description had no flex rules, so the two fought for
   width and "Sound & Voice" broke across three lines. */
.settings-row-label{
  flex:0 1 auto; min-width:0; font-size:16px; color:var(--ink); font-weight:500;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Right-aligned VALUE on a menu row (e.g. "Appearance … Dark"), only when the
   muted text is a DIRECT child of the row, so it doesn't right-align the
   description text nested under toggle labels. */
.settings-row > .muted{ flex:1; min-width:0; text-align:right; font-size:14px; }

/* Legal page readability: the global reset zeroes <p> margins, so the policy
   sections ran together in one dense block. Space them out and give each its
   bold lead-in its own line so it reads as a scannable list of sections. */
#screen-legal p:not(.muted){ margin:0 0 18px; }
#screen-legal p:not(.muted) > strong:first-child{ display:block; margin-bottom:3px; }
/* margin-left:auto keeps the chevron pinned right even on rows that have no
   description to fill the gap (e.g. "Sign in / Create account"). */
.settings-row-chevron{ color:var(--ash); font-size:22px; line-height:1; flex-shrink:0; margin-left:auto; }
.step-preview-row{display:flex; align-items:center; gap:12px; padding:14px 0;}

.step-preview-num{
  width:22px; height:22px; border-radius:50%; background:var(--glass-strong); border:1px solid var(--line-strong);
  display:flex; align-items:center; justify-content:center; font-size:14px; font-weight:700; color:var(--ash); flex-shrink:0;
}
.step-preview-icon{
  width:34px; height:34px; border-radius:16px; background:var(--glass-strong); border:1px solid var(--line);
  display:flex; align-items:center; justify-content:center; flex-shrink:0; font-size:22px;
}
.step-preview-icon svg{width:18px; height:18px; stroke:var(--ink);}
.step-preview-text{flex:1; min-width:0;}
.step-preview-title{font-size:16px; font-weight:600; color:var(--ink);}
.step-preview-time{font-size:14px; margin-top:1px;}

.ing-sub-tip{line-height:1.4;}

/* video preview card */
.video-card{
  position:relative; border-radius:22px; overflow:hidden; height:150px; margin:16px 0 6px;
  border:1px solid var(--line-strong); cursor:pointer;
}
.video-card img{width:100%; height:100%; object-fit:cover; filter:brightness(0.55) saturate(1.05);}
.video-card .video-overlay{position:absolute; inset:0; display:flex; flex-direction:column; justify-content:space-between; padding:14px;}
.play-btn{
  width:50px; height:50px; border-radius:50%; background:rgba(244,241,234,0.14); border:1.5px solid rgba(244,241,234,0.5);
  backdrop-filter:blur(6px); display:flex; align-items:center; justify-content:center; align-self:center; margin:auto;
}
.play-btn svg{width:18px; height:18px; fill:var(--ink);}
.video-tag{font-size:14px; color:var(--ink); background:rgba(0,0,0,0.4); padding:4px 9px; border-radius:var(--radius-full); align-self:flex-end;}

/* ---------- Cooking mode ---------- */
.cookmode{background:transparent; min-height:100vh; padding:0;}
.screen.cookmode.active{display:flex; flex-direction:column; height:100vh; max-height:100vh; overflow:hidden;}
.cook-top{display:flex; justify-content:space-between; align-items:center; padding:20px 18px 10px;}
.cook-top span#cook-title{font-weight:600; font-size:16px;}
.progress-track{height:3px; background:var(--obsidian-2); border-radius:16px; margin:0 18px 28px; position:relative;}
.progress-fill{height:3px; background:linear-gradient(90deg, var(--gold), var(--cyan)); border-radius:16px; transition:width .4s ease;}
.progress-hat{
  position:absolute; top:50%; width:30px; height:30px; left:0%;
  transform:translate(-50%, -50%); transition:left 1.4s cubic-bezier(.25,.1,.25,1);
  filter:drop-shadow(0 2px 4px rgba(0,0,0,0.4));
  z-index:3;
}
.progress-hat.hopping{ animation: progressHatHop 1.4s cubic-bezier(.25,.1,.25,1); }
@keyframes progressHatHop{
  0%{ transform:translate(-50%,-50%) translateY(0); }
  50%{ transform:translate(-50%,-50%) translateY(-6px); }
  100%{ transform:translate(-50%,-50%) translateY(0); }
}
.progress-ticks{position:absolute; inset:0;}
.progress-tick{
  position:absolute; top:50%; width:1.5px; height:9px; background:rgba(244,241,234,0.3);
  transform:translate(-50%,-50%);
}
.progress-tick.done{background:rgba(216,178,107,0.7);}
.finish-flag{
  position:absolute; top:50%; right:-13px; width:18px; height:20px;
  transform:translateY(-58%);
}
.flag-cloth{
  animation: flagWave 0.7s ease-in-out infinite; transform-origin:0% 50%;
}
@keyframes flagWave{
  0%{transform:skewY(0deg) scaleX(1) translateX(0);}
  25%{transform:skewY(-16deg) scaleX(0.88) translateX(0.5px);}
  50%{transform:skewY(4deg) scaleX(1.05) translateX(-0.5px);}
  75%{transform:skewY(-20deg) scaleX(0.85) translateX(0.8px);}
  100%{transform:skewY(0deg) scaleX(1) translateX(0);}
}

.step-rail{
  position:relative; padding:14px 16px calc(28px + var(--cook-dock-h, 100px));
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:18px;
  flex:1; min-height:0; overflow:hidden;
  /* NO scrolling while cooking, messy hands can't touch the screen. The active
     step is scaled by fitCookStepToScreen() to fit whole, and centred in the area
     ABOVE the fixed dock (padding-bottom reserves the dock's measured height). */
}
/* Show only the active step so it can be centred and sized to fill the window;
   no dimmed neighbours to invite scrolling. */
.step-rail .step-card:not(.current){ display:none; }
.step-card{
  width:100%; border-radius:22px; padding:22px 24px; background:var(--glass);
  border:1px solid transparent; opacity:0.35; transform:scale(0.92) translateY(6px);
  transition:opacity .5s cubic-bezier(.2,.8,.2,1), transform .5s cubic-bezier(.2,.8,.2,1),
             background .4s ease, border-color .4s ease, padding .4s ease;
  text-align:left; backdrop-filter:blur(6px);
}
/* The active step rises into place and its contents stagger in behind it. */
.step-card.current > *{ animation:stepContentIn .5s cubic-bezier(.2,.8,.2,1) backwards; }
.step-card.current > *:nth-child(1){ animation-delay:.05s; }
.step-card.current > *:nth-child(2){ animation-delay:.12s; }
.step-card.current > *:nth-child(3){ animation-delay:.19s; }
.step-card.current > *:nth-child(4){ animation-delay:.26s; }
@keyframes stepContentIn{
  from{ opacity:0; transform:translateY(10px); }
  to{ opacity:1; transform:translateY(0); }
}
.step-card.done{opacity:0.28; transform:scale(0.84);}
/* A clean white card lifted by a soft shadow, the listing-card surface,
   rather than the gold/teal gradient box it used to be. */
.step-card.current{
  opacity:1; transform:scale(1) translateY(0);
  background:var(--obsidian-2);
  border-color:var(--line);
  box-shadow:0 8px 28px rgba(0,0,0,0.10);
  padding:30px 26px;
}
.step-card .step-num{
  font-size:14px; color:var(--ash); letter-spacing:0.08em;
}
.step-card h3{font-size:16px; margin:8px 0 8px; color:var(--ink); font-weight:600; line-height:1.3;}
/* The instruction is the hero of this screen, give the title and body the
   weight, and let the supporting cue/safety text sit clearly below them.
   Title reads from across the kitchen, so it climbs to the top of the scale. */
.step-card.current h3{font-size:32px; line-height:1.2; font-weight:700;}
.step-card p{font-size:16px; color:var(--ink); opacity:0.7; margin:0; line-height:1.5;}
.step-card.current p{font-size:22px; color:var(--ink); opacity:1; line-height:1.5;}
.step-card.current .step-cue p{ font-size:14px; }
.step-icon-row{display:flex; align-items:center; gap:16px; margin-top:12px; margin-bottom:4px;}
.step-icon{
  width:44px; height:44px; flex-shrink:0; border-radius:16px; background:var(--glass-strong); border:1px solid var(--line);
  display:flex; align-items:center; justify-content:center;
}
/* At counter distance the icon is load-bearing: the heat/cut/mix/wait shape
   should read on its own. Bigger tile, warm gold-lit edge on the active step. */
.step-card.current .step-icon{
  width:80px; height:80px; border-radius:22px;
  background:linear-gradient(160deg, rgba(216,178,107,0.14), rgba(216,178,107,0.05));
  border:1px solid rgba(216,178,107,0.35); box-shadow:0 4px 14px rgba(0,0,0,0.10);
}
.step-icon svg{width:20px; height:20px; stroke:var(--ash);}
.step-card.current .step-icon svg{width:38px; height:38px; stroke:var(--ink);}

/* ── EMOJI STEP ICONS ──────────────────────────────────────────────────────
   Each icon animates on the ACTIVE step only. Inactive steps = small static SVG.
─────────────────────────────────────────────────────────────────────────── */
.step-emoji-icon{
  font-size:24px; line-height:1; display:flex; align-items:center; justify-content:center;
  width:100%; height:100%; will-change:transform;
  border-radius:inherit;
}
/* On the active step the emoji is a signal read from across the room, so it
   fills its (now larger) warm tile. Inactive steps stay small and quiet. */
.step-card.current .step-emoji-icon{ font-size:40px; }

/* ── CUT 🔪, diagonal chop onto a board, two quick strokes ── */
.anim-chop{ animation: emojiChop 0.48s cubic-bezier(.4,0,.2,1) infinite; }
@keyframes emojiChop{
  /* lift, quick fall, brief pause on the board, lift again */
  0%   { transform:translate(-2px,-6px) rotate(-14deg); }
  40%  { transform:translate(1px,3px)   rotate(-3deg); }
  60%  { transform:translate(1px,3px)   rotate(-3deg); }
  100% { transform:translate(-2px,-6px) rotate(-14deg); }
}

/* ── WHISK 🥚, rapid zigzag beating ── */
.anim-whisk{ animation: emojiWhisk 0.32s ease-in-out infinite alternate; }
@keyframes emojiWhisk{
  0%  { transform:rotate(-14deg) translateX(-3px); }
  100%{ transform:rotate(14deg)  translateX(3px); }
}

/* ── HEAT 🫕 / FRY, gentle rocking sizzle with a bounce ── */
.anim-pan{ animation: emojiPan 1.6s ease-in-out infinite; }
@keyframes emojiPan{
  /* forward toss and settle back, a pan flip, not a jump */
  0%,100%{ transform:rotate(0deg) translateY(0); }
  35%    { transform:rotate(-9deg) translateY(-4px); }
  60%    { transform:rotate(4deg)  translateY(0); }
}

/* ── BOIL 🫕, rolling bubble surge, lifts then drops ── */
.anim-boil{ animation: emojiBoil 1.1s ease-in-out infinite; }
@keyframes emojiBoil{
  /* small, continuous surface movement, simmering, not erupting */
  0%,100%{ transform:translateY(0)    scale(1); }
  30%    { transform:translateY(-4px) scale(1.04); }
  65%    { transform:translateY(-1px) scale(1.01); }
}

/* ── STIR 🥄, smooth clockwise full revolution ── */
.anim-stir{ animation: emojiStir 2.2s cubic-bezier(.45,0,.55,1) infinite; }
@keyframes emojiStir{
  /* a gentle folding arc, the way you actually move a spoon through a pot */
  0%,100%{ transform:translateX(-5px) rotate(-12deg); }
  50%    { transform:translateX(5px)  rotate(12deg); }
}

/* ── MIX 🥣, rocking bowl, splashes at the extreme ── */
.anim-mix{ animation: emojiMix 1.5s ease-in-out infinite; }
@keyframes emojiMix{
  0%,100%{ transform:rotate(-8deg) translateX(-2px); }
  50%    { transform:rotate(8deg)  translateX(2px); }
}

/* ── SEASON 🧂, tilt-shake, sprinkle, upright ── */
.anim-shake{ animation: emojiShake 1.8s ease-in-out infinite; }
@keyframes emojiShake{
  /* tilt to pour, two small shakes, back upright */
  0%,100%{ transform:rotate(0deg)   translateY(0); }
  25%    { transform:rotate(-18deg) translateY(-3px); }
  40%    { transform:rotate(-18deg) translateY(-3px) translateX(-1.5px); }
  55%    { transform:rotate(-18deg) translateY(-3px) translateX(1.5px); }
  75%    { transform:rotate(-6deg)  translateY(-1px); }
}

/* ── GARNISH 🌿, tumbling fall from above with a bounce landing ── */
.anim-fall{ animation: emojiFall 2.4s cubic-bezier(.22,.61,.36,1) infinite; }
@keyframes emojiFall{
  /* drifts down, settles, holds, like scattering herbs */
  0%   { transform:translateY(-14px) rotate(-14deg); opacity:0; }
  25%  { opacity:1; }
  70%  { transform:translateY(1px)   rotate(4deg);  opacity:1; }
  100% { transform:translateY(0)     rotate(0deg);  opacity:0.9; }
}

/* ── PLATE 🍽️, graceful slow rise and settle with a glow pulse ── */
.anim-settle{ animation: emojiSettle 3.2s ease-in-out infinite; }
@keyframes emojiSettle{
  /* barely moves, a plated dish is finished, so it just breathes */
  0%,100%{ transform:scale(1);    filter:brightness(1); }
  50%    { transform:scale(1.04); filter:brightness(1.1); }
}

/* ── REST ⏳, hourglass flips when sand runs out ── */
.anim-tick{ animation: emojiTick 2s steps(1) infinite; }
@keyframes emojiTick{
  0%   { transform:rotate(0deg)   scale(1);    }
  45%  { transform:rotate(0deg)   scale(1.08); }
  50%  { transform:rotate(180deg) scale(1.08); }
  55%  { transform:rotate(180deg) scale(1);    }
  100% { transform:rotate(180deg) scale(1);    }
}

/* ── CHILLI 🌶️, fiery fast zigzag, gets faster then explosive bounce ── */
.anim-wiggle{ animation: emojiWiggle 0.35s ease-in-out infinite, emojiWiggleBig 2.1s ease-in-out infinite; }
@keyframes emojiWiggle{
  0%,100%{ transform:rotate(0deg);  }
  25%    { transform:rotate(-14deg); }
  75%    { transform:rotate(14deg);  }
}
@keyframes emojiWiggleBig{
  0%,80%,100%{ transform:scale(1);    }
  90%         { transform:scale(1.25) rotate(20deg); }
}

/* ── FRIDGE DOOR ANIMATION ────────────────────────────────────────────────── */
#fridge-overlay{
  position:fixed; inset:0; z-index:300; display:none;
  background:radial-gradient(circle at 50% 40%, #1a1a20, var(--obsidian));
  align-items:center; justify-content:center; flex-direction:column;
}
#fridge-overlay.active{ display:flex; }
.fridge-body{
  width:240px; height:340px; position:relative;
  background:linear-gradient(160deg,#eef0f2,#c4c8cc);
  border-radius:16px; border:2px solid #b0b4b8;
  box-shadow:0 16px 60px rgba(0,0,0,0.6), inset 0 2px 4px rgba(255,255,255,0.5);
  overflow:hidden;
}
.fridge-door{
  position:absolute; inset:0; z-index:3;
  background:linear-gradient(160deg,#f6f7f8,#d2d6da);
  border-radius:16px;
  transform-origin:left center;
  animation:fridgeDoorOpen 1.3s cubic-bezier(.34,.9,.3,1) forwards;
  box-shadow:inset 0 2px 6px rgba(255,255,255,0.6);
  backface-visibility:hidden;
}
.fridge-door::after{
  /* door handle on the RIGHT edge (opposite the left hinge) */
  content:''; position:absolute; right:12px; top:50%; transform:translateY(-50%);
  width:6px; height:90px; border-radius:16px;
  background:linear-gradient(90deg,#8a9096,#c8ccd0);
  box-shadow:-1px 1px 3px rgba(0,0,0,0.3);
}
.fridge-inside{
  position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg,#0d1b2e,#0a1420);
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:14px;
  padding:24px 16px;
}
.fridge-shelf-row{ display:flex; gap:16px; align-items:center; justify-content:center; opacity:0; animation:fridgeItemsIn .4s ease forwards; }
.fridge-shelf-row:nth-child(1){ animation-delay:.7s; }
.fridge-shelf-row:nth-child(3){ animation-delay:.85s; }
.fridge-shelf-row:nth-child(5){ animation-delay:1s; }
.fridge-shelf{ width:100%; height:3px; background:linear-gradient(90deg,transparent,#2a4a6f,transparent); border-radius:2px; }
.fridge-item{ font-size:32px; filter:drop-shadow(0 2px 4px rgba(0,0,0,0.4)); }
@keyframes fridgeItemsIn{ from{opacity:0; transform:translateY(6px);} to{opacity:1; transform:translateY(0);} }
@keyframes fridgeDoorOpen{
  0%  { transform:perspective(1100px) rotateY(0deg); box-shadow:inset 0 2px 6px rgba(255,255,255,0.6); }
  15% { transform:perspective(1100px) rotateY(-8deg); }
  55% { transform:perspective(1100px) rotateY(-88deg); box-shadow:inset 0 2px 6px rgba(255,255,255,0.6), -20px 0 40px rgba(0,0,0,0.4); }
  80% { transform:perspective(1100px) rotateY(-108deg); }
  100%{ transform:perspective(1100px) rotateY(-115deg); opacity:0; }
}
.fridge-light{
  position:absolute; inset:0; z-index:2; border-radius:16px;
  background:radial-gradient(circle at 50% 45%, rgba(255,248,220,0.35), transparent 65%);
  opacity:0; animation:fridgeLight 1.3s ease forwards;
}
@keyframes fridgeLight{ 0%,45%{opacity:0;} 60%{opacity:1;} 100%{opacity:0.85;} }
/* ── ROULETTE FULL-SCREEN OVERLAY ──────────────────────────────────────── */
#roulette-fullscreen{
  position:fixed; inset:0; z-index:250; background:var(--obsidian);
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  opacity:0; pointer-events:none; transition:opacity .3s ease;
}
#roulette-fullscreen.active{ opacity:1; pointer-events:auto; }
#roulette-fullscreen-inner{
  transform:scale(0.6); transition:transform .5s cubic-bezier(.34,1.56,.64,1);
}
#roulette-fullscreen.active #roulette-fullscreen-inner{ transform:scale(1.55); }
#roulette-fullscreen-label{
  color:var(--ash); font-size:16px; font-weight:600; 
  margin-top:60px; letter-spacing:.05em; opacity:0; transition:opacity .3s .3s ease;
}
#roulette-fullscreen.active #roulette-fullscreen-label{ opacity:1; }
/* ── INSTAGRAM-STYLE COMMUNITY POSTS ────────────────────────────────────── */
.ig-post{
  border-bottom:1px solid var(--line); margin-bottom:0; padding-bottom:0; background:var(--obsidian-2);
}
.ig-post-header{
  display:flex; align-items:center; gap:10px; padding:10px 14px;
}
.ig-post-avatar{
  width:34px; height:34px; border-radius:50%; background:var(--gold-btn);
  display:flex; align-items:center; justify-content:center; font-size:16px; flex-shrink:0;
}
.ig-post-photo{
  width:100%; display:block; aspect-ratio:1/1; object-fit:cover; cursor:pointer;
}
.ig-post-actions{
  display:flex; align-items:center; gap:14px; padding:10px 14px 4px;
}
.ig-action-btn{
  background:none; border:none; cursor:pointer; display:flex; align-items:center; gap:5px;
  font-size:16px; font-weight:600; color:var(--ink); padding:0;
}
.ig-action-btn svg{ width:22px; height:22px; stroke:var(--ink); }
.ig-action-btn.liked svg{ stroke:#FF3B30; fill:#FF3B30; }
.ig-post-caption{
  padding:4px 14px 12px; font-size:16px; line-height:1.5;
}
.ig-post-caption strong{ font-weight:700; margin-right:6px; }
.ig-post-comments{
  padding:0 14px 10px; font-size:16px; color:var(--ash); cursor:pointer;
}
.timer-wrap{display:flex; flex-direction:column; align-items:center; justify-content:center; margin-top:8px; width:100%;}
.timer-ring-box{position:relative; width:min(38vw, 128px); height:min(38vw, 128px); margin:0 auto;}
.timer-ring-box svg{width:100%; height:100%; display:block; transform:rotate(-90deg);}
.timer-ring-bg{fill:none; stroke:var(--line-strong); stroke-width:6;}
/* Solid progress ring: steady, no breathing (just a soft constant glow). */
.timer-ring-fg{fill:none; stroke:var(--cyan); stroke-width:6; stroke-linecap:round; transition:stroke-dashoffset 1s linear; filter:drop-shadow(0 0 4px rgba(95,227,211,0.5));}
/* A separate "breathing ring" around the solid ring, gently scaling in and out. */
.timer-ring-box::after{
  content:''; position:absolute; inset:-7px; border-radius:50%;
  border:2px solid rgba(95,227,211,0.55); animation:timerBreathe 3s ease-in-out infinite; pointer-events:none;
}
@keyframes timerBreathe{
  0%,100%{ transform:scale(0.97); opacity:0.35; }
  50%{ transform:scale(1.05); opacity:0.7; }
}
@media (prefers-reduced-motion: reduce){
  .timer-ring-box::after{ animation:none; }
}
/* The countdown is the second thing read from across the kitchen, so the
   digits sit near the top of the scale alongside the step title. */
.timer-digits{
  position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  font-size:clamp(22px, 6.8vw, 27px); color:var(--ink); font-weight:700; letter-spacing:-0.5px;
}
.timer-controls{display:flex; gap:8px; margin-top:12px; justify-content:center; width:100%;}
.timer-btn{
  background:var(--glass-strong); border:1px solid var(--line-strong); color:var(--ink);
  border-radius:16px; padding:8px 14px; font-size:16px; font-weight:700; cursor:pointer;
}

.cook-controls{
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  max-width:var(--app-w); width:100%; background:var(--bar-bg); backdrop-filter:blur(16px);
  border-top:1px solid var(--line); padding:14px 18px 24px;
  display:flex; align-items:center; gap:12px;
}
.mic-btn{
  position:relative; width:58px; height:58px; border-radius:50%; flex-shrink:0;
  background:var(--obsidian-2); border:2px solid var(--cyan); cursor:pointer;
  display:flex; align-items:center; justify-content:center;
}
.mic-btn svg{width:23px; height:23px; stroke:var(--cyan); fill:none;}
.mic-btn.listening{background:var(--cyan); border-color:var(--cyan);}
.mic-btn.listening svg{stroke:#08221D;}
.mic-ring{
  position:absolute; inset:-8px; border-radius:50%; border:2px solid var(--cyan); opacity:0;
}
.mic-btn.listening .mic-ring{animation:pulse 1.6s ease-out infinite;}
@keyframes pulse{
  0%{opacity:0.7; transform:scale(0.9);}
  100%{opacity:0; transform:scale(1.55);}
}
.cook-controls .btn{flex:1;}
.heard-toast{
  position:fixed; bottom:98px; left:50%; transform:translateX(-50%);
  background:var(--gold-btn); color:#1A1306; font-weight:700; font-size:16px;
  padding:8px 16px; border-radius:var(--radius-full); opacity:0; transition:opacity .25s ease; pointer-events:none;
  max-width:380px; text-align:center;
}
.heard-toast.show{opacity:1;}
/* Small variant, anchored above the mic button (position set inline in JS). */
.heard-toast.mic-hint{ font-size:13px; font-weight:600; padding:6px 12px; max-width:none; white-space:nowrap; box-shadow:0 4px 14px rgba(0,0,0,.16); }

/* Misfire safety net: after a VOICE next/back, a big tappable pulse offers a
   couple of seconds to undo a wrong jump. Sits above the "heard" caption. */
.nav-undo-pulse{
  position:fixed; bottom:140px; left:50%; transform:translateX(-50%) translateY(8px);
  display:none; align-items:center; gap:8px;
  background:#222; color:#fff; font-family:inherit; font-weight:700; font-size:16px;
  padding:12px 22px; border:2px solid #fff; border-radius:var(--radius-full);
  box-shadow:0 8px 28px rgba(0,0,0,0.35); cursor:pointer; z-index:60;
  opacity:0; transition:opacity .2s ease, transform .2s ease;
}
.nav-undo-pulse::before{ content:"↩︎"; font-size:18px; }
.nav-undo-pulse.show{ display:inline-flex; opacity:1; transform:translateX(-50%) translateY(0); animation:navUndoPulse 1s ease-in-out infinite; }
@keyframes navUndoPulse{
  0%,100%{ box-shadow:0 8px 28px rgba(0,0,0,0.35); }
  50%{ box-shadow:0 8px 34px rgba(214,164,58,0.6); }
}

/* ── "I'm listening" flag ──────────────────────────────────────────────────
   A calm label that floats above the mic while voice control is live, so the
   cook can see it's listening from across the room without walking over. It's
   purely a read-out of the mic's existing .listening state, no logic here. */
.listening-flag{
  position:absolute; left:50%; top:-16px; transform:translate(-50%,-6px);
  display:flex; align-items:center; gap:9px;
  padding:8px 18px; border-radius:var(--radius-full);
  background:var(--obsidian-2); border:1px solid var(--cyan); color:var(--cyan);
  font-size:16px; font-weight:700; letter-spacing:0.01em;
  box-shadow:0 6px 20px rgba(0,0,0,0.18);
  opacity:0; pointer-events:none; transition:opacity .25s ease, transform .25s ease;
  z-index:5;
}
.listening-dot{
  width:11px; height:11px; border-radius:50%; background:var(--cyan); flex-shrink:0;
}
#screen-cook:has(.mic-btn.listening) .listening-flag{
  opacity:1; transform:translate(-50%,0);
}
#screen-cook:has(.mic-btn.listening) .listening-dot{
  animation:listeningDot 1.6s ease-in-out infinite;
}
@keyframes listeningDot{
  0%,100%{ transform:scale(0.7); opacity:0.55; box-shadow:0 0 0 0 rgba(95,227,211,0); }
  50%{ transform:scale(1); opacity:1; box-shadow:0 0 0 6px rgba(95,227,211,0.18); }
}

/* ── Calm the chrome while a step is live ──────────────────────────────────
   The current instruction should be the single brightest thing on screen, so
   the top bar and progress track recede. Nothing is disabled, they brighten
   the moment they're touched/focused. */
.cookmode .cook-top{ opacity:0.5; transition:opacity .3s ease; }
.cookmode .cook-top:hover,
.cookmode .cook-top:focus-within{ opacity:1; }
.cookmode .progress-track{ opacity:0.55; transition:opacity .3s ease; }

/* ── Doneness cue ──────────────────────────────────────────────────────────
   When a step's timer has elapsed, the active card takes a warm gold edge and
   a small "check it" flag, a glance says "likely ready" without auto-advancing.
   The .timer-done class is added by the timer-complete handler and cleared on
   the next re-render. */
.step-card.current.timer-done{
  border-color:rgba(216,178,107,0.7);
  box-shadow:0 0 0 2px rgba(216,178,107,0.35), 0 8px 28px rgba(216,178,107,0.22);
  animation:donePulse 2.4s ease-in-out infinite;
}
.step-card.current.timer-done::after{
  content:"Likely ready, check it";
  display:block; margin-top:16px; padding:10px 16px;
  background:var(--gold-btn); color:#1A1306; font-weight:700; font-size:16px;
  border-radius:var(--radius-full); text-align:center;
}
@keyframes donePulse{
  0%,100%{ box-shadow:0 0 0 2px rgba(216,178,107,0.30), 0 8px 28px rgba(216,178,107,0.16); }
  50%{ box-shadow:0 0 0 2px rgba(216,178,107,0.55), 0 8px 34px rgba(216,178,107,0.30); }
}

/* ── Cook mode: one step, sized to fill the window, never scrolled ────────────
   Drop the phone-width cap so the step can grow. The active card keeps a fixed,
   readable BASE design; fitCookStepToScreen() (JS) then applies a single
   transform:scale() so the whole card fills, or shrinks into, the visible area
   in one ratio. That's why the type here is fixed px, not fluid: the scale does
   the enlarging/reducing, which also guarantees the step always fits. */
body.cooking .phone{ max-width:none; }
/* One consistent content width for the card AND the top bar + dock, so they all
   line up (nothing wider than the card). Grows a little on a big screen, but not
   huge. */
.cook-dock, .cook-controls{ max-width:min(92vw, 560px); }
.cookmode > .cook-top{ align-self:center; width:min(92vw, 560px); }
.cookmode > .progress-track{ align-self:center; width:min(92vw, 560px); margin:0 0 28px; }

.screen.cookmode .step-card.current{
  width:min(92vw, 560px); max-width:none;
  transform-origin:center center; will-change:transform;
  transition:none; /* the scale is set exactly per step, no size wobble */
  padding:28px 26px;
}
.step-card.current h3{ font-size:30px; line-height:1.2; }
.step-card.current p{ font-size:20px; line-height:1.5; }
.step-card.current .step-num{ font-size:14px; }
.step-card.current .step-detail{ font-size:17px; }
.step-card.current .step-cue p{ font-size:15px; }
.step-icon-row{ gap:16px; }
.step-card.current .step-icon{ width:76px; height:76px; }
.step-card.current .step-emoji-icon{ font-size:42px; }
.step-card.current .step-icon svg{ width:40px; height:40px; }
.cookmode .timer-ring-box{ width:128px; height:128px; }
.cookmode .timer-digits{ font-size:27px; letter-spacing:-0.5px; }

.done-screen{text-align:center; padding-top:70px; position:relative; z-index:1; display:flex; flex-direction:column; align-items:center;}
/* Rounded photo hero of the dish just cooked. Falls back to the dancing chef. */
.done-photo{
  width:132px; height:132px; border-radius:28px; overflow:hidden;
  margin-bottom:18px; display:flex; align-items:center; justify-content:center;
  background:var(--glass); box-shadow:0 8px 24px rgba(0,0,0,0.14);
}
.done-photo img{ width:100%; height:100%; object-fit:cover; display:block; }
.done-photo .dancing-chef{ margin-bottom:0; }
/* .dancing-chef sets display:inline-block, which beats the hidden attribute,
   force the fallback to stay hidden while the photo is showing. */
.done-photo .dancing-chef[hidden]{ display:none; }
/* White card with a hairline, not a grey box, and its controls sit on white
   rather than grey-on-grey, matching the listing surfaces elsewhere. */
.done-card{
  width:100%; max-width:340px; margin-bottom:22px;
  background:var(--obsidian-2); border:1px solid var(--line); border-radius:var(--radius-lg);
  padding:18px; box-shadow:var(--shadow-card);
}
.done-card-label{ font-size:16px; font-weight:600; color:var(--ink); margin-bottom:12px; text-align:left; }
.done-rate-btn{
  flex:1; display:flex; flex-direction:column; align-items:center; gap:4px;
  padding:14px 8px; border-radius:var(--radius-md);
  background:none; border:1px solid var(--line-strong); color:var(--ink);
  font-size:16px; font-weight:600; cursor:pointer;
  transition:border-color .15s ease, background .15s ease, transform .15s ease;
}
.done-rate-btn:active{ transform:scale(0.96); }
/* Selected uses a gold ring + faint gold wash, the app's one accent. */
.done-rate-btn.selected{ background:rgba(216,178,107,0.12); border-color:var(--gold-btn); }
.dancing-chef{
  font-size:60px; display:inline-block; margin-bottom:8px;
  filter:drop-shadow(0 10px 16px rgba(0,0,0,0.45));
  animation: chefDance 1.1s ease-in-out infinite;
  transform-origin: 50% 85%;
}
@keyframes chefDance{
  0%,100%{transform:translateY(0) rotate(-8deg);}
  20%{transform:translateY(-14px) rotate(8deg);}
  40%{transform:translateY(0) rotate(-6deg);}
  60%{transform:translateY(-11px) rotate(10deg);}
  80%{transform:translateY(0) rotate(-4deg);}
}
.bon-appetit{
  font-style:italic; font-weight:600; font-size:26px; margin:2px 0 8px;
  -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
  opacity:0; animation: bonAppetitPop 0.6s ease 0.25s forwards;
}
@keyframes bonAppetitPop{
  0%{opacity:0; transform:scale(0.7);}
  65%{opacity:1; transform:scale(1.12);}
  100%{opacity:1; transform:scale(1);}
}
.fireworks-layer{position:absolute; inset:0; overflow:hidden; pointer-events:none; z-index:0;}
#screen-done{position:relative; overflow:hidden;}
.fw-particle{
  position:absolute; width:6px; height:6px; border-radius:50%;
  animation:fwBurst 1.9s cubic-bezier(.1,.6,.3,1) forwards;
  box-shadow:0 0 8px 1px currentColor;
}
@keyframes fwBurst{
  0%{transform:translate(0,0) scale(1.3); opacity:1;}
  70%{opacity:1;}
  100%{transform:translate(var(--fw-x), calc(var(--fw-y) + 60px)) scale(0.2); opacity:0;}
}
.fw-rocket{
  position:absolute; width:3px; height:3px; border-radius:50%;
  background:#fff; box-shadow:0 0 6px 2px #F2D9A6;
  animation:fwRocket .5s ease-out forwards;
}
@keyframes fwRocket{
  0%{transform:translateY(0); opacity:0;}
  10%{opacity:1;}
  100%{transform:translateY(var(--fw-rise)); opacity:0.9;}
}
.fw-flash{
  position:absolute; width:40px; height:40px; border-radius:50%;
  background:radial-gradient(circle, rgba(255,255,255,0.9), transparent 70%);
  transform:translate(-50%,-50%) scale(0); animation:fwFlash .5s ease-out forwards;
}
@keyframes fwFlash{
  0%{transform:translate(-50%,-50%) scale(0); opacity:1;}
  100%{transform:translate(-50%,-50%) scale(2.5); opacity:0;}
}

/* generic toast */
/* Toast: a floating frosted pill with a status icon, spring entrance, soft
   shadow. Modelled on the Apple/Linear/Vercel style, quiet but crafted. */
.toast{
  position:fixed; bottom:calc(104px + env(safe-area-inset-bottom, 0px)); left:50%;
  transform:translateX(-50%) translateY(16px) scale(0.94);
  display:flex; align-items:center; gap:10px;
  background:var(--glass-strong); color:var(--ink);
  font-size:15px; font-weight:600; letter-spacing:-0.01em;
  padding:11px 18px 11px 12px; border-radius:999px; max-width:88%; text-align:left;
  border:1px solid var(--line);
  box-shadow:0 12px 34px rgba(0,0,0,0.18), 0 3px 10px rgba(0,0,0,0.08);
  -webkit-backdrop-filter:blur(20px) saturate(1.5); backdrop-filter:blur(20px) saturate(1.5);
  opacity:0; z-index:80; pointer-events:none;
  transition:opacity .26s ease, transform .4s cubic-bezier(.16,1,.3,1);
}
.toast.show{ opacity:1; transform:translateX(-50%) translateY(0) scale(1); }
.toast .toast-ico{
  width:22px; height:22px; border-radius:50%; flex-shrink:0;
  display:flex; align-items:center; justify-content:center; color:#fff;
  background:#2FB574;
}
.toast .toast-ico svg{ width:14px; height:14px; }
.toast.toast-error .toast-ico{ background:#E5484D; }
.toast.toast-warn .toast-ico{ background:#E8A33D; }
.toast .toast-msg{ line-height:1.35; }
@media (prefers-reduced-motion: reduce){
  .toast{ transition:opacity .2s ease; transform:translateX(-50%); }
  .toast.show{ transform:translateX(-50%); }
}

.footnote{font-size:14px; color:var(--ash); text-align:center; margin-top:20px; line-height:1.6;}

/* bottom tab navigation */
.bottom-tabs{
  position:fixed; bottom:0; left:50%; transform:translateX(-50%);
  width:100%; max-width:var(--app-w); z-index:100;
  display:flex; align-items:center; justify-content:space-around;
  background:var(--obsidian-2);
  border-top:1px solid var(--line);
  padding:10px 8px calc(10px + env(safe-area-inset-bottom, 0px));
}
.bottom-tab{
  background:none; border:none; flex:1; border-radius:16px; padding:8px 4px 6px;
  display:flex; flex-direction:column; align-items:center; justify-content:center; cursor:pointer; gap:3px;
  transition:background .15s ease;
}
.bottom-tab svg{width:22px; height:22px; stroke:var(--ash); transition:stroke .15s ease;}
.profile-tab-circle{
  width:22px; height:22px; border-radius:50%; border:1.5px solid var(--ash);
  display:flex; align-items:center; justify-content:center; transition:border-color .15s ease;
}
.profile-tab-circle svg{width:13px; height:13px;}
.bottom-tab.active .profile-tab-circle{ border-color:var(--gold-btn); }
/* Airbnb sizes tab labels small and light, big bold labels crowd the bar
   and collide on narrow phones. 10px/500 is Airbnb's actual treatment. */
.bottom-tab-label{font-size:10px; font-weight:500; color:var(--ash); line-height:1.2; transition:color .15s ease; white-space:nowrap;}
.bottom-tab.active{background:none;}
.bottom-tab.active svg{stroke:var(--gold-bright); stroke-width:2.3;}
.bottom-tab.active .bottom-tab-label{color:var(--gold-btn);}
/* Centre FAB: floating gold circle above the bar */
.bottom-tab-fab{
  width:52px; height:52px; min-width:52px; max-width:52px; border-radius:50%; flex:0 0 52px;
  background:var(--gold-btn);
  border:none; box-shadow:0 4px 14px rgba(0,0,0,0.35);
  margin-top:0; padding:0; cursor:pointer;
  display:flex; align-items:center; justify-content:center;
  transition:transform .2s cubic-bezier(.34,1.56,.64,1), box-shadow .15s ease;
}
.bottom-tab-fab svg{width:36px; height:36px;}
.bottom-tab-fab .bottom-tab-label{display:none;}
.bottom-tab-fab.active{transform:scale(1.08); box-shadow:0 6px 20px rgba(216,178,107,0.55);}

/* roulette preference / mode button + panel */
.section-row{display:flex; align-items:center; justify-content:space-between; margin:32px 0 14px; margin-top:32px; margin-bottom:14px;}
.icon-btn-sm{
  width:32px; height:32px; border-radius:50%; background:var(--glass); border:1px solid var(--line-strong);
  display:flex; align-items:center; justify-content:center; cursor:pointer; flex-shrink:0;
}
.icon-btn-sm svg{width:15px; height:15px; stroke:var(--gold-bright); fill:none; stroke-width:2;}
.roulette-pref-panel{
  display:none; background:var(--glass); border:1px solid var(--line-strong); border-radius:16px;
  padding:14px; margin-bottom:16px;
}
.roulette-pref-panel.show{display:block;}
.mode-option{
  display:flex; align-items:flex-start; gap:10px; padding:10px; border-radius:16px; cursor:pointer;
  border:1.5px solid var(--line); margin-bottom:8px;
}
.mode-option.selected{border-color:var(--gold-btn); background:var(--glass-strong);}
.mode-option .mo-title{font-weight:700; font-size:16px; color:var(--ink);}
.mode-option .mo-desc{font-size:14px; color:var(--ash); margin-top:4px;}

/* profile header */
.profile-header{
  display:flex; align-items:center; gap:14px; margin:0 0 24px; padding:0;
  position:relative; background:none;
}

.profile-header > *{position:relative; z-index:1;}
.profile-header #profile-greeting,
.profile-header #profile-name,
.profile-header #profile-cook-count-num,
.profile-header #profile-cook-count-label{
  color:#F7F4ED !important;
}
.profile-avatar{
  width:56px; height:56px; border-radius:50%; background:var(--obsidian); border:3px solid var(--obsidian);
  display:flex; align-items:center; justify-content:center; flex-shrink:0;
  box-shadow:0 4px 16px rgba(0,0,0,0.4); position:relative; z-index:1;
}
.profile-avatar::before{
  content:''; position:absolute; inset:3px; border-radius:50%; background:var(--obsidian); z-index:-1;
}
.settings-icon{
  width:30px; height:30px; border-radius:16px; display:inline-flex; align-items:center; justify-content:center;
  flex-shrink:0; margin-right:9px; box-shadow:0 3px 8px rgba(0,0,0,0.35);
}
.settings-icon svg{width:17px; height:17px;}
.settings-icon.c-red{background:linear-gradient(135deg,#FF8A7A,#E5484D);}
.settings-icon.c-orange{background:linear-gradient(135deg,#FFB870,#F2994A);}
.settings-icon.c-yellow{background:linear-gradient(135deg,#FFE187,#F2C94C);}
.settings-icon.c-green{background:linear-gradient(135deg,#7BE8A4,#2ECC71);}
.settings-icon.c-teal{background:linear-gradient(135deg,#7FF0E0,#1ABC9C);}
.settings-icon.c-blue{background:linear-gradient(135deg,#7FB3FF,#3D7CF2);}
.settings-icon.c-purple{background:linear-gradient(135deg,#C7A0FF,#8B5CF6);}
.settings-icon.c-pink{background:linear-gradient(135deg,#FF9FD6,#EC4899);}
.profile-level-badge{
  flex-shrink:0; font-size:14px; font-weight:800; padding:5px 11px; border-radius:var(--radius-full);
  text-transform:uppercase; letter-spacing:0.03em; box-shadow:0 2px 8px rgba(0,0,0,0.4);
}
#profile-cook-count-num{font-size:26px; font-weight:800; color:var(--ink);}
.section-label-row{display:flex; align-items:center; margin:24px 0 12px;}
.section-label-row .section-label{margin:0;}

/* explore search */
.explore-search-row{display:flex; align-items:center; gap:10px; margin-bottom:4px;}
.explore-search-wrap{position:relative; flex:1;}
.explore-search-icon{
  position:absolute; left:20px; top:50%; transform:translateY(-50%);
  width:17px; height:17px; stroke:var(--ash); pointer-events:none; z-index:1;
}
.explore-search-input{
  width:100%; padding:18px 20px 18px 52px;
  border-radius:var(--radius-full);
  background:var(--obsidian-2); border:1px solid var(--line);
  color:var(--ink); 
  font-size:16px; font-weight:500;
  box-shadow:0 2px 8px rgba(0,0,0,0.07);
  transition:box-shadow .18s ease, border-color .18s ease;
}
.explore-search-input:focus{
  outline:none; border-color:var(--line-strong);
  box-shadow:0 4px 16px rgba(0,0,0,0.12);
}
.explore-search-input::placeholder{color:var(--ash);}

.explore-suggest{
  position:absolute; top:calc(100% + 6px); left:0; right:0; background:var(--obsidian-2);
  border:1px solid var(--line-strong); border-radius:16px; overflow:hidden; z-index:40;
  box-shadow:0 14px 34px rgba(0,0,0,0.5); display:none;
}
.explore-suggest.show{display:block;}
.explore-suggest-item{padding:12px 16px; font-size:16px; cursor:pointer; border-bottom:1px solid var(--line); display:flex; align-items:center; justify-content:space-between; gap:10px;}
.explore-suggest-item:last-child{border-bottom:none;}
.explore-suggest-item:active{background:var(--glass-strong);}
.explore-suggest-header{padding:12px 16px 8px; font-size:14px; font-weight:600; color:var(--ash);}
.explore-suggest-empty{padding:14px; font-size:16px; color:var(--ash); text-align:center;}

/* calendar */
.cal-day-card{border:none; border-radius:var(--radius-lg); padding:6px 18px 12px; margin-bottom:16px; background:var(--glass);}
.cal-day-header{display:flex; justify-content:space-between; align-items:center; padding:14px 0 10px; margin-bottom:4px; border-bottom:1px solid var(--line);}
.cal-day-header span:first-child{font-size:16px; font-weight:700; }
.cal-day-header span{font-weight:700; font-size:16px; color:var(--gold-btn); }
.cal-redraw-day, .cal-redraw{
  background:rgba(216,178,107,0.18); border:1px solid rgba(216,178,107,0.45); color:var(--gold-btn);
  border-radius:16px; cursor:pointer; font-size:16px; padding:5px 9px; font-weight:700;
}
.cal-redraw-day:active, .cal-redraw:active{ background:rgba(216,178,107,0.32); }
.cal-mode-chip{
  background:var(--glass); border:1px solid var(--line-strong); color:var(--ink);
  border-radius:999px; cursor:pointer; font-size:14px; padding:5px 11px; font-weight:600; font-family:inherit; white-space:nowrap;
}
.cal-mode-chip:active{ background:var(--glass-strong); }
.cuisine-mode-toggle{display:flex; gap:6px;}
.cuisine-mode-btn{
  background:var(--glass); border:1px solid var(--line-strong); color:var(--ash);
  font-size:14px; font-weight:700; padding:5px 11px; border-radius:var(--radius-full); cursor:pointer;
}
.cuisine-mode-btn.active-must{background:rgba(95,227,211,0.18); border-color:rgba(95,227,211,0.5); color:var(--cyan);}
.cuisine-mode-btn.active-exclude{background:rgba(255,143,112,0.18); border-color:rgba(255,143,112,0.5); color:var(--coral);}
.cal-meal-row{display:flex; align-items:center; gap:8px; padding:11px 0; border-top:1px solid rgba(255,255,255,0.05);}
.cal-meal-row:first-child{border-top:none;}
.cal-meal-row:first-of-type{border-top:none;}
.cal-meal-label{width:82px; flex-shrink:0; padding-right:12px; font-size:14px; color:var(--ash); font-weight:700; text-transform:uppercase; letter-spacing:0.04em;}
.cal-meal-pick{flex:1; font-size:16px; cursor:pointer; padding:6px 8px; border-radius:16px; transition:background .15s ease;}
.cal-meal-pick:active{background:var(--glass-strong);}
.cal-stop-name.slot-settle{display:inline-block; animation:slotSettle 0.32s ease;}
@keyframes slotSettle{ 0%{transform:scale(1.18); color:var(--gold-btn);} 60%{transform:scale(0.95);} 100%{transform:scale(1);} }
.cal-meal-pick:active{background:var(--glass-strong);}

/* generic sheet modal (calendar recipe picker) */
.sheet-modal{
  position:fixed; inset:0; max-width:var(--app-w); margin:0 auto; z-index:200;
  background:rgba(0,0,0,0.6); backdrop-filter:blur(4px);
  display:flex; align-items:center; justify-content:center; padding:20px;
  opacity:0; pointer-events:none; transition:opacity .25s ease;
}
.sheet-modal.show{opacity:1; pointer-events:auto;}
/* Base card for every sheet, Airbnb search-modal proportions. */
.sheet-card{
  width:100%; max-height:82vh; overflow-y:auto;
  background:var(--obsidian-2); border:none;
  border-radius:26px; padding:26px 22px; position:relative;
  box-shadow:0 12px 40px rgba(0,0,0,0.18);
}
#pantry-modal{ align-items:center; }
/* The big bold question Airbnb leads its search sheet with */
.sheet-card h3{
  font-size:26px; font-weight:700; letter-spacing:-0.02em; letter-spacing:-0.02em;
  color:var(--ink); margin-bottom:6px;
}
/* Roomy tappable rows inside sheets */
.sheet-card .ab-row,
.sheet-card .dish-switch-row,
.sheet-card .rescue-row{ padding:18px 2px; }
/* shopping info popover: anchor to the middle of the screen */
#shopping-info-modal{align-items:center; justify-content:center;}
#shopping-info-modal .sheet-card{
  border-radius:22px !important; max-height:70vh;
}
.sheet-close{
  position:absolute; top:20px; right:20px; z-index:2;
  width:34px; height:34px; border-radius:50%;
  background:var(--glass); border:none; cursor:pointer;
  color:var(--ink); font-size:16px; line-height:1;
  display:flex; align-items:center; justify-content:center;
}
.sheet-close:active{ background:var(--glass-strong); }

.shopping-cat-header:active{ opacity:0.6; }
.shopping-cat-chevron{ color:var(--ash); transition:transform .2s ease; flex-shrink:0; }
.shopping-cat-chevron.collapsed{ transform:rotate(-90deg); }
.shopping-cat-header > span:first-of-type{ flex:1; }
.shopping-cat-count{ font-size:14px; color:var(--ash); font-weight:600; }


.shopping-item.checked .shopping-check{background:var(--gold-btn); border-color:var(--gold-btn);}
.shopping-item.checked 
.shopping-name{font-size:16px; font-weight:600; color:var(--ink);}


.shopping-add-row{display:flex; gap:8px; margin-bottom:8px;}
.shopping-add-row input{
  flex:1; padding:11px 14px; border-radius:16px; background:var(--glass-strong); border:1.5px solid var(--line-strong);
  color:var(--ink); font-size:16px;
}

.shopping-remove:hover{color:var(--coral);}

/* recipe creator form */
.field-input{
  width:100%; padding:13px 14px; border-radius:16px; background:var(--glass);
  border:1.5px solid var(--line-strong); color:var(--ink); 
  font-size:16px; margin-bottom:16px; display:block;
}
.field-input::placeholder{color:var(--ash);}
.upload-box{display:block; margin-bottom:16px; cursor:pointer;}
.upload-preview{
  width:100%; min-height:110px; border-radius:16px; border:1.5px dashed var(--line-strong);
  background:var(--glass); display:flex; align-items:center; justify-content:center;
  color:var(--ash); font-size:16px; font-weight:600; overflow:hidden; position:relative;
}
.upload-preview img, .upload-preview video{width:100%; height:140px; object-fit:cover; display:block;}
.draft-row{
  display:flex; gap:8px; align-items:center; margin-bottom:8px;
}
.draft-row input{flex:1; padding:11px 12px; border-radius:16px; background:var(--glass);
  border:1.5px solid var(--line); color:var(--ink); font-size:16px;}
.draft-row .remove-row{
  width:34px; height:34px; flex-shrink:0; border-radius:16px; background:var(--glass);
  border:1px solid var(--line); color:var(--coral); font-size:16px; cursor:pointer;
}
.draft-step-card{
  border:1.5px solid var(--line); border-radius:16px; padding:14px; margin-bottom:12px; background:var(--glass);
}
.draft-step-card .draft-row input{margin-bottom:0;}
.draft-step-card textarea{
  width:100%; padding:10px 12px; border-radius:16px; background:var(--glass-strong);
  border:1.5px solid var(--line); color:var(--ink); font-size:16px;
  resize:none; height:54px; margin:8px 0;
}
.draft-step-row2{display:flex; gap:8px; align-items:center; margin-top:8px;}
.draft-step-row2 select{
  flex:1; padding:9px 10px; border-radius:16px; background:var(--glass-strong); border:1.5px solid var(--line);
  color:var(--ink); font-size:16px;
}
.draft-step-row2 label{display:flex; align-items:center; gap:5px; font-size:16px; color:var(--ash); white-space:nowrap;}
.draft-step-row2 input[type="number"]{width:56px; padding:8px; border-radius:16px; background:var(--glass-strong); border:1.5px solid var(--line); color:var(--ink); font-size:16px;}

/* meal time settings */
.mealtime-group{margin-bottom:16px;}
.mealtime-group-title{font-size:16px; font-weight:700; color:var(--gold-btn); margin-bottom:8px; text-transform:uppercase; letter-spacing:0.05em;}
.mealtime-row{display:flex; align-items:center; justify-content:space-between; padding:8px 0; border-top:1px solid var(--line);}
.mealtime-row:first-of-type{border-top:none;}
.mealtime-row label{font-size:16px; color:var(--ink);}
.mealtime-row input[type="time"]{
  background:var(--glass-strong); border:1.5px solid var(--line-strong); border-radius:16px; color:var(--ink);
  font-size:16px; padding:6px 9px;
}

/* volume sliders */
.volume-row{margin-bottom:16px;}
.volume-row-label{display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; font-size:16px; color:var(--ink);}
.mute-btn{
  background:var(--glass); border:1px solid var(--line-strong); border-radius:16px; color:var(--ash);
  font-size:14px; font-weight:700; padding:4px 10px; cursor:pointer;
}
.mute-btn.muted{background:rgba(255,143,112,0.15); border-color:rgba(255,143,112,0.4); color:var(--coral);}
input[type="range"]{
  width:100%; height:6px; border-radius:16px; background:var(--glass-strong);
  -webkit-appearance:none; appearance:none; outline:none;
}
input[type="range"]::-webkit-slider-thumb{
  -webkit-appearance:none; appearance:none; width:18px; height:18px; border-radius:50%;
  background:var(--gold-btn); cursor:pointer;
  box-shadow:0 0 8px rgba(216,178,107,0.5);
}
input[type="range"]::-moz-range-thumb{
  width:18px; height:18px; border-radius:50%; border:none;
  background:var(--gold-btn); cursor:pointer;
}

/* spin result modal */
.spin-result{
  position:fixed; inset:0; max-width:var(--app-w); margin:0 auto; z-index:260;
  background:rgba(0,0,0,0.6); backdrop-filter:blur(4px);
  display:flex; align-items:center; justify-content:center;
  align-items:safe center; justify-content:safe center; /* progressive enhancement: older browsers ignore this line and keep plain center above */
  padding:24px;
  opacity:0; pointer-events:none; transition:opacity .25s ease; overflow-y:auto;
}
.spin-result.show{opacity:1; pointer-events:auto;}
.spin-result-card{
  width:100%; max-height:85vh; overflow-y:auto; background:var(--obsidian-2); border:1px solid var(--line-strong); border-radius:22px;
  padding:24px; text-align:center; position:relative;
  box-shadow:0 24px 60px rgba(0,0,0,0.6);
}
.spin-result-close{
  position:absolute; top:14px; right:14px; width:30px; height:30px; border-radius:50%;
  background:var(--glass); border:1px solid var(--line); color:var(--ink); cursor:pointer; font-size:16px;
}
.spin-result-thumb{
  width:96px; height:96px; border-radius:50%; overflow:hidden; margin:0 auto 16px; border:2px solid var(--gold);
  background:var(--obsidian); box-shadow:0 0 24px rgba(216,178,107,0.3);
}
.spin-result-thumb img{width:100%; height:100%; object-fit:cover; display:block;}

/* level-up celebration */
.levelup-modal{
  position:fixed; inset:0; max-width:var(--app-w); margin:0 auto; z-index:90;
  background:rgba(0,0,0,0.7); backdrop-filter:blur(5px);
  display:flex; align-items:center; justify-content:center;
  align-items:safe center; justify-content:safe center;
  padding:24px;
  opacity:0; pointer-events:none; transition:opacity .3s ease; overflow-y:auto;
}
.levelup-modal.show{opacity:1; pointer-events:auto;}
.levelup-card{
  width:100%; max-height:85vh; overflow-y:auto; background:var(--obsidian-2); border:1px solid var(--line-strong); border-radius:22px;
  padding:30px 24px; text-align:center; position:relative; box-shadow:0 30px 70px rgba(0,0,0,0.7);
}
.levelup-badge-wrap{display:flex; justify-content:center; margin-bottom:16px; height:64px; align-items:center; perspective:400px;}
.levelup-badge{width:56px; height:56px; border-radius:16px;}
.levelup-badge.anim-intermediate{
  background:linear-gradient(135deg, #F2C94C, #3DDC84);
  box-shadow:0 0 30px rgba(242,201,76,0.55);
  animation: levelUpBounce 0.9s cubic-bezier(.34,1.56,.64,1) forwards;
}
.levelup-badge.anim-advanced{
  background:linear-gradient(135deg, #4FA8FF, #F2C94C);
  box-shadow:0 0 30px rgba(79,168,255,0.55);
  animation: levelUpFlip 1.1s ease-out forwards;
}
.levelup-badge.anim-pro{
  background:linear-gradient(135deg, #16151A, #F2D9A6);
  box-shadow:0 0 36px rgba(242,217,166,0.7);
  animation: levelUpShockwave 1.3s ease-out forwards;
}
@keyframes levelUpBounce{
  0%{transform:scale(0.3) rotate(-15deg); opacity:0;}
  55%{transform:scale(1.25) rotate(8deg); opacity:1;}
  75%{transform:scale(0.92) rotate(-4deg);}
  100%{transform:scale(1) rotate(0deg);}
}
@keyframes levelUpFlip{
  0%{transform:rotateY(0deg) scale(0.5); opacity:0;}
  60%{transform:rotateY(720deg) scale(1.18); opacity:1;}
  100%{transform:rotateY(720deg) scale(1);}
}
@keyframes levelUpShockwave{
  0%{transform:scale(0.2); opacity:0; box-shadow:0 0 0 0 rgba(242,217,166,0.85);}
  45%{transform:scale(1.3); opacity:1; box-shadow:0 0 0 34px rgba(242,217,166,0);}
  100%{transform:scale(1); box-shadow:0 0 0 0 rgba(242,217,166,0);}
}
@media print{
  body{ background:#fff !important; }
  .phone{ box-shadow:none !important; background:#fff !important; max-width:100% !important; }
  .bottom-tabs, .theme-toggle-btn, .topbar .back-btn, .shopping-add-row,
  .shopping-info-btn, .shopping-remove, .cal-redraw, .cal-redraw-day,
  #shopping-filter-status, .muted + span[onclick] { display:none !important; }
  .screen{ padding:0 12px !important; min-height:0 !important; }
  .screen:not(#screen-shopping-list){ display:none !important; }
  .shopping-item{ border:1px solid #000 !important; background:#fff !important; color:#000 !important; break-inside:avoid; box-shadow:none !important; }
  .shopping-check{ border-color:#000 !important; color:#000 !important; }
  .shopping-name, .shopping-total{ color:#000 !important; }
  .muted{ color:#444 !important; }
  .section-label{ color:#000 !important; border-bottom:1px solid #000; padding-bottom:4px; }
  .brandmark{ -webkit-text-fill-color:#000 !important; color:#000 !important; background:none !important; }
}

/* ── One interaction language for every tappable thing ── */
button, .chip, .recipe-card, .shopping-item, .settings-row,
.dish-switch-row, .rescue-row, .prep-item, .cal-meal-pick,
.parallel-chip, .underline-tab{
  -webkit-tap-highlight-color:transparent;
  -webkit-user-select:none; user-select:none;
  transition:transform .16s cubic-bezier(.34,1.4,.64,1),
             background .16s ease, opacity .16s ease, box-shadow .16s ease;
}
button:active, .chip:active, .recipe-card:active, .shopping-item:active,
.settings-row:active, .dish-switch-row:active, .rescue-row:active,
.prep-item:active, .cal-meal-pick:active,
.parallel-chip:active{
  transform:scale(0.97);
}
button:disabled, button:disabled:active{ transform:none; opacity:0.4; cursor:default; }
button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible{
  outline:2px solid var(--gold); outline-offset:2px;
}

/* ─────────────── A–Z cookbook dictionary (Explore » A–Z) ─────────────── */
.mealtype-seg{
  display:flex; gap:8px; margin:2px 0 14px; overflow-x:auto; flex-wrap:nowrap;
  -webkit-overflow-scrolling:touch; scrollbar-width:none;
}
.mealtype-seg::-webkit-scrollbar{ display:none; }
.mealtype-btn{
  flex:0 0 auto; padding:10px 18px; border-radius:999px; border:1px solid var(--line);
  background:none; color:var(--ash); font-family:inherit; font-size:16px;
  font-weight:600; cursor:pointer; white-space:nowrap;
}
.mealtype-btn.selected{ background:var(--ink); color:#fff; border-color:var(--ink); }
/* 3D emoji images (Fluent) scale with the surrounding font size, like real emoji. */
img.emoji{ height:1em; width:1em; margin:0 .05em 0 .1em; vertical-align:-0.16em; object-fit:contain; }
.finedining-tag{ display:inline-block; background:var(--gold-btn); color:#1A1306; font-size:12px; font-weight:700; padding:1px 8px; border-radius:999px; margin-right:4px; letter-spacing:0.01em; }
/* Spin controls on Home: shared cuisine + meal-size segmented controls */
.spin-controls{ margin:18px auto 4px; max-width:var(--app-w); }
.spin-ctrl-row{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin:10px 0; }
.spin-ctrl-label{ font-size:15px; font-weight:600; color:var(--ink); }
.spin-seg{ display:inline-flex; gap:3px; background:var(--glass); border:1px solid var(--line); border-radius:999px; padding:4px; }
.spin-seg-btn{ border:none; background:none; border-radius:999px; padding:8px 16px; font-family:inherit; font-size:15px; font-weight:600; color:var(--ash); cursor:pointer; white-space:nowrap; transition:background .18s ease, color .18s ease; }
.spin-seg-btn.selected{ background:var(--gold-btn); color:#1A1306; }
.spin-divider{ display:flex; align-items:center; text-align:center; gap:12px; color:var(--ash); font-size:14px; font-weight:600; margin:16px 0 12px; }
.spin-divider::before, .spin-divider::after{ content:''; flex:1; height:1px; background:var(--line); }
.spin-meal-btn{ margin-top:14px; }
/* Menu rows inside the meal result card */
#meal-result-list{ width:100%; }
.meal-row{ display:flex; align-items:center; gap:12px; padding:11px 0; border-top:1px solid var(--line); text-align:left; width:100%; box-sizing:border-box; min-height:58px; }
.meal-row:first-child{ border-top:none; }
.meal-row-emoji{ font-size:26px; flex-shrink:0; width:34px; text-align:center; }
.meal-row-body{ flex:1; min-width:0; }
/* One line, ellipsis, fixed height, so the slot-machine reveal never reflows the card */
.meal-row-name{ font-size:16px; font-weight:600; color:var(--ink); line-height:1.35; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.meal-row-course{ font-size:13px; color:var(--ash); margin-top:1px; }
.meal-row-reroll{ flex-shrink:0; width:36px; height:36px; border-radius:50%; border:1px solid var(--line-strong);
  background:var(--glass); color:var(--ink); font-size:17px; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.meal-row-base{ opacity:0.75; }
.meal-row-base .meal-row-name{ font-weight:600; }
.az-mode-toggle{ display:flex; gap:8px; margin:4px 0 12px; }
.az-mode-btn{
  flex:1; padding:10px 0; border-radius:999px; border:1px solid var(--line);
  background:none; color:var(--ash); font-family:inherit; font-size:16px;
  font-weight:600; cursor:pointer;
}
.az-mode-btn.selected{ background:var(--ink); color:#fff; border-color:var(--ink); }
.az-search-wrap{ position:relative; margin-bottom:10px; }
.az-search-wrap .explore-search-icon{
  position:absolute; left:16px; top:50%; transform:translateY(-50%);
  width:18px; height:18px; stroke:var(--ash); pointer-events:none;
}
.az-search-wrap .explore-search-input{ padding-left:44px; }
.az-letter-rail{
  display:flex; flex-wrap:wrap; gap:2px; margin-bottom:14px; justify-content:space-between;
}
.az-rail-btn{
  flex:1 0 auto; min-width:22px; padding:4px 0; background:none; border:none;
  color:var(--gold-ink, #a06d00); font-family:inherit; font-size:13px; font-weight:700;
  cursor:pointer; border-radius:6px;
}
.az-rail-btn.disabled{ color:var(--line); cursor:default; }
.az-group-head{
  position:sticky; top:0; z-index:1; background:var(--obsidian);
  font-size:18px; font-weight:700; color:var(--ink); padding:8px 4px 4px;
}
.az-dish-row{
  display:flex; align-items:center; gap:12px; width:100%; padding:14px 6px;
  background:none; border:none; border-bottom:1px solid var(--line); cursor:pointer;
  text-align:left; font-family:inherit;
}
.az-dish-row:last-child{ border-bottom:none; }
.az-dish-emoji{ font-size:22px; flex:0 0 auto; }
.az-dish-name{ flex:1; font-size:16px; color:var(--ink); }
.az-dish-meta{ font-size:14px; color:var(--ash); flex:0 0 auto; }
.az-term-row{
  display:flex; align-items:flex-start; gap:12px; padding:14px 6px;
  border-bottom:1px solid var(--line);
}
.az-term-emoji{ font-size:22px; flex:0 0 auto; line-height:1.4; }
.az-term-title{ font-size:16px; font-weight:600; color:var(--ink); }
.az-term-text{ font-size:15px; color:var(--ash); margin-top:2px; line-height:1.45; }

/* ─────────────── Explore quick filters (dietary + time) ─────────────── */
.quick-filter-row{
  display:flex; flex-wrap:wrap; gap:8px; padding:4px 0 12px;
}
.quick-filter-row::-webkit-scrollbar{ display:none; }
.quick-chip{
  flex:0 0 auto; padding:8px 14px; border-radius:999px; border:1px solid var(--line);
  background:none; color:var(--ink); font-family:inherit; font-size:15px; font-weight:600;
  white-space:nowrap; cursor:pointer;
}
.quick-chip.selected{ background:var(--ink); color:#fff; border-color:var(--ink); }

/* ─────────────── Accessibility: respect reduced-motion preference ───────────────
   Users who enable "reduce motion" (vestibular sensitivity) get near-instant
   transitions and no looping animations (fireworks, shimmer, spinners). */
@media (prefers-reduced-motion: reduce){
  *, *::before, *::after{
    animation-duration:0.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:0.01ms !important;
    scroll-behavior:auto !important;
  }
}

/* Rough nutrition estimate chip on the recipe page */
.listing-chip.nutri-chip{
  background:var(--gold-soft, rgba(216,178,107,0.14));
  border:1px solid rgba(216,178,107,0.45); color:var(--ink); font-weight:600;
}

/* ─────────────── Onboarding: vertically-centred simple screens ─────────────── */
.screen.onboard-center.active{ display:flex; flex-direction:column; min-height:100vh; }
.onboard-center-body{ flex:1; display:flex; flex-direction:column; justify-content:center; padding-bottom:24px; }

/* ─── Cook step readability: stack icon ABOVE the title ───
   The title was in a flex row beside the 80px icon, squeezed into a narrow
   column that wrapped a short title ("Make the meat sauce") into 3 big lines.
   Stacking gives the title the full card width, reads in 1–2 lines. */
.step-card.current .step-icon-row{ flex-direction:column; align-items:flex-start; gap:10px; }
/* h3 size is handled by the fluid cook-mode clamp above (was a fixed 28/38px
   here, which overrode it because it comes later in the file). */

/* ─── Onboarding question transitions ───
   Each question's parts arrive in sequence, the emoji pops, then the heading,
   subtitle, options and button rise and settle, like a guided setup flow.
   The header (progress bar) stays put and visibly advances between questions. */
@keyframes qRise{ from{ opacity:0; transform:translate(var(--qx,26px),10px); } to{ opacity:1; transform:translate(0,0); } }
/* Entrance direction: forward nav = arrive from the right, Back = from the left */
.screen.onboard-anim.from-left{ --qx:-26px; }
.screen.onboard-anim.from-right{ --qx:26px; }
/* The OUTGOING question slides away (left when moving forward, right on Back) as
   the next one builds in, a real between-question transition. It's briefly held
   on screen as a fixed overlay after losing .active, then removed. */
.screen.onboard-leaving{ display:block !important; position:fixed; top:0; left:0; right:0; margin:0 auto; width:100%; max-width:var(--app-w); z-index:5; }
.screen.onboard-leaving.exit-left{ animation:qExitLeft .4s cubic-bezier(.4,0,.2,1) both; }
.screen.onboard-leaving.exit-right{ animation:qExitRight .4s cubic-bezier(.4,0,.2,1) both; }
@keyframes qExitLeft{ from{ transform:translateX(0); opacity:1; } to{ transform:translateX(-34%); opacity:0; } }
@keyframes qExitRight{ from{ transform:translateX(0); opacity:1; } to{ transform:translateX(34%); opacity:0; } }
@media (prefers-reduced-motion: reduce){ .screen.onboard-leaving{ display:none !important; } }
@keyframes qPop{ 0%{ opacity:0; transform:scale(.55) translateY(8px); } 60%{ opacity:1; transform:scale(1.06) translateY(0); } 100%{ transform:scale(1); } }
/* Opacity-only, the fixed bottom action bar centres itself with translateX(-50%),
   so it must NEVER be given a transform-based entrance or it loses its centring. */
@keyframes qFade{ from{ opacity:0; } to{ opacity:1; } }
/* Bespoke visual: a soft gold halo behind the question emoji, gently breathing. */
.onboard-emoji{ position:relative; isolation:isolate; display:inline-flex; align-items:center; justify-content:center; width:100px; height:100px; font-size:48px; line-height:1; }
.onboard-emoji::before{
  content:''; position:absolute; inset:0; border-radius:50%; z-index:-1;
  background:radial-gradient(circle at 50% 45%, rgba(216,178,107,.32), rgba(216,178,107,.09) 60%, transparent 72%);
  animation:haloBreathe 3.6s ease-in-out infinite;
}
@keyframes haloBreathe{ 0%,100%{ transform:scale(1); opacity:.85; } 50%{ transform:scale(1.09); opacity:1; } }
@media (prefers-reduced-motion: reduce){ .onboard-emoji::before{ animation:none; } }
/* Success screen emoji, a celebratory pop then a gentle settle */
@keyframes donePop{ 0%{ opacity:0; transform:scale(.3) rotate(-12deg); } 55%{ opacity:1; transform:scale(1.18) rotate(6deg); } 100%{ transform:scale(1) rotate(0); } }
.screen.onboard-center.active .onboard-center-body > .onboard-done-emoji{ font-size:76px; line-height:1; margin-bottom:16px; animation:donePop .7s cubic-bezier(.2,.8,.25,1) both; }
@media (prefers-reduced-motion: reduce){ .screen.onboard-center.active .onboard-center-body > .onboard-done-emoji{ animation:none; } }

/* Step screens (allergy / cuisine / level): children are topbar, emoji, h2, p, chips, actions */
.screen.onboard-anim.active:not(.onboard-center) > *{ animation:qRise .5s cubic-bezier(.2,.8,.25,1) both; }
.screen.onboard-anim.active:not(.onboard-center) > .topbar{ animation:none; }
.screen.onboard-anim.active:not(.onboard-center) > *:nth-child(2){ animation:qPop .55s cubic-bezier(.2,.8,.25,1) both; animation-delay:.04s; }
.screen.onboard-anim.active:not(.onboard-center) > *:nth-child(3){ animation-delay:.14s; }
.screen.onboard-anim.active:not(.onboard-center) > *:nth-child(4){ animation-delay:.22s; }
.screen.onboard-anim.active:not(.onboard-center) > *:nth-child(5){ animation-delay:.30s; }
.screen.onboard-anim.active:not(.onboard-center) > *:nth-child(6){ animation-delay:.38s; }
/* the action bar fades only (keeps its centring transform), placed after so it wins */
.screen.onboard-anim.active:not(.onboard-center) > .screen-actions{ animation-name:qFade; }

/* Name screen nests its content inside .onboard-center-body (emoji, h2, p, input) */
.screen.onboard-center.active .onboard-center-body > *{ animation:qRise .5s cubic-bezier(.2,.8,.25,1) both; }
.screen.onboard-center.active .onboard-center-body > *:nth-child(1){ animation:qPop .55s cubic-bezier(.2,.8,.25,1) both; animation-delay:.06s; }
.screen.onboard-center.active .onboard-center-body > *:nth-child(2){ animation-delay:.16s; }
.screen.onboard-center.active .onboard-center-body > *:nth-child(3){ animation-delay:.24s; }
.screen.onboard-center.active .onboard-center-body > *:nth-child(4){ animation-delay:.32s; }
.screen.onboard-center.active > .screen-actions{ animation:qFade .5s cubic-bezier(.2,.8,.25,1) both; animation-delay:.40s; }

@media (prefers-reduced-motion: reduce){
  .screen.onboard-anim.active:not(.onboard-center) > *,
  .screen.onboard-center.active .onboard-center-body > *,
  .screen.onboard-center.active > .screen-actions{ animation:none !important; }
}

/* ── Tablet / landscape: widen the whole app column so every page (not just the
   cook screen) uses the space, instead of a narrow 430px strip with big empty
   sides. Kept to a comfortable reading width, still centred. Cook mode overrides
   this to full-width on its own. ── */
@media (min-width: 768px){
  :root{ --app-w: 600px; }
}

/* ── Kitchen Basics (learn-to-cook) ─────────────────────────────────────────── */
.basics-entry{
  display:flex; align-items:center; gap:14px; width:100%; text-align:left; cursor:pointer;
  margin:6px 0 8px; padding:14px 16px; border-radius:18px;
  background:rgba(216,178,107,0.12); border:1px solid rgba(216,178,107,0.4); color:var(--ink);
  transition:background .15s ease;
}
.basics-entry:active{ background:rgba(216,178,107,0.2); }
.basics-entry-icon{ font-size:26px; line-height:1; flex-shrink:0; }
.basics-entry-text{ flex:1; min-width:0; display:flex; flex-direction:column; }
.basics-entry-title{ font-size:17px; font-weight:700; }
.basics-entry-sub{ font-size:14px; color:var(--ash); margin-top:2px; }
.basics-entry-arrow{ color:var(--ash); flex-shrink:0; }

.basics-cards{ display:flex; flex-direction:column; gap:10px; }
/* Course pages: flat hairline-divided feed rows instead of filled pill cards. */
.course-tabs{ margin:4px 0 8px; }
.course-feed .basics-cards, .flat-feed .basics-cards{ gap:0; }
.course-feed .basics-card, .flat-feed .basics-card{ background:none; border:none; border-radius:0; border-bottom:1px solid var(--line); padding:14px 2px; }
.course-feed .basics-card:last-child, .flat-feed .basics-card:last-child{ border-bottom:none; }
.course-feed .basics-card:active, .flat-feed .basics-card:active{ background:none; opacity:.65; }
.course-feed .basics-card-title, .flat-feed .basics-card-title{ font-size:17px; }
.basics-card{
  display:flex; align-items:center; gap:14px; width:100%; text-align:left; cursor:pointer;
  padding:14px 16px; border-radius:16px; background:var(--glass); border:1px solid var(--line); color:var(--ink);
  transition:background .15s ease, border-color .15s ease;
}
.basics-card:active{ background:var(--line); }
.basics-card-icon{ font-size:26px; line-height:1; flex-shrink:0; width:34px; text-align:center; }
.basics-card-text{ flex:1; min-width:0; display:flex; flex-direction:column; }
.basics-card-title{ font-size:16px; font-weight:600; }
.basics-card-tag{ font-size:14px; color:var(--ash); margin-top:2px; line-height:1.4; }
.basics-card-arrow{ color:var(--ash); flex-shrink:0; }

.basics-steps{ margin:0 0 6px; padding-left:20px; }
.basics-steps li{ font-size:16px; line-height:1.55; margin-bottom:9px; padding-left:2px; }
.basics-tip{
  display:flex; gap:10px; align-items:flex-start; margin-top:14px; padding:12px 14px;
  background:rgba(216,178,107,0.12); border:1px solid rgba(216,178,107,0.4); border-radius:14px;
  font-size:15px; line-height:1.5; color:var(--ink);
}
.basics-tip > span:first-child{ font-size:17px; flex-shrink:0; line-height:1.3; }

/* Lesson, full readable page (replaces the cramped modal) */
#screen-lesson{ padding-bottom:112px; }
/* Left-aligned, consistent sizing so every card in the reader reads like the
   same article, not a huge centred hero followed by tiny centred blocks. */
.lesson-hero{ text-align:left; padding:2px 0 4px; }
.lesson-emoji{
  display:inline-flex; align-items:center; justify-content:center; width:72px; height:72px;
  border-radius:50%; font-size:38px; line-height:1; margin-bottom:14px;
  background:radial-gradient(circle at 50% 42%, rgba(216,178,107,.30), rgba(216,178,107,.08) 62%, transparent 72%);
}
.lesson-title{ font-size:26px; font-weight:800; line-height:1.2; color:var(--ink); margin:0 0 8px; letter-spacing:-0.01em; }
.lesson-tagline{ font-size:17px; line-height:1.5; color:var(--ash); margin:0; max-width:none; text-align:left; }
.lesson-what{ font-size:17px; line-height:1.65; color:var(--ink); margin:22px 0 0; }
.lesson-why{ margin:20px 0 0; padding:16px 18px; border-radius:18px; background:var(--glass); border:1px solid var(--line); }
.lesson-why-label{ display:block; font-size:12px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:#a8763b; margin-bottom:6px; }
.lesson-why p{ font-size:16px; line-height:1.6; color:var(--ink); margin:0; }
.lesson-steps-head{ font-size:22px; font-weight:800; color:var(--ink); margin:34px 0 16px; }
.lesson-steps{ display:flex; flex-direction:column; gap:16px; }
.lesson-step{ display:flex; gap:14px; align-items:flex-start; }
.lesson-step-num{
  flex-shrink:0; width:32px; height:32px; border-radius:50%; background:var(--gold-btn);
  color:#3a2c07; font-size:16px; font-weight:800; display:flex; align-items:center; justify-content:center; margin-top:1px;
}
.lesson-step p{ font-size:17px; line-height:1.6; color:var(--ink); margin:0; padding-top:3px; }
.lesson-tip{
  display:flex; gap:12px; align-items:flex-start; margin:30px 0 0; padding:16px 18px; border-radius:18px;
  background:rgba(216,178,107,.14); border:1px solid rgba(216,178,107,.42);
}
.lesson-tip-icon{ font-size:22px; flex-shrink:0; line-height:1.2; }
.lesson-tip-label{ display:block; font-size:12px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:#a8763b; margin-bottom:4px; }
.lesson-tip p{ font-size:16px; line-height:1.6; color:var(--ink); margin:0; }
/* ── Deeper lesson blocks: diagram, the science, key numbers, sections, refs ── */
.lesson-figure{ margin:26px 0 0; padding:18px; border-radius:20px; background:var(--glass); border:1px solid var(--line); }
.lesson-figure-svg{ width:100%; overflow-x:auto; }
.lesson-figure-svg svg{ display:block; width:100%; height:auto; max-width:520px; margin:0 auto; }
.lesson-figure-cap{ margin:12px 2px 0; font-size:15px; line-height:1.55; color:var(--ash); text-align:left; }
.lesson-science{ margin:24px 0 0; padding:18px 20px; border-radius:18px; background:rgba(96,140,196,.10); border:1px solid rgba(96,140,196,.28); }
.lesson-science-label{ display:block; font-size:12px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:#4b7bb5; margin-bottom:8px; }
.lesson-science p{ font-size:17px; line-height:1.7; color:var(--ink); margin:0 0 10px; }
.lesson-science p:last-child{ margin-bottom:0; }
.lesson-keynums{ margin:24px 0 0; }
.lesson-keynums-label{ display:block; font-size:12px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:#a8763b; margin-bottom:12px; }
.lesson-keynums-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:12px; }
.lesson-keynum{ padding:16px; border-radius:16px; background:var(--glass); border:1px solid var(--line); text-align:center; }
.lesson-keynum-val{ display:block; font-size:26px; font-weight:800; color:var(--ink); line-height:1.15; letter-spacing:-0.01em; }
.lesson-keynum-label{ display:block; font-size:14px; line-height:1.4; color:var(--ash); margin-top:6px; }
.lesson-section{ margin:28px 0 0; }
.lesson-section-head{ font-size:18px; font-weight:800; color:var(--ink); margin:0 0 8px; }
.lesson-section-body{ font-size:16px; line-height:1.7; color:var(--ink); margin:0 0 10px; }
.lesson-refs{ margin:30px 0 0; display:flex; flex-direction:column; gap:10px; }
.lesson-refs-label{ font-size:12px; font-weight:800; letter-spacing:.07em; text-transform:uppercase; color:var(--ash); }
.lesson-ref{ font-size:16px; font-weight:600; color:var(--ink); text-decoration:none; padding:12px 14px; border-radius:14px; background:var(--glass); border:1px solid var(--line); }
.lesson-ref:hover{ border-color:rgba(216,178,107,.5); }
/* ── Paged lesson reader ── */
/* Reading scroll indicator (right edge). Track fades in only on long pages. */
#read-progress{ position:fixed; top:0; right:0; width:4px; height:100vh; z-index:60; background:transparent; opacity:0; transition:opacity .25s ease; pointer-events:none; }
#read-progress.show{ opacity:1; }
#read-progress-fill{ position:absolute; top:0; right:0; width:100%; height:0; background:linear-gradient(180deg, var(--gold-btn)); border-radius:0 0 4px 4px; box-shadow:0 0 8px rgba(216,178,107,0.5); }
/* Blinking caret while an onboarding question types itself out. */
h2.typing::after{ content:'▌'; margin-left:1px; color:#c8a24a; font-weight:400; animation:caretBlink .8s step-end infinite; }
@keyframes caretBlink{ 50%{ opacity:0; } }
@media (prefers-reduced-motion: reduce){ h2.typing::after{ display:none; } }
/* ══════════ Modern motion pack ══════════ */
/* 1) Chef-hat hops as you advance a cook step. */
.progress-hat.hopping{ animation:hatHop .5s cubic-bezier(.34,1.56,.64,1); }
@keyframes hatHop{ 0%{ transform:translate(-50%,-50%) translateY(0) rotate(0); } 40%{ transform:translate(-50%,-50%) translateY(-9px) rotate(-8deg); } 100%{ transform:translate(-50%,-50%) translateY(0) rotate(0); } }
/* 2) List/grid cards fade and rise in, gently staggered. */
.recipe-card, .basics-card, .seasonal-dishcard{ animation:cardIn .34s ease both; }
.recipe-card:nth-child(2), .basics-card:nth-child(2){ animation-delay:.04s; }
.recipe-card:nth-child(3), .basics-card:nth-child(3){ animation-delay:.08s; }
.recipe-card:nth-child(4), .basics-card:nth-child(4){ animation-delay:.12s; }
.recipe-card:nth-child(5), .basics-card:nth-child(5){ animation-delay:.16s; }
.recipe-card:nth-child(6), .basics-card:nth-child(6){ animation-delay:.20s; }
.recipe-card:nth-child(n+7){ animation-delay:.24s; }
@keyframes cardIn{ from{ opacity:0; transform:translateY(8px); } to{ opacity:1; transform:none; } }
/* 3) Timer's-up: a quick red flash + shake, then it settles into the gold pulse. */
.step-card.current.timer-done .timer-ring-box{ animation:timerDoneShake .6s ease both; }
.step-card.current.timer-done .timer-ring-fg{ stroke:#E14B42 !important; animation:timerDoneFlash 1s ease 3; }
@keyframes timerDoneShake{ 0%,100%{transform:translateX(0);} 15%{transform:translateX(-7px);} 30%{transform:translateX(6px);} 45%{transform:translateX(-5px);} 60%{transform:translateX(4px);} 75%{transform:translateX(-2px);} }
@keyframes timerDoneFlash{ 0%,100%{ filter:drop-shadow(0 0 3px rgba(225,75,66,0.4)); } 50%{ filter:drop-shadow(0 0 12px rgba(225,75,66,0.95)); } }
/* 4) Ticking off a prep item: the check pops and the line strikes through. */
.prep-item input:checked{ animation:checkPop .3s cubic-bezier(.34,1.56,.64,1); }
.prep-item input:checked + .prep-item-name{ animation:strikeFade .3s ease both; }
@keyframes checkPop{ 0%{transform:scale(1);} 45%{transform:scale(1.35);} 100%{transform:scale(1);} }
@keyframes strikeFade{ from{ opacity:1; } to{ opacity:.45; } }
/* 5) Roulette wheel blurs slightly while spinning fast, for a sense of speed. */
#wheel.spinning{ filter:blur(1.1px); }
/* 6) Active tab underline grows in from the centre instead of snapping. */
.underline-tab.active::after{ animation:underlineIn .28s cubic-bezier(.2,.8,.2,1); transform-origin:center; }
@keyframes underlineIn{ from{ transform:scaleX(0); opacity:.4; } to{ transform:scaleX(1); opacity:1; } }
/* 7) Skeleton shimmer for loading placeholders. */
.skeleton{ position:relative; overflow:hidden; background:var(--glass-strong); border-radius:16px; }
.skeleton::after{ content:''; position:absolute; inset:0; transform:translateX(-100%); background:linear-gradient(90deg, transparent, rgba(255,255,255,0.14), transparent); animation:shimmer 1.3s infinite; }
@keyframes shimmer{ 100%{ transform:translateX(100%); } }
@media (prefers-reduced-motion: reduce){
  .progress-hat.hopping, .recipe-card, .basics-card, .seasonal-dishcard,
  .step-card.current.timer-done .timer-ring-box, .step-card.current.timer-done .timer-ring-fg,
  .prep-item input:checked, .prep-item input:checked + .prep-item-name,
  .underline-tab.active::after, .skeleton::after{ animation:none !important; }
  #wheel.spinning{ filter:none; }
}
/* ── Explore feed rows (reference-style: eyebrow + name + meta, thumb on right) ── */
.dish-feed{ display:flex; flex-direction:column; }
.dish-row{ display:flex; align-items:center; gap:14px; padding:16px 2px; border-bottom:1px solid var(--line); cursor:pointer; }
.dish-row:last-child{ border-bottom:none; }
.dish-row:active{ opacity:.75; }
.dish-row-body{ flex:1; min-width:0; }
.dish-row-eyebrow{ font-size:12px; font-weight:800; letter-spacing:.05em; color:#a8763b; margin-bottom:5px; }
.dish-row-name{ font-size:19px; font-weight:700; color:var(--ink); line-height:1.25; margin-bottom:5px; }
.dish-row-meta{ font-size:14px; color:var(--ash); }
.dish-row-flag{ color:#c0552f; font-weight:600; }
.dish-row-thumb{ position:relative; width:78px; height:78px; border-radius:16px; overflow:hidden; flex-shrink:0;
  background:linear-gradient(140deg,rgba(216,178,107,0.18),rgba(95,227,211,0.08)),var(--obsidian-2);
  display:flex; align-items:center; justify-content:center; }
.dish-row-thumb img{ width:100%; height:100%; object-fit:cover; display:block; }
.dish-row-fallback{ font-size:34px; line-height:1; }
.dish-row-lock{ position:absolute; inset:0; background:rgba(0,0,0,.34); display:flex; align-items:center; justify-content:center; font-size:22px; }
.dish-row-heart{ position:absolute; top:3px; right:3px; width:26px; height:26px; padding:0; border:none; border-radius:50%;
  background:rgba(0,0,0,0.32); backdrop-filter:blur(4px); display:flex; align-items:center; justify-content:center; cursor:pointer; }
.dish-row-heart svg{ width:15px; height:15px; }
/* Explore top search pill (Airbnb "Start your search") */
.explore-top-search{ padding:6px 0 12px; }
.explore-search-pill{ display:flex; align-items:center; gap:12px; width:100%; padding:15px 18px; border-radius:99px;
  background:var(--obsidian-2); border:1px solid var(--line); box-shadow:0 3px 12px rgba(0,0,0,0.06);
  color:var(--ash); font-size:17px; font-weight:600; cursor:pointer; }
.explore-search-pill svg{ color:var(--ink); flex-shrink:0; }
/* Explore cuisine rows (horizontal scroll, "view more") */
.cuisine-section{ margin:22px 0 4px; }
.cuisine-section-head{ display:flex; align-items:center; justify-content:space-between; margin-bottom:12px; }
.cuisine-section-head h3{ font-size:22px; font-weight:800; color:var(--ink); margin:0; letter-spacing:-0.01em; }
.cuisine-more{ display:flex; align-items:center; justify-content:center; width:34px; height:34px; border-radius:50%;
  background:var(--glass); border:1px solid var(--line); color:var(--ink); cursor:pointer; flex-shrink:0; }
.cuisine-row{ display:flex; gap:14px; overflow-x:auto; padding-bottom:6px; scrollbar-width:none; -webkit-overflow-scrolling:touch; }
.cuisine-row::-webkit-scrollbar{ display:none; }
.dish-hcard{ flex:0 0 auto; width:168px; cursor:pointer; }
.dish-hcard-img{ position:relative; width:168px; height:168px; border-radius:18px; overflow:hidden;
  background:linear-gradient(140deg,rgba(216,178,107,0.18),rgba(95,227,211,0.08)),var(--obsidian-2);
  display:flex; align-items:center; justify-content:center; }
.dish-hcard-img img{ width:100%; height:100%; object-fit:cover; display:block; }
.dish-hcard-fallback{ font-size:52px; line-height:1; }
.dish-hcard-heart{ position:absolute; top:8px; right:8px; width:30px; height:30px; padding:0; border:none; border-radius:50%;
  background:rgba(0,0,0,0.32); backdrop-filter:blur(4px); display:flex; align-items:center; justify-content:center; cursor:pointer; }
.dish-hcard-heart svg{ width:16px; height:16px; }
.dish-hcard-lock{ position:absolute; inset:0; background:rgba(0,0,0,.34); display:flex; align-items:center; justify-content:center; font-size:26px; }
.dish-hcard-title{ font-size:16px; font-weight:700; color:var(--ink); margin:9px 2px 2px; line-height:1.25; }
.dish-hcard-meta{ font-size:14px; color:var(--ash); margin:0 2px; }
/* Collapsible filter cards in the search sheet (Airbnb When?/Who? style) */
.fcard{ padding:0 !important; overflow:hidden; }
.fcard-head{ display:flex; align-items:center; gap:10px; width:100%; padding:18px 20px; background:none; border:none; cursor:pointer; text-align:left; font-family:inherit; }
.fcard-title{ font-size:17px; font-weight:700; color:var(--ink); }
.fcard-summary{ flex:1; text-align:right; font-size:15px; color:var(--ash); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.fcard-chevron{ color:var(--ash); flex-shrink:0; transition:transform .2s ease; }
.fcard.open .fcard-chevron{ transform:rotate(180deg); }
.fcard-body{ display:none; padding:0 20px 18px; }
.fcard.open .fcard-body{ display:block; }
.fcard.open .fcard-summary{ visibility:hidden; }
/* Suggested-dishes list cropped to ~2.5 rows so it's clear there's more to scroll */
.search-suggest-scroll{ max-height:172px; overflow-y:auto; -webkit-overflow-scrolling:touch; }
.search-section-label{ font-size:14px; font-weight:700; color:var(--ash); padding:14px 2px 6px; }
/* ── Airbnb-style notice / confirm modal ── */
.app-modal{ position:fixed; inset:0; z-index:400; display:none; align-items:center; justify-content:center; padding:24px; background:rgba(0,0,0,0.42); }
.app-modal.show{ display:flex; animation:appModalFade .2s ease; }
@keyframes appModalFade{ from{opacity:0;} to{opacity:1;} }
/* Centered floating card (Instagram-style alert): fully rounded, a clear top AND
   bottom, never flush to the screen edge, and it scrolls inside itself if tall. */
.app-modal-card{ width:100%; max-width:360px; max-height:calc(100vh - 48px); overflow-y:auto;
  background:var(--obsidian-2); border-radius:24px;
  padding:26px 24px 22px; position:relative; text-align:center;
  box-shadow:0 18px 60px rgba(0,0,0,0.32); animation:appSheetUp .28s cubic-bezier(.2,.8,.2,1); }
@keyframes appSheetUp{ from{ transform:translateY(14px) scale(0.96); opacity:0; } to{ transform:none; opacity:1; } }
.app-modal-close{ position:absolute; top:16px; right:16px; width:34px; height:34px; border-radius:50%;
  background:var(--glass); border:none; color:var(--ink); font-size:16px; cursor:pointer; display:flex; align-items:center; justify-content:center; }
.app-modal-hero{ font-size:58px; line-height:1; margin:26px 0 24px; }
.app-modal-hero:empty{ display:none; }
.app-modal-hero:empty + .app-modal-title{ margin-top:20px; }
.app-modal-title{ font-size:24px; font-weight:800; color:var(--ink); margin:0 0 10px; line-height:1.25; letter-spacing:-0.01em; }
.app-modal-msg{ font-size:17px; line-height:1.55; color:var(--ash); margin:0 auto 24px; max-width:22em; }
.app-modal-msg:empty{ display:none; }
.app-modal-title:empty{ display:none; }
.app-modal-actions{ display:flex; flex-direction:column; gap:10px; }
.app-modal-btn{ width:100%; padding:16px; border-radius:16px; font-size:17px; font-weight:700; cursor:pointer; border:none; font-family:inherit; }
.app-modal-btn.primary{ background:var(--ink); color:var(--obsidian-2); }
.app-modal-btn.danger{ background:#E14B42; color:#fff; }
.app-modal-btn.ghost{ background:none; color:var(--ink); }
.app-modal-btn:active{ transform:scale(.99); }
/* Sticker price-tag: a peeled-sticker look for a tag/badge. */
.sticker-tag{ position:relative; display:inline-flex; align-items:center; gap:6px; padding:5px 12px 5px 22px;
  background:var(--gold-btn); color:#3a2c07; font-weight:800; font-size:13px; border-radius:6px 14px 14px 6px;
  transform:rotate(-3deg); box-shadow:0 3px 8px rgba(0,0,0,0.18); }
.sticker-tag::before{ content:''; position:absolute; left:8px; top:50%; transform:translateY(-50%); width:7px; height:7px;
  border-radius:50%; background:var(--obsidian-2); box-shadow:inset 0 0 0 1.5px rgba(58,44,7,0.55); }
/* Cooking animation for the "You're all set" screen: a sizzling pan with steam. */
.cook-anim{ position:relative; display:inline-block; }
.cook-anim-pan{ display:inline-block; animation:panSizzle 1.5s ease-in-out infinite; transform-origin:60% 80%; }
@keyframes panSizzle{ 0%,100%{ transform:rotate(-7deg) translateY(0); } 50%{ transform:rotate(7deg) translateY(-4px); } }
.cook-anim-steam, .cook-anim-steam::before, .cook-anim-steam::after{
  content:''; position:absolute; width:9px; height:9px; border-radius:50%;
  background:radial-gradient(circle, rgba(150,150,150,0.45), rgba(150,150,150,0) 70%);
}
.cook-anim-steam{ left:42%; top:-6px; animation:steamRise 2.2s ease-in-out infinite; }
.cook-anim-steam::before{ left:-14px; top:2px; animation:steamRise 2.2s ease-in-out infinite .5s; }
.cook-anim-steam::after{ left:14px; top:2px; animation:steamRise 2.2s ease-in-out infinite 1.1s; }
@keyframes steamRise{
  0%{ opacity:0; transform:translateY(10px) scale(0.7); }
  35%{ opacity:0.7; }
  100%{ opacity:0; transform:translateY(-22px) scale(1.2); }
}
@media (prefers-reduced-motion: reduce){ .cook-anim-pan, .cook-anim-steam, .cook-anim-steam::before, .cook-anim-steam::after{ animation:none; } .cook-anim-steam{ display:none; } }
.lesson-progress{ height:6px; border-radius:99px; background:var(--line); overflow:hidden; margin:12px 0 10px; }
.lesson-progress-fill{ height:100%; border-radius:99px; background:var(--gold-btn); transition:width .32s cubic-bezier(.4,0,.2,1); }
.lesson-progress-label{ font-size:13px; font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--ash); margin-bottom:14px; }
.lesson-page{ animation:lessonPageIn .34s cubic-bezier(.2,.7,.3,1); min-height:40vh; }
@keyframes lessonPageIn{ from{ opacity:0; transform:translateX(14px); } to{ opacity:1; transform:none; } }
/* Buttons live in a fixed bottom bar so they're always in the SAME place, on
   every lesson and course, no matter how long the card is (no mid-page float,
   no dead space below the button). Content scrolls above it. */
.lesson-nav, .lesson-foot{
  position:fixed; left:50%; bottom:0; transform:translateX(-50%);
  width:100%; max-width:var(--app-w); z-index:50; margin:0;
  display:flex; gap:12px; align-items:center;
  padding:14px 20px calc(14px + env(safe-area-inset-bottom, 0px));
  background:var(--obsidian-2); border-top:1px solid var(--line);
}
.lesson-nav-back{ flex:0 0 auto; padding:14px 20px; border-radius:99px; border:1px solid var(--line); background:var(--glass); color:var(--ink); font-size:16px; font-weight:700; cursor:pointer; }
.lesson-nav-back:disabled{ opacity:0; pointer-events:none; }
.lesson-nav-next{ flex:1 1 auto; padding:15px 20px; border-radius:99px; border:none; background:var(--gold-btn); color:#3a2c07; font-size:17px; font-weight:800; cursor:pointer; }
.lesson-nav-next:active{ transform:translateY(1px); }
.lesson-foot .btn{ flex:1 1 auto; }
.lesson-finish{ text-align:center; margin:30px 0 0; padding:24px; border-radius:20px; background:var(--glass); border:1px solid var(--line); }
.lesson-finish-emoji{ font-size:40px; display:block; margin-bottom:10px; }
.lesson-finish p{ font-size:17px; line-height:1.6; color:var(--ink); margin:0; }

/* Beginner course, Foundations of Cooking */
.course-entry{ background:var(--gold-btn); border-color:transparent; }
.course-entry .basics-entry-title,
.course-entry .basics-entry-sub{ color:#3a2c07; }
.course-entry .basics-entry-arrow{ color:#3a2c07; }
/* Course progress */
.course-progress{ margin:0 0 8px; }
.course-progress-head{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:8px; }
.course-progress-count{ font-size:15px; font-weight:700; color:var(--ink); }
.course-progress-pct{ font-size:15px; font-weight:800; color:#a8763b; }
.course-progress-track{ height:8px; border-radius:999px; background:var(--glass-strong); overflow:hidden; }
.course-progress-fill{ height:100%; border-radius:999px; background:var(--gold-btn); transition:width .5s cubic-bezier(.2,.8,.2,1); }
.course-progress-done{ margin-top:10px; font-size:15px; font-weight:700; color:var(--ink); }
.course-mod-num.done{ background:#2f9e44; color:#fff; }
.basics-card-check{ flex-shrink:0; width:24px; height:24px; border-radius:50%; background:#2f9e44; color:#fff; font-size:14px; font-weight:800; display:flex; align-items:center; justify-content:center; }
.basics-card.viewed{ border-color:rgba(47,158,68,.35); }

/* A course module is a SECTION, not a box: separated by a hairline + whitespace,
   so the lesson/dish cards inside sit at a single, airy level (Airbnb-style). */
.course-module{ padding-top:28px; margin-top:28px; border-top:1px solid var(--line); }
.course-module:first-child{ padding-top:6px; margin-top:0; border-top:none; }
.course-mod-head{ display:flex; align-items:center; gap:11px; }
.course-mod-num{
  flex-shrink:0; width:28px; height:28px; border-radius:50%;
  background:var(--gold-btn); color:#3a2c07; font-size:15px; font-weight:800;
  display:flex; align-items:center; justify-content:center;
}
.course-mod-emoji{ font-size:24px; line-height:1; flex-shrink:0; }
.course-mod-title{ font-size:22px; font-weight:800; color:var(--ink); line-height:1.25; }
.course-mod-blurb{ font-size:16px; line-height:1.55; color:var(--ash); margin:10px 0 18px; }
.course-step-label{
  font-size:13px; font-weight:700; letter-spacing:0.07em; text-transform:uppercase;
  color:var(--ash); margin:0 0 12px;
}
.course-step-label .step-count{ color:var(--gold-ink, #a8763b); }
/* 'Now cook' dishes reuse the same .basics-card row style as the 'Learn' items
   for one consistent, clearly-tappable rhythm within a module. */
.course-pro-badge{
  display:inline-block; margin-left:6px; padding:1px 7px; border-radius:999px;
  background:var(--gold-btn); color:#3a2c07; font-size:11px; font-weight:800;
  letter-spacing:0.04em; vertical-align:middle;
}
.course-locked{
  border:1px solid var(--line); border-radius:22px; padding:26px 20px; text-align:center;
  background:var(--glass);
}
.course-locked-icon{ font-size:34px; }
.course-locked-title{ font-size:20px; font-weight:800; color:var(--ink); margin:8px 0 6px; }
.course-locked-sub{ font-size:15px; line-height:1.55; color:var(--ash); margin:0 auto 18px; max-width:32em; }
.course-teaser-row{ display:flex; align-items:center; gap:10px; padding:8px 0; }
.course-teaser-num{
  flex-shrink:0; width:24px; height:24px; border-radius:50%;
  background:var(--glass-strong); color:var(--ash); font-size:13px; font-weight:700;
  display:flex; align-items:center; justify-content:center;
}
.course-teaser-emoji{ font-size:20px; flex-shrink:0; }
.course-teaser-title{ font-size:16px; font-weight:600; color:var(--ink); }

/* Explore, 'in season now' banner */
.seasonal-banner{ border:1px solid var(--line); border-radius:18px; padding:14px 16px; margin:0 0 14px; background:var(--glass); }
.seasonal-head{ font-size:17px; font-weight:800; color:var(--ink); margin-bottom:10px; }
.seasonal-produce{ display:flex; flex-wrap:wrap; gap:8px; }
.seasonal-chip{ font-size:14px; font-weight:600; color:var(--ink); background:var(--glass-strong); border:1px solid var(--line); border-radius:999px; padding:5px 11px; }
.seasonal-sub{ font-size:13px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--ash); margin:14px 0 8px; }
.seasonal-dishes{ display:flex; flex-wrap:wrap; gap:8px; }
/* Keep the fresh-dish cards in one horizontal scroll row so the seasonal banner
   stays compact and browsing (search + full grid) starts higher up the page. */
.seasonal-dishes.hscroll{ flex-wrap:nowrap; }
.seasonal-dish{ display:inline-flex; align-items:center; gap:7px; font-size:14px; font-weight:600; color:var(--ink); background:var(--glass-strong); border:1px solid var(--line); border-radius:999px; padding:7px 13px; cursor:pointer; }
.seasonal-dish:active{ background:var(--line); }
.seasonal-dish span{ font-size:17px; }
/* Compact seasonal strip (Explore) */
.seasonal-month{ color:var(--ash); font-weight:600; }
.hscroll{ display:flex; gap:12px; overflow-x:auto; padding-bottom:4px; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.hscroll::-webkit-scrollbar{ display:none; }
.seasonal-produce.hscroll{ margin-top:2px; flex-wrap:nowrap; }

/* Onboarding "pick one" options: full-width stacked rows, all the same size,
   so they line up cleanly instead of ragged, uneven pills piled to one side. */
.choice-list{ display:flex; flex-direction:column; gap:12px; }
.choice-row{ display:flex; align-items:center; gap:14px; width:100%; padding:17px 20px; border-radius:18px; background:var(--glass); border:1px solid var(--line); color:var(--ink); font-family:inherit; font-size:18px; font-weight:700; cursor:pointer; text-align:left; transition:border-color .15s, background .15s, transform .1s; }
.choice-row:active{ transform:scale(.99); }
.choice-emoji{ font-size:22px; line-height:1; flex:0 0 auto; }
.choice-label{ flex:1 1 auto; }
.choice-check{ flex:0 0 auto; font-weight:800; }
.choice-row.selected{ background:var(--gold-btn); border-color:transparent; color:#3a2c07; }
.choice-row.selected .choice-check{ color:#3a2c07; }
.seasonal-prod{ flex:0 0 auto; display:flex; flex-direction:column; align-items:center; gap:5px; font-size:13px; font-weight:600; color:var(--ink); width:62px; text-align:center; }
.seasonal-prod-emoji{ font-size:30px; line-height:1; }
.seasonal-dishcard{ flex:0 0 auto; width:132px; display:flex; flex-direction:column; align-items:flex-start; gap:10px; padding:14px; border:1px solid var(--line); border-radius:16px; background:var(--glass-strong); cursor:pointer; text-align:left; }
.seasonal-dishcard:active{ background:var(--line); }
.seasonal-dishcard-emoji{ font-size:30px; line-height:1; }
.seasonal-dishcard-name{ font-size:14px; font-weight:600; color:var(--ink); line-height:1.35; }

/* Food anatomy, cut explorer */
.anat-tabs{ display:flex; gap:8px; overflow-x:auto; padding-bottom:4px; margin-bottom:18px; }
.anat-tab{ display:flex; flex-direction:column; align-items:center; gap:4px; flex:0 0 auto; padding:9px 14px; border:1px solid var(--line); border-radius:16px; background:var(--glass); cursor:pointer; font-size:13px; font-weight:700; color:var(--ash); }
.anat-tab.selected{ border-color:transparent; background:var(--gold-btn); color:#3a2c07; }
.anat-tab-emoji{ font-size:26px; line-height:1; }
/* Illustrated butcher-chart figure: an original silhouette with tappable cut regions */
.anat-figure{ padding:10px 0 4px; margin-bottom:6px; }
.anat-svg{ width:100%; height:auto; display:block; overflow:visible; }
.anat-body{ fill:#d6b892; stroke:none; }               /* the animal body (tan) */
.anat-deco > *{ fill:#c39f74; }                          /* head, legs, tail behind */
.anat-hoof{ fill:#00000038; }                            /* hooves, eyes, nostrils */
.anat-body-line{ fill:none; stroke:#8a6a45; stroke-width:2.4; stroke-linejoin:round; }
.anat-region{ cursor:pointer; }
.anat-zone{ fill:rgba(255,255,255,.16); stroke:#ffffff; stroke-width:1.6; transition:fill .15s ease; }
.anat-region:active .anat-zone{ fill:rgba(216,178,107,.55); }
.anat-region.selected .anat-zone{ fill:#D8B26B; stroke:#ffffff; stroke-width:2.2; }
.anat-zone-label{ font:800 11px 'Sora',sans-serif; fill:#5a4423; text-anchor:middle; paint-order:stroke; stroke:#ffffffbb; stroke-width:2.6px; }
.anat-zone-label.selected{ fill:#3a2c07; stroke:#ffffff; }
.anat-hint{ font-size:13px; color:var(--ash); text-align:center; margin:0 0 14px; }
.anat-fact{ display:flex; gap:10px; font-size:14px; line-height:1.5; margin:3px 0; color:var(--ink); }
.anat-fact span{ color:var(--ash); font-weight:700; min-width:112px; flex-shrink:0; }

/* Cook's Notebook */
.nb-textarea{ width:100%; resize:vertical; min-height:70px; font-family:inherit; font-size:16px; line-height:1.5; }
.nb-entry{ border:1px solid var(--line); border-radius:16px; padding:12px 14px; margin-bottom:10px; background:var(--glass); }
.nb-entry-head{ display:flex; align-items:center; justify-content:space-between; margin-bottom:6px; }
.nb-date{ font-size:13px; font-weight:700; color:var(--ash); }
.nb-del{ border:none; background:none; color:var(--ash); font-size:16px; cursor:pointer; line-height:1; padding:2px 4px; }
.nb-del:active{ color:var(--ink); }
.nb-text{ font-size:16px; line-height:1.55; color:var(--ink); white-space:pre-wrap; word-break:break-word; }
.nb-recipe-note{ display:flex; align-items:flex-start; gap:12px; width:100%; text-align:left; padding:12px 14px; border:1px solid var(--line); border-radius:16px; background:var(--glass-strong); cursor:pointer; margin-bottom:10px; }
.nb-recipe-note:active{ background:var(--line); }
.nb-rn-emoji{ font-size:24px; line-height:1; flex-shrink:0; }
.nb-rn-body{ display:flex; flex-direction:column; min-width:0; }
.nb-rn-name{ font-size:15px; font-weight:700; color:var(--ink); }
.nb-rn-note{ font-size:15px; color:var(--ash); line-height:1.5; margin-top:2px; }

/* Profile: nutrition dashboard + course rows */
.dash-card{ display:block; width:100%; text-align:left; border:none; border-radius:20px; padding:18px 20px; cursor:pointer; background:var(--gold-btn); color:#3a2c07; margin-bottom:10px; }
.dash-head{ display:flex; align-items:baseline; justify-content:space-between; }
.dash-title{ font-size:14px; font-weight:800; letter-spacing:.04em; text-transform:uppercase; }
.dash-edit{ font-size:14px; font-weight:700; opacity:.8; }
.dash-cal{ font-size:38px; font-weight:800; line-height:1.05; margin:8px 0 10px; }
.dash-cal span{ font-size:16px; font-weight:600; }
.dash-macros{ display:flex; gap:16px; flex-wrap:wrap; font-size:15px; }
.dash-macros b{ font-weight:800; }
.dash-goal{ font-size:14px; font-weight:700; opacity:.85; margin-top:8px; }
.dash-cta, .dash-next{ display:flex; align-items:center; gap:14px; width:100%; text-align:left; padding:16px 18px; border:1px solid var(--line); border-radius:18px; background:var(--glass); cursor:pointer; }
.dash-cta:active, .dash-next:active{ background:var(--line); }
.dash-cta-icon{ font-size:26px; flex-shrink:0; }
.dash-cta-body, .dash-next-body{ flex:1; min-width:0; display:flex; flex-direction:column; }
.dash-cta-title{ font-size:17px; font-weight:700; color:var(--ink); }
.dash-cta-sub{ font-size:14px; color:var(--ash); margin-top:2px; }
.dash-cta-arrow, .course-row-arrow{ font-size:24px; color:var(--ash); flex-shrink:0; line-height:1; }
.dash-next-emoji{ font-size:28px; flex-shrink:0; }
.dash-next-label{ font-size:13px; font-weight:700; color:var(--ash); text-transform:uppercase; letter-spacing:.03em; }
.dash-next-name{ font-size:17px; font-weight:700; color:var(--ink); margin-top:2px; }
.course-row{ display:flex; align-items:center; gap:14px; width:100%; text-align:left; padding:14px 16px; border:1px solid var(--line); border-radius:18px; background:var(--glass); cursor:pointer; margin-bottom:10px; }
.course-row:active{ background:var(--line); }
.course-row-emoji{ font-size:28px; flex-shrink:0; }
.course-row-body{ flex:1; min-width:0; display:flex; flex-direction:column; gap:6px; }
.course-row-name{ font-size:17px; font-weight:700; color:var(--ink); }
.course-row-sub{ font-size:14px; color:var(--ash); }
.course-row-track{ height:6px; border-radius:999px; background:var(--glass-strong); overflow:hidden; }
.course-row-fill{ display:block; height:100%; border-radius:999px; background:var(--gold-btn); }

/* Calorie & macro calculator */
.calc-field-label{ font-size:14px; font-weight:700; color:var(--ink); margin:18px 0 8px; }
.chip-row.calc-wrap{ flex-wrap:wrap; }
.calc-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:10px; }
.calc-grid-2{ grid-template-columns:repeat(2,1fr); }
.calc-input-wrap{ display:flex; flex-direction:column; gap:5px; font-size:13px; font-weight:700; color:var(--ash); }
.calc-input-wrap .field-input{ width:100%; }
.calc-cal{ font-size:40px; font-weight:800; color:var(--ink); line-height:1; }
.calc-cal span{ font-size:16px; font-weight:600; color:var(--ash); }
.calc-macros{ display:flex; gap:10px; margin-top:16px; }
.calc-macro{ flex:1; display:flex; flex-direction:column; align-items:center; gap:3px; padding:14px 6px; border:1px solid var(--line); border-radius:16px; background:var(--glass); }
.calc-m-n{ font-size:22px; font-weight:800; color:var(--ink); }
.calc-m-l{ font-size:13px; font-weight:700; color:var(--ash); }
.calc-bf{ margin-top:14px; padding:12px 14px; border-radius:14px; background:rgba(216,178,107,.14); border:1px solid rgba(216,178,107,.4); font-size:15px; line-height:1.55; color:var(--ink); }
.calc-disclaimer{ margin-top:16px; font-size:13px; line-height:1.55; color:var(--ash); }
.calc-sugg-label{ font-size:14px; font-weight:700; color:var(--ink); margin:22px 0 10px; }
.calc-sugg{ display:flex; flex-direction:column; gap:8px; }
.calc-sugg-dish{ display:flex; align-items:center; gap:12px; width:100%; text-align:left; padding:11px 14px; border:1px solid var(--line); border-radius:14px; background:var(--glass-strong); cursor:pointer; }
.calc-sugg-dish:active{ background:var(--line); }
.calc-sugg-emoji{ font-size:24px; line-height:1; flex-shrink:0; }
.calc-sugg-body{ display:flex; flex-direction:column; min-width:0; }
.calc-sugg-name{ font-size:15px; font-weight:700; color:var(--ink); }
.calc-sugg-macro{ font-size:13px; color:var(--ash); margin-top:1px; }
.anat-cutlist{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:18px; }
.anat-cut{ display:inline-flex; align-items:center; gap:8px; padding:8px 13px; border:1px solid var(--line); border-radius:999px; background:var(--glass); cursor:pointer; font-size:14px; font-weight:600; color:var(--ink); }
.anat-cut.selected{ border-color:transparent; background:var(--gold-btn); color:#3a2c07; }
.anat-cut-num{ display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; border-radius:50%; background:rgba(0,0,0,.08); font-size:12px; font-weight:800; }
.anat-detail{ border:1px solid var(--line); border-radius:18px; padding:16px; background:var(--glass); }
.anat-detail-title{ font-size:20px; font-weight:800; color:var(--ink); }
.anat-detail-method{ font-size:14px; font-weight:700; color:var(--gold-ink,#a8763b); margin:4px 0 8px; }
.anat-detail-note{ font-size:15px; line-height:1.55; color:var(--ash); margin:0 0 14px; }
.anat-detail-sub{ font-size:13px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--ash); margin:0 0 8px; }
.anat-dishes{ display:flex; flex-wrap:wrap; gap:8px; }
