/* ===== Fuentes self-hosted (Fontsource, subset latin) — V2.68.0: reemplaza Google Fonts CDN ===== */
@font-face{font-family:'Archivo';font-style:normal;font-weight:400;font-display:swap;src:url('fonts/archivo-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:600;font-display:swap;src:url('fonts/archivo-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:800;font-display:swap;src:url('fonts/archivo-latin-800-normal.woff2') format('woff2')}
@font-face{font-family:'Archivo';font-style:normal;font-weight:900;font-display:swap;src:url('fonts/archivo-latin-900-normal.woff2') format('woff2')}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url('fonts/hanken-grotesk-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url('fonts/hanken-grotesk-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url('fonts/hanken-grotesk-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Hanken Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url('fonts/hanken-grotesk-latin-700-normal.woff2') format('woff2')}
@font-face{font-family:'Space Mono';font-style:normal;font-weight:400;font-display:swap;src:url('fonts/space-mono-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Space Mono';font-style:normal;font-weight:700;font-display:swap;src:url('fonts/space-mono-latin-700-normal.woff2') format('woff2')}

:root{
  --bg:#0c0d0f;--surface:#16181d;--surface2:#1d2026;--line:#272b32;
  --txt:#eef0f3;--muted:#8b919c;--faint:#5a606b;
  --acc:#c8f54e;--kcal:#c8f54e;--prot:#5ad1ff;--carb:#ffb454;--fat:#ff7a8a;
  --ok:#5ad17a;--warn:#ffb454;--bad:#ff6b7a;--blue:#5ad1ff;
  --r:16px;--r-md:12px;--r-sm:10px;--r-xs:8px;--navbg:rgba(12,13,15,.93);
}
body.light{
  --bg:#f2f3f5;--surface:#ffffff;--surface2:#e9ebee;--line:#d9dce1;
  --txt:#191c21;--muted:#5b6270;--faint:#8a919d;
  --acc:#7fae00;--kcal:#7fae00;--prot:#0b87c9;--carb:#c96f08;--fat:#df4560;
  --ok:#1f9e50;--warn:#c96f08;--bad:#d93248;--blue:#0b87c9;--navbg:rgba(242,243,245,.93);
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;margin:0;padding:0;touch-action:manipulation;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}
/* V3.21.3: uso mobile — el doble tap ya no hace zoom (touch-action:manipulation arriba, no toca
   el pinch-zoom ni el scroll de .sheet .panel que declara su propio touch-action más específico).
   V3.21.2 solo sacaba la selección en <button>/[onclick] (pensando "botones"), pero medido en el
   dispositivo real el long-press selecciona CUALQUIER texto de la app — ej. el número del Centro
   Nutricional, que es un <span> sin onclick, puro display. La regla ahora es global (user-select:none
   + -webkit-touch-callout:none en *) y se reabre selección/callout SOLO donde hace falta: inputs,
   textarea y select siguen editables/seleccionables como cualquier campo nativo (por spec, user-select
   ya no aplica al VALOR de un input/textarea aunque el ancestro diga none — la línea de abajo es
   redundante para eso pero necesaria para el touch-callout, que sí hereda). */
input,textarea,select{-webkit-user-select:text;user-select:text;-webkit-touch-callout:default}
@keyframes _spin{to{transform:rotate(360deg)}}
.centro-sec-lbl{font-size:11px;text-transform:uppercase;letter-spacing:.09em;color:var(--faint);font-weight:700;margin:15px 0 7px}
#centroBody{max-height:5000px;overflow:hidden;transition:max-height .32s ease,opacity .25s ease;opacity:1}
#centroBody.collapsed{max-height:0;opacity:0;margin:0}
/* V3.6.12 probó -webkit-font-smoothing + transform:translateZ(0) acá para el blur de webfonts.
   REVERTIDO en V3.6.13: el transform en body NO arregló el blur (Matt lo confirmó — sigue
   igual) y ROMPIÓ algo real: un transform en cualquier ancestro crea un nuevo "containing
   block" para sus hijos position:fixed — .stickybar dejó de fijarse al viewport y pasó a
   comportarse como position:absolute dentro de body, por eso "no aparece más el header al
   scrollear". Gotcha de CSS conocido, aplicado sin pensar en el efecto sobre .stickybar que
   depende de position:fixed relativo al viewport. Queda SOLO font-smoothing (no afecta layout,
   ningún transform), sin confirmar todavía si eso alcanza — ver §18.128. */
body{background:radial-gradient(900px 500px at 100% -10%,rgba(200,245,78,.06),transparent 60%),radial-gradient(700px 500px at -10% 100%,rgba(90,209,255,.05),transparent 55%),var(--bg);color:var(--txt);font-family:'Hanken Grotesk',sans-serif;min-height:100vh;padding-top:env(safe-area-inset-top);padding-bottom:132px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
/* V3.7.2 (§18.136): barra de scroll oculta en TODA la app, sin perder el scroll. En el WebView
   quedaba una barra gris persistente pegada al borde derecho, encima del contenido. Es el mismo
   patrón que ya usaban los carruseles internos (.stickybar .mchips, #centroDetailHint) — acá se
   generaliza. El scroll sigue funcionando igual por gesto, rueda y teclado: se oculta el indicador,
   no el mecanismo. `scrollbar-width` cubre Firefox y `::-webkit-scrollbar` el resto; el selector
   universal es necesario porque `scrollbar-width` no hereda a los contenedores con overflow propio
   (.results, .sheet .panel, las tablas de Reportes). */
*{scrollbar-width:none}
::-webkit-scrollbar{width:0;height:0;display:none}
.num{font-family:'Space Mono',monospace}
h1,h2,h3{font-family:'Archivo',sans-serif;letter-spacing:-.02em}
.app{max-width:520px;margin:0 auto;padding:16px 15px 0}
header{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:14px}
header .brand{font-family:'Archivo';font-weight:900;font-size:23px;letter-spacing:-.04em}
header .brand b{color:var(--acc)}
/* margin-top:0 explícito: los títulos de vista pasaron de <div> a <h1> (a11y V2.85.0) y el
   margen superior del user-agent para h1 desplazaba el layout. El resto del estilo no cambia. */
.scr-title{font-family:'Archivo';font-weight:900;font-size:25px;letter-spacing:-.03em;margin:0 0 3px}
/* Visible solo para lectores de pantalla: da un h1 a la vista Hoy, que no tiene título visible.
   Sin esto la app arranca sin ningún encabezado y no se puede navegar por headings. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.scr-sub{color:var(--muted);font-size:13px;margin-bottom:15px}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:15px;margin-bottom:13px}
.sec-title{font-family:'Archivo';font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:18px 2px 9px}
.btn{background:var(--acc);color:#0c0d0f;border:0;border-radius:var(--r-md);padding:13px;width:100%;font-family:'Archivo';font-weight:800;font-size:14px;letter-spacing:.02em;cursor:pointer}
.btn:active{transform:scale(.99)}.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--txt)}
.btn.sm{padding:9px 13px;width:auto;font-size:12px;border-radius:var(--r-sm)}
.btn:disabled{opacity:.45}
.row2{display:flex;gap:9px}.row2>*{flex:1;min-width:0}
.inp{background:var(--surface2);border:1px solid var(--line);color:var(--txt);border-radius:var(--r-sm);padding:12px;font-size:16px;font-family:inherit;width:100%;outline:none}
.inp:focus{border-color:var(--acc)}
select.inp{appearance:none}
.inp[type=date]{-webkit-appearance:none;appearance:none;min-width:0}
.lbl{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:13px 0 5px;display:block}
.macg{display:grid;grid-template-columns:repeat(5,1fr);gap:6px}
.macg .h{font-size:11px;color:var(--muted);text-align:center;text-transform:uppercase;margin-bottom:3px}
.macg .inp{padding:9px 2px;text-align:center;font-family:'Space Mono';font-size:16px}
.macg4{display:grid;grid-template-columns:repeat(4,1fr);gap:7px}
.macg4 .h{font-size:11px;color:var(--muted);text-align:center;text-transform:uppercase;margin-bottom:3px}
.macg4 .inp{padding:9px 2px;text-align:center;font-family:'Space Mono';font-size:16px}
/* datenav */
.datenav{display:flex;align-items:center;justify-content:space-between;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 10px;margin-bottom:10px}
.dn-arrow{background:var(--surface2);border:1px solid var(--line);color:var(--txt);width:38px;height:38px;border-radius:var(--r-xs);font-size:18px;cursor:pointer;font-family:'Archivo'}
.dn-arrow:disabled{opacity:.3}
.dn-center{text-align:center}.dn-day{font-family:'Archivo';font-weight:800;font-size:15px}
.dn-status{font-family:'Space Mono';font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-top:2px}
.dn-status.open{color:var(--warn)}.dn-status.closed{color:var(--ok)}
.dn-today{font-family:'Space Mono';font-size:11px;color:var(--acc);cursor:pointer;text-align:center;margin-bottom:10px}
.daytype{display:flex;gap:8px;margin-bottom:14px}
.daytype button{flex:1;border:1px solid var(--line);background:var(--surface);color:var(--muted);padding:11px;border-radius:var(--r-md);font-family:'Archivo';font-weight:800;font-size:12px;letter-spacing:.02em;text-transform:uppercase;cursor:pointer}
.daytype button.on{background:var(--acc);color:#0c0d0f;border-color:var(--acc)}
.daytype button.on.rest{background:var(--blue);border-color:var(--blue)}
/* totals */
.kcalrow{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:13px}
.kcalrow .big{font-family:'Archivo';font-weight:900;font-size:40px;line-height:.9}
.kcalrow .big span{font-size:14px;color:var(--muted);font-weight:600}
.kcalrow .tgt{text-align:right;font-family:'Space Mono';font-size:11px;color:var(--muted);line-height:1.6}
.bars{display:grid;gap:10px}
.bar .lab{display:flex;justify-content:space-between;margin-bottom:5px}
.bar .lab .name{color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em;font-size:11px}
.bar .lab .val{font-family:'Space Mono';font-size:12px}
.track{height:7px;background:var(--surface2);border-radius:99px;overflow:hidden}
.fill{height:100%;border-radius:99px;transition:width .35s}
.fill.over{background-image:repeating-linear-gradient(45deg,transparent,transparent 4px,rgba(0,0,0,.25) 4px,rgba(0,0,0,.25) 8px)}
.sodium{display:flex;align-items:center;justify-content:space-between;margin-top:12px;padding-top:11px;border-top:1px dashed var(--line);font-size:12px}
.sodium.warn .v{color:var(--bad)}
.fibra{display:flex;align-items:center;justify-content:space-between;margin-top:10px;padding-top:11px;border-top:1px dashed var(--line);font-size:12px}
.fibra.ok .v{color:var(--ok)}
.fibra.low .v{color:var(--warn)}
.microrow{display:flex;gap:7px;margin-top:12px}
.stepRow{display:flex;align-items:stretch;gap:8px}
.stepRow .inp{flex:1;min-width:0}
.stepBtn{width:50px;flex:0 0 auto;background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-sm);color:var(--txt);font-size:23px;font-weight:700;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1;-webkit-tap-highlight-color:transparent}
.stepBtn:active{background:var(--line)}
.stepBtn.sm{width:100%;font-size:15px;padding:4px 0;border-radius:var(--r-xs)}
#fabComida{position:fixed;right:18px;bottom:calc(78px + env(safe-area-inset-bottom));z-index:49;width:54px;height:54px;background:var(--acc);color:#0a0a0b;border:none;border-radius:50%;font-size:30px;font-weight:700;line-height:1;display:none;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.45);-webkit-tap-highlight-color:transparent;padding:0}
#fabComida.on{display:flex}
#fabComida:active{transform:scale(.94)}
.microrow .sodium,.microrow .fibra{flex:1;min-width:0;margin-top:0;padding:7px 9px;border-top:none;background:var(--surface2);border-radius:var(--r-xs);flex-wrap:wrap}
#centroDetail{max-height:3000px;overflow:hidden;transition:max-height .3s ease,opacity .22s ease;opacity:1}
#centroDetail.collapsed{max-height:0;opacity:0}
/* meals */
.meal{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);margin-bottom:11px;overflow:hidden}
.meal .mhead{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;cursor:pointer}
.meal .mname{font-family:'Archivo';font-weight:800;font-size:14px}
.meal .pchip{font-family:'Space Mono';font-size:11px;padding:2px 7px;border-radius:99px;background:var(--surface2);margin-left:8px}
.pchip.ok{color:var(--ok)}.pchip.warn{color:var(--warn)}
.meal .mmeta{font-family:'Space Mono';font-size:11px;color:var(--muted)}
.meal .mh-l{display:flex;flex-direction:column;gap:3px;min-width:0}
.meal .mmacros{font-family:'Space Mono';font-size:11px;color:var(--muted)}
.meal .mmacros .kc{color:var(--acc)}
.meal .mmacros .ok{color:var(--ok)}.meal .mmacros .warn{color:var(--warn)}
.meal .mchev{color:var(--muted);font-size:18px;font-family:'Space Mono';flex-shrink:0;margin-left:8px}
.meal .mbody{border-top:1px solid var(--line);padding:4px 14px 12px}
.fi{display:flex;align-items:center;gap:8px;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.04)}
.fi:last-of-type{border-bottom:0}
.fi .info{flex:1;min-width:0}
.fi .fn{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fi .fs{font-family:'Space Mono';font-size:11px;color:var(--muted);margin-top:1px}
.fi .fk{font-family:'Archivo';font-weight:800;font-size:14px}.fi .fk span{font-size:11px;color:var(--muted)}
.fi .del{background:transparent;border:0;color:var(--faint);font-size:20px;cursor:pointer;padding:0 3px}
.fi .del:active{color:var(--bad)}
/* V3.4.0 · ítem cargado por el planificador, todavía sin confirmar */
.fi.plan{opacity:.62}
.planchip{font-size:11px;font-weight:700;color:var(--acc);background:rgba(200,245,78,.13);border-radius:6px;padding:1px 6px;margin-left:6px;vertical-align:middle}
.addrow{margin-top:8px;text-align:center;color:var(--acc);font-weight:700;font-size:12.5px;cursor:pointer;padding:7px;border:1px dashed var(--line);border-radius:var(--r-sm)}
.empty{text-align:center;color:var(--faint);padding:18px 10px;font-size:13px}
.lectura{background:linear-gradient(180deg,rgba(200,245,78,.07),transparent);border:1px solid var(--line);border-radius:var(--r);padding:15px;margin:14px 0}
.lectura h3{margin:0 0 9px;font-size:13px;text-transform:uppercase;letter-spacing:.06em;color:var(--acc)}
.lectura ul{margin:0;padding:0;list-style:none;display:grid;gap:7px}
.lectura li{font-size:13px;line-height:1.45;padding-left:18px;position:relative;color:#d6dae0}
.lectura li:before{content:'';position:absolute;left:3px;top:7px;width:6px;height:6px;border-radius:99px;background:var(--acc)}
.lectura li.warn:before{background:var(--warn)}.lectura li.bad:before{background:var(--bad)}.lectura li.ok:before{background:var(--ok)}
.alert{display:flex;gap:10px;align-items:flex-start;border-radius:var(--r-md);padding:11px 13px;margin-bottom:12px;font-size:13px;line-height:1.45;background:rgba(90,209,122,.08);border:1px solid rgba(90,209,122,.3)}
/* list rows */
.lrow{display:flex;align-items:center;gap:10px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:11px 13px;margin-bottom:8px}
.lrow .li{flex:1;min-width:0;cursor:pointer}
.lrow .ln{font-weight:600;font-size:14px}
.lrow .lc{font-size:11px;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}
.lrow .lm{font-family:'Space Mono';font-size:11px;color:var(--muted);margin-top:2px}
.iconbtn{background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-xs);width:32px;height:32px;display:grid;place-items:center;cursor:pointer;color:var(--muted);flex-shrink:0}
.iconbtn svg{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:2}
.iconbtn.danger{color:var(--bad)}
.chips{display:flex;flex-wrap:wrap;gap:7px;margin:6px 0}
.chip{font-size:11px;padding:7px 11px;border-radius:99px;border:1px solid var(--line);background:var(--surface2);color:var(--muted);cursor:pointer}
.chip.on{background:var(--acc);color:#0c0d0f;border-color:var(--acc)}
/* V2.95.0 — Release Notes (Ajustes) */
.relnote{border:1px solid var(--line);border-radius:var(--r-md);padding:13px 14px;margin-bottom:10px;background:var(--surface)}
.relnote-h{display:flex;align-items:center;gap:8px;margin-bottom:5px}
.relnote-v{font-size:11px;color:var(--muted)}
.relnote-badge{font-size:10px;font-weight:800;letter-spacing:.04em;color:#0c0d0f;background:var(--acc);border-radius:99px;padding:2px 8px}
.relnote-date{font-size:11px;color:var(--faint);margin-left:auto}
.relnote-t{font-family:'Hanken Grotesk';font-weight:700;font-size:14px;color:var(--txt);margin-bottom:5px;line-height:1.3}
.relnote-b{margin:0 0 8px;padding-left:18px;font-size:12.5px;color:var(--muted);line-height:1.5}
.relnote-b li{margin-bottom:2px}
.relnote .chips{margin:0}
.relnote .chip{padding:4px 9px;font-size:10.5px}
.dayrow{display:flex;align-items:center;gap:10px;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.05)}
.dayrow:last-child{border-bottom:0}
.dlab{width:34px;font-family:'Archivo';font-weight:800;font-size:12px;color:var(--muted)}
.dayrow .chips{margin:0;flex:1;justify-content:flex-end}.dayrow .chip{font-size:11px;padding:5px 9px}
.tbl{width:100%;border-collapse:collapse;font-size:12px}
.tbl th,.tbl td{padding:6px 4px;border-bottom:1px solid var(--line);text-align:right}
.tbl th:first-child,.tbl td:first-child{text-align:left}
.tbl th{color:var(--muted);font-weight:600;font-size:11px;text-transform:uppercase}.tbl td{font-family:'Space Mono'}
.supp{display:flex;align-items:center;gap:8px;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.05);font-size:13.5px}
.supp:last-of-type{border-bottom:0}.supp span.nm{flex:1}
/* V3.7.0 (§18.134): fila de adherencia en Hoy. Los botones son 34px para que se puedan tocar sin
   apuntar; `off` es el borde del rango (0 o completo), atenuado en vez de oculto para que no se
   mueva el layout al llegar al tope. */
.supprow{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid rgba(255,255,255,.05)}
.supprow:last-of-type{border-bottom:0}
.supprow .nm{font-size:13.5px;color:var(--txt)}
.suppq{width:34px;height:34px;flex-shrink:0;border-radius:9px;border:1px solid var(--line);background:var(--surface2,rgba(255,255,255,.04));color:var(--txt);font-size:17px;font-weight:700;line-height:1;cursor:pointer}
.suppq.off{opacity:.3;cursor:default}
.suppn{min-width:34px;text-align:center;font-size:13px;font-weight:700;color:var(--muted)}
.suppn.part{color:var(--warn)}
.seg{display:flex;gap:6px;background:var(--surface2);padding:4px;border-radius:var(--r-md);margin-bottom:12px}
.seg button{flex:1;border:0;background:transparent;color:var(--muted);padding:8px;border-radius:var(--r-xs);font-weight:700;font-size:12.5px;cursor:pointer;white-space:nowrap}
.seg button.on{background:var(--acc);color:#0c0d0f}
#cfgSeg button{font-size:11.5px;padding:8px 3px}
.results{margin-top:8px;display:grid;gap:6px;max-height:240px;overflow-y:auto}
.res{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:10px 11px;background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer}
.res .n{font-weight:600;font-size:13.5px}.res .m{font-family:'Space Mono';font-size:11px;color:var(--muted);white-space:nowrap}
/* Sticky bar de Hoy (V3.6.4/V3.6.5) — mismo patrón que el minibar de Finanzas: fixed + transform,
   sin recalcular layout. NO se llama .minibar: esa clase ya existe (línea de abajo) para los
   mini-gráficos de barras de Reportes (sueño) — colisionaban y .minibar.show heredaba su
   height:70px/align-items:flex-end, achicando y desalineando el contenido (V3.6.6, reporte real
   de Matt: "queda tapado"/se corta). V3.6.6 aumenta además el colchón de safe-area-inset-top. */
/* V3.6.8/V3.6.10: dos vueltas subiendo el piso mínimo del padding-top (54px, después 64px) sin
   resolver el reporte de Matt — la causa real NO era el padding. Con "black-translucent" en el
   meta tag de la status bar (ver index.html), iOS dibuja la barra de estado ENCIMA del
   contenido con vibrancy/blur nativo, sobre una franja de pantalla fija — ningún padding-top de
   ESTE elemento podía sacarlo de ahí, porque el problema no era la posición del contenido, era
   que el contenido seguía siendo VISIBLE debajo de esa franja pase lo que pase. V3.6.11 cambia
   el meta tag a "black" (opaco, sin superposición): el WebView deja de extenderse debajo de la
   barra de estado, así que ya no hace falta compensar nada acá — vuelve a un colchón chico. */
/* V3.6.18 (§18.133): acá vivía `transform:translateY(-101%)` + `transition:transform`, y ESE era
   el blur que sobrevivió a 5 releases. Un transform animado promueve el elemento a una capa de
   composición GPU; `-101%` de la altura da un desplazamiento fraccionario garantizado, el texto se
   rasteriza en posiciones sub-píxel dentro de esa capa, y al volver a `translateY(0)` WebKit
   reutiliza esa rasterización en vez de rehacerla. Por eso la mini-barra salía borrosa mientras el
   contenido de al lado (sin transform) se veía nítido, y por eso un pinch-zoom lo arreglaba: forzaba
   re-rasterizar la capa. Animar `top` no promueve a capa: el texto se pinta siempre a resolución
   nativa. Cuesta layout en vez de composición, irrelevante para un elemento que entra/sale una vez
   por cruce de scroll. `--sbh` lo mide el JS (setupMinibarScroll); el fallback cubre el primer frame. */
.stickybar{position:fixed;top:calc(-1 * var(--sbh,200px));left:0;right:0;z-index:55;display:flex;align-items:center;gap:6px;background:var(--surface);border-bottom:1px solid var(--line);padding-top:max(14px,calc(10px + env(safe-area-inset-top)));padding-right:10px;padding-bottom:12px;padding-left:10px;transition:top .2s ease}
.stickybar.show{top:0}
.stickybar .mval{font-size:15px;font-weight:700;color:var(--txt);flex-shrink:0}
.stickybar .mchips{display:flex;gap:4px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;white-space:nowrap;flex:1;min-width:0}
.stickybar .mchips::-webkit-scrollbar{display:none}
.stickybar .mchip{font-size:10px;font-weight:700;flex-shrink:0}
/* nav */
nav{position:fixed;bottom:0;left:0;right:0;background:var(--navbg);backdrop-filter:blur(14px);border-top:1px solid var(--line);display:flex;justify-content:space-around;padding:8px 0 calc(8px + env(safe-area-inset-bottom));z-index:50}
nav button{background:0;border:0;color:var(--faint);font-family:'Archivo';font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.03em;display:flex;flex-direction:column;align-items:center;gap:4px;cursor:pointer;padding:4px 9px}
nav button svg{width:21px;height:21px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
nav button.on{color:var(--acc)}
.view{display:none}.view.on{display:block;animation:fade .22s}
.rcards{display:grid;grid-template-columns:repeat(2,1fr);gap:9px;margin-bottom:11px}
.rcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:11px 12px}
.rcard .rl{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px}
.rcard .rv{font-family:'Archivo';font-weight:800;font-size:25px;line-height:1;color:var(--txt)}
.rcard .ru{font-size:11px;color:var(--faint);margin-top:2px}
.rbanner{display:flex;justify-content:space-between;align-items:center;border-radius:var(--r-md);padding:12px 15px;margin-bottom:12px;border:1px solid}
.rbanner .bl{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.07em}
.rbanner .bv{font-family:'Archivo';font-weight:800;font-size:27px;margin-top:2px}
.rbanner .br{text-align:right;font-family:'Space Mono';font-size:11px;color:var(--muted);line-height:1.7}
.dtbl{width:100%;border-collapse:collapse;font-family:'Space Mono';table-layout:fixed}
.dtbl th{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;padding:8px 5px;border-bottom:1px solid var(--line);text-align:right;font-weight:600}
.dtbl th:first-child,.dtbl td:first-child{text-align:left;width:30%}
.dtbl td{font-size:11px;color:var(--muted);padding:9px 5px;border-bottom:1px solid var(--line);text-align:right}
.dtbl tr:last-child td{border-bottom:0}
.dtbl .dn{color:var(--txt);font-family:'Hanken Grotesk';font-weight:700;font-size:12px}
.dtbl .dt{font-size:11px;color:var(--faint);display:block}
.divchart{display:flex;gap:6px}
.divcol{flex:1;display:flex;flex-direction:column;align-items:center;position:relative}
.minibar{display:flex;align-items:flex-end;gap:6px;height:70px}
.minicol{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px}
.minicol .mv{font-size:11px;font-weight:700}
.minicol .mk{width:100%;border-radius:3px}
.minicol .ml{font-size:11px;color:var(--faint)}
.ctbl{width:100%;border-collapse:collapse}
.ctbl th,.ctbl td{padding:7px 9px;font-size:11px;white-space:nowrap;border-bottom:1px solid var(--line);text-align:right;font-family:'Space Mono'}
.ctbl th:first-child,.ctbl td:first-child{text-align:left;color:var(--muted);font-family:'Hanken Grotesk'}
.ctbl thead th{font-size:11px;color:var(--muted);text-transform:uppercase}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1}}
.sheet{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:80;display:none;align-items:flex-end}
.sheet.on{display:flex;animation:fade .2s}
.sheet .panel{background:var(--bg);border-top:1px solid var(--line);border-radius:22px 22px 0 0;width:100%;max-width:520px;margin:0 auto;max-height:90vh;overflow-y:auto;overscroll-behavior:contain;touch-action:pan-y;padding:8px 16px calc(20px + env(safe-area-inset-bottom))}
body:has(.sheet.on){overflow:hidden}
.grab{width:42px;height:4px;background:var(--line);border-radius:99px;margin:8px auto 14px}
.toast{position:fixed;bottom:96px;left:50%;transform:translateX(-50%);background:var(--acc);color:#0c0d0f;padding:11px 18px;border-radius:99px;font-weight:700;font-size:13px;z-index:99;opacity:0;transition:.25s;pointer-events:none;white-space:nowrap;max-width:90%}
.toast.show{opacity:1;transform:translate(-50%,-6px)}
.syncdot{appearance:none;-webkit-appearance:none;border:0;background:transparent;padding:5px;margin:-5px;cursor:pointer;display:grid;place-items:center;line-height:0}
.syncdot span{display:block;width:9px;height:9px;border-radius:50%;background:var(--faint);transition:background .25s,opacity .25s}
.syncdot[data-s="synced"] span{background:var(--ok)}
.syncdot[data-s="pending"] span{background:var(--warn);animation:syncpulse 1.4s ease-in-out infinite}
.syncdot[data-s="syncing"] span{background:var(--blue);animation:syncpulse .85s ease-in-out infinite}
.syncdot[data-s="offline"] span{background:var(--bad)}
@keyframes syncpulse{0%,100%{opacity:1}50%{opacity:.3}}
#loginOverlay .loginbox{width:min(340px,86vw);background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:24px 20px;text-align:center;box-shadow:0 24px 70px rgba(0,0,0,.55)}
#loginOverlay .lb-title{font-family:'Archivo';font-weight:800;font-size:21px;letter-spacing:.02em}
#loginOverlay .lb-title b{color:var(--acc)}
#loginOverlay .lb-sub{color:var(--muted);font-size:12.5px;margin:6px 0 16px}
#loginOverlay input{width:100%;box-sizing:border-box;background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-md);color:var(--txt);padding:12px 14px;font-size:16px;outline:none}
#loginOverlay input:focus{border-color:var(--blue)}
#loginOverlay .lb-msg{min-height:16px;color:var(--warn);font-size:12px;margin:9px 0 6px}
#loginOverlay .lb-btn{width:100%;border:0;border-radius:var(--r-md);background:var(--acc);color:#0c0d0f;font-family:'Archivo';font-weight:800;font-size:14px;padding:12px;cursor:pointer;letter-spacing:.02em}
#loginOverlay .lb-skip{width:100%;border:0;background:transparent;color:var(--muted);font-size:12.5px;margin-top:12px;cursor:pointer;text-decoration:underline}
.back{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-weight:600;font-size:13px;margin-bottom:10px;cursor:pointer}
.back svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2}
.ing{display:flex;gap:6px;align-items:center;margin-bottom:6px}
.ing .inp{padding:8px}
/* ===== Exportar reporte (impresión / PDF) ===== */
#printRoot{display:none}
@media print{
  @page{margin:12mm}
  html,body{background:#fff!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .app,nav,.sheet,.toast,#loginOverlay{display:none!important}
  #printRoot{display:block!important;color:#1a1a1a;font-family:'Hanken Grotesk',system-ui,sans-serif;font-size:11px;line-height:1.4}
  #printRoot h1{font-family:'Archivo',sans-serif;font-size:20px;margin:0 0 2px;color:#111}
  #printRoot h2{font-family:'Archivo',sans-serif;font-size:13px;margin:18px 0 5px;border-bottom:2px solid #111;padding-bottom:2px;color:#111}
  #printRoot .sub{color:#666;font-size:11px;margin-bottom:8px}
  #printRoot .summary{display:flex;flex-wrap:wrap;gap:6px 18px;margin:8px 0 2px;padding:8px 10px;border:1px solid #ccc;border-radius:6px}
  #printRoot .summary div{font-size:11px;color:#666;text-transform:uppercase;letter-spacing:.03em}
  #printRoot .summary b{font-family:'Space Mono',monospace;font-size:13px;color:#111;display:block;margin-top:1px}
  #printRoot table{width:100%;border-collapse:collapse;margin:4px 0 6px}
  #printRoot th{text-align:left;border-bottom:1px solid #999;padding:3px 5px;font-size:11px;text-transform:uppercase;letter-spacing:.03em;color:#555;font-weight:700}
  #printRoot td{padding:2.5px 5px;border-bottom:1px solid #e4e4e4;font-size:11px}
  #printRoot th.num,#printRoot td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
  #printRoot tr.mealrow td{background:#eee;font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.03em;color:#333;border-bottom:1px solid #ccc}
  #printRoot tr.daytot td{font-weight:700;border-top:1px solid #999;border-bottom:2px solid #111;color:#111}
  #printRoot table.wktbl tr.prom td{font-weight:700;border-top:2px solid #111;color:#111}
  #printRoot .day{break-inside:avoid;page-break-inside:avoid;margin-top:10px}
  #printRoot .dayhead{font-family:'Archivo',sans-serif;font-weight:800;font-size:12px;color:#111;margin-top:6px}
  #printRoot .daymeta{color:#555;font-size:11px;margin:1px 0 2px}
  #printRoot .lectura{break-inside:avoid;page-break-inside:avoid}
  #printRoot .lectura h3{font-family:'Archivo',sans-serif;font-size:12px;margin:14px 0 4px;color:#111}
  #printRoot .lectura ul{margin:0;padding-left:16px}
  #printRoot .lectura li{margin:2px 0;font-size:11px;color:#222}
  #printRoot .foot{margin-top:14px;font-size:11px;color:#999;border-top:1px solid #ddd;padding-top:5px}
}
.spin{display:inline-block;width:12px;height:12px;border:2px solid var(--faint);border-top-color:var(--acc);border-radius:50%;animation:spin .7s linear infinite;vertical-align:-2px;margin-right:6px}@keyframes spin{to{transform:rotate(360deg)}}.acc{border:1px solid var(--line);border-radius:var(--r);margin-bottom:9px;background:var(--surface);overflow:hidden}.acc-h{display:flex;justify-content:space-between;align-items:center;padding:13px 15px;cursor:pointer;user-select:none;font-family:'Archivo';font-weight:800;font-size:12px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.acc-arrow{transition:transform .2s;color:var(--faint);font-size:15px;line-height:1}.acc.open .acc-h{color:var(--txt)}.acc.open .acc-arrow{transform:rotate(90deg)}.acc-b{padding:0 14px 13px}.acc-b .card{background:transparent;border:none;border-radius:0;padding:0;margin:0 0 10px}.acc-b>*:last-child{margin-bottom:0}.cfgsec{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:20px 4px 8px}.cfggrp{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:var(--surface);margin-bottom:4px}.cfggrp .acc{border:0;border-radius:0;margin:0;border-top:1px solid var(--line);background:transparent}.cfggrp>.acc:first-child,.cfggrp>.cfgrow:first-child{border-top:0}.cfgrow{display:flex;align-items:center;padding:13px 14px;cursor:pointer;border-top:1px solid var(--line);user-select:none}a.cfgrow{text-decoration:none;color:inherit}.cfgic{display:inline-flex;width:27px;height:27px;border-radius:var(--r-xs);background:var(--surface2);align-items:center;justify-content:center;font-size:14px;margin-right:11px;flex-shrink:0}.cfgL{display:flex;align-items:center;flex:1;min-width:0}.cfgnm{font-family:'Hanken Grotesk';font-weight:600;font-size:14px;color:var(--txt);text-transform:none;letter-spacing:0}.cfgV{font-family:'Space Mono';font-size:11px;color:var(--muted);margin-right:9px;text-transform:none;letter-spacing:0;white-space:nowrap}.cfgch{color:var(--faint);font-size:15px;font-family:'Space Mono';line-height:1}.cfgnav{display:flex;align-items:center;gap:7px;margin-bottom:14px;cursor:pointer}.cfgback{font-family:'Space Mono';font-size:20px;color:var(--acc);line-height:1}

/* ===== V2.73.0 (18.62): accesibilidad de movimiento y foco ===== */
/* Reduce movimiento si el sistema lo pide: transiciones/animaciones quedan instantáneas. */
@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important}}
/* Foco visible SOLO para navegación por teclado (:focus-visible no se activa con tap).
   Va al final del archivo para ganarle al outline:none de .inp/#loginOverlay input. */
:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.inp:focus-visible,#loginOverlay input:focus-visible{outline:2px solid var(--acc);outline-offset:0}
