/* Public Sans (SIL OFL), latin subset, variable 400-700, inlined as a data: URI
   so it needs no font CDN — the app has a strict no-external-assets posture and
   this must load offline and under CSP. It is the one webfont; figures stay
   column-aligned through tabular-nums, which Public Sans supports. */
@font-face {
  font-family:"Public Sans";
  font-style:normal;
  font-weight:400 700;
  font-display:swap;
  src:url(data:font/woff2;base64,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) format("woff2");
}
/* ===========================================================================
   CartWise design system — direction: INSTRUMENT.

   A dense precision panel, not a pillowy card app. Cool graphite neutrals (never
   pure black/white), small machined radii (2-8px), and a monospaced, tabular
   figure for every number so columns of money line up like a readout.

   Theme architecture: tokens are declared once on :root; dark redefines ONLY
   tokens. Components are NEVER styled inside a media query. An explicit
   [data-theme] choice wins over the OS preference in both directions.

   Colour namespaces (kept strictly apart):
     --brand   identity only (the wordmark). CartWise green, unchanged.
     --accent  ACTION only — buttons, links, active nav, focus. Never state.
     --good/--warn/--crit  STATE only. --good is in the brand's green family,
               because green here means "money saved" — the product's promise.
   =========================================================================== */
:root {
  /* neutrals — machined paper */
  --bg:#e9ecee; --surface:#fff; --surface-2:#f4f6f8; --surface-sunk:#dfe3e7;
  --line:#d5dade; --line-strong:#b8c1c8;
  --ink:#0e1418; --ink-2:#2c353c; --muted:#525c63; --faint:#67717a;
  --grid:#e3e7ea;

  /* identity */
  --brand:#1a7a44;

  /* action — the brand green, so the app and its icon/splash/status bar are one
     colour. It doubles as the "good/saved" state, which for a savings tool reads
     as coherent rather than as a collision. */
  --accent:#1a7a44; --accent-strong:#146035; --accent-quiet:#e4f2ea;
  --accent-line:#bcdccb; --on-accent:#fff;

  /* state */
  --good:#1a7a44; --good-strong:#146035; --good-quiet:#e4f2ea; --good-line:#bcdccb;
  --warn:#8a5810; --warn-quiet:#faedd6; --warn-line:#e5c894;
  --crit:#a52a23; --crit-quiet:#fbe4e2; --crit-line:#eeb9b4;

  /* great buy — the ONE thing on a receipt that says "you did this right"
     (#483). A named token, not a second green: the app already spends its one
     green on "money saved", and a great buy IS money saved, so inventing a
     neighbouring hue would be exactly the near-miss of the brand colour the
     design lock forbids. It resolves to the savings green in both themes and
     stays a separate name so the great-buy treatment can be retuned without
     touching brand/state greens. What makes the mark distinct is FORM — a check
     glyph, a left stripe, a quiet fill — not a second colour. */
  --great:var(--good); --great-quiet:var(--good-quiet); --great-line:var(--good-line);

  --skeleton:#dfe3e7; --skeleton-hi:#eef1f3;
  --focus:#1a7a44;
  --shadow:0 1px 2px rgba(14,20,24,.06), 0 8px 24px rgba(14,20,24,.08);
  color-scheme:light;

  /* type */
  --sans:"Public Sans",ui-sans-serif,system-ui,-apple-system,"Segoe UI",
    Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif;
  --mono:"Public Sans",ui-sans-serif,system-ui,-apple-system,"Segoe UI",
    Roboto,"Helvetica Neue",Arial,sans-serif;
  --t-micro:11px; --t-xs:12px; --t-sm:13px; --t-base:15px; --t-md:16px;
  --t-lg:19px; --t-xl:23px; --t-fig:28px; --t-fig-l:35px;

  /* space (4px grid, tightened) */
  --s1:2px; --s2:4px; --s3:6px; --s4:8px; --s5:12px; --s6:16px; --s7:20px;
  --s8:24px; --s9:32px;

  /* radius — small; an instrument is machined, not pillowy */
  --r-xs:2px; --r-sm:3px; --r-md:5px; --r-lg:8px; --r-pill:999px;

  /* density — tap targets never below 44px */
  --row-tight:30px; --row:38px; --row-comfy:44px; --row-tap:48px;

  /* --- Compatibility aliases -------------------------------------------
     The page scripts still name the original tokens. They are var() refs, so
     they follow the theme automatically: redefining --surface in a theme block
     redefines --paper with it. Nothing below should use them. */
  --paper:var(--surface); --card:var(--surface-2); --bg-sunk:var(--surface-sunk);
  --save:var(--good); --save-strong:var(--good-strong);
  --save-bg:var(--good-quiet); --save-line:var(--good-line);
  --flag:var(--crit); --flag-bg:var(--crit-quiet); --flag-line:var(--crit-line);
  --bad:var(--crit);
  --deal:var(--warn); --deal-bg:var(--warn-quiet); --deal-line:var(--warn-line);
  --accent-bg:var(--accent-quiet);
  --focus-ring:color-mix(in srgb, var(--focus) 55%, transparent);
  --font-sans:var(--sans);
  --text-xs:var(--t-xs); --text-sm:var(--t-sm); --text-base:var(--t-base);
  --text-md:var(--t-md); --text-lg:var(--t-lg); --text-xl:var(--t-xl);
  --text-2xl:var(--t-fig);
  --radius:var(--r-lg); --radius-sm:var(--r-sm); --radius-md:var(--r-md);
  --radius-lg:var(--r-lg); --radius-pill:var(--r-pill);
  --shadow-lg:var(--shadow);
}

/* Dark: token redefinitions ONLY. A designed theme, not an inversion — the
   greens/cyans are lifted so they still carry on a graphite ground. */
@media (prefers-color-scheme: dark) {
  :root {
    --bg:#0f1316; --surface:#171c20; --surface-2:#1d2429; --surface-sunk:#12171a;
    --line:#262f35; --line-strong:#38444c;
    --ink:#e7ecef; --ink-2:#c4cdd3; --muted:#9aa6ae; --faint:#8b97a0;
    --grid:#222a2f;
    --accent:#4fbf84; --accent-strong:#7fd6a6; --accent-quiet:#132a1f;
    --accent-line:#2f6b45; --on-accent:#06220f;
    --good:#4fbf84; --good-strong:#7fd6a6; --good-quiet:#132a1f; --good-line:#26543a;
    --warn:#e0a63c; --warn-quiet:#322512; --warn-line:#6b5222;
    --crit:#ec6a60; --crit-quiet:#351b19; --crit-line:#6f302b;
    --skeleton:#1e262b; --skeleton-hi:#2b353b;
    --focus:#4fbf84;
    --shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.35);
    color-scheme:dark;
  }
}
/* An explicit choice beats the OS preference — in BOTH directions. */
:root[data-theme="dark"] {
  --bg:#0f1316; --surface:#171c20; --surface-2:#1d2429; --surface-sunk:#12171a;
  --line:#262f35; --line-strong:#38444c;
  --ink:#e7ecef; --ink-2:#c4cdd3; --muted:#9aa6ae; --faint:#8b97a0;
  --grid:#222a2f;
  --accent:#4fbf84; --accent-strong:#7fd6a6; --accent-quiet:#132a1f;
  --accent-line:#2f6b45; --on-accent:#06220f;
  --good:#4fbf84; --good-strong:#7fd6a6; --good-quiet:#132a1f; --good-line:#26543a;
  --warn:#e0a63c; --warn-quiet:#322512; --warn-line:#6b5222;
  --crit:#ec6a60; --crit-quiet:#351b19; --crit-line:#6f302b;
  --skeleton:#1e262b; --skeleton-hi:#2b353b;
  --focus:#4fbf84;
  --shadow:0 1px 2px rgba(0,0,0,.4), 0 8px 24px rgba(0,0,0,.35);
  color-scheme:dark;
}
:root[data-theme="light"] {
  --bg:#e9ecee; --surface:#fff; --surface-2:#f4f6f8; --surface-sunk:#dfe3e7;
  --line:#d5dade; --line-strong:#b8c1c8;
  --ink:#0e1418; --ink-2:#2c353c; --muted:#525c63; --faint:#67717a;
  --grid:#e3e7ea;
  --accent:#1a7a44; --accent-strong:#146035; --accent-quiet:#e4f2ea;
  --accent-line:#bcdccb; --on-accent:#fff;
  --good:#1a7a44; --good-strong:#146035; --good-quiet:#e4f2ea; --good-line:#bcdccb;
  --warn:#8f5c10; --warn-quiet:#faedd6; --warn-line:#e5c894;
  --crit:#a52a23; --crit-quiet:#fbe4e2; --crit-line:#eeb9b4;
  --skeleton:#dfe3e7; --skeleton-hi:#eef1f3;
  --focus:#1a7a44;
  --shadow:0 1px 2px rgba(14,20,24,.06), 0 8px 24px rgba(14,20,24,.08);
  color-scheme:light;
}

/* --- base ---------------------------------------------------------------- */
*, *::before, *::after { box-sizing:border-box; }
html, body { margin:0; }
body {
  font-family:var(--sans); font-size:var(--t-base); line-height:1.5;
  color:var(--ink); background:var(--bg); -webkit-font-smoothing:antialiased;
}
a { color:var(--accent); }
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline:2px solid var(--focus); outline-offset:2px; border-radius:var(--r-sm);
}

/* Every figure is a readout: monospaced, tabular, so columns align. */
.price, .value, .bar-val, .transition, .off-now, .off-old, .off-save, .off-badge,
.pr-price, .pr-ref, .stp-val, .m-tot, .header-meta, .pct,
.hist-stat b, .cmp-delta, .date {
  font-family:var(--mono); font-variant-numeric:tabular-nums;
}

/* --- app shell ----------------------------------------------------------- */
/* Fills the viewport; a readable centred column on wide screens. Header + nav
   are fixed flex children so only the body scrolls. */
.phone {
  width:100%; max-width:760px; margin:0 auto; position:relative;
  height:100vh; height:100dvh;
  background:var(--bg); display:flex; flex-direction:column; overflow:hidden;
}
@media (min-width:800px) { .phone { border-inline:1px solid var(--line); } }
.app-header {
  flex-shrink:0; display:flex; align-items:center; justify-content:space-between;
  gap:var(--s5); padding:var(--s5) var(--s6) var(--s4);
  background:var(--surface); border-bottom:1px solid var(--line);
}
.wordmark {
  font-size:var(--t-md); font-weight:700; letter-spacing:-.02em;
  color:var(--ink); text-decoration:none;
}
.wordmark b { color:var(--brand); font-weight:700; }
.header-meta { font-size:var(--t-xs); color:var(--muted); }
.app-body {
  flex:1; min-height:0; overflow-y:auto; overflow-x:hidden;
  overscroll-behavior:contain;
  padding:var(--s5) var(--s6) var(--s8); scrollbar-width:thin;
  /* Styling ::-webkit-scrollbar opts the WebView out of an overlay scrollbar into
     a classic one that eats layout space on the right only — which is why the left
     padding looked bigger than the right. Reserving the gutter on BOTH edges keeps
     the column symmetric whether the scrollbar is showing or not. */
  scrollbar-gutter:stable both-edges;
}
/* Nothing may push the page sideways: a phone app is one column that only ever
   scrolls up and down. Wide children (charts, tables) are clipped to the column
   rather than turning the whole screen into a horizontally-draggable web page. */
.app-body > * { max-width:100%; }
.app-body img, .app-body svg, .app-body table { max-width:100%; }
.app-body::-webkit-scrollbar { width:6px; }
.app-body::-webkit-scrollbar-thumb {
  background:var(--line-strong); border-radius:var(--r-pill);
}
.screen-title { margin:0; font-size:var(--t-xl); font-weight:700; letter-spacing:-.02em;
  line-height:1.15; }
.screen-sub { margin:3px 0 var(--s6); font-size:var(--t-sm); color:var(--muted); }
/* Section headings are tracked micro-caps — a panel legend, not a heading. */
.section-head {
  margin:var(--s7) 0 var(--s4); font-size:var(--t-micro); font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; color:var(--muted);
}
.section-row { display:flex; align-items:baseline; justify-content:space-between;
  gap:var(--s4); }
.section-row .section-head { margin-bottom:var(--s4); }
.section-row a { font-size:var(--t-xs); font-weight:600; color:var(--accent);
  text-decoration:none; white-space:nowrap; }
.section-row a:hover { text-decoration:underline; }
.muted { color:var(--muted); font-size:var(--t-sm); }

/* --- states -------------------------------------------------------------- */
.state {
  padding:var(--s5); font-size:var(--t-sm); color:var(--muted);
  background:var(--surface-2); border:1px solid var(--line);
  border-radius:var(--r-md);
}
.state.error {
  display:flex; align-items:center; justify-content:space-between; gap:var(--s5);
  flex-wrap:wrap; color:var(--crit); background:var(--crit-quiet);
  border-color:var(--crit-line); border-left:3px solid var(--crit);
}
.state .retry {
  flex-shrink:0; min-height:var(--row-tight); padding:0 var(--s5);
  font:inherit; font-size:var(--t-xs); font-weight:700; letter-spacing:.03em;
  cursor:pointer; color:var(--crit); background:var(--surface);
  border:1px solid var(--crit-line); border-radius:var(--r-sm);
}
.state .retry:hover { background:var(--crit-quiet); }

/* --- bottom nav ---------------------------------------------------------- */
.bottom-nav {
  flex-shrink:0; display:flex; align-items:stretch;
  background:var(--surface); border-top:1px solid var(--line);
}
.bottom-nav a {
  flex:1; position:relative; min-height:56px; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:3px;
  padding:var(--s4) var(--s2) calc(var(--s4) + env(safe-area-inset-bottom));
  color:var(--muted); text-decoration:none;
  font-size:var(--t-micro); font-weight:700; letter-spacing:.06em;
  text-transform:uppercase;
}
.bottom-nav a svg { width:20px; height:20px; }
.bottom-nav a[aria-current=page] { color:var(--accent); }
/* A machined tick above the active tab, not a pill. */
.bottom-nav a[aria-current=page]::before {
  content:""; position:absolute; top:-1px; left:22%; right:22%; height:2px;
  background:var(--accent);
}
.bottom-nav a.scan { color:var(--accent); }
/* SCAN: a raised key — the primary action, seated on the bar. */
.scan-fab {
  display:grid; place-items:center; width:42px; height:42px; margin-top:-14px;
  border-radius:var(--r-md);
  background:var(--accent); color:var(--on-accent);
  box-shadow:0 2px 0 var(--accent-strong);
}
.bottom-nav a.scan svg { width:22px; height:22px; }
.bottom-nav a.scan[aria-current=page]::before { display:none; }
.bottom-nav a.scan[aria-current=page] .scan-fab { background:var(--accent-strong); }
.bottom-nav a:focus-visible { outline:2px solid var(--focus); outline-offset:-2px; }

/* --- figures ------------------------------------------------------------- */
.price { font-weight:600; letter-spacing:-.01em; white-space:nowrap; color:var(--ink); }
.price.s-sm { font-size:var(--t-sm); }
.price.s-md { font-size:var(--t-md); }
.price.s-lg { font-size:var(--t-lg); letter-spacing:-.02em; }
.price.s-xl { font-size:var(--t-fig-l); letter-spacing:-.03em; }
.price.t-save { color:var(--good); }
.price.t-muted { color:var(--muted); font-weight:500; }
.price .unit, .unit { font-size:.75em; font-weight:600; color:var(--muted); }

/* --- store chip ---------------------------------------------------------- */
.chip {
  display:inline-flex; align-items:center; gap:5px; height:20px; padding:0 7px 0 6px;
  font-size:var(--t-xs); font-weight:600; letter-spacing:.01em; white-space:nowrap;
  color:var(--ink-2); background:var(--surface-2);
  border:1px solid var(--line); border-radius:var(--r-xs); vertical-align:middle;
}
/* The brand mark is a colour bar, not a dot: it reads as an index tab. */
.chip .dot {
  width:3px; height:11px; flex-shrink:0; border-radius:1px; background:var(--faint);
}
.chip-wrap { display:flex; align-items:center; gap:var(--s3); flex-wrap:wrap; }
.store-color { color:var(--muted); font-size:var(--t-xs); }

/* --- badge --------------------------------------------------------------- */
.badge {
  display:inline-flex; align-items:center; gap:4px; height:18px; padding:0 5px;
  font-size:var(--t-xs); font-weight:700; letter-spacing:.02em; line-height:1;
  white-space:nowrap; border-radius:var(--r-xs);
  color:var(--crit); background:var(--crit-quiet); border:1px solid var(--crit-line);
}
.badge svg { width:11px; height:11px; }

/* --- stat tiles ---------------------------------------------------------- */
/* A hairline-jointed instrument block: four cells, one outer radius. */
.stat-grid { display:grid; grid-template-columns:1fr 1fr; gap:var(--s1); }
@media (min-width:560px) { .stat-grid { grid-template-columns:repeat(4, 1fr); } }
.stat {
  position:relative; min-width:0; padding:var(--s5) var(--s5) var(--s4);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-xs);
}
/* Grid items default to min-width:auto, so a wide unbreakable figure (e.g.
   "€217.40" at the big size) would force its 1fr track wider and push the whole
   grid past the column margin. min-width:0 above lets the track hold 1fr; the
   value clips inside its own tile instead of shoving the row sideways. */
.stat .v, .stat .value { min-width:0; overflow:hidden; text-overflow:ellipsis; }
.stat-grid > .stat:first-child { border-top-left-radius:var(--r-lg); }
.stat-grid > .stat:last-child { border-bottom-right-radius:var(--r-lg); }
.stat .ico {
  display:flex; align-items:center; color:var(--faint); line-height:0;
  margin-bottom:var(--s3);
}
.stat .ico svg { width:14px; height:14px; }
.stat .value {
  font-size:var(--t-fig); font-weight:600; line-height:1.1; letter-spacing:-.02em;
  color:var(--ink);
}
.stat .value.t-save { color:var(--good); }
.stat .value.t-flag { color:var(--crit); }
.stat .value.t-accent { color:var(--accent); }
.stat .label {
  margin-top:var(--s3); font-size:var(--t-micro); font-weight:700; letter-spacing:.1em;
  text-transform:uppercase; color:var(--muted);
}

/* --- savings card -------------------------------------------------------- */
.savings {
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-left:3px solid var(--good); border-radius:var(--r-lg);
}
.savings .headline {
  margin-bottom:var(--s4); font-size:var(--t-md); font-weight:700; color:var(--good);
}
.savings-row {
  display:grid; grid-template-columns:1fr auto auto; align-items:center;
  gap:var(--s4); padding:var(--s4) 0;
}
.savings-row + .savings-row { border-top:1px solid var(--line); }
.savings-row .item { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.savings-row .chip-wrap { margin-top:var(--s1); }
.savings-row .transition { font-size:var(--t-xs); color:var(--muted); white-space:nowrap; }
.savings-rec, .cook-rec { display:flex; align-items:flex-start; gap:.3rem; margin:.35rem 0 0;
  font-size:var(--t-xs); color:var(--save,#166534); }
.cook-rec { margin:.5rem 0 0; }

/* --- receipt rows (dashboard + history) ---------------------------------- */
.receipt-list { display:flex; flex-direction:column; gap:var(--s3); }
.receipt {
  display:flex; align-items:center; gap:var(--s5);
  min-height:var(--row-tap); padding:var(--s4) var(--s5); width:100%;
  font:inherit; color:inherit; text-align:left; text-decoration:none; cursor:pointer;
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-md);
  transition:background 120ms, border-color 120ms;
}
.receipt:hover { background:var(--surface-2); border-color:var(--line-strong); }
.receipt .ico { flex-shrink:0; color:var(--faint); line-height:0; }
.receipt .mid { flex:1; min-width:0; }
.receipt .mid .top { display:flex; align-items:center; gap:var(--s4); }
.receipt .date { margin-top:3px; font-size:var(--t-xs); color:var(--muted); }
.receipt .right {
  flex-shrink:0; display:flex; flex-direction:column; align-items:flex-end;
  gap:3px; text-align:right;
}

/* --- charts -------------------------------------------------------------- */
.chart { display:flex; flex-direction:column; margin:var(--s2) 0 var(--s3); }
.bar-row {
  display:grid; grid-template-columns:6.5rem 1fr auto; align-items:center;
  gap:var(--s4); min-height:var(--row-tight);
}
.bar-row + .bar-row { border-top:1px solid var(--line); }
/* …and a row that is a readout rather than a magnitude (no track): label · value. */
.bar-row.duo { grid-template-columns:1fr auto; }
.bar-label {
  font-size:var(--t-sm); color:var(--ink-2);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.bar-label .chip { max-width:100%; }
.bar-track {
  height:6px; background:var(--surface-sunk); border-radius:1px; overflow:hidden;
}
.bar-fill {
  display:block; height:100%; min-width:2px; border-radius:1px;
  background:var(--accent); transition:width 300ms ease-out;
}
.bar-val { font-size:var(--t-xs); color:var(--ink); text-align:right; white-space:nowrap; }
.bar-val .visits { color:var(--muted); font-weight:500; }

/* --- receipt detail ------------------------------------------------------ */
.photo-wrap { margin:0 0 var(--s3); }
.receipt-photo {
  display:block; width:100%; border:1px solid var(--line-strong);
  border-radius:var(--r-md);
}
.photo-missing {
  padding:var(--s9) var(--s5); text-align:center; font-size:var(--t-sm);
  color:var(--muted); background:var(--surface-sunk);
  border:1px dashed var(--line-strong); border-radius:var(--r-md);
}
.total-line { display:flex; align-items:baseline; gap:var(--s4); margin:var(--s2) 0 0; }
.mismatch { margin:var(--s3) 0; font-size:var(--t-xs); color:var(--crit); }
.kv-list { list-style:none; padding:0; margin:0; }
.kv-list li {
  display:flex; justify-content:space-between; gap:var(--s5);
  min-height:var(--row); padding:var(--s3) var(--s1); align-items:center;
  border-bottom:1px solid var(--line);
}
.kv-list li .n {
  color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* The parser's description + food group under a receipt line's name (#948). */
.kv-list li .li-sub { display:block; margin-top:2px; font-size:var(--t-xs);
  color:var(--muted); overflow:hidden; text-overflow:ellipsis; }
/* A finding carries a severity stripe on the left — the state lives in the edge. */
.flags-list { list-style:none; padding:0; margin:0; display:flex; flex-direction:column;
  gap:var(--s3); }
.flag-item {
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--crit);
  border-radius:var(--r-sm);
}
.flag-item .what { font-weight:600; color:var(--crit); }
.flag-item .reason { margin-top:3px; font-size:var(--t-xs); color:var(--muted);
  line-height:1.45; }
/* Great-buy list — the positive mirror of .flag-item, at equal weight. Carries
   the --great token (see its definition: a name of its own, the savings green as
   its value) and mirrors .flag-item's stripe geometry exactly, so the good and
   the bad read as two sides of one instrument rather than two designs. */
.great-buy-item {
  display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--s3);
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--great-line); border-left:3px solid var(--great);
  border-radius:var(--r-sm);
}
.great-buy-item .what { font-weight:600; color:var(--great); }
.great-buy-item .reason { flex-basis:100%; margin-top:3px; font-size:var(--t-xs);
  color:var(--muted); line-height:1.45; }
/* Per-line marks in the ticket itself: the good and the bad shown IN PLACE, so
   the item list is scannable without cross-referencing the two lists below. */
.li-mark { display:inline-flex; vertical-align:-2px; margin-right:var(--s3); }
.li-mark.great { color:var(--great); }
.li-mark.bad { color:var(--crit); }
.kv-list li.li-great { box-shadow:inset 2px 0 0 var(--great); padding-left:var(--s4); }
.kv-list li.li-bad { box-shadow:inset 2px 0 0 var(--crit); padding-left:var(--s4); }
/* The receipt-level verdict — a readout, not a trophy: the points figure, the
   counts behind it, and BOTH sides of the money. `.is-unmeasured` is the state
   with no figure at all, because a shop nothing could be checked against has no
   result to report. */
.verdict {
  margin-bottom:var(--s5); padding:var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--great);
  border-radius:var(--r-sm); font-size:var(--t-sm);
}
.verdict.is-unmeasured { border-left-color:var(--line-strong); }
.verdict .vd-score { display:flex; align-items:baseline; gap:var(--s4); }
.verdict .vd-score .fig { font-size:var(--t-fig); font-variant-numeric:tabular-nums;
  color:var(--great); line-height:1; }
.verdict .vd-score span { color:var(--muted); font-size:var(--t-xs);
  text-transform:uppercase; letter-spacing:.04em; }
.verdict .vd-counts, .verdict .vd-money {
  display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--s3);
  margin-top:var(--s4); }
.verdict .vd-money { justify-content:space-between; gap:var(--s5);
  padding-top:var(--s4); border-top:1px solid var(--line); }
.verdict .vd-good { color:var(--great); font-weight:600; }
.verdict .vd-bad  { color:var(--crit); font-weight:600; }
.verdict .vd-muted, .verdict .vd-sep { color:var(--muted); }
.verdict .vd-missed { color:var(--muted); }
.verdict .vd-head { display:flex; align-items:center; gap:var(--s4);
  font-weight:700; color:var(--ink-2); }
.verdict .vd-why, .verdict .vd-note { margin:var(--s4) 0 0; font-size:var(--t-xs);
  color:var(--muted); line-height:1.45; }
.verdict .vd-note { color:var(--warn); }
.reward-chips { margin:calc(-1 * var(--s3)) 0 var(--s5); }

/* --- forms + buttons ----------------------------------------------------- */
.upload-form { display:flex; flex-direction:column; gap:var(--s5); margin:var(--s6) 0; }
.upload-form input[type=file] { font:inherit; font-size:var(--t-sm); color:var(--ink-2); }
button.primary {
  display:inline-flex; align-items:center; justify-content:center; gap:var(--s4);
  min-height:var(--row-comfy); padding:0 var(--s6);
  font:inherit; font-size:var(--t-base); font-weight:700; cursor:pointer;
  color:var(--on-accent); background:var(--accent);
  border:0; border-radius:var(--r-md);
}
button.primary:hover { background:var(--accent-strong); }
@media (max-width:480px) {
  /* Full-width actions on a phone. Not the photo remove cross: it sits inside the
     form too, and 100% of its 72px thumbnail stretched it into a flat red bar. */
  .upload-form button:not(.thumb-remove), .upload-form input[type=file] { width:100%; }
}
/* An action in flight: dimmed + inert, so a second tap can't re-fire it. */
button:disabled { opacity:.6; cursor:not-allowed; }
.spinner {
  display:inline-block; width:1em; height:1em; margin-right:.5em; vertical-align:-2px;
  border:2px solid var(--line-strong); border-top-color:var(--accent);
  border-radius:50%; animation:cw-spin .7s linear infinite;
}
@keyframes cw-spin { to { transform:rotate(360deg); } }
/* Destructive: outlined crit, set well below the content (a confirm() backs it). */
.danger-btn {
  display:block; width:100%; margin:var(--s9) 0 var(--s4);
  min-height:var(--row-comfy); padding:0 var(--s5);
  font:inherit; font-weight:700; cursor:pointer;
  color:var(--crit); background:var(--surface);
  border:1px solid var(--crit-line); border-radius:var(--r-md);
}
.danger-btn:hover { background:var(--crit-quiet); border-color:var(--crit); }

/* --- account / avatar ---------------------------------------------------- */
.avatar {
  display:inline-flex; align-items:center; justify-content:center; flex-shrink:0;
  color:#fff; font-weight:700; line-height:1; border-radius:var(--r-sm);
}
.account-btn {
  display:inline-flex; align-items:center; padding:0; border:0; background:none;
  cursor:pointer;
}
.account-btn:focus-visible {
  outline:2px solid var(--focus); outline-offset:2px; border-radius:var(--r-sm);
}
.account-menu {
  position:absolute; inset:0; z-index:20; padding:var(--s8);
  background:color-mix(in srgb, #000 45%, transparent);
  display:flex; align-items:flex-start; justify-content:flex-end;
}
.account-menu[hidden] { display:none; }
.account-card {
  display:flex; flex-direction:column; gap:var(--s4);
  min-width:220px; margin-top:52px; padding:var(--s5);
  background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg); box-shadow:var(--shadow);
}
.account-email { font-weight:600; word-break:break-all; }
.account-loc { font-size:var(--t-xs); color:var(--muted); }
/* The .plan-badge / .plan-quota rules went with the badge they styled (#653). */
.account-logout {
  min-height:var(--row-comfy); font:inherit; font-weight:600; cursor:pointer;
  color:var(--ink); background:var(--surface-2);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.account-logout:hover { border-color:var(--accent); color:var(--accent); }
.uploaded-by {
  display:flex; align-items:center; gap:var(--s3); margin:var(--s3) 0 0;
  font-size:var(--t-xs); color:var(--muted);
}

/* --- filters + segmented control ----------------------------------------- */
.filter-row { display:flex; align-items:center; gap:var(--s4); margin:0 0 var(--s5); }
.filter-row select, .filter-row input[type=search] {
  min-height:var(--row); font:inherit; font-size:var(--t-sm); padding:0 var(--s4);
  color:var(--ink); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.filter-row input[type=search] { flex:1; min-width:0; }
.store-req-hint { font-size:var(--t-xs); color:var(--muted); margin:var(--s3) 0 0; }
#req-store-form { display:flex; flex-direction:column; gap:var(--s2); margin-top:var(--s3); }
.pw-wrap { position:relative; display:flex; align-items:center; }
.pw-wrap input { width:100%; padding-right:2.6rem; box-sizing:border-box; }
.pw-eye { position:absolute; right:var(--s2); background:none; border:none; cursor:pointer; color:var(--muted); padding:0.2rem 0.3rem; font-size:1rem; line-height:1; }
.link-btn { background:none; border:none; color:var(--accent); cursor:pointer;
  font:inherit; font-size:inherit; padding:0; text-decoration:underline; }
#req-store-name { width:100%; box-sizing:border-box; font:inherit; font-size:var(--t-sm);
  padding:0 var(--s4); min-height:var(--row); color:var(--ink);
  background:var(--surface); border:1px solid var(--line-strong);
  border-radius:var(--r-md); }
.segmented {
  display:inline-flex; gap:2px; padding:2px; margin:0 0 var(--s5);
  background:var(--surface-sunk); border:1px solid var(--line);
  border-radius:var(--r-md);
}
.seg {
  appearance:none; min-height:30px; padding:0 var(--s5);
  font:inherit; font-size:var(--t-xs); font-weight:700; letter-spacing:.03em;
  cursor:pointer; color:var(--muted); background:none;
  border:0; border-radius:var(--r-sm);
}
.seg:hover { color:var(--ink-2); }
.seg.on { color:var(--on-accent); background:var(--accent); }
.seg:focus-visible { outline:2px solid var(--focus); outline-offset:-1px; }
/* Prices | Offers page toggle (Offers folds into the Prices tab). */
.pv-toggle {
  display:inline-flex; gap:2px; padding:2px; margin:0 0 var(--s5);
  background:var(--surface-sunk); border:1px solid var(--line);
  border-radius:var(--r-md);
}
.pv-toggle a {
  display:inline-flex; align-items:center; min-height:30px; padding:0 var(--s5);
  font-size:var(--t-xs); font-weight:700; letter-spacing:.03em;
  color:var(--muted); text-decoration:none; border-radius:var(--r-sm);
}
.pv-toggle a[aria-current=page] { color:var(--on-accent); background:var(--accent); }

/* --- offers -------------------------------------------------------------- */
.offer-list { display:flex; flex-direction:column; gap:var(--s3); }
.offer-card {
  display:block; padding:var(--s4) var(--s5);
  background:var(--surface); border:1px solid var(--line);
  border-left:3px solid var(--warn); border-radius:var(--r-sm);
}
.off-head { display:flex; align-items:center; gap:var(--s3); }
.off-badge {
  margin-left:auto; height:18px; display:inline-flex; align-items:center; padding:0 5px;
  font-size:var(--t-xs); font-weight:700; border-radius:var(--r-xs);
  color:var(--warn); background:var(--warn-quiet); border:1px solid var(--warn-line);
}
.off-name { margin:var(--s3) 0; font-size:var(--t-base); font-weight:600; }
.off-price { display:flex; align-items:baseline; gap:var(--s4); flex-wrap:wrap; }
.off-now { font-size:var(--t-lg); font-weight:700; letter-spacing:-.02em; color:var(--ink); }
.off-now .unit { font-size:.72em; font-weight:600; color:var(--muted); }
.off-old { font-size:var(--t-sm); color:var(--faint); text-decoration:line-through; }
.off-save {
  display:inline-flex; align-items:center; height:18px; padding:0 5px;
  font-size:var(--t-xs); font-weight:700; border-radius:var(--r-xs);
  color:var(--good); background:var(--good-quiet); border:1px solid var(--good-line);
}
.off-until { display:block; margin-top:var(--s3); font-size:var(--t-xs); color:var(--faint); }
.off-disc { margin-top:var(--s2); font-size:var(--t-xs); color:var(--muted); }

/* --- prices -------------------------------------------------------------- */
.price-list { display:flex; flex-direction:column; gap:var(--s3); }
.price-row {
  display:flex; align-items:center; justify-content:space-between; gap:var(--s5);
  min-height:var(--row-tap); padding:var(--s4) var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-md);
}
.price-row.is-cheap { border-color:var(--good); }
.pr-main { min-width:0; flex:1; }
.pr-name {
  font-size:var(--t-base); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.pr-main .chip-wrap { margin-top:var(--s2); }
.pr-price { flex-shrink:0; text-align:right; }
.pr-ref { font-size:var(--t-xs); color:var(--faint); }
.pr-bar { height:5px; margin-top:var(--s3); background:var(--surface-sunk);
  border-radius:1px; overflow:hidden; }
.pr-bar i { display:block; height:100%; }
.pr-best { margin-left:var(--s3); font-size:var(--t-xs); font-weight:700;
  color:var(--good); }
.pr-range { margin:var(--s2) 0 var(--s4); font-size:var(--t-xs); color:var(--muted); }
.price-row[data-name] { cursor:pointer; }
/* Product photos arrive at wildly different aspect ratios (tall bottles, wide
   multipacks), so an unsized box rendered every row a different width and the
   price column read as ragged. A square box keeps the rows aligned; it scales
   down on narrow phones and can never exceed its column. `contain` (not cover)
   because cropping slices the top off a bottle — the letterbox sits on the
   sunk surface so it reads as intentional in both themes. */
.pd-img { display:block; margin-left:auto; margin-bottom:var(--s3);
  width:clamp(44px, 14vw, 64px); aspect-ratio:1; max-width:100%;
  object-fit:contain; background:var(--surface-sunk); border-radius:var(--r-md); }
.pd-desc { color:var(--muted); font-size:var(--t-xs); margin-top:var(--s2); }
.pd-back { background:none; border:none; color:var(--muted); cursor:pointer;
  font:inherit; padding:.2rem 0; display:inline-flex; align-items:center; gap:var(--s3);
  margin-bottom:var(--s4); }
.pd-rec { display:flex; align-items:flex-start; gap:var(--s4); background:var(--save-bg);
  color:var(--save); border-radius:var(--r-md); padding:var(--s4) var(--s5);
  font-size:var(--t-sm); margin:var(--s2) 0 var(--s5); }
/* Thumbnail in search result rows and offer cards (#850). Fixed 48×48 square,
   white ground so retailer images on transparent PNGs read on both themes,
   object-fit:contain keeps the whole product visible without cropping. The
   explicit width/height attributes (set on the <img> element) prevent row-jump
   while the image loads; onerror swaps to the same placeholder so the browser's
   broken-image glyph never appears. */
.pr-thumb { flex:none; width:48px; height:48px; border-radius:var(--r-sm);
  object-fit:contain; background:#fff; border:1px solid var(--line); }
span.pr-thumb { display:block; background:var(--surface-sunk); }
/* Add-to-list button to the right of the price: a single ＋ button that toggles
   on/off, with a tiny count badge below it. Min tap target 44×44 px (#850). */
.pr-add-btn {
  display:flex; flex-direction:column; align-items:center; gap:2px; flex:none;
  min-width:44px; min-height:44px; padding:0 var(--s2);
  font:inherit; font-size:var(--t-xs); cursor:pointer;
  color:var(--ink-2); background:var(--surface-2);
  border:1px solid var(--line-strong); border-radius:var(--r-sm);
  -webkit-tap-highlight-color:transparent;
}
.pr-add-btn:hover { border-color:var(--accent); color:var(--accent); }
.pr-add-btn.on { border-color:var(--good); color:var(--good); background:var(--save-bg); }
.pr-add-ct { font-size:var(--t-xs); font-weight:700; line-height:1; }
/* Offer card thumbnail (#850) */
.off-thumb { display:block; width:64px; height:64px; margin-bottom:var(--s3); flex:none;
  object-fit:contain; background:#fff; border-radius:var(--r-sm);
  border:1px solid var(--line); }
span.off-thumb { background:var(--surface-sunk); }
.off-card-body { display:flex; align-items:flex-start; gap:var(--s4); }
.off-card-main { flex:1; min-width:0; }
.off-card-side { display:flex; flex-direction:column; align-items:center;
  gap:var(--s2); flex:none; }

/* --- profile hub --------------------------------------------------------- */
.profile-card {
  display:flex; align-items:center; gap:var(--s5); margin:0 0 var(--s5);
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg);
}
.profile-id { display:flex; flex-direction:column; gap:2px; min-width:0; }
.profile-id b { overflow:hidden; text-overflow:ellipsis; }
.profile-link {
  display:flex; align-items:center; gap:var(--s5); margin:0 0 var(--s2);
  min-height:var(--row-tap); padding:var(--s4) var(--s5);
  color:var(--ink); text-decoration:none;
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-md);
}
.profile-link:hover { background:var(--surface-2); border-color:var(--line-strong); }
/* The appearance row holds a switch, not a link — it must not look tappable as a
   whole (only the switch is), so it doesn't take the link hover. */
.theme-row, .theme-row:hover { cursor:default; background:var(--surface);
  border-color:var(--line); }
.theme-row .switch { flex:none; }
.profile-link-ic { display:flex; color:var(--accent); }
.profile-link-tx { display:flex; flex-direction:column; flex:1; min-width:0; gap:1px; }
.profile-chev { color:var(--faint); font-size:1.2rem; line-height:1; }
.profile-logout {
  width:100%; margin-top:var(--s5); min-height:var(--row-comfy);
  font:inherit; font-weight:700; cursor:pointer;
  color:var(--crit); background:var(--surface);
  border:1px solid var(--crit-line); border-radius:var(--r-md);
}
.profile-logout:hover { background:var(--crit-quiet); }

/* --- BYOK settings card -------------------------------------------------- */
/* Write-only API key field on the Profile screen (issue #546). */
.byok-card {
  margin:0 0 var(--s2);
  padding:var(--s4) var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-md);
}
.byok-card-hd {
  display:flex; align-items:center; gap:var(--s3); margin:0 0 var(--s3);
}
.byok-card-hd b { flex:1; font-weight:700; }
.byok-key-status { font-size:var(--t-xs); color:var(--muted); }
.byok-key-status.active { color:var(--good); }
.byok-row {
  display:flex; gap:var(--s3);
}
.byok-input {
  flex:1; min-width:0; min-height:var(--row-comfy); font:inherit;
  font-size:var(--t-base); padding:0 var(--s4); color:var(--ink);
  background:var(--surface); border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.byok-input:focus { outline:2px solid var(--accent); outline-offset:1px; }
.byok-save {
  min-height:var(--row-comfy); padding:0 var(--s5);
  font:inherit; font-weight:700; cursor:pointer;
  color:var(--on-accent); background:var(--accent); border:0; border-radius:var(--r-md);
  white-space:nowrap;
}
.byok-save:hover { background:var(--accent-strong); }
.byok-save:disabled { opacity:0.6; cursor:default; }
.byok-remove {
  min-height:var(--row-comfy); padding:0 var(--s4);
  font:inherit; font-weight:600; cursor:pointer;
  color:var(--crit); background:transparent; border:1px solid var(--crit-line);
  border-radius:var(--r-md); white-space:nowrap; flex:none;
}
.byok-remove:hover { background:var(--crit-quiet); }
.byok-remove:disabled { opacity:0.6; cursor:default; }
.byok-feedback { margin:var(--s3) 0 0; font-size:var(--t-sm); }
.byok-feedback.err { color:var(--crit); }
.byok-feedback.ok { color:var(--good); }

/* --- shopping list ------------------------------------------------------- */
.li-add { display:flex; gap:var(--s4); margin:0 0 var(--s5); }
.li-add input, .li-add select {
  min-height:var(--row-comfy); font:inherit; font-size:var(--t-base);
  padding:0 var(--s4); color:var(--ink); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.li-add input { flex:1; min-width:0; }
.li-add-btn {
  min-height:var(--row-comfy); padding:0 var(--s6);
  font:inherit; font-weight:700; cursor:pointer;
  color:var(--on-accent); background:var(--accent); border:0; border-radius:var(--r-md);
}
.li-add-btn:hover { background:var(--accent-strong); }
/* The "from your history" adds are a dashed pill: an offer to act, not a state. */
/* The cadence picker: a quiet control that only looks like one when you reach for
   it — a row of loud selects would drown the list itself. */
.li-cad {
  font:inherit; font-size:var(--t-xs); color:var(--muted); cursor:pointer;
  padding:2px 4px; margin-left:-4px; min-height:var(--row-tap);
  background:transparent; border:1px solid transparent; border-radius:var(--r-xs);
}
.li-cad:hover { border-color:var(--line-strong); color:var(--ink-2); }
.li-cad:focus-visible { outline:2px solid var(--focus); outline-offset:1px; }
/* Add a recommended item to the list. The accent means "you can act here". */
.rec-add {
  display:inline-flex; align-items:center; gap:4px; flex:none;
  min-height:var(--row-tap); padding:0 var(--s4);
  font:inherit; font-size:var(--t-xs); font-weight:600; cursor:pointer;
  color:var(--accent); background:var(--accent-quiet);
  border:1px solid var(--accent-line); border-radius:var(--r-xs);
}
.rec-add:hover { background:var(--accent); color:var(--on-accent); }
.rec-add:focus-visible { outline:2px solid var(--focus); outline-offset:1px; }
.li-suggs { display:flex; flex-wrap:wrap; align-items:center; gap:var(--s3); }
.li-sugg {
  display:inline-flex; align-items:center; gap:5px;
  min-height:36px; padding:0 var(--s5); font:inherit; font-size:var(--t-sm);
  font-weight:600; cursor:pointer; color:var(--ink-2); background:var(--surface);
  border:1px dashed var(--line-strong); border-radius:var(--r-sm);
}
.li-sugg svg { width:14px; height:14px; flex:none; }
.li-sugg:hover { border-style:solid; border-color:var(--accent); color:var(--accent); }
.li-summary { margin:var(--s4) 0 0; }
.li-summary .card-hd { margin-bottom:var(--s3); }
.li-progress { height:5px; background:var(--surface-sunk); border-radius:1px;
  overflow:hidden; }
.li-progress i { display:block; height:100%; background:var(--good);
  transition:width 400ms ease; }
/* The staples sit in the shared .rows/.row block; only the two controls that are
   particular to a list row live here. A checked-off row is struck through — the
   state is in the FORM, not only in the colour. */
.li-check { width:20px; height:20px; flex:none; accent-color:var(--accent);
  cursor:pointer; }
.row.got .row-name { text-decoration:line-through; color:var(--muted); }
.li-del {
  flex:none; width:28px; height:28px; padding:0; font-size:1.1rem; line-height:1;
  cursor:pointer; color:var(--faint); background:none; border:0;
}
.li-del:hover { color:var(--crit); }

/* --- cook ---------------------------------------------------------------- */
.cook-input {
  width:100%; min-height:var(--row-tap); padding:var(--s4) var(--s5);
  font:inherit; font-size:var(--t-base); color:var(--ink);
  background:var(--surface); border:1px solid var(--line-strong);
  border-radius:var(--r-md); resize:vertical;
}
.cook-input::placeholder { color:var(--faint); }
.cook-btn {
  width:100%; margin-top:var(--s4); min-height:var(--row-comfy); padding:0 var(--s6);
  font:inherit; font-size:var(--t-base); font-weight:700; cursor:pointer;
  color:var(--on-accent); background:var(--accent); border:0; border-radius:var(--r-md);
}
.cook-btn:hover { background:var(--accent-strong); }
.cook-store-row { display:flex; align-items:center; gap:var(--s4); margin-top:var(--s4); }
.cook-store-row select {
  flex:1; min-width:0; min-height:var(--row-comfy); font:inherit; font-size:var(--t-sm);
  padding:0 var(--s4); color:var(--ink); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
/* The plan button sits on the store row, so it sizes to its label there. */
.cook-store-row .cook-btn { width:auto; margin-top:0; }
/* The answer, before the evidence: the cheapest shop, its total, and the split
   alternative. A good-toned left stripe marks it as the recommendation. */
.cook-basket {
  margin:var(--s6) 0 0; padding:var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--good);
  border-radius:var(--r-lg);
}
.cook-mix {
  display:flex; align-items:center; gap:var(--s3); flex-wrap:wrap;
  margin-top:var(--s5); padding-top:var(--s4); border-top:1px solid var(--line);
}
.cook-item { padding:var(--s4) 0; border-top:1px solid var(--line); }
.cook-q { display:flex; align-items:center; gap:var(--s3); margin-bottom:var(--s3);
  font-weight:600; }
/* The price ladder under an ingredient: store · product · price. The cheapest row
   carries a good-toned inset rule as well as the good figure — two channels. */
.cook-store { display:flex; align-items:center; gap:var(--s4); min-height:var(--row);
  padding:var(--s3) 0; }
.cook-store + .cook-store { border-top:1px solid var(--line); }
.cook-store.best { box-shadow:inset 2px 0 0 var(--good); padding-left:var(--s4); }
.cook-prod {
  flex:1; min-width:0; font-size:var(--t-sm); color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* Clarifier: a "which one?" fork under a genuinely ambiguous item (bare jamón =
   cured or cooked). Tappable chips, unlike the static store/badge chips. */
.cook-clar {
  display:flex; align-items:center; gap:var(--s3); flex-wrap:wrap;
  margin-top:var(--s3); padding-top:var(--s3); border-top:1px dashed var(--line);
}
.cook-clar .clar-q { font-size:var(--t-xs); color:var(--muted); margin-right:var(--s1); }
.cook-refine {
  height:26px; padding:0 var(--s4); font-size:var(--t-xs); font-weight:600;
  color:var(--accent); background:var(--surface-2);
  border:1px solid var(--accent); border-radius:var(--r-pill); cursor:pointer;
}
.cook-refine:hover { background:var(--accent); color:var(--on-accent); }
.cook-refine:disabled { opacity:.5; cursor:default; }
.cook-plates ul { list-style:none; margin:0; padding:0; }
.cook-plates li {
  display:flex; align-items:center; gap:var(--s4); min-height:var(--row);
  padding:var(--s3) 0; font-size:var(--t-base);
}
.cook-plates li + li { border-top:1px solid var(--line); }
.cook-plates svg { flex:none; color:var(--accent); }
/* An ingredient deal: the same anatomy as an offer card, on the deal (warn) hue. */
.cook-offer {
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--warn);
  border-radius:var(--r-sm);
}
.cook-offer + .cook-offer { margin-top:var(--s3); }
.cook-mode { margin-top:var(--s4); }
.cook-complexity-row { display:flex; gap:var(--s3); margin-top:var(--s3); }
.cook-cx-btn {
  padding:var(--s2) var(--s4); border-radius:99px; border:1.5px solid var(--border);
  background:var(--surface); color:var(--ink-2); font:inherit; font-size:.85rem;
  cursor:pointer; transition:background .12s, color .12s, border-color .12s;
}
.cook-cx-btn:hover { border-color:var(--accent); color:var(--accent); }
.cook-cx-btn.on { background:var(--accent-quiet); color:var(--accent); border-color:var(--accent); }
.cook-recent {
  display:flex; align-items:center; gap:var(--s4); width:100%;
  min-height:var(--row-tap); padding:var(--s3) var(--s5);
  font:inherit; text-align:left; cursor:pointer; color:var(--ink);
  background:none; border:0;
}
.cook-recent + .cook-recent { border-top:1px solid var(--line); }
.cook-recent:hover { background:var(--surface-2); }
.cook-cooking { padding:var(--s9) 0; text-align:center; }
.cook-cooking .glyph { display:inline-block; color:var(--accent); }
.cook-cooking .cap { margin-top:var(--s5); font-size:var(--t-sm); color:var(--muted); }

/* cook self-check (recommended vs paid) */
.cmp-card {
  margin:var(--s5) 0 0; padding:var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-lg);
}
.cmp-delta { font-weight:700; }
.cmp-delta.over { color:var(--crit); }
.cmp-delta.under { color:var(--good); }
.cmp-items { margin:var(--s3) 0; }
/* An item the receipt did not have: the same badge, struck through — the miss is
   a form, not only a colour. */
.bdg.cmp-miss { color:var(--faint); text-decoration:line-through; }
.cmp-offers { margin-top:var(--s3); }
.cmp-offer { padding:var(--s1) 0; font-size:var(--t-sm); color:var(--ink-2); }
.cmp-btn, .cmp-unlink {
  min-height:34px; padding:0 var(--s5); font:inherit; font-size:var(--t-sm);
  font-weight:700; cursor:pointer; color:var(--accent); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-sm);
}
.cmp-btn:hover { border-color:var(--accent); }
.cmp-unlink { margin-top:var(--s4); color:var(--muted); }
.cmp-pick {
  display:block; width:100%; margin:var(--s3) 0 0; min-height:var(--row-comfy);
  padding:var(--s3) var(--s5); font:inherit; font-size:var(--t-sm); text-align:left;
  cursor:pointer; color:var(--ink); background:var(--surface);
  border:1px solid var(--line); border-radius:var(--r-md);
}
.cmp-pick:hover { background:var(--surface-2); }

/* --- eating plan --------------------------------------------------------- */
.eat-guide {
  padding:var(--s5); margin:var(--s2) 0 var(--s6);
  font-size:var(--t-sm); line-height:1.5; color:var(--ink-2);
  background:var(--surface-2); border:1px solid var(--line); border-radius:var(--r-lg);
}
.eat-guide b {
  display:block; margin-bottom:var(--s3); font-size:var(--t-micro); font-weight:700;
  letter-spacing:.1em; text-transform:uppercase; color:var(--muted);
}
.eat-card {
  margin:var(--s4) 0 var(--s6); padding:0 var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-lg);
}
.eat-item {
  display:flex; align-items:center; gap:var(--s5);
  min-height:var(--row-tap); padding:var(--s4) 0; border-bottom:1px solid var(--line);
}
.eat-item:last-child { border-bottom:0; }
.eat-ic { flex:none; width:24px; display:flex; justify-content:center;
  color:var(--muted); }
.eat-lab { flex:1; min-width:0; font-size:var(--t-base); }
.eat-lab small { display:block; margin-top:1px; font-size:var(--t-xs);
  color:var(--muted); }
.eat-chips { display:flex; flex-wrap:wrap; gap:var(--s3); margin:var(--s3) 0; }
.eat-chip {
  display:inline-flex; align-items:center; gap:5px;
  min-height:36px; padding:0 var(--s5);
  font:inherit; font-size:var(--t-sm); font-weight:600; cursor:pointer;
  color:var(--ink-2); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-sm);
}
.eat-chip.on { color:var(--accent); background:var(--accent-quiet);
  border-color:var(--accent); }
.eat-chip svg { flex:none; }
.eat-save { width:100%; margin-top:var(--s7); }
.eat-status { min-height:1.2em; margin-top:var(--s4); text-align:center; }
/* The quiet counterpart of the primary button (reset, unlink): same geometry,
   no fill — an action that must not compete with the one you usually want. */
.ghost-btn {
  display:flex; align-items:center; justify-content:center; width:100%;
  min-height:var(--row-comfy); margin-top:var(--s3); padding:0 var(--s6);
  font:inherit; font-size:var(--t-base); font-weight:700; cursor:pointer;
  color:var(--ink-2); background:var(--surface);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.ghost-btn:hover { background:var(--surface-2); }
/* A food-group glyph, at the size a row's label wants. */
.g-ico { display:flex; flex:none; color:var(--muted); }

/* stepper — machined keys, never below a 34px target */
.stepper { display:flex; align-items:center; gap:2px; flex:none; }
.stp {
  display:grid; place-items:center; width:34px; height:34px;
  font:inherit; font-size:var(--t-lg); line-height:1; cursor:pointer;
  color:var(--ink-2); background:var(--surface-2);
  border:1px solid var(--line-strong); border-radius:var(--r-sm);
}
.stp:hover { border-color:var(--accent); color:var(--accent); }
.stp:active { background:var(--surface-sunk); }
.stp-val {
  min-width:34px; text-align:center; font-size:var(--t-md); font-weight:700;
  color:var(--ink);
}

/* The habit toggle stays a PILL — but a machined one: tighter geometry, a cyan
   ACTION accent when on (it's a control, not a state readout), a real focus ring
   and a 44px hit target that overhangs the 26px track. Selectors are scoped to
   .eat-item so they beat the page's own (older) rules. */
.switch, .eat-item .switch {
  position:relative; flex:none; width:44px; height:26px;
}
.switch input, .eat-item .switch input {
  position:absolute; top:-9px; left:0; width:44px; height:44px; /* 44px hit target */
  margin:0; opacity:0; cursor:pointer; z-index:1;
}
.switch .slider, .eat-item .switch .slider {
  position:absolute; inset:0; cursor:pointer; border-radius:var(--r-pill);
  background:var(--surface-sunk); border:1px solid var(--line-strong);
  transition:background 140ms, border-color 140ms;
}
.switch .slider::before, .eat-item .switch .slider::before {
  content:""; position:absolute; top:3px; left:3px; width:18px; height:18px;
  border-radius:50%; background:var(--muted); box-shadow:none;
  transition:transform 140ms, background 140ms;
}
.switch input:checked + .slider, .eat-item .switch input:checked + .slider {
  background:var(--accent-quiet); border-color:var(--accent);
}
.switch input:checked + .slider::before,
.eat-item .switch input:checked + .slider::before {
  transform:translateX(18px); background:var(--accent);
}
.switch input:focus-visible + .slider,
.eat-item .switch input:focus-visible + .slider {
  outline:2px solid var(--focus); outline-offset:2px;
}

/* --- health check -------------------------------------------------------- */
/* The verdict ring is an inline SVG arc (like the Insights score ring), not a
   conic-gradient: an arc can carry a severity tone, a butt cap that ends exactly
   on the value, and a label that assistive tech can read. */
.hc-ring { flex:none; }
.hc-seg { margin:var(--s2) 0 var(--s6); }
.hc-hero .t { font-size:var(--t-md); font-weight:600; color:var(--ink); line-height:1.35; }
/* One finding per food group. Severity rides three redundant channels: the left
   stripe, the meter fill and the count — so the block still reads in greyscale. */
.hc-find {
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--line-strong);
  border-radius:var(--r-sm);
}
.hc-find + .hc-find { margin-top:var(--s3); }
.hc-find.sev-good { border-left-color:var(--good); }
.hc-find.sev-warn { border-left-color:var(--warn); }
.hc-find.sev-crit { border-left-color:var(--crit); }
.hc-find-top { display:flex; align-items:center; gap:var(--s4); margin-bottom:5px; }
.hc-find-top b { flex:1; min-width:0; font-size:var(--t-base); font-weight:600; }
.hc-msg { margin:5px 0 0; font-size:var(--t-xs); color:var(--muted); line-height:1.45; }
/* The space of doubt, stated rather than hidden (health check, eating plan). */
.caveat {
  margin:var(--s6) 0 0; font-size:var(--t-xs); font-style:italic;
  color:var(--faint); line-height:1.5;
}

/* --- scores / insights --------------------------------------------------- */
.score-hero {
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg);
}
.score-ring { flex:none; }
.score-trend { font-family:var(--mono); font-variant-numeric:tabular-nums;
  font-size:var(--t-xs); }
.trend-chart { display:block; overflow:visible; }
.ins-line { display:block; }
.ins-seg { margin:var(--s2) 0 var(--s4); }
.ins-axis {
  display:flex; justify-content:space-between; margin-top:var(--s3);
  font-family:var(--mono); font-size:var(--t-xs); color:var(--faint);
  font-variant-numeric:tabular-nums;
}

/* --- history ------------------------------------------------------------- */
.hist-sum { display:flex; gap:var(--s2); margin:var(--s2) 0 var(--s6); }
.hist-stat {
  flex:1; padding:var(--s5) var(--s4); text-align:center;
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-xs);
}
.hist-sum > .hist-stat:first-child { border-top-left-radius:var(--r-lg);
  border-bottom-left-radius:var(--r-lg); }
.hist-sum > .hist-stat:last-child { border-top-right-radius:var(--r-lg);
  border-bottom-right-radius:var(--r-lg); }
.hist-stat b { display:block; font-size:var(--t-lg); font-weight:600; line-height:1.15;
  letter-spacing:-.02em; }
.hist-stat span {
  display:block; margin-top:var(--s2); font-size:var(--t-micro); font-weight:700;
  letter-spacing:.1em; text-transform:uppercase; color:var(--muted);
}
.hist-month {
  display:flex; align-items:baseline; justify-content:space-between;
  margin:var(--s7) 0 var(--s4); padding-bottom:var(--s3);
  border-bottom:1px solid var(--line);
}
.hist-month h2 {
  margin:0; font-size:var(--t-micro); font-weight:700; letter-spacing:.12em;
  text-transform:uppercase; color:var(--muted);
}
.m-tot { font-size:var(--t-xs); color:var(--faint); }

/* The tile-reveal is gone: it flipped tiles against a timer that eased toward a
   hardcoded 92%, so the number on screen measured nothing. The scan page now uses
   the two-zone .parse track below. */
.file-names { list-style:none; margin:var(--s3) 0 0; padding:0; display:flex;
  flex-direction:column; gap:var(--s2); }
.file-names li {
  display:flex; align-items:center; gap:var(--s4); padding:var(--s3) var(--s4);
  font-size:var(--t-sm); background:var(--surface-2);
  border:1px solid var(--line); border-radius:var(--r-sm);
}
.file-names .n { margin-left:auto; font-family:var(--mono); color:var(--faint);
  font-variant-numeric:tabular-nums; }

/* --- auth pages (standalone: no shell, no ds.js) ------------------------- */
.login-wrap { display:flex; flex-direction:column; gap:var(--s5); }
.login-wrap .wordmark { display:block; }
.auth-alt { font-size:var(--t-sm); color:var(--accent); text-decoration:none; }
.auth-alt:hover { text-decoration:underline; }

/* Announced to a screen reader, invisible on screen: the skeleton boxes are
   decorative, so assistive tech gets one "Loading…" rather than a heap of
   empty elements. */
.sr-only {
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip-path:inset(50%); white-space:nowrap; border:0;
}

/* ===========================================================================
   INSTRUMENT LAYOUT — the information design of Home + Insights.

   Summary before detail; every panel is a legend + a block. State is encoded in
   FORM as well as colour (severity stripes, meters, bar length, filled vs
   outline), so the screen still reads in greyscale. Figures are mono + tabular
   so the columns line up like a readout.
   =========================================================================== */

/* A panel legend: micro-caps, a hairline running to the edge, an optional action. */
.sec-head {
  display:flex; align-items:baseline; gap:var(--s4); margin:var(--s7) 0 var(--s4);
}
.sec-head h2 {
  margin:0; font-size:var(--t-micro); font-weight:700; letter-spacing:.12em;
  text-transform:uppercase; color:var(--muted); white-space:nowrap;
}
.sec-head .hr { flex:1; height:1px; background:var(--line); }
.sec-head a {
  font-size:var(--t-xs); font-weight:600; color:var(--accent); text-decoration:none;
  white-space:nowrap;
}
.sec-head a:hover { text-decoration:underline; }

/* A figure is a readout, at any size. */
.fig {
  font-family:var(--mono); font-variant-numeric:tabular-nums; font-weight:600;
  letter-spacing:-.01em; white-space:nowrap; color:var(--ink);
}
.fig.xl { font-size:var(--t-fig-l); letter-spacing:-.03em; }
.fig.lg { font-size:var(--t-fig); letter-spacing:-.02em; }
.fig.md { font-size:var(--t-md); }
.fig.sm { font-size:var(--t-sm); }
.fig.xs { font-size:var(--t-xs); }
.fig.good { color:var(--good); }
.fig.warn { color:var(--warn); }
.fig.crit { color:var(--crit); }
.fig.accent { color:var(--accent); }
.fig.mute { color:var(--muted); font-weight:500; }
.fig.strike { text-decoration:line-through; color:var(--faint); font-weight:500; }
.fig .unit { font-size:.75em; font-weight:600; color:var(--muted); }

/* A state badge: the border weight and the fill both change, not just the hue. */
.bdg {
  display:inline-flex; align-items:center; gap:4px; height:18px; padding:0 5px;
  font-size:var(--t-xs); font-weight:700; letter-spacing:.02em; line-height:1;
  white-space:nowrap; border-radius:var(--r-xs);
  color:var(--ink-2); background:var(--surface-2); border:1px solid var(--line-strong);
}
.bdg svg { width:11px; height:11px; flex:none; }
.bdg.good { color:var(--good); background:var(--good-quiet); border-color:var(--good-line); }
.bdg.warn { color:var(--warn); background:var(--warn-quiet); border-color:var(--warn-line); }
.bdg.crit { color:var(--crit); background:var(--crit-quiet); border-color:var(--crit-line); }
.bdg.acc  { color:var(--accent); background:var(--accent-quiet);
  border-color:var(--accent-line); }

/* Stat tile — key · figure · micro-chart · delta. Four cells, one outer radius. */
.stat .k {
  display:flex; align-items:center; gap:5px; margin-bottom:var(--s3);
  font-size:var(--t-micro); font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted);
}
.stat .k svg { width:12px; height:12px; flex:none; color:var(--faint); }
.stat .v { display:flex; align-items:baseline; gap:5px; }
.stat .spark { display:block; width:100%; height:20px; margin-top:var(--s3); }
.stat .delta {
  margin-top:var(--s2); font-family:var(--mono); font-variant-numeric:tabular-nums;
  font-size:var(--t-xs); font-weight:600; color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.stat .delta.good { color:var(--good); }
.stat .delta.warn { color:var(--warn); }
.stat .delta.crit { color:var(--crit); }
.stat .delta.flat { color:var(--muted); }

/* Card — the neutral panel every block sits in. */
.card {
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg);
}
.card + .card { margin-top:var(--s4); }
.card-hd { display:flex; align-items:center; gap:var(--s4); margin:0 0 var(--s4); }
.card-hd b { flex:1; min-width:0; font-size:var(--t-base); font-weight:600; }
.card > .muted:only-child { margin:0; }

/* Bars/meters share the .bar-row grid, so a magnitude bar and a count-vs-target
   meter line up in the same columns. Severity lives in the fill. */
.bars { display:flex; flex-direction:column; }
.meter {
  display:block; height:6px; background:var(--surface-sunk); border-radius:1px;
  overflow:hidden;
}
.meter i {
  display:block; height:100%; min-width:2px; background:var(--muted);
  transition:width 300ms ease-out;
}
.sev-good i { background:var(--good); }
.sev-warn i { background:var(--warn); }
.sev-crit i { background:var(--crit); }

/* This week's shop: item · due state · where it's cheapest. */
.due-row {
  display:flex; align-items:center; gap:var(--s4); min-height:var(--row);
  padding:var(--s2) 0;
}
.due-row + .due-row { border-top:1px solid var(--line); }
.due-name {
  flex:1; min-width:0; display:flex; align-items:center; gap:var(--s3);
  font-size:var(--t-sm); color:var(--ink-2);
}
.due-name .n { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.due-rt { flex:none; display:flex; align-items:center; gap:var(--s3); }

/* Dense list rows in one hairline-jointed block. */
.rows {
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-lg);
  overflow:hidden;
}
.row {
  display:flex; align-items:center; gap:var(--s4); width:100%;
  min-height:var(--row-tap); padding:var(--s3) var(--s5);
  font:inherit; text-align:left; color:inherit; text-decoration:none;
}
.row + .row { border-top:1px solid var(--line); }
a.row:hover, button.row:hover { background:var(--surface-2); }
.row-mid { display:flex; flex-direction:column; gap:3px; flex:1; min-width:0; }
.row-name {
  font-size:var(--t-base); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.row-sub {
  display:flex; align-items:center; gap:var(--s3); flex-wrap:wrap;
  font-family:var(--mono); font-variant-numeric:tabular-nums;
  font-size:var(--t-xs); color:var(--muted);
}
.row-sub svg { flex:none; color:var(--faint); }
.row-rt { display:flex; flex-direction:column; align-items:flex-end; gap:3px; flex:none; }
.row-ic { flex:none; width:18px; height:18px; color:var(--faint); }

/* Key-value strip — the readout under a panel. */
.kv {
  display:flex; gap:var(--s5); flex-wrap:wrap;
  margin-top:var(--s5); padding-top:var(--s4); border-top:1px solid var(--line);
}
.kv > div { display:flex; flex-direction:column; align-items:flex-start; gap:2px; }
.kv .k {
  font-size:var(--t-micro); font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--muted);
}

/* Score hero (Insights): the ring, then everything the score is relative to. */
.hero {
  display:flex; align-items:center; gap:var(--s6); padding:var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-lg);
}
.hero-tx { flex:1; min-width:0; }
.hero-tx .t { font-size:var(--t-sm); color:var(--ink-2); }
.hero-tx .s {
  display:flex; align-items:center; gap:5px; flex-wrap:wrap; margin-top:var(--s3);
  font-size:var(--t-xs); color:var(--muted);
}
.hero-tx .s svg { width:12px; height:12px; flex:none; }

/* Badge shelf: earned is a solid star on a filled pill, locked is the outline of
   the same star on a quiet one — the form carries it, not only the colour. */
.pill-set { display:flex; flex-wrap:wrap; gap:var(--s3); }
.pill {
  display:inline-flex; align-items:center; gap:5px; min-height:36px; padding:0 var(--s5);
  font-size:var(--t-sm); font-weight:600; color:var(--faint);
  background:var(--surface); border:1px dashed var(--line-strong); border-radius:var(--r-sm);
}
.pill svg { width:14px; height:14px; flex:none; }
.pill[aria-pressed="true"] {
  color:var(--good); background:var(--good-quiet);
  border-style:solid; border-color:var(--good-line);
}

/* A chart and the axis strip under it. */
.chart-svg { display:block; width:100%; height:auto; }
.axis {
  display:flex; justify-content:space-between; gap:var(--s4); margin-top:var(--s3);
  font-family:var(--mono); font-variant-numeric:tabular-nums; font-size:var(--t-xs);
  color:var(--faint);
}
.axis .now { color:var(--accent); font-weight:700; }
.axis .mid { color:var(--ink-2); }

/* ===========================================================================
   SKELETONS — the loading system. Geometry mirrors the real block so the
   swap-in causes no layout shift. The shimmer stops under reduced motion.
   =========================================================================== */
.sk {
  display:block; border-radius:var(--r-xs);
  background:linear-gradient(90deg,
    var(--skeleton) 0%, var(--skeleton-hi) 50%, var(--skeleton) 100%);
  background-size:300% 100%;
  animation:sk-slide 1.4s linear infinite;
}
@keyframes sk-slide {
  from { background-position:150% 0; }
  to { background-position:-150% 0; }
}
.sk-line { height:10px; }
.sk-line.t { height:8px; }
.sk-line.h { height:14px; }
.sk-line + .sk-line { margin-top:var(--s3); }
/* A stat placeholder: same padding/border/radius as .stat, so the grid holds.
   With a spark it also reserves the micro-chart + delta lines, so a tile that
   draws a chart doesn't grow when the data lands. */
.sk-stat {
  padding:var(--s5) var(--s5) var(--s4);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-xs);
}
.sk-stat .sk-line.h { width:70%; }
.sk-stat .sk-line.t { width:45%; margin-top:var(--s4); }
.sk-stat .sk-key { width:55%; height:10px; }
.sk-stat .sk-fig { width:70%; height:20px; margin-top:var(--s3); }
.sk-stat .sk-spark { height:20px; margin-top:var(--s3); }
.sk-stat .sk-delta { width:80%; height:8px; margin-top:var(--s4); }
/* A row placeholder: matches .receipt / .price-row geometry. */
.sk-row {
  display:flex; align-items:center; gap:var(--s5);
  min-height:var(--row-tap); padding:var(--s4) var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-md);
}
.sk-row + .sk-row { margin-top:var(--s3); }
/* …and inside a joined .rows block it loses its own frame, so the placeholder
   list has the same hairline-jointed geometry as the real one. */
.rows > .sk-row { border:0; border-radius:0; margin-top:0; }
.rows > .sk-row + .sk-row { border-top:1px solid var(--line); }
.sk-row .sk-dot { width:18px; height:18px; flex:none; border-radius:var(--r-sm); }
.sk-row .sk-main { flex:1; min-width:0; }
.sk-row .sk-main .sk-line { width:60%; }
.sk-row .sk-main .sk-line.t { width:35%; }
.sk-row .sk-rt { width:64px; flex:none; }
/* A chart placeholder: bar-row rhythm, so bars land where the skeleton stood. */
.sk-chart { display:flex; flex-direction:column; }
.sk-chart .sk-bar {
  display:grid; grid-template-columns:6.5rem 1fr; align-items:center; gap:var(--s4);
  min-height:var(--row-tight);
}
.sk-chart .sk-bar + .sk-bar { border-top:1px solid var(--line); }
.sk-chart .sk-bar .sk-line.t { width:80%; }
.sk-chart .sk-bar .sk-track { height:6px; border-radius:1px; }
.sk-card {
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg);
}
.sk-card + .sk-card { margin-top:var(--s4); }
.sk-chip { height:20px; width:72px; border-radius:var(--r-xs); }
/* The spend-timeline block: the rendered SVG keeps its 320x120 viewBox aspect at
   any width, so the placeholder does too — the chart lands exactly where it stood. */
.sk-chart-box { width:100%; aspect-ratio:320/120; border-radius:var(--r-md); }
/* The score hero: a ring plus three text lines. */
.sk-hero {
  display:flex; align-items:center; gap:var(--s6); padding:var(--s5);
  background:var(--surface); border:1px solid var(--line); border-radius:var(--r-lg);
}
.sk-hero .sk-ring { width:88px; height:88px; flex:none; border-radius:50%; }
.sk-hero .sk-tx { flex:1; min-width:0; }
/* A health finding: the severity-striped block, its meter and its message. */
.sk-find {
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--line-strong);
  border-radius:var(--r-sm);
}
.sk-find + .sk-find { margin-top:var(--s3); }
.sk-find .sk-line.h { width:55%; }
.sk-find .sk-track { height:6px; margin-top:var(--s4); border-radius:1px; }
.sk-find .sk-line.t { width:80%; margin-top:var(--s4); }
/* The receipt photo on the detail page: it is wide and tall, so a bare spinner
   let the page jump hard when the image arrived. */
.sk-photo { aspect-ratio:3/4; width:100%; max-width:260px; border-radius:var(--r-md); }

/* ===========================================================================
   PARSE PROGRESS — an honest, two-zone readout for the receipt upload.

   Zone 1 (.parse-zone.z-upload) is MEASURED: real bytes sent, from XHR upload
   progress. Zone 2 (.parse-zone.z-read) is ESTIMATED from the user's own past
   parses and is labelled as such. When the estimate is exceeded the bar stops
   claiming a number: the zone goes to .unknown and is hatched, not filled.
   =========================================================================== */
.parse {
  --sweep:var(--accent); --sweep-quiet:var(--accent-quiet);
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg);
}
.parse[data-state="overrun"] { --sweep:var(--warn); --sweep-quiet:var(--warn-quiet); }
.parse[data-state="error"] { --sweep:var(--crit); --sweep-quiet:var(--crit-quiet); }
.parse-head { display:flex; align-items:flex-start; gap:var(--s5); }
.parse-head-tx { flex:1; min-width:0; }
.parse-head-tx b { display:block; font-size:var(--t-base); font-weight:600; }
.parse-head-tx .sub {
  display:block; margin-top:3px; font-family:var(--mono); font-size:var(--t-xs);
  color:var(--faint); font-variant-numeric:tabular-nums;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* The two-zone track. */
.parse-meter { margin-top:var(--s5); }
.parse-keys { display:flex; gap:2px; margin-bottom:var(--s3); }
.parse-key {
  min-width:0; font-size:9px; font-weight:700; letter-spacing:.09em;
  text-transform:uppercase; color:var(--faint);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.parse-key em { font-style:normal; color:var(--muted); }
.parse-key.k-upload { flex:0 0 26%; }
.parse-key.k-read { flex:1; }
.parse-track { display:flex; gap:2px; height:7px; }
.parse-zone {
  position:relative; height:100%; overflow:hidden;
  background:var(--surface-sunk); border-radius:1px;
}
.parse-zone.z-upload { flex:0 0 26%; }
.parse-zone.z-read { flex:1; }
.parse-zone > i {
  position:absolute; top:0; bottom:0; left:0; display:block; width:0;
  background:var(--accent); transition:width 160ms linear;
}
/* The measured leg reads as certain; the estimated leg is drawn quieter. */
.parse-zone.z-read > i { background:var(--accent-line); }
/* Past the estimate we stop claiming a percent: hatched, never filled. */
.parse-zone.unknown { background:var(--sweep-quiet); }
.parse-zone.unknown > i { display:none; }
.parse-zone.unknown::after {
  content:""; position:absolute; inset:0;
  background:repeating-linear-gradient(135deg,
    var(--sweep) 0 2px, transparent 2px 6px);
  opacity:.55;
}
.parse-read { display:flex; align-items:baseline; gap:var(--s4); margin-top:var(--s4); }
.parse-pct {
  flex:none; font-family:var(--mono); font-size:var(--t-md); font-weight:700;
  letter-spacing:-.01em; font-variant-numeric:tabular-nums; color:var(--ink);
}
.parse[data-state="overrun"] .parse-pct { color:var(--warn); }
.parse[data-state="error"] .parse-pct { color:var(--crit); }
.parse-note { flex:1; min-width:0; font-size:var(--t-xs); color:var(--muted);
  line-height:1.45; }
.parse-elapsed {
  flex:none; align-self:flex-start; font-family:var(--mono); font-size:var(--t-xs);
  color:var(--faint); font-variant-numeric:tabular-nums; white-space:nowrap;
}
.parse-steps { margin-top:var(--s5); padding-top:var(--s4);
  border-top:1px solid var(--line); }
.parse-step { display:flex; align-items:center; gap:var(--s4); min-height:26px;
  font-size:var(--t-sm); color:var(--faint); }
.parse-step .dot {
  display:grid; place-items:center; width:14px; height:14px; flex:none;
  border-radius:50%; border:1.5px solid var(--line-strong);
}
.parse-step .dot svg { width:9px; height:9px; }
.parse-step.done { color:var(--muted); }
.parse-step.done .dot { border-color:var(--good); background:var(--good-quiet);
  color:var(--good); }
.parse-step.now { color:var(--ink); font-weight:600; }
.parse-step.now .dot { border-color:var(--accent); }
.parse-step.now .dot::after {
  content:""; width:6px; height:6px; border-radius:50%; background:var(--accent);
  animation:parse-pulse 1.1s ease-in-out infinite;
}
.parse-step.hold { color:var(--warn); font-weight:600; }
.parse-step.hold .dot { border-color:var(--warn); background:var(--warn-quiet); }
.parse-step.fail { color:var(--crit); font-weight:600; }
.parse-step.fail .dot { border-color:var(--crit); background:var(--crit-quiet);
  color:var(--crit); }
@keyframes parse-pulse { 0%, 100% { opacity:1; } 50% { opacity:.25; } }
.parse-error {
  display:flex; align-items:center; justify-content:space-between; gap:var(--s5);
  flex-wrap:wrap; margin-top:var(--s5); padding:var(--s4) var(--s5);
  font-size:var(--t-sm); color:var(--crit); background:var(--crit-quiet);
  border:1px solid var(--crit-line); border-left:3px solid var(--crit);
  border-radius:var(--r-sm);
}
.parse-actions { display:flex; gap:var(--s3); margin-top:var(--s5); }

/* --- basket-compare card ------------------------------------------------- */
.basket-compare {
  padding:var(--s5); background:var(--surface); border:1px solid var(--line);
  border-left:3px solid var(--save,#166534); border-radius:var(--r-lg);
}
.basket-compare .headline {
  margin-bottom:var(--s4); font-size:var(--t-md); font-weight:700;
  color:var(--save,#166534);
}
.basket-row {
  display:grid; grid-template-columns:1fr auto auto auto; align-items:center;
  gap:var(--s4); padding:var(--s4) 0;
}
.basket-row + .basket-row { border-top:1px solid var(--line); }
.basket-row .match-count { font-size:var(--t-xs); color:var(--muted); white-space:nowrap; }
/* Like-for-like shop comparison (#643), shared by the receipt card (bc-) and
   /basket (bk-). Only complete shops carry a total; with none complete the
   fallback line names the closest shop and what it lacks; shops missing items
   sit in a native <details> (its disclosure marker needs summary's default
   display:list-item, so the summary is padded, never flexed). */
.bc-none, .bk-none { margin:0; font-weight:600; }
.bc-none-lacks, .bk-none-lacks, .bc-unsold, .bc-excluded {
  margin:var(--s3) 0 0; font-size:var(--t-sm); color:var(--muted); overflow-wrap:anywhere;
}
.bc-split {
  display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--s3);
  margin-top:var(--s4); padding-top:var(--s4); border-top:1px solid var(--line);
  font-size:var(--t-sm);
}
/* The split line's words shrink and wrap; its price keeps its own width. */
.split-tx { flex:1 1 0; min-width:0; }
.bc-partials, .bk-partials { border-top:1px solid var(--line); }
.bc-partials > summary, .bk-partials > summary {
  padding:var(--s4) 0; cursor:pointer; font-size:var(--t-sm); font-weight:600;
  color:var(--muted);
}
.basket-row.partial { grid-template-columns:1fr auto; }
.basket-row.partial .bc-lacks {
  grid-column:1 / -1; font-size:var(--t-xs); color:var(--muted); overflow-wrap:anywhere;
}

/* --- tier ratings: the Home nudge + the rating sheet (#355) --------------- */
/* The invitation is a strip in the page flow, NOT an overlay: it can be ignored
   forever and the dashboard behind it stays fully usable. The accent hairline on
   the left marks it as an offer to act, matching the deal/savings language. */
.tier-nudge {
  display:flex; align-items:center; gap:var(--s4); margin:var(--s4) 0 0;
  padding:var(--s4) var(--s5); background:var(--surface);
  border:1px solid var(--line); border-left:3px solid var(--accent);
  border-radius:var(--r-lg);
}
.tier-nudge .tn-ic { flex:none; color:var(--accent); display:inline-flex; }
.tier-nudge .tn-tx { flex:1 1 auto; min-width:0; font-size:var(--t-sm); }
.tier-nudge .tn-tx b { font-weight:700; }
.tier-nudge .tn-sub {
  display:block; margin-top:2px; font-size:var(--t-xs); color:var(--muted);
}
.tier-nudge .tn-go {
  flex:none; min-height:32px; padding:0 var(--s4); font:inherit;
  font-size:var(--t-sm); font-weight:600; cursor:pointer;
  color:var(--accent); background:var(--good-quiet);
  border:1px solid var(--good-line); border-radius:var(--r-sm);
}
.tier-nudge .tn-x {
  flex:none; display:inline-flex; padding:var(--s2); cursor:pointer;
  color:var(--faint); background:none; border:0; border-radius:var(--r-xs);
}
.tier-nudge .tn-x:hover { color:var(--ink); }

/* The sheet: bottom-anchored (thumb-reachable), never centred like a modal. */
.sheet {
  position:fixed; inset:0; z-index:40; display:flex;
  align-items:flex-end; justify-content:center;
  background:color-mix(in srgb, #000 45%, transparent);
}
.sheet[hidden] { display:none; }
.sheet-card {
  width:100%; max-width:760px; padding:var(--s5) var(--s5) var(--s7);
  background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-lg) var(--r-lg) 0 0; box-shadow:var(--shadow);
  animation:sheet-up .18s ease-out;
}
@keyframes sheet-up { from { transform:translateY(12%); } to { transform:none; } }
.sheet-grab {
  display:block; width:36px; height:4px; margin:0 auto var(--s5);
  background:var(--line-strong); border-radius:2px;
}
.sheet-title { margin:0; font-size:var(--t-md); font-weight:700; }
.sheet-sub {
  display:flex; align-items:center; gap:var(--s3); flex-wrap:wrap;
  margin:var(--s2) 0 var(--s5); font-size:var(--t-xs); color:var(--muted);
}
/* One row of five: the whole scale is visible at once, so ranking is a single
   tap rather than a scroll. The letter is the mark; the word underneath says
   what it means, so the scale needs no legend. */
.tier-grid { display:grid; grid-template-columns:repeat(5, 1fr); gap:var(--s3); }
.tier-btn {
  display:flex; flex-direction:column; align-items:center; gap:2px;
  min-height:64px; padding:var(--s3) 2px; font:inherit; cursor:pointer;
  color:var(--ink); background:var(--surface-2);
  border:1px solid var(--line-strong); border-radius:var(--r-md);
}
.tier-btn:hover, .tier-btn:focus-visible {
  color:var(--accent); border-color:var(--accent); background:var(--good-quiet);
}
.tier-btn .tier-letter {
  font-family:var(--mono); font-size:var(--t-fig); font-weight:700; line-height:1;
}
.tier-btn .tier-word {
  font-size:9px; font-weight:600; letter-spacing:.02em; text-align:center;
  color:var(--muted); text-transform:uppercase;
}
.sheet-actions {
  display:flex; gap:var(--s3); margin-top:var(--s5);
}
.sheet-actions button {
  flex:1 1 0; min-height:var(--row); font:inherit; font-size:var(--t-sm);
  cursor:pointer; color:var(--muted); background:none;
  border:1px solid var(--line); border-radius:var(--r-md);
}
.sheet-actions button:hover { color:var(--ink); border-color:var(--line-strong); }

@media (prefers-reduced-motion:reduce) {
  *, *::before, *::after {
    animation-duration:.001ms !important; animation-iteration-count:1 !important;
    transition:none !important;
  }
  .sk { background:var(--skeleton); }
}

/* --- paywall / upgrade ---------------------------------------------------- */
/* Trial & scan-counter banner ------------------------------------------------ */
.plan-banner {
  display:flex; align-items:center; gap:var(--s3);
  padding:var(--s3) var(--s4); margin-bottom:var(--s4);
  border-radius:var(--r-lg); border:1px solid;
  font-size:var(--t-sm); line-height:1.4;
}
.plan-banner.b-trial {
  background:var(--accent-bg); border-color:var(--accent-line); color:var(--accent);
}
.plan-banner.b-warn {
  background:var(--warn-bg,#fffbea); border-color:var(--warn-line,#fce588); color:var(--warn,#7a5900);
}
.plan-banner.b-crit {
  background:var(--flag-bg); border-color:var(--flag-line); color:var(--flag);
}
.plan-banner .pb-ic { flex-shrink:0; line-height:0; }
.plan-banner .pb-tx { flex:1; min-width:0; }
.plan-banner .pb-tx b { display:block; font-weight:var(--fw-semibold); }
.plan-banner a.pb-link, .plan-banner button.pb-link {
  flex-shrink:0; padding:0.2rem 0.65rem; border-radius:var(--r-pill);
  font-size:var(--t-xs); font-weight:var(--fw-semibold); cursor:pointer;
  text-decoration:none; border:1px solid currentColor; background:none;
  color:inherit; font:inherit; white-space:nowrap;
}
.plan-banner a.pb-link:hover, .plan-banner button.pb-link:hover { opacity:0.8; }

/* Scan-quota progress bar ---------------------------------------------------- */
.scan-quota {
  display:flex; align-items:center; gap:var(--s3);
  padding:var(--s3) var(--s4); margin-bottom:var(--s4);
  background:var(--surface-card); border:var(--border-hair); border-radius:var(--r-lg);
  font-size:var(--t-sm); color:var(--muted);
}
.scan-quota .sq-label { flex:1; min-width:0; line-height:1.3; }
.scan-quota .sq-label b { color:var(--ink); display:block; font-size:var(--t-xs); }
.scan-quota .sq-track {
  width:80px; height:6px; background:var(--bg-sunk); border-radius:var(--r-pill);
  overflow:hidden; flex-shrink:0;
}
.scan-quota .sq-fill {
  height:100%; border-radius:var(--r-pill); transition:width .3s var(--ease-out);
  background:var(--save);
}
.scan-quota .sq-fill.warn { background:var(--warn,#c07a00); }
.scan-quota .sq-fill.crit { background:var(--flag); }
.scan-quota .sq-fig {
  font-size:var(--t-xs); font-variant-numeric:tabular-nums;
  white-space:nowrap; color:var(--muted);
}

/* Paywall gate: locks a feature section with a centred upgrade card ---------- */
.paywall-gate {
  position:relative; border-radius:var(--r-lg);
  overflow:hidden; min-height:120px;
}
.paywall-gate .paywall-blur {
  filter:blur(4px); pointer-events:none; user-select:none;
  opacity:0.35; overflow:hidden; max-height:120px;
}
.paywall-overlay {
  position:absolute; inset:0; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:var(--s3);
  background:linear-gradient(180deg,transparent 0%,var(--surface-app) 55%);
  padding:var(--s6) var(--s4) var(--s4);
  text-align:center;
}
.paywall-overlay .po-lock { color:var(--muted); line-height:0; }
.paywall-overlay .po-head {
  font-size:var(--t-md); font-weight:var(--fw-semibold); color:var(--ink);
  margin:0; line-height:var(--lh-snug);
}
.paywall-overlay .po-sub { font-size:var(--t-sm); color:var(--muted); margin:0; }
.paywall-overlay a.po-cta {
  display:inline-block; padding:0.55rem 1.25rem;
  background:var(--accent); color:#fff;
  border-radius:var(--r-md); font-weight:var(--fw-semibold);
  font-size:var(--t-sm); text-decoration:none;
  transition:background var(--dur-fast);
}
.paywall-overlay a.po-cta:hover { background:var(--accent-strong); }

/* Upgrade page --------------------------------------------------------------- */
.upgrade-hero {
  text-align:center; padding:var(--s6) var(--s4) var(--s4); margin-bottom:var(--s2);
}
.upgrade-hero .uh-tag {
  display:inline-block; padding:0.2rem 0.7rem;
  background:var(--save-bg); color:var(--save); border:1px solid var(--save-line);
  border-radius:var(--r-pill); font-size:var(--t-xs); font-weight:var(--fw-semibold);
  margin-bottom:var(--s3);
}
.upgrade-hero h1 { font-size:var(--t-xl); font-weight:700; margin:0 0 var(--s2); color:var(--ink); }
.upgrade-hero p  { font-size:var(--t-sm); color:var(--muted); margin:0; }

.price-toggle {
  display:flex; background:var(--bg-sunk); border-radius:var(--r-pill);
  padding:3px; gap:2px; margin:0 auto var(--s5); width:fit-content;
}
.price-toggle button {
  padding:0.3rem 1rem; border-radius:var(--r-pill); border:none; cursor:pointer;
  font:inherit; font-size:var(--t-sm); background:transparent; color:var(--muted);
  transition:background var(--dur-fast), color var(--dur-fast);
}
.price-toggle button.on {
  background:var(--surface-card); color:var(--ink); font-weight:var(--fw-semibold);
  box-shadow:var(--shadow-xs);
}

.price-card {
  background:var(--surface-card); border:var(--border-hair); border-radius:var(--r-xl);
  padding:var(--s5); margin-bottom:var(--s4);
}
.price-card.featured { border-color:var(--accent); }
.price-card .pc-head {
  display:flex; align-items:flex-start; justify-content:space-between; margin-bottom:var(--s4);
}
.price-card .pc-name { font-size:var(--t-lg); font-weight:700; color:var(--ink); }
.price-card .pc-badge {
  padding:0.15rem 0.55rem; background:var(--save-bg); color:var(--save);
  border:1px solid var(--save-line); border-radius:var(--r-pill);
  font-size:var(--t-xs); font-weight:var(--fw-semibold);
}
.price-card .pc-price {
  font-size:var(--t-3xl); font-weight:700; color:var(--ink); line-height:1;
  font-variant-numeric:tabular-nums; margin-bottom:var(--s1);
}
.price-card .pc-price sup { font-size:var(--t-lg); vertical-align:super; }
.price-card .pc-price .pc-per { font-size:var(--t-sm); font-weight:400; color:var(--muted); }
.price-card .pc-save { font-size:var(--t-xs); color:var(--save); margin-bottom:var(--s4); }
.price-card .pc-features { list-style:none; padding:0; margin:0 0 var(--s5); }
.price-card .pc-features li {
  display:flex; align-items:center; gap:var(--s2); padding:var(--s2) 0;
  font-size:var(--t-sm); color:var(--ink-2); border-top:var(--border-hair);
}
.price-card .pc-features li:first-child { border-top:none; }
.price-card .pc-features li .f-ic { color:var(--save); line-height:0; flex-shrink:0; }
.price-card a.pc-cta, .price-card button.pc-cta {
  display:block; width:100%; padding:0.75rem; text-align:center;
  border-radius:var(--r-md); font:inherit; font-weight:var(--fw-semibold);
  font-size:var(--t-base); cursor:pointer; text-decoration:none;
  transition:background var(--dur-fast), color var(--dur-fast);
}
.price-card a.pc-cta.primary, .price-card button.pc-cta.primary {
  background:var(--accent); color:#fff; border:none;
}
.price-card a.pc-cta.primary:hover, .price-card button.pc-cta.primary:hover {
  background:var(--accent-strong);
}
.price-card a.pc-cta.outline, .price-card button.pc-cta.outline {
  background:none; color:var(--muted); border:1px solid var(--line);
}
.price-card .pc-trial { text-align:center; font-size:var(--t-xs); color:var(--muted); margin-top:var(--s3); }

.upgrade-note { text-align:center; font-size:var(--t-xs); color:var(--muted); margin:var(--s4) 0; }

/* One item at every store (#719, #752): the panel a tapped line opens, on /basket,
   /list and a receipt line. The renderer is ds.js's renderCompare; its row parts
   are styled here, scoped to the panel, so no page has to carry them. */
.cmp-tap { cursor:pointer; }
.bk-cmp { margin:0 0 var(--s3); padding:var(--s2) var(--s3); border-radius:var(--r-sm, 8px);
  background:var(--surface-sunk); }
.kv-list li.bk-cmp { display:block; min-height:0; border-bottom:0; }
.rows > .bk-cmp { margin:0; border-radius:0; border-top:1px solid var(--line); }
.rows > .bk-cmp + .row { border-top:1px solid var(--line); }
.bk-cmp-row { display:flex; align-items:center; gap:var(--s3); padding:var(--s2) 0;
  border-top:1px solid var(--line); }
.bk-cmp-row:first-child { border-top:0; }
.cmp-main { flex:1; min-width:0; }
.cmp-q { display:flex; align-items:center; gap:var(--s3); font-weight:600; }
.cmp-prod { font-size:var(--t-sm); color:var(--muted); overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.bk-cmp-chosen { font-weight:600; }
.bk-cmp-miss .cmp-prod { font-style:italic; }
.bk-cmp-sub { margin:var(--s3) 0 0; font-size:var(--t-xs); color:var(--muted); }
.bk-cmp-away { margin:var(--s2) 0; }
