/* MacroSnap — app.css
   Frost design language, built from the token table and glass recipe in
   design/README.md (the v3 prototype styles everything inline — this sheet is
   the single place those values live). Aurora arc + capsule bars, glass
   surfaces, 99px pills; tabular numerals everywhere. */

/* ---------- 1 · Fonts (self-hosted variable woff2) ---------- */
@font-face{font-family:"Gabarito";font-style:normal;font-weight:400 900;font-display:swap;
  src:url("/static/fonts/gabarito-vf.woff2") format("woff2")}
@font-face{font-family:"Onest";font-style:normal;font-weight:100 900;font-display:swap;
  src:url("/static/fonts/onest-vf.woff2") format("woff2")}

/* ---------- 2 · Tokens (design/README.md § Design Tokens) ---------- */
:root{
  /* ink & lines */
  --ink:#0e2a2b;
  --ink-70:rgba(14,42,43,.7);--ink-60:rgba(14,42,43,.6);--ink-55:rgba(14,42,43,.55);
  --ink-50:rgba(14,42,43,.5);--ink-45:rgba(14,42,43,.45);--ink-40:rgba(14,42,43,.4);
  --track:rgba(14,42,43,.07);      /* empty bar / capsule track */
  --arc-track:rgba(14,42,43,.08);
  --hairline:rgba(14,42,43,.06);   /* row dividers */
  /* accent ramp */
  --teal:#0fb2a4;--teal-light:#33d6c8;--teal-bright:#3fe0cf;
  --teal-deep:#0b8f85;--teal-hover:#087f76;
  /* per-macro hues + gradient tops */
  --p:#0fb2a4;--p-hi:#4fe3d4;--c:#5f7dff;--c-hi:#93a8ff;--f:#ff9550;--f-hi:#ffc491;
  --arc-end:#6f8dff;
  --danger:#c2543c;
  /* ground + the three radial washes (README token table; sizes scale up on desktop) */
  --ground:#f3f9f8;
  --wash-1:rgba(51,214,200,.18);--wash-2:rgba(111,141,255,.12);--wash-3:rgba(255,162,94,.10);
  --washes:
    radial-gradient(420px 300px at 85% -5%,var(--wash-1),transparent),
    radial-gradient(380px 320px at -12% 30%,var(--wash-2),transparent),
    radial-gradient(420px 340px at 62% 112%,var(--wash-3),transparent);
  /* glass recipe */
  --glass-bg:rgba(255,255,255,.55);
  --glass-border:rgba(255,255,255,.9);
  --glass-shadow:0 10px 34px rgba(10,60,60,.10),inset 0 1px 0 rgba(255,255,255,.95);
  --chrome-bg:rgba(255,255,255,.6);          /* lighter variant: avatars, chips, nav */
  --chrome-shadow:0 6px 18px rgba(10,60,60,.10);
  --cta-grad:linear-gradient(135deg,var(--teal-bright),var(--teal));
  --cta-shadow:0 14px 30px rgba(15,178,164,.45),inset 0 1px 0 rgba(255,255,255,.5);
  /* radii */
  --r-hero:30px;--r-card:26px;--r-form:28px;--r-tile:24px;--r-row:22px;--r-input:18px;--r-pill:99px;
  /* type */
  --font-display:"Gabarito",system-ui,sans-serif;
  --font-ui:"Onest",system-ui,sans-serif;
}

/* ---------- 3 · Keyframes ---------- */
@keyframes fs-scan{0%{top:8%}50%{top:86%}100%{top:8%}}
@keyframes fs-dot{0%,100%{opacity:.25;transform:scale(.85)}50%{opacity:1;transform:scale(1.1)}}

/* ---------- 4 · Reset / base / typography ---------- */
*,*::before,*::after{box-sizing:border-box}
body{margin:0;color:var(--ink);
  background:var(--ground);
  background-image:var(--washes);
  background-attachment:fixed;
  font-family:var(--font-ui);font-size:15px;line-height:1.55;font-weight:400;
  font-variant-numeric:tabular-nums;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4,h5,h6{font-family:var(--font-display);line-height:1.1;margin:0 0 8px}
h1{font-size:36px;font-weight:800}
h2{font-size:24px;font-weight:800}
h3{font-size:19px;font-weight:700}
h4{font-size:17px;font-weight:700}
h5{font-size:15px;font-weight:700}
h6{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em}
p{margin:0 0 10px}
a{color:var(--teal-deep);text-underline-offset:3px}
a:hover{color:var(--teal-hover)}
img{display:block;max-width:100%}
figure{margin:0}
figcaption{font-size:11px;margin-top:4px;color:var(--ink-55)}
[x-cloak]{display:none!important}
.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- 5 · Focus / selection ---------- */
:focus{outline:none}
:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
::selection{background:rgba(51,214,200,.3)}

/* ---------- 6 · Frost primitives ---------- */

/* Glass surfaces — the core recipe with size modifiers. */
.glass{background:var(--glass-bg);border:1px solid var(--glass-border);
  box-shadow:var(--glass-shadow);
  backdrop-filter:blur(22px) saturate(1.5);-webkit-backdrop-filter:blur(22px) saturate(1.5)}
.glass--hero{border-radius:var(--r-hero);padding:20px}
.glass--card{border-radius:var(--r-card);padding:18px 20px}
.glass--form{border-radius:var(--r-form);padding:20px}
.glass--tile{border-radius:var(--r-tile);padding:16px 18px;
  backdrop-filter:blur(20px) saturate(1.5);-webkit-backdrop-filter:blur(20px) saturate(1.5)}

/* Buttons — 99px pills. */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  cursor:pointer;text-decoration:none;
  font-family:var(--font-ui);font-weight:600;font-size:14px;line-height:1.2;
  color:var(--ink);background:transparent;border:0;border-radius:var(--r-pill);
  padding:13px 20px}
.btn svg{display:block}
.btn:disabled{opacity:0.45;cursor:not-allowed}
.btn-primary{background:var(--cta-grad);color:#fff;box-shadow:var(--cta-shadow)}
.btn-primary:hover{filter:brightness(1.05)}
.btn-primary:active{filter:brightness(0.97)}
.btn-secondary{background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:var(--chrome-shadow);
  backdrop-filter:blur(16px) saturate(1.5);-webkit-backdrop-filter:blur(16px) saturate(1.5)}
.btn-secondary:hover{background:rgba(255,255,255,.8)}
.btn-secondary:active{background:rgba(255,255,255,.85)}
.btn-ghost{color:var(--teal-deep);padding-inline:8px}
.btn-ghost:hover{background:rgba(51,214,200,.12)}
.btn-ghost:active{background:rgba(51,214,200,.2)}
.btn-icon{width:40px;height:40px;padding:0}
.btn-block{width:100%;margin-top:8px}
.btn--lg{min-height:54px;font-size:15px;font-weight:700}
.btn--danger{color:var(--danger)}

/* Tags & pills. */
.tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;
  letter-spacing:0.02em;padding:4px 11px;border-radius:var(--r-pill)}
.tag-neutral{background:rgba(14,42,43,.06);color:var(--ink-70)}
.confidence-pill{display:inline-flex;align-items:center;font-size:11px;font-weight:700;
  padding:4px 11px;border-radius:var(--r-pill);color:var(--teal-deep);
  background:rgba(51,214,200,.16);border:1px solid rgba(51,214,200,.35)}
.confidence-pill--low{color:var(--ink-60);background:rgba(14,42,43,.06);
  border-color:rgba(14,42,43,.12)}
.over-pill{display:inline-flex;align-items:center;font-size:11px;font-weight:600;
  padding:4px 11px;border-radius:var(--r-pill);color:var(--ink-70);
  background:rgba(14,42,43,.06);border:1px solid rgba(14,42,43,.12)}
.dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}

/* Fields — 48px inputs on 18px radius. */
.field>label{display:block;font-size:11.5px;font-weight:600;letter-spacing:0.06em;
  text-transform:uppercase;margin-bottom:6px;color:var(--ink-50)}
.input{width:100%;min-height:48px;padding:10px 14px;font:inherit;font-size:14px;
  color:var(--ink);caret-color:var(--teal);
  background:rgba(255,255,255,.7);border:1px solid rgba(255,255,255,.95);
  border-radius:var(--r-input);box-shadow:0 2px 8px rgba(10,60,60,.05)}
.input:hover{border-color:rgba(255,255,255,1)}
textarea.input{min-height:64px;resize:vertical}
.input::placeholder{color:var(--ink-40)}

/* Segmented control — pill track, white selected segment. */
.seg{display:inline-flex;gap:4px;padding:5px;border-radius:var(--r-pill);
  background:rgba(14,42,43,.05)}
.seg-opt{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  min-height:40px;padding:7px 14px;font-size:13px;font-weight:600;color:var(--ink-60);
  cursor:pointer;border-radius:var(--r-pill)}
.seg-opt input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}
.seg-opt:has(input:checked){background:rgba(255,255,255,.95);color:var(--ink);
  font-weight:700;box-shadow:0 3px 10px rgba(10,60,60,.10)}
.seg-opt:not(:has(input:checked)):hover{color:var(--ink)}
.seg-opt:has(input:focus-visible){outline:2px solid var(--teal);outline-offset:-2px}
.seg--block{display:flex}
.seg--block .seg-opt{flex:1;justify-content:center}
.training-days .seg-opt{padding:7px 0;font-size:12px}  /* 7 chips must fit at 390px */

/* Avatars — glass circles; --grad for the gradient variant. */
.avatar{display:grid;place-items:center;border-radius:50%;flex:none;
  font-family:var(--font-display);font-weight:700;font-size:14px;color:var(--teal-deep);
  background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:var(--chrome-shadow)}
.avatar--26{width:26px;height:26px;font-size:12px}
.avatar--28{width:28px;height:28px;font-size:12px}
.avatar--34{width:34px;height:34px;font-size:15px}
.avatar--44{width:44px;height:44px;font-size:15px}
.avatar--grad{background:var(--cta-grad);border:0;color:#fff}
.avatar--grad.avatar--c{background:linear-gradient(135deg,var(--c-hi),var(--c))}
.avatar--grad.avatar--f{background:linear-gradient(135deg,var(--f-hi),var(--f))}

/* Screen headers. */
.page-head{display:flex;align-items:flex-start;justify-content:space-between;
  gap:14px;padding:18px 0 14px}
.page-title{font-family:var(--font-display);font-weight:800;font-size:36px;line-height:1.05}
.page-title--sub{font-size:24px}
.page-date{font-size:13px;color:var(--ink-55);margin-top:4px;
  display:flex;align-items:center;gap:2px}
.back-circle{display:grid;place-items:center;width:40px;height:40px;flex:none;
  border-radius:50%;cursor:pointer;color:var(--ink);text-decoration:none;
  background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:var(--chrome-shadow);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
.back-circle:hover{background:rgba(255,255,255,.85)}
.head-row{display:flex;align-items:center;gap:12px;padding:18px 0 14px}

/* Floating nav — glass circle trio with camera FAB (Today + Dashboard only). */
.float-nav{position:fixed;inset-inline:0;bottom:max(26px,env(safe-area-inset-bottom));
  z-index:40;display:flex;justify-content:center;align-items:center;gap:20px;
  pointer-events:none}
.float-nav>*{pointer-events:auto}
.nav-circle{display:grid;place-items:center;width:46px;height:46px;border-radius:50%;
  color:var(--ink);text-decoration:none;cursor:pointer;
  background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:var(--chrome-shadow);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
.nav-circle svg{opacity:.55}
.nav-circle:hover{background:rgba(255,255,255,.85)}
.nav-circle[aria-current="page"]{color:var(--teal-deep)}
.nav-circle[aria-current="page"] svg{opacity:1}
.fab{width:62px;height:62px;border-radius:50%;border:0;cursor:pointer;
  display:grid;place-items:center;color:#fff;
  background:var(--cta-grad);box-shadow:var(--cta-shadow)}
.fab:hover{filter:brightness(1.05)}
.fab:active{filter:brightness(0.97)}

/* Aurora arc — the hero kcal gauge (240×132 half-circle, dasharray from stats.py). */
.arc-wrap{position:relative;width:240px;height:132px;margin:0 auto}
.arc{display:block;filter:drop-shadow(0 8px 16px rgba(51,214,200,.28))}
.arc-track{fill:none;stroke:var(--arc-track);stroke-width:15;stroke-linecap:round}
.arc-fill{fill:none;stroke:url(#arc-grad);stroke-width:15;stroke-linecap:round;
  transition:stroke-dasharray .6s ease-out}
.arc-center{position:absolute;left:0;right:0;bottom:0;text-align:center}
.arc-num{font-family:var(--font-display);font-weight:800;font-size:44px;line-height:1}
.arc-sub{font-size:12px;font-weight:600;color:var(--ink-55);margin-top:2px}
.arc-over-row{text-align:center;margin-top:10px}

/* Capsule bars — hero gauge, meal detail, dashboard macro averages. */
.cap-list{display:grid;gap:11px;margin-top:18px}
.cap-row{display:grid;grid-template-columns:56px minmax(0,1fr) 74px;gap:12px;
  align-items:center}
.cap-label{font-size:12px;font-weight:600;color:var(--ink-60)}
.cap-track{position:relative;height:10px;border-radius:var(--r-pill);
  background:var(--track);overflow:hidden}
.cap-fill{position:absolute;left:0;top:0;bottom:0;border-radius:var(--r-pill);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6);transition:width .6s ease-out}
.cap-fill.is-p{background:linear-gradient(180deg,var(--p-hi),var(--p))}
.cap-fill.is-c{background:linear-gradient(180deg,var(--c-hi),var(--c))}
.cap-fill.is-f{background:linear-gradient(180deg,var(--f-hi),var(--f))}
.cap-val{font-size:11.5px;color:var(--ink-55);text-align:right;white-space:nowrap}
.cap-val--over{font-weight:700}
.cap-val--over.is-p{color:var(--p)}
.cap-val--over.is-c{color:var(--c)}
.cap-val--over.is-f{color:var(--f)}
.cap-row--tight{grid-template-columns:56px minmax(0,1fr) 52px}

/* Connection-check result (Settings, htmx-swapped from the server). */
.conn-result{font-size:13px}
.conn-result--ok{color:var(--teal-deep)}
.conn-result--err{color:var(--danger)}

/* Today header extras. */
.back-mini{display:grid;place-items:center;width:28px;height:28px;border-radius:50%;
  color:var(--ink);background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:var(--chrome-shadow)}
a.back-mini:hover{background:rgba(255,255,255,.85)}
.back-mini[aria-disabled="true"]{opacity:.35}
.page-date .back-mini{margin-inline:2px}
.page-head-end{display:flex;flex-direction:column;align-items:flex-end;gap:8px}

/* Meal list — glass rows. */
.list-head{display:flex;justify-content:space-between;align-items:center;
  padding:20px 0 10px}
.list-head-end{display:flex;align-items:center;gap:10px}
.list-count{font-size:12px;color:var(--ink-50)}
.manual-pill{padding:6px 11px;border-radius:var(--r-pill);font-size:11.5px;font-weight:600;
  color:var(--teal-deep);text-decoration:none;
  background:var(--chrome-bg);border:1px solid var(--glass-border)}
.manual-pill:hover{background:rgba(255,255,255,.9);color:var(--teal-deep)}
/* v1.5 day-type toggle chip: training reads accent, rest reads neutral. */
.day-pill{cursor:pointer;font:inherit;font-size:11.5px;font-weight:600}
.day-pill:not(.is-training){color:var(--ink-55)}
.meal-list{display:grid;gap:10px}
.meal-row{display:flex;gap:12px;align-items:center;padding:12px;
  border-radius:var(--r-row);background:var(--glass-bg);
  border:1px solid rgba(255,255,255,.85);box-shadow:0 6px 20px rgba(10,60,60,.07);
  backdrop-filter:blur(18px) saturate(1.5);-webkit-backdrop-filter:blur(18px) saturate(1.5);
  transition:transform .15s,background .15s}
.meal-row:hover{transform:translateY(-1px);background:rgba(255,255,255,.7)}
.meal-thumb{width:56px;height:56px;border-radius:var(--r-input);overflow:hidden;flex:none;
  border:1px solid var(--glass-border)}
.meal-thumb img{width:100%;height:100%;object-fit:cover}
.meal-thumb--empty{display:grid;place-items:center;
  background:linear-gradient(135deg,#c9f4ee,#8fd9ff);color:var(--ink-55)}
.meal-row-main{flex:1;min-width:0;text-decoration:none;color:inherit}
.meal-name{font-size:15px;font-weight:600;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.meal-meta{display:flex;align-items:center;gap:8px;margin-top:7px}
.meal-time{font-size:11px;color:var(--ink-50)}
.meal-kcal-stack{text-align:right;flex:none}
.meal-kcal{font-family:var(--font-display);font-weight:700;font-size:17px}
.meal-kcal-unit{font-size:10px;color:var(--ink-45)}

/* Empty states. */
.empty-state{display:grid;justify-items:center;gap:14px;padding:40px 24px;text-align:center}
.empty-state p{margin:0}
.empty-state .empty-title{font-size:15px;font-weight:600;max-width:230px}
.empty-state .empty-sub{font-size:12px;color:var(--ink-50)}
.empty-circle{width:84px;height:84px;border-radius:50%;display:grid;place-items:center;
  background:rgba(51,214,200,.16);color:var(--teal-deep)}

/* Shell & chrome */
.screen{display:flex;flex-direction:column;min-height:100dvh}
.screen-main{flex:1}
.screen-main.has-dock{padding-bottom:140px}
.gutter{padding-inline:20px}
.kicker{font-size:11px;font-weight:600;letter-spacing:0.14em;text-transform:uppercase;
  color:var(--ink-45)}
.top-bar{display:none}
.profile-chip{display:inline-flex;align-items:center;gap:8px;padding:4px 12px 4px 4px;
  border:1px solid var(--glass-border);border-radius:var(--r-pill);
  background:var(--chrome-bg);box-shadow:var(--chrome-shadow);cursor:pointer;
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  font:inherit;font-size:13px;font-weight:600;color:inherit}
.profile-chip:hover{background:rgba(255,255,255,.85)}
.profile-chip--bare{border:none;padding:4px;background:transparent;box-shadow:none;
  backdrop-filter:none;-webkit-backdrop-filter:none}
.profile-chip--bare:hover{background:transparent;color:var(--teal-deep)}
/* Invisible ≥44px hit-area extension for sub-40px controls. */
.hit40{position:relative}
.hit40::after{content:"";position:absolute;left:50%;top:50%;width:44px;height:44px;
  transform:translate(-50%,-50%)}
/* Macro color hooks (flat fills: mini-bars, field dots). */
.mini-bar .is-p,.dot.is-p{background:var(--p)}
.mini-bar .is-c,.dot.is-c{background:var(--c)}
.mini-bar .is-f,.dot.is-f{background:var(--f)}

/* Tri-color composition strip (meal rows, meal detail). */
.mini-bar{display:flex;height:5px;border-radius:var(--r-pill);overflow:hidden;
  background:var(--track);width:110px}

/* Analyzing overlay — full-bleed viewfinder card, corner brackets, scan line. */
.analyze-overlay{position:fixed;inset:0;z-index:50;display:flex;flex-direction:column;gap:14px;
  padding:max(16px,env(safe-area-inset-top)) 16px max(16px,env(safe-area-inset-bottom));
  background:var(--ground);
  background-image:var(--washes)}
.viewfinder-card{position:relative;flex:1;min-height:0;border-radius:34px;overflow:hidden;
  border:1px solid var(--glass-border);box-shadow:0 14px 40px rgba(10,60,60,.14);
  background:linear-gradient(150deg,#e9dfd2,#d8ece5 55%,#e3e0f0)}
.analyze-photo{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.vf-scrims{position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(255,255,255,.25),transparent 30%,transparent 70%,rgba(255,255,255,.25))}
.corner-bracket{position:absolute;width:26px;height:26px;pointer-events:none;
  border:0 solid rgba(255,255,255,.95)}
.cb-tl{top:16px;left:16px;border-left-width:2.5px;border-top-width:2.5px;border-top-left-radius:10px}
.cb-tr{top:16px;right:16px;border-right-width:2.5px;border-top-width:2.5px;border-top-right-radius:10px}
.cb-bl{bottom:16px;left:16px;border-left-width:2.5px;border-bottom-width:2.5px;border-bottom-left-radius:10px}
.cb-br{bottom:16px;right:16px;border-right-width:2.5px;border-bottom-width:2.5px;border-bottom-right-radius:10px}
.scan-line{position:absolute;left:8%;right:8%;top:8%;height:3px;border-radius:3px;
  pointer-events:none;background:linear-gradient(90deg,transparent,var(--teal-light),transparent);
  box-shadow:0 0 18px rgba(51,214,200,.85);animation:fs-scan 2.4s ease-in-out infinite}
.analyze-panel{position:absolute;left:50%;bottom:26px;transform:translateX(-50%);z-index:2;
  width:max-content;max-width:min(340px,calc(100% - 32px));border-radius:26px;
  padding:11px 18px;font-size:13.5px;font-weight:600;color:var(--ink);
  background:var(--chrome-bg);border:1px solid var(--glass-border);
  box-shadow:0 10px 28px rgba(10,60,60,.16);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}
.analyze-reading{display:flex;align-items:center;gap:9px;white-space:nowrap}
.scan-dots{display:flex;gap:4px}
.scan-dots i{width:6px;height:6px;border-radius:50%}
.scan-dots i:nth-child(1){background:var(--teal);animation:fs-dot 1.2s infinite}
.scan-dots i:nth-child(2){background:var(--teal-light);animation:fs-dot 1.2s .2s infinite}
.scan-dots i:nth-child(3){background:var(--arc-end);animation:fs-dot 1.2s .4s infinite}
.analyze-cancel{flex:none;min-height:52px;font-size:14px;color:var(--ink-70);
  background:var(--chrome-bg);border:1px solid var(--glass-border);
  backdrop-filter:blur(18px) saturate(1.5);-webkit-backdrop-filter:blur(18px) saturate(1.5)}
.analyze-cancel:hover{background:rgba(255,255,255,.8)}
.fail-title{font-family:var(--font-display);font-weight:700;font-size:15px}
.fail-sub{font-size:12.5px;font-weight:400;color:var(--ink-55);margin-top:3px}
.fail-actions{display:flex;gap:8px;margin-top:12px}
.fail-actions .btn{flex:1;padding:10px 14px;font-size:13px;white-space:nowrap}

/* Review / Detail / Manual — item grids + inline editing. */
.review-photo{height:210px;border-radius:var(--r-card);overflow:hidden;margin-bottom:14px;
  border:1px solid var(--glass-border);box-shadow:0 12px 34px rgba(10,60,60,.12)}
.review-photo img{width:100%;height:100%;object-fit:cover}
.review-name-row{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.review-name-row .confidence-pill{flex:none;margin-top:4px}
.review-when{font-size:12px;color:var(--ink-50);margin-top:4px}
.portion-block{margin-top:16px}
.item-grid{display:grid;grid-template-columns:minmax(0,1fr) 48px 36px 36px 36px 26px;gap:6px;
  align-items:center}
.item-grid--detail{grid-template-columns:minmax(0,1fr) 52px 38px 38px 38px}
.item-head{padding-bottom:6px;margin-top:18px;
  border-bottom:1px solid rgba(14,42,43,.2);
  font-size:10px;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-50)}
.item-head span{text-align:right}
.item-head span:first-child{text-align:left}
.item-row{padding:8px 0;border-top:1px solid var(--hairline)}
.item-row--detail{padding:9px 0}
.item-cell-num{font-family:var(--font-display);font-weight:600;font-size:16px;text-align:right}
.item-cell-plain{font-size:14px;text-align:right;color:var(--ink-70)}
/* Inline editors reach the 40px tap rule via padding + negative margin so the
   visual layout stays pixel-identical (pad-top − |margin-top| = old pad-top;
   Σpad + Σmargin = Σold-pad). Never grow padding-bottom where the dashed
   border-bottom underlines the text — it would drop away from it. */
.edit-value{background:transparent;border:0;cursor:pointer;font:inherit;color:inherit;
  border-bottom:1px dashed rgba(14,42,43,.28);
  padding:14px 0 2px;margin-top:-6px;
  font-family:var(--font-display);font-weight:600;font-size:16px;
  text-align:right;width:100%}
.edit-value:hover{color:var(--teal-deep);border-bottom-color:var(--teal-deep)}
.edit-text{background:transparent;border:0;cursor:pointer;font:inherit;color:inherit;
  font-size:14px;font-weight:500;text-align:left;padding:10px 0;margin:-8px 0;width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.edit-text:hover{color:var(--teal-deep)}
.edit-portion{position:relative;background:transparent;border:0;cursor:pointer;font:inherit;
  font-size:12px;color:var(--ink-50);
  border-bottom:1px dashed rgba(14,42,43,.28);
  padding:0 0 1px;text-align:left}
/* Box can't grow (underline below, visible name text above); the pseudo stops at
   the row boundary so it never overpaints the next row's name button. */
.edit-portion::after{content:"";position:absolute;left:-2px;right:-2px;top:-3px;bottom:-9px}
.edit-portion:hover{color:var(--teal-deep);border-bottom-color:var(--teal-deep)}
.edit-input--name{min-height:30px;padding:2px 6px;font-size:14px;border-radius:12px}
.edit-input--portion{min-height:26px;padding:1px 6px;font-size:12px;width:90px;border-radius:10px}
.edit-input--num{min-height:32px;padding:2px 4px;font-family:var(--font-display);
  font-weight:600;font-size:15px;text-align:right;border-radius:10px}
.edit-input--target{min-height:36px;padding:2px 6px;font-family:var(--font-display);
  font-weight:600;font-size:18px;border-radius:12px}
.name-input{width:100%;background:transparent;border:0;border-bottom:1px dashed rgba(14,42,43,.28);
  border-radius:0;font-family:var(--font-display);font-weight:700;font-size:19px;
  color:inherit;padding:2px 0;min-height:0;caret-color:var(--teal)}
/* 2px-visible focus (kept-features rule); padding compensates so the box never shifts. */
.name-input:focus-visible{border-bottom:2px solid var(--teal);padding-bottom:1px;outline:none}
.assumption{font-size:12px;color:var(--ink-55);margin-top:14px;min-height:16px}
.hint-low{font-size:12px;color:var(--teal-deep);margin-top:4px}
.remove-btn{color:var(--ink-45);width:26px;height:26px;padding:0}
.action-footer{position:sticky;bottom:0;padding:14px 0 18px;
  background:linear-gradient(180deg,transparent,var(--ground) 38%)}
.footer-totals{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:12px}
.footer-kcal{font-family:var(--font-display);font-weight:800;font-size:28px}
.footer-kcal-unit{font-size:12px;color:var(--ink-55)}
.footer-summary{font-size:13px;color:var(--ink-70)}
/* Re-analyze row (PRD F9) — under the photo on Review, between cards on Detail. */
.reanalyze{margin-bottom:14px}
.detail-items+.reanalyze{margin-top:12px;margin-bottom:0}
.reanalyze-row{display:flex;gap:8px}
.reanalyze-row .input{flex:1;min-width:0}
.reanalyze-row .btn{white-space:nowrap}
.reanalyze-error{font-size:13px;color:var(--danger);margin:0 0 8px}

/* Meal detail. */
.detail-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.detail-photo{height:230px;border-radius:var(--r-card);overflow:hidden;
  border:1px solid var(--glass-border);box-shadow:0 12px 34px rgba(10,60,60,.12)}
.detail-photo img{width:100%;height:100%;object-fit:cover}
.detail-photo--empty{display:grid;place-items:center;
  background:linear-gradient(135deg,#ffd9c2,#b7e6dd);color:var(--ink-55)}
.detail-kcal-row{display:flex;justify-content:space-between;align-items:baseline;
  gap:12px;padding:16px 2px 0}
.detail-kcal{font-family:var(--font-display);font-weight:800;font-size:36px;line-height:1}
.detail-kcal-unit{font-size:13px;font-weight:600;color:var(--ink-55)}
.detail-logged{font-size:12.5px;color:var(--ink-50)}
.detail-macros{margin-top:14px}
.detail-split{display:flex;align-items:center;gap:10px;margin-top:14px;
  padding-top:12px;border-top:1px solid var(--hairline);
  font-size:12px;color:var(--ink-55)}
.detail-items{margin-top:12px}
.detail-item-name{font-size:13.5px;font-weight:500;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.detail-item-portion{font-size:12px;color:var(--ink-50)}
.detail-note{font-size:14px;color:var(--ink-70);margin:8px 0 0;white-space:pre-line}
.detail-actions{display:flex;gap:10px;margin-top:16px;padding-bottom:24px}
.detail-delete{flex:1;display:flex}
.detail-delete .btn{flex:1}
.detail-edit{flex:2;min-height:50px}

/* Manual entry. */
.manual-card{display:grid;gap:14px;margin-top:4px}
.manual-2col{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.manual-3col{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.macro-field{position:relative}
.macro-field .dot{position:absolute;left:12px;top:50%;transform:translateY(-50%)}
.macro-field .input{padding-left:30px}
.manual-hint{font-size:12px;color:var(--ink-50);margin:0}

/* Dashboard. */
.dash-content{padding:0 20px}
.dash-range{margin-top:4px}
.dash-card-head{display:flex;justify-content:space-between;align-items:baseline;gap:10px}
.dash-avg{font-size:12px;color:var(--ink-50)}
.dash-cols{display:grid;gap:12px;margin-top:12px}
.split-caption{font-size:12px;color:var(--ink-50);margin-top:14px;
  padding-top:12px;border-top:1px solid var(--hairline)}
.range-caption{font-size:12px;color:var(--ink-50);margin:10px 0 0}

/* Week/month capsule chart. */
.chart{position:relative;height:112px;margin-top:14px}
.chart-grid i{position:absolute;left:0;right:0;height:1px;background:rgba(14,42,43,.05)}
.chart-grid i:nth-child(1){bottom:25%}
.chart-grid i:nth-child(2){bottom:50%}
.chart-grid i:nth-child(3){bottom:75%}
.chart-cols{display:flex;align-items:flex-end;gap:10px;height:100%}
.chart-col{flex:1;display:flex;flex-direction:column;align-items:center;
  justify-content:flex-end;height:100%;position:relative}
/* v1.5 per-bar goal tick — the .chart-target stroke, one column wide. */
.chart-tick{position:absolute;left:50%;width:22px;margin-left:-11px;
  border-top:1.5px dashed rgba(14,42,43,.22)}
.chart-bar{width:12px;border-radius:var(--r-pill);
  background:linear-gradient(180deg,var(--teal-light),var(--teal));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5)}
.chart-bar--today{background:linear-gradient(180deg,var(--teal-light),var(--c))}
.chart-stub{width:12px;height:5px;border-radius:var(--r-pill);background:rgba(14,42,43,.12)}
.chart-target{position:absolute;left:0;right:0;border-top:1.5px dashed rgba(14,42,43,.22)}
.chart-target-tag{position:absolute;right:0;top:0;transform:translateY(-50%);
  font-size:9.5px;font-weight:600;color:var(--ink-45);
  background:rgba(255,255,255,.7);border-radius:var(--r-pill);padding:1px 7px}
.chart-labels{display:flex;gap:10px;margin-top:8px}
.chart-labels span{flex:1;text-align:center;font-size:9.5px;font-weight:600;
  color:var(--ink-45)}
.chart-labels span.is-today{color:var(--teal-deep);font-weight:700}
.chart-note{margin-top:10px;font-size:12px;color:var(--ink-50)}

/* Protein sparkline. */
.sparkline{width:100%;height:60px;display:block;margin-top:12px}
.sparkline .sparkline-avg{stroke:rgba(14,42,43,.22);stroke-dasharray:3 3}
.sparkline .sparkline-line{stroke:var(--p)}

/* Stat tiles. */
.stat-duo{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:12px;
  padding-bottom:8px}
.stat-value{font-family:var(--font-display);font-weight:800;font-size:22px;margin-top:6px}
.stat-sub{font-size:11.5px;color:var(--ink-50);margin-top:2px}

/* Dashboard no-data. */
.no-data{min-height:190px;display:grid;place-content:center;justify-items:center;
  gap:10px;text-align:center}
.no-data .empty-title{font-size:15px;font-weight:600}
.no-data .empty-sub{font-size:12px;max-width:220px;color:var(--ink-55)}

/* Household comparison (v1.5) — Settings member-row idiom on a dash card. */
.house-list{margin-top:8px}
.house-row{display:flex;align-items:center;gap:10px;padding:10px 0}
.house-row+.house-row{border-top:1px solid var(--hairline)}
.house-main{flex:1;min-width:0}
.house-name{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.house-sub{font-size:11px;color:var(--ink-50);margin-top:3px}
.house-kcal{font-family:var(--font-display);font-weight:700;font-size:15px;flex:none;text-align:right;min-width:56px}

/* Settings. */
.person-card{margin-bottom:14px}
.person-head{display:flex;align-items:center;gap:10px}
.person-name{font-family:var(--font-display);font-weight:700;font-size:16px;text-align:left;
  flex:1;min-width:0}
.person-head .tag{margin-left:auto;flex:none}
.target-rows{margin-top:4px}
.target-row{display:flex;justify-content:space-between;align-items:center;gap:10px;
  padding:10px 0}
.target-row+.target-row{border-top:1px solid var(--hairline)}
.target-row-label{display:inline-flex;align-items:center;gap:8px;font-size:14px;
  font-weight:500}
.target-row .edit-value{width:auto;padding:15px 0 2px;margin:-13px 0 0;font-size:15px;font-weight:700}
.target-value--kcal{color:var(--teal-deep)}
.target-unit{font-family:var(--font-ui);font-size:11px;font-weight:400;color:var(--ink-45)}
.target-row .edit-input--target{max-width:110px;text-align:right}
.person-actions{margin-top:10px;padding-top:10px;border-top:1px solid var(--hairline)}
.btn--sm{font-size:13px;padding:8px 12px}
.info-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0}
.info-row+.info-row{border-top:1px solid var(--hairline)}
.info-row:first-child{padding-top:0}
.info-label{font-size:13px;color:var(--ink-60)}
.info-value{font-size:14px;font-weight:500}
.info-foot{font-size:12px;color:var(--ink-50);padding-top:10px;
  border-top:1px solid var(--hairline)}
.toggle-row{display:flex;justify-content:space-between;align-items:center;font-size:14px}

/* Settings footer (README: "MacroSnap 3.0 · Frost", 11px, 40% ink, centered). */
.app-footer{font-size:11px;color:var(--ink-40);text-align:center;margin:26px 0 24px}

/* Login & signup */
.login-box{max-width:340px;margin:14vh auto 0}
.signup-lead{font-size:13px;color:var(--ink-55);margin:0 0 16px}
.login-error{font-size:13px;color:var(--danger);margin-top:10px}
.login-people{border:0;padding:0;margin:0 0 14px;display:flex;gap:10px;flex-wrap:wrap}
.login-person{display:flex;flex-direction:column;align-items:center;gap:6px;
  font-size:13px;font-weight:600;cursor:pointer;padding:8px 10px;min-width:56px;
  border-radius:var(--r-input);border:1px solid transparent}
.login-person input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}
.login-person:has(input:checked){border-color:var(--teal);background:rgba(51,214,200,.10)}
.login-person:has(input:checked) .avatar{border-color:var(--teal);color:var(--teal-deep)}
.login-person:has(input:focus-visible){outline:2px solid var(--teal);outline-offset:2px}
.pw-panel{margin-top:8px;display:grid;gap:10px}
.pw-note{font-size:12px;color:var(--ink-50)}
.pw-notice{font-size:13px;color:var(--teal-deep);padding:4px 0}

/* ---------- 8 · Desktop ≥960px ---------- */
@media (min-width:960px){
  :root{--washes:
    radial-gradient(760px 540px at 85% -5%,var(--wash-1),transparent),
    radial-gradient(680px 580px at -12% 30%,var(--wash-2),transparent),
    radial-gradient(760px 620px at 62% 112%,var(--wash-3),transparent)}
  .top-bar{display:flex;align-items:center;gap:20px;padding:12px 32px;
    background:var(--glass-bg);border-bottom:1px solid var(--hairline);
    backdrop-filter:blur(18px) saturate(1.5);-webkit-backdrop-filter:blur(18px) saturate(1.5)}
  .top-bar-brand{font-family:var(--font-display);font-weight:700;font-size:18px}
  .top-bar a.nav-link{font-size:14px;font-weight:600;color:var(--ink-60);text-decoration:none}
  .top-bar a.nav-link:hover{color:var(--teal-deep)}
  .top-bar a.nav-link[aria-current="page"]{color:var(--teal-deep)}
  .top-bar-end{margin-left:auto;display:flex;align-items:center;gap:16px}
  .float-nav{display:none}
  .page-head-end{display:none}  /* top bar carries settings + profile switch here */
  .screen-main.has-dock{padding-bottom:48px}
  .page--narrow .screen-main{max-width:430px;margin-inline:auto;width:100%}

  /* Today desktop — same glass components, two columns */
  .today-grid{display:grid;grid-template-columns:360px minmax(0,1fr);gap:36px;
    padding:32px 40px 48px}
  .instrument{align-self:start}
  .today-grid .page-head{padding-top:0}
  .today-grid .list-head{padding-top:6px}
  .today-grid .mini-bar{width:150px}

  /* Dashboard desktop */
  .dash-content{padding:12px 40px 48px;max-width:1060px}
  .dash-range{max-width:480px}
  .chart{height:150px}
  .chart-cols{gap:18px}
  .chart-labels{gap:18px}
  .dash-cols{grid-template-columns:1fr 1fr}
  .stat-duo{grid-template-columns:repeat(4,1fr)}
  .stat-value{font-size:26px}
  .no-data{min-height:220px}
  .no-data .empty-sub{max-width:260px}
}

/* ---------- 9 · Reduced motion (kills scan line, dots, gauge fill, hovers) ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important}
}
