{"id":40822,"date":"2026-06-11T17:44:17","date_gmt":"2026-06-11T22:44:17","guid":{"rendered":"https:\/\/doctorcepeda.com.co\/?page_id=40822"},"modified":"2026-06-30T17:39:42","modified_gmt":"2026-06-30T22:39:42","slug":"dieta-libre-gluten-free","status":"publish","type":"page","link":"https:\/\/doctorcepeda.com.co\/index.php\/dieta-libre-gluten-free\/","title":{"rendered":"Dieta. libre Gluten Free"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"40822\" class=\"elementor elementor-40822\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ab45b21 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no\" data-id=\"ab45b21\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5f5dee7\" data-id=\"5f5dee7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ef36967 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no\" data-id=\"ef36967\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a8880ae\" data-id=\"a8880ae\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-08ea2a2 elementor-widget elementor-widget-html\" data-id=\"08ea2a2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\r\n<title>Vivir Sin Gluten<\/title>\r\n<meta name=\"description\" content=\"Gu\u00eda y herramientas offline para vivir con enfermedad cel\u00edaca\">\r\n<meta name=\"theme-color\" content=\"#3A6B4C\">\r\n<link rel=\"manifest\" href=\"manifest.json\">\r\n<link rel=\"icon\" href=\"icons\/icon-192.png\">\r\n<style>\r\n:root{\r\n  --ink:#2B2118;\r\n  --paper:#FBF7EE;\r\n  --paper-2:#F3ECDB;\r\n  --line:#E2D6B8;\r\n  --avocado:#3A6B4C;\r\n  --avocado-dark:#274A35;\r\n  --corn:#E8A33D;\r\n  --corn-light:#F4E3B2;\r\n  --clay:#B6452C;\r\n  --clay-light:#F4DAD0;\r\n  --ok:#3A6B4C;\r\n  --ok-bg:#E3EEE3;\r\n  --bad:#B6452C;\r\n  --bad-bg:#F6E2DB;\r\n  --warn:#A6791E;\r\n  --warn-bg:#FBEFD3;\r\n  --radius:18px;\r\n  --font-display: ui-sans-serif, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\r\n  --font-body: ui-sans-serif, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\r\n  --font-stamp: ui-monospace, \"SF Mono\", \"Cascadia Code\", Consolas, monospace;\r\n}\r\n*{box-sizing:border-box;}\r\nhtml,body{margin:0;padding:0;}\r\nbody{\r\n  font-family:var(--font-body);\r\n  background:var(--paper-2);\r\n  color:var(--ink);\r\n  -webkit-font-smoothing:antialiased;\r\n  display:flex;\r\n  justify-content:center;\r\n}\r\nbutton{font-family:inherit;cursor:pointer;}\r\ninput,textarea,select{font-family:inherit;}\r\n\r\n#app{\r\n  width:100%;\r\n  max-width:430px;\r\n  min-height:100vh;\r\n  background:var(--paper);\r\n  position:relative;\r\n  display:flex;\r\n  flex-direction:column;\r\n  box-shadow:0 0 40px rgba(0,0,0,0.08);\r\n}\r\n\r\n\/* HEADER *\/\r\nheader.topbar{\r\n  position:sticky;top:0;z-index:30;\r\n  background:var(--avocado);\r\n  color:#fff;\r\n  padding:16px 18px 14px;\r\n  display:flex;align-items:center;justify-content:space-between;\r\n  border-bottom:3px solid var(--avocado-dark);\r\n}\r\nheader.topbar .brand{display:flex;align-items:center;gap:10px;}\r\n.logo-mark{\r\n  width:36px;height:36px;border-radius:50%;\r\n  background:var(--corn);\r\n  display:flex;align-items:center;justify-content:center;\r\n  font-family:var(--font-stamp);font-weight:700;font-size:13px;color:var(--ink);\r\n  border:2px dashed rgba(43,33,24,0.4);\r\n  flex-shrink:0;\r\n}\r\nheader.topbar h1{font-size:16px;margin:0;font-weight:800;letter-spacing:-0.01em;}\r\nheader.topbar p{margin:0;font-size:10px;opacity:0.85;text-transform:uppercase;letter-spacing:0.08em;font-family:var(--font-stamp);}\r\n.icon-btn{\r\n  background:rgba(255,255,255,0.15);border:none;color:#fff;\r\n  width:36px;height:36px;border-radius:10px;\r\n  display:flex;align-items:center;justify-content:center;font-size:18px;\r\n}\r\n\r\n\/* SCREENS *\/\r\nmain{flex:1;overflow-y:auto;padding-bottom:96px;}\r\n.screen{display:none;padding:18px 18px 6px;animation:fade .18s ease;}\r\n.screen.active{display:block;}\r\n@keyframes fade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}\r\n\r\nh2.section-title{\r\n  font-size:20px;font-weight:800;margin:4px 0 4px;letter-spacing:-0.01em;color:var(--ink);\r\n}\r\np.section-sub{color:#6b5f4a;font-size:13px;margin:0 0 16px;line-height:1.5;}\r\n\r\n.eyebrow{\r\n  font-family:var(--font-stamp);font-size:10px;text-transform:uppercase;letter-spacing:0.12em;\r\n  color:var(--avocado-dark);font-weight:700;margin-bottom:6px;display:block;\r\n}\r\n\r\n\/* CARDS *\/\r\n.card{\r\n  background:#fff;border:1px solid var(--line);border-radius:var(--radius);\r\n  padding:16px;margin-bottom:14px;\r\n}\r\n.card.tinted{background:var(--paper-2);}\r\n\r\n\/* STAMP BADGES - signature element *\/\r\n.stamp{\r\n  display:inline-flex;align-items:center;gap:6px;\r\n  font-family:var(--font-stamp);font-weight:700;font-size:11px;letter-spacing:0.06em;text-transform:uppercase;\r\n  padding:5px 12px;border-radius:999px;border:2px dashed currentColor;\r\n  white-space:nowrap;\r\n}\r\n.stamp.ok{color:var(--ok);background:var(--ok-bg);}\r\n.stamp.bad{color:var(--bad);background:var(--bad-bg);}\r\n.stamp.warn{color:var(--warn);background:var(--warn-bg);}\r\n.stamp-dot{width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;}\r\n\r\n\/* HOME *\/\r\n.home-hero{\r\n  background:linear-gradient(155deg, var(--avocado) 0%, var(--avocado-dark) 100%);\r\n  border-radius:22px;padding:22px 20px;color:#fff;margin-bottom:18px;position:relative;overflow:hidden;\r\n}\r\n.home-hero::after{\r\n  content:\"\";position:absolute;right:-30px;bottom:-30px;width:140px;height:140px;border-radius:50%;\r\n  border:3px dashed rgba(255,255,255,0.18);\r\n}\r\n.home-hero h2{font-size:19px;margin:0 0 6px;font-weight:800;}\r\n.home-hero p{font-size:13px;margin:0 0 16px;opacity:0.92;line-height:1.5;}\r\n.quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:8px;}\r\n.quick-btn{\r\n  background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px 12px;\r\n  text-align:left;display:flex;flex-direction:column;gap:6px;\r\n}\r\n.quick-btn .qi{font-size:20px;}\r\n.quick-btn .qt{font-size:12.5px;font-weight:700;color:var(--ink);}\r\n\r\n.risk-row{display:flex;gap:10px;margin-bottom:10px;}\r\n.risk-chip{flex:1;border-radius:14px;padding:12px;text-align:center;font-size:11px;font-weight:700;font-family:var(--font-stamp);text-transform:uppercase;letter-spacing:0.04em;}\r\n.risk-chip.ok{background:var(--ok-bg);color:var(--ok);}\r\n.risk-chip.warn{background:var(--warn-bg);color:var(--warn);}\r\n.risk-chip.bad{background:var(--bad-bg);color:var(--bad);}\r\n\r\n\/* DISCLAIMER *\/\r\n.disclaimer{\r\n  display:flex;gap:10px;background:var(--corn-light);border:1px solid var(--corn);\r\n  border-radius:14px;padding:12px 14px;font-size:12px;line-height:1.5;color:#5c4514;margin-bottom:16px;\r\n}\r\n\r\n\/* SEARCH *\/\r\n.search-box{position:relative;margin-bottom:16px;}\r\n.search-box input{\r\n  width:100%;padding:14px 16px 14px 42px;border-radius:14px;border:1px solid var(--line);\r\n  background:var(--paper-2);font-size:14px;color:var(--ink);outline:none;\r\n}\r\n.search-box input:focus{border-color:var(--avocado);background:#fff;}\r\n.search-box .si{position:absolute;left:14px;top:14px;opacity:0.5;font-size:16px;}\r\n.result-item{\r\n  background:#fff;border:1px solid var(--line);border-radius:14px;padding:13px 14px;margin-bottom:10px;\r\n}\r\n.result-item .rh{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px;}\r\n.result-item .rh b{font-size:14px;}\r\n.result-item .rr{font-size:12.5px;color:#6b5f4a;line-height:1.5;}\r\n.empty-hint{color:#8a7d65;font-size:13px;text-align:center;padding:30px 10px;}\r\n\r\n\/* TABS (segmented) *\/\r\n.tabs{display:flex;gap:6px;background:var(--paper-2);padding:4px;border-radius:14px;margin-bottom:16px;}\r\n.tabs button{flex:1;border:none;background:transparent;padding:9px 4px;border-radius:11px;font-size:12px;font-weight:700;color:#7a6d54;}\r\n.tabs button.active{background:#fff;color:var(--avocado-dark);box-shadow:0 1px 3px rgba(0,0,0,0.08);}\r\n\r\n.food-grid{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:6px;}\r\n.food-pill{\r\n  background:#fff;border:1px solid var(--line);border-radius:11px;padding:9px 11px;font-size:12.5px;\r\n  display:flex;align-items:center;gap:7px;\r\n}\r\n\r\n\/* ACCORDION *\/\r\n.accordion-item{border:1px solid var(--line);border-radius:14px;margin-bottom:10px;overflow:hidden;background:#fff;}\r\n.accordion-head{\r\n  padding:14px 16px;display:flex;justify-content:space-between;align-items:center;font-weight:700;font-size:13.5px;\r\n  background:#fff;border:none;width:100%;text-align:left;color:var(--ink);\r\n}\r\n.accordion-head .chev{transition:transform .2s;color:var(--avocado);font-size:13px;}\r\n.accordion-item.open .chev{transform:rotate(180deg);}\r\n.accordion-body{max-height:0;overflow:hidden;transition:max-height .25s ease;}\r\n.accordion-item.open .accordion-body{max-height:600px;}\r\n.accordion-body-inner{padding:0 16px 16px;font-size:13px;line-height:1.6;color:#5b5142;}\r\n.accordion-body-inner ul{margin:6px 0 0;padding-left:18px;}\r\n.accordion-body-inner li{margin-bottom:5px;}\r\n\r\n\/* PLANNER *\/\r\n.day-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:14px 16px;margin-bottom:10px;}\r\n.day-card h4{margin:0 0 10px;font-size:13px;font-family:var(--font-stamp);text-transform:uppercase;letter-spacing:0.06em;color:var(--avocado-dark);}\r\n.meal-row{display:flex;gap:10px;padding:6px 0;border-top:1px dashed var(--line);font-size:12.5px;}\r\n.meal-row:first-of-type{border-top:none;}\r\n.meal-row .ml{font-weight:700;width:62px;flex-shrink:0;color:#8a7d65;font-size:11px;text-transform:uppercase;}\r\n\r\n.recipe-card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:15px;margin-bottom:12px;}\r\n.recipe-card .rtitle{font-weight:800;font-size:14.5px;margin-bottom:4px;}\r\n.recipe-tags{display:flex;gap:6px;margin-bottom:10px;}\r\n.tag{font-size:10px;font-family:var(--font-stamp);text-transform:uppercase;background:var(--paper-2);padding:3px 8px;border-radius:8px;color:#7a6d54;}\r\n.recipe-card h5{font-size:11.5px;text-transform:uppercase;letter-spacing:0.05em;color:var(--avocado-dark);margin:10px 0 5px;}\r\n.recipe-card ul, .recipe-card ol{margin:0;padding-left:18px;font-size:12.5px;line-height:1.6;color:#4a4232;}\r\n\r\n\/* SHOPPING LIST *\/\r\n.shop-cat{margin-bottom:16px;}\r\n.shop-cat h4{font-size:12px;font-family:var(--font-stamp);text-transform:uppercase;letter-spacing:0.06em;color:var(--avocado-dark);margin:0 0 8px;}\r\n.shop-item{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--paper-2);font-size:13.5px;}\r\n.shop-item input[type=checkbox]{width:18px;height:18px;accent-color:var(--avocado);flex-shrink:0;}\r\n.shop-item.checked label{text-decoration:line-through;color:#b3a98e;}\r\n\r\n\/* FORMS *\/\r\n.field{margin-bottom:13px;}\r\n.field label{display:block;font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:0.04em;color:#7a6d54;margin-bottom:6px;}\r\n.field input,.field textarea,.field select{\r\n  width:100%;padding:11px 13px;border-radius:11px;border:1px solid var(--line);background:var(--paper-2);font-size:14px;color:var(--ink);outline:none;\r\n}\r\n.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--avocado);background:#fff;}\r\n.field textarea{resize:vertical;min-height:60px;}\r\n.btn{\r\n  display:inline-flex;align-items:center;justify-content:center;gap:6px;\r\n  background:var(--avocado);color:#fff;border:none;border-radius:13px;padding:13px 18px;font-weight:700;font-size:13.5px;width:100%;\r\n}\r\n.btn.secondary{background:#fff;color:var(--avocado-dark);border:1px solid var(--avocado);}\r\n.btn.ghost{background:transparent;color:var(--clay);border:1px solid var(--clay-light);}\r\n.btn.small{width:auto;padding:9px 14px;font-size:12.5px;}\r\n\r\n.log-item{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px;margin-bottom:9px;display:flex;justify-content:space-between;gap:10px;align-items:flex-start;}\r\n.log-item .ld{font-size:13px;}\r\n.log-item .ldate{font-family:var(--font-stamp);font-size:10.5px;color:#9a8d70;text-transform:uppercase;margin-bottom:3px;}\r\n.log-item .ltitle{font-weight:700;font-size:13.5px;margin-bottom:2px;}\r\n.log-item .lnote{font-size:12px;color:#6b5f4a;line-height:1.45;}\r\n.del-btn{background:none;border:none;color:#b3a98e;font-size:16px;padding:2px 4px;flex-shrink:0;}\r\n\r\n.seg{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:6px;}\r\n.seg button{border:1px solid var(--line);background:#fff;border-radius:10px;padding:8px 12px;font-size:12px;font-weight:600;color:#6b5f4a;}\r\n.seg button.active{background:var(--avocado);border-color:var(--avocado);color:#fff;}\r\n\r\n\/* BOTTOM NAV *\/\r\nnav.bottomnav{\r\n  position:fixed;bottom:0;left:50%;transform:translateX(-50%);\r\n  width:100%;max-width:430px;background:#fff;border-top:1px solid var(--line);\r\n  display:flex;justify-content:space-around;align-items:center;padding:8px 6px 10px;z-index:40;\r\n}\r\nnav.bottomnav button{\r\n  background:none;border:none;display:flex;flex-direction:column;align-items:center;gap:3px;\r\n  color:#a89c80;padding:4px 8px;border-radius:10px;\r\n}\r\nnav.bottomnav button.active{color:var(--avocado);}\r\nnav.bottomnav button .ni{font-size:19px;}\r\nnav.bottomnav button .nt{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:0.02em;}\r\n\r\n\/* SHEET \/ MODAL *\/\r\n.overlay{position:fixed;inset:0;background:rgba(43,33,24,0.45);z-index:60;display:none;}\r\n.overlay.show{display:block;}\r\n.sheet{\r\n  position:fixed;left:50%;bottom:0;transform:translate(-50%,100%);width:100%;max-width:430px;\r\n  background:#fff;border-radius:22px 22px 0 0;z-index:61;padding:20px 20px 28px;\r\n  max-height:85vh;overflow-y:auto;transition:transform .25s ease;\r\n}\r\n.sheet.show{transform:translate(-50%,0);}\r\n.sheet-handle{width:38px;height:4px;background:var(--line);border-radius:4px;margin:0 auto 16px;}\r\n.sheet-close{position:absolute;right:16px;top:16px;background:var(--paper-2);border:none;width:30px;height:30px;border-radius:50%;font-size:14px;color:#7a6d54;}\r\n.menu-list button{\r\n  width:100%;text-align:left;border:none;background:none;padding:13px 4px;font-size:14.5px;font-weight:600;\r\n  border-bottom:1px solid var(--paper-2);display:flex;align-items:center;gap:12px;color:var(--ink);\r\n}\r\n.menu-list .mi{font-size:18px;width:24px;text-align:center;}\r\n\r\n.fab-add{\r\n  position:fixed;left:50%;bottom:88px;transform:translateX(calc(-50%+170px));\r\n  width:52px;height:52px;border-radius:50%;background:var(--corn);color:var(--ink);\r\n  border:none;font-size:24px;box-shadow:0 4px 14px rgba(0,0,0,0.22);z-index:35;display:none;\r\n}\r\n.fab-add.show{display:flex;align-items:center;justify-content:center;}\r\n\r\n.toast{\r\n  position:fixed;left:50%;bottom:160px;transform:translateX(-50%);background:var(--ink);color:#fff;\r\n  padding:10px 18px;border-radius:30px;font-size:12.5px;z-index:80;opacity:0;pointer-events:none;transition:opacity .2s, bottom .2s;\r\n}\r\n.toast.show{opacity:1;bottom:180px;}\r\n\r\n.offline-badge{\r\n  display:inline-flex;align-items:center;gap:5px;font-size:10px;font-family:var(--font-stamp);text-transform:uppercase;\r\n  color:rgba(255,255,255,0.85);\r\n}\r\n.offline-badge .dot{width:6px;height:6px;border-radius:50%;background:#9CDFA8;}\r\n\r\n@media print{\r\n  header.topbar,nav.bottomnav,.fab-add,.overlay,.sheet,.tabs,.search-box,#screen-print{display:none !important;}\r\n}\r\n#print-area{display:none;}\r\n#print-area.show{display:block;padding:20px;}\r\n#print-area table{width:100%;border-collapse:collapse;margin-bottom:18px;}\r\n#print-area th,#print-area td{border:1px solid #ccc;padding:6px 8px;font-size:11px;text-align:left;}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<div id=\"app\">\r\n\r\n  <header class=\"topbar\">\r\n    <div class=\"brand\">\r\n      <div class=\"logo-mark\">SG<\/div>\r\n      <div>\r\n        <h1>Vivir Sin Gluten<\/h1>\r\n        <p>Gu\u00eda para cel\u00edacos \u00b7 Colombia y LatAm<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <button class=\"icon-btn\" id=\"btn-menu\" aria-label=\"M\u00e1s opciones\">\u2630<\/button>\r\n  <\/header>\r\n\r\n  <main>\r\n\r\n    <!-- INICIO -->\r\n    <section class=\"screen active\" id=\"screen-inicio\">\r\n      <div class=\"home-hero\">\r\n        <span class=\"offline-badge\"><span class=\"dot\"><\/span> Funciona sin conexi\u00f3n<\/span>\r\n        <h2 style=\"margin-top:10px;\">Hola, bienvenido\/a<\/h2>\r\n        <p>Todo lo que necesitas para vivir bien con enfermedad cel\u00edaca: alimentos, recetas, etiquetas y seguimiento, guardado en tu propio dispositivo.<\/p>\r\n      <\/div>\r\n\r\n      <div class=\"disclaimer\" id=\"home-disclaimer\">\r\n        \u2695\ufe0f <div>Esta app es una gu\u00eda educativa y <b>no reemplaza la consulta m\u00e9dica<\/b>. El diagn\u00f3stico y manejo de la enfermedad cel\u00edaca debe hacerlo un gastroenter\u00f3logo, con apoyo de nutrici\u00f3n cl\u00ednica.<\/div>\r\n      <\/div>\r\n\r\n      <span class=\"eyebrow\">Acceso r\u00e1pido<\/span>\r\n      <div class=\"quick-grid\">\r\n        <button class=\"quick-btn\" data-go=\"buscador\"><span class=\"qi\">\ud83d\udd0d<\/span><span class=\"qt\">Buscar un alimento<\/span><\/button>\r\n        <button class=\"quick-btn\" data-go=\"etiquetas\"><span class=\"qi\">\ud83c\udff7\ufe0f<\/span><span class=\"qt\">Leer una etiqueta<\/span><\/button>\r\n        <button class=\"quick-btn\" data-go=\"planificador\"><span class=\"qi\">\ud83d\uddd3\ufe0f<\/span><span class=\"qt\">Men\u00fa de la semana<\/span><\/button>\r\n        <button class=\"quick-btn\" data-go=\"compras\"><span class=\"qi\">\ud83d\uded2<\/span><span class=\"qt\">Lista de mercado<\/span><\/button>\r\n        <button class=\"quick-btn\" data-go=\"consejos\"><span class=\"qi\">\ud83c\udf7d\ufe0f<\/span><span class=\"qt\">Comer fuera de casa<\/span><\/button>\r\n        <button class=\"quick-btn\" data-go=\"seguimiento\"><span class=\"qi\">\ud83d\udccb<\/span><span class=\"qt\">Mi seguimiento<\/span><\/button>\r\n      <\/div>\r\n\r\n      <span class=\"eyebrow\" style=\"margin-top:6px;display:block;\">Clasificaci\u00f3n r\u00e1pida<\/span>\r\n      <div class=\"risk-row\">\r\n        <div class=\"risk-chip ok\">\u2713 Permitido<\/div>\r\n        <div class=\"risk-chip warn\">! Verificar<\/div>\r\n        <div class=\"risk-chip bad\">\u2715 Prohibido<\/div>\r\n      <\/div>\r\n\r\n      <span class=\"eyebrow\">Educaci\u00f3n<\/span>\r\n      <button class=\"quick-btn\" style=\"width:100%;margin-bottom:30px;\" data-go=\"educacion\">\r\n        <span class=\"qi\">\ud83d\udcd6<\/span>\r\n        <span class=\"qt\">\u00bfQu\u00e9 es la enfermedad cel\u00edaca? Aprende lo esencial<\/span>\r\n      <\/button>\r\n    <\/section>\r\n\r\n    <!-- EDUCACI\u00d3N -->\r\n    <section class=\"screen\" id=\"screen-educacion\">\r\n      <h2 class=\"section-title\">Educaci\u00f3n<\/h2>\r\n      <p class=\"section-sub\">Conceptos claros, sin tecnicismos, para entender qu\u00e9 te pasa y por qu\u00e9.<\/p>\r\n\r\n      <div id=\"edu-accordion\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- BUSCADOR -->\r\n    <section class=\"screen\" id=\"screen-buscador\">\r\n      <h2 class=\"section-title\">Buscador de alimentos<\/h2>\r\n      <p class=\"section-sub\">Escribe un alimento, marca o ingrediente. La b\u00fasqueda funciona sin internet.<\/p>\r\n      <div class=\"search-box\">\r\n        <span class=\"si\">\ud83d\udd0d<\/span>\r\n        <input type=\"text\" id=\"search-input\" placeholder=\"Ej. avena, harina de ma\u00edz, salsa de soya...\">\r\n      <\/div>\r\n      <div id=\"search-results\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- GU\u00cdA DE ALIMENTOS -->\r\n    <section class=\"screen\" id=\"screen-guia\">\r\n      <h2 class=\"section-title\">Gu\u00eda de alimentos<\/h2>\r\n      <p class=\"section-sub\">Explora por categor\u00eda de riesgo.<\/p>\r\n      <div class=\"tabs\" id=\"guia-tabs\">\r\n        <button class=\"active\" data-status=\"permitido\">Permitidos<\/button>\r\n        <button data-status=\"verificar\">Verificar<\/button>\r\n        <button data-status=\"prohibido\">Prohibidos<\/button>\r\n      <\/div>\r\n      <div id=\"guia-grid\" class=\"food-grid\"><\/div>\r\n\r\n      <span class=\"eyebrow\" style=\"margin-top:18px;display:block;\">Glosario T.A.C.C. y similares<\/span>\r\n      <div id=\"glosario\"><\/div>\r\n\r\n      <span class=\"eyebrow\" style=\"margin-top:18px;display:block;\">Ejemplos de comidas seguras<\/span>\r\n      <div id=\"ejemplos-comidas\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- ETIQUETAS -->\r\n    <section class=\"screen\" id=\"screen-etiquetas\">\r\n      <h2 class=\"section-title\">Lector de etiquetas<\/h2>\r\n      <p class=\"section-sub\">Aprende a revisar un empaque antes de comprarlo.<\/p>\r\n      <div id=\"etiquetas-content\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- PLANIFICADOR -->\r\n    <section class=\"screen\" id=\"screen-planificador\">\r\n      <h2 class=\"section-title\">Planificador de comidas<\/h2>\r\n      <p class=\"section-sub\">Men\u00fa semanal sin gluten. Puedes generar uno nuevo cuando quieras.<\/p>\r\n      <div class=\"tabs\">\r\n        <button class=\"active\" data-ptab=\"menu\">Men\u00fa semanal<\/button>\r\n        <button data-ptab=\"recetas\">Recetas<\/button>\r\n      <\/div>\r\n      <div id=\"planner-menu\">\r\n        <button class=\"btn secondary\" id=\"btn-regen-menu\" style=\"margin-bottom:14px;\">\ud83d\udd04 Generar otra semana<\/button>\r\n        <div id=\"menu-days\"><\/div>\r\n      <\/div>\r\n      <div id=\"planner-recetas\" style=\"display:none;\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- LISTA DE COMPRAS -->\r\n    <section class=\"screen\" id=\"screen-compras\">\r\n      <h2 class=\"section-title\">Lista de compras<\/h2>\r\n      <p class=\"section-sub\">Marca lo que ya tienes. Se organiza por categor\u00eda.<\/p>\r\n      <button class=\"btn secondary\" id=\"btn-reset-compras\" style=\"margin-bottom:14px;\">\u21ba Reiniciar marcas<\/button>\r\n      <div id=\"compras-list\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- CONSEJOS -->\r\n    <section class=\"screen\" id=\"screen-consejos\">\r\n      <h2 class=\"section-title\">Consejos pr\u00e1cticos<\/h2>\r\n      <p class=\"section-sub\">Para el d\u00eda a d\u00eda: casa, restaurantes, colegio y viajes.<\/p>\r\n      <div id=\"consejos-accordion\"><\/div>\r\n    <\/section>\r\n\r\n    <!-- SEGUIMIENTO -->\r\n    <section class=\"screen\" id=\"screen-seguimiento\">\r\n      <h2 class=\"section-title\">Mi seguimiento<\/h2>\r\n      <p class=\"section-sub\">Tus registros se guardan solo en este dispositivo.<\/p>\r\n\r\n      <div class=\"seg\" id=\"seg-tabs\">\r\n        <button class=\"active\" data-seg=\"citas\">\ud83d\uddd3\ufe0f Citas<\/button>\r\n        <button data-seg=\"sintomas\">\ud83e\ude7a S\u00edntomas<\/button>\r\n        <button data-seg=\"comidas\">\ud83c\udf7d\ufe0f Comidas<\/button>\r\n        <button data-seg=\"exposiciones\">\u26a0\ufe0f Exposici\u00f3n<\/button>\r\n      <\/div>\r\n\r\n      <div id=\"seg-list\"><\/div>\r\n\r\n      <div class=\"card tinted\" style=\"margin-top:18px;\">\r\n        <span class=\"eyebrow\">Exportar mis datos<\/span>\r\n        <p style=\"font-size:12.5px;color:#6b5f4a;margin:0 0 12px;line-height:1.5;\">Descarga tus registros para llevarlos a tu m\u00e9dico o nutricionista. Todo se genera en tu dispositivo, sin enviar datos a internet.<\/p>\r\n        <div style=\"display:flex;gap:10px;\">\r\n          <button class=\"btn secondary small\" id=\"btn-export-csv\" style=\"flex:1;\">\u2b07\ufe0f CSV<\/button>\r\n          <button class=\"btn secondary small\" id=\"btn-export-pdf\" style=\"flex:1;\">\ud83d\udda8\ufe0f PDF<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <!-- AJUSTES \/ PRIVACIDAD -->\r\n    <section class=\"screen\" id=\"screen-privacidad\">\r\n      <h2 class=\"section-title\">Privacidad y datos<\/h2>\r\n      <p class=\"section-sub\">C\u00f3mo funciona esta app por dentro.<\/p>\r\n      <div class=\"card\">\r\n        <p style=\"font-size:13px;line-height:1.7;color:#4a4232;margin:0;\">\r\n        \ud83d\udd12 <b>Todo se queda en tu dispositivo.<\/b> Esta app no tiene servidor: la base de alimentos viaja incluida en la app y tus registros (s\u00edntomas, comidas, exposiciones, citas) se guardan localmente con IndexedDB, la base de datos del navegador.<br><br>\r\n        \ud83d\udeab No se env\u00edan datos personales a internet. No hay inicio de sesi\u00f3n obligatorio.<br><br>\r\n        \ud83d\udcf6 La app funciona completa sin conexi\u00f3n. Si en el futuro se agregan actualizaciones de contenido (nuevos alimentos, recetas), ser\u00e1n opcionales y solo se descargar\u00e1n si t\u00fa lo decides y tienes internet.<br><br>\r\n        \ud83d\uddd1\ufe0f Puedes borrar tus registros individualmente desde \"Mi seguimiento\", o exportarlos en CSV\/PDF antes de borrarlos.\r\n        <\/p>\r\n      <\/div>\r\n      <div class=\"card\">\r\n        <span class=\"eyebrow\">Fuentes de referencia<\/span>\r\n        <p style=\"font-size:12px;line-height:1.7;color:#6b5f4a;margin:0;\">\r\n        Contenido elaborado con base en lineamientos generales de organizaciones de gastroenterolog\u00eda y asociaciones de cel\u00edacos (ej. criterios diagn\u00f3sticos ESPGHAN, gu\u00edas de la Sociedad Mundial de Gastroenterolog\u00eda y la Ley 2232 de 2022 de Colombia). Esta app resume conceptos generales; no sustituye gu\u00edas cl\u00ednicas oficiales ni la valoraci\u00f3n individual de tu m\u00e9dico.\r\n        <\/p>\r\n      <\/div>\r\n    <\/section>\r\n\r\n  <\/main>\r\n\r\n  <button class=\"fab-add\" id=\"fab-add\">+<\/button>\r\n\r\n  <nav class=\"bottomnav\">\r\n    <button class=\"active\" data-go=\"inicio\"><span class=\"ni\">\ud83c\udfe0<\/span><span class=\"nt\">Inicio<\/span><\/button>\r\n    <button data-go=\"buscador\"><span class=\"ni\">\ud83d\udd0d<\/span><span class=\"nt\">Buscar<\/span><\/button>\r\n    <button data-go=\"planificador\"><span class=\"ni\">\ud83d\uddd3\ufe0f<\/span><span class=\"nt\">Men\u00fa<\/span><\/button>\r\n    <button data-go=\"seguimiento\"><span class=\"ni\">\ud83d\udccb<\/span><span class=\"nt\">Seguir<\/span><\/button>\r\n    <button data-go=\"menu-mas\"><span class=\"ni\">\u2630<\/span><span class=\"nt\">M\u00e1s<\/span><\/button>\r\n  <\/nav>\r\n\r\n<\/div>\r\n\r\n<!-- OVERLAY + SHEETS -->\r\n<div class=\"overlay\" id=\"overlay\"><\/div>\r\n\r\n<div class=\"sheet\" id=\"sheet-menu\">\r\n  <div class=\"sheet-handle\"><\/div>\r\n  <button class=\"sheet-close\" data-close>\u2715<\/button>\r\n  <div class=\"menu-list\">\r\n    <button data-go=\"educacion\"><span class=\"mi\">\ud83d\udcd6<\/span> Educaci\u00f3n<\/button>\r\n    <button data-go=\"guia\"><span class=\"mi\">\ud83e\udd57<\/span> Gu\u00eda de alimentos<\/button>\r\n    <button data-go=\"buscador\"><span class=\"mi\">\ud83d\udd0d<\/span> Buscador de alimentos<\/button>\r\n    <button data-go=\"etiquetas\"><span class=\"mi\">\ud83c\udff7\ufe0f<\/span> Lector de etiquetas<\/button>\r\n    <button data-go=\"planificador\"><span class=\"mi\">\ud83d\uddd3\ufe0f<\/span> Planificador y recetas<\/button>\r\n    <button data-go=\"compras\"><span class=\"mi\">\ud83d\uded2<\/span> Lista de compras<\/button>\r\n    <button data-go=\"consejos\"><span class=\"mi\">\ud83d\udca1<\/span> Consejos pr\u00e1cticos<\/button>\r\n    <button data-go=\"seguimiento\"><span class=\"mi\">\ud83d\udccb<\/span> Mi seguimiento<\/button>\r\n    <button data-go=\"privacidad\"><span class=\"mi\">\ud83d\udd12<\/span> Privacidad y datos<\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"sheet\" id=\"sheet-form\">\r\n  <div class=\"sheet-handle\"><\/div>\r\n  <button class=\"sheet-close\" data-close>\u2715<\/button>\r\n  <div id=\"form-content\"><\/div>\r\n<\/div>\r\n\r\n<div class=\"toast\" id=\"toast\"><\/div>\r\n\r\n<div id=\"print-area\"><\/div>\r\n\r\n<script>\r\n\/* =========================================================\r\n   BASE DE DATOS LOCAL DE ALIMENTOS (embebida, 100% offline)\r\n   status: 'permitido' | 'prohibido' | 'verificar'\r\n========================================================= *\/\r\nconst FOODS = [\r\n\/\/ PERMITIDOS - naturalmente sin gluten\r\n{n:\"Arroz blanco o integral\",c:\"Cereales y harinas\",s:\"permitido\",r:\"El arroz no contiene gluten en su forma natural.\"},\r\n{n:\"Ma\u00edz \/ mazorca fresca\",c:\"Cereales y harinas\",s:\"permitido\",r:\"El ma\u00edz es naturalmente libre de gluten.\"},\r\n{n:\"Harina de ma\u00edz precocida casera\",c:\"Cereales y harinas\",s:\"verificar\",r:\"El ma\u00edz no tiene gluten, pero las marcas comerciales pueden molerse en plantas que tambi\u00e9n procesan trigo. Verifica el sello \\\"sin gluten\\\".\"},\r\n{n:\"Yuca \/ mandioca\",c:\"Verduras y tub\u00e9rculos\",s:\"permitido\",r:\"Tub\u00e9rculo naturalmente libre de gluten.\"},\r\n{n:\"Papa\",c:\"Verduras y tub\u00e9rculos\",s:\"permitido\",r:\"Naturalmente libre de gluten.\"},\r\n{n:\"Papa criolla\",c:\"Verduras y tub\u00e9rculos\",s:\"permitido\",r:\"Naturalmente libre de gluten.\"},\r\n{n:\"Pl\u00e1tano\",c:\"Frutas\",s:\"permitido\",r:\"Naturalmente libre de gluten.\"},\r\n{n:\"Quinua\",c:\"Cereales y harinas\",s:\"permitido\",r:\"Pseudocereal sin gluten; revisa que no haya sido empacado junto a cereales con gluten si es a granel.\"},\r\n{n:\"Frijoles, lentejas, garbanzos secos\",c:\"Prote\u00ednas\",s:\"permitido\",r:\"Las leguminosas en su forma natural no contienen gluten.\"},\r\n{n:\"Carne de res, pollo, cerdo (fresca, sin marinar)\",c:\"Prote\u00ednas\",s:\"permitido\",r:\"La carne fresca y sin procesar no contiene gluten.\"},\r\n{n:\"Pescado y mariscos frescos\",c:\"Prote\u00ednas\",s:\"permitido\",r:\"Naturalmente libres de gluten en su forma fresca.\"},\r\n{n:\"Huevos\",c:\"Prote\u00ednas\",s:\"permitido\",r:\"Naturalmente libres de gluten.\"},\r\n{n:\"Frutas frescas (todas)\",c:\"Frutas\",s:\"permitido\",r:\"Las frutas frescas no contienen gluten.\"},\r\n{n:\"Verduras frescas (todas)\",c:\"Verduras y tub\u00e9rculos\",s:\"permitido\",r:\"Las verduras frescas no contienen gluten.\"},\r\n{n:\"Leche entera o deslactosada\",c:\"L\u00e1cteos\",s:\"permitido\",r:\"La leche l\u00edquida natural no contiene gluten.\"},\r\n{n:\"Queso fresco \/ campesino natural\",c:\"L\u00e1cteos\",s:\"permitido\",r:\"El queso natural sin aditivos no contiene gluten.\"},\r\n{n:\"Yogur natural sin saborizar\",c:\"L\u00e1cteos\",s:\"permitido\",r:\"El yogur natural simple no contiene gluten; los saborizados deben verificarse.\"},\r\n{n:\"Aceite vegetal\",c:\"Condimentos\",s:\"permitido\",r:\"Los aceites puros no contienen gluten.\"},\r\n{n:\"Miel\",c:\"Condimentos\",s:\"permitido\",r:\"Naturalmente libre de gluten.\"},\r\n{n:\"Az\u00facar y panela\",c:\"Condimentos\",s:\"permitido\",r:\"Naturalmente libres de gluten.\"},\r\n{n:\"Sal\",c:\"Condimentos\",s:\"permitido\",r:\"No contiene gluten.\"},\r\n{n:\"Arepa de ma\u00edz casera\",c:\"Snacks y procesados\",s:\"permitido\",r:\"Hecha en casa con harina de ma\u00edz y agua, sin mezclas de trigo.\"},\r\n{n:\"Maicena (almid\u00f3n de ma\u00edz puro)\",c:\"Cereales y harinas\",s:\"verificar\",r:\"El almid\u00f3n de ma\u00edz no tiene gluten, pero conviene confirmar que la marca no procese tambi\u00e9n trigo en la misma l\u00ednea.\"},\r\n{n:\"Avena certificada sin gluten\",c:\"Cereales y harinas\",s:\"permitido\",r:\"La avena en s\u00ed no tiene gluten, pero solo es segura si est\u00e1 certificada \\\"sin gluten\\\" (sin contaminaci\u00f3n cruzada).\"},\r\n{n:\"Caf\u00e9 y t\u00e9 puros\",c:\"Bebidas\",s:\"permitido\",r:\"Las infusiones puras no contienen gluten.\"},\r\n{n:\"Agua, jugos naturales sin aditivos\",c:\"Bebidas\",s:\"permitido\",r:\"No contienen gluten en su forma natural.\"},\r\n\r\n\/\/ VERIFICAR \/ RIESGO\r\n{n:\"Avena comercial sin certificaci\u00f3n\",c:\"Cereales y harinas\",s:\"verificar\",r:\"La avena suele cultivarse y procesarse junto a trigo, cebada o centeno, generando contaminaci\u00f3n cruzada frecuente. Solo es segura si dice \\\"sin gluten\\\" certificado.\"},\r\n{n:\"Embutidos (salchicha, mortadela, chorizo)\",c:\"Prote\u00ednas\",s:\"verificar\",r:\"Algunos embutidos usan almidones o rellenos con trigo como espesante o conservante. Revisa la etiqueta de ingredientes.\"},\r\n{n:\"Caldos concentrados en cubo\",c:\"Condimentos\",s:\"verificar\",r:\"Suelen llevar harina de trigo como espesante o saborizantes derivados del trigo.\"},\r\n{n:\"Salsas listas (BBQ, mostaza, mayonesa industrial)\",c:\"Condimentos\",s:\"verificar\",r:\"Pueden contener trigo como espesante o saborizante; revisa siempre el listado de ingredientes.\"},\r\n{n:\"Salsa de soya tradicional\",c:\"Condimentos\",s:\"prohibido\",r:\"La salsa de soya tradicional se elabora fermentando trigo junto con soya. Busca versiones \\\"tamari\\\" certificadas sin gluten.\"},\r\n{n:\"Chocolates de mesa \/ golosinas\",c:\"Snacks y procesados\",s:\"verificar\",r:\"Algunos chocolates usan trazas de trigo como espesante o se fabrican en l\u00edneas compartidas con productos de trigo.\"},\r\n{n:\"Helados industriales\",c:\"Snacks y procesados\",s:\"verificar\",r:\"Algunos rellenos (galleta, barquillo, salsas) contienen gluten; revisa sabor por sabor.\"},\r\n{n:\"Papas fritas de paquete saborizadas\",c:\"Snacks y procesados\",s:\"verificar\",r:\"El saborizante en polvo puede contener trigo o derivados de malta.\"},\r\n{n:\"Arepas empacadas comerciales\",c:\"Snacks y procesados\",s:\"verificar\",r:\"Algunas marcas mezclan harina de trigo con la de ma\u00edz para mejorar textura; revisa siempre la lista de ingredientes.\"},\r\n{n:\"Quesos untables o procesados\",c:\"L\u00e1cteos\",s:\"verificar\",r:\"Algunos quesos procesados usan espesantes que pueden derivar de trigo.\"},\r\n{n:\"Vinagre de malta\",c:\"Condimentos\",s:\"prohibido\",r:\"El vinagre de malta se obtiene de cebada y mantiene prote\u00ednas de gluten.\"},\r\n{n:\"Medicamentos en jarabe o tabletas\",c:\"Otros\",s:\"verificar\",r:\"Algunos excipientes farmac\u00e9uticos usan almid\u00f3n de trigo. Consulta con tu farmac\u00e9utico o m\u00e9dico sobre presentaciones libres de gluten.\"},\r\n{n:\"Colorantes y espesantes industriales (almid\u00f3n modificado)\",c:\"Condimentos\",s:\"verificar\",r:\"El \\\"almid\u00f3n modificado\\\" puede provenir de trigo o de ma\u00edz; si no se especifica el origen, conviene verificar con el fabricante.\"},\r\n\r\n\/\/ PROHIBIDOS\r\n{n:\"Trigo y harina de trigo\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"El trigo contiene gliadina, una de las prote\u00ednas del gluten que da\u00f1a el intestino en la enfermedad cel\u00edaca.\"},\r\n{n:\"Pan de trigo \/ pan de molde\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Elaborado con harina de trigo, contiene gluten.\"},\r\n{n:\"Pasta tradicional de trigo\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Elaborada con s\u00e9mola de trigo.\"},\r\n{n:\"Cebada\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Contiene horde\u00edna, una prote\u00edna del grupo del gluten.\"},\r\n{n:\"Centeno\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Contiene secalina, prote\u00edna del grupo del gluten.\"},\r\n{n:\"Espelta\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Es una variedad antigua de trigo; contiene gluten.\"},\r\n{n:\"Triticale\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Es un h\u00edbrido de trigo y centeno; contiene gluten.\"},\r\n{n:\"Cerveza com\u00fan (de cebada)\",c:\"Bebidas\",s:\"prohibido\",r:\"Elaborada a partir de cebada malteada, contiene gluten.\"},\r\n{n:\"Galletas y pasteler\u00eda de trigo\",c:\"Snacks y procesados\",s:\"prohibido\",r:\"Elaboradas con harina de trigo.\"},\r\n{n:\"S\u00e9mola y cusc\u00fas\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Derivados directos del trigo.\"},\r\n{n:\"Seit\u00e1n\",c:\"Prote\u00ednas\",s:\"prohibido\",r:\"El seit\u00e1n es gluten de trigo puro, concentrado; es de las fuentes m\u00e1s altas de gluten que existen.\"},\r\n{n:\"Malta de cebada y extracto de malta\",c:\"Condimentos\",s:\"prohibido\",r:\"Derivado de cebada germinada; contiene gluten.\"},\r\n{n:\"Tortillas de harina de trigo\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Elaboradas con harina de trigo, a diferencia de la tortilla de ma\u00edz.\"},\r\n{n:\"Pan \u00e1rabe \/ pan pita\",c:\"Cereales y harinas\",s:\"prohibido\",r:\"Elaborado tradicionalmente con harina de trigo.\"},\r\n];\r\n\r\nconst CATEGORIES = [\"Frutas\",\"Verduras y tub\u00e9rculos\",\"Prote\u00ednas\",\"L\u00e1cteos\",\"Cereales y harinas\",\"Snacks y procesados\",\"Condimentos\",\"Bebidas\",\"Otros\"];\r\n\r\nfunction normalize(s){\r\n  return s.toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\");\r\n}\r\n\r\n\/* =========================================================\r\n   INDEXEDDB - registros locales del usuario\r\n========================================================= *\/\r\nlet db;\r\nconst DB_NAME = \"celiaco_db\";\r\nconst DB_VERSION = 1;\r\nconst STORES = [\"sintomas\",\"comidas\",\"exposiciones\",\"citas\",\"compras_estado\"];\r\n\r\nfunction openDB(){\r\n  return new Promise((resolve,reject)=>{\r\n    const req = indexedDB.open(DB_NAME, DB_VERSION);\r\n    req.onupgradeneeded = (e)=>{\r\n      const _db = e.target.result;\r\n      STORES.forEach(name=>{\r\n        if(!_db.objectStoreNames.contains(name)){\r\n          _db.createObjectStore(name,{keyPath:\"id\", autoIncrement:true});\r\n        }\r\n      });\r\n    };\r\n    req.onsuccess = (e)=>{ db = e.target.result; resolve(db); };\r\n    req.onerror = (e)=>{ console.warn(\"IndexedDB no disponible, usando memoria local:\", e); resolve(null); };\r\n  });\r\n}\r\n\r\n\/\/ Fallback en memoria si IndexedDB no est\u00e1 disponible (ej. vista previa sandbox)\r\nconst memStore = { sintomas:[], comidas:[], exposiciones:[], citas:[], compras_estado:[] };\r\nlet memId = 1;\r\n\r\nfunction dbAdd(store, obj){\r\n  return new Promise((resolve)=>{\r\n    if(!db){ obj.id = memId++; memStore[store].push(obj); resolve(obj); return; }\r\n    const tx = db.transaction(store,\"readwrite\");\r\n    const req = tx.objectStore(store).add(obj);\r\n    req.onsuccess = ()=>{ obj.id = req.result; resolve(obj); };\r\n    req.onerror = ()=>resolve(null);\r\n  });\r\n}\r\nfunction dbGetAll(store){\r\n  return new Promise((resolve)=>{\r\n    if(!db){ resolve([...memStore[store]].reverse()); return; }\r\n    const tx = db.transaction(store,\"readonly\");\r\n    const req = tx.objectStore(store).getAll();\r\n    req.onsuccess = ()=>resolve((req.result||[]).reverse());\r\n    req.onerror = ()=>resolve([]);\r\n  });\r\n}\r\nfunction dbDelete(store, id){\r\n  return new Promise((resolve)=>{\r\n    if(!db){ memStore[store] = memStore[store].filter(x=>x.id!==id); resolve(); return; }\r\n    const tx = db.transaction(store,\"readwrite\");\r\n    tx.objectStore(store).delete(id);\r\n    tx.oncomplete = ()=>resolve();\r\n  });\r\n}\r\n\r\n\/* =========================================================\r\n   NAVEGACI\u00d3N\r\n========================================================= *\/\r\nconst screens = document.querySelectorAll(\".screen\");\r\nconst navButtons = document.querySelectorAll(\"nav.bottomnav button\");\r\nconst overlay = document.getElementById(\"overlay\");\r\nconst sheetMenu = document.getElementById(\"sheet-menu\");\r\nconst sheetForm = document.getElementById(\"sheet-form\");\r\nconst fab = document.getElementById(\"fab-add\");\r\n\r\nfunction closeSheets(){\r\n  overlay.classList.remove(\"show\");\r\n  sheetMenu.classList.remove(\"show\");\r\n  sheetForm.classList.remove(\"show\");\r\n}\r\noverlay.addEventListener(\"click\", closeSheets);\r\ndocument.querySelectorAll(\"[data-close]\").forEach(b=>b.addEventListener(\"click\", closeSheets));\r\ndocument.getElementById(\"btn-menu\").addEventListener(\"click\", ()=>{\r\n  overlay.classList.add(\"show\"); sheetMenu.classList.add(\"show\");\r\n});\r\n\r\nfunction goScreen(name){\r\n  if(name === \"menu-mas\"){ overlay.classList.add(\"show\"); sheetMenu.classList.add(\"show\"); return; }\r\n  closeSheets();\r\n  screens.forEach(s=>s.classList.toggle(\"active\", s.id === \"screen-\"+name));\r\n  navButtons.forEach(b=>b.classList.toggle(\"active\", b.dataset.go === name));\r\n  fab.classList.toggle(\"show\", name === \"seguimiento\");\r\n  document.querySelector(\"main\").scrollTo(0,0);\r\n}\r\ndocument.querySelectorAll(\"[data-go]\").forEach(el=>{\r\n  el.addEventListener(\"click\", ()=> goScreen(el.dataset.go));\r\n});\r\n\r\nfunction toast(msg){\r\n  const t = document.getElementById(\"toast\");\r\n  t.textContent = msg;\r\n  t.classList.add(\"show\");\r\n  setTimeout(()=>t.classList.remove(\"show\"), 1800);\r\n}\r\n\r\n\/* =========================================================\r\n   EDUCACI\u00d3N\r\n========================================================= *\/\r\nconst EDU = [\r\n{t:\"\u00bfQu\u00e9 es la enfermedad cel\u00edaca?\", h:`Es una enfermedad autoinmune: cuando una persona con predisposici\u00f3n gen\u00e9tica consume gluten, su sistema de defensas ataca por error el revestimiento del intestino delgado. Esto da\u00f1a las vellosidades intestinales, encargadas de absorber los nutrientes.<br><br>No es una alergia ni una intolerancia leve: es una condici\u00f3n que dura toda la vida y cuyo \u00fanico tratamiento eficaz hoy es una dieta estricta y permanente sin gluten.`},\r\n{t:\"\u00bfPor qu\u00e9 ocurre?\", h:`Aparece en personas con cierta predisposici\u00f3n gen\u00e9tica (genes HLA-DQ2 o HLA-DQ8), pero no basta con tener el gen: hace falta consumir gluten para que la enfermedad se active. Puede manifestarse en la infancia o en la edad adulta, a veces despu\u00e9s de un evento como una infecci\u00f3n, cirug\u00eda, embarazo o estr\u00e9s importante.`},\r\n{t:\"Cel\u00edaca vs. sensibilidad al gluten vs. alergia al trigo\", h:`Son tres condiciones distintas que se confunden con frecuencia:<ul>\r\n<li><b>Enfermedad cel\u00edaca:<\/b> reacci\u00f3n autoinmune que da\u00f1a el intestino. Se diagnostica con anticuerpos en sangre y biopsia. Requiere dieta sin gluten estricta de por vida.<\/li>\r\n<li><b>Sensibilidad al gluten no cel\u00edaca:<\/b> causa s\u00edntomas similares (hinchaz\u00f3n, dolor, cansancio) al comer gluten, pero sin el da\u00f1o intestinal ni los anticuerpos t\u00edpicos de la celiaqu\u00eda. Se diagnostica descartando las otras dos.<\/li>\r\n<li><b>Alergia al trigo:<\/b> es una respuesta del sistema inmune tipo al\u00e9rgico (puede incluir urticaria, dificultad respiratoria) espec\u00edficamente al trigo, no a la cebada o el centeno. Se diagnostica con pruebas de alergia.<\/li>\r\n<\/ul>`},\r\n{t:\"S\u00edntomas digestivos\", h:`<ul>\r\n<li>Diarrea cr\u00f3nica o estre\u00f1imiento<\/li>\r\n<li>Distensi\u00f3n e hinchaz\u00f3n abdominal<\/li>\r\n<li>Dolor abdominal recurrente<\/li>\r\n<li>Gases excesivos<\/li>\r\n<li>N\u00e1useas o v\u00f3mito<\/li>\r\n<li>P\u00e9rdida de peso no explicada<\/li>\r\n<\/ul>`},\r\n{t:\"S\u00edntomas extradigestivos\", h:`Muchas personas cel\u00edacas no tienen s\u00edntomas digestivos evidentes, sino:<ul>\r\n<li>Anemia por deficiencia de hierro que no mejora con suplementos<\/li>\r\n<li>Cansancio persistente<\/li>\r\n<li>Dolor en huesos o articulaciones<\/li>\r\n<li>Dermatitis herpetiforme (erupci\u00f3n en la piel con picaz\u00f3n intensa)<\/li>\r\n<li>Dolores de cabeza frecuentes<\/li>\r\n<li>Irregularidades menstruales o problemas de fertilidad<\/li>\r\n<li>Retraso en el crecimiento en ni\u00f1os<\/li>\r\n<li>Cambios de \u00e1nimo, irritabilidad o ansiedad<\/li>\r\n<\/ul>`},\r\n{t:\"\u00bfQu\u00e9 pasa si no se sigue la dieta?\", h:`Seguir consumiendo gluten, aunque sea en peque\u00f1as cantidades, mantiene el da\u00f1o intestinal activo y puede llevar a:<ul>\r\n<li>Mala absorci\u00f3n de hierro, calcio, vitaminas (anemia, osteoporosis)<\/li>\r\n<li>Infertilidad o complicaciones en el embarazo<\/li>\r\n<li>Mayor riesgo de otras enfermedades autoinmunes (tiroides, diabetes tipo 1)<\/li>\r\n<li>Mayor riesgo de ciertos tipos de c\u00e1ncer intestinal a largo plazo<\/li>\r\n<li>En ni\u00f1os, retraso en el crecimiento y el desarrollo<\/li>\r\n<\/ul>Por eso la adherencia estricta a la dieta sin gluten es la base del tratamiento.`},\r\n{t:\"\u00bfC\u00f3mo se diagnostica?\", h:`El diagn\u00f3stico lo hace un m\u00e9dico, generalmente un gastroenter\u00f3logo, con:<ul>\r\n<li>An\u00e1lisis de sangre de anticuerpos espec\u00edficos (como anti-transglutaminasa IgA)<\/li>\r\n<li>Biopsia del intestino delgado, que confirma el da\u00f1o en las vellosidades<\/li>\r\n<li>En algunos casos, estudio gen\u00e9tico (HLA-DQ2\/DQ8) como apoyo<\/li>\r\n<\/ul><b>Importante:<\/b> estos estudios deben hacerse mientras la persona todav\u00eda est\u00e1 consumiendo gluten. Retirar el gluten antes del diagn\u00f3stico puede hacer que los resultados salgan falsamente negativos.`},\r\n{t:\"Importancia del seguimiento m\u00e9dico y nutricional\", h:`Una vez diagnosticada, la persona cel\u00edaca debe tener seguimiento peri\u00f3dico con:<ul>\r\n<li><b>Gastroenterolog\u00eda:<\/b> para confirmar que el intestino se est\u00e1 recuperando y vigilar otras complicaciones.<\/li>\r\n<li><b>Nutrici\u00f3n cl\u00ednica:<\/b> para asegurar una dieta sin gluten balanceada, sin d\u00e9ficits de fibra, hierro, calcio o vitaminas del grupo B.<\/li>\r\n<li><b>Laboratorios peri\u00f3dicos:<\/b> control de anticuerpos, hierro, vitamina D, calcio y funci\u00f3n tiroidea.<\/li>\r\n<\/ul>Esta app te puede ayudar a llevar el registro de tus citas y s\u00edntomas, pero no reemplaza estas consultas.`},\r\n];\r\n\r\nfunction renderAccordion(container, items){\r\n  container.innerHTML = items.map((it,i)=>`\r\n    <div class=\"accordion-item\" data-idx=\"${i}\">\r\n      <button class=\"accordion-head\">${it.t}<span class=\"chev\">\u25be<\/span><\/button>\r\n      <div class=\"accordion-body\"><div class=\"accordion-body-inner\">${it.h}<\/div><\/div>\r\n    <\/div>`).join(\"\");\r\n  container.querySelectorAll(\".accordion-item\").forEach(item=>{\r\n    item.querySelector(\".accordion-head\").addEventListener(\"click\", ()=>{\r\n      item.classList.toggle(\"open\");\r\n    });\r\n  });\r\n}\r\nrenderAccordion(document.getElementById(\"edu-accordion\"), EDU);\r\n\r\n\/* =========================================================\r\n   BUSCADOR\r\n========================================================= *\/\r\nconst searchInput = document.getElementById(\"search-input\");\r\nconst searchResults = document.getElementById(\"search-results\");\r\n\r\nfunction stampHTML(status){\r\n  if(status===\"permitido\") return `<span class=\"stamp ok\"><span class=\"stamp-dot\"><\/span>Permitido<\/span>`;\r\n  if(status===\"prohibido\") return `<span class=\"stamp bad\"><span class=\"stamp-dot\"><\/span>Prohibido<\/span>`;\r\n  return `<span class=\"stamp warn\"><span class=\"stamp-dot\"><\/span>Verificar<\/span>`;\r\n}\r\n\r\nfunction renderFoodResults(list){\r\n  if(list.length===0){\r\n    searchResults.innerHTML = `<div class=\"empty-hint\">No encontramos ese alimento en nuestra base local.<br>Si tiene empaque, revisa la etiqueta de ingredientes o usa el lector de etiquetas.<\/div>`;\r\n    return;\r\n  }\r\n  searchResults.innerHTML = list.map(f=>`\r\n    <div class=\"result-item\">\r\n      <div class=\"rh\"><b>${f.n}<\/b>${stampHTML(f.s)}<\/div>\r\n      <div class=\"rr\">${f.r}<\/div>\r\n    <\/div>`).join(\"\");\r\n}\r\nsearchInput.addEventListener(\"input\", ()=>{\r\n  const q = normalize(searchInput.value.trim());\r\n  if(q.length===0){ searchResults.innerHTML = `<div class=\"empty-hint\">Escribe el nombre de un alimento, por ejemplo \"avena\" o \"salsa de soya\".<\/div>`; return; }\r\n  const list = FOODS.filter(f=> normalize(f.n).includes(q) || normalize(f.c).includes(q));\r\n  renderFoodResults(list);\r\n});\r\nsearchResults.innerHTML = `<div class=\"empty-hint\">Escribe el nombre de un alimento, por ejemplo \"avena\" o \"salsa de soya\".<\/div>`;\r\n\r\n\/* =========================================================\r\n   GU\u00cdA DE ALIMENTOS\r\n========================================================= *\/\r\nlet guiaStatus = \"permitido\";\r\nfunction renderGuia(){\r\n  const grid = document.getElementById(\"guia-grid\");\r\n  const list = FOODS.filter(f=>f.s===guiaStatus);\r\n  grid.innerHTML = list.map(f=>`<div class=\"food-pill\">${stampHTML(f.s).replace(\/Permitido|Verificar|Prohibido\/, \"\")}${f.n}<\/div>`).join(\"\");\r\n}\r\ndocument.querySelectorAll(\"#guia-tabs button\").forEach(b=>{\r\n  b.addEventListener(\"click\", ()=>{\r\n    document.querySelectorAll(\"#guia-tabs button\").forEach(x=>x.classList.remove(\"active\"));\r\n    b.classList.add(\"active\");\r\n    guiaStatus = b.dataset.status;\r\n    renderGuia();\r\n  });\r\n});\r\nrenderGuia();\r\n\r\nconst GLOSARIO = [\r\n{n:\"Trigo (incluye espelta, triticale)\",d:\"Contiene gliadina. Prohibido.\"},\r\n{n:\"Avena\",d:\"No tiene gluten en s\u00ed, pero se contamina con frecuencia al cultivarse o procesarse junto a trigo. Solo segura si est\u00e1 certificada \\\"sin gluten\\\".\"},\r\n{n:\"Cebada\",d:\"Contiene horde\u00edna. Prohibido. Presente en cerveza y malta.\"},\r\n{n:\"Centeno\",d:\"Contiene secalina. Prohibido.\"},\r\n];\r\ndocument.getElementById(\"glosario\").innerHTML = GLOSARIO.map(g=>`\r\n  <div class=\"result-item\"><div class=\"rh\"><b>${g.n}<\/b><\/div><div class=\"rr\">${g.d}<\/div><\/div>`).join(\"\");\r\n\r\nconst EJEMPLOS = [\r\n{m:\"Desayuno\",e:\"Arepa de ma\u00edz casera + huevo + queso fresco + jugo natural\"},\r\n{m:\"Almuerzo\",e:\"Arroz, frijoles, pollo a la plancha, ensalada fresca y patac\u00f3n natural\"},\r\n{m:\"Cena\",e:\"Sopa de verduras con papa y carne, sin caldo en cubo industrial\"},\r\n{m:\"Snack\",e:\"Fruta fresca con yogur natural, o man\u00ed\/ma\u00edz tostado natural sin saborizantes\"},\r\n];\r\ndocument.getElementById(\"ejemplos-comidas\").innerHTML = EJEMPLOS.map(e=>`\r\n  <div class=\"meal-row\" style=\"border-top:1px dashed var(--line);padding:10px 0;\"><span class=\"ml\">${e.m}<\/span><span>${e.e}<\/span><\/div>`).join(\"\");\r\n\r\n\/* =========================================================\r\n   ETIQUETAS\r\n========================================================= *\/\r\nconst ETIQUETAS = [\r\n{t:\"\u00bfQu\u00e9 buscar en la lista de ingredientes?\", h:`Lee siempre el listado completo de ingredientes, no solo el frente del empaque. Busca palabras como: trigo, harina de trigo, cebada, malta, extracto de malta, centeno, espelta, triticale, s\u00e9mola, cusc\u00fas, almid\u00f3n de trigo, prote\u00edna vegetal hidrolizada (si no especifica origen), salsa de soya (si no dice \"sin gluten\" o \"tamari\").`},\r\n{t:\"\\\"Sin gluten\\\" certificado\", h:`Este sello significa que el producto fue analizado y contiene menos de 20 ppm (partes por mill\u00f3n) de gluten, el l\u00edmite considerado seguro internacionalmente. Es la opci\u00f3n m\u00e1s confiable.`},\r\n{t:\"\\\"Puede contener trazas de gluten\\\"\", h:`Indica que, aunque el producto no lleva gluten como ingrediente, pudo haber contacto accidental durante la fabricaci\u00f3n (por ejemplo, compartir una l\u00ednea de producci\u00f3n con harina de trigo). Para cel\u00edacos, esta leyenda generalmente significa <b>evitar el producto<\/b>, salvo que tu m\u00e9dico\/nutricionista indique lo contrario seg\u00fan tu sensibilidad individual.`},\r\n{t:\"\\\"Procesado en instalaciones que tambi\u00e9n procesan trigo\\\"\", h:`Es una alerta de contaminaci\u00f3n cruzada en la planta, aunque el producto en s\u00ed no tenga trigo como ingrediente. Se recomienda precauci\u00f3n y, si es posible, elegir otra marca con certificaci\u00f3n \"sin gluten\".`},\r\n{t:\"Contaminaci\u00f3n cruzada en el hogar\", h:`No solo importa lo que dice la etiqueta: tambi\u00e9n el manejo en la cocina. Usa tostadora, tabla de cortar, sartenes y utensilios exclusivos para alimentos sin gluten si en casa tambi\u00e9n se cocina con trigo. Evita reutilizar el mismo aceite de fre\u00edr.`},\r\n{t:\"Ingredientes con nombres poco claros\", h:`Algunos ingredientes pueden esconder gluten bajo nombres t\u00e9cnicos: \"almid\u00f3n modificado\" (si no aclara que es de ma\u00edz), \"prote\u00edna vegetal hidrolizada\", \"saborizante natural\" (rara vez, pero puede derivar de cebada). Ante la duda, contacta al fabricante o elige otra marca certificada.`},\r\n];\r\nrenderAccordion(document.getElementById(\"etiquetas-content\"), ETIQUETAS);\r\n\r\n\/* =========================================================\r\n   PLANIFICADOR DE COMIDAS\r\n========================================================= *\/\r\nconst MEAL_POOLS = {\r\n  Desayuno:[\"Arepa de ma\u00edz con huevo y queso fresco\",\"Yogur natural con fruta picada y ma\u00edz tostado\",\"Huevos revueltos con arepa y jugo natural\",\"Avena certificada sin gluten con leche y pl\u00e1tano\",\"Tortilla de huevo con papa y queso\"],\r\n  Almuerzo:[\"Arroz, lentejas, carne asada y ensalada\",\"Pollo a la plancha con yuca y verduras salteadas\",\"Pescado al horno con arroz y patac\u00f3n natural\",\"Sopa de papa con carne y arroz\",\"Frijoles con arroz, pl\u00e1tano maduro y aguacate\"],\r\n  Cena:[\"Sopa de verduras con pollo desmechado\",\"Tortilla de papa con ensalada fresca\",\"Arroz con huevo frito y aguacate\",\"Caldo de costilla con papa y arroz\",\"Crema de zapallo casera con queso fresco\"],\r\n  Snack:[\"Fruta fresca de temporada\",\"Man\u00ed o ma\u00edz tostado natural\",\"Queso fresco con galletas de arroz\",\"Yogur natural con miel\",\"Batido de fruta con leche\"],\r\n};\r\nconst DAYS = [\"Lunes\",\"Martes\",\"Mi\u00e9rcoles\",\"Jueves\",\"Viernes\",\"S\u00e1bado\",\"Domingo\"];\r\n\r\nfunction pick(arr){ return arr[Math.floor(Math.random()*arr.length)]; }\r\n\r\nfunction generateMenu(){\r\n  return DAYS.map(d=>({\r\n    day:d,\r\n    Desayuno:pick(MEAL_POOLS.Desayuno),\r\n    Almuerzo:pick(MEAL_POOLS.Almuerzo),\r\n    Cena:pick(MEAL_POOLS.Cena),\r\n    Snack:pick(MEAL_POOLS.Snack),\r\n  }));\r\n}\r\nlet currentMenu = generateMenu();\r\n\r\nfunction renderMenu(){\r\n  document.getElementById(\"menu-days\").innerHTML = currentMenu.map(d=>`\r\n    <div class=\"day-card\">\r\n      <h4>${d.day}<\/h4>\r\n      <div class=\"meal-row\"><span class=\"ml\">Desayuno<\/span><span>${d.Desayuno}<\/span><\/div>\r\n      <div class=\"meal-row\"><span class=\"ml\">Almuerzo<\/span><span>${d.Almuerzo}<\/span><\/div>\r\n      <div class=\"meal-row\"><span class=\"ml\">Cena<\/span><span>${d.Cena}<\/span><\/div>\r\n      <div class=\"meal-row\"><span class=\"ml\">Snack<\/span><span>${d.Snack}<\/span><\/div>\r\n    <\/div>`).join(\"\");\r\n}\r\ndocument.getElementById(\"btn-regen-menu\").addEventListener(\"click\", ()=>{\r\n  currentMenu = generateMenu();\r\n  renderMenu();\r\n  toast(\"Nuevo men\u00fa generado\");\r\n});\r\nrenderMenu();\r\n\r\nconst RECIPES = [\r\n{t:\"Arepas de ma\u00edz rellenas\", time:\"20 min\", cost:\"Econ\u00f3mica\", ing:[\"2 tazas de harina de ma\u00edz precocida certificada sin gluten\",\"2 \u00bd tazas de agua tibia\",\"1 cdita de sal\",\"Queso fresco al gusto\"], steps:[\"Mezcla la harina con el agua y la sal hasta formar una masa suave.\",\"Forma bolitas y apl\u00e1nalas en discos.\",\"Cocina en sart\u00e9n o plancha caliente por 5-6 minutos de cada lado.\",\"Abre y rellena con queso fresco.\"]},\r\n{t:\"Arroz con pollo y verduras\", time:\"35 min\", cost:\"Econ\u00f3mica\", ing:[\"1 taza de arroz\",\"1 pechuga de pollo en trozos\",\"1 zanahoria picada\",\"1\/2 taza de arveja\",\"Sal y aceite al gusto\"], steps:[\"Sofr\u00ede el pollo en aceite hasta dorar.\",\"Agrega las verduras y sofr\u00ede 3 minutos.\",\"A\u00f1ade el arroz, sal y el doble de agua.\",\"Cocina tapado a fuego bajo hasta que el arroz est\u00e9 listo.\"]},\r\n{t:\"Sopa de papa criolla\", time:\"30 min\", cost:\"Econ\u00f3mica\", ing:[\"4 papas criollas\",\"1 papa pastusa\",\"1\/2 taza de leche\",\"Cilantro y cebolla\",\"Sal al gusto\"], steps:[\"Cocina las papas en agua con sal hasta ablandar.\",\"Machaca parte de la papa criolla para espesar.\",\"Agrega la leche y deja hervir 5 minutos.\",\"Sirve con cilantro picado.\"]},\r\n{t:\"Tortilla de papa y huevo\", time:\"25 min\", cost:\"Econ\u00f3mica\", ing:[\"3 papas medianas\",\"4 huevos\",\"Sal y aceite\"], steps:[\"Corta las papas en l\u00e1minas finas y fr\u00edelas a fuego bajo.\",\"Bate los huevos con sal.\",\"Mezcla las papas con el huevo batido.\",\"Cocina en sart\u00e9n por ambos lados hasta dorar.\"]},\r\n{t:\"Pollo al horno con yuca\", time:\"50 min\", cost:\"Media\", ing:[\"4 presas de pollo\",\"2 yucas medianas\",\"Ajo, sal, comino, aceite\"], steps:[\"Sazona el pollo con ajo, sal y comino.\",\"Corta la yuca en trozos y cocina 10 minutos en agua.\",\"Coloca pollo y yuca en una bandeja con aceite.\",\"Hornea a 200\u00b0C por 35-40 minutos.\"]},\r\n{t:\"Batido energ\u00e9tico de pl\u00e1tano\", time:\"5 min\", cost:\"Econ\u00f3mica\", ing:[\"1 pl\u00e1tano maduro\",\"1 taza de leche o bebida vegetal\",\"Hielo al gusto\"], steps:[\"Lic\u00faa todos los ingredientes hasta obtener una mezcla homog\u00e9nea.\",\"Sirve fr\u00edo.\"]},\r\n];\r\ndocument.getElementById(\"planner-recetas\").innerHTML = RECIPES.map(r=>`\r\n  <div class=\"recipe-card\">\r\n    <div class=\"rtitle\">${r.t}<\/div>\r\n    <div class=\"recipe-tags\"><span class=\"tag\">\u23f1 ${r.time}<\/span><span class=\"tag\">${r.cost}<\/span><span class=\"tag\">Sin gluten<\/span><\/div>\r\n    <h5>Ingredientes<\/h5>\r\n    <ul>${r.ing.map(i=>`<li>${i}<\/li>`).join(\"\")}<\/ul>\r\n    <h5>Preparaci\u00f3n<\/h5>\r\n    <ol>${r.steps.map(s=>`<li>${s}<\/li>`).join(\"\")}<\/ol>\r\n  <\/div>`).join(\"\");\r\n\r\ndocument.querySelectorAll('[data-ptab]').forEach(b=>{\r\n  b.addEventListener(\"click\", ()=>{\r\n    document.querySelectorAll('[data-ptab]').forEach(x=>x.classList.remove(\"active\"));\r\n    b.classList.add(\"active\");\r\n    document.getElementById(\"planner-menu\").style.display = b.dataset.ptab===\"menu\" ? \"block\":\"none\";\r\n    document.getElementById(\"planner-recetas\").style.display = b.dataset.ptab===\"recetas\" ? \"block\":\"none\";\r\n  });\r\n});\r\n\r\n\/* =========================================================\r\n   LISTA DE COMPRAS\r\n========================================================= *\/\r\nconst checkedItems = new Set();\r\nfunction renderCompras(){\r\n  const safeFoods = FOODS.filter(f=>f.s===\"permitido\");\r\n  const byCat = {};\r\n  safeFoods.forEach(f=>{ (byCat[f.c] = byCat[f.c]||[]).push(f); });\r\n  const container = document.getElementById(\"compras-list\");\r\n  container.innerHTML = Object.keys(byCat).map(cat=>`\r\n    <div class=\"shop-cat\">\r\n      <h4>${cat}<\/h4>\r\n      ${byCat[cat].map(f=>{\r\n        const cid = \"c_\"+normalize(f.n).replace(\/\\W+\/g,\"_\");\r\n        const checked = checkedItems.has(cid);\r\n        return `<div class=\"shop-item ${checked?'checked':''}\" data-id=\"${cid}\">\r\n          <input type=\"checkbox\" ${checked?'checked':''}>\r\n          <label>${f.n}<\/label>\r\n        <\/div>`;\r\n      }).join(\"\")}\r\n    <\/div>`).join(\"\");\r\n  container.querySelectorAll(\".shop-item\").forEach(item=>{\r\n    item.querySelector(\"input\").addEventListener(\"change\", (e)=>{\r\n      const id = item.dataset.id;\r\n      if(e.target.checked){ checkedItems.add(id); item.classList.add(\"checked\"); }\r\n      else { checkedItems.delete(id); item.classList.remove(\"checked\"); }\r\n    });\r\n  });\r\n}\r\ndocument.getElementById(\"btn-reset-compras\").addEventListener(\"click\", ()=>{\r\n  checkedItems.clear(); renderCompras(); toast(\"Lista reiniciada\");\r\n});\r\nrenderCompras();\r\n\r\n\/* =========================================================\r\n   CONSEJOS\r\n========================================================= *\/\r\nconst CONSEJOS = [\r\n{t:\"C\u00f3mo comer fuera de casa\", h:`<ul>\r\n<li>Investiga el restaurante antes de ir, si es posible.<\/li>\r\n<li>Pide hablar con el chef o el encargado de cocina, no solo con el mesero.<\/li>\r\n<li>Prefiere preparaciones simples: a la plancha, al horno, sin salsas ni empanizados.<\/li>\r\n<li>Usa la \"Tarjeta para el mesero\" de esta app si necesitas explicar tu condici\u00f3n.<\/li>\r\n<\/ul>`},\r\n{t:\"Evitar contaminaci\u00f3n cruzada en la cocina\", h:`<ul>\r\n<li>Usa tabla de cortar, sartenes y utensilios exclusivos si en casa tambi\u00e9n hay gluten.<\/li>\r\n<li>No uses el mismo aceite de fre\u00edr para alimentos con y sin gluten.<\/li>\r\n<li>Guarda tus alimentos sin gluten en la parte alta de la alacena, separados.<\/li>\r\n<li>Lava bien superficies antes de preparar tu comida.<\/li>\r\n<li>Evita compartir mantequilla, mermeladas o untables donde puedan caer migas de pan con gluten.<\/li>\r\n<\/ul>`},\r\n{t:\"Qu\u00e9 preguntar en restaurantes\", h:`<ul>\r\n<li>\u00bfEl plato lleva harina de trigo, salsa de soya o caldo en cubo?<\/li>\r\n<li>\u00bfSe fr\u00ede en el mismo aceite que productos empanizados?<\/li>\r\n<li>\u00bfLa plancha se limpia entre preparaciones?<\/li>\r\n<li>\u00bfTienen opciones certificadas sin gluten?<\/li>\r\n<\/ul>`},\r\n{t:\"En el colegio\", h:`<ul>\r\n<li>Informa por escrito a profesores y enfermer\u00eda sobre la condici\u00f3n.<\/li>\r\n<li>Env\u00eda snacks seguros para compartir en celebraciones.<\/li>\r\n<li>Coordina con el comedor escolar opciones sin gluten con anticipaci\u00f3n.<\/li>\r\n<\/ul>`},\r\n{t:\"En viajes\", h:`<ul>\r\n<li>Lleva snacks seguros para el camino.<\/li>\r\n<li>Aprende frases clave sobre gluten en el idioma del destino.<\/li>\r\n<li>Investiga supermercados o restaurantes con opciones certificadas en el lugar.<\/li>\r\n<li>Lleva contigo la tarjeta explicativa para el personal de cocina.<\/li>\r\n<\/ul>`},\r\n{t:\"En reuniones familiares y eventos sociales\", h:`<ul>\r\n<li>Ofrece llevar un plato sin gluten que puedas compartir con confianza.<\/li>\r\n<li>Come antes si no est\u00e1s seguro\/a de las opciones disponibles.<\/li>\r\n<li>No sientas pena de preguntar los ingredientes; tu salud es prioridad.<\/li>\r\n<\/ul>`},\r\n];\r\nrenderAccordion(document.getElementById(\"consejos-accordion\"), CONSEJOS);\r\n\r\n\/* =========================================================\r\n   SEGUIMIENTO\r\n========================================================= *\/\r\nlet currentSeg = \"citas\";\r\nconst SEG_LABELS = {\r\n  citas:{title:\"cita m\u00e9dica\", fields:[\r\n    {k:\"fecha\",l:\"Fecha\",type:\"date\"},\r\n    {k:\"tipo\",l:\"Tipo de cita\",type:\"select\",opts:[\"Gastroenterolog\u00eda\",\"Nutrici\u00f3n\",\"Control de laboratorio\",\"Otra\"]},\r\n    {k:\"notas\",l:\"Notas (lugar, m\u00e9dico, motivo)\",type:\"textarea\"},\r\n  ]},\r\n  sintomas:{title:\"s\u00edntoma\", fields:[\r\n    {k:\"fecha\",l:\"Fecha\",type:\"date\"},\r\n    {k:\"sintoma\",l:\"S\u00edntoma\",type:\"select\",opts:[\"Dolor abdominal\",\"Hinchaz\u00f3n\",\"Diarrea\",\"Estre\u00f1imiento\",\"Cansancio\",\"Dolor de cabeza\",\"Otro\"]},\r\n    {k:\"severidad\",l:\"Intensidad (1 leve - 5 fuerte)\",type:\"select\",opts:[\"1\",\"2\",\"3\",\"4\",\"5\"]},\r\n    {k:\"notas\",l:\"Notas\",type:\"textarea\"},\r\n  ]},\r\n  comidas:{title:\"comida\", fields:[\r\n    {k:\"fecha\",l:\"Fecha\",type:\"date\"},\r\n    {k:\"tipo\",l:\"Tipo de comida\",type:\"select\",opts:[\"Desayuno\",\"Almuerzo\",\"Cena\",\"Snack\"]},\r\n    {k:\"descripcion\",l:\"\u00bfQu\u00e9 comiste?\",type:\"textarea\"},\r\n  ]},\r\n  exposiciones:{title:\"exposici\u00f3n a gluten\", fields:[\r\n    {k:\"fecha\",l:\"Fecha\",type:\"date\"},\r\n    {k:\"descripcion\",l:\"\u00bfQu\u00e9 pas\u00f3? (alimento, lugar)\",type:\"textarea\"},\r\n    {k:\"reaccion\",l:\"\u00bfTuviste reacci\u00f3n\/s\u00edntomas?\",type:\"textarea\"},\r\n  ]},\r\n};\r\n\r\ndocument.querySelectorAll(\"#seg-tabs button\").forEach(b=>{\r\n  b.addEventListener(\"click\", ()=>{\r\n    document.querySelectorAll(\"#seg-tabs button\").forEach(x=>x.classList.remove(\"active\"));\r\n    b.classList.add(\"active\");\r\n    currentSeg = b.dataset.seg;\r\n    renderSegList();\r\n  });\r\n});\r\n\r\nasync function renderSegList(){\r\n  const list = await dbGetAll(currentSeg);\r\n  const container = document.getElementById(\"seg-list\");\r\n  if(list.length===0){\r\n    container.innerHTML = `<div class=\"empty-hint\">A\u00fan no tienes registros aqu\u00ed. Usa el bot\u00f3n \"+\" para agregar uno.<\/div>`;\r\n    return;\r\n  }\r\n  container.innerHTML = list.map(item=>{\r\n    let title=\"\", note=\"\";\r\n    if(currentSeg===\"citas\"){ title = item.tipo||\"Cita\"; note = item.notas||\"\"; }\r\n    if(currentSeg===\"sintomas\"){ title = item.sintoma + (item.severidad?` \u00b7 Intensidad ${item.severidad}`:\"\"); note = item.notas||\"\"; }\r\n    if(currentSeg===\"comidas\"){ title = item.tipo||\"Comida\"; note = item.descripcion||\"\"; }\r\n    if(currentSeg===\"exposiciones\"){ title = \"Exposici\u00f3n a gluten\"; note = (item.descripcion||\"\")+(item.reaccion?(\" \u2014 Reacci\u00f3n: \"+item.reaccion):\"\"); }\r\n    return `<div class=\"log-item\">\r\n      <div class=\"ld\">\r\n        <div class=\"ldate\">${item.fecha||\"\"}<\/div>\r\n        <div class=\"ltitle\">${title}<\/div>\r\n        ${note?`<div class=\"lnote\">${note}<\/div>`:\"\"}\r\n      <\/div>\r\n      <button class=\"del-btn\" data-id=\"${item.id}\">\u2715<\/button>\r\n    <\/div>`;\r\n  }).join(\"\");\r\n  container.querySelectorAll(\".del-btn\").forEach(btn=>{\r\n    btn.addEventListener(\"click\", async ()=>{\r\n      await dbDelete(currentSeg, parseInt(btn.dataset.id));\r\n      renderSegList();\r\n      toast(\"Registro eliminado\");\r\n    });\r\n  });\r\n}\r\n\r\nfunction openForm(){\r\n  const cfg = SEG_LABELS[currentSeg];\r\n  const fc = document.getElementById(\"form-content\");\r\n  fc.innerHTML = `<h2 class=\"section-title\">Agregar ${cfg.title}<\/h2>\r\n    <form id=\"dyn-form\">\r\n      ${cfg.fields.map(f=>{\r\n        if(f.type===\"select\"){\r\n          return `<div class=\"field\"><label>${f.l}<\/label><select name=\"${f.k}\">${f.opts.map(o=>`<option value=\"${o}\">${o}<\/option>`).join(\"\")}<\/select><\/div>`;\r\n        }\r\n        if(f.type===\"textarea\"){\r\n          return `<div class=\"field\"><label>${f.l}<\/label><textarea name=\"${f.k}\" placeholder=\"Opcional\"><\/textarea><\/div>`;\r\n        }\r\n        return `<div class=\"field\"><label>${f.l}<\/label><input type=\"${f.type}\" name=\"${f.k}\" value=\"${f.type==='date'?new Date().toISOString().slice(0,10):''}\"><\/div>`;\r\n      }).join(\"\")}\r\n      <button class=\"btn\" type=\"submit\">Guardar<\/button>\r\n    <\/form>`;\r\n  fc.querySelector(\"#dyn-form\").addEventListener(\"submit\", async (e)=>{\r\n    e.preventDefault();\r\n    const data = Object.fromEntries(new FormData(e.target).entries());\r\n    await dbAdd(currentSeg, data);\r\n    closeSheets();\r\n    renderSegList();\r\n    toast(\"Registro guardado\");\r\n  });\r\n  overlay.classList.add(\"show\");\r\n  sheetForm.classList.add(\"show\");\r\n}\r\nfab.addEventListener(\"click\", openForm);\r\nrenderSegList();\r\n\r\n\/* =========================================================\r\n   EXPORTAR CSV \/ PDF\r\n========================================================= *\/\r\nfunction toCSVRow(arr){\r\n  return arr.map(v=>`\"${String(v??\"\").replace(\/\"\/g,'\"\"')}\"`).join(\",\");\r\n}\r\nasync function buildExportData(){\r\n  const data = {};\r\n  for(const s of STORES.filter(x=>x!==\"compras_estado\")){\r\n    data[s] = await dbGetAll(s);\r\n  }\r\n  return data;\r\n}\r\ndocument.getElementById(\"btn-export-csv\").addEventListener(\"click\", async ()=>{\r\n  const data = await buildExportData();\r\n  let csv = \"\";\r\n  for(const store of Object.keys(data)){\r\n    csv += `\\n=== ${store.toUpperCase()} ===\\n`;\r\n    const rows = data[store];\r\n    if(rows.length===0){ csv += \"(sin registros)\\n\"; continue; }\r\n    const keys = Object.keys(rows[0]).filter(k=>k!==\"id\");\r\n    csv += toCSVRow(keys) + \"\\n\";\r\n    rows.forEach(r=> csv += toCSVRow(keys.map(k=>r[k])) + \"\\n\");\r\n  }\r\n  const blob = new Blob([csv], {type:\"text\/csv;charset=utf-8;\"});\r\n  const url = URL.createObjectURL(blob);\r\n  const a = document.createElement(\"a\");\r\n  a.href = url; a.download = \"mi_seguimiento_celiaco.csv\";\r\n  document.body.appendChild(a); a.click(); document.body.removeChild(a);\r\n  URL.revokeObjectURL(url);\r\n  toast(\"CSV descargado\");\r\n});\r\n\r\ndocument.getElementById(\"btn-export-pdf\").addEventListener(\"click\", async ()=>{\r\n  const data = await buildExportData();\r\n  const area = document.getElementById(\"print-area\");\r\n  let html = `<h1 style=\"font-family:sans-serif;\">Mi seguimiento \u2014 Vivir Sin Gluten<\/h1><p style=\"font-family:sans-serif;color:#555;\">Generado el ${new Date().toLocaleDateString()}<\/p>`;\r\n  const titles = {citas:\"Citas m\u00e9dicas\", sintomas:\"S\u00edntomas\", comidas:\"Registro de comidas\", exposiciones:\"Exposiciones a gluten\"};\r\n  for(const store of Object.keys(data)){\r\n    const rows = data[store];\r\n    html += `<h2 style=\"font-family:sans-serif;\">${titles[store]}<\/h2>`;\r\n    if(rows.length===0){ html += `<p style=\"font-family:sans-serif;\">Sin registros.<\/p>`; continue; }\r\n    const keys = Object.keys(rows[0]).filter(k=>k!==\"id\");\r\n    html += `<table><tr>${keys.map(k=>`<th>${k}<\/th>`).join(\"\")}<\/tr>`;\r\n    rows.forEach(r=> html += `<tr>${keys.map(k=>`<td>${(r[k]||\"\").toString().replace(\/<\/g,\"&lt;\")}<\/td>`).join(\"\")}<\/tr>`);\r\n    html += `<\/table>`;\r\n  }\r\n  area.innerHTML = html;\r\n  area.classList.add(\"show\");\r\n  window.print();\r\n  area.classList.remove(\"show\");\r\n});\r\n\r\n\/* =========================================================\r\n   INIT\r\n========================================================= *\/\r\nopenDB();\r\nif(!('indexedDB' in window)){\r\n  console.warn(\"Este navegador no soporta IndexedDB; se usar\u00e1 almacenamiento en memoria de la sesi\u00f3n.\");\r\n}\r\n\r\n\/\/ Registrar service worker solo si la app se sirve por http(s) (no funciona con file:\/\/)\r\nif('serviceWorker' in navigator && (location.protocol === 'https:' || location.hostname === 'localhost')){\r\n  window.addEventListener('load', ()=>{\r\n    navigator.serviceWorker.register('sw.js').catch(()=>{});\r\n  });\r\n}\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Vivir Sin Gluten SG Vivir Sin Gluten Gu\u00eda para cel\u00edacos \u00b7 Colombia y LatAm \u2630 Funciona sin conexi\u00f3n Hola, bienvenido\/a Todo lo que necesitas para vivir bien con enfermedad cel\u00edaca: alimentos, recetas, etiquetas y seguimiento, guardado en tu propio dispositivo. \u2695\ufe0f Esta app es una gu\u00eda educativa y no reemplaza la consulta m\u00e9dica. El diagn\u00f3stico<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-40822","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/pages\/40822","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/comments?post=40822"}],"version-history":[{"count":9,"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/pages\/40822\/revisions"}],"predecessor-version":[{"id":41068,"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/pages\/40822\/revisions\/41068"}],"wp:attachment":[{"href":"https:\/\/doctorcepeda.com.co\/index.php\/wp-json\/wp\/v2\/media?parent=40822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}