/* Base heritee de Beuchies : budget, tuiles produits, rayons, feuille recette. */

  :root{--bg:#f4f5f7;--card:#fff;--ink:#1f2430;--muted:#8a90a0;--green:#2ec26b;--green-d:#25a659;--lidl:#0050aa;--migros:#ff7a00;--red:#e23b3b;--shadow:0 2px 10px rgba(30,40,60,.06);--r:18px;
    /* les gris, sortis du dur le 23.08 pour que le mode sombre existe */
    --soft:#f0f2f6;--soft2:#eef0f4;--bord:#e6e2d8;--bord2:#dfe3ea;--ligne:#f4f2ec;--ligne2:#eceae4;
    --nav:#fff;--sheet:#fff;--doux:#fff8f1;--gomme:#faf8f3}

  /* ------------------------------------------------------------------
     MODE SOMBRE — demandé le 23.08. Trois règles tenues :
       · on ne passe pas le fond en noir pur : #15181d, moins agressif la nuit ;
       · les couleurs des membres et des enseignes ne changent PAS (elles sont
         identifiantes, les tordre casserait la lecture d'un coup d'œil) ;
       · les fonds pastel (promo, alerte, à-jour) deviennent des teintes sourdes
         de la même famille, jamais du blanc cassé qui éblouirait.
     ------------------------------------------------------------------ */
  html[data-theme=sombre]{
    --bg:#15181d;--card:#1e232b;--ink:#e8eaee;--muted:#98a0ae;
    --soft:#2a313b;--soft2:#232931;--bord:#333b46;--bord2:#3a434f;
    --ligne:#282f38;--ligne2:#2f3742;--nav:#1a1f26;--sheet:#1e232b;
    --doux:#2b241d;--gomme:#232019;
    --shadow:0 2px 10px rgba(0,0,0,.35);
    --green:#3ed283;--green-d:#38c076;--red:#ef6a6a}
  html[data-theme=sombre] .strat{border-color:#4a3a26}
  html[data-theme=sombre] .tile .var,html[data-theme=sombre] .sel{background:#3a2f22}
  html[data-theme=sombre] .hint{background:#1d2b3d}
  html[data-theme=sombre] .stver.go,html[data-theme=sombre] .addbig.on{background:#1e3328}
  html[data-theme=sombre] .vchip.on{background:#1e3328}
  html[data-theme=sombre] .tile.mini.sel-on{background:#1e2a24}
  html[data-theme=sombre] .modal{background:rgba(0,0,0,.6)}
  html[data-theme=sombre] .addbig.no{background:var(--card);border-color:#5c3535}
  html[data-theme=sombre] .day .sw.no{background:#3a2424}
  *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
  body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:var(--bg);color:var(--ink);padding-bottom:78px}
  header{padding:16px 18px 4px}
  h1{font-size:22px;margin:0;font-weight:800;letter-spacing:-.4px}
  .sub{color:var(--muted);font-size:13px;margin-top:2px}
  .budget{margin:12px 18px;background:var(--card);border-radius:var(--r);padding:14px 16px;box-shadow:var(--shadow)}
  .budget .row{display:flex;justify-content:space-between;align-items:baseline}
  .budget .big{font-size:24px;font-weight:800}
  .budget .big.over{color:var(--red)}
  .budget .cap{color:var(--muted);font-size:13px}
  .bar{height:10px;background:var(--soft2);border-radius:99px;margin-top:10px;overflow:hidden}
  .bar>i{display:block;height:100%;background:linear-gradient(90deg,var(--green),var(--green-d));border-radius:99px;transition:width .25s}
  .bar>i.over{background:linear-gradient(90deg,#f0a33b,var(--red))}
  .save{color:var(--green-d);font-weight:700;font-size:13px;margin-top:8px}
  .save.over{color:var(--red)}
  section{margin:16px 0}
  .h{font-size:13px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.6px;margin:0 18px 10px;display:flex;align-items:center;gap:8px}
  .h .n{background:var(--soft2);color:var(--muted);border-radius:99px;padding:1px 8px;font-size:12px}
  .pill{font-size:11px;font-weight:800;color:#fff;border-radius:99px;padding:2px 7px}
  .btn{display:block;width:calc(100% - 36px);margin:14px 18px;padding:14px;border:none;border-radius:14px;background:var(--green-d);color:#fff;font-size:15px;font-weight:800;box-shadow:var(--shadow)}
  .btn:active{transform:scale(.99)}
  .btn.ghost{background:var(--card);color:var(--green-d);border:1.5px solid #d8ede0}
  .days{display:flex;flex-direction:column;gap:10px;margin:0 18px}
  .day{background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);padding:12px 14px;display:flex;align-items:center;gap:12px}
  .day .d{font-size:11px;font-weight:800;color:var(--green-d);text-transform:uppercase;min-width:34px}
  .day .m{font-size:15px;font-weight:700;line-height:1.2;flex:1}
  .day .sw{background:var(--soft);border:none;border-radius:10px;width:34px;height:34px;font-size:15px;cursor:pointer}
  .day .add{background:var(--soft);border:none;border-radius:10px;width:34px;height:34px;font-size:17px;font-weight:800;color:var(--green-d);cursor:pointer}
  .day .add.on{background:var(--green);color:#fff}
  .day.chosen{outline:2px solid var(--green)}
  .addbig{display:block;width:calc(100% - 36px);margin:6px 18px 12px;padding:12px;border:none;border-radius:12px;background:var(--green-d);color:#fff;font-size:14px;font-weight:800;cursor:pointer}
  .addbig.on{background:#e7f7ee;color:var(--green-d);border:1.5px solid var(--green)}
  .rayon{margin:0 18px}
  .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:10px}
  .tile{background:var(--card);border-radius:16px;box-shadow:var(--shadow);padding:12px 8px 8px;text-align:center;position:relative}
  .tile.done{opacity:.45}
  .tile.done .emo{filter:grayscale(1)}
  .tile.have{opacity:.5}
  .tile.have .emo{filter:grayscale(1)}
  .haveb{font-size:10px;font-weight:800;color:var(--muted);background:var(--soft);border-radius:99px;padding:4px 8px;margin-top:7px;display:inline-block;cursor:pointer}
  .tile.have .haveb{color:#fff;background:var(--muted)}
  .tile .top{cursor:pointer}
  .tile .emo{font-size:28px;line-height:1}
  .tile .nm{font-size:12px;font-weight:700;margin-top:6px;line-height:1.15}
  .tile .var{font-size:10.5px;color:var(--migros);font-weight:700;margin-top:4px;background:#fff3e6;border-radius:99px;padding:2px 7px;display:inline-block;cursor:pointer}
  .tile .pr{font-size:11.5px;color:var(--muted);margin-top:5px;font-weight:600}
  .tile .promo{position:absolute;top:6px;right:6px;background:var(--red);color:#fff;font-size:9px;font-weight:800;border-radius:99px;padding:2px 5px}
  .tile .store{position:absolute;top:6px;left:6px;font-size:9px;font-weight:800;color:#fff;border-radius:99px;padding:2px 5px}
  .check{position:absolute;top:6px;left:6px;width:18px;height:18px;border-radius:99px;background:var(--green);color:#fff;font-size:12px;display:none;align-items:center;justify-content:center;font-weight:800}
  .tile.done .check{display:flex}.tile.done .store{display:none}
  .shop{position:absolute;top:6px;left:6px;width:20px;height:20px;border-radius:99px;font-size:11px;font-weight:800;display:flex;align-items:center;justify-content:center;z-index:2}
  .shop.mig{background:var(--migros);color:#fff}
  .shop.lidl{background:var(--lidl);color:#ffe600}
  .tile.done .shop{display:none}
  .pr .pnow{color:var(--ink);font-weight:800}
  .pr .pold{color:var(--muted);margin-left:2px;font-weight:600;font-size:10.5px}
  .hint{font-size:10px;font-weight:700;color:var(--lidl);background:#eef4fb;border-radius:99px;padding:2px 6px;margin-top:5px;display:inline-block;cursor:pointer}
  .hint.on{color:#fff;background:var(--lidl)}
  .emo svg{vertical-align:middle}
  .emo.sm svg,.emo.sm{font-size:22px}
  .sel{margin-top:5px;font-size:11px;font-weight:700;color:var(--migros);background:#fff3e6;border:none;border-radius:99px;padding:3px 6px;max-width:100%;cursor:pointer}
  .var.solo{color:var(--muted);background:var(--soft)}
  .tile.mini{padding:12px 6px 10px;cursor:pointer}
  .tile.mini.sel-on{outline:2px solid var(--green);background:#f2fbf6}
  .badd{position:absolute;top:6px;right:6px;width:20px;height:20px;border-radius:99px;background:var(--green);color:#fff;font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center}
  .tile.mini:not(.sel-on) .badd{background:var(--bord2);color:#5b6172}
  .rm{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:99px;background:#e23b3b;color:#fff;font-size:11px;font-weight:800;display:flex;align-items:center;justify-content:center;cursor:pointer}
  .fnote{font-size:11px;font-weight:700;margin-top:3px}
  .fnote.green{color:var(--green-d)} .fnote.orange{color:#e08a2b} .fnote.red{color:#e23b3b}
  .day .emo{min-width:30px;text-align:center}
  .qty{display:flex;align-items:center;justify-content:center;margin-top:8px}
  .qty button{width:26px;height:26px;border:none;border-radius:8px;background:var(--soft2);font-size:16px;font-weight:800;cursor:pointer}
  .qty .q{min-width:34px;font-size:13px;font-weight:800}
  nav{position:fixed;bottom:0;left:0;right:0;height:64px;background:var(--nav);border-top:1px solid var(--ligne);display:flex;justify-content:space-around;align-items:center;padding-bottom:env(safe-area-inset-bottom)}
  nav button{background:none;border:none;font-size:11px;color:var(--muted);display:flex;flex-direction:column;align-items:center;gap:3px;font-weight:600}
  nav button .i{font-size:20px}
  nav button.on{color:var(--green-d)}
  .view{display:none}.view.on{display:block}
  .cmp{margin:0 18px 4px;background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);padding:12px 14px}
  .cmptitle{font-size:11px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.6px;margin-bottom:8px}
  .cmprow{display:flex;justify-content:space-between;align-items:baseline;font-size:14px;font-weight:700;margin:3px 0}
  .cmprow.best{color:var(--lidl)}
  .cmpsave{margin-top:6px;font-size:13px;font-weight:800;color:var(--green-d)}
  .strat{margin:12px 18px 4px;background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);padding:12px 14px;border:1.5px solid #ffe0c2}
  .stmaj{font-weight:700;color:var(--migros);text-transform:none;letter-spacing:0;font-size:10px;background:#fff3e6;border-radius:99px;padding:1px 7px;margin-left:6px}
  /* Promos qui ont cessé d'être rafraîchies. Le Worker va les rechercher tout
     seul dès qu'elles passent six heures : voir cette pastille rouge veut dire
     que Migros ne répond plus, pas que quelque chose a été oublié. */
  .stmaj.vieux{color:#8a1c1c;background:#ffe3e3}
  .strow{display:flex;justify-content:space-between;align-items:baseline;font-size:14px;font-weight:700;margin:3px 0}
  .strow.best{color:var(--migros)}
  .stsave{margin-top:4px;font-size:12.5px;font-weight:800;color:var(--green-d)}
  .stgrabs{margin-top:8px;display:flex;flex-direction:column;gap:6px}
  .stgrab{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:12.5px;background:var(--doux);border-radius:10px;padding:6px 9px}
  .stgrab .stg-pr{white-space:nowrap;font-weight:800}
  .stgrab .stg-pr s{color:var(--muted);font-weight:600;margin-left:2px}
  .stgrab .stg-pr em{color:var(--red);font-style:normal;font-weight:800;margin-left:3px}
  .stnone{margin-top:8px;font-size:12.5px;color:var(--muted);font-weight:600}
  .stver{margin-top:9px;font-size:12.5px;font-weight:700;line-height:1.35;color:var(--ink);background:var(--soft);border-radius:10px;padding:8px 10px}
  .stver.go{background:#e7f7ee;color:var(--green-d)}
  .stver b{color:var(--ink)}
  .stlabel{display:block;font-size:10.5px;color:var(--muted);font-weight:600;font-style:normal;margin-top:1px}
  .promonote{font-size:9.5px;color:var(--migros);font-weight:700;line-height:1.15;margin-top:3px;padding:0 3px}
  .mgl{margin:0 18px 8px;display:flex;flex-direction:column;gap:6px}
  .mglrow{display:flex;justify-content:space-between;align-items:center;gap:8px;background:var(--card);border-radius:12px;box-shadow:var(--shadow);padding:11px 13px;text-decoration:none;color:var(--ink);font-size:14px;font-weight:700}
  .mglrow:active{transform:scale(.99)}
  .mglrow .mglpromo{display:block;font-size:10.5px;color:var(--migros);font-weight:700;font-style:normal;margin-top:2px}
  .mglrow .mglgo{color:var(--migros);font-weight:800;font-size:12.5px;white-space:nowrap}
  .cmpbtns{display:flex;gap:8px;margin-top:8px}
  .cmpbtns button{flex:1;border:none;border-radius:10px;padding:8px;font-size:12px;font-weight:800;background:var(--lidl);color:#fff;cursor:pointer}
  .cmpbtns button.g{background:var(--soft);color:var(--ink)}
  .vibes{display:flex;flex-wrap:wrap;gap:8px;margin:0 18px}
  .vchip{font-size:12px;font-weight:700;color:var(--ink);background:var(--card);border:1.5px solid #e3e6ec;border-radius:99px;padding:7px 12px;cursor:pointer}
  .vchip.on{background:#e7f7ee;border-color:var(--green);color:var(--green-d)}
  .day .m{cursor:pointer}
  .day .m .mo{color:var(--muted);font-weight:800}
  .promotag{font-size:10px;font-weight:800;color:#fff;background:var(--red);border-radius:99px;padding:1px 6px;vertical-align:middle}
  .modal{position:fixed;inset:0;background:rgba(20,28,40,.45);display:none;align-items:flex-end;z-index:50}
  .modal.on{display:flex}
  .sheet{background:var(--sheet);width:100%;max-height:86vh;overflow:auto;border-radius:22px 22px 0 0;padding:16px 18px 40px}
  .shead{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}
  .stitle{font-size:19px;font-weight:800;line-height:1.15;flex:1;padding-right:10px}
  .sx{background:var(--soft);border:none;border-radius:99px;width:34px;height:34px;font-size:15px;font-weight:800;cursor:pointer}
  .smeta{margin:0 18px 8px;font-size:13px;font-weight:700;color:var(--muted)}
  .svibes{display:flex;flex-wrap:wrap;gap:6px;margin:0 18px 4px}
  .ilist{margin:6px 18px 4px;padding-left:20px}.ilist li{font-size:14px;margin:4px 0;line-height:1.3}
  .slist{margin:6px 18px 4px;padding-left:22px}.slist li{font-size:14px;margin:8px 0;line-height:1.4}

  /* ------------------------------------------------------------------
     MODE COURSE — bloc 6. Plein écran, un article à la fois.
     Tout est dimensionné pour être lu d'un mètre, à bout de bras, avec un
     chariot dans l'autre main : nom en 30 px, bouton de 20 px de haut,
     rien d'autre à l'écran. Le seul geste sûr est le geste principal.
     ------------------------------------------------------------------ */
  .cmode{position:fixed;inset:0;background:var(--bg);z-index:70;display:none}
  .cmode.on{display:block}
  .cmwrap{height:100%;display:flex;flex-direction:column;padding:calc(env(safe-area-inset-top) + 12px) 18px calc(env(safe-area-inset-bottom) + 18px)}
  .cmtop{display:flex;align-items:center;gap:12px;min-height:38px;flex:none}
  .cmx{background:var(--soft);border:none;border-radius:99px;width:38px;height:38px;font-size:16px;font-weight:800;color:var(--ink);cursor:pointer;flex:none}
  .cmbar{flex:1;height:8px;background:var(--soft2);border-radius:99px;overflow:hidden}
  .cmbar>i{display:block;height:100%;background:linear-gradient(90deg,var(--green),var(--green-d));border-radius:99px;transition:width .25s}
  .cmpas{font-size:13px;font-weight:800;color:var(--muted);flex:none}
  .cmcarte{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:7px;overflow:auto}
  .cmrayon{font-size:12px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.8px}
  .cmemo{font-size:88px;line-height:1}
  .cmemo svg{width:104px;height:104px}
  .cmnom{font-size:30px;font-weight:800;line-height:1.1;letter-spacing:-.5px}
  .cmvar{font-size:15px;font-weight:700;color:var(--muted)}
  .cmqty{font-size:22px;font-weight:800;color:var(--green-d)}
  .cmprix{display:flex;align-items:center;gap:8px;font-size:21px;font-weight:800;margin-top:2px}
  .cmprix s{color:var(--muted);font-weight:700;font-size:16px}
  .cmprix em{font-style:normal;color:#fff;background:var(--red);border-radius:99px;padding:2px 9px;font-size:13px}
  .cmshopb{font-size:12px;font-weight:800;color:#fff;border-radius:99px;padding:3px 10px}
  .cmshopb.mig{background:var(--migros)}
  .cmshopb.lidl{background:var(--lidl)}
  .cmpromo{font-size:14px;font-weight:700;background:var(--doux);border-radius:12px;padding:8px 13px;max-width:92%}
  .cmlien{margin-top:4px;color:var(--migros);font-weight:800;font-size:14px;text-decoration:none}
  .cmactions{flex:none}
  .cmgo{display:block;width:100%;border:none;border-radius:16px;padding:20px;font-size:19px;font-weight:800;background:var(--green-d);color:#fff;box-shadow:var(--shadow);cursor:pointer}
  .cmgo:active{transform:scale(.99)}
  .cmgo.off{background:var(--soft);color:var(--muted);box-shadow:none}
  .cmsec{display:flex;gap:10px;margin-top:10px}
  .cmsecb{flex:1;background:var(--card);border:1.5px solid var(--bord2);border-radius:14px;padding:13px;font-size:14px;font-weight:800;color:var(--ink);cursor:pointer}
  .cmsecb[disabled]{opacity:.35}
  .cmsecb.large{width:100%;margin-top:10px;flex:none}
  .cmchoix{flex:1;display:flex;flex-direction:column;justify-content:center;gap:12px}
  .cmq{font-size:26px;font-weight:800;text-align:center;margin-bottom:6px}
  .cmshop{display:flex;flex-direction:column;align-items:flex-start;gap:3px;border:none;border-radius:18px;padding:18px 20px;color:#fff;text-align:left;cursor:pointer;box-shadow:var(--shadow);width:100%}
  .cmshop.mig{background:var(--migros)}
  .cmshop.lidl{background:var(--lidl)}
  .cmshop.tout{background:var(--card);color:var(--ink);border:1.5px solid var(--bord2)}
  .cmsnom{font-size:20px;font-weight:800}
  .cmsn{font-size:13px;font-weight:700;opacity:.92}
  .cmnote{font-size:13px;color:var(--muted);text-align:center;line-height:1.45;margin-top:10px}
  .cmfin{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:10px}
  .cmfemo{font-size:60px;line-height:1}
  .cmftitre{font-size:26px;font-weight:800}
  .cmfsous{font-size:16px;font-weight:700;color:var(--muted)}
  .cmflist{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:2px 0 10px}
  .cmflist span{background:var(--soft);border-radius:99px;padding:7px 13px;font-size:14px;font-weight:700}
  .cmfin .cmgo{width:100%}
  .cmreprise{background:var(--green-d);color:#fff}
