{"id":44864,"date":"2026-04-28T20:05:47","date_gmt":"2026-04-28T20:05:47","guid":{"rendered":"https:\/\/www.colegiobolivar.edu.co\/website\/?page_id=44864"},"modified":"2026-05-04T13:49:22","modified_gmt":"2026-05-04T13:49:22","slug":"menu-cocina-cris-2","status":"publish","type":"page","link":"https:\/\/www.colegiobolivar.edu.co\/website\/es\/menu-cocina-cris-2\/","title":{"rendered":"Men\u00fa Cocina Cris-GP"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"44864\" class=\"elementor elementor-44864\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ab077b2 elementor-section-height-min-height acordeon elementor-section-boxed elementor-section-height-default elementor-section-items-middle\" data-id=\"ab077b2\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\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-3e8e052\" data-id=\"3e8e052\" 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<div class=\"elementor-element elementor-element-f41931a e-flex e-con-boxed e-con e-parent\" data-id=\"f41931a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-39f4dca elementor-widget elementor-widget-html\" data-id=\"39f4dca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n  MEN\u00da CAFETER\u00cdA - Widget HTML para Elementor (Men\u00fa General + Men\u00fa El Nido)\r\n  =========================================================================\r\n \r\n  ESTRUCTURA DEL SHEET:\r\n \r\n  MEN\u00da GENERAL (pesta\u00f1as: \"Abril 2026\", \"Mayo 2026\", etc.)\r\n  Columnas: Fecha | Sopa | Prote\u00edna | Acompa\u00f1ante | Vegetariano |\r\n            Parrilla prote\u00edna | Parrilla acompa\u00f1ante | Adicional\r\n \r\n  MEN\u00da EL NIDO (pesta\u00f1as: \"Abril Nido 2026\", \"Mayo Nido 2026\", etc.)\r\n  Columnas: Fecha | Refrigerio | Fruta | Jugo | Nido Tardes\r\n-->\r\n \r\n<style>\r\n  .menu-cafeteria {\r\n    --mc-bg: #ffffff;\r\n    --mc-surface: #faf9f6;\r\n    --mc-border: #e8e6df;\r\n    --mc-text: #1a1a1a;\r\n    --mc-text-muted: #6b6b6b;\r\n    --mc-text-disabled: #c4c2bb;\r\n    --mc-accent: #004E96;\r\n    --mc-accent-soft: #e6eef7;\r\n    --mc-accent-nido: #F26632;\r\n    --mc-accent-nido-soft: #f5f1ec;\r\n    --mc-radius: 12px;\r\n \r\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n    color: var(--mc-text);\r\n    max-width: 1200px;\r\n    margin: 0 auto;\r\n    padding: 1.5rem 1rem;\r\n  }\r\n  .menu-cafeteria * { box-sizing: border-box; }\r\n \r\n  \/* Header *\/\r\n  .mc-header {\r\n    text-align: center;\r\n    margin-bottom: 1.5rem;\r\n  }\r\n  .mc-header h2 {\r\n    font-size: 1.75rem;\r\n    font-weight: 600;\r\n    margin: 0 0 0.25rem;\r\n  }\r\n  .mc-header p {\r\n    font-size: 0.95rem;\r\n    color: var(--mc-text-muted);\r\n    margin: 0;\r\n  }\r\n \r\n  \/* Tabs principales *\/\r\n  .mc-tabs {\r\n    display: flex;\r\n    justify-content: center;\r\n    gap: 0.5rem;\r\n    margin-bottom: 2rem;\r\n    border-bottom: 1px solid var(--mc-border);\r\n    flex-wrap: wrap;\r\n  }\r\n  .menu-cafeteria .mc-tab {\r\n    background: transparent !important;\r\n    border: none !important;\r\n    border-radius: 0 !important;\r\n    box-shadow: none !important;\r\n    padding: 0.85rem 1.5rem;\r\n    font-size: 1rem;\r\n    font-weight: 500;\r\n    color: var(--mc-text-muted);\r\n    cursor: pointer;\r\n    border-bottom: 3px solid transparent !important;\r\n    margin-bottom: -1px;\r\n    font-family: inherit;\r\n    transition: color 0.15s ease, background 0.15s ease, border-color 0.15s ease;\r\n    outline: none;\r\n  }\r\n  .menu-cafeteria .mc-tab:hover {\r\n    color: var(--mc-text);\r\n    background: var(--mc-surface) !important;\r\n  }\r\n  .menu-cafeteria .mc-tab:focus,\r\n  .menu-cafeteria .mc-tab:focus-visible {\r\n    background: transparent !important;\r\n    outline: none;\r\n  }\r\n  .menu-cafeteria .mc-tab.is-active {\r\n    color: var(--current-accent) !important;\r\n    border-bottom-color: var(--current-accent) !important;\r\n    background: transparent !important;\r\n    font-weight: 600;\r\n  }\r\n  .menu-cafeteria .mc-tab.is-active:hover {\r\n    background: var(--mc-surface) !important;\r\n    color: var(--current-accent) !important;\r\n  }\r\n \r\n  .mc-section { margin-bottom: 2.5rem; }\r\n  .mc-section-title {\r\n    font-size: 1.1rem;\r\n    font-weight: 600;\r\n    margin: 0 0 0.5rem;\r\n  }\r\n  .mc-section-subtitle {\r\n    font-size: 0.85rem;\r\n    color: var(--mc-text-muted);\r\n    margin: 0 0 1rem;\r\n  }\r\n \r\n  \/* Vista semanal *\/\r\n  .mc-week {\r\n    display: grid;\r\n    grid-template-columns: repeat(5, 1fr);\r\n    gap: 0.75rem;\r\n  }\r\n  @media (max-width: 900px) {\r\n    .mc-week { grid-template-columns: repeat(2, 1fr); }\r\n  }\r\n  @media (max-width: 500px) {\r\n    .mc-week { grid-template-columns: 1fr; }\r\n  }\r\n \r\n  .mc-day-card {\r\n    background: var(--mc-bg);\r\n    border: 1px solid var(--mc-border);\r\n    border-radius: var(--mc-radius);\r\n    padding: 1rem;\r\n    transition: all 0.15s ease;\r\n  }\r\n  .mc-day-card.is-today {\r\n    border-color: var(--current-accent);\r\n    background: var(--current-accent-soft);\r\n  }\r\n  .mc-day-card.is-festivo {\r\n    background: var(--mc-surface);\r\n    border-style: dashed;\r\n  }\r\n  .mc-day-header {\r\n    margin-bottom: 0.75rem;\r\n    padding-bottom: 0.5rem;\r\n    border-bottom: 1px solid var(--mc-border);\r\n  }\r\n  .mc-day-name {\r\n    font-size: 0.75rem;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--mc-text-muted);\r\n  }\r\n  .mc-day-card.is-today .mc-day-name { color: var(--current-accent); }\r\n  .mc-day-date {\r\n    font-size: 1.1rem;\r\n    font-weight: 600;\r\n  }\r\n \r\n  .mc-cat-block { margin-bottom: 0.7rem; }\r\n  .mc-cat-block:last-child { margin-bottom: 0; }\r\n  .mc-cat-label {\r\n    font-size: 0.7rem;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n    color: var(--mc-text-muted);\r\n    margin-bottom: 0.15rem;\r\n  }\r\n  .mc-cat-value {\r\n    font-size: 0.85rem;\r\n    line-height: 1.4;\r\n  }\r\n \r\n  .mc-divider-extra {\r\n    margin: 0.75rem 0 0.5rem;\r\n    padding-top: 0.5rem;\r\n    border-top: 1px dashed var(--mc-border);\r\n    font-size: 0.7rem;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n    color: var(--current-accent);\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 0.3rem;\r\n  }\r\n \r\n  .mc-festivo-badge {\r\n    display: inline-block;\r\n    background: var(--mc-surface);\r\n    color: var(--mc-text-muted);\r\n    padding: 0.5rem 0.8rem;\r\n    border-radius: 8px;\r\n    font-size: 0.85rem;\r\n    font-style: italic;\r\n  }\r\n \r\n  \/* Calendario *\/\r\n  .mc-explorer {\r\n    display: grid;\r\n    grid-template-columns: minmax(300px, 380px) 1fr;\r\n    gap: 1.5rem;\r\n    align-items: start;\r\n  }\r\n  @media (max-width: 768px) {\r\n    .mc-explorer { grid-template-columns: 1fr; }\r\n  }\r\n \r\n  .mc-calendar {\r\n    background: var(--mc-bg);\r\n    border: 1px solid var(--mc-border);\r\n    border-radius: var(--mc-radius);\r\n    padding: 1.25rem;\r\n  }\r\n  .mc-cal-nav {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    margin-bottom: 1rem;\r\n  }\r\n  .mc-cal-nav button {\r\n    background: transparent;\r\n    border: 1px solid var(--mc-border);\r\n    border-radius: 50%;\r\n    width: 32px; height: 32px;\r\n    font-size: 1rem;\r\n    cursor: pointer;\r\n    line-height: 1;\r\n    display: flex; align-items: center; justify-content: center;\r\n    transition: all 0.15s ease;\r\n    padding: 0;\r\n    font-family: inherit;\r\n    color: var(--mc-text);\r\n  }\r\n  .mc-cal-nav button:hover {\r\n    background: var(--mc-surface);\r\n    border-color: var(--current-accent);\r\n  }\r\n  .mc-cal-month {\r\n    font-size: 1rem;\r\n    font-weight: 600;\r\n    text-transform: capitalize;\r\n  }\r\n  .mc-cal-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(7, 1fr);\r\n    gap: 4px;\r\n  }\r\n  .mc-cal-dow {\r\n    text-align: center;\r\n    font-size: 0.7rem;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n    color: var(--mc-text-muted);\r\n    padding: 0.4rem 0;\r\n  }\r\n  .mc-cal-day {\r\n    aspect-ratio: 1;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    font-size: 0.9rem;\r\n    border: 1px solid transparent;\r\n    border-radius: 50%;\r\n    background: transparent;\r\n    color: var(--mc-text-disabled);\r\n    cursor: default;\r\n    transition: all 0.15s ease;\r\n    padding: 0;\r\n    font-family: inherit;\r\n  }\r\n  .mc-cal-day.has-menu {\r\n    color: var(--mc-text);\r\n    cursor: pointer;\r\n    background: var(--current-accent-soft);\r\n    font-weight: 500;\r\n  }\r\n  .mc-cal-day.has-menu:hover {\r\n    background: var(--current-accent);\r\n    color: #fff;\r\n  }\r\n  .mc-cal-day.is-today { border-color: var(--current-accent); }\r\n  .mc-cal-day.is-selected {\r\n    background: var(--current-accent) !important;\r\n    color: #fff !important;\r\n  }\r\n  .mc-cal-day.is-empty { visibility: hidden; }\r\n \r\n  .mc-detail {\r\n    background: var(--mc-bg);\r\n    border: 1px solid var(--mc-border);\r\n    border-radius: var(--mc-radius);\r\n    padding: 1.25rem;\r\n    min-height: 200px;\r\n  }\r\n  .mc-detail-header {\r\n    margin-bottom: 1rem;\r\n    padding-bottom: 0.75rem;\r\n    border-bottom: 1px solid var(--mc-border);\r\n  }\r\n  .mc-detail-date {\r\n    font-size: 1.1rem;\r\n    font-weight: 600;\r\n    margin: 0;\r\n    text-transform: capitalize;\r\n  }\r\n  .mc-detail-hint {\r\n    font-size: 0.85rem;\r\n    color: var(--mc-text-muted);\r\n    text-align: center;\r\n    padding: 2rem 1rem;\r\n  }\r\n \r\n  .mc-loading, .mc-error, .mc-empty {\r\n    text-align: center;\r\n    padding: 2rem 1rem;\r\n    color: var(--mc-text-muted);\r\n    font-size: 0.95rem;\r\n    background: var(--mc-surface);\r\n    border-radius: var(--mc-radius);\r\n  }\r\n  .mc-error { color: #b03030; }\r\n \r\n  .mc-updated {\r\n    text-align: center;\r\n    margin-top: 1.5rem;\r\n    font-size: 0.8rem;\r\n    color: var(--mc-text-muted);\r\n  }\r\n \r\n  \/* Tema seg\u00fan men\u00fa activo *\/\r\n  .menu-cafeteria.theme-general {\r\n    --current-accent: var(--mc-accent);\r\n    --current-accent-soft: var(--mc-accent-soft);\r\n  }\r\n  .menu-cafeteria.theme-nido {\r\n    --current-accent: var(--mc-accent-nido);\r\n    --current-accent-soft: var(--mc-accent-nido-soft);\r\n  }\r\n<\/style>\r\n \r\n<div class=\"menu-cafeteria theme-general\" id=\"mc-root\">\r\n  <div class=\"mc-header\">\r\n    <h2>Men\u00fa de la cafeter\u00eda<\/h2>\r\n    <p>Conoce qu\u00e9 se sirve esta semana y explora otros d\u00edas<\/p>\r\n  <\/div>\r\n \r\n  <div class=\"mc-tabs\">\r\n    <button class=\"mc-tab is-active\" data-menu=\"general\" id=\"mc-tab-general\">\ud83c\udf7d\ufe0f Men\u00fa General<\/button>\r\n    <button class=\"mc-tab\" data-menu=\"nido\" id=\"mc-tab-nido\">Men\u00fa El Nido<\/button>\r\n  <\/div>\r\n \r\n  <div class=\"mc-section\">\r\n    <h3 class=\"mc-section-title\">Esta semana<\/h3>\r\n    <p class=\"mc-section-subtitle\" id=\"mc-week-subtitle\"><\/p>\r\n    <div id=\"mc-week-content\">\r\n      <div class=\"mc-loading\">Cargando el men\u00fa...<\/div>\r\n    <\/div>\r\n  <\/div>\r\n \r\n  <div class=\"mc-section\">\r\n    <h3 class=\"mc-section-title\">Explorar otros d\u00edas<\/h3>\r\n    <p class=\"mc-section-subtitle\">Haz clic en un d\u00eda resaltado para ver su men\u00fa<\/p>\r\n    <div class=\"mc-explorer\">\r\n      <div class=\"mc-calendar\">\r\n        <div class=\"mc-cal-nav\">\r\n          <button id=\"mc-prev\" aria-label=\"Mes anterior\">\u2039<\/button>\r\n          <div class=\"mc-cal-month\" id=\"mc-month-label\"><\/div>\r\n          <button id=\"mc-next\" aria-label=\"Mes siguiente\">\u203a<\/button>\r\n        <\/div>\r\n        <div class=\"mc-cal-grid\" id=\"mc-cal-dows\"><\/div>\r\n        <div class=\"mc-cal-grid\" id=\"mc-cal-days\"><\/div>\r\n      <\/div>\r\n      <div class=\"mc-detail\" id=\"mc-detail\">\r\n        <div class=\"mc-detail-hint\">Selecciona un d\u00eda del calendario para ver su men\u00fa<\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n \r\n  <div class=\"mc-updated\" id=\"mc-updated\"><\/div>\r\n<\/div>\r\n \r\n<script>\r\n(function () {\r\n  \/\/ ============================================================\r\n  \/\/ CONFIGURACI\u00d3N\r\n  \/\/ ============================================================\r\n  const SHEET_ID = \"1kzI8WcqSxWuX50SiDqvvppjOHJlqqnkyhySixfNlZic\";\r\n  \/\/ ============================================================\r\n \r\n  const MONTHS_ES = [\r\n    \"Enero\", \"Febrero\", \"Marzo\", \"Abril\", \"Mayo\", \"Junio\",\r\n    \"Julio\", \"Agosto\", \"Septiembre\", \"Octubre\", \"Noviembre\", \"Diciembre\"\r\n  ];\r\n  const DOWS_ES_LARGO = [\"Domingo\", \"Lunes\", \"Martes\", \"Mi\u00e9rcoles\", \"Jueves\", \"Viernes\", \"S\u00e1bado\"];\r\n  const DOWS_CAL = [\"Lun\", \"Mar\", \"Mi\u00e9\", \"Jue\", \"Vie\", \"S\u00e1b\", \"Dom\"];\r\n \r\n  const MENU_CONFIG = {\r\n    general: {\r\n      sheetSuffix: \"\",\r\n      categorias: [\r\n        { keys: [\"sopa\", \"crema\", \"crema\/sopa\"], label: \"Sopa\", section: \"principal\" },\r\n        { keys: [\"proteina\", \"proteinas\", \"prote\u00edna\", \"prote\u00ednas\"], label: \"Prote\u00edna\", section: \"principal\" },\r\n        { keys: [\"acompanante\", \"acompa\u00f1ante\"], label: \"Acompa\u00f1ante\", section: \"principal\" },\r\n        { keys: [\"vegetariano\", \"vegetariana\", \"opcion vegetariana\", \"opci\u00f3n vegetariana\"], label: \"Vegetariano\", section: \"principal\" },\r\n        { keys: [\"incluye\", \"adicional\", \"adicionales\"], label: \"Incluye\", section: \"ambas\" },\r\n        { keys: [\"parrilla proteina\", \"parrilla prote\u00edna\"], label: \"Prote\u00edna\", section: \"extra\" },\r\n        { keys: [\"parrilla acompanante\", \"parrilla acompa\u00f1ante\"], label: \"Acompa\u00f1ante\", section: \"extra\" }\r\n      ],\r\n      extraSeccionLabel: \"\ud83d\udd25 Men\u00fa parrilla\"\r\n    },\r\n    nido: {\r\n      sheetSuffix: \" Nido\",\r\n      categorias: [\r\n        { keys: [\"refrigerio\"], label: \"Refrigerio\", section: \"principal\" },\r\n        { keys: [\"fruta\"], label: \"Fruta\", section: \"principal\" },\r\n        { keys: [\"jugo\"], label: \"Jugo\", section: \"principal\" },\r\n        { keys: [\"nido tardes\", \"tardes\", \"tarde\"], label: \"Nido Tardes\", section: \"extra\" }\r\n      ],\r\n      extraSeccionLabel: \"\ud83c\udf19 Tarde\"\r\n    }\r\n  };\r\n \r\n  let activeMenu = \"general\";\r\n  const monthCache = { general: {}, nido: {} };\r\n  let viewYear, viewMonth;\r\n  let selectedDateKey = null;\r\n \r\n  const rootEl = document.getElementById(\"mc-root\");\r\n  const tabGeneralBtn = document.getElementById(\"mc-tab-general\");\r\n  const tabNidoBtn = document.getElementById(\"mc-tab-nido\");\r\n  const weekContentEl = document.getElementById(\"mc-week-content\");\r\n  const weekSubtitleEl = document.getElementById(\"mc-week-subtitle\");\r\n  const monthLabelEl = document.getElementById(\"mc-month-label\");\r\n  const dowsEl = document.getElementById(\"mc-cal-dows\");\r\n  const daysEl = document.getElementById(\"mc-cal-days\");\r\n  const detailEl = document.getElementById(\"mc-detail\");\r\n  const updatedEl = document.getElementById(\"mc-updated\");\r\n  const prevBtn = document.getElementById(\"mc-prev\");\r\n  const nextBtn = document.getElementById(\"mc-next\");\r\n \r\n  dowsEl.innerHTML = DOWS_CAL.map(d => `<div class=\"mc-cal-dow\">${d}<\/div>`).join(\"\");\r\n \r\n  function escapeHtml(s) {\r\n    return String(s == null ? \"\" : s).replace(\/[&<>\"']\/g, c => ({\r\n      \"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"\r\n    }[c]));\r\n  }\r\n \r\n  function normalize(s) {\r\n    return String(s || \"\")\r\n      .normalize(\"NFD\")\r\n      .replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n      .toLowerCase()\r\n      .trim();\r\n  }\r\n \r\n  function dateKey(year, month, day) {\r\n    return `${year}-${String(month + 1).padStart(2, \"0\")}-${String(day).padStart(2, \"0\")}`;\r\n  }\r\n \r\n  function sheetNameFor(year, month, menu) {\r\n    return `${MONTHS_ES[month]}${MENU_CONFIG[menu].sheetSuffix} ${year}`;\r\n  }\r\n \r\n  function findCategoria(label, menu) {\r\n    const norm = normalize(label);\r\n    return MENU_CONFIG[menu].categorias.find(cat => cat.keys.includes(norm));\r\n  }\r\n \r\n  function getCellValue(cell) {\r\n    if (!cell || cell.v == null) return \"\";\r\n    const v = cell.v;\r\n    if (typeof v === \"string\" && v.startsWith(\"Date(\")) {\r\n      const parts = v.replace(\"Date(\", \"\").replace(\")\", \"\").split(\",\").map(n => parseInt(n, 10));\r\n      return dateKey(parts[0], parts[1], parts[2]);\r\n    }\r\n    return String(v);\r\n  }\r\n \r\n  function esFestivo(text) {\r\n    const n = normalize(text);\r\n    return n === \"festivo\" || n === \"festividad\" || n === \"no hay clase\" || n === \"sin clase\";\r\n  }\r\n \r\n  function parseGvizResponse(text, menu) {\r\n    const jsonStart = text.indexOf(\"{\");\r\n    const jsonEnd = text.lastIndexOf(\"}\");\r\n    if (jsonStart < 0 || jsonEnd < 0) throw new Error(\"Formato de respuesta inv\u00e1lido\");\r\n    const json = JSON.parse(text.substring(jsonStart, jsonEnd + 1));\r\n    if (!json.table) throw new Error(\"No se encontr\u00f3 la tabla\");\r\n \r\n    const cols = json.table.cols || [];\r\n    const rawRows = json.table.rows || [];\r\n \r\n    let headers = cols.map(c => c.label || \"\");\r\n    let dataRows = rawRows;\r\n \r\n    const allEmpty = headers.every(h => !h);\r\n    if (allEmpty && rawRows.length > 0) {\r\n      headers = (rawRows[0].c || []).map(c => getCellValue(c));\r\n      dataRows = rawRows.slice(1);\r\n    } else {\r\n      const firstRow = rawRows[0] && rawRows[0].c ? rawRows[0].c.map(c => getCellValue(c)) : [];\r\n      const firstNorm = firstRow.map(normalize);\r\n      const headersNorm = headers.map(normalize);\r\n      let matches = 0;\r\n      firstNorm.forEach((v, i) => { if (v && v === headersNorm[i]) matches++; });\r\n      if (matches >= 2) dataRows = rawRows.slice(1);\r\n    }\r\n \r\n    let fechaIdx = -1;\r\n    headers.forEach((h, i) => { if (normalize(h) === \"fecha\") fechaIdx = i; });\r\n    if (fechaIdx < 0) fechaIdx = 0;\r\n \r\n    const grouped = {};\r\n    \/\/ Mapeo de columna -> categor\u00eda, evitando duplicados:\r\n    \/\/ si dos columnas apuntan a la misma categor\u00eda, solo se usa la primera.\r\n    const usedCategorias = new Set();\r\n    const colMap = headers.map((h, i) => {\r\n      if (i === fechaIdx) return null;\r\n      const cat = findCategoria(h, menu);\r\n      if (!cat) return null;\r\n      const catKey = cat.label + \"|\" + cat.section;\r\n      if (usedCategorias.has(catKey)) return null;\r\n      usedCategorias.add(catKey);\r\n      return cat;\r\n    });\r\n \r\n    dataRows.forEach(r => {\r\n      const cells = r.c || [];\r\n      const fecha = getCellValue(cells[fechaIdx]);\r\n      if (!fecha) return;\r\n \r\n      let festivo = false;\r\n      for (let i = 0; i < headers.length; i++) {\r\n        if (i === fechaIdx) continue;\r\n        const v = getCellValue(cells[i]).trim();\r\n        if (esFestivo(v)) { festivo = true; break; }\r\n      }\r\n \r\n      if (festivo) {\r\n        grouped[fecha] = { festivo: true, principal: [], extra: [] };\r\n        return;\r\n      }\r\n \r\n      grouped[fecha] = grouped[fecha] || { festivo: false, principal: [], extra: [] };\r\n      colMap.forEach((cat, i) => {\r\n        if (!cat) return;\r\n        const value = getCellValue(cells[i]).trim();\r\n        if (!value || value === \"-\") return;\r\n        if (cat.section === \"ambas\") {\r\n          grouped[fecha].principal.push({ label: cat.label, value: value });\r\n          grouped[fecha].extra.push({ label: cat.label, value: value });\r\n        } else {\r\n          grouped[fecha][cat.section].push({ label: cat.label, value: value });\r\n        }\r\n      });\r\n    });\r\n \r\n    return grouped;\r\n  }\r\n \r\n  async function loadMonth(year, month, menu) {\r\n    const sheetName = sheetNameFor(year, month, menu);\r\n    if (monthCache[menu][sheetName]) return monthCache[menu][sheetName];\r\n \r\n    try {\r\n      const url = `https:\/\/docs.google.com\/spreadsheets\/d\/${SHEET_ID}\/gviz\/tq?tqx=out:json&sheet=${encodeURIComponent(sheetName)}&t=${Date.now()}`;\r\n      const res = await fetch(url, { cache: \"no-store\" });\r\n      if (!res.ok) throw new Error(\"HTTP \" + res.status);\r\n      const text = await res.text();\r\n \r\n      if (text.indexOf('\"status\":\"error\"') !== -1) {\r\n        monthCache[menu][sheetName] = {};\r\n        return {};\r\n      }\r\n \r\n      const grouped = parseGvizResponse(text, menu);\r\n      monthCache[menu][sheetName] = grouped;\r\n      return grouped;\r\n    } catch (err) {\r\n      console.error(\"Error cargando mes\", sheetName, err);\r\n      monthCache[menu][sheetName] = {};\r\n      return {};\r\n    }\r\n  }\r\n \r\n  function lunesDeLaSemana(date) {\r\n    const d = new Date(date);\r\n    const day = d.getDay();\r\n    const diff = day === 0 ? -6 : 1 - day;\r\n    d.setDate(d.getDate() + diff);\r\n    d.setHours(0, 0, 0, 0);\r\n    return d;\r\n  }\r\n \r\n  function rangoSemana(lunes) {\r\n    const dias = [];\r\n    for (let i = 0; i < 5; i++) {\r\n      const d = new Date(lunes);\r\n      d.setDate(d.getDate() + i);\r\n      dias.push(d);\r\n    }\r\n    return dias;\r\n  }\r\n \r\n  async function buscarSemanaParaMostrar(menu) {\r\n    const hoy = new Date();\r\n    hoy.setHours(0, 0, 0, 0);\r\n    const lunesActual = lunesDeLaSemana(hoy);\r\n \r\n    const mesesACargar = [\r\n      { y: lunesActual.getFullYear(), m: lunesActual.getMonth() },\r\n      { y: hoy.getFullYear(), m: hoy.getMonth() - 1 < 0 ? 11 : hoy.getMonth() - 1 },\r\n      { y: hoy.getFullYear(), m: hoy.getMonth() + 1 > 11 ? 0 : hoy.getMonth() + 1 }\r\n    ];\r\n    if (hoy.getMonth() === 0) mesesACargar[1].y = hoy.getFullYear() - 1;\r\n    if (hoy.getMonth() === 11) mesesACargar[2].y = hoy.getFullYear() + 1;\r\n \r\n    await Promise.all(mesesACargar.map(({ y, m }) => loadMonth(y, m, menu)));\r\n \r\n    const todasFechas = new Set();\r\n    Object.values(monthCache[menu]).forEach(grouped => {\r\n      Object.keys(grouped).forEach(k => todasFechas.add(k));\r\n    });\r\n \r\n    const dias = rangoSemana(lunesActual);\r\n    const tieneMenuActual = dias.some(d => {\r\n      const k = dateKey(d.getFullYear(), d.getMonth(), d.getDate());\r\n      return todasFechas.has(k);\r\n    });\r\n \r\n    if (tieneMenuActual) return { lunes: lunesActual, esActual: true };\r\n \r\n    const fechasOrdenadas = Array.from(todasFechas).sort().reverse();\r\n    const ultimaPasada = fechasOrdenadas.find(k => {\r\n      const [y, m, d] = k.split(\"-\").map(n => parseInt(n, 10));\r\n      const dt = new Date(y, m - 1, d);\r\n      return dt <= hoy;\r\n    });\r\n \r\n    if (ultimaPasada) {\r\n      const [y, m, d] = ultimaPasada.split(\"-\").map(n => parseInt(n, 10));\r\n      return { lunes: lunesDeLaSemana(new Date(y, m - 1, d)), esActual: false };\r\n    }\r\n \r\n    const proxima = Array.from(todasFechas).sort()[0];\r\n    if (proxima) {\r\n      const [y, m, d] = proxima.split(\"-\").map(n => parseInt(n, 10));\r\n      return { lunes: lunesDeLaSemana(new Date(y, m - 1, d)), esActual: false };\r\n    }\r\n \r\n    return null;\r\n  }\r\n \r\n  function getMenuDia(fechaKey, menu) {\r\n    for (const sheet in monthCache[menu]) {\r\n      if (monthCache[menu][sheet][fechaKey]) return monthCache[menu][sheet][fechaKey];\r\n    }\r\n    return null;\r\n  }\r\n \r\n  function renderDayCard(date, isToday, menu) {\r\n    const k = dateKey(date.getFullYear(), date.getMonth(), date.getDate());\r\n    const dayData = getMenuDia(k, menu);\r\n    const dowName = DOWS_ES_LARGO[date.getDay()];\r\n    const config = MENU_CONFIG[menu];\r\n \r\n    let bodyHtml = \"\";\r\n    let extraClass = \"\";\r\n \r\n    if (dayData && dayData.festivo) {\r\n      extraClass = \"is-festivo\";\r\n      bodyHtml = `<div class=\"mc-festivo-badge\">\ud83c\udf89 Festivo<\/div>`;\r\n    } else if (!dayData || (dayData.principal.length === 0 && dayData.extra.length === 0)) {\r\n      bodyHtml = `<div style=\"color: var(--mc-text-muted); font-size: 0.85rem;\">Sin men\u00fa cargado<\/div>`;\r\n    } else {\r\n      const principalHtml = dayData.principal.map(item => `\r\n        <div class=\"mc-cat-block\">\r\n          <div class=\"mc-cat-label\">${escapeHtml(item.label)}<\/div>\r\n          <div class=\"mc-cat-value\">${escapeHtml(item.value)}<\/div>\r\n        <\/div>\r\n      `).join(\"\");\r\n \r\n      let extraHtml = \"\";\r\n      if (dayData.extra.length > 0) {\r\n        const items = dayData.extra.map(item => `\r\n          <div class=\"mc-cat-block\">\r\n            <div class=\"mc-cat-label\">${escapeHtml(item.label)}<\/div>\r\n            <div class=\"mc-cat-value\">${escapeHtml(item.value)}<\/div>\r\n          <\/div>\r\n        `).join(\"\");\r\n        extraHtml = `<div class=\"mc-divider-extra\">${config.extraSeccionLabel}<\/div>${items}`;\r\n      }\r\n      bodyHtml = principalHtml + extraHtml;\r\n    }\r\n \r\n    return `\r\n      <div class=\"mc-day-card ${isToday ? \"is-today\" : \"\"} ${extraClass}\">\r\n        <div class=\"mc-day-header\">\r\n          <div class=\"mc-day-name\">${dowName}<\/div>\r\n          <div class=\"mc-day-date\">${date.getDate()} ${MONTHS_ES[date.getMonth()].toLowerCase()}<\/div>\r\n        <\/div>\r\n        ${bodyHtml}\r\n      <\/div>\r\n    `;\r\n  }\r\n \r\n  function renderSemana(lunes, esActual, menu) {\r\n    const dias = rangoSemana(lunes);\r\n    const hoy = new Date();\r\n    const todayKey = dateKey(hoy.getFullYear(), hoy.getMonth(), hoy.getDate());\r\n \r\n    const cardsHtml = dias.map(d => {\r\n      const k = dateKey(d.getFullYear(), d.getMonth(), d.getDate());\r\n      return renderDayCard(d, k === todayKey, menu);\r\n    }).join(\"\");\r\n \r\n    weekContentEl.innerHTML = `<div class=\"mc-week\">${cardsHtml}<\/div>`;\r\n \r\n    const inicio = dias[0];\r\n    const fin = dias[4];\r\n    const mismoMes = inicio.getMonth() === fin.getMonth();\r\n    const rangoTexto = mismoMes\r\n      ? `${inicio.getDate()} al ${fin.getDate()} de ${MONTHS_ES[fin.getMonth()].toLowerCase()} de ${fin.getFullYear()}`\r\n      : `${inicio.getDate()} de ${MONTHS_ES[inicio.getMonth()].toLowerCase()} al ${fin.getDate()} de ${MONTHS_ES[fin.getMonth()].toLowerCase()} de ${fin.getFullYear()}`;\r\n    weekSubtitleEl.textContent = (esActual ? \"Semana del \" : \"\u00daltima semana publicada: \") + rangoTexto;\r\n  }\r\n \r\n  function renderCalendar(year, month, monthData) {\r\n    monthLabelEl.textContent = `${MONTHS_ES[month]} ${year}`;\r\n \r\n    const today = new Date();\r\n    const todayKey = dateKey(today.getFullYear(), today.getMonth(), today.getDate());\r\n \r\n    const firstDay = new Date(year, month, 1);\r\n    let startDow = firstDay.getDay() - 1;\r\n    if (startDow < 0) startDow = 6;\r\n \r\n    const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n    let html = \"\";\r\n    for (let i = 0; i < startDow; i++) {\r\n      html += `<button class=\"mc-cal-day is-empty\" disabled><\/button>`;\r\n    }\r\n    for (let d = 1; d <= daysInMonth; d++) {\r\n      const k = dateKey(year, month, d);\r\n      const has = !!monthData[k];\r\n      const classes = [\"mc-cal-day\"];\r\n      if (has) classes.push(\"has-menu\");\r\n      if (k === todayKey) classes.push(\"is-today\");\r\n      if (k === selectedDateKey) classes.push(\"is-selected\");\r\n      html += `<button class=\"${classes.join(\" \")}\" data-key=\"${k}\" ${has ? \"\" : \"disabled\"}>${d}<\/button>`;\r\n    }\r\n    daysEl.innerHTML = html;\r\n \r\n    daysEl.querySelectorAll(\".mc-cal-day.has-menu\").forEach(btn => {\r\n      btn.addEventListener(\"click\", () => {\r\n        selectedDateKey = btn.dataset.key;\r\n        daysEl.querySelectorAll(\".mc-cal-day\").forEach(b => b.classList.remove(\"is-selected\"));\r\n        btn.classList.add(\"is-selected\");\r\n        renderDetail(selectedDateKey);\r\n      });\r\n    });\r\n  }\r\n \r\n  function renderDetail(fechaKey) {\r\n    const dayData = getMenuDia(fechaKey, activeMenu);\r\n    const config = MENU_CONFIG[activeMenu];\r\n    const [y, m, d] = fechaKey.split(\"-\").map(n => parseInt(n, 10));\r\n    const dateObj = new Date(y, m - 1, d);\r\n    const fechaTexto = dateObj.toLocaleDateString(\"es-CO\", {\r\n      weekday: \"long\", day: \"numeric\", month: \"long\", year: \"numeric\"\r\n    });\r\n \r\n    if (dayData && dayData.festivo) {\r\n      detailEl.innerHTML = `\r\n        <div class=\"mc-detail-header\">\r\n          <h4 class=\"mc-detail-date\">${escapeHtml(fechaTexto)}<\/h4>\r\n        <\/div>\r\n        <div class=\"mc-festivo-badge\" style=\"display: block; text-align: center; padding: 1.5rem;\">\ud83c\udf89 D\u00eda festivo<\/div>\r\n      `;\r\n      return;\r\n    }\r\n \r\n    if (!dayData || (dayData.principal.length === 0 && dayData.extra.length === 0)) {\r\n      detailEl.innerHTML = `\r\n        <div class=\"mc-detail-header\">\r\n          <h4 class=\"mc-detail-date\">${escapeHtml(fechaTexto)}<\/h4>\r\n        <\/div>\r\n        <div class=\"mc-empty\">Sin men\u00fa cargado para este d\u00eda.<\/div>\r\n      `;\r\n      return;\r\n    }\r\n \r\n    const principalHtml = dayData.principal.map(item => `\r\n      <div class=\"mc-cat-block\">\r\n        <div class=\"mc-cat-label\">${escapeHtml(item.label)}<\/div>\r\n        <div class=\"mc-cat-value\" style=\"font-size: 0.95rem;\">${escapeHtml(item.value)}<\/div>\r\n      <\/div>\r\n    `).join(\"\");\r\n \r\n    let extraHtml = \"\";\r\n    if (dayData.extra.length > 0) {\r\n      const items = dayData.extra.map(item => `\r\n        <div class=\"mc-cat-block\">\r\n          <div class=\"mc-cat-label\">${escapeHtml(item.label)}<\/div>\r\n          <div class=\"mc-cat-value\" style=\"font-size: 0.95rem;\">${escapeHtml(item.value)}<\/div>\r\n        <\/div>\r\n      `).join(\"\");\r\n      extraHtml = `<div class=\"mc-divider-extra\">${config.extraSeccionLabel}<\/div>${items}`;\r\n    }\r\n \r\n    detailEl.innerHTML = `\r\n      <div class=\"mc-detail-header\">\r\n        <h4 class=\"mc-detail-date\">${escapeHtml(fechaTexto)}<\/h4>\r\n      <\/div>\r\n      ${principalHtml}${extraHtml}\r\n    `;\r\n  }\r\n \r\n  async function showMonth(year, month) {\r\n    viewYear = year;\r\n    viewMonth = month;\r\n    monthLabelEl.textContent = `${MONTHS_ES[month]} ${year}`;\r\n    daysEl.innerHTML = `<div style=\"grid-column: 1 \/ -1; padding: 1rem; text-align: center; color: var(--mc-text-muted); font-size: 0.85rem;\">Cargando...<\/div>`;\r\n \r\n    const monthData = await loadMonth(year, month, activeMenu);\r\n    renderCalendar(year, month, monthData);\r\n  }\r\n \r\n  async function loadAndRenderMenu(menu) {\r\n    activeMenu = menu;\r\n    selectedDateKey = null;\r\n \r\n    rootEl.classList.remove(\"theme-general\", \"theme-nido\");\r\n    rootEl.classList.add(`theme-${menu}`);\r\n \r\n    tabGeneralBtn.classList.toggle(\"is-active\", menu === \"general\");\r\n    tabNidoBtn.classList.toggle(\"is-active\", menu === \"nido\");\r\n \r\n    weekContentEl.innerHTML = `<div class=\"mc-loading\">Cargando el men\u00fa...<\/div>`;\r\n    weekSubtitleEl.textContent = \"\";\r\n    detailEl.innerHTML = `<div class=\"mc-detail-hint\">Selecciona un d\u00eda del calendario para ver su men\u00fa<\/div>`;\r\n \r\n    const semana = await buscarSemanaParaMostrar(menu);\r\n    if (semana) {\r\n      renderSemana(semana.lunes, semana.esActual, menu);\r\n    } else {\r\n      weekContentEl.innerHTML = `<div class=\"mc-empty\">No hay men\u00fas cargados todav\u00eda.<\/div>`;\r\n    }\r\n \r\n    const now = new Date();\r\n    showMonth(now.getFullYear(), now.getMonth());\r\n  }\r\n \r\n  tabGeneralBtn.addEventListener(\"click\", () => {\r\n    if (activeMenu !== \"general\") loadAndRenderMenu(\"general\");\r\n  });\r\n  tabNidoBtn.addEventListener(\"click\", () => {\r\n    if (activeMenu !== \"nido\") loadAndRenderMenu(\"nido\");\r\n  });\r\n \r\n  prevBtn.addEventListener(\"click\", () => {\r\n    let m = viewMonth - 1;\r\n    let y = viewYear;\r\n    if (m < 0) { m = 11; y--; }\r\n    showMonth(y, m);\r\n  });\r\n \r\n  nextBtn.addEventListener(\"click\", () => {\r\n    let m = viewMonth + 1;\r\n    let y = viewYear;\r\n    if (m > 11) { m = 0; y++; }\r\n    showMonth(y, m);\r\n  });\r\n \r\n  \/\/ Inicializaci\u00f3n: carga directamente el Men\u00fa General\r\n  loadAndRenderMenu(\"general\");\r\n \r\n  const now = new Date();\r\n  updatedEl.textContent = \"Actualizado: \" + now.toLocaleDateString(\"es-CO\", {\r\n    day: \"numeric\", month: \"long\", year: \"numeric\",\r\n    hour: \"2-digit\", minute: \"2-digit\"\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Men\u00fa de la cafeter\u00eda Conoce qu\u00e9 se sirve esta semana y explora otros d\u00edas \ud83c\udf7d\ufe0f Men\u00fa General Men\u00fa El Nido Esta semana Cargando el men\u00fa&#8230; Explorar otros d\u00edas Haz clic en un d\u00eda resaltado para ver su men\u00fa \u2039 \u203a Selecciona un d\u00eda del calendario para ver su men\u00fa<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-44864","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/pages\/44864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/comments?post=44864"}],"version-history":[{"count":47,"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/pages\/44864\/revisions"}],"predecessor-version":[{"id":45330,"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/pages\/44864\/revisions\/45330"}],"wp:attachment":[{"href":"https:\/\/www.colegiobolivar.edu.co\/website\/wp-json\/wp\/v2\/media?parent=44864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}