/* ─────────────────────────────────────────────────────────────────────────────
   Recept — Maison Noir
   Dark restaurant cellar: deep coffee bg, oxidized brass gold, burgundy 2nd.
   ───────────────────────────────────────────────────────────────────────────── */

:root{
  --bg:        #0c0907;
  --bg-2:      #100c08;
  --surface:   #15110b;
  --surface-2: #1b1610;
  --surface-3: #221c14;
  --raise:     #2a2218;
  --border:    #2b231a;
  --border-2:  #3a3024;
  --hairline:  #1f1a13;

  --text:      #ece4d3;
  --text-2:    #c5b9a1;
  --dim:       #968874;
  --faint:     #5a5042;
  --faintest:  #3c352b;

  --gold:      #d4a847;   /* oxidized brass */
  --gold-2:    #b9913a;
  --gold-soft: #8b6d2a;
  --gold-glow: rgba(212,168,71,.18);

  --burgundy:  #8e2727;
  --burgundy-2:#6b1d1d;

  --olive:     #6b6b1f;
  --slate:     #2b3540;

  --rad-xs: 3px;
  --rad-s:  6px;
  --rad-m:  10px;
  --rad-l:  18px;

  --font-serif: "Cormorant Garamond", "EB Garamond", Georgia, serif;
  --font-sans:  "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  --font-mono:  "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;

  --sidebar-w: 232px;
  --topbar-h: 64px;

  /* density-controlled */
  --pad-card: 18px;
  --gap-grid: 22px;
  --card-h: 320px;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Light theme — warm paper / cream. Toggled via Settings (body[data-theme]).
   Accent (--gold*) is set inline on <html> by JS and works on both themes.
   ───────────────────────────────────────────────────────────────────────────── */
body[data-theme="light"]{
  color-scheme: light;

  --bg:        #efe7d8;
  --bg-2:      #e9e0cf;
  --surface:   #fbf6ec;
  --surface-2: #f4eee0;
  --surface-3: #ece3d1;
  --raise:     #e3d8c0;
  --border:    #d6cab0;
  --border-2:  #c5b698;
  --hairline:  #e8e0cf;

  --text:      #29211a;
  --text-2:    #514636;
  --dim:       #7c715a;
  --faint:     #a99c80;
  --faintest:  #cabfa3;
}
/* Dark-only white overlays read as invisible on light — re-tint the common
   hover/scrim cases so light mode stays legible without a full audit. */
body[data-theme="light"] .profile-pill:hover,
body[data-theme="light"] .nav-item:hover,
body[data-theme="light"] .bn-item:hover{ background:rgba(0,0,0,.05) }
body[data-theme="light"] .modal-back,
body[data-theme="light"] .nav-drawer-back{ background:rgba(40,33,24,.45) }
/* Mobile bottom-nav hardcodes a dark frosted bg (see .bottom-nav below) — that
   color is theme-blind, so on light mode it stayed dark. Re-tint to the light
   --bg at the same 0.92 alpha so the frosted blur matches the rest of the UI. */
body[data-theme="light"] .bottom-nav{ background:rgba(239, 231, 216, .92) }

[data-density="compact"]{
  --pad-card: 12px;
  --gap-grid: 14px;
  --card-h: 240px;
}
[data-density="spacious"]{
  --pad-card: 26px;
  --gap-grid: 32px;
  --card-h: 380px;
}

*{box-sizing:border-box;margin:0;padding:0}
html, body{height:100%}
body{
  background:var(--bg);
  color:var(--text);
  font-family:var(--font-sans);
  font-size:14px;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow:hidden;
}

/* gentle grain on bg */
body::before{
  content:""; position:fixed; inset:0; pointer-events:none; z-index:1;
  background-image:
    radial-gradient(at 20% 0%, rgba(212,168,71,.04), transparent 50%),
    radial-gradient(at 100% 100%, rgba(142,39,39,.05), transparent 50%);
  mix-blend-mode:screen;
}

::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:#2a2218;border-radius:6px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:#3a3024;background-clip:padding-box}

button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
input,textarea,select{font:inherit;color:inherit}

/* ─────────────────────────────────────────────────────────────────────────────
   Layout shell
   ───────────────────────────────────────────────────────────────────────────── */
.app{
  display:grid;
  grid-template-columns: var(--sidebar-w) 1fr;
  height:100vh; width:100vw;
  position:relative; z-index:2;
}

.sidebar{
  background:var(--bg-2);
  border-right:1px solid var(--hairline);
  display:flex; flex-direction:column;
  padding:22px 14px 14px;
  position:relative;
}
.sidebar::after{
  content:""; position:absolute; top:24px; bottom:24px; right:-1px; width:1px;
  background:linear-gradient(to bottom, transparent, var(--gold-soft) 40%, var(--gold-soft) 60%, transparent);
  opacity:.25;
}

.brand{
  display:flex; align-items:center; gap:10px;
  padding: 4px 8px 22px;
  border-bottom:1px solid var(--hairline);
  margin-bottom:18px;
}
.brand-mark{
  width:30px; height:30px; border-radius:50%;
  background:radial-gradient(circle at 30% 30%, var(--gold), var(--gold-soft) 70%, #4a3a18);
  position:relative;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.15), 0 2px 8px rgba(212,168,71,.25);
}
.brand-mark::after{
  content:""; position:absolute; inset:6px;
  border-radius:50%; border:1px solid rgba(0,0,0,.4);
}
.brand-name{
  font-family:var(--font-serif);
  font-size:22px; font-weight:500;
  letter-spacing:0.06em;
  font-style:italic;
}
.brand-name b{font-style:normal;font-weight:600;color:var(--gold)}

.nav{display:flex;flex-direction:column;gap:2px}
.nav-item{
  display:flex; align-items:center; gap:11px;
  padding:9px 12px; border-radius:var(--rad-s);
  color:var(--text-2); font-size:13.5px; font-weight:500;
  letter-spacing:.005em;
  transition:background .15s, color .15s;
  text-align:left; width:100%; position:relative;
}
.nav-item:hover{background:rgba(255,255,255,.03); color:var(--text)}
.nav-item.active{
  background:linear-gradient(90deg, rgba(212,168,71,.10), transparent);
  color:var(--text);
}
.nav-item.active::before{
  content:""; position:absolute; left:0; top:8px; bottom:8px; width:2px;
  background:var(--gold); border-radius:0 2px 2px 0;
}
.nav-item .ic{width:14px;height:14px;flex-shrink:0;opacity:.7}
.nav-item.active .ic{opacity:1; color:var(--gold)}
.nav-badge{
  margin-left:auto; font-family:var(--font-mono);
  font-size:10px; padding:2px 5px; border-radius:9px;
  background:var(--burgundy); color:#fff;
}

.sidebar-section{
  margin-top:24px; padding:0 12px 6px;
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.18em; text-transform:uppercase;
  color:var(--faint);
}

.sidebar-foot{
  margin-top:auto; padding-top:12px;
  border-top:1px solid var(--hairline);
}
.sidebar-logout{
  width:100%; justify-content:center; gap:8px; margin-bottom:10px;
}
.profile-pill{
  display:flex; align-items:center; gap:10px;
  padding:8px 10px; border-radius:var(--rad-s);
}
.profile-pill:hover{background:rgba(255,255,255,.03)}
.profile-pill .nm{font-size:13px; font-weight:500}
.profile-pill .hd{font-family:var(--font-mono); font-size:10px; color:var(--dim)}

/* ─────────────────────────────────────────────────────────────────────────────
   Avatars
   ───────────────────────────────────────────────────────────────────────────── */
.avatar{
  width:28px; height:28px; border-radius:50%; flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
  font-family:var(--font-serif); font-size:13px; font-weight:600;
  color:#15110b; letter-spacing:.02em;
  border:1px solid rgba(0,0,0,.35);
  position:relative;
}
.avatar.lg{width:48px;height:48px;font-size:20px}
.avatar.xl{width:72px;height:72px;font-size:30px}
.avatar.sm{width:22px;height:22px;font-size:11px}
.avatar .dot{
  position:absolute; bottom:-1px; right:-1px;
  width:9px; height:9px; border-radius:50%;
  background:#52c265; border:2px solid var(--bg-2);
}
.avatar.lg .dot{width:12px;height:12px}
.avatar .avatar-img{
  width:100%; height:100%; border-radius:50%;
  object-fit:cover; display:block;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Main column
   ───────────────────────────────────────────────────────────────────────────── */
.main{
  display:flex; flex-direction:column; min-width:0; min-height:0;
  height:100vh; height:100dvh;
  background:var(--bg);
}

.topbar{
  height:var(--topbar-h);
  display:flex; align-items:center; gap:18px;
  padding:0 32px;
  border-bottom:1px solid var(--hairline);
  background:var(--bg);
  flex-shrink:0;
}
.search{
  flex:1; max-width:520px;
  display:flex; align-items:center; gap:10px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-s);
  padding:8px 12px;
  transition:border-color .15s, background .15s;
}
.search:focus-within{border-color:var(--gold-soft); background:var(--surface-2)}
.search input{
  background:none; border:0; outline:0; flex:1;
  color:var(--text); font-size:13px;
}
.search input::placeholder{color:var(--dim); font-style:italic}
.search .ic{color:var(--dim); width:14px; height:14px}
.search .kbd{
  font-family:var(--font-mono); font-size:10px; color:var(--dim);
  border:1px solid var(--border-2); padding:1px 5px; border-radius:3px;
}

/* Native <select> in editor fields — theme the control AND its option list
   (the browser renders the popup from the select's own bg/colour, so a
   transparent select gave a white OS dropdown). */
.fld-select{
  flex:1; width:100%; border:0; outline:0; font:inherit; font-size:13px;
  cursor:pointer; background-color:var(--surface); color:var(--text);
  color-scheme:dark;
}
.fld-select option{ background-color:var(--surface); color:var(--text) }
body[data-theme="light"] .fld-select{ color-scheme:light }

/* Topbar search typeahead — jumps to a recipe (not a Discover filter). */
.search-wrap{ position:relative; flex:1; max-width:520px; display:flex; z-index:61 }
.search-wrap .search{ flex:1; max-width:none }
/* Mobile: the search bar is persistent in the topbar next to the hamburger,
   flexing to fill the row so it never collapses at the sidebar breakpoint. */
.mobile-search-wrap{ max-width:none; z-index:62 }
.search-results{
  position:absolute; left:0; right:0; top:calc(100% + 8px); z-index:61;
  background:var(--surface-2); border:1px solid var(--border-2);
  border-radius:var(--rad-s); padding:6px; max-height:60vh; overflow-y:auto;
  box-shadow:0 14px 40px -10px rgba(0,0,0,.6);
}
.sr-item{
  display:flex; flex-direction:column; gap:2px; width:100%;
  padding:8px 10px; border:0; background:transparent; cursor:pointer;
  text-align:left; border-radius:var(--rad-xs); color:var(--text-2); font:inherit;
}
.sr-item:hover{ background:var(--surface-3); color:var(--text) }
.sr-title{ font-family:var(--font-serif); font-size:14px; color:var(--text) }
.sr-meta{ font-size:10px; color:var(--dim); letter-spacing:.04em }
.sr-empty{ padding:14px 12px; text-align:center; color:var(--dim); font-size:13px }

.topbar-tools{display:flex; align-items:center; gap:10px; margin-left:auto}
.icon-btn{
  width:34px; height:34px; border-radius:var(--rad-s);
  display:flex; align-items:center; justify-content:center;
  color:var(--text-2); position:relative;
  transition:background .15s, color .15s;
}
.icon-btn:hover{background:var(--surface-2); color:var(--text)}
.icon-btn .ic{width:16px;height:16px}
.icon-btn .badge{
  position:absolute; top:5px; right:5px;
  width:7px; height:7px; border-radius:50%;
  background:var(--gold); box-shadow:0 0 0 2px var(--bg);
}

/* ─────────────────────────────────────────────────────────────────────────────
   Content scroller
   ───────────────────────────────────────────────────────────────────────────── */
.content{
  flex:1; overflow-y:auto; overflow-x:hidden;
  padding:32px 32px 60px;
}

/* Guest-only AdSense slot (members never render this) */
.ad-slot{
  min-height:90px; margin:0 0 24px;
  display:flex; align-items:center; justify-content:center;
  background:var(--surface); border:1px dashed var(--border);
  border-radius:var(--rad-m); overflow:hidden;
}
.ad-slot:last-child{ margin:32px 0 0 }
.ad-slot .adsbygoogle{ width:100%; min-height:90px }

/* Vertical variant — fills the guest sidebar column above the foot. */
.ad-slot-v{
  flex:1 1 auto; min-height:250px; margin:14px 0; align-items:stretch;
}
.ad-slot-v .adsbygoogle{ width:100%; height:100%; min-height:250px }

.h-display{
  font-family:var(--font-serif);
  font-weight:500;
  font-size:clamp(36px, 4.2vw, 58px);
  line-height:1.12;
  letter-spacing:-0.005em;
  text-wrap:balance;
  padding-bottom:6px;
}
.h-display .it{font-style:italic; color:var(--gold)}

.h-section{
  font-family:var(--font-mono);
  font-size:10px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--dim);
  display:flex; align-items:center; gap:10px;
}
.h-section::before, .h-section::after{
  content:""; height:1px; background:var(--border); flex:1;
}
.h-section::before{flex:0 0 24px}

.h-title{
  font-family:var(--font-serif);
  font-weight:500;
  font-size:32px;
  line-height:1.1;
  letter-spacing:-0.005em;
}

.h-sub{
  font-family:var(--font-serif);
  font-style:italic;
  font-size:18px;
  color:var(--text-2);
  font-weight:400;
  line-height:1.4;
}

.mono{ font-family:var(--font-mono); font-variant-numeric:tabular-nums; letter-spacing:.02em }
.label{
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.16em; text-transform:uppercase; color:var(--dim);
}

/* ─────────────────────────────────────────────────────────────────────────────
   Discover — Hero + grid
   ───────────────────────────────────────────────────────────────────────────── */
.discover-hero{
  display:grid;
  grid-template-columns: 1fr;
  gap:14px;
  margin-bottom:36px;
}
.discover-hero .titles{display:flex; flex-direction:column; gap:18px}
.discover-hero .meta-line{
  display:flex; align-items:center; gap:14px;
  font-family:var(--font-mono); font-size:11px; color:var(--dim);
  letter-spacing:.10em;
}
.discover-hero .meta-line .dot{color:var(--gold-soft)}

/* Filters bar */
.filters{
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  padding:14px 16px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  margin-bottom:24px;
}
.chip{
  display:inline-flex; align-items:center; gap:6px;
  padding:6px 11px;
  background:var(--surface-2);
  border:1px solid var(--border);
  border-radius:99px;
  font-size:12px; color:var(--text-2);
  font-family:var(--font-mono); letter-spacing:.04em;
  transition:all .15s;
}
.chip:hover{ border-color:var(--border-2); color:var(--text)}
.chip.active{
  background:var(--gold-glow); border-color:var(--gold-soft); color:var(--gold);
}
.chip .x{ opacity:.6; font-size:10px }

.filters-divider{ width:1px; height:18px; background:var(--border); margin:0 4px }

.sort-pill{
  display:inline-flex; align-items:center; gap:8px;
  padding:6px 11px 6px 13px;
  background:var(--surface-2);
  border:1px solid var(--border);
  border-radius:99px;
  font-size:12px; color:var(--text-2);
  font-family:var(--font-mono); letter-spacing:.04em;
  cursor:pointer;
}
.sort-pill:hover{border-color:var(--gold-soft); color:var(--gold)}
.sort-pill .ic{width:11px;height:11px;opacity:.7}

.range{
  display:flex; align-items:center; gap:8px;
  font-family:var(--font-mono); font-size:11px; color:var(--dim);
}
.range input[type="range"]{
  appearance:none; -webkit-appearance:none;
  width:110px; height:2px; background:var(--border-2); border-radius:2px;
}
.range input[type="range"]::-webkit-slider-thumb{
  appearance:none; -webkit-appearance:none;
  width:12px; height:12px; border-radius:50%;
  background:var(--gold); border:0; box-shadow:0 0 0 2px var(--bg);
  cursor:pointer;
}
.range input[type="range"]::-moz-range-thumb{
  width:12px; height:12px; border-radius:50%;
  background:var(--gold); border:0; cursor:pointer;
}
.range .v{color:var(--text); min-width:36px; text-align:right}

/* Recipe grid */
.recipe-grid{
  display:grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: var(--gap-grid);
}

.recipe-card{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  overflow:hidden;
  position:relative;
  cursor:pointer;
  transition:transform .25s cubic-bezier(.2,.7,.2,1), border-color .2s, box-shadow .25s;
  display:flex; flex-direction:column;
  min-width:0;
}
.recipe-card:hover{
  transform:translateY(-3px);
  border-color:var(--border-2);
  box-shadow: 0 18px 40px -20px rgba(0,0,0,.6), 0 0 0 1px var(--gold-soft);
}
.recipe-card[draggable="true"]{cursor:grab}
.recipe-card.dragging{opacity:.4}

/* Restaurant-menu placeholder "photo" */
.recipe-photo{
  position:relative;
  aspect-ratio: 4/3;
  width:100%;
  overflow:hidden;
  flex-shrink:0;
  isolation:isolate;
  border-bottom:1px solid var(--hairline);
}
.recipe-photo .rp-grain{
  position:absolute; inset:0; pointer-events:none; opacity:.35;
  background-image:
    repeating-linear-gradient(0deg, rgba(255,255,255,.02) 0 1px, transparent 1px 3px),
    repeating-linear-gradient(90deg, rgba(0,0,0,.06) 0 1px, transparent 1px 3px);
  mix-blend-mode:overlay;
}
.recipe-photo .rp-rule{
  position:absolute; left:14%; right:14%; bottom:14%; height:1px;
  background:linear-gradient(90deg, transparent, rgba(212,168,71,.4), transparent);
}
.recipe-photo .rp-initial{
  position:absolute; right:-8px; bottom:-22px;
  font-family:var(--font-serif); font-style:italic; font-weight:500;
  font-size:200px; line-height:1;
  color:rgba(212,168,71,.18);
  letter-spacing:-.04em;
  user-select:none;
}
.recipe-photo .rp-num{
  position:absolute; top:14px; left:14px;
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.18em; color:rgba(212,168,71,.55);
}
.recipe-photo .rp-cuisine{
  position:absolute; left:14px; right:14px; bottom:22px;
  font-family:var(--font-serif); font-style:italic;
  font-size:15px; color:rgba(255,255,255,.55);
  letter-spacing:.01em;
  text-align:center;
}
.recipe-photo .rp-img{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; display:block;
}
.recipe-photo .rp-vignette{
  position:absolute; inset:0; pointer-events:none;
  background:
    radial-gradient(ellipse at 30% 0%, rgba(212,168,71,.10), transparent 60%),
    linear-gradient(180deg, transparent 50%, rgba(0,0,0,.45));
}

/* No real photo: shrink the decorative placeholder so it doesn't eat the card.
   A short banner reads as a header strip rather than a full hero image. */
.recipe-card .recipe-photo.no-photo{ aspect-ratio: 16/5; }
.recipe-card .recipe-photo.no-photo .rp-initial{
  font-size:120px; right:-4px; bottom:-30px;
}
.recipe-card .recipe-photo.no-photo .rp-rule{ bottom:30%; }
.recipe-card .recipe-photo.no-photo .rp-cuisine{ bottom:14px; font-size:13px; }

/* compact (thumbnail in planner pile etc) */
.pile-card .thumb .recipe-photo{ aspect-ratio: 1; border:0 }
.pile-card .thumb .recipe-photo .rp-initial{
  font-size:48px; right:-4px; bottom:-8px;
}
.activity-item .recipe-link .thumb .recipe-photo{ aspect-ratio:1 }
.activity-item .recipe-link .thumb .recipe-photo .rp-initial{
  font-size:42px; right:-4px; bottom:-8px;
}
.detail-photo .recipe-photo{ aspect-ratio: 4/5; height:100%; border-radius:var(--rad-m); border:0 }
.detail-photo .recipe-photo .rp-initial{
  font-size:340px; right:-20px; bottom:-50px;
}
.detail-photo .recipe-photo .rp-num{ font-size:11px; top:22px; left:22px }
.detail-photo .recipe-photo .rp-cuisine{ font-size:22px; bottom:36px }

.card-body{padding: var(--pad-card); display:flex; flex-direction:column; gap:6px; flex:1; min-width:0}
.card-title{
  font-family:var(--font-serif); font-weight:500;
  font-size:21px; line-height:1.12;
  letter-spacing:-0.005em;
  color:var(--text);
}
.card-blurb{
  font-family:var(--font-serif); font-style:italic;
  font-size:13.5px; color:var(--text-2); line-height:1.4;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden;
}
.card-foot{
  margin-top:auto; padding-top:10px;
  border-top:1px solid var(--hairline);
  display:flex; align-items:center; justify-content:space-between;
  font-family:var(--font-mono); font-size:11px; color:var(--dim);
  letter-spacing:.04em;
}
.card-foot .macro{ display:flex; gap:10px; align-items:baseline }
.card-foot .macro b{ color:var(--text); font-weight:500 }
.card-foot .by{ font-style:italic; font-family:var(--font-serif); font-size:13px; color:var(--text-2) }

/* card style: minimal */
[data-card-style="minimal"] .recipe-photo{ display:none }
[data-card-style="minimal"] .recipe-card::before{
  content:""; height:4px; background:linear-gradient(90deg, transparent, var(--gold-soft), transparent);
}
[data-card-style="minimal"] .card-body{ padding:24px }
[data-card-style="minimal"] .card-blurb{ -webkit-line-clamp:3 }

/* macros hide */
[data-show-macros="false"] .card-foot .macro{ display:none }

/* ─────────────────────────────────────────────────────────────────────────────
   Buttons
   ───────────────────────────────────────────────────────────────────────────── */
.btn{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  padding:9px 16px;
  border-radius:var(--rad-s);
  font-size:13px; font-weight:500;
  border:1px solid var(--border);
  background:var(--surface-2);
  color:var(--text);
  transition:all .15s;
}
.btn:hover{ border-color:var(--border-2); background:var(--surface-3) }
.btn .ic{width:13px;height:13px}
.btn-gold{
  background:linear-gradient(180deg, var(--gold) 0%, var(--gold-2) 100%);
  border:1px solid var(--gold-2);
  color:#15110b; font-weight:600;
  box-shadow:0 1px 0 rgba(255,255,255,.25) inset, 0 6px 16px -8px rgba(212,168,71,.6);
}
.btn-gold:hover{ filter:brightness(1.06) }
.btn-ghost{ background:transparent; border-color:transparent; color:var(--text-2) }
.btn-ghost:hover{ background:var(--surface-2); color:var(--text) }
.btn-burgundy{
  background:var(--burgundy); border-color:var(--burgundy-2); color:#fff;
}
.btn-sm{ padding:6px 11px; font-size:12px }

/* ─────────────────────────────────────────────────────────────────────────────
   Recipe Detail
   ───────────────────────────────────────────────────────────────────────────── */
.detail-back{
  display:inline-flex; align-items:center; gap:6px;
  font-family:var(--font-mono); font-size:11px; color:var(--dim);
  letter-spacing:.10em; margin-bottom:24px;
}
.detail-back:hover{color:var(--gold)}

.detail{
  display:grid; grid-template-columns: 1.05fr 1fr;
  gap:42px; align-items:start;
}
.detail-photo{
  aspect-ratio: 4/5; border-radius:var(--rad-m); overflow:hidden;
  background:linear-gradient(135deg, #2a2218, #15110b);
  position:relative; border:1px solid var(--border);
}
.detail-photo img{width:100%;height:100%;object-fit:cover;display:block}
.detail-photo .vignette{
  position:absolute; inset:0;
  background:linear-gradient(180deg, transparent 60%, rgba(0,0,0,.6));
  pointer-events:none;
}

.detail-stats{
  display:grid; grid-template-columns: repeat(4,1fr);
  gap:1px; margin:22px 0 28px;
  background:var(--border);
  border:1px solid var(--border);
  border-radius:var(--rad-m); overflow:hidden;
}
.detail-stats .stat{
  background:var(--surface);
  padding:14px 16px;
  display:flex; flex-direction:column; gap:4px;
}
.detail-stats .label{font-size:9px; letter-spacing:.20em}
.detail-stats .v{
  font-family:var(--font-serif); font-size:28px; line-height:1;
  font-weight:500; color:var(--text);
}
.detail-stats .u{font-family:var(--font-mono); font-size:10px; color:var(--faint)}
.detail-stats .stat.gold .v{color:var(--gold)}

.macro-strip{
  display:flex; gap:24px;
  font-family:var(--font-mono); font-size:11px; color:var(--dim);
  letter-spacing:.08em;
  padding:14px 0;
  border-top:1px solid var(--hairline);
  border-bottom:1px solid var(--hairline);
  margin-bottom:22px;
}
.macro-strip b{ color:var(--text); font-weight:500 }
.macro-strip .sep{ color:var(--faintest) }

.detail-section + .detail-section{ margin-top:30px }
.detail-section .h-section{ margin-bottom:14px }

.ingredients-list{
  display:flex; flex-direction:column; gap:1px;
  background:var(--border);
  border:1px solid var(--border);
  border-radius:var(--rad-s); overflow:hidden;
}
.ingredient-row{
  display:flex; align-items:center; gap:12px;
  background:var(--surface);
  padding:11px 14px;
  font-size:13px;
}
.ingredient-row .qty{
  font-family:var(--font-mono); font-size:11px; color:var(--gold);
  letter-spacing:.04em; min-width:80px;
}
.ingredient-row .nm{ flex:1; color:var(--text) }
.ingredient-row .nm small{ color:var(--dim); font-family:var(--font-serif); font-style:italic; margin-left:6px }
.ingredient-row .have{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.10em;
  color:var(--faint); padding:2px 7px; border-radius:3px;
  background:var(--surface-2);
}
.ingredient-row .have.yes{ color:var(--gold); background:var(--gold-glow) }

.steps-list{counter-reset:step; display:flex; flex-direction:column; gap:18px}
.step{ display:grid; grid-template-columns:36px 1fr; gap:14px; align-items:start }
.step .n{
  font-family:var(--font-serif); font-style:italic; font-size:28px;
  color:var(--gold); line-height:1; padding-top:2px;
}
.step .t{font-family:var(--font-serif); font-size:17px; line-height:1.4; color:var(--text)}

/* tag pills (e.g. cuisine, tags) */
.tag-row{ display:flex; gap:6px; flex-wrap:wrap; margin-top:10px }
.tag{
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.10em; text-transform:lowercase;
  padding:3px 8px; border-radius:3px;
  background:var(--surface-2); color:var(--text-2);
  border:1px solid var(--border);
}
.tag.cuisine{ color:var(--gold); border-color:var(--gold-soft); background:transparent }

.action-row{ display:flex; gap:10px; margin:24px 0 4px; flex-wrap:wrap }

/* ─────────────────────────────────────────────────────────────────────────────
   Planner
   ───────────────────────────────────────────────────────────────────────────── */
.planner-wrap{ display:grid; grid-template-columns: 280px 1fr; gap:28px; align-items:start }
.planner-side{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  padding:18px;
  position:sticky; top:0;
}
.planner-side .h-section{margin-bottom:14px}
.planner-side .h-section .pile-count{
  color:var(--gold); font-size:10px; letter-spacing:.08em;
}
.planner-side .pile-search{
  margin-bottom:12px; max-width:none; width:100%; min-width:0;
  position:relative;
}
.planner-side .pile-search input{ font-size:13px }
.planner-side .pile-search-x{
  position:absolute; right:8px; top:50%; transform:translateY(-50%);
  background:transparent; border:0; color:var(--dim);
  cursor:pointer; padding:2px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
}
.planner-side .pile-search-x:hover{ color:var(--text); background:var(--surface-3) }
.planner-side .recipe-pile{
  display:flex; flex-direction:column; gap:8px;
  max-height:60vh; overflow-y:auto; padding-right:6px;
}
.planner-side .pile-empty{
  padding:14px 0; text-align:center;
  font-size:13px; color:var(--dim);
}

/* Edge-fade scroll indicators. The wrappers around the horizontal scrollers
   anchor absolute gradients pinned to the visible edges so users know there's
   more content offscreen. JS toggles `.is-hidden` when the scroller is at
   the corresponding end. Disabled on desktop where horizontal panning is
   either unnecessary (vertical pile) or natively shown via scrollbar. */
.week-scroll-wrap,
.recipe-pile-wrap{ position:relative }
.scroll-fade{
  position:absolute; top:0; bottom:0; width:32px;
  pointer-events:none;
  opacity:1; transition: opacity .15s ease;
  z-index:2;
  display:none;             /* shown only at mobile breakpoint below */
}
.scroll-fade.is-hidden{ opacity:0 }
.scroll-fade-left{
  left:0;
  background: linear-gradient(to right,
              var(--bg) 0%,
              rgba(13,11,8,0.65) 45%,
              transparent 100%);
}
.scroll-fade-right{
  right:0;
  background: linear-gradient(to left,
              var(--bg) 0%,
              rgba(13,11,8,0.65) 45%,
              transparent 100%);
}
/* The pile fade sits over a surface-coloured card, so blend to surface */
.recipe-pile-wrap .scroll-fade-left{
  background: linear-gradient(to right,
              var(--surface) 0%,
              rgba(20,16,11,0.65) 45%,
              transparent 100%);
}
.recipe-pile-wrap .scroll-fade-right{
  background: linear-gradient(to left,
              var(--surface) 0%,
              rgba(20,16,11,0.65) 45%,
              transparent 100%);
}

/* Tap-to-place mode: the selected pile card + drop-target hints across the
   week grid. Works alongside HTML5 drag-and-drop (which is a no-op on touch
   devices, so this is the only working flow on mobile). */
.pile-card.picked{
  border-color:var(--gold);
  box-shadow: 0 0 0 1px var(--gold), 0 0 0 4px var(--gold-glow);
  transform: translateX(2px);
}
.pile-card.picked .nm{ color:var(--gold) }

.pick-banner{
  display:flex; align-items:center; gap:10px;
  padding:10px 14px; margin-bottom:14px;
  background:var(--gold-glow); border:1px solid var(--gold-soft);
  border-radius:var(--rad-m);
  font-size:13px; color:var(--text);
  position:sticky; top:0; z-index:5;
}
.pick-banner .pb-label{
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.12em; text-transform:uppercase; color:var(--gold);
}
.pick-banner .pb-title{
  font-family:var(--font-serif); font-weight:500; color:var(--text);
  flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.pick-banner .pb-cancel{
  display:inline-flex; align-items:center; gap:4px;
  padding:5px 10px; font-size:11px;
  background:transparent; border:1px solid var(--border);
  border-radius:var(--rad-xs); color:var(--text-2); cursor:pointer;
  flex-shrink:0;
}
.pick-banner .pb-cancel:hover{ border-color:var(--gold-soft); color:var(--text) }

/* Highlight empty cells while a pick is active so the tap target is obvious. */
.planner-main.picking .meal-cell{ cursor:pointer }
.planner-main.picking .meal-cell.tap-target{
  background: rgba(212,168,71,.06);
  box-shadow: inset 0 0 0 1px var(--gold-soft);
}
.planner-main.picking .meal-cell.tap-target .empty{
  opacity:1; color:var(--gold);
}
.planner-main.picking .meal-cell.tap-target:hover{
  box-shadow: inset 0 0 0 1px var(--gold);
}
/* Occupied cells get a subtler hint — tapping replaces. */
.planner-main.picking .meal-block.tap-replace{
  border-color: var(--gold-soft);
}
.planner-main.picking .meal-block.tap-replace:hover{
  border-color: var(--gold);
  box-shadow: 0 0 0 1px var(--gold);
}

/* Mobile: make the touch targets a bit bigger and ensure the search/pile
   never collapses while panning horizontally. */
@media (max-width: 760px){
  .pile-card{ touch-action: manipulation }
  .pile-card.picked{
    box-shadow: 0 0 0 2px var(--gold), 0 0 0 6px var(--gold-glow);
  }
  .pick-banner{
    flex-wrap: wrap; gap:6px;
    padding: 8px 12px;
  }
  .pick-banner .pb-title{ width:100%; flex-basis:100% }
  .pick-banner .pb-label, .pick-banner .pb-cancel{ flex-shrink:0 }
}
.pile-card{
  display:flex; gap:10px; padding:8px;
  background:var(--surface-2);
  border:1px solid var(--border);
  border-radius:var(--rad-s);
  cursor:grab; transition:all .12s;
}
.pile-card:hover{border-color:var(--gold-soft); transform:translateX(2px)}
.pile-card.dragging{opacity:.4}
.pile-card .thumb{
  width:46px; height:46px; border-radius:var(--rad-xs);
  background:linear-gradient(135deg, #2a2218, #15110b);
  flex-shrink:0; overflow:hidden;
}
.pile-card .thumb img{width:100%;height:100%;object-fit:cover}
.pile-card .info{ min-width:0; display:flex; flex-direction:column; gap:2px }
.pile-card .nm{font-family:var(--font-serif); font-size:14px; line-height:1.15; color:var(--text);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden }
.pile-card .mt{font-family:var(--font-mono); font-size:9.5px; color:var(--dim); letter-spacing:.08em}
.pile-card .mt .gold{color:var(--gold)}

.plan-toolbar{
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  margin-bottom:18px;
}
.plan-toolbar .tot{
  font-family:var(--font-mono); font-size:11px; color:var(--dim); letter-spacing:.08em;
}
.plan-toolbar .tot b{ color:var(--text); font-weight:500 }
.plan-toolbar .tot .gold{ color:var(--gold) }

.plan-empty-hint{
  margin:4px 0 14px;
  padding:12px 16px;
  border:1px dashed var(--border-2);
  border-radius:var(--rad-m);
  background:var(--surface);
  color:var(--text-2);
  font-family:var(--font-serif); font-style:italic; font-size:14px;
}

.week-grid{
  display:grid;
  /* minmax(0,1fr) — NOT plain 1fr — so the 7 day columns always shrink to fit
     the width instead of letting a long recipe name push the grid wider than
     the container (which would crop/scroll the week). */
  grid-template-columns: 80px repeat(7, minmax(0, 1fr));
  gap: 1px; background:var(--border);
  border:1px solid var(--border); border-radius:var(--rad-m); overflow:hidden;
}
.week-head{ background:var(--surface-2); padding:14px 10px; font-family:var(--font-mono);
  font-size:10px; letter-spacing:.16em; text-transform:uppercase; color:var(--dim) }
.week-head .num{ font-family:var(--font-serif); font-style:italic; font-size:18px; color:var(--text); display:block; margin-bottom:2px; letter-spacing:0 }
.week-head.today{ background:var(--surface-3) }
.week-head.today .num{ color:var(--gold) }

.row-head{
  background:var(--surface-2);
  padding:14px 10px;
  display:flex; flex-direction:column; gap:2px;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--dim);
}
.row-head .h-em{
  font-family:var(--font-serif); font-style:italic;
  font-size:16px; letter-spacing:0; text-transform:none;
  color:var(--text);
}

.meal-cell{
  background:var(--surface);
  min-height:96px;
  padding:8px;
  display:flex; align-items:stretch;
  position:relative;
  transition:background .15s;
}
.meal-cell.drop-over{ background:var(--surface-3); box-shadow: inset 0 0 0 1px var(--gold) }
.meal-cell .empty{
  flex:1; border:1px dashed var(--border-2); border-radius:var(--rad-xs);
  display:flex; align-items:center; justify-content:center;
  color:var(--faint); font-family:var(--font-mono); font-size:10px;
  letter-spacing:.10em; text-transform:uppercase;
  opacity:0; transition:opacity .15s;
}
.meal-cell:hover .empty, .meal-cell.drop-over .empty{ opacity:1 }
.meal-cell .empty span{ font-family:var(--font-serif); font-style:italic; text-transform:lowercase; letter-spacing:0; font-size:13px; color:var(--dim) }

.meal-block{
  flex:1; min-width:0;
  border-radius:var(--rad-xs);
  padding:8px;
  background:linear-gradient(180deg, var(--surface-3), var(--surface-2));
  border:1px solid var(--border);
  display:flex; flex-direction:column; gap:4px;
  cursor:grab; position:relative;
  overflow:hidden;
}
.meal-block:hover{ border-color:var(--gold-soft) }
.meal-block .swatch{
  position:absolute; left:0; top:0; bottom:0; width:3px;
  background:var(--gold);
}
.meal-block .nm{
  font-family:var(--font-serif); font-size:13.5px; line-height:1.15;
  color:var(--text); padding-left:6px;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.meal-block .stat-line{
  font-family:var(--font-mono); font-size:9.5px;
  color:var(--dim); letter-spacing:.06em; padding-left:6px;
  margin-top:auto;
}
.meal-block .stat-line b{ color:var(--gold); font-weight:500 }
.meal-block .x{
  position:absolute; top:3px; right:3px;
  width:16px; height:16px; border-radius:3px;
  color:var(--dim); display:none; align-items:center; justify-content:center;
  font-size:11px;
}
.meal-block:hover .x{ display:flex }
.meal-block .x:hover{ background:var(--burgundy); color:#fff }

.meal-block.repeat-warn{ border-color:var(--burgundy); }
/* Repeat-over-limit chip — clearer than the old inline "· ×N". */
.repeat-chip{
  display:inline-flex; align-items:center; gap:2px;
  margin-left:6px; padding:0 5px; border-radius:999px;
  font-family:var(--font-mono); font-size:9px; line-height:1.5;
  color:#e58b8b; background:rgba(142,39,39,.18); border:1px solid rgba(142,39,39,.4);
}

/* Macro colour-coding in the planner totals (P/C/F) so the row scans fast.
   Muted tints that read on both dark and light themes. */
.m-p{ color:#7ec98f } .m-p b{ color:#7ec98f }
.m-c{ color:#8fb3d9 } .m-c b{ color:#8fb3d9 }
.m-f{ color:#e0a76b } .m-f b{ color:#e0a76b }

/* My rating & notes (recipe detail) */
.my-note{ margin-top:34px }
.my-note .stars{ display:flex; align-items:center; gap:4px; margin-bottom:12px }
.my-note .star{
  border:0; background:transparent; cursor:pointer; padding:2px;
  font-size:24px; line-height:1; color:var(--border-2);
  transition:color .12s, transform .12s;
}
.my-note .star:hover{ transform:scale(1.12) }
.my-note .star.on{ color:var(--gold) }
.my-note .stars-val{ margin-left:8px; font-size:11px; color:var(--dim) }
.my-note .note-area{
  width:100%; min-height:72px; resize:vertical;
  padding:10px 12px; font:inherit; font-size:14px; line-height:1.5;
  color:var(--text); background:var(--surface-2);
  border:1px solid var(--border); border-radius:var(--rad-s); outline:0;
}
.my-note .note-area:focus{ border-color:var(--gold-soft) }
/* Compact stars shown on a recipe card when the user has rated it. */
.card-rating{ display:inline-flex; align-items:center; gap:2px; color:var(--gold); font-size:11px }

/* Planner templates dropdown */
.tpl-menu{
  position:absolute; right:0; top:calc(100% + 6px); z-index:61;
  width:260px; max-width:80vw; padding:12px;
  background:var(--surface); border:1px solid var(--border-2);
  border-radius:var(--rad-m); box-shadow:0 18px 44px -18px rgba(0,0,0,.7);
}
.tpl-save{ display:flex; gap:6px; margin-bottom:10px }
.tpl-save .inp{
  flex:1; min-width:0; height:32px; padding:0 8px; font:inherit; font-size:13px;
  color:var(--text); background:var(--surface-2);
  border:1px solid var(--border); border-radius:var(--rad-xs); outline:0;
}
.tpl-list{ display:flex; flex-direction:column; max-height:240px; overflow-y:auto }
.tpl-empty{ font-size:12px; color:var(--dim); padding:6px 2px }
.tpl-row{ display:flex; align-items:center; gap:6px; border-top:1px solid var(--hairline) }
.tpl-row:first-child{ border-top:0 }
.tpl-apply{
  flex:1; min-width:0; text-align:left; cursor:pointer;
  border:0; background:transparent; color:var(--text); font:inherit; font-size:13.5px;
  padding:9px 4px; font-family:var(--font-serif);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.tpl-apply:hover{ color:var(--gold) }
.tpl-del{
  flex-shrink:0; border:0; background:transparent; cursor:pointer; color:var(--dim);
  padding:4px 5px; border-radius:var(--rad-xs); display:flex; align-items:center; opacity:.6;
}
.tpl-del:hover{ opacity:1; color:#e58b8b; background:rgba(142,39,39,.16) }
.meal-block.repeat-warn .swatch{ background:var(--burgundy) }

/* Day totals row */
.week-totals{
  display:grid; grid-template-columns: 80px repeat(7, minmax(0, 1fr));
  gap:1px; background:var(--border);
  border:1px solid var(--border); border-top:0;
  border-radius: 0 0 var(--rad-m) var(--rad-m); overflow:hidden;
}
.week-totals .row-head{ background:var(--bg-2) }
.week-totals .totcell{
  background:var(--bg-2); padding:10px;
  font-family:var(--font-mono); font-size:10px;
  color:var(--dim); letter-spacing:.04em;
  display:flex; flex-direction:column; gap:1px;
}
.week-totals .totcell b{ color:var(--text); font-weight:500 }
.week-totals .totcell .gold{ color:var(--gold) }

/* ─────────────────────────────────────────────────────────────────────────────
   Shopping
   ───────────────────────────────────────────────────────────────────────────── */
.shop-wrap{ display:grid; grid-template-columns: 1.4fr 1fr; gap:32px; align-items:start }

.aisle{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  margin-bottom:14px;
  overflow:hidden;
}
.aisle-head{
  display:flex; align-items:baseline; gap:10px;
  padding:14px 18px;
  border-bottom:1px solid var(--hairline);
  font-family:var(--font-mono); font-size:11px;
  letter-spacing:.18em; text-transform:uppercase;
  color:var(--gold);
}
.aisle-head .count{ color:var(--dim); margin-left:auto; letter-spacing:.04em }
.aisle-items{ display:flex; flex-direction:column }
.shop-row{
  display:flex; align-items:center; gap:14px;
  padding:11px 18px;
  border-bottom:1px solid var(--hairline);
  cursor:pointer;
}
.shop-row:last-child{ border-bottom:0 }
.shop-row:hover{ background:var(--surface-2) }
.shop-row .check{
  width:18px; height:18px; border-radius:var(--rad-xs);
  border:1px solid var(--border-2);
  display:flex; align-items:center; justify-content:center;
  color:transparent;
  flex-shrink:0; transition: all .15s;
}
.shop-row.have .check{ background:var(--gold); border-color:var(--gold); color:#15110b }
.shop-row.have .nm, .shop-row.have .q{ text-decoration:line-through; color:var(--faint) }
.shop-row .nm{ flex:1; font-size:14px; color:var(--text) }
.shop-row .nm .src{
  font-family:var(--font-mono); font-size:10px; color:var(--dim);
  letter-spacing:.06em; margin-left:8px;
}
.shop-row .q{ font-family:var(--font-mono); font-size:12px; color:var(--gold); letter-spacing:.04em }

.shop-summary{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  padding:22px; position:sticky; top:0;
}
.shop-summary .total{
  font-family:var(--font-serif); font-size:54px; line-height:1; font-weight:500;
  color:var(--gold);
}
.shop-summary .total small{ font-family:var(--font-mono); font-size:11px;
  color:var(--dim); letter-spacing:.10em; text-transform:uppercase; margin-left:6px }
.shop-summary .divider{ height:1px; background:var(--hairline); margin:18px 0 }
.shop-summary .from-list{
  display:flex; flex-direction:column; gap:6px;
  font-family:var(--font-serif); font-style:italic; font-size:14px;
}
.shop-summary .from-list .ln{display:flex; gap:8px; align-items:center}
.shop-summary .from-list .ln .n{font-family:var(--font-mono); font-style:normal;
  font-size:10px; color:var(--gold); letter-spacing:.06em; min-width:20px}
.shop-summary .from-list .ln .ttl{ flex:1; min-width:0 }
/* Each recipe in the "Built from" panel is pressable to filter the list. */
.shop-summary .from-list .ln{ cursor:pointer; border-radius:var(--rad-xs); padding:2px 4px; margin:0 -4px;
  transition:background .12s, color .12s }
.shop-summary .from-list .ln:hover{ background:var(--surface-2) }
.shop-summary .from-list .ln.active{ background:var(--gold-glow); color:var(--text) }
.shop-summary .from-list .ln.active .ttl{ font-style:normal }
/* Banner above the list while it's narrowed to one recipe. */
.shop-filter-bar{
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  margin-bottom:14px; padding:8px 12px;
  background:var(--gold-glow); border:1px solid var(--gold-soft);
  border-radius:var(--rad-xs); font-size:13px; color:var(--text);
}
.shop-filter-bar .chip{ flex-shrink:0; display:inline-flex; align-items:center; gap:4px; cursor:pointer }

/* Remove controls: a shopping-list row, or a whole recipe (regret adding). */
.shop-row .shop-x, .from-list .ln .ln-x{
  flex-shrink:0; border:0; background:transparent; cursor:pointer;
  color:var(--dim); border-radius:var(--rad-xs); padding:3px 5px;
  display:flex; align-items:center; opacity:.5;
  transition:opacity .15s, color .15s, background .15s;
}
.shop-row .shop-x:hover, .from-list .ln .ln-x:hover{
  opacity:1; color:#e58b8b; background:rgba(142,39,39,.16);
}

/* Add a free-text shopping item (or, for a child, request one). */
.shop-add{
  display:flex; gap:8px; align-items:center; margin-bottom:14px; flex-wrap:wrap;
}
.shop-add .inp{
  height:36px; padding:0 10px; font:inherit; font-size:14px;
  color:var(--text); background:var(--surface); outline:0;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.shop-add .shop-add-name{ flex:1; min-width:160px }
.shop-add .shop-add-qty{ width:74px; flex-shrink:0 }
.shop-add .shop-add-aisle{ flex-shrink:0 }
.shop-add .btn{ flex-shrink:0 }
/* Free-text item rows read a touch softer than the recipe-derived ones. */
.shop-row.custom .nm{ font-style:italic }

/* ── Family mode ──────────────────────────────────────────────────────────── */
.fam-wrap{ max-width:760px }
.fam-tabs{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:14px }
.fam-tab{
  display:inline-flex; align-items:center; gap:8px;
  padding:8px 14px; cursor:pointer;
  background:var(--surface); border:1px solid var(--border); border-radius:999px;
  color:var(--text-2); font:inherit; font-size:14px;
  transition:border-color .15s, color .15s, background .15s;
}
.fam-tab:hover{ border-color:var(--border-2); color:var(--text) }
.fam-tab.active{ border-color:var(--gold-soft); color:var(--text); background:var(--surface-2) }
.fam-tab .fam-tab-role{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--dim);
}
.fam-tab.add{ color:var(--gold) }
.fam-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:16px; margin-bottom:8px }
.fam-section{
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--rad-m); padding:20px; margin-top:18px;
}
.fam-create, .fam-invite-form, .fam-req-form{
  display:flex; gap:8px; align-items:center; flex-wrap:wrap;
}
.fam-create .inp, .fam-invite-form .inp, .fam-req-form .inp{
  height:36px; padding:0 10px; font:inherit; font-size:14px;
  color:var(--text); background:var(--surface-2); outline:0;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.fam-create .inp{ flex:1; min-width:200px }
.fam-invite-form{ margin-top:14px; padding-top:14px; border-top:1px solid var(--hairline) }
.fam-invite-form .inp:first-child{ flex:1; min-width:160px }
.fam-req-form .inp:first-child{ flex:1; min-width:180px }
.fam-req-form .fam-req-qty{ width:74px; flex-shrink:0 }

.fam-members{ display:flex; flex-direction:column; gap:2px }
.fam-member{ display:flex; align-items:center; gap:12px; padding:8px 0; border-bottom:1px solid var(--hairline) }
.fam-member:last-child{ border-bottom:0 }
.fam-member-info{ flex:1; min-width:0 }
.fam-member-info .nm{ font-size:14px; color:var(--text) }
.fam-member-info .hd{ font-size:11px; color:var(--dim) }
.fam-role{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase;
  padding:2px 8px; border-radius:999px; border:1px solid var(--border-2); color:var(--dim);
}
.fam-role.parent{ color:var(--gold); border-color:var(--gold-soft) }

.fam-invite{
  display:flex; align-items:center; justify-content:space-between; gap:12px;
  padding:12px 0; border-bottom:1px solid var(--hairline);
}
.fam-invite:last-child{ border-bottom:0 }
.fam-invite-txt{ font-family:var(--font-serif); font-size:14px; color:var(--text) }
.fam-invite-actions, .fam-req-actions{ display:flex; gap:8px; flex-shrink:0 }

.fam-req{
  display:flex; align-items:center; gap:12px;
  padding:11px 0; border-bottom:1px solid var(--hairline);
}
.fam-req:last-child{ border-bottom:0 }
.fam-req.resolved{ opacity:.72 }
.fam-req-kind{
  width:26px; height:26px; border-radius:50%; flex-shrink:0;
  display:flex; align-items:center; justify-content:center;
  border:1px solid var(--border-2); color:var(--gold);
}
.fam-req-kind.shopping{ color:var(--text-2) }
.fam-req-body{ flex:1; min-width:0 }
.fam-req-body .nm{ font-size:14px; color:var(--text) }
.fam-req-body .hd{ font-size:12px; color:var(--dim); font-family:var(--font-serif); font-style:italic }
.fam-req-link{
  border:0; background:transparent; cursor:pointer; padding:0;
  color:var(--text); font:inherit; font-size:14px; text-align:left;
  text-decoration:underline; text-decoration-color:var(--gold-soft);
}
.fam-req-link:hover{ color:var(--gold) }
.fam-status{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.08em; text-transform:uppercase;
  flex-shrink:0;
}
.fam-status.approved{ color:#7ec98f }
.fam-status.declined{ color:#e58b8b }
.fam-status.pending{ color:var(--dim) }
.fam-x{
  flex-shrink:0; border:0; background:transparent; cursor:pointer;
  color:var(--dim); border-radius:var(--rad-xs); padding:3px 5px;
  display:flex; align-items:center; opacity:.5;
  transition:opacity .15s, color .15s, background .15s;
}
.fam-x:hover{ opacity:1; color:#e58b8b; background:rgba(142,39,39,.16) }

/* Recipe detail: small elegant edit affordance next to the title. */
.detail-title-row{ display:flex; align-items:flex-start; gap:12px }
.detail-title-row .detail-title{ flex:1; min-width:0 }
.recipe-edit-btn{ flex-shrink:0; margin-top:4px; opacity:.7 }
.recipe-edit-btn:hover{ opacity:1 }

/* Allergen warning banner on recipe detail (only when the recipe contains one
   of the user's flagged allergen groups). */
.allergen-banner{
  display:flex; gap:10px; align-items:flex-start;
  margin-top:16px; padding:12px 14px;
  background:rgba(142,39,39,.12); border:1px solid rgba(142,39,39,.45);
  border-left-width:3px; border-radius:var(--rad-xs); color:var(--text);
}
.allergen-banner svg{ flex-shrink:0; margin-top:1px; color:#e58b8b }
.allergen-banner .ab-title{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.08em;
  text-transform:uppercase; color:#e58b8b; margin-bottom:3px;
}
.allergen-banner .ab-body{ font-size:13px; line-height:1.5 }
/* Standing disclaimer at the foot of every recipe (shown to guests too). */
.recipe-disclaimer{
  margin:24px 0; padding:10px 14px;
  border-left:3px solid var(--border);
  font-size:12px; line-height:1.5; color:var(--dim);
}

/* Recipe editor ingredient rows */
.re-ing-row{ display:flex; gap:8px; align-items:center; margin-bottom:6px }
.re-ing-row .fld-select{
  flex:2; min-width:0; height:30px; padding:0 8px;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.re-ing-qty, .re-ing-note{
  height:30px; padding:0 8px; font:inherit; font-size:13px;
  color:var(--text); background:var(--surface-2);
  border:1px solid var(--border); border-radius:var(--rad-xs); outline:0;
}
.re-ing-qty{ width:76px; flex-shrink:0 }
.re-ing-note{ flex:1; min-width:0 }
.re-ing-x{
  flex-shrink:0; border:0; background:transparent; cursor:pointer;
  color:var(--dim); border-radius:var(--rad-xs); padding:4px 6px;
  display:flex; align-items:center; opacity:.55; transition:opacity .15s,color .15s,background .15s;
}
.re-ing-x:hover{ opacity:1; color:#e58b8b; background:rgba(142,39,39,.16) }

/* Free-type ingredient picker (RecipeEditor): occupies the old select slot */
.ing-pick{ flex:2; min-width:0; position:relative }
.ing-pick-in{ display:flex; align-items:center; gap:6px; width:100% }
.re-ing-name{
  flex:1; min-width:0; height:30px; padding:0 8px; font:inherit; font-size:13px;
  color:var(--text); background:var(--surface-2);
  border:1px solid var(--border); border-radius:var(--rad-xs); outline:0;
}
.re-ing-name:focus{ border-color:var(--gold-soft, rgba(212,168,71,.5)) }
.ing-tag{
  flex-shrink:0; max-width:46%; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-family:var(--font-mono); font-size:9px;
  letter-spacing:.06em; text-transform:uppercase; padding:2px 7px;
  border-radius:999px; line-height:1.6;
}
.ing-tag-new{ color:#1a1407; background:var(--gold) }                 /* gold = new */
.ing-tag-alias{ color:#12161c; background:#c7ccd4 }                   /* silver = alias */
.ing-tag-ok{ color:var(--gold); display:inline-flex; align-items:center; padding:2px 4px }
.ing-menu{
  position:absolute; top:calc(100% + 4px); left:0; right:0; z-index:40;
  background:var(--surface-2); border:1px solid var(--border);
  border-radius:var(--rad-xs); box-shadow:0 10px 30px rgba(0,0,0,.4);
  max-height:248px; overflow-y:auto;
}
.ing-opt{
  display:block; width:100%; text-align:left; padding:7px 10px;
  background:none; border:0; color:var(--text); font:inherit; font-size:13px;
  cursor:pointer;
}
.ing-opt:hover{ background:var(--surface-3) }
.ing-opt-empty{ color:var(--dim); cursor:default }
.ing-opt-empty:hover{ background:none }
.ing-actions{
  display:flex; gap:8px; flex-wrap:wrap; align-items:center;
  padding:8px 10px; border-top:1px solid var(--hairline);
}
.ing-actions .fld-select{
  flex:1; min-width:120px; height:30px; padding:0 8px;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.ing-act{
  display:inline-flex; align-items:center; gap:5px; cursor:pointer;
  padding:5px 10px; border-radius:999px; background:transparent;
  font-family:var(--font-mono); font-size:11px; letter-spacing:.04em;
  border:1px solid; transition:background .15s, color .15s;
}
.ing-act-new{ color:var(--gold); border-color:rgba(212,168,71,.5) }   /* gold = new */
.ing-act-new:hover{ background:rgba(212,168,71,.16) }
.ing-act-alias{ color:#c7ccd4; border-color:rgba(199,204,212,.42) }   /* silver = alias */
.ing-act-alias:hover{ background:rgba(199,204,212,.14) }

/* IngredientEditor — "Used in recipes" list */
.ing-uses{
  margin-top:8px; display:flex; flex-direction:column; gap:4px;
  max-height:200px; overflow-y:auto;
}
.ing-use-row{
  text-align:left; border:1px solid var(--border); background:var(--surface-2);
  color:var(--text); font:inherit; font-size:13px; cursor:pointer;
  padding:7px 10px; border-radius:var(--rad-xs);
  transition:border-color .15s, color .15s, background .15s;
}
.ing-use-row:hover{ border-color:var(--gold); color:var(--gold) }

/* Compact IngredientEditor form (no overflow, fits without scrolling) */
.ing-cell{ display:flex; flex-direction:column; gap:5px; min-width:0 }
.ing-cell > span{
  font-family:var(--font-mono); font-size:9.5px; letter-spacing:.07em;
  text-transform:uppercase; color:var(--dim);
}
.ing-cell input, .ing-cell select{
  width:100%; box-sizing:border-box; height:32px; padding:0 9px;
  background:var(--surface-2); color:var(--text); font:inherit; font-size:13px;
  border:1px solid var(--border); border-radius:var(--rad-xs); outline:0;
}
.ing-cell select{ cursor:pointer; color-scheme:dark }
.ing-cell select option{ background-color:var(--surface); color:var(--text) }
body[data-theme="light"] .ing-cell select{ color-scheme:light }
.ing-cell input:focus, .ing-cell select:focus{ border-color:var(--gold-soft) }
.ing-row1{ margin-bottom:10px }
.ing-row2{ display:grid; grid-template-columns:1fr 1fr; gap:12px }
.ing-row3{ display:grid; grid-template-columns:1.1fr 1fr .8fr; gap:10px; align-items:end }
.ing-nutri{ display:grid; grid-template-columns:repeat(3,1fr); gap:9px 10px }
.ing-note, .ing-hint{
  font-size:10.5px; color:var(--dim); line-height:1.4; margin:5px 0 12px;
}
.ing-note code{ color:var(--text-2); font-family:var(--font-mono) }

/* ─────────────────────────────────────────────────────────────────────────────
   Friends
   ───────────────────────────────────────────────────────────────────────────── */
.friends-wrap{ display:grid; grid-template-columns: 1.3fr 1fr; gap:32px; align-items:start }

.activity-item{
  display:grid; grid-template-columns: 48px 1fr auto;
  gap:14px;
  padding:18px 0;
  border-bottom:1px solid var(--hairline);
}
.activity-item:last-child{ border-bottom:0 }
.activity-item .body{ display:flex; flex-direction:column; gap:8px; min-width:0 }
.activity-item .line{
  font-size:14px; color:var(--text-2);
}
.activity-item .line b{ color:var(--text); font-weight:600 }
.activity-item .line .verb{ font-family:var(--font-serif); font-style:italic; color:var(--gold-2); font-size:14.5px }
.activity-item .recipe-link{
  display:flex; align-items:center; gap:12px;
  padding:10px 14px;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-s);
  max-width:420px;
  cursor:pointer;
  transition:all .15s;
}
.activity-item .recipe-link:hover{ border-color:var(--gold-soft) }
.activity-item .recipe-link .thumb{
  width:36px; height:36px; border-radius:var(--rad-xs); overflow:hidden;
  background:linear-gradient(135deg, #2a2218, #15110b);
  flex-shrink:0;
}
.activity-item .recipe-link .thumb img{width:100%;height:100%;object-fit:cover}
.activity-item .recipe-link .rn{ font-family:var(--font-serif); font-size:15px; color:var(--text) }
.activity-item .recipe-link .rm{ font-family:var(--font-mono); font-size:9.5px; color:var(--dim); letter-spacing:.10em }
.activity-item .note{
  font-family:var(--font-serif); font-style:italic;
  font-size:14px; color:var(--text-2); line-height:1.45;
  padding-left:14px; border-left:2px solid var(--gold-soft);
}
.activity-item .ago{
  font-family:var(--font-mono); font-size:10px; color:var(--dim);
  letter-spacing:.10em;
}

.friend-card{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  padding:16px;
  display:flex; gap:12px; align-items:center;
  margin-bottom:10px;
}
.friend-card .info{ flex:1; min-width:0 }
.friend-card .nm{ font-family:var(--font-serif); font-size:16px; color:var(--text) }
.friend-card .hd{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.08em }
.friend-card .bio{ font-family:var(--font-serif); font-style:italic; font-size:13px; color:var(--text-2); margin-top:4px; line-height:1.4 }

/* Timeline composer (status / share) */
.composer{
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--rad-m); padding:14px; margin:18px 0 22px;
}
.composer-text{
  width:100%; resize:vertical; min-height:48px; background:var(--surface-2);
  color:var(--text); border:1px solid var(--border); border-radius:var(--rad-xs);
  padding:10px 12px; font:inherit; font-size:14px; outline:0;
}
.composer-foot{ display:flex; gap:8px; margin-top:10px; align-items:center }
.composer-foot .fld-select{
  flex:1; min-width:0; height:32px; padding:0 8px;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.activity-item .post-text{
  font-family:var(--font-serif); font-size:14.5px; color:var(--text);
  line-height:1.5; white-space:pre-wrap;
}

/* Own-publication audience badge + edit/delete + inline editor */
.pub-meta{ display:flex; align-items:center; gap:10px; margin-top:8px }
.pub-aud{
  display:inline-flex; align-items:center; gap:4px;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.05em;
  color:var(--dim); border:1px solid var(--border); border-radius:999px;
  padding:2px 8px;
}
.pub-act{
  border:0; background:transparent; cursor:pointer; font:inherit;
  font-size:11px; color:var(--gold); padding:2px 4px;
}
.pub-act:hover{ text-decoration:underline }
.pub-act.danger{ color:var(--dim) }
.pub-act.danger:hover{ color:#e58b8b }
.pub-edit{ display:flex; flex-direction:column; gap:8px; margin:6px 0 2px }
.pub-edit-foot{ display:flex; gap:8px; align-items:center }
.pub-edit-foot .fld-select{
  height:30px; padding:0 8px; border:1px solid var(--border);
  border-radius:var(--rad-xs);
}

/* Find-chefs modal results */
.chef-results{ display:flex; flex-direction:column; gap:6px; max-height:50vh; overflow-y:auto }
.chef-row{
  display:flex; align-items:center; gap:12px;
  padding:8px 6px; border-bottom:1px solid var(--border);
}
.chef-row:last-child{ border-bottom:0 }
.chef-row .info .nm{ font-family:var(--font-serif); font-size:15px; color:var(--text) }
.chef-row .info .hd{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.08em }

/* Incoming friend-requests panel (Friends page) */
.req-panel{
  background:var(--surface); border:1px solid var(--gold-soft);
  border-radius:var(--rad-m); padding:14px 16px; margin:0 0 22px;
}
.req-row{
  display:flex; align-items:center; gap:12px;
  padding:8px 0; border-top:1px solid var(--border);
}
.req-row:first-of-type{ border-top:0 }
.req-row .info .nm{ font-family:var(--font-serif); font-size:15px }
.req-row .info .hd{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.06em }

/* Recipe comments */
.comments{ max-width:760px }
.cmt-form{ display:flex; flex-direction:column; gap:8px; align-items:flex-end; margin-bottom:18px }
.cmt-form .composer-text{ width:100% }
.cmt{ display:flex; gap:12px; padding:12px 0; border-top:1px solid var(--border) }
.cmt:first-of-type{ border-top:0 }
.cmt-body{ flex:1; min-width:0 }
.cmt-head{ display:flex; align-items:center; gap:8px }
.cmt-head b{ color:var(--text); font-weight:600; font-size:14px }
.cmt-head .cmt-h{ font-family:var(--font-mono); font-size:10px; color:var(--dim) }
.cmt-x{
  margin-left:auto; border:0; background:transparent; cursor:pointer;
  color:var(--dim); padding:2px 5px; border-radius:var(--rad-xs);
}
.cmt-x:hover{ color:#e58b8b; background:rgba(142,39,39,.16) }
.cmt-text{ font-size:14px; color:var(--text-2); line-height:1.5; margin-top:3px; white-space:pre-wrap }

/* ─────────────────────────────────────────────────────────────────────────────
   Modal — send to friend
   ───────────────────────────────────────────────────────────────────────────── */
.modal-back{
  position:fixed; inset:0; z-index:100;
  background:rgba(8,6,4,.7); backdrop-filter: blur(6px);
  display:flex; align-items:center; justify-content:center;
  animation: fadein .15s;
}
@keyframes fadein{ from{opacity:0} to{opacity:1} }
.modal{
  background:var(--surface);
  border:1px solid var(--border-2);
  border-radius:var(--rad-l);
  width: 460px; max-width: 92vw; max-height:80vh;
  display:flex; flex-direction:column;
  box-shadow: 0 30px 80px -20px rgba(0,0,0,.7);
  overflow:hidden;
  animation: slidein .25s cubic-bezier(.2,.7,.2,1);
}
@keyframes slidein{ from{opacity:0; transform:translateY(12px)} to{opacity:1; transform:translateY(0)} }
/* Editors wrap head/body/foot in a <form>; make it the flex column so the
   body scrolls and the footer (Save) stays visible instead of being clipped. */
.modal > form{ display:flex; flex-direction:column; min-height:0; flex:1 }
.modal-head{
  padding: 22px 24px 14px;
  border-bottom:1px solid var(--hairline);
}
.modal-head .h-section{ margin-bottom:10px }
.modal-head .h-title{ font-size:24px }
.modal-body{ padding:14px 8px; flex:1; min-height:0; overflow-y:auto }
.modal-friend{
  display:flex; align-items:center; gap:12px;
  padding:10px 16px; cursor:pointer;
  border-radius:var(--rad-xs); margin: 0 8px;
}
.modal-friend:hover{background:var(--surface-2)}
.modal-friend .info{flex:1; min-width:0}
.modal-friend .nm{font-family:var(--font-serif); font-size:16px; color:var(--text)}
.modal-friend .hd{font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.08em}
.modal-friend .send{
  font-family:var(--font-mono); font-size:10px; color:var(--gold);
  letter-spacing:.12em; padding:4px 8px; border:1px solid var(--gold-soft);
  border-radius:3px; opacity:0; transition:opacity .15s;
}
.modal-friend:hover .send{opacity:1}
.modal-friend.sent .send{ opacity:1; color:#fff; background:var(--burgundy); border-color:var(--burgundy-2) }

.modal-foot{
  padding:14px 22px;
  border-top:1px solid var(--hairline);
  display:flex; gap:10px; justify-content:flex-end;
}

/* Toast */
.toast-wrap{
  position:fixed; bottom:24px; left:50%; transform:translateX(-50%);
  z-index:200; display:flex; flex-direction:column; gap:8px; align-items:center;
  pointer-events:none;
}
.toast{
  background:var(--surface-3);
  border:1px solid var(--gold-soft);
  border-radius:var(--rad-s);
  padding:10px 18px;
  font-family:var(--font-mono); font-size:11.5px; letter-spacing:.06em;
  color:var(--text);
  box-shadow: 0 20px 40px -10px rgba(0,0,0,.6);
  animation: slidein .25s cubic-bezier(.2,.7,.2,1);
  display:flex; align-items:center; gap:10px;
}
.toast .gold{ color:var(--gold); font-weight:600 }

/* Profile screen */
.profile-hero{ display:flex; align-items:center; gap:24px; margin-bottom:32px }
.profile-hero .who h1{
  font-family:var(--font-serif); font-size:42px; line-height:1; font-weight:500;
}
.profile-hero .who .handle{ font-family:var(--font-mono); font-size:12px; color:var(--dim); letter-spacing:.10em; margin-top:6px }
.profile-stats{
  display:grid; grid-template-columns: repeat(4, 1fr); gap:1px;
  background:var(--border); border:1px solid var(--border);
  border-radius:var(--rad-m); overflow:hidden; margin-bottom:32px;
}
.profile-stats .s{ background:var(--surface); padding:18px }
.profile-stats .s .v{ font-family:var(--font-serif); font-size:34px; font-weight:500; color:var(--gold); line-height:1 }
.profile-stats .s .k{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.16em; text-transform:uppercase; margin-top:6px }


/* ─────────────────────────────────────────────────────────────────────────────
   Helper / view-container classes used by JSX
   ───────────────────────────────────────────────────────────────────────────── */
.detail-container{ max-width:1100px; margin:0 auto }
.detail-title{ font-size:44px; margin-bottom:12px }
.detail-bottom{ margin-top:50px; display:grid; grid-template-columns: 1fr 1.4fr; gap:42px }
.from-circle{ margin-top:22px; padding:14px 16px; background:var(--surface); border:1px solid var(--border); border-radius:var(--rad-s) }
.shop-title{ font-size:36px; margin-bottom:18px }
.shop-sub{ margin-bottom:26px }
.friends-title{ font-size:36px; margin-bottom:24px }
.planner-main{ min-width:0 }
.week-scroller{
  overflow-x:auto; overflow-y:visible; padding-bottom:4px;
  -webkit-overflow-scrolling:touch;
  /* New stacking/scroll context so iOS PWA reliably treats this element as
     the horizontal pan target rather than handing the gesture off to the
     outer .content (which is overflow-y:auto / overflow-x:hidden). */
  position:relative;
  transform: translateZ(0);
  will-change: scroll-position;
}

/* ─────────────────────────────────────────────────────────────────────────────
   Language switcher
   ───────────────────────────────────────────────────────────────────────────── */
.lang-switch{
  display:inline-flex; align-items:center;
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-s);
  padding:2px; gap:1px;
  font-family:var(--font-mono);
  height:30px;
}
.lang-switch button{
  font-size:10.5px; letter-spacing:.10em; font-weight:600;
  padding:4px 10px;
  color:var(--dim);
  border-radius:4px;
  transition: color .15s, background .15s;
  height: 100%;
}
.lang-switch button:hover{ color:var(--text) }
.lang-switch button.on{
  background:var(--gold-glow);
  color:var(--gold);
}

.mobile-brand{
  padding:0; border:0; margin:0;
  display:flex; align-items:center; gap:10px;
}
.mobile-brand .brand-name{ font-size:18px }

/* ─────────────────────────────────────────────────────────────────────────────
   Mobile responsive
   ───────────────────────────────────────────────────────────────────────────── */
@media (max-width: 760px){
  body{ font-size:14px }
  .app{ grid-template-columns: 1fr }
  .sidebar{ display:none }

  .main{ height:100vh; height:100dvh }

  .topbar{
    height:56px; padding:0 16px;
    gap:10px;
  }
  .topbar-tools{ gap:6px }

  .content{
    padding:18px 16px 120px;
  }

  /* Hero */
  .discover-hero{ margin-bottom:20px; gap:10px }
  .h-display{
    font-size:clamp(28px, 7.5vw, 38px);
    line-height:1.1;
  }
  .h-title{ font-size:24px !important }
  .h-section{ font-size:9.5px }
  .h-sub{ font-size:15px }

  /* Filters: horizontal scroller */
  .filters{
    padding:10px 12px;
    gap:6px;
    flex-wrap:nowrap;
    overflow-x:auto;
    border-radius:var(--rad-s);
    -webkit-overflow-scrolling:touch;
    scrollbar-width:none;
  }
  .filters::-webkit-scrollbar{ display:none }
  .filters > *{ flex-shrink:0 }
  .filters .filters-divider{ display:none }
  .filters .range{ display:none }
  .filters .sort-pill{ margin-left:auto !important }
  .chip, .sort-pill, select.chip{ font-size:11px; padding:6px 10px }

  /* Cards */
  .recipe-grid{
    grid-template-columns: 1fr;
    gap:14px;
  }
  .recipe-photo .rp-initial{ font-size:170px }
  .card-body{ padding:16px }
  .card-title{ font-size:19px }
  .card-blurb{ font-size:13px; -webkit-line-clamp:2 }

  /* Recipe detail */
  .detail{ grid-template-columns: 1fr; gap:20px }
  .detail-photo .recipe-photo{ aspect-ratio: 4/3 }
  .detail-photo .recipe-photo .rp-initial{ font-size:200px }
  .detail-title{ font-size:30px !important; margin-bottom:8px }
  .detail-stats{ grid-template-columns: repeat(2, 1fr); margin:18px 0 18px }
  .detail-stats .v{ font-size:24px }
  .action-row{ gap:8px }
  .action-row .btn{ flex:1 1 auto; padding:10px 12px; font-size:12.5px; justify-content:center }
  .action-row .btn-ghost{ flex:0 1 auto }
  .detail-bottom{ grid-template-columns: 1fr; gap:28px; margin-top:30px }
  .step .n{ font-size:22px }
  .step .t{ font-size:15.5px }

  /* Planner: stack the week on top at full width (all 7 days visible) and move
     the recipe list UNDERNEATH it (order flips the DOM-first sidebar below). */
  .planner-wrap{ grid-template-columns: minmax(0, 1fr); gap:18px }
  .planner-main{ order: 1; min-width: 0 }
  .planner-side{ order: 2; position: static; padding:14px; max-height:none; min-width: 0 }
  /* Recipe list under the week → cards WRAP into rows and the list scrolls
     vertically (with the page / by wheel / by touch). A hidden horizontal strip
     couldn't be scrolled without a touch pan, which felt broken on pointer
     devices at this width. */
  .planner-side .recipe-pile{
    flex-direction:row; flex-wrap:wrap; gap:8px;
    max-height:none; padding-right:0; padding-bottom:0;
    overflow:visible;
  }
  .pile-card{ flex:1 1 150px; max-width:none; width:auto }

  .plan-toolbar{ gap:8px }
  .plan-toolbar .tot{ margin-left:0 !important; font-size:10.5px; width:100%; padding-top:4px; border-top:1px solid var(--hairline) }

  /* The week fills its (now full-width) container, so it no longer scrolls
     horizontally. overflow:visible drops the scroll context entirely — a flex
     track inside a horizontal scroller can otherwise collapse to zero width,
     which made the day columns disappear on the narrowest screens. */
  .week-scroller{ overflow: visible; padding-bottom: 0 }
  /* Slim label column + seven flexible columns that share the remaining width.
     minmax(0,…) lets them shrink without overflowing; width:100% guarantees
     the grid claims the full row so all seven days always render. */
  .week-grid, .week-totals{
    grid-template-columns: 44px repeat(7, minmax(0, 1fr));
    width: 100%;
    min-width: 0;
  }
  /* Cells must NOT capture vertical pans, otherwise the page can't scroll
     while the user's finger is over a cell. */
  .meal-cell, .meal-block{ touch-action: pan-x pan-y }

  /* The week no longer scrolls horizontally, so the scroll-edge fades would
     just look like the grid is being clipped — hide them. */
  .scroll-fade{ display:none }
  /* Tight density so seven columns stay legible on a phone. */
  .week-head{ padding:8px 3px; text-align:center }
  .week-head .num{ font-size:14px }
  .row-head{ padding:8px 3px }
  .row-head .h-em{ font-size:9.5px; line-height:1.05; white-space:normal; word-break:break-word }
  .meal-cell{ min-height: 84px; padding:4px }
  .meal-block{ padding:5px 4px }
  .meal-block .swatch{ width:2px }
  .meal-block .nm{ font-size:11px; padding-left:4px; line-height:1.1 }
  .meal-block .stat-line{ font-size:8.5px; padding-left:4px }
  .meal-block .x{ display:none }   /* no hover on touch; tap the block to edit */

  /* Shopping */
  .shop-wrap{ grid-template-columns: 1fr; gap:18px }
  .shop-title{ font-size:28px !important }
  .shop-summary{ position:static; padding:18px; order:-1 }
  .shop-summary .total{ font-size:42px }
  .shop-row{ padding:11px 14px }
  .aisle-head{ padding:12px 14px }
  .shop-row .nm{ font-size:13.5px }
  .shop-row .nm .src{ display:block; margin-left:0; margin-top:2px }

  /* Friends */
  .friends-wrap{ grid-template-columns: 1fr; gap:24px }
  .friends-title{ font-size:28px !important }
  .activity-item{ grid-template-columns: 40px 1fr; gap:10px; padding:14px 0 }
  .activity-item .ago{ grid-column: 2; grid-row: 2; padding-top:4px }
  .activity-item .recipe-link{ max-width:none }
  .activity-item .body{ grid-row: 1 / span 2; grid-column: 2 }
  .friend-card{ padding:12px }
  .friend-card .bio{ font-size:12.5px }

  /* Profile */
  .profile-hero{ flex-direction:column; align-items:flex-start; gap:14px; margin-bottom:22px }
  .profile-hero .who h1{ font-size:32px }
  .profile-stats{ grid-template-columns: repeat(2, 1fr); margin-bottom:24px }
  .profile-stats .s{ padding:14px }
  .profile-stats .s .v{ font-size:26px }
  .avatar.xl{ width:56px; height:56px; font-size:22px }

  /* Modal */
  .modal{ width:96vw; max-height:90vh; border-radius:var(--rad-m) }
  .modal-head{ padding:18px 18px 10px }
  .modal-head .h-title{ font-size:20px }
  .modal-friend{ padding:10px 12px }

  /* Bottom nav (mobile primary) */
  .bottom-nav{
    position:fixed; bottom:0; left:0; right:0;
    height:64px;
    background: rgba(12, 9, 7, 0.92);
    -webkit-backdrop-filter: blur(20px) saturate(160%);
    backdrop-filter: blur(20px) saturate(160%);
    border-top:1px solid var(--hairline);
    display:flex; align-items:stretch;
    z-index:50;
    padding:6px 4px env(safe-area-inset-bottom, 6px);
  }
  .bn-item{
    flex:1;
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px;
    color:var(--dim);
    border-radius:8px;
    position:relative;
    padding:6px 2px;
    font-size:10px; letter-spacing:.02em;
    transition: color .15s, background .15s;
  }
  .bn-item span{ font-size:10px; font-weight:500 }
  .bn-item .ic{ width:18px; height:18px; opacity:.85 }
  .bn-item.active{ color:var(--gold) }
  .bn-item.active .ic{ opacity:1 }
  .bn-item.active::before{
    content:""; position:absolute; top:0; left:30%; right:30%;
    height:2px; background:var(--gold); border-radius:2px;
  }
  .bn-badge{
    position:absolute; top:5px; right: calc(50% - 22px);
    font-family:var(--font-mono); font-size:9px;
    background:var(--burgundy); color:#fff;
    padding:1px 4px; border-radius:8px;
    min-width:14px; text-align:center;
  }

  /* Tweaks panel — make sure it doesn't cover bottom nav */
  .twk-panel{
    bottom: 76px !important;
    width: calc(100vw - 32px) !important;
    max-width: 320px;
  }

  /* Filter pills shrink */
  .filter-bar-mobile-hint{
    display: block;
  }
}

/* Tablet — keep some sidebar but slim */
@media (min-width: 761px) and (max-width: 1100px){
  :root{ --sidebar-w: 200px }
  .discover-hero .titles{ gap:14px }
  .h-display{ font-size:clamp(32px, 4.4vw, 48px) }
  .detail{ grid-template-columns: 1fr; gap:24px }
  .detail-bottom{ grid-template-columns: 1fr; gap:24px }
  /* Stacked full-width: the 4/5 portrait would be far too tall here, so use a
     landscape banner ratio (the ≤760 breakpoint does the same with 4/3). */
  .detail-photo,
  .detail-photo .recipe-photo{ aspect-ratio: 16/9 }

  /* Planner: a 280px sidebar beside the week squeezes the seven days into thin
     bars here. Stack instead — week on top at full width, recipe list beneath
     it as a horizontal row of cards. */
  /* minmax(0,1fr) — NOT plain 1fr (= minmax(auto,1fr)) — so the column ignores
     the recipe pile's intrinsic width. With plain 1fr the nowrap row of cards
     blows the column (and thus the week grid) far past the viewport. */
  .planner-wrap{ grid-template-columns: minmax(0, 1fr); gap:24px }
  .planner-main{ order: 1; min-width: 0 }
  .planner-side{ order: 2; position: static; max-height: none; min-width: 0 }
  /* Under the week, the pile WRAPS into rows and scrolls vertically. A hidden
     horizontal strip can't be scrolled with a mouse wheel (only touch pans it),
     which left it feeling frozen on desktop-width windows. Wrapping + vertical
     overflow works with wheel, trackpad and touch alike. */
  .planner-side .recipe-pile{
    flex-direction: row; flex-wrap: wrap; gap: 8px;
    max-height: 46vh; overflow-y: auto; overflow-x: hidden;
    padding-right: 4px; padding-bottom: 0;
  }
  .pile-card{ flex: 1 1 160px; max-width: 280px; width: auto }

  /* Once stacked, the week fills its container, so drop the horizontal scroll
     context and let the grid claim the full row. */
  .week-scroller{ overflow: visible; padding-bottom: 0 }
  .week-grid, .week-totals{ width: 100%; min-width: 0 }
}


/* ─────────────────────────────────────────────────────────────────────────────
   Admin Dashboard
   ───────────────────────────────────────────────────────────────────────────── */
.admin-wrap{ max-width:1200px; margin:0 auto }
.admin-head{ display:flex; align-items:flex-end; justify-content:space-between; margin-bottom:28px; gap:18px }
.admin-tabs{
  display:flex; gap:2px;
  border-bottom:1px solid var(--border);
  margin-bottom:24px;
  overflow-x:auto;
  scrollbar-width:none;
}
.admin-tabs::-webkit-scrollbar{ display:none }
.admin-tab{
  display:flex; align-items:center; gap:8px;
  padding:10px 16px;
  font-family:var(--font-mono); font-size:11px;
  letter-spacing:.10em; text-transform:uppercase;
  color:var(--dim);
  border-bottom:2px solid transparent;
  margin-bottom:-1px;
  transition: color .15s, border-color .15s;
  white-space:nowrap;
}
.admin-tab:hover{ color:var(--text-2) }
.admin-tab.active{ color:var(--gold); border-bottom-color:var(--gold) }
.admin-tab .ic{ opacity:.7 }
.admin-tab.active .ic{ opacity:1 }
.admin-body{ }

/* Role badges */
.role-badge{
  display:inline-flex; align-items:center; gap:5px;
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.10em; text-transform:uppercase;
  padding:3px 9px; border-radius:3px;
  border:1px solid var(--border);
  background:var(--surface-2);
  color:var(--text-2);
  white-space:nowrap;
}
.role-badge.sm{ font-size:9px; padding:2px 7px }
.role-badge.editable{ cursor:pointer; transition: filter .15s, border-color .15s }
.role-badge.editable:hover{ filter: brightness(1.15); border-color:var(--gold-soft) }
.role-badge.editable .ic{ opacity:.6; margin-left:1px }
.role-badge:disabled{ cursor:default; opacity:.7 }

.role-badge.role-user{
  color:#9aa1a8; border-color:#33373a; background:#1d1f21;
}
.role-badge.role-member{
  color:#7fb0e0; border-color:#26405a; background:#141b24;
}
.role-badge.role-moderator{
  color:#67c885; border-color:#234d31; background:#152018;
}
.role-badge.role-admin{
  color:#d4a847; border-color:#4d3c1a; background:#1f1810;
}
.role-badge.role-owner{
  color:#e58b8b; border-color:#5a2222; background:#1f1414;
}

.role-dot{
  display:inline-block; width:7px; height:7px; border-radius:50%;
}
.role-dot.role-user{ background:#9aa1a8 }
.role-dot.role-member{ background:#7fb0e0 }
.role-dot.role-moderator{ background:#67c885 }
.role-dot.role-admin{ background:#d4a847 }
.role-dot.role-owner{ background:#e58b8b }

.role-menu{
  position:absolute; top:calc(100% + 4px); left:0;
  z-index:50;
  background: var(--surface-2);
  border:1px solid var(--border-2);
  border-radius:var(--rad-s);
  padding:4px;
  min-width:160px;
  box-shadow: 0 12px 32px -8px rgba(0,0,0,.6);
  display:flex; flex-direction:column; gap:1px;
}
.role-menu-item{
  display:flex; align-items:center; gap:8px;
  padding:7px 10px;
  font-family:var(--font-mono); font-size:10.5px;
  letter-spacing:.08em; text-transform:uppercase;
  color:var(--text-2);
  border-radius:4px;
  text-align:left;
  width:100%;
}
.role-menu-item:hover:not(:disabled){ background: var(--surface-3); color:var(--text) }
.role-menu-item:disabled{ opacity:.35 }
.role-menu-item.current{ color:var(--gold) }
.role-menu-item .ic{ margin-left:auto }

/* Overview stat cards */
.adm-guest-card{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--rad-m); padding:16px 18px; margin-bottom:18px;
}
.adm-guest-stats{
  margin-top:8px; font-size:11px; color:var(--dim); letter-spacing:.04em;
}
.adm-guest-stats .g-now{ color:#5fbf6a }
.pending-panel{
  background:var(--surface); border:1px solid var(--gold-soft);
  border-radius:var(--rad-m); padding:16px 18px; margin-bottom:18px;
}
.pending-row{
  display:flex; align-items:center; gap:12px;
  padding:8px 0; border-top:1px solid var(--border);
}
.pending-row:first-of-type{ border-top:0 }
.pending-row .info{ flex:1; min-width:0 }
.pending-row .info .nm{ font-family:var(--font-serif); font-size:15px; color:var(--text) }
.pending-row .info .hd{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.06em }

/* Admin tab pending-count badge */
.admin-tab-badge{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:18px; height:18px; padding:0 6px;
  font-size:10px; letter-spacing:.04em;
  border-radius:9px;
  background:var(--gold-glow); color:var(--gold);
  border:1px solid var(--gold-soft);
}
.admin-tab.active .admin-tab-badge{
  background:var(--gold); color:var(--surface);
  border-color:var(--gold);
}

/* Approvals tab */
.admin-approvals .approvals-count{
  color:var(--gold); font-size:11px; letter-spacing:.06em; margin-left:6px;
}
.adm-table.approvals-table .adm-thead,
.adm-table.approvals-table .adm-trow{
  grid-template-columns: 1.4fr 2.2fr 1fr 1.6fr;
}
.approval-row .approval-bio{
  font-size:13px; color:var(--text-2); line-height:1.45; min-width:0;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.approval-row .actions .btn-gold{ padding:5px 12px; font-size:11px }
.approval-row .actions .btn-gold .ic,
.approval-row .actions .danger .ic{ margin-right:2px }

.approvals-empty{
  display:flex; flex-direction:column; align-items:center; gap:6px;
  padding:60px 20px; text-align:center;
  background:var(--surface);
  border:1px dashed var(--border);
  border-radius:var(--rad-m);
  color:var(--dim);
}
.approvals-empty .ic{ color:var(--gold-soft); margin-bottom:8px }
.approvals-empty .ttl{
  font-family:var(--font-serif); font-size:18px; color:var(--text);
}
.approvals-empty .sub{
  font-size:13px; color:var(--dim); max-width:380px;
}

/* Activity log header (row with Clear button) */
.activity-head{
  display:flex; align-items:flex-start; justify-content:space-between; gap:14px;
}
.activity-head > div:first-child{ flex:1; min-width:0 }
.activity-head .btn{ flex-shrink:0; margin-top:4px }

/* Clickable user cells in the admin tables (Users / Approvals) — link the
   whole avatar+name area to the user's profile without disturbing the row's
   grid layout or breaking the in-row action buttons. */
.user-cell.user-cell-link{
  background:transparent; border:0; padding:0;
  cursor:pointer; color:inherit; text-align:left;
  font:inherit; line-height:inherit;
}
.user-cell.user-cell-link:hover .nm{ color:var(--gold) }
.user-cell.user-cell-link:focus-visible{
  outline:1px dashed var(--gold-soft); outline-offset:2px;
  border-radius:var(--rad-xs);
}

/* Same treatment for the overview moderators/admins list rows. */
.adm-list-row.adm-list-row-link{
  width:100%;
  background:transparent; border:0; cursor:pointer;
  font:inherit; color:inherit; text-align:left;
}
.adm-list-row.adm-list-row-link:hover{ background:var(--surface-2) }
.adm-list-row.adm-list-row-link:hover .nm{ color:var(--gold) }

/* "Have at home" toggle on each Ingredients row */
.pantry-toggle{
  display:inline-flex; align-items:center; gap:6px;
  padding:5px 10px; font-size:11px;
  font-family:var(--font-mono); letter-spacing:.04em;
  color:var(--dim); background:var(--surface-2);
  border:1px solid var(--border); border-radius:var(--rad-xs);
  cursor:pointer; transition: color .12s, background .12s, border-color .12s;
}
.pantry-toggle .ic{ opacity:.4 }
.pantry-toggle:hover{ color:var(--text-2); border-color:var(--gold-soft) }
.pantry-toggle.on{
  color:var(--gold); background:var(--gold-glow);
  border-color:var(--gold-soft);
}
.pantry-toggle.on .ic{ opacity:1 }

/* Pantry view */
.pantry-counter{
  display:flex; flex-direction:column; align-items:flex-end;
  margin-left:auto; padding-left:18px;
}
.pantry-counter .big{
  font-family:var(--font-serif); font-size:42px; line-height:1;
  color:var(--gold); font-weight:500;
}
.pantry-counter .big .of{
  font-size:18px; color:var(--dim); margin-left:4px;
}
.pantry-counter .lbl{
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.18em; text-transform:uppercase;
  color:var(--dim); margin-top:4px;
}

.pantry-list{
  display:grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap:6px;
}
.pantry-row{
  display:flex; align-items:center; gap:8px;
  padding:6px 8px 6px 0; text-align:left;
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--rad-xs);
  color:var(--text-2);
  transition: background .12s, border-color .12s, color .12s;
  min-width:0;
}
.pantry-row:hover{ background:var(--surface-2); border-color:var(--gold-soft) }
.pantry-row.have{
  background:var(--gold-glow); border-color:var(--gold-soft);
  color:var(--text);
}
/* The whole left-side (check + name) is one clickable button so the row
   toggles in/out without a separate target, while the qty input lives in
   its own click-stopping container. */
.pantry-check-btn{
  flex:1; min-width:0;
  display:flex; align-items:center; gap:10px;
  padding:9px 0 9px 12px;
  background:transparent; border:0; color:inherit; cursor:pointer;
  text-align:left;
}
.pantry-row .check{
  display:inline-flex; align-items:center; justify-content:center;
  width:18px; height:18px; flex-shrink:0;
  border:1px solid var(--border); border-radius:4px;
  background:var(--surface-2); color:var(--gold);
}
.pantry-row.have .check{
  background:var(--gold); color:var(--surface); border-color:var(--gold);
}
.pantry-row .ing-dot{
  width:14px; height:14px; flex-shrink:0;
  border-radius:50%; border:1px solid rgba(0,0,0,.3);
}
.pantry-row .nm{
  flex:1; min-width:0;
  font-family:var(--font-serif); font-size:14px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.pantry-row .pantry-unit-hint{
  font-size:10px; color:var(--dim); letter-spacing:.06em;
  flex-shrink:0; padding-right:4px;
}

/* Per-row pantry amount control (only shown when the row is `have`).
   Collapsed to a compact chip so the ingredient name keeps the row width;
   tapping it opens the .pantry-qty-pop popover with the slider + exact field. */
.pantry-qty-wrap{ position:relative; flex-shrink:0 }
.pantry-qty-chip{
  display:inline-flex; align-items:center; gap:3px; flex-shrink:0;
  padding:3px 8px; border:1px solid var(--border); border-radius:var(--rad-xs);
  background:var(--surface); cursor:pointer;
  font-family:var(--font-mono); font-size:12px; color:var(--text);
  transition:background .12s, border-color .12s;
}
.pantry-qty-chip:hover{ border-color:var(--gold-soft); background:var(--surface-2) }

/* Popover — same surface/border/shadow language as .search-results. */
.pantry-qty-pop{
  position:absolute; right:0; top:calc(100% + 6px); z-index:30;
  display:inline-flex; align-items:center; gap:4px; padding:6px 8px;
  background:var(--surface-2); border:1px solid var(--border-2);
  border-radius:var(--rad-s); box-shadow:0 14px 40px -10px rgba(0,0,0,.6);
}
.pantry-qty-pop input{
  width:54px; min-width:54px;
  border:0; background:transparent; outline:none;
  font-family:var(--font-mono); font-size:12px;
  color:var(--text); text-align:right; padding:2px 0;
}
.pantry-qty-pop input::placeholder{ color:var(--faint) }
/* Range slider sits to the LEFT of the number so phone users can drag the
   amount up/down quickly. Higher specificity than `.pantry-qty-pop input` so the
   text-field width/alignment rule above doesn't apply to the track. */
.pantry-qty-pop input.pantry-qty-slider{
  -webkit-appearance:none; appearance:none;
  width:64px; min-width:64px; height:4px; padding:0;
  background:var(--border); border-radius:999px;
  cursor:pointer; flex-shrink:0;
}
.pantry-qty-pop input.pantry-qty-slider::-webkit-slider-thumb{
  -webkit-appearance:none; appearance:none;
  width:14px; height:14px; border:0; border-radius:50%;
  background:var(--gold); cursor:pointer;
}
.pantry-qty-pop input.pantry-qty-slider::-moz-range-thumb{
  width:14px; height:14px; border:0; border-radius:50%;
  background:var(--gold); cursor:pointer;
}
.pantry-qty-chip .u, .pantry-qty-pop .u{
  font-size:10px; color:var(--dim); letter-spacing:.06em;
  text-transform:lowercase;
}

@media (max-width: 760px){
  .pantry-counter{ margin-top:8px; padding-left:0; align-items:flex-start }
  .pantry-counter .big{ font-size:32px }
  .pantry-list{ grid-template-columns: 1fr }
}

/* ── Cookbooks ─────────────────────────────────────────────────────────────── */
.cookbook-create{
  display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin-bottom:18px;
}
.cookbook-create .inp{
  height:36px; padding:0 10px; font:inherit; font-size:14px; flex:1; min-width:160px;
  color:var(--text); background:var(--surface); outline:0;
  border:1px solid var(--border); border-radius:var(--rad-xs);
}
.cookbook-create select.inp{ flex:0 0 auto; min-width:120px }
.cookbook-grid{
  display:grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap:12px;
}
.cookbook-card{
  display:flex; flex-direction:column; gap:8px; align-items:flex-start;
  padding:16px; text-align:left; cursor:pointer;
  background:var(--surface); border:1px solid var(--border); border-radius:var(--rad-m);
  color:var(--text); transition:background .12s, border-color .12s, transform .12s;
}
.cookbook-card:hover{ background:var(--surface-2); border-color:var(--gold-soft); transform:translateY(-1px) }
.cookbook-card .cb-ic{
  display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; border-radius:var(--rad-xs);
  background:var(--gold-glow); color:var(--gold);
}
.cookbook-card .cb-name{ font-family:var(--font-serif); font-size:17px; line-height:1.25 }
.cookbook-card .cb-meta{ display:flex; gap:8px; align-items:center; flex-wrap:wrap }
.cb-scope{
  font-family:var(--font-mono); font-size:9px; letter-spacing:.08em; text-transform:uppercase;
  padding:2px 6px; border-radius:3px; border:1px solid var(--border); color:var(--text-2);
}
.cb-scope.family{ color:var(--gold); border-color:var(--gold-soft); background:var(--gold-glow) }
.cookbook-card .cb-count{ font-size:11px; color:var(--dim) }
/* Remove-from-cookbook button overlaid on a recipe card in an open book. */
.cookbook-remove{
  position:absolute; top:8px; right:8px; z-index:3;
  width:26px; height:26px; display:flex; align-items:center; justify-content:center;
  border:0; border-radius:50%; cursor:pointer;
  background:rgba(16,12,8,.7); color:#fff; backdrop-filter:blur(2px);
}
.cookbook-remove:hover{ background:rgba(142,39,39,.85) }
/* Picker rows in the "Add to cookbook" modal. */
.cookbook-pick{ display:flex; flex-direction:column; gap:4px }
.cookbook-pick-row{
  display:flex; align-items:center; gap:10px; padding:8px 10px;
  background:var(--surface); border:1px solid var(--border); border-radius:var(--rad-xs);
  color:var(--text); cursor:pointer; text-align:left;
}
.cookbook-pick-row:hover{ background:var(--surface-2) }
.cookbook-pick-row.in{ background:var(--gold-glow); border-color:var(--gold-soft) }
.cookbook-pick-row .check{
  display:inline-flex; align-items:center; justify-content:center;
  width:18px; height:18px; flex-shrink:0;
  border:1px solid var(--border); border-radius:4px; color:var(--gold);
}
.cookbook-pick-row.in .check{ background:var(--gold); color:var(--surface); border-color:var(--gold) }
.cookbook-pick-row .nm{ flex:1; min-width:0; font-family:var(--font-serif); font-size:14px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
@media (max-width: 760px){
  .cookbook-grid{ grid-template-columns: 1fr 1fr }
}
.adm-stats{
  display:grid; grid-template-columns: repeat(4, 1fr);
  gap:1px; background:var(--border);
  border:1px solid var(--border); border-radius:var(--rad-m);
  overflow:hidden; margin-bottom:32px;
}
.adm-stat{
  background:var(--surface);
  padding:18px 20px;
  display:flex; flex-direction:column; gap:4px;
}
.adm-stat .label{
  font-family:var(--font-mono); font-size:10px;
  letter-spacing:.18em; text-transform:uppercase;
  color:var(--dim);
}
.adm-stat .v{
  font-family:var(--font-serif); font-size:38px; line-height:1;
  font-weight:500; color:var(--gold);
}
.adm-stat .u{ font-family:var(--font-mono); font-size:10px; color:var(--faint); letter-spacing:.06em }

/* Overview two-col */
.adm-overview-grid{
  display:grid; grid-template-columns: 1fr 1fr; gap:32px;
}

.adm-list{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  overflow:hidden;
}
.adm-list-row{
  display:flex; align-items:center; gap:10px;
  padding:10px 14px;
  border-bottom:1px solid var(--hairline);
}
.adm-list-row:last-child{ border-bottom:0 }
.adm-list-row .info{ flex:1; min-width:0 }
.adm-list-row .nm{ font-family:var(--font-serif); font-size:14.5px; color:var(--text) }
.adm-list-row .hd{ font-family:var(--font-mono); font-size:10px; color:var(--dim); letter-spacing:.06em }

/* Audit list */
.adm-audit{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  overflow:hidden;
}
.adm-audit .adm-audit-row{
  display:grid; grid-template-columns: 20px 1fr auto;
  gap:10px; align-items:center;
  padding:12px 16px;
  border-bottom:1px solid var(--hairline);
}
.adm-audit .adm-audit-row:last-child{ border-bottom:0 }
.adm-audit .dot{ width:8px; height:8px; border-radius:50%; margin-left:6px }
.adm-audit .body{ min-width:0 }
.adm-audit .line{ font-size:13.5px; color:var(--text-2); line-height:1.4 }
.adm-audit .line b{ color:var(--text); font-weight:600 }
.adm-audit .ago{ font-size:10px; color:var(--dim); letter-spacing:.06em }
.adm-audit.big .adm-audit-row{ padding:16px 20px }
.adm-audit.big .line{ font-size:15px }

/* Toolbar (search + filters + button row) */
.adm-toolbar{
  display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  margin-bottom:18px;
}
.adm-search{ max-width:340px; flex:1; min-width:200px }
.role-filter{ display:inline-flex; gap:6px; flex-wrap:wrap }
.role-filter .chip{ padding:5px 11px; font-size:11px }

/* Generic table */
.adm-table{
  background:var(--surface);
  border:1px solid var(--border);
  border-radius:var(--rad-m);
  overflow:hidden;
}
.adm-thead, .adm-trow{
  display:grid;
  grid-template-columns: 2fr 1.1fr 1fr .7fr 1fr 1.3fr;
  align-items:center;
}
.adm-table.recipes-table .adm-thead,
.adm-table.recipes-table .adm-trow{
  grid-template-columns: 2.2fr 1fr 1.2fr 1fr 1.3fr 1.3fr;
}
/* Read-only recipe library (normal users): no Actions column. */
.adm-table.recipes-table.readonly .adm-thead,
.adm-table.recipes-table.readonly .adm-trow{
  grid-template-columns: 2.2fr 1fr 1.2fr 1fr 1.3fr;
}
.adm-table.ing-table .adm-thead,
.adm-table.ing-table .adm-trow{
  grid-template-columns: 1.5fr 1fr .8fr .8fr 1.4fr;
}
.adm-thead{
  background:var(--surface-2);
  padding:11px 18px;
  font-family:var(--font-mono); font-size:9.5px;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--dim);
  gap:14px;
  border-bottom:1px solid var(--hairline);
}
.adm-thead .num, .adm-trow .num{ text-align:right; font-variant-numeric:tabular-nums }
.adm-thead .ar, .adm-trow .ar{ text-align:right }
.adm-trow{
  padding:12px 18px;
  gap:14px;
  border-bottom:1px solid var(--hairline);
  font-size:13.5px;
  transition: background .12s;
}
.adm-trow:last-child{ border-bottom:0 }
.adm-trow:hover{ background:var(--surface-2) }
.adm-trow.suspended{ opacity:.55; }
.adm-trow.suspended .user-cell .nm::before{
  content:""; display:inline-block; width:6px; height:6px;
  background:var(--burgundy); border-radius:50%; margin-right:7px; vertical-align:middle;
}

.adm-trow .mono{ font-family:var(--font-mono); font-size:11.5px; letter-spacing:.04em }
.adm-trow .dim{ color:var(--dim) }
.adm-trow .gold{ color:var(--gold) }

.user-cell, .nm-cell, .recipe-cell{
  display:flex; align-items:center; gap:10px;
  min-width:0;
}
.recipe-cell{ cursor:pointer }
.recipe-cell:hover .nm{ color:var(--gold) }
.user-cell .info, .nm-cell > div:last-child, .recipe-cell > div:last-child{ min-width:0; flex:1 }
.user-cell .nm, .nm-cell .nm, .recipe-cell .nm{
  font-family:var(--font-serif); font-size:15px; color:var(--text);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  display:flex; align-items:center; gap:8px; flex-wrap:wrap;
}
/* Recipe management table: always show the full recipe title — wrap instead of
   the single-line ellipsis the user/ingredient tables keep. */
.recipe-cell .nm{
  white-space:normal; overflow:visible; text-overflow:clip;
  line-height:1.2; align-items:flex-start;
}
.user-cell .hd, .nm-cell .hd, .recipe-cell .hd{
  font-family:var(--font-mono); font-size:10px; color:var(--dim);
  letter-spacing:.06em;
}
.me-tag{
  font-family:var(--font-mono); font-size:9px;
  color:var(--gold-soft); background:var(--gold-glow);
  padding:1px 6px; border-radius:3px; letter-spacing:.08em;
}
.protected-tag{
  font-family:var(--font-mono); font-size:9px;
  color:var(--dim); background:var(--surface-3);
  padding:1px 6px; border-radius:3px; letter-spacing:.08em;
  border:1px solid var(--border);
}

.rp-num-tag{
  display:inline-flex; align-items:center; justify-content:center;
  width:36px; height:36px; flex-shrink:0;
  background: linear-gradient(135deg, var(--surface-3), var(--surface-2));
  border:1px solid var(--border);
  border-radius:var(--rad-xs);
  font-size:10px; color:var(--gold);
  letter-spacing:.04em;
}
.aisle-tag{
  font-family:var(--font-mono); font-size:10px;
  padding:2px 8px; border-radius:3px;
  background:var(--surface-2); border:1px solid var(--border);
  color:var(--text-2); letter-spacing:.08em; text-transform:lowercase;
}
.ing-dot{
  width:18px; height:18px; border-radius:50%;
  flex-shrink:0;
  border:1px solid rgba(0,0,0,.3);
}
.tag-cell{ display:flex; gap:4px; flex-wrap:wrap; align-items:center }
.tag-cell .tag{ font-size:9.5px; padding:2px 7px }

.actions{ display:flex; gap:6px; justify-content:flex-end; flex-wrap:wrap }
.actions .btn-sm{ padding:5px 10px; font-size:11px }
.actions .danger{ color:#c97c7c }
.actions .danger:hover:not(:disabled){ background: rgba(142,39,39,.18); color:#e58b8b }
.actions .btn:disabled{ opacity:.35; cursor:not-allowed }

/* Mobile admin */
@media (max-width: 760px){
  .admin-head{ flex-direction:column; align-items:flex-start; gap:10px; margin-bottom:18px }
  .adm-stats{ grid-template-columns: repeat(2, 1fr) }
  .adm-stat{ padding:14px }
  .adm-stat .v{ font-size:26px }
  .adm-overview-grid{ grid-template-columns: 1fr }

  .adm-toolbar{ gap:8px }
  .adm-search{ max-width:none; width:100% }

  /* Tables: stack each row as a card */
  .adm-table{ border:0; background:transparent }
  .adm-thead{ display:none }
  .adm-trow{
    display:flex; flex-direction:column; gap:10px;
    padding:14px;
    background:var(--surface);
    border:1px solid var(--border);
    border-radius:var(--rad-m);
    margin-bottom:8px;
  }
  .adm-trow .ar{ text-align:left }
  .actions{ justify-content:flex-start }
}

/* ─────────────────────────────────────────────────────────────────────────────
   Negative preferences · Ingredients page · "Surprise me"
   ───────────────────────────────────────────────────────────────────────────── */
.btn.pref-on{
  background: rgba(142,39,39,.20);
  border-color: rgba(142,39,39,.45);
  color:#e58b8b;
}
.btn.pref-on:hover:not(:disabled){ background: rgba(142,39,39,.30); color:#f0a0a0 }

/* Opinion stepper (Ingredients page). Left half steps toward dislike/hate,
   right half toward like/love. Fixed width + space-between so the centred
   label and side arrows don't shift as the state changes. */
.btn.pref-stepper{
  min-width:132px; display:flex; align-items:center;
  justify-content:space-between; gap:6px;
  border-color:var(--border-2); user-select:none;
}
.btn.pref-stepper:hover:not(:disabled){ filter:brightness(1.12) }
.btn.pref-stepper .ps-label{
  flex:1; display:inline-flex; align-items:center; justify-content:center; gap:5px;
}
.btn.pref-stepper .ps-arrow{ font-size:15px; line-height:1; opacity:.7 }
.btn.pref-stepper .ps-arrow.off{ opacity:.2 }
.btn.pref-stepper.pref-neutral{ background:transparent; color:var(--dim) }
.btn.pref-stepper.pref-like{ background:rgba(212,168,71,.12); border-color:rgba(212,168,71,.40); color:var(--gold) }
.btn.pref-stepper.pref-love{ background:rgba(212,168,71,.24); border-color:rgba(212,168,71,.60); color:var(--gold) }
.btn.pref-stepper.pref-dislike{ background:rgba(142,39,39,.18); border-color:rgba(142,39,39,.42); color:#e58b8b }
.btn.pref-stepper.pref-hate{ background:rgba(142,39,39,.34); border-color:rgba(142,39,39,.60); color:#f0a0a0 }

/* Topbar notifications dropdown (bell). */
.notif-menu{
  position:absolute; right:0; top:calc(100% + 8px); z-index:61;
  width:300px; max-height:60vh; overflow-y:auto;
  background:var(--surface-2); border:1px solid var(--border-2);
  border-radius:var(--rad-s); padding:6px;
  box-shadow:0 14px 40px -10px rgba(0,0,0,.6);
}
.notif-head{
  font-family:var(--font-mono); font-size:10px; letter-spacing:.10em;
  text-transform:uppercase; color:var(--dim); padding:8px 10px 6px;
}
.notif-empty{ padding:14px 12px; color:var(--dim); font-size:13px; text-align:center }
.notif-status{
  display:flex; align-items:flex-start; gap:9px; padding:9px 10px;
  margin-bottom:2px; color:var(--text-2);
  border-bottom:1px solid var(--border);
}
.notif-status .nt{ flex:1; min-width:0; font-size:12px; line-height:1.45 }
.notif-status .nt b{ color:var(--text) }
.notif-foot-link{
  width:100%; margin-top:4px; padding:9px 10px; border:0;
  background:transparent; cursor:pointer; font:inherit; font-size:12px;
  color:var(--gold); text-align:center; border-radius:var(--rad-xs);
}
.notif-foot-link:hover{ background:var(--surface-3) }
.notif-item{ display:flex; align-items:stretch; gap:4px }
.notif-main{
  flex:1; min-width:0; display:flex; align-items:center; gap:9px;
  padding:9px 10px; border:0; background:transparent; cursor:pointer;
  color:var(--text-2); text-align:left; border-radius:var(--rad-xs); font:inherit;
}
.notif-main:hover{ background:var(--surface-3); color:var(--text) }
.notif-main .nt{ flex:1; min-width:0; font-size:12.5px; line-height:1.4 }
.notif-main .nt i{ font-family:var(--font-serif); font-style:italic; color:var(--text) }
.notif-main .nt-ago{ font-size:10px; color:var(--dim); flex-shrink:0 }
.notif-x{
  flex-shrink:0; width:26px; border:0; background:transparent; cursor:pointer;
  color:var(--dim); border-radius:var(--rad-xs);
}
.notif-x:hover{ background:rgba(142,39,39,.18); color:#e58b8b }

/* Clickable user names → open that user's profile. */
.user-link{ cursor:pointer }
.user-link:hover{ color:var(--gold); text-decoration:underline }

/* Chef level (+ restaurant) line on the profile hero. */
.profile-hero .chef-line{
  margin-top:8px; font-family:var(--font-mono); font-size:11px;
  letter-spacing:.10em; text-transform:uppercase; color:var(--gold);
}

.ing-list{
  display:flex; flex-direction:column; gap:1px;
  background:var(--border); border:1px solid var(--border);
  border-radius:var(--rad-m); overflow:hidden;
}
.ing-row{
  display:flex; align-items:center; gap:12px;
  padding:11px 14px; background:var(--surface);
}
.ing-row.blocked{ opacity:.5 }
.ing-row .nm{ font-size:14px; font-weight:500 }
.ing-row .hd{ font-size:11px; color:var(--dim) }
.ing-nonutri{ color:#9e2b2b; display:inline-flex; vertical-align:-2px }
.ing-actions{ display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end }

/* Cook together */
.ct-compat{
  display:flex; align-items:center; gap:18px;
  background:var(--raise); border:1px solid var(--border-2);
  border-radius:14px; padding:18px 22px; margin-bottom:8px;
}
.ct-compat-pct{
  font-family:var(--font-mono); font-size:34px; font-weight:600;
  color:var(--gold); line-height:1;
}
.ct-compat-lbl{ font-size:15px; font-weight:600; margin-bottom:2px }
.ct-list{ display:flex; flex-direction:column; gap:8px }
.ct-row{
  display:flex; align-items:center; gap:14px; width:100%; text-align:left;
  background:var(--raise); border:1px solid var(--hairline);
  border-radius:12px; padding:12px 14px; cursor:pointer;
  color:var(--text); transition:border-color .12s, background .12s;
}
.ct-row:hover{ border-color:var(--gold-soft); background:var(--bg-2) }
.ct-pct{
  font-family:var(--font-mono); font-size:17px; font-weight:600;
  min-width:54px; text-align:center; color:var(--dim);
}
.ct-pct[data-tier="hi"]{ color:var(--gold) }
.ct-pct[data-tier="mid"]{ color:var(--text-2) }
.ct-info{ flex:1; min-width:0 }
.ct-info .nm{ font-size:14px; font-weight:500 }
.ct-info .hd{ font-size:11px; color:var(--dim); font-family:var(--font-mono) }
.ct-go{ color:var(--dim); font-size:18px }
.ct-shared{ margin-top:20px; font-size:12px; color:var(--text-2); line-height:1.7 }
.ct-tag{
  display:inline-block; font-size:10px; letter-spacing:.06em;
  text-transform:uppercase; padding:1px 7px; border-radius:6px;
  margin-right:8px; font-weight:600;
}
.ct-tag.ok{ background:var(--gold-glow); color:var(--gold) }
.ct-tag.no{ background:rgba(142,39,39,.16); color:#e58b8b }

/* Import recipe — ingredient reconciliation */
.imp-row{
  display:flex; align-items:center; gap:14px;
  padding:8px 0; border-bottom:1px solid var(--hairline);
}
.imp-row:last-child{ border-bottom:0 }
.imp-raw{
  flex:1; min-width:0; font-size:12px; color:var(--text-2);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.imp-ctl{ display:flex; align-items:center; gap:10px; flex:0 0 320px }
.imp-ctl .fld-select{ flex:1; min-width:0 }
.imp-alias{
  display:flex; align-items:center; gap:4px; cursor:pointer;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.06em;
  text-transform:uppercase; color:var(--dim); white-space:nowrap;
}
.imp-alias input{ accent-color:var(--gold) }

.suggest-thumb{
  width:84px; height:84px; flex-shrink:0; border-radius:var(--rad-m);
  display:flex; align-items:center; justify-content:center;
  font-family:var(--font-serif); font-size:44px; color:#fff;
  text-transform:uppercase;
  background: oklch(45% 0.09 var(--hue, 40));
}

/* ── Mobile: hamburger drawer (bottom-nav still primary) ──────────────────── */
@media (max-width: 760px){
  .bottom-nav{ overflow-x:auto; scrollbar-width:none }
  .bottom-nav::-webkit-scrollbar{ display:none }
  .bottom-nav .bn-item{ min-width:68px; flex:0 0 auto }

  .nav-drawer-back{
    position:fixed; inset:0; z-index:200;
    background:rgba(0,0,0,.55);
    opacity:0; pointer-events:none; transition:opacity .2s ease;
  }
  .nav-drawer-back.open{ opacity:1; pointer-events:auto }
  .nav-drawer{
    position:absolute; top:0; left:0; bottom:0;
    width:min(82vw, 300px);
    background:var(--surface); border-right:1px solid var(--border);
    padding:18px 12px; display:flex; flex-direction:column; gap:6px;
    overflow-y:auto;
    transform:translateX(-104%);
    transition:transform .22s cubic-bezier(.3,.7,.4,1);
    box-shadow:0 0 40px rgba(0,0,0,.5);
  }
  .nav-drawer.open{ transform:translateX(0) }
  .nav-drawer-foot{
    margin-top:auto; padding-top:12px;
    border-top:1px solid var(--border);
    display:flex; flex-direction:column; gap:8px;
  }
}

/* ─────────────────────────────────────────────────────────────────────────────
   Print — the Shopping list "Print" button. Strip app chrome and the summary
   panel; print only the aisle-grouped checklist on white.
   ───────────────────────────────────────────────────────────────────────────── */
@media print {
  .sidebar, .topbar, .bottom-nav, .ad-slot, .ad-slot-v, .toast-wrap,
  .nav-drawer, .scroll-fade, .shop-summary, .shop-add { display:none !important }
  html, body, .app, .main, .content { background:#fff !important; color:#000 !important }
  .content { padding:0 !important }
  .shop-wrap { display:block !important }
  .aisle { border:0 !important; background:#fff !important; break-inside:avoid; margin-bottom:10px }
  .aisle-head { color:#000 !important; border-bottom:1px solid #000 !important }
  .aisle-head .count { color:#444 !important }
  .shop-row { color:#000 !important; border-bottom:1px solid #ddd !important; cursor:auto }
  .shop-row .nm, .shop-row .q { color:#000 !important }
  .shop-row .src { color:#555 !important }
  .shop-x { display:none !important }
  .shop-row .check { border-color:#000 !important }
}
