{"id":2104,"date":"2026-10-20T14:26:08","date_gmt":"2026-10-20T12:26:08","guid":{"rendered":"https:\/\/www.chalets-de-fiolles.com\/elaia-animations-2\/"},"modified":"2026-11-10T11:32:16","modified_gmt":"2026-11-10T10:32:16","slug":"animaciones-y-eventos","status":"publish","type":"page","link":"https:\/\/www.chalets-de-fiolles.com\/es\/animaciones-y-eventos\/","title":{"rendered":"Animaciones y eventos"},"content":{"rendered":"\n<div class=\"wp-block-group has-beige-background-color has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)\">\n\n<style>\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     JETONS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-wrap,\n  .ea-modal-overlay {\n    --ea-primary: #2e5e45;\n    --ea-primary-dark: color-mix(in srgb, var(--ea-primary) 80%, #000);\n    --ea-accent: #c8693f;\n    --ea-cream: #f7f3ec;\n    --ea-paper: #fffdf9;\n    --ea-ink: #1f2a24;\n    --ea-ink-soft: #4a554d;\n    --ea-muted: #6d6a60;\n    --ea-line: rgba(31, 42, 36, 0.1);\n    --ea-radius: 14px;\n    --ea-shadow: 0 1px 2px rgba(31, 42, 36, 0.04), 0 6px 20px rgba(31, 42, 36, 0.06);\n    --ea-shadow-hover: 0 2px 4px rgba(31, 42, 36, 0.05), 0 16px 36px rgba(31, 42, 36, 0.12);\n    --ea-header: 0px;\n    --ea-font: 'Inter', -apple-system, 'Segoe UI', sans-serif;\n  }\n\n  .ea-wrap {\n    font-family: var(--ea-font);\n    color: var(--ea-ink);\n    max-width: 1280px;\n    margin: 0 auto;\n    padding: 20px 28px 72px;\n    border-radius: 28px;\n    \/* Pas de fond propre : la page se pose sur celui du th\u00e8me (un aplat cr\u00e8me\n       laissait des bandes blanches de part et d'autre). *\/\n    background: transparent;\n    box-sizing: border-box;\n    -webkit-font-smoothing: antialiased;\n  }\n\n  .ea-wrap *,\n  .ea-wrap *::before,\n  .ea-wrap *::after,\n  .ea-modal-overlay *,\n  .ea-modal-overlay *::before,\n  .ea-modal-overlay *::after {\n    box-sizing: border-box;\n  }\n\n  .ea-wrap button,\n  .ea-wrap select,\n  .ea-modal-overlay button {\n    font-family: var(--ea-font);\n  }\n\n  .ea-wrap :focus-visible,\n  .ea-modal-overlay :focus-visible {\n    outline: 3px solid var(--ea-accent);\n    outline-offset: 3px;\n  }\n\n  .ea-icon {\n    display: inline-flex;\n    width: 1em;\n    height: 1em;\n    flex-shrink: 0;\n  }\n\n  .ea-icon svg {\n    width: 100%;\n    height: 100%;\n  }\n\n  .ea-sr {\n    position: absolute !important;\n    width: 1px;\n    height: 1px;\n    overflow: hidden;\n    clip: rect(0 0 0 0);\n    white-space: nowrap;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     1. BANDEAU\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-hero {\n    position: relative;\n    display: flex;\n    align-items: center;\n    min-height: clamp(240px, 30vh, 320px);\n    overflow: hidden;\n    padding: 36px 48px;\n    border-radius: 22px;\n    background-color: var(--ea-primary);\n    background-image: radial-gradient(120% 90% at 85% 10%, rgba(255, 255, 255, 0.16), transparent 60%);\n    background-size: cover;\n    background-position: center;\n    color: #fff;\n  }\n\n  .ea-hero::before {\n    content: '';\n    position: absolute;\n    inset: 0;\n    background: linear-gradient(90deg, rgba(14, 22, 17, 0.8) 0%, rgba(14, 22, 17, 0.5) 45%, rgba(14, 22, 17, 0.1) 80%);\n  }\n\n  .ea-hero--plain::before {\n    background: linear-gradient(90deg, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0));\n  }\n\n  .ea-hero-inner {\n    position: relative;\n    max-width: 560px;\n  }\n\n  .ea-eyebrow {\n    display: inline-block;\n    margin-bottom: 10px;\n    font-size: 11px;\n    font-weight: 700;\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: #f6d9c4;\n  }\n\n  .ea-hero-title {\n    margin: 0 0 10px !important;\n    color: #fff !important;\n    font-size: clamp(26px, 3.2vw, 40px) !important;\n    line-height: 1.1 !important;\n  }\n\n  .ea-hero-text {\n    margin: 0 !important;\n    color: rgba(255, 255, 255, 0.9) !important;\n    font-size: 15px;\n    line-height: 1.55;\n  }\n\n\n  \/* Sans bandeau : police, taille et couleur du titre restent celles du th\u00e8me. *\/\n  .ea-intro {\n    max-width: 720px;\n    margin: 0 auto;\n    text-align: center;\n  }\n\n  .ea-intro-title {\n    margin: 0 0 8px !important;\n  }\n\n  .ea-intro-text {\n    margin: 0 !important;\n    opacity: 0.85;\n  }\n\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     2. NAVIGATION RAPIDE\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  \/* Reste \u00e0 sa place : coll\u00e9e en haut, elle s'ajoutait aux en-t\u00eates et barres\n     fixes des th\u00e8mes (logo flottant de Camping Solaire\u2026) et masquait la page. *\/\n  .ea-nav {\n    position: relative;\n    z-index: 2;\n    display: flex;\n    justify-content: center;\n    margin-top: 18px;\n    pointer-events: none;\n  }\n\n  .ea-nav-inner {\n    display: flex;\n    gap: 4px;\n    max-width: 100%;\n    overflow-x: auto;\n    padding: 4px;\n    border: 1px solid var(--ea-line);\n    border-radius: 999px;\n    background: rgba(255, 253, 249, 0.95);\n    backdrop-filter: blur(10px);\n    box-shadow: 0 4px 14px rgba(31, 42, 36, 0.08);\n    scrollbar-width: none;\n    pointer-events: auto;\n  }\n\n  .ea-nav-inner::-webkit-scrollbar {\n    display: none;\n  }\n\n  .ea-nav-links {\n    display: flex;\n    gap: 4px;\n  }\n\n  .ea-nav a {\n    flex-shrink: 0;\n    display: inline-flex;\n    align-items: center;\n    gap: 7px;\n    min-height: 38px;\n    padding: 0 16px;\n    border-radius: 999px;\n    color: var(--ea-ink-soft) !important;\n    font-size: 14px;\n    font-weight: 600;\n    text-decoration: none !important;\n    white-space: nowrap;\n    transition: background 0.2s, color 0.2s;\n  }\n\n  .ea-nav a .ea-icon {\n    font-size: 15px;\n  }\n\n  .ea-nav a:hover {\n    background: rgba(31, 42, 36, 0.06);\n    color: var(--ea-ink) !important;\n  }\n\n  .ea-nav a[aria-current=\"true\"] {\n    background: var(--ea-primary);\n    color: #fff !important;\n  }\n\n  .ea-nav-sep {\n    flex-shrink: 0;\n    align-self: center;\n    width: 1px;\n    height: 22px;\n    margin: 0 4px;\n    background: var(--ea-line);\n  }\n\n  \/* Sur place \/ Aux alentours *\/\n  .ea-scope {\n    display: flex;\n    flex-shrink: 0;\n    gap: 2px;\n    padding: 2px;\n    border-radius: 999px;\n    background: #f1ece3;\n  }\n\n  .ea-scope button {\n    min-height: 34px;\n    padding: 0 14px;\n    border: 0;\n    border-radius: 999px;\n    background: transparent;\n    color: var(--ea-ink-soft);\n    font-size: 13px;\n    font-weight: 600;\n    white-space: nowrap;\n    cursor: pointer;\n  }\n\n  .ea-scope button:hover {\n    color: var(--ea-ink);\n  }\n\n  .ea-scope button:disabled {\n    opacity: 0.4;\n    cursor: not-allowed;\n  }\n\n  .ea-scope button:disabled:hover {\n    color: var(--ea-ink-soft);\n  }\n\n  .ea-scope button[aria-pressed=\"true\"] {\n    background: #fff;\n    color: var(--ea-primary);\n    box-shadow: 0 1px 3px rgba(31, 42, 36, 0.15);\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     SECTIONS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-section {\n    padding-top: 44px;\n    scroll-margin-top: calc(var(--ea-header) + 64px);\n  }\n\n  .ea-section-head {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    justify-content: space-between;\n    gap: 10px 24px;\n    margin-bottom: 16px;\n  }\n\n  .ea-section-title {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    margin: 0 !important;\n    color: var(--ea-ink) !important;\n    font-size: clamp(21px, 2.2vw, 27px) !important;\n    line-height: 1.2 !important;\n  }\n\n  .ea-section-title .ea-icon {\n    color: var(--ea-accent);\n    font-size: 0.95em;\n  }\n\n  .ea-section-sub {\n    margin: 4px 0 0 !important;\n    color: var(--ea-muted);\n    font-size: 14px;\n  }\n\n  .ea-head-side {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: 8px;\n    color: var(--ea-ink);\n    font-size: 14px;\n    font-weight: 500;\n  }\n\n  .ea-round {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 36px;\n    height: 36px;\n    border: 1px solid var(--ea-line);\n    border-radius: 50%;\n    background: var(--ea-paper);\n    color: var(--ea-ink);\n    font-size: 17px;\n    cursor: pointer;\n    transition: background 0.2s, border-color 0.2s;\n  }\n\n  .ea-round:hover:not(:disabled) {\n    border-color: var(--ea-primary);\n    background: #fff;\n  }\n\n  .ea-round:disabled {\n    opacity: 0.35;\n    cursor: not-allowed;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     CARTE \u00c9V\u00c9NEMENT (composant r\u00e9utilisable)\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-grid {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 16px;\n  }\n\n  .ea-grid--4 {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n\n  .ea-card {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    min-width: 0;\n    overflow: hidden;\n    border: 1px solid rgba(31, 42, 36, 0.06);\n    border-radius: 14px;\n    background: var(--ea-paper);\n    box-shadow: 0 1px 2px rgba(31, 42, 36, 0.04), 0 4px 12px rgba(31, 42, 36, 0.05);\n    cursor: pointer;\n    transition: box-shadow 0.25s ease, transform 0.25s ease;\n  }\n\n  .ea-card:hover {\n    box-shadow: var(--ea-shadow-hover);\n    transform: translateY(-2px);\n  }\n\n  .ea-card--ended {\n    opacity: 0.6;\n  }\n\n  .ea-card-media {\n    position: relative;\n    aspect-ratio: 16 \/ 9;\n    overflow: hidden;\n    background: #ece5d8;\n  }\n\n  .ea-grid--4 .ea-card-media {\n    aspect-ratio: 16 \/ 10;\n  }\n\n  .ea-card-media img {\n    display: block;\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    transition: transform 0.5s ease;\n  }\n\n  .ea-card:hover .ea-card-media img {\n    transform: scale(1.04);\n  }\n\n  \/* Image par d\u00e9faut du chatbot (souvent un logo) : enti\u00e8re, sur fond doux *\/\n  .ea-card-media img.ea-img--default,\n  .ea-modal-img.ea-img--default {\n    object-fit: contain;\n    padding: 10%;\n    background: #efe8dc;\n  }\n\n  .ea-card:hover .ea-card-media img.ea-img--default {\n    transform: none;\n  }\n\n  \/* Cr\u00e9dit photo (obligatoire pour les images sous licence CC BY\u2026) *\/\n  .ea-credit {\n    position: absolute;\n    right: 6px;\n    bottom: 6px;\n    z-index: 2;\n    max-width: calc(100% - 12px);\n    padding: 2px 6px;\n    border-radius: 4px;\n    background: rgba(0, 0, 0, 0.55);\n    color: #fff;\n    font-size: 10px;\n    line-height: 1.3;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    pointer-events: none;\n  }\n\n  .ea-modal-media {\n    position: relative;\n  }\n\n  .ea-card-fallback {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    height: 100%;\n    background: linear-gradient(135deg, var(--ea-cat-bg), #efe8dc);\n    color: var(--ea-cat-fg);\n    font-size: 34px;\n  }\n\n  .ea-live {\n    position: absolute;\n    bottom: 10px;\n    left: 10px;\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    padding: 4px 10px;\n    border-radius: 6px;\n    background: #d9412b;\n    color: #fff;\n    font-size: 12px;\n    font-weight: 700;\n  }\n\n  .ea-live::before {\n    content: '';\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: #fff;\n  }\n\n  \/* Badge \u00ab Sur inscription \u00bb (en haut \u00e0 droite de l'image) *\/\n  .ea-reg {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n    padding: 5px 10px;\n    border-radius: 999px;\n    background: #fff;\n    color: var(--ea-ink);\n    font-size: 12px;\n    font-weight: 700;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\n  }\n\n  .ea-reg .ea-icon {\n    color: var(--ea-accent);\n    font-size: 14px;\n  }\n\n  \/* Filtres cat\u00e9gories (sous \u00ab Activit\u00e9s du jour \u00bb, valables pour toute la page) *\/\n  .ea-cats {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n    margin: -4px 0 18px;\n  }\n\n  .ea-cat {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    min-height: 34px;\n    padding: 0 14px;\n    border: 1px solid transparent;\n    border-radius: 999px;\n    background: var(--ea-cat-bg, #fff);\n    color: var(--ea-cat-fg, var(--ea-ink));\n    font-size: 13px;\n    font-weight: 600;\n    cursor: pointer;\n    transition: border-color 0.2s, box-shadow 0.2s;\n  }\n\n  .ea-cat:hover {\n    border-color: currentColor;\n  }\n\n  .ea-cat[aria-pressed=\"true\"] {\n    border-color: currentColor;\n    box-shadow: inset 0 0 0 1px currentColor;\n  }\n\n  .ea-cat--all {\n    background: #fff;\n    color: var(--ea-ink);\n    border-color: var(--ea-line);\n  }\n\n  .ea-cat--all[aria-pressed=\"true\"] {\n    background: var(--ea-primary);\n    border-color: var(--ea-primary);\n    color: #fff;\n    box-shadow: none;\n  }\n\n  \/* Badge de date sur l'image : format unique (libell\u00e9 \/ jour \/ mois), taille fixe *\/\n  .ea-date {\n    position: absolute;\n    top: 10px;\n    left: 10px;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    width: 64px;\n    height: 74px;\n    padding: 4px;\n    border-radius: 10px;\n    background: var(--ea-accent);\n    color: #fff;\n    text-align: center;\n    text-transform: uppercase;\n    box-shadow: 0 3px 8px rgba(0, 0, 0, 0.18);\n  }\n\n  .ea-date-top,\n  .ea-date-month {\n    display: block;\n    max-width: 100%;\n    font-size: 9.5px;\n    font-weight: 700;\n    line-height: 1.2;\n    letter-spacing: 0.04em;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n\n  \/* Couleurs par cas (le texte du badge dit aussi le cas : \u00ab Auj. \u00bb, \u00ab Du \u2026 \u2192 \u00bb, \u00ab Jusqu'au \u00bb) *\/\n  .ea-date--today {\n    background: var(--ea-primary);\n  }\n\n  .ea-date--period {\n    background: #3f5f7f;\n  }\n\n  .ea-date--ongoing {\n    background: #a36a12;\n  }\n\n  \/* Fin de p\u00e9riode, sous le d\u00e9but *\/\n  .ea-date-end {\n    display: block;\n    max-width: 100%;\n    margin-top: 3px;\n    padding-top: 3px;\n    border-top: 1px solid rgba(255, 255, 255, 0.45);\n    font-size: 9.5px;\n    font-weight: 700;\n    line-height: 1.1;\n    letter-spacing: 0.02em;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n\n  .ea-date-top {\n    opacity: 0.9;\n  }\n\n  .ea-date-day {\n    display: block;\n    font-size: 22px;\n    font-weight: 800;\n    line-height: 1.05;\n  }\n\n  .ea-card-body {\n    display: flex;\n    flex: 1;\n    flex-direction: column;\n    gap: 6px;\n    padding: 12px 14px 14px;\n  }\n\n  .ea-card-top {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: center;\n    gap: 6px 10px;\n  }\n\n  .ea-when {\n    display: inline-flex;\n    align-items: center;\n    gap: 5px;\n    color: var(--ea-primary);\n    font-size: 14px;\n    font-weight: 700;\n  }\n\n  .ea-pill {\n    display: inline-flex;\n    align-items: center;\n    padding: 2px 9px;\n    border-radius: 999px;\n    background: var(--ea-cat-bg, #eef0ec);\n    color: var(--ea-cat-fg, #3c463f);\n    font-size: 11px;\n    font-weight: 600;\n  }\n\n  .ea-card-title {\n    margin: 0 !important;\n    color: var(--ea-ink) !important;\n    font-size: 17px !important;\n    font-weight: 600 !important;\n    line-height: 1.3 !important;\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n  }\n\n  .ea-grid--4 .ea-card-title {\n    font-size: 16px !important;\n  }\n\n  .ea-place {\n    display: flex;\n    align-items: center;\n    gap: 5px;\n    margin: 0 !important;\n    color: var(--ea-muted);\n    font-size: 13px;\n  }\n\n  .ea-place .ea-icon {\n    color: var(--ea-muted);\n  }\n\n  .ea-card-desc {\n    margin: 0 !important;\n    color: var(--ea-ink-soft);\n    font-size: 13px;\n    line-height: 1.5;\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n  }\n\n  .ea-cta {\n    display: inline-flex;\n    align-items: center;\n    align-self: flex-start;\n    gap: 6px;\n    margin-top: auto;\n    padding: 8px 16px;\n    border-radius: 999px;\n    background: color-mix(in srgb, var(--ea-primary) 12%, #fff);\n    color: var(--ea-primary);\n    font-size: 13px;\n    font-weight: 700;\n    transition: background 0.2s, color 0.2s;\n  }\n\n  \/* Bouton coll\u00e9 en bas, avec un peu d'air au-dessus *\/\n  .ea-card-body .ea-cta {\n    margin-top: auto;\n    transform: translateY(4px);\n  }\n\n  .ea-card:hover .ea-cta {\n    background: var(--ea-primary);\n    color: #fff;\n  }\n\n  .ea-cta .ea-icon {\n    transition: transform 0.2s ease;\n  }\n\n  .ea-card:hover .ea-cta .ea-icon {\n    transform: translateX(3px);\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     BOUTONS\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 7px;\n    min-height: 40px;\n    padding: 0 20px;\n    border: 0;\n    border-radius: 999px;\n    background: var(--ea-primary);\n    color: #fff !important;\n    font-size: 14px;\n    font-weight: 600;\n    text-decoration: none !important;\n    cursor: pointer;\n    transition: background 0.2s, filter 0.2s;\n  }\n\n  .ea-btn:hover {\n    background: var(--ea-primary-dark);\n  }\n\n  \/* Bouton secondaire : capsule terracotta douce *\/\n  .ea-btn--soft {\n    background: #f6e3d6;\n    color: var(--ea-ink) !important;\n  }\n\n  .ea-btn--soft:hover {\n    background: #f1d5c2;\n  }\n\n  \/* Carrousel (Activit\u00e9s du jour) *\/\n  .ea-carousel {\n    position: relative;\n  }\n\n  .ea-carousel-track {\n    display: grid;\n    grid-auto-flow: column;\n    grid-auto-columns: calc((100% - 32px) \/ 3);\n    gap: 16px;\n    overflow-x: auto;\n    scroll-snap-type: x mandatory;\n    scroll-behavior: smooth;\n    scrollbar-width: none;\n    padding: 4px 2px 8px;\n    margin: -4px -2px -8px;\n  }\n\n  .ea-carousel-track::-webkit-scrollbar {\n    display: none;\n  }\n\n  .ea-carousel--4 .ea-carousel-track {\n    grid-auto-columns: calc((100% - 48px) \/ 4);\n  }\n\n  .ea-carousel--4 .ea-card-media {\n    aspect-ratio: 16 \/ 10;\n  }\n\n  .ea-carousel--4 .ea-card-title {\n    font-size: 16px !important;\n  }\n\n  .ea-carousel-track > .ea-card {\n    scroll-snap-align: start;\n  }\n\n  .ea-carousel-btn {\n    position: absolute;\n    top: 38%;\n    z-index: 2;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 44px;\n    height: 44px;\n    border: 1px solid var(--ea-line);\n    border-radius: 50%;\n    background: var(--ea-paper);\n    color: var(--ea-ink);\n    font-size: 22px;\n    line-height: 1;\n    box-shadow: 0 6px 18px rgba(31, 42, 36, 0.18);\n    cursor: pointer;\n    transition: background 0.2s, color 0.2s;\n  }\n\n  .ea-carousel-btn:hover {\n    background: var(--ea-primary);\n    color: #fff;\n  }\n\n  .ea-carousel-btn[hidden] {\n    display: none;\n  }\n\n  .ea-carousel-btn--prev {\n    left: -18px;\n  }\n\n  .ea-carousel-btn--next {\n    right: -18px;\n  }\n\n  @media (max-width: 1100px) {\n    .ea-carousel--4 .ea-carousel-track {\n      grid-auto-columns: calc((100% - 32px) \/ 3);\n    }\n  }\n\n  @media (max-width: 900px) {\n    .ea-carousel-track,\n    .ea-carousel--4 .ea-carousel-track {\n      grid-auto-columns: calc((100% - 16px) \/ 2);\n    }\n  }\n\n  @media (max-width: 640px) {\n    .ea-carousel-track,\n    .ea-carousel--4 .ea-carousel-track {\n      grid-auto-columns: 85%;\n    }\n\n    .ea-carousel-btn {\n      display: none;\n    }\n  }\n\n  .ea-more {\n    display: flex;\n    justify-content: center;\n    margin-top: 22px;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     TEMPS FORTS \u2014 barre des jours\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-days {\n    display: grid;\n    grid-template-columns: repeat(7, minmax(0, 1fr));\n    gap: 2px;\n    margin-bottom: 16px;\n    padding: 4px;\n    border-radius: 14px;\n    background: #efe9df;\n  }\n\n  .ea-day {\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 1px;\n    min-height: 52px;\n    padding: 6px 4px;\n    border: 0;\n    border-radius: 11px;\n    background: transparent;\n    color: var(--ea-ink);\n    text-align: center;\n    cursor: pointer;\n    transition: background 0.2s;\n  }\n\n  .ea-day:hover {\n    background: rgba(255, 253, 249, 0.7);\n  }\n\n  .ea-day-name {\n    font-size: 14px;\n    font-weight: 600;\n  }\n\n  .ea-day-date {\n    font-size: 12px;\n    color: var(--ea-muted);\n  }\n\n  \/* Petit point : ce jour a des activit\u00e9s (le nombre est dans l'aria-label) *\/\n  .ea-day.has-events::after {\n    content: '';\n    position: absolute;\n    top: 7px;\n    right: 9px;\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: var(--ea-accent);\n  }\n\n  .ea-day.is-today .ea-day-name {\n    color: var(--ea-accent);\n  }\n\n  .ea-day[aria-pressed=\"true\"] {\n    background: var(--ea-primary);\n    color: #fff;\n  }\n\n  .ea-day[aria-pressed=\"true\"] .ea-day-name,\n  .ea-day[aria-pressed=\"true\"] .ea-day-date {\n    color: #fff;\n  }\n\n  .ea-day[aria-pressed=\"true\"].has-events::after {\n    background: #fff;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     \u00c0 VENIR \u2014 listes d\u00e9roulantes\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-select {\n    min-height: 38px;\n    padding: 0 32px 0 14px;\n    border: 1px solid var(--ea-line);\n    border-radius: 10px;\n    background-color: var(--ea-paper);\n    color: var(--ea-ink);\n    font-size: 13px;\n    font-weight: 600;\n    cursor: pointer;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     6. CALENDRIER (secondaire, repliable)\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-cal-panel[hidden] {\n    display: none;\n  }\n\n  .ea-cal-toolbar {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    margin-bottom: 16px;\n  }\n\n  .ea-cal-month {\n    margin: 0 !important;\n    font-size: 17px !important;\n    color: var(--ea-ink) !important;\n  }\n\n  .ea-month {\n    overflow: hidden;\n    border-radius: var(--ea-radius);\n    background: var(--ea-paper);\n    box-shadow: var(--ea-shadow);\n  }\n\n  .ea-month-head {\n    display: grid;\n    grid-template-columns: repeat(7, minmax(0, 1fr));\n    border-bottom: 1px solid var(--ea-line);\n  }\n\n  .ea-month-head div {\n    padding: 12px 6px;\n    color: var(--ea-muted);\n    font-size: 12px;\n    font-weight: 700;\n    letter-spacing: 0.08em;\n    text-align: center;\n    text-transform: uppercase;\n  }\n\n  .ea-mrow {\n    display: grid;\n    grid-template-columns: repeat(7, minmax(0, 1fr));\n    grid-template-rows: 34px repeat(3, 26px) 22px;\n    border-bottom: 1px solid var(--ea-line);\n  }\n\n  .ea-mrow:last-child {\n    border-bottom: 0;\n  }\n\n  .ea-mcell {\n    grid-row: 1 \/ -1;\n    padding: 0;\n    border: 0;\n    border-left: 1px solid var(--ea-line);\n    background: transparent;\n    cursor: pointer;\n    transition: background 0.15s;\n  }\n\n  .ea-mcell:first-child {\n    border-left: 0;\n  }\n\n  .ea-mcell:hover {\n    background: rgba(31, 42, 36, 0.03);\n  }\n\n  .ea-mcell--out {\n    background: rgba(31, 42, 36, 0.025);\n  }\n\n  .ea-mcell--selected {\n    background: color-mix(in srgb, var(--ea-primary) 10%, transparent) !important;\n    box-shadow: inset 0 0 0 2px var(--ea-primary);\n  }\n\n  .ea-mnum {\n    grid-row: 1;\n    z-index: 1;\n    justify-self: start;\n    align-self: center;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 28px;\n    height: 28px;\n    margin-left: 6px;\n    border-radius: 50%;\n    color: var(--ea-ink);\n    font-size: 13px;\n    font-weight: 600;\n    pointer-events: none;\n  }\n\n  .ea-mnum--out {\n    color: #b8b2a6;\n  }\n\n  .ea-mnum--today {\n    background: var(--ea-primary);\n    color: #fff;\n  }\n\n  .ea-mbar {\n    z-index: 1;\n    min-width: 0;\n    margin: 2px 3px;\n    padding: 0 8px;\n    border: 0;\n    border-radius: 6px;\n    background: var(--ea-cat-bg);\n    color: var(--ea-cat-fg);\n    font-size: 12px;\n    font-weight: 600;\n    line-height: 22px;\n    text-align: left;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    cursor: pointer;\n  }\n\n  .ea-mbar:hover {\n    filter: brightness(0.96);\n  }\n\n  .ea-mbar--from-before {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n\n  .ea-mbar--to-after {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n\n  .ea-mbar--ended {\n    opacity: 0.5;\n  }\n\n  .ea-mmore {\n    grid-row: 5;\n    z-index: 1;\n    align-self: center;\n    padding-left: 8px;\n    color: var(--ea-muted);\n    font-size: 12px;\n    font-weight: 600;\n    pointer-events: none;\n  }\n\n  .ea-daypanel {\n    margin-top: 24px;\n  }\n\n  .ea-daypanel-title {\n    margin: 0 0 14px !important;\n    color: var(--ea-ink) !important;\n    font-size: 19px !important;\n  }\n\n  \/* \u2500\u2500\u2500 \u00c9tats vides \u2500\u2500\u2500 *\/\n  .ea-empty {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 6px;\n    padding: 28px 20px;\n    border-radius: var(--ea-radius);\n    background: var(--ea-paper);\n    color: var(--ea-ink-soft);\n    text-align: center;\n    font-size: 14px;\n  }\n\n  .ea-empty .ea-icon {\n    margin-bottom: 4px;\n    color: var(--ea-accent);\n    font-size: 24px;\n  }\n\n  .ea-empty strong {\n    color: var(--ea-ink);\n    font-size: 16px;\n  }\n\n  .ea-empty .ea-btn {\n    margin-top: 14px;\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     MODAL (rattach\u00e9e au <body> en JS)\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  .ea-modal-overlay {\n    position: fixed !important;\n    inset: 0 !important;\n    z-index: 99999 !important;\n    max-width: none !important;\n    width: auto !important;\n    margin: 0 !important;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 20px;\n    background: rgba(20, 28, 22, 0.45);\n    backdrop-filter: blur(3px);\n  }\n\n  .ea-modal-overlay[hidden] {\n    display: none !important;\n  }\n\n  .ea-modal {\n    position: relative;\n    width: 100%;\n    max-width: 560px;\n    max-height: calc(100vh - 40px);\n    overflow-y: auto;\n    border-radius: 24px;\n    background: var(--ea-paper);\n    box-shadow: 0 30px 80px rgba(20, 28, 22, 0.35);\n    font-family: var(--ea-font);\n    color: var(--ea-ink);\n  }\n\n  .ea-modal-img {\n    display: block;\n    width: 100%;\n    height: 240px;\n    object-fit: cover;\n  }\n\n  .ea-modal-body {\n    display: flex;\n    flex-direction: column;\n    gap: 14px;\n    padding: 22px 24px 24px;\n  }\n\n  .ea-modal-title {\n    margin: 0 !important;\n    color: var(--ea-ink) !important;\n    font-size: 24px !important;\n    line-height: 1.2 !important;\n  }\n\n  .ea-modal-info {\n    display: flex;\n    flex-direction: column;\n    gap: 8px;\n    padding: 16px 18px;\n    border-radius: 14px;\n    background: var(--ea-cream);\n    color: var(--ea-ink);\n    font-size: 15px;\n  }\n\n  .ea-modal-info span {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .ea-modal-info .ea-icon {\n    color: var(--ea-accent);\n    font-size: 18px;\n  }\n\n  .ea-modal-desc {\n    margin: 0 !important;\n    color: var(--ea-ink-soft);\n    font-size: 15px;\n    line-height: 1.65;\n    white-space: pre-line;\n  }\n\n  .ea-modal-body .ea-btn {\n    align-self: flex-start;\n  }\n\n  .ea-modal-close {\n    position: absolute;\n    top: 14px;\n    right: 14px;\n    z-index: 1;\n    width: 44px;\n    height: 44px;\n    border: 0;\n    border-radius: 50%;\n    background: rgba(255, 253, 249, 0.95);\n    color: var(--ea-ink);\n    font-size: 24px;\n    line-height: 1;\n    cursor: pointer;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.18);\n  }\n\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     9. RESPONSIVE\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  @media (max-width: 1100px) {\n    .ea-grid--4 {\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n    }\n  }\n\n  @media (max-width: 900px) {\n    .ea-grid,\n    .ea-grid--4 {\n      grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n  }\n\n  @media (max-width: 640px) {\n    .ea-wrap {\n      padding: 10px 14px 44px;\n      border-radius: 0;\n    }\n\n    .ea-hero {\n      align-items: flex-end;\n      min-height: 280px;\n      padding: 22px 18px;\n      border-radius: 16px;\n    }\n\n    .ea-hero::before {\n      background: linear-gradient(0deg, rgba(14, 22, 17, 0.85) 0%, rgba(14, 22, 17, 0.35) 70%, rgba(14, 22, 17, 0.15) 100%);\n    }\n\n    .ea-hero-text {\n      font-size: 14px;\n    }\n\n\n    .ea-nav {\n      justify-content: flex-start;\n    }\n\n    .ea-nav a {\n      min-height: 34px;\n      padding: 0 10px;\n      font-size: 13px;\n    }\n\n    .ea-nav a .ea-icon {\n      display: none;\n    }\n\n    \/* Barre sur 2 lignes : sections (d\u00e9filantes) puis \u00ab Tout \/ Sur place \/ Aux alentours \u00bb *\/\n    .ea-nav-inner {\n      flex-wrap: wrap;\n      justify-content: center;\n      overflow: visible;\n      border-radius: 20px;\n    }\n\n    .ea-nav-sep {\n      display: none;\n    }\n\n    .ea-nav-links {\n      flex: 1 1 100%;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n\n    .ea-nav-links::-webkit-scrollbar {\n      display: none;\n    }\n\n    .ea-nav-links a {\n      flex-shrink: 0;\n    }\n\n    .ea-scope {\n      flex: 1 1 100%;\n      justify-content: space-between;\n    }\n\n    .ea-scope button {\n      flex: 1;\n    }\n\n    .ea-section {\n      padding-top: 36px;\n    }\n\n    .ea-grid,\n    .ea-grid--4 {\n      grid-template-columns: minmax(0, 1fr);\n      gap: 14px;\n    }\n\n    .ea-cats {\n      flex-wrap: nowrap;\n      overflow-x: auto;\n      scrollbar-width: none;\n      padding-bottom: 2px;\n    }\n\n    .ea-cats::-webkit-scrollbar {\n      display: none;\n    }\n\n    .ea-cat {\n      flex-shrink: 0;\n    }\n\n    \/* Jours : d\u00e9filement horizontal *\/\n    .ea-days {\n      display: flex;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n\n    .ea-days::-webkit-scrollbar {\n      display: none;\n    }\n\n    .ea-day {\n      flex: 0 0 64px;\n    }\n\n    \/* Calendrier : barres fines sans texte *\/\n    .ea-mrow {\n      grid-template-rows: 30px repeat(3, 8px) 18px;\n    }\n\n    .ea-mbar {\n      margin: 1px;\n      padding: 0;\n      font-size: 0;\n      line-height: 0;\n      background: var(--ea-cat-fg);\n      border-radius: 3px;\n    }\n\n    .ea-mnum {\n      margin-left: 2px;\n      font-size: 12px;\n    }\n\n    .ea-mmore {\n      padding-left: 3px;\n      font-size: 10px;\n    }\n\n    .ea-modal-img {\n      height: 190px;\n    }\n\n    .ea-modal-body {\n      padding: 20px 18px 22px;\n    }\n\n    .ea-modal-title {\n      font-size: 22px !important;\n    }\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    .ea-wrap *,\n    .ea-modal-overlay * {\n      transition: none !important;\n      scroll-behavior: auto !important;\n    }\n  }\n<\/style>\n\n\n<div class=\"ea-wrap\" id=\"ea-app\">\n\n  <!-- 1. Sans bandeau (R\u00e9glages > Elaia) : titre et introduction aux couleurs du th\u00e8me -->\n  <div class=\"ea-intro\">\n    <h1 class=\"ea-intro-title\">Animaciones y eventos<\/h1>\n    <p class=\"ea-intro-text\">Todas las actividades del momento, lo m\u00e1s destacado de la semana y los pr\u00f3ximos eventos durante su estancia.<\/p>\n  <\/div>\n\n  <!-- 2. Navigation rapide (collante) + filtre sur place \/ aux alentours -->\n  <nav class=\"ea-nav\" aria-label=\"Secciones de la p\u00e1gina\">\n    <div class=\"ea-nav-inner\">\n      <div class=\"ea-nav-links\">\n        <a href=\"#ea-sec-today\" aria-current=\"true\"><span class=\"ea-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\/><\/svg><\/span>Hoy<\/a>\n        <a href=\"#ea-sec-week\"><span class=\"ea-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"\/><path d=\"M16 3v4M8 3v4M3 10h18\"\/><\/svg><\/span>Esta semana<\/a>\n        <a href=\"#ea-sec-upcoming\"><span class=\"ea-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg><\/span>Pr\u00f3ximamente<\/a>\n              <\/div>\n              <span class=\"ea-nav-sep\" aria-hidden=\"true\"><\/span>\n        <div class=\"ea-scope\" role=\"group\" aria-label=\"\u00bfD\u00f3nde?\">\n          <button type=\"button\" data-scope=\"all\" aria-pressed=\"true\">Todo<\/button>\n                    <button type=\"button\" data-scope=\"onsite\" aria-pressed=\"false\" disabled title=\"Por ahora no hay actividades en el camping\">En el camping<\/button>\n          <button type=\"button\" data-scope=\"nearby\" aria-pressed=\"false\">En los alrededores<\/button>\n        <\/div>\n          <\/div>\n  <\/nav>\n\n  <!-- 3 \u2192 6. Sections (rendues en JS) -->\n  <section class=\"ea-section\" id=\"ea-sec-today\" aria-labelledby=\"ea-today-title\"><\/section>\n  <section class=\"ea-section\" id=\"ea-sec-week\" aria-labelledby=\"ea-week-title\"><\/section>\n  <section class=\"ea-section\" id=\"ea-sec-upcoming\" aria-labelledby=\"ea-upcoming-title\"><\/section>\n  \n  <noscript>\n    <ul>\n              <li><strong>Mercado mensual de Guitalens-L&#039;Albar\u00e8de<\/strong> \u2014 Du 01\/01\/2026 au 31\/12\/2026 \u00e0 23:59 \u2014 81220 Guitalens-L&#039;Albar\u00e8de<\/li>\n              <li><strong>Mercado mensual de Vielmur-sur-Agout<\/strong> \u2014 Du 01\/01\/2026 au 31\/12\/2026 \u00e0 23:59 \u2014 81570 Vielmur-sur-Agout<\/li>\n              <li><strong>Sala del Mercado Cubierto<\/strong> \u2014 Du 01\/01\/2026 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Peque\u00f1ado Mercado del Barrio San Pedro - Graulhet<\/strong> \u2014 Du 01\/01\/2026 \u00e0 06:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81300 Graulhet<\/li>\n              <li><strong>Gran mercado del s\u00e1bado en Lavaur<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81500 Lavaur<\/li>\n              <li><strong>Mercado - Place de la Pile<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Mercado - Plaza Fernand Pelloutier<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Mercado a cielo abierto de Marssac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81150 Marssac-sur-Tarn<\/li>\n              <li><strong>Mercado al aire libre de Saint-Ju\u00e9ry<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81160 Saint-Ju\u00e9ry<\/li>\n              <li><strong>Mercado de la Madeleine<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Mercado de los mi\u00e9rcoles en Saint-Sulpice<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81370 Saint-Sulpice-la-Pointe<\/li>\n              <li><strong>Mercado de Cordes sur Ciel<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81170 Cordes-sur-Ciel<\/li>\n              <li><strong>Mercado de Les Cabannes<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81170 Les Cabannes<\/li>\n              <li><strong>Mercado de Vaour<\/strong> \u2014 Du 01\/01\/2026 \u00e0 07:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81140 Vaour<\/li>\n              <li><strong>Mercado al aire libre de Carlus<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81990 Carlus<\/li>\n              <li><strong>Mercado de Brens<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81600 Brens<\/li>\n              <li><strong>Mercado de Castelnau de Montmiral<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81140 Castelnau-de-Montmiral<\/li>\n              <li><strong>Mercado de Gaillac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81600 Gaillac<\/li>\n              <li><strong>Mercado de Lisle-sur-Tarn<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81310 Lisle-sur-Tarn<\/li>\n              <li><strong>Mercado de Rabastens<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81800 Rabastens<\/li>\n              <li><strong>Mercado de R\u00e9almont<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81120 R\u00e9almont<\/li>\n              <li><strong>Mercado de los jueves por la ma\u00f1ana en Graulhet<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81300 Graulhet<\/li>\n              <li><strong>Mercado de productores en Lavaur<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81500 Lavaur<\/li>\n              <li><strong>Mercado del domingo por la ma\u00f1ana de Graulhet<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81300 Graulhet<\/li>\n              <li><strong>Mercado en plein aire de Arth\u00e8s<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81160 Arth\u00e8s<\/li>\n              <li><strong>Mercado semanal<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81130 Cagnac-les-Mines<\/li>\n              <li><strong>Mercado semanal de Carmaux<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81400 Carmaux<\/li>\n              <li><strong>Peque\u00f1o mercado de Briatexte<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81390 Briatexte<\/li>\n              <li><strong>Peque\u00f1o mercado de Cahuzac-sur-V\u00e8re<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81140 Cahuzac-sur-V\u00e8re<\/li>\n              <li><strong>Peque\u00f1o mercado de Gaillac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81600 Gaillac<\/li>\n              <li><strong>Peque\u00f1o mercado de Salvagnac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81630 Salvagnac<\/li>\n              <li><strong>Peque\u00f1o mercado en Saint-Sulpice<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81370 Saint-Sulpice-la-Pointe<\/li>\n              <li><strong>Mercado al aire libre de Lescure d&#039;Albigeois<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81380 Lescure-d&#039;Albigeois<\/li>\n              <li><strong>Mercado de pueblo<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81440 Lautrec<\/li>\n              <li><strong>Mercado semanal de Saint-Paul-Cap-de-Joux<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81220 Saint-Paul-Cap-de-Joux<\/li>\n              <li><strong>El Mercado de la Creaci\u00f3n y los Libreros<\/strong> \u2014 Du 01\/01\/2026 \u00e0 09:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Mercado de Lombers<\/strong> \u2014 Du 01\/01\/2026 \u00e0 10:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81120 Lombers<\/li>\n              <li><strong>Mercado Noctambio<\/strong> \u2014 Du 01\/01\/2026 \u00e0 16:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81160 Saint-Ju\u00e9ry<\/li>\n              <li><strong>Mercado de productores locales del Castelviel<\/strong> \u2014 Du 01\/01\/2026 \u00e0 16:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Mercado org\u00e1nico - Plaza Fernand Pelloutier<\/strong> \u2014 Du 01\/01\/2026 \u00e0 16:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81000 Albi<\/li>\n              <li><strong>Noctambio en Gaillac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 16:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81600 Gaillac<\/li>\n              <li><strong>Mercado de productores - S\u00e9nouillac<\/strong> \u2014 Du 01\/01\/2026 \u00e0 16:30 au 31\/12\/2026 \u00e0 23:59 \u2014 81600 Senouillac<\/li>\n              <li><strong>March\u00e9 de la Guilde Laroque<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81440 Peyregoux<\/li>\n              <li><strong>Mercado al aire libre de Castelnau-de-L\u00e9vis<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81150 Castelnau-de-L\u00e9vis<\/li>\n              <li><strong>Mercado de Saint Michel de Vax<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81140 Saint-Michel-de-Vax<\/li>\n              <li><strong>Mercado de productores ecol\u00f3gicos y locales en Teulat<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81500 Teulat<\/li>\n              <li><strong>Mercado del pueblo<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81220 Damiatte<\/li>\n              <li><strong>\u00c9cho Loco \/ Noctambio de Labastide Saint-Georges<\/strong> \u2014 Du 01\/01\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81500 Labastide-Saint-Georges<\/li>\n              <li><strong>Mercado semanal de Penne<\/strong> \u2014 Du 01\/01\/2026 \u00e0 18:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81140 Penne<\/li>\n              <li><strong>L&#039;\u00e9cho Loco, mercado de productores org\u00e1nicos en Labastide-Saint-Georges<\/strong> \u2014 Du 01\/01\/2026 \u00e0 19:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81500 Labastide-Saint-Georges<\/li>\n              <li><strong>Mercado de productores de las Barri\u00e8res<\/strong> \u2014 Du 04\/09\/2026 \u00e0 17:30 au 25\/12\/2026 \u00e0 23:59 \u2014 81310 Lisle-sur-Tarn<\/li>\n              <li><strong>Mercado de productores locales de Salvagnac<\/strong> \u2014 Du 04\/10\/2026 \u00e0 17:00 au 31\/12\/2026 \u00e0 23:59 \u2014 81630 Salvagnac<\/li>\n              <li><strong>TALLER DE ENSAMBLAJE EN CH\u00c2TEAU LA LOGE<\/strong> \u2014 Du 14\/11\/2026 \u00e0 10:00 au 14\/11\/2026 \u00e0 23:59 \u2014 31340 Villematier<\/li>\n              <li><strong>MA\u00d1ANA DE ZUMBA<\/strong> \u2014 Du 22\/11\/2026 au 22\/11\/2026 \u00e0 23:59 \u2014 31460 Le Faget<\/li>\n              <li><strong>EVENTOS DE TURISMO Y CULTURA - DESCUBRE LA ESPIRULINA<\/strong> \u2014 Du 25\/11\/2026 \u00e0 14:30 au 25\/11\/2026 \u00e0 23:59 \u2014 31380 Bazus<\/li>\n          <\/ul>\n  <\/noscript>\n<\/div>\n\n<div class=\"ea-modal-overlay\" id=\"ea-modal\" hidden>\n  <div class=\"ea-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ea-modal-title\">\n    <button type=\"button\" class=\"ea-modal-close\" id=\"ea-modal-close\" aria-label=\"Cerrar\">\u00d7<\/button>\n    <div id=\"ea-modal-content\"><\/div>\n  <\/div>\n<\/div>\n\n<script>\n  (function() {\n    var EVENTS = [{\"id\":27,\"name\":\"Mercado mensual de Guitalens-L'Albar\\u00e8de\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81220 Guitalens-L'Albar\\u00e8de\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado al aire libre de Guitalens-l'Albar\\u00e8de. \\u00a1Ven a conocer a los productores locales!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/lepaysdecocagne.fr\\\/\"},{\"id\":18,\"name\":\"Mercado mensual de Vielmur-sur-Agout\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81570 Vielmur-sur-Agout\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado al aire libre de Vielmur. Venga a conocer a los productores.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/lepaysdecocagne.fr\\\/\"},{\"id\":28,\"name\":\"Sala del Mercado Cubierto\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Haz tus compras en un sitio declarado de inter\\u00e9s en el coraz\\u00f3n del centro hist\\u00f3rico!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.marchecouvert-albi.com\\\/\"},{\"id\":8,\"name\":\"Peque\\u00f1ado Mercado del Barrio San Pedro - Graulhet\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 06:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"06:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81300 Graulhet\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Algunos comerciantes de alimentos ofrecen sus productos locales y verduras en cadenas cortas.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.ville-graulhet.fr\\\/\"},{\"id\":30,\"name\":\"Gran mercado del s\\u00e1bado en Lavaur\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Lavaur\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Situado en las galer\\u00edas, podr\\u00e1s disfrutar de uno de los mercados m\\u00e1s grandes de la regi\\u00f3n!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.ville-lavaur.fr\\\/Marches-foires-54#.WqE3CnwiEdU\"},{\"id\":45,\"name\":\"Mercado - Place de la Pile\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado de la Place de la Pile se sit\\u00faa alrededor del mercado cubierto.\\nEl s\\u00e1bado, de 7 a.m. a 1 p.m.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.mairie-albi.fr\\\/\"},{\"id\":0,\"name\":\"Mercado - Plaza Fernand Pelloutier\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Plaza Fernand Pelloutier, a solo 10 minutos del centro hist\\u00f3rico, una docena de comerciantes montan sus puestos para ofrecer frutas, verduras, carnes y mucho m\\u00e1s al p\\u00fablico.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":46,\"name\":\"Mercado a cielo abierto de Marssac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81150 Marssac-sur-Tarn\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado al aire libre constituye uno de los momentos destacados de la vida econ\\u00f3mica y social de nuestro pueblo.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.marssac-sur-tarn.fr\\\/\"},{\"id\":54,\"name\":\"Mercado al aire libre de Saint-Ju\\u00e9ry\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81160 Saint-Ju\\u00e9ry\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Cada jueves por la ma\\u00f1ana, encuentre el mercado \\\"cl\\u00e1sico\\\" de Saint-Ju\\u00e9ry en la explanada de la estaci\\u00f3n.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/ville-saint-juery.fr\\\/\"},{\"id\":10,\"name\":\"Mercado de la Madeleine\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Bulevar de Estrasburgo, a solo 5 minutos del centro hist\\u00f3rico, unas treinta puestos ofrecen frutas, verduras, carnes, \\u00a1y mucho m\\u00e1s!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":36,\"name\":\"Mercado de los mi\\u00e9rcoles en Saint-Sulpice\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81370 Saint-Sulpice-la-Pointe\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"En la plaza principal, a lo largo de la explanada, encuentra productos frescos y agr\\u00edcolas de la regi\\u00f3n.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.saintsulpicelapointe.fr\\\/\"},{\"id\":51,\"name\":\"Mercado de Cordes sur Ciel\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81170 Cordes-sur-Ciel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Productores locales, comercios de alimentaci\\u00f3n, textiles, flores...\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.mairie.cordessurciel.fr\\\/\"},{\"id\":31,\"name\":\"Mercado de Les Cabannes\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81170 Les Cabannes\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Productores locales, comercios de alimentaci\\u00f3n.\\nPescader\\u00eda, venta de frutas y verduras, horticultor local, panader\\u00eda y pasteler\\u00eda, floristas, apicultor, viticultor.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.lescabannes81.fr\\\/\"},{\"id\":52,\"name\":\"Mercado de Vaour\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 07:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"07:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81140 Vaour\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Stands de productores locales.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":33,\"name\":\"Mercado al aire libre de Carlus\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81990 Carlus\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado al aire libre constituye un momento destacado de la vida econ\\u00f3mica y social del pueblo de Carlus.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.carlus.fr\\\/\"},{\"id\":1,\"name\":\"Mercado de Brens\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81600 Brens\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Ven a hacer tus compras de productos frescos y locales!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":48,\"name\":\"Mercado de Castelnau de Montmiral\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81140 Castelnau-de-Montmiral\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"La Plaza de las Arcadas de Castelnau acoge su mercado de productores.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":39,\"name\":\"Mercado de Gaillac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81600 Gaillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Ven a hacer tus compras semanales en el mercado de Gaillac! Frutas, verduras, plantas y flores, quesos y otros dulces... Tambi\\u00e9n encontrar\\u00e1s artesanos. Desde el 20 de diciembre hasta el 21 de febrero, habr\\u00e1 un puesto de trufas.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.gaillac.fr\\\/\"},{\"id\":29,\"name\":\"Mercado de Lisle-sur-Tarn\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81310 Lisle-sur-Tarn\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Mercado de Lisle-sur-Tarn, los domingos por la ma\\u00f1ana en la plaza Paul Saissac para un momento convivial y delicioso.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":37,\"name\":\"Mercado de Rabastens\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81800 Rabastens\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Prueba productos frescos y de temporada de los productores locales!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":56,\"name\":\"Mercado de R\\u00e9almont\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81120 R\\u00e9almont\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado de R\\u00e9almont es uno de los m\\u00e1s antiguos del departamento. Data del siglo XIII.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.realmont.fr\\\/quotidien\\\/commerces\\\/marche-mercredi\"},{\"id\":3,\"name\":\"Mercado de los jueves por la ma\\u00f1ana en Graulhet\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81300 Graulhet\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"En un ambiente amigable, encuentra todo lo que necesitas en el mercado del jueves.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":4,\"name\":\"Mercado de productores en Lavaur\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Lavaur\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Peque\\u00f1o mercado reservado a productores locales.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.ville-lavaur.fr\\\/\"},{\"id\":2,\"name\":\"Mercado del domingo por la ma\\u00f1ana de Graulhet\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81300 Graulhet\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado semanal se celebra en el coraz\\u00f3n de la ciudad, en la plaza de la Rep\\u00fablica y la plaza del Jord\\u00e1n.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":9,\"name\":\"Mercado en plein aire de Arth\\u00e8s\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81160 Arth\\u00e8s\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los s\\u00e1bados por la ma\\u00f1ana, encuentra el mercado de Arth\\u00e8s en la Plaza Fran\\u00e7ois Mitterrand.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.mairie-arthes.fr\\\/\"},{\"id\":41,\"name\":\"Mercado semanal\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81130 Cagnac-les-Mines\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Encuentra a los productores locales en el coraz\\u00f3n del pueblo.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.cagnac-les-mines.fr\\\/default\\\/\"},{\"id\":35,\"name\":\"Mercado semanal de Carmaux\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81400 Carmaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado semanal del viernes por la ma\\u00f1ana en Carmaux es una cita imprescindible. \\u00a1Llena tus cestas con buenos productos locales!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":47,\"name\":\"Peque\\u00f1o mercado de Briatexte\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81390 Briatexte\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Peque\\u00f1o mercado en la plaza del pueblo.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":38,\"name\":\"Peque\\u00f1o mercado de Cahuzac-sur-V\\u00e8re\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81140 Cahuzac-sur-V\\u00e8re\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Un peque\\u00f1o mercado en la plaza del pueblo.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":44,\"name\":\"Peque\\u00f1o mercado de Gaillac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81600 Gaillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Disfruta de la frescura de los productos locales y de la convivialidad de los vendedores!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":5,\"name\":\"Peque\\u00f1o mercado de Salvagnac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81630 Salvagnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Durante todo el a\\u00f1o, descubre el mercado de Salvagnac desde las 08h. Frutas, verduras, carnicer\\u00eda, pizzas y pescado te esperan.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":21,\"name\":\"Peque\\u00f1o mercado en Saint-Sulpice\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81370 Saint-Sulpice-la-Pointe\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"En la plaza principal, un peque\\u00f1o mercado de productores locales.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.saintsulpicelapointe.fr\\\/\"},{\"id\":6,\"name\":\"Mercado al aire libre de Lescure d'Albigeois\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81380 Lescure-d'Albigeois\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado de Lescure: un mercado de productores\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.lescure-albigeois.fr\\\/\"},{\"id\":32,\"name\":\"Mercado de pueblo\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81440 Lautrec\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los viernes por la ma\\u00f1ana, un peque\\u00f1o mercado de productores en la plaza central de Lautrec! \\u00a1Buenos productos frescos y locales para todos!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.lautrec.fr\\\/\"},{\"id\":7,\"name\":\"Mercado semanal de Saint-Paul-Cap-de-Joux\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 08:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"08:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81220 Saint-Paul-Cap-de-Joux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Cada martes por la ma\\u00f1ana, un peque\\u00f1o mercado de productores en la plaza del pueblo! \\u00a1Buenos productos frescos y locales para todos!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.saintpaulcapdejoux.fr\\\/\"},{\"id\":42,\"name\":\"El Mercado de la Creaci\\u00f3n y los Libreros\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 09:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00a1Aviso a los amantes de la lectura y la artesan\\u00eda!\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":43,\"name\":\"Mercado de Lombers\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 10:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81120 Lombers\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Mercado dominical en el pueblo de Lombers.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.lombers.fr\\\/\"},{\"id\":57,\"name\":\"Mercado Noctambio\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 16:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81160 Saint-Ju\\u00e9ry\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado \\\"Noctambio\\\" tiene lugar en la plaza Marie Curie, todos los lunes de 16h a 19h. \\u00a1Ven a disfrutar de productos locales!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.nptarn.org\\\/evenements\\\/les-noctambios#17\"},{\"id\":34,\"name\":\"Mercado de productores locales del Castelviel\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 16:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A pocos pasos de la catedral, todos los jueves se realiza un mercado de productores locales (situados a menos de 60 km de Albi) bajo la nave del mercado de Castelviel; deleitando a los paladares m\\u00e1s exigentes con productos de granja\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.bienvenue-a-la-ferme.com\\\/\"},{\"id\":53,\"name\":\"Mercado org\\u00e1nico - Plaza Fernand Pelloutier\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 16:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81000 Albi\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Una docena de comerciantes le reciben en la plaza Fernand Pelloutier, los martes de 16:00 a 20:00: agricultores locales, pan, queso, galletas, empanadas saladas y frutas y verduras de producci\\u00f3n local en temporada, helados, plantas de productores.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.nptarn.org\\\/evenements\\\/les-noctambios#17\"},{\"id\":40,\"name\":\"Noctambio en Gaillac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 16:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81600 Gaillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los martes del a\\u00f1o, encuentra peque\\u00f1os productores org\\u00e1nicos bajo la nave de la plaza del Griffoul.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.nptarn.org\\\/biocybele\\\/\"},{\"id\":24,\"name\":\"Mercado de productores - S\\u00e9nouillac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 16:30 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"16:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81600 Senouillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Ven y termina tu d\\u00eda paseando por este peque\\u00f1o mercado de productores.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":14,\"name\":\"March\\u00e9 de la Guilde Laroque\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81440 Peyregoux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Mercado semanal en la Guilde Laroque\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":25,\"name\":\"Mercado al aire libre de Castelnau-de-L\\u00e9vis\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81150 Castelnau-de-L\\u00e9vis\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Cada viernes por la noche, encuentra el mercado de productores en Castelnau-de-L\\u00e9vis en la plaza del pueblo.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.carlus.fr\\\/\"},{\"id\":26,\"name\":\"Mercado de Saint Michel de Vax\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81140 Saint-Michel-de-Vax\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Mercado de productores locales: agricultores, viticultores, pan, miel, cerveza, queso, peque\\u00f1as restauraciones en el lugar.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":17,\"name\":\"Mercado de productores ecol\\u00f3gicos y locales en Teulat\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Teulat\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los jueves del a\\u00f1o, de 17:00 a 20:00, bajo la Halle del jard\\u00edn p\\u00fablico de Teulat, para descubrir un mercado de productos locales y ecol\\u00f3gicos, ofrecido por los productores del pueblo y de los alrededores.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/mairie-teulat.fr\\\/\"},{\"id\":22,\"name\":\"Mercado del pueblo\",\"type\":\"evenements-locaux-31\",\"category\":\"marches-foires\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81220 Damiatte\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los jueves de 17h a 21h, peque\\u00f1o mercado de productores en el aparcamiento del sal\\u00f3n de reuniones! \\u00a1Buenos productos frescos y locales para todos!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/mairie-damiatte.com\\\/\"},{\"id\":13,\"name\":\"\\u00c9cho Loco \\\/ Noctambio de Labastide Saint-Georges\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Labastide-Saint-Georges\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Todos los jueves de 17:00 a 19:00 en la place de la Fraternit\\u00e9, encuentre su mercado campesino y ecol\\u00f3gico.\\r\\nEncontrar\\u00e1 una amplia gama de productos ecol\\u00f3gicos y locales.\\r\\nAparcamiento gratuito.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.nptarn.org\\\/evenements\\\/les-noctambios#17\"},{\"id\":55,\"name\":\"Mercado semanal de Penne\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 18:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"18:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81140 Penne\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Mercado de productores locales. \\u00a1No te pierdas la reuni\\u00f3n del jueves por la noche con peque\\u00f1as comidas y barra! En febrero y marzo, el mercado solo se realiza el \\u00faltimo jueves del mes.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":50,\"name\":\"L'\\u00e9cho Loco, mercado de productores org\\u00e1nicos en Labastide-Saint-Georges\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 01\\\/01\\\/2026 \\u00e0 19:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"19:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Labastide-Saint-Georges\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"El mercado de L'\\u00e9cho Loco te espera cada jueves de 19:00 a 20:30 en la plaza de la Fraternidad. Este mercado de productores est\\u00e1 certificado en Bio AB, Nature et Progr\\u00e8s, Biodynamie, o similar.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/app.cagette.net\\\/group\\\/7015\"},{\"id\":12,\"name\":\"Mercado de productores de las Barri\\u00e8res\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 04\\\/09\\\/2026 \\u00e0 17:30 au 25\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-09-04\",\"end\":\"2026-12-25\",\"start_time\":\"17:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81310 Lisle-sur-Tarn\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Durante todo el a\\u00f1o, t\\u00f3mate tiempo para pasear por este peque\\u00f1o mercado de productores, un aut\\u00e9ntico concentrado de sabores locales. Encontrar\\u00e1s una selecci\\u00f3n de productores locales: verduras de temporada, quesos y platos de catering.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":49,\"name\":\"Mercado de productores locales de Salvagnac\",\"type\":\"evenements-locaux-31\",\"category\":\"mercados-y-ferias\",\"label\":\"Du 04\\\/10\\\/2026 \\u00e0 17:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-10-04\",\"end\":\"2026-12-31\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81630 Salvagnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Durante todo el a\\u00f1o, descubre el mercado campesino de Salvagnac a partir de las 17h. En verano, el mercado comienza a las 18h.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":15,\"name\":\"JAM SOULEY\",\"type\":\"evenements-locaux-31\",\"category\":\"conciertos-musica-y-festivales\",\"label\":\"Du 07\\\/11\\\/2026 au 07\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-07\",\"end\":\"2026-11-07\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"31460 Loubens-Lauragais\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"D\\u00e9jate llevar por el ambiente acogedor de una velada dedicada a la m\\u00fasica en vivo y al placer de tocar juntos. Tanto si eres un m\\u00fasico experimentado, un principiante o simplemente un amante de los buenos encuentros, encontrar\\u00e1s un espacio de intercambio donde cada uno puede aportar su toque personal.\\n\\nA lo largo de la velada, podr\\u00e1s escuchar, improvisar, compartir una canci\\u00f3n o descubrir nuevos universos musicales en un ambiente cordial y relajado. Todos los estilos y todos los instrumentos tienen cabida, favoreciendo los encuentros y la creatividad espont\\u00e1nea.\\n\\nCita en la Auberge de Loubens Lauragais a partir de las 19:30 para vivir un momento de m\\u00fasica, intercambio y buen humor, impulsado por el deseo colectivo de tocar juntos.\",\"image\":\"http:\\\/\\\/cdt31.media.tourinsoft.eu\\\/upload\\\/833701878-1056445880720710-742694986371225743-n.jpg\",\"credit\":\"Auberge de Loubens\",\"link\":\"\"},{\"id\":20,\"name\":\"17.\\u00aa FERIA DE LAS PLANTAS EN CHATEAU DE BONREPOS RIQUET\",\"type\":\"evenements-locaux-31\",\"category\":\"conciertos-musica-y-festivales\",\"label\":\"Du 07\\\/11\\\/2026 \\u00e0 10:00 au 08\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-07\",\"end\":\"2026-11-08\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"31590 Bonrepos-Riquet\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Durante todo un fin de semana, numerosos expositores procedentes de toda la regi\\u00f3n y de otros lugares presentar\\u00e1n sus colecciones vegetales, entre ellas muchas especies raras, antiguas o poco conocidas por el gran p\\u00fablico. Viveristas especializados, productores, coleccionistas y artesanos compartir\\u00e1n sus conocimientos y consejos con los visitantes.\\n\\nEste evento ser\\u00e1 la ocasi\\u00f3n de descubrir una gran diversidad de plantas: vivaces, arbustos, c\\u00edtricos, bulbos y rizomas, gram\\u00edneas, iris de colecci\\u00f3n, orqu\\u00eddeas, plantas carn\\u00edvoras, plantas arom\\u00e1ticas y medicinales, rosales, variedades antiguas y otros tesoros bot\\u00e1nicos cuidadosamente seleccionados.\\n\\nEn el marco excepcional del Domaine de Bonrepos-Riquet, los visitantes podr\\u00e1n conversar con profesionales apasionados, informarse sobre pr\\u00e1cticas de jardiner\\u00eda respetuosas con el medio ambiente y encontrar numerosas ideas para embellecer jardines, terrazas y balcones.\\n\\nM\\u00e1s all\\u00e1 del aspecto hort\\u00edcola, estas Jornadas de las Plantas ofrecer\\u00e1n tambi\\u00e9n un momento de paseo y descubrimiento, en un ambiente acogedor y familiar.\\n\\nTanto si es un jardinero aficionado, un coleccionista experimentado o simplemente un curioso, este evento promete una verdadera inmersi\\u00f3n en el fascinante mundo de las plantas.\",\"image\":\"http:\\\/\\\/cdt31.media.tourinsoft.eu\\\/upload\\\/JPLANTES2026.jpg\",\"credit\":\"Domaine de Bonrepos-Riquet\",\"link\":\"https:\\\/\\\/www.bonrepos-riquet.fr\\\/index.php\\\/chateau\"},{\"id\":11,\"name\":\"Noche de Cabaret en la Granja\",\"type\":\"evenements-locaux-31\",\"category\":\"otros-eventos\",\"label\":\"Du 07\\\/11\\\/2026 \\u00e0 19:00 au 07\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-07\",\"end\":\"2026-11-07\",\"start_time\":\"19:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"81500 Garrigues\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"19h: Recepci\\u00f3n - 20h: Comida - 22h: Espect\\u00e1culo\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/lesfoliesfermieres.com\\\/\"},{\"id\":19,\"name\":\"TALLER DE ENSAMBLAJE EN CH\\u00c2TEAU LA LOGE\",\"type\":\"evenements-locaux-31\",\"category\":\"otros-eventos\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 10:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"31340 Villematier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Cada segundo s\\u00e1bado del mes, Maxime te espera en la finca para una ma\\u00f1ana dedicada a la creaci\\u00f3n y la convivencia (de 10:00 a 12:00).\\n\\nOlv\\u00eddate de la teor\\u00eda aburrida: aqu\\u00ed se toca, se huele, se prueba y se mezcla.\\n\\n1 - Exploramos juntos nuestras 6 ha de vi\\u00f1edos ecol\\u00f3gicos.\\n2 - Manejamos probetas y jugamos con las variedades de uva para encontrar el equilibrio perfecto.\\n3 - Te llevas un recuerdo \\u00fanico: \\u00a1tu propia botella personalizada de 75 cl!\\n\\nEs ameno, profesional y accesible para todos, tanto si eres experto como si solo tienes curiosidad.\\n\\nTaller confirmado a partir de 6 participantes (\\u00a1perfecto para grupos!) - Plazas limitadas, reserva obligatoria.\",\"image\":\"http:\\\/\\\/cdt31.media.tourinsoft.eu\\\/upload\\\/atelier-assemblage-la-loge.jpg\",\"credit\":\"DR\",\"link\":\"\"},{\"id\":23,\"name\":\"MA\\u00d1ANA DE ZUMBA\",\"type\":\"evenements-locaux-31\",\"category\":\"otros-eventos\",\"label\":\"Du 22\\\/11\\\/2026 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"31460 Le Faget\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00bfTe apetece moverte en un ambiente agradable y din\\u00e1mico? \\u00danete a la Ma\\u00f1ana de Zumba organizada en la sala polivalente de Faget. Durante una hora y media, d\\u00e9jate llevar por ritmos contagiosos y coreograf\\u00edas accesibles que te permitir\\u00e1n recargar energ\\u00edas mientras compartes un momento cercano con los dem\\u00e1s participantes.\\n\\nTanto si ya sueles asistir a clases de Zumba como si simplemente tienes curiosidad por descubrir esta actividad que combina baile y fitness, esta ma\\u00f1ana es una excelente oportunidad para ejercitarte en un ambiente relajado y motivador.\\n\\nEl evento est\\u00e1 organizado por SELFAGET, con una tarifa de 10 \\u20ac para los socios y 12 \\u20ac para los no socios. Cita de 10:30 a 12:00 para disfrutar de este par\\u00e9ntesis deportivo y festivo.\",\"image\":\"http:\\\/\\\/cdt31.media.tourinsoft.eu\\\/upload\\\/825351746-122139940689383488-572255916299534193-n.jpg\",\"credit\":\"SELFAGET\",\"link\":\"\"},{\"id\":16,\"name\":\"EVENTOS DE TURISMO Y CULTURA - DESCUBRE LA ESPIRULINA\",\"type\":\"evenements-locaux-31\",\"category\":\"otros-eventos\",\"label\":\"Du 25\\\/11\\\/2026 \\u00e0 14:30 au 25\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-25\",\"end\":\"2026-11-25\",\"start_time\":\"14:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"31380 Bazus\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Nicolas Fourtouil, tras una carrera en el transporte y la log\\u00edstica aeron\\u00e1utica, decidi\\u00f3 cultivar este microorganismo acu\\u00e1tico a las puertas de Toulouse. Su proyecto: un cultivo local, una explotaci\\u00f3n de tama\\u00f1o humano, un producto destinado a los habitantes de Toulouse. Durante la visita pedag\\u00f3gica, que dura aproximadamente 1 hora, Nicolas le explicar\\u00e1 todo sobre los or\\u00edgenes, los beneficios y el cultivo de este \\u201csuperalimento\\u201d, como la OMS califica la espirulina.\\n\\nAprender\\u00e1, entre otras cosas, que la espirulina forma parte de los 9 alimentos b\\u00e1sicos de los astronautas, que su cultivo consume muy poca energ\\u00eda, que todo el mundo puede encontrar inter\\u00e9s en consumirla, pero no solo eso. \\u00a1Para verlo todo y saberlo todo, inscr\\u00edbase!\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.spirulinetolosane.com\\\/event-details\\\/visitez-la-ferme-de-spiruline-tolosane-2026-01-21-14-30\"}];\n    var CATEGORIES = {\"mercados-y-ferias\":{\"key\":\"mercados-y-ferias\",\"label\":\"Mercados y ferias\",\"color\":\"#ef4444\",\"count\":51},\"otros-eventos\":{\"key\":\"otros-eventos\",\"label\":\"Otros eventos\",\"color\":\"#3b82f6\",\"count\":4},\"conciertos-musica-y-festivales\":{\"key\":\"conciertos-musica-y-festivales\",\"label\":\"Conciertos, m\\u00fasica y festivales\",\"color\":\"#10b981\",\"count\":2},\"marches-foires\":{\"key\":\"marches-foires\",\"label\":\"March\\u00e9s & foires\",\"color\":\"#f59e0b\",\"count\":1}};\n    var TODAY = \"2026-11-10\";\n    \/\/ Textes et format des dates dans la langue de la page (includes\/i18n.php)\n    var T = {\"blog_read_more\":\"Leer el art\\u00edculo\",\"blog_empty\":\"Todav\\u00eda no hay art\\u00edculos.\",\"blog_newer\":\"Art\\u00edculos m\\u00e1s recientes\",\"blog_older\":\"Art\\u00edculos anteriores\",\"blog_label\":\"Art\\u00edculos\",\"hero_title\":\"Para descubrir a su alrededor\",\"hero_text\":\"Pueblos, playas, paseos, buenas direcciones y experiencias seleccionadas en torno a su estancia.\",\"around\":\"Alrededor de\",\"search_placeholder\":\"Buscar un lugar, una actividad, un pueblo\\u2026\",\"search\":\"Buscar\",\"max_distance\":\"Distancia m\\u00e1xima\",\"all\":\"Todo\",\"prev_categories\":\"Categor\\u00edas anteriores\",\"next_categories\":\"Categor\\u00edas siguientes\",\"categories\":\"Categor\\u00edas\",\"display\":\"Vista\",\"list\":\"Lista\",\"map\":\"Mapa\",\"close\":\"Cerrar\",\"featured\":\"Destacado\",\"discover\":\"Descubrir\",\"idea\":\"idea\",\"ideas\":\"ideas\",\"around_you\":\"a su alrededor\",\"no_result\":\"Sin resultados\",\"no_result_hint\":\"Pruebe otra b\\u00fasqueda, categor\\u00eda o distancia.\",\"pagination\":\"Paginaci\\u00f3n\",\"prev_page\":\"P\\u00e1gina anterior\",\"next_page\":\"P\\u00e1gina siguiente\",\"ideas_title\":\"Ideas seg\\u00fan sus gustos\",\"ideas_sub\":\"Sugerencias para organizar su estancia ideal.\",\"reset_view\":\"Volver a la vista general\",\"map_hint\":\"Haga clic en un marcador del mapa para ver la ficha aqu\\u00ed.\",\"official_site\":\"Sitio oficial\",\"video\":\"V\\u00eddeo\",\"gallery\":\"Galer\\u00eda\",\"documents\":\"Documentos\",\"faq\":\"Preguntas frecuentes\",\"no_answer\":\"Todav\\u00eda sin respuesta.\",\"see_on_maps\":\"Ver en Google Maps\",\"see_place_on_maps\":\"Ver el camping en Google Maps\",\"yes\":\"S\\u00ed\",\"no\":\"No\",\"practical_info\":\"Informaci\\u00f3n pr\\u00e1ctica\",\"reviews\":\"opiniones\",\"read_more\":\"Leer m\\u00e1s\",\"prev_review\":\"Opini\\u00f3n anterior\",\"next_review\":\"Opini\\u00f3n siguiente\",\"prev_item\":\"Anterior\",\"next_item\":\"Siguiente\",\"photo_credit\":\"Foto: %s\",\"directions\":\"C\\u00f3mo llegar\",\"read_less\":\"Ver menos\",\"article_in_this\":\"En este art\\u00edculo\",\"article_toc\":\"\\u00cdndice del art\\u00edculo\",\"see_original\":\"Traducido autom\\u00e1ticamente \\u00b7 Ver original\",\"see_translation\":\"Ver traducci\\u00f3n\",\"stars_out_of_5\":\"%s estrellas de 5\",\"owner_reply\":\"Respuesta del establecimiento\",\"customer\":\"Cliente\",\"customer_reviews\":\"Opiniones de clientes\",\"rating_label\":\"Valoraci\\u00f3n %1$s de 5, %2$s opiniones \\u2014 ver las opiniones\",\"reviews_by\":\"Opiniones presentadas por Elaia\",\"powered_by\":\"Con la tecnolog\\u00eda de\",\"today\":\"Hoy\",\"today_lc\":\"hoy\",\"tomorrow\":\"Ma\\u00f1ana\",\"until\":\"Hasta el %s\",\"from_to\":\"Del %1$s al %2$s\",\"registration\":\"Con inscripci\\u00f3n\",\"full\":\"Completo\",\"all_animations\":\"Ver todas las actividades \\u2192\",\"ago_day\":\"hace %d d\\u00eda\",\"ago_days\":\"hace %d d\\u00edas\",\"ago_week\":\"hace %d semana\",\"ago_weeks\":\"hace %d semanas\",\"ago_month\":\"hace %d mes\",\"ago_months\":\"hace %d meses\",\"ago_year\":\"hace %d a\\u00f1o\",\"ago_years\":\"hace %d a\\u00f1os\",\"anim_unavailable\":\"El programa no est\\u00e1 disponible temporalmente\",\"content_unavailable\":\"Este contenido no est\\u00e1 disponible temporalmente\",\"anim_eyebrow\":\"Viva momentos inolvidables\",\"anim_title\":\"Animaciones y eventos\",\"anim_hero_text\":\"Todas las actividades del momento, lo m\\u00e1s destacado de la semana y los pr\\u00f3ximos eventos durante su estancia.\",\"anim_sections\":\"Secciones de la p\\u00e1gina\",\"anim_nav_today\":\"Hoy\",\"anim_nav_week\":\"Esta semana\",\"anim_nav_upcoming\":\"Pr\\u00f3ximamente\",\"anim_nav_calendar\":\"Calendario\",\"anim_where\":\"\\u00bfD\\u00f3nde?\",\"anim_onsite\":\"En el camping\",\"anim_nearby\":\"En los alrededores\",\"anim_no_onsite\":\"Por ahora no hay actividades en el camping\",\"anim_no_nearby\":\"Por ahora no hay eventos en los alrededores\",\"anim_all_day\":\"Todo el d\\u00eda\",\"anim_at\":\"a las %s\",\"anim_see_detail\":\"ver el detalle\",\"anim_live\":\"En curso\",\"anim_onsite_spot\":\"En el camping \\u00b7 %s\",\"anim_badge_until\":\"Hasta\",\"anim_badge_from\":\"Del\",\"anim_badge_today\":\"Hoy\",\"anim_filter_cat\":\"Filtrar por categor\\u00eda\",\"anim_all_f\":\"Todas\",\"anim_prev_day\":\"D\\u00eda anterior\",\"anim_next_day\":\"D\\u00eda siguiente\",\"anim_today_title\":\"Actividades del d\\u00eda\",\"anim_tomorrow_title\":\"Actividades de ma\\u00f1ana\",\"anim_day_title\":\"Actividades del %s\",\"anim_relax_today\":\"Hoy, d\\u00eda de descanso\",\"anim_nothing_day\":\"Nada previsto ese d\\u00eda\",\"anim_next_on\":\"Pr\\u00f3xima cita el %s.\",\"anim_soon\":\"El programa se actualizar\\u00e1 pronto.\",\"anim_see_day\":\"Ver ese d\\u00eda\",\"anim_prev_acts\":\"Actividades anteriores\",\"anim_next_acts\":\"Actividades siguientes\",\"anim_prev_week\":\"Semana anterior\",\"anim_next_week\":\"Semana siguiente\",\"anim_week_title\":\"Lo m\\u00e1s destacado de la semana\",\"anim_next_week_title\":\"La pr\\u00f3xima semana\",\"anim_week_of\":\"Semana del %s\",\"anim_week_days\":\"D\\u00edas de la semana\",\"anim_today_paren\":\"(hoy)\",\"anim_activity\":\"%d actividad\",\"anim_activities\":\"%d actividades\",\"anim_nothing\":\"nada previsto\",\"anim_pick_day\":\"Seleccione otro d\\u00eda para ver su programa.\",\"anim_sort\":\"Ordenar los eventos\",\"anim_sort_date\":\"Ordenar por fecha\",\"anim_sort_name\":\"Ordenar por nombre\",\"anim_upcoming_title\":\"Todos los pr\\u00f3ximos eventos\",\"anim_no_upcoming\":\"No hay pr\\u00f3ximos eventos\",\"anim_try_cat\":\"Pruebe otra categor\\u00eda.\",\"anim_more\":\"Ver m\\u00e1s eventos (%d)\",\"anim_hide_cal\":\"Ocultar el calendario\",\"anim_show_cal\":\"Ver el calendario completo\",\"anim_cal_title\":\"Calendario del mes\",\"anim_cal_sub\":\"Todas las citas del mes de un vistazo.\",\"anim_prev_month\":\"Mes anterior\",\"anim_next_month\":\"Mes siguiente\",\"anim_more_info\":\"M\\u00e1s informaci\\u00f3n\",\"anim_new_tab\":\"(nueva pesta\\u00f1a)\",\"date_locale\":\"es-ES\",\"page_faq\":\"Preguntas frecuentes\",\"page_metadatas\":\"Descubra los alrededores\",\"page_animations\":\"Animaciones y eventos\",\"page_corpus\":\"Informaci\\u00f3n pr\\u00e1ctica\",\"anim_event\":\"Evento\"};\n    function tf(key) { var a = [].slice.call(arguments, 1), i = 0; return T[key].replace(\/%(\\d\\$)?[sd]\/g, function (m, pos) { return pos ? a[parseInt(pos, 10) - 1] : a[i++]; }); }\n    \/\/ Image par d\u00e9faut du chatbot, utilis\u00e9e quand une fiche n'a pas d'image\n    var DEFAULT_IMG = \"https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/chatbot-defaults\\\/P0nzKsLxolsmOjEPg3OxjYNuX9uYab2eMxhbzVwD.png\";\n\n    var app = document.getElementById('ea-app');\n    if (!app) return;\n\n    var TODAY_MAX = 3; \/\/ cartes \u00ab aujourd'hui \u00bb avant \u00ab Voir les autres \u00bb\n    var UPCOMING_STEP = 8;\n\n    var state = {\n      day: TODAY,\n      todayAll: false,\n      week: null,\n      weekDay: TODAY,\n      cat: 'all',\n      scope: 'all', \/\/ all | onsite | nearby\n      sort: 'date',\n      upcomingLimit: UPCOMING_STEP,\n      calendarOpen: false,\n      month: TODAY.slice(0, 7),\n      selectedDay: null\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ IC\u00d4NES (SVG statiques)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var ICONS = {\n      pin: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z\"\/><circle cx=\"12\" cy=\"9.5\" r=\"2.5\"\/><\/svg>',\n      calendar: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"\/><path d=\"M16 3v4M8 3v4M3 10h18\"\/><\/svg>',\n      arrow: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>',\n      external: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M14 5h5v5M19 5l-8 8M18 14v5H5V6h5\"\/><\/svg>',\n      sun: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\/><\/svg>',\n      pen: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11l2 2 4-4\"\/><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\"\/><path d=\"M8 7h8\"\/><\/svg>',\n      clock: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg>',\n      star: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"><path d=\"M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3 6.4 20.2l1.1-6.2L3 9.6l6.2-.9z\"\/><\/svg>',\n      leaf: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 19c0-8 5-14 15-14 0 10-6 15-14 15\"\/><path d=\"M5 19l7-7\"\/><\/svg>',\n      tent: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4L3 20h18L12 4z\"\/><path d=\"M12 4v16M9 20l3-6 3 6\"\/><\/svg>'\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ CAT\u00c9GORIES \u2014 pastels harmonieux d\u00e9duits du libell\u00e9\n    \/\/ (le libell\u00e9 est toujours affich\u00e9 : l'info ne passe pas que par la couleur)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var CAT_STYLES = [\n      [\/enfant|kid|junior\/, '#fff1c9', '#6f5200'],\n      [\/famil\/, '#fdf0d5', '#7a4e00'],\n      [\/bien.?etre|yoga|zen|detente|relax|spa\/, '#e3f1e6', '#24613a'],\n      [\/concert|musique|soiree|dj|bal\\b\/, '#ece6fa', '#4b3a8c'],\n      [\/spectacle|theatre|cinema|cirque|magie\/, '#fbe3e1', '#8f2d27'],\n      [\/sport|rando|velo|course|tournoi|petanque|nautique\/, '#dcefeb', '#1f5f55'],\n      [\/expo|musee|culture|patrimoine|visite\/, '#f3e6ef', '#7a2f5c'],\n      [\/march|brocante|vide.?grenier|artisan|terroir|degust\/, '#e8f0dc', '#3f5a1e'],\n      [\/animation|fete|festiv|atelier|jeu\/, '#fbe7d7', '#8e4214']\n    ];\n\n    function norm(s) {\n      return (s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, '');\n    }\n\n    function catStyle(key) {\n      var hay = norm(key + ' ' + (CATEGORIES[key] ? CATEGORIES[key].label : ''));\n      for (var i = 0; i < CAT_STYLES.length; i++) {\n        if (CAT_STYLES[i][0].test(hay)) return { bg: CAT_STYLES[i][1], fg: CAT_STYLES[i][2] };\n      }\n      return { bg: '#eceee8', fg: '#3c463f' };\n    }\n\n    function applyCat(node, key) {\n      var s = catStyle(key);\n      node.style.setProperty('--ea-cat-bg', s.bg);\n      node.style.setProperty('--ea-cat-fg', s.fg);\n    }\n\n    function catLabel(e) {\n      return CATEGORIES[e.category] ? CATEGORIES[e.category].label : '';\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DATES \u2014 cha\u00eenes Y-m-d (pas de d\u00e9calage de fuseau)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function toDate(ymd) {\n      var p = ymd.split('-');\n      return new Date(+p[0], +p[1] - 1, +p[2], 12);\n    }\n\n    function toYmd(d) {\n      return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n    }\n\n    function addDays(ymd, n) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() + n);\n      return toYmd(d);\n    }\n\n    function daysBetween(a, b) {\n      return Math.round((toDate(b) - toDate(a)) \/ 86400000);\n    }\n\n    function weekStart(ymd) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() - (d.getDay() + 6) % 7);\n      return toYmd(d);\n    }\n\n    function fmt(ymd, opts) {\n      return toDate(ymd).toLocaleDateString(T.date_locale, opts);\n    }\n\n    function ucfirst(s) {\n      return s.charAt(0).toUpperCase() + s.slice(1);\n    }\n\n    function shortDate(ymd) {\n      return fmt(ymd, { day: 'numeric', month: 'short' });\n    }\n\n    function byTime(a, b) {\n      return (a.start_time || '').localeCompare(b.start_time || '') || a.name.localeCompare(b.name, T.date_locale);\n    }\n\n    \/** Filtres globaux : sur place \/ aux alentours + cat\u00e9gorie *\/\n    function visible(e) {\n      if (state.scope === 'onsite' && !e.onsite) return false;\n      if (state.scope === 'nearby' && e.onsite) return false;\n      return state.cat === 'all' || e.category === state.cat;\n    }\n\n    function eventsOn(ymd) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= ymd && e.end >= ymd;\n      }).sort(byTime);\n    }\n\n    function eventsBetween(from, to) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= to && e.end >= from;\n      });\n    }\n\n    \/** Ligne horaire d'une carte vue depuis un jour donn\u00e9 *\/\n    function timeLabel(e, day) {\n      if (e.start === day && e.start_time) return e.start_time + (e.end_time && e.start === e.end ? ' \u2013 ' + e.end_time : '');\n      if (e.start !== e.end || e.open_start) return tf('until', shortDate(e.end));\n      return T.anim_all_day;\n    }\n\n    \/** Ligne date d'une carte \u00ab \u00e0 venir \u00bb *\/\n    function dateLabel(e) {\n      if (e.open_start) return tf('until', shortDate(e.end));\n      if (e.start !== e.end) return tf('from_to', shortDate(e.start), shortDate(e.end));\n      var d = ucfirst(fmt(e.start, { weekday: 'short', day: 'numeric', month: 'short' }));\n      return d + (e.start_time ? ' \u00b7 ' + e.start_time : '');\n    }\n\n    function fullWhenLabel(e) {\n      var opts = { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' };\n      if (e.open_start) return tf('until', fmt(e.end, opts));\n      var time = e.start_time ? ' ' + tf('anim_at', e.start_time) : '';\n      if (e.start === e.end) return ucfirst(fmt(e.start, opts)) + time + (e.end_time ? ' \u2013 ' + e.end_time : '');\n      return tf('from_to', fmt(e.start, { day: 'numeric', month: 'long' }) + time, fmt(e.end, opts) + (e.end_time ? ' ' + tf('anim_at', e.end_time) : ''));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DOM\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function el(tag, cls, text) {\n      var n = document.createElement(tag);\n      if (cls) n.className = cls;\n      if (text != null) n.textContent = text;\n      return n;\n    }\n\n    function icon(name) {\n      var s = el('span', 'ea-icon');\n      s.setAttribute('aria-hidden', 'true');\n      s.innerHTML = ICONS[name];\n      return s;\n    }\n\n    \/** Image de la fiche \u2192 image par d\u00e9faut du chatbot \u2192 aplat illustr\u00e9 *\/\n    function media(e, cls) {\n      var fallback = function() {\n        var f = el('div', 'ea-card-fallback');\n        f.appendChild(icon('tent'));\n        return f;\n      };\n      if (!e.image && !DEFAULT_IMG) return fallback();\n      var img = el('img', cls);\n      var useDefault = !e.image;\n      img.src = useDefault ? DEFAULT_IMG : e.image;\n      img.alt = e.name;\n      img.loading = 'lazy';\n      img.decoding = 'async';\n      if (useDefault) img.classList.add('ea-img--default');\n      img.onerror = function() {\n        \/\/ Le cr\u00e9dit n'est plus celui de l'image affich\u00e9e\n        var cr = img.parentNode && img.parentNode.querySelector('.ea-credit');\n        if (cr) cr.remove();\n        if (!useDefault && DEFAULT_IMG) {\n          useDefault = true;\n          img.classList.add('ea-img--default');\n          img.src = DEFAULT_IMG;\n        } else if (img.parentNode) {\n          img.replaceWith(fallback());\n        }\n      };\n      return img;\n    }\n\n    \/** Cr\u00e9dit photo en bas \u00e0 droite de l'image (rien sans image propre) *\/\n    function credit(e) {\n      if (!e.image || !e.credit) return null;\n      var txt = \/^(\u00a9|\\(c\\))\/i.test(e.credit) ? e.credit : '\u00a9 ' + e.credit;\n      var c = el('span', 'ea-credit', txt);\n      c.title = txt;\n      return c;\n    }\n\n    function pill(e) {\n      var p = el('span', 'ea-pill', catLabel(e));\n      applyCat(p, e.category);\n      return p;\n    }\n\n    \/**\n     * Carte \u00e9v\u00e9nement (composant unique).\n     * @param {object} e\n     * @param {object} o { day: 'Y-m-d' \u2192 heure du jour | date: true \u2192 dates de l'\u00e9v\u00e9nement }\n     *\/\n    function card(e, o) {\n      o = o || {};\n      var c = el('article', 'ea-card' + (e.end < TODAY ? ' ea-card--ended' : ''));\n      c.tabIndex = 0;\n      c.setAttribute('role', 'button');\n      c.setAttribute('aria-label', e.name + ' \u2014 ' + (o.date ? dateLabel(e) : timeLabel(e, o.day)) + ' \u2014 ' + T.anim_see_detail);\n      applyCat(c, e.category);\n\n      var m = el('div', 'ea-card-media');\n      m.appendChild(media(e));\n      var cr = credit(e);\n      if (cr) m.appendChild(cr);\n      m.appendChild(dateBadge(e));\n      if (o.day === TODAY && e.start < TODAY && e.end >= TODAY) {\n        m.appendChild(el('span', 'ea-live', T.anim_live));\n      }\n      if (e.registration) {\n        var reg = el('span', 'ea-reg');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(document.createTextNode(T.registration));\n        m.appendChild(reg);\n      }\n      c.appendChild(m);\n\n      var b = el('div', 'ea-card-body');\n      var top = el('div', 'ea-card-top');\n      if (!o.date) {\n        var w = el('span', 'ea-when');\n        w.appendChild(icon('clock'));\n        w.appendChild(document.createTextNode(timeLabel(e, o.day)));\n        top.appendChild(w);\n      }\n      if (top.childNodes.length) b.appendChild(top);\n      b.appendChild(el('h3', 'ea-card-title', e.name));\n      var where = placeLabel(e);\n      if (where) {\n        var p = el('p', 'ea-place');\n        p.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        p.appendChild(document.createTextNode(where));\n        b.appendChild(p);\n      }\n      if (e.description) b.appendChild(el('p', 'ea-card-desc', e.description));\n      var cta = el('span', 'ea-cta', T.discover);\n      cta.appendChild(icon('arrow'));\n      b.appendChild(cta);\n      c.appendChild(b);\n\n      c.addEventListener('click', function() {\n        openModal(e);\n      });\n      c.addEventListener('keydown', function(ev) {\n        if (ev.key === 'Enter' || ev.key === ' ') {\n          ev.preventDefault();\n          openModal(e);\n        }\n      });\n      return c;\n    }\n\n    \/** O\u00f9 : lieu dans l'\u00e9tablissement (sur place) ou ville (aux alentours) *\/\n    function placeLabel(e) {\n      if (e.onsite) return e.spot ? tf('anim_onsite_spot', e.spot) : T.anim_onsite;\n      return e.city;\n    }\n\n    \/**\n     * Badge date sur l'image, toujours sur 3 lignes et de taille fixe :\n     *   un jour     \u2192 LUN \/ 28 \/ SEPT\n     *   jusqu'au    \u2192 JUSQU'AU \/ 18 \/ OCT\n     *   p\u00e9riode     \u2192 25 SEPT \u2192 \/ 7 \/ OCT   (du 25 sept. au 7 oct.)\n     *\/\n    function dateBadge(e) {\n      var month = function(ymd) {\n        return fmt(ymd, { month: 'short' }).replace('.', '');\n      };\n      var top, day, end = '';\n      if (e.open_start) {\n        top = T.anim_badge_until;\n        day = e.end;\n      } else if (e.start !== e.end) {\n        \/\/ P\u00e9riode : le D\u00c9BUT en gros, la fin en petit dessous (\u2192 1 nov)\n        top = T.anim_badge_from;\n        day = e.start;\n        end = '\u2192 ' + toDate(e.end).getDate() + ' ' + month(e.end);\n      } else {\n        top = e.start === TODAY ? T.anim_badge_today : fmt(e.start, { weekday: 'short' }).replace('.', '');\n        day = e.start;\n      }\n      \/\/ Couleur selon le cas : aujourd'hui \/ un jour \u00e0 venir \/ p\u00e9riode \u00e0 venir \/ en cours\n      var kind = (e.start === e.end && !e.open_start) ? (e.start === TODAY ? 'today' : 'day') :\n        ((e.open_start || e.start <= TODAY) ? 'ongoing' : 'period');\n      var d = el('span', 'ea-date ea-date--' + kind);\n      d.setAttribute('aria-hidden', 'true');\n      d.appendChild(el('span', 'ea-date-top', top));\n      d.appendChild(el('span', 'ea-date-day', String(toDate(day).getDate())));\n      d.appendChild(el('span', 'ea-date-month', month(day)));\n      if (end) d.appendChild(el('span', 'ea-date-end', end));\n      return d;\n    }\n\n    function grid(list, o, four) {\n      var g = el('div', 'ea-grid' + (four ? ' ea-grid--4' : ''));\n      list.forEach(function(e) {\n        g.appendChild(card(e, o));\n      });\n      return g;\n    }\n\n    function head(id, iconName, title, sub, side) {\n      var h = el('div', 'ea-section-head');\n      var left = el('div');\n      var t = el('h2', 'ea-section-title');\n      if (iconName) t.appendChild(icon(iconName));\n      t.appendChild(document.createTextNode(title));\n      t.id = id;\n      left.appendChild(t);\n      if (sub) left.appendChild(el('p', 'ea-section-sub', sub));\n      h.appendChild(left);\n      if (side) h.appendChild(side);\n      return h;\n    }\n\n    function round(label, aria, onClick, disabled) {\n      var b = el('button', 'ea-round', label);\n      b.type = 'button';\n      b.setAttribute('aria-label', aria);\n      b.disabled = !!disabled;\n      b.addEventListener('click', onClick);\n      return b;\n    }\n\n    function empty(title, text, action) {\n      var box = el('div', 'ea-empty');\n      box.appendChild(icon('sun'));\n      box.appendChild(el('strong', null, title));\n      if (text) box.appendChild(el('span', null, text));\n      if (action) {\n        var b = el('button', 'ea-btn ea-btn--soft', action.label);\n        b.type = 'button';\n        b.addEventListener('click', action.onClick);\n        box.appendChild(b);\n      }\n      return box;\n    }\n\n    function nextEventDay(after) {\n      var next = null;\n      EVENTS.forEach(function(e) {\n        if (visible(e) && e.start > after && (!next || e.start < next)) next = e.start;\n      });\n      return next;\n    }\n\n    \/** Pastilles de cat\u00e9gories (filtre global de la page) *\/\n    function catFilters() {\n      var box = el('div', 'ea-cats');\n      box.setAttribute('role', 'group');\n      box.setAttribute('aria-label', T.anim_filter_cat);\n      \/\/ Cat\u00e9gories pr\u00e9sentes dans le p\u00e9rim\u00e8tre choisi (sur place \/ alentours)\n      var keys = Object.keys(CATEGORIES).filter(function(k) {\n        return EVENTS.some(function(e) {\n          return e.category === k && e.end >= TODAY &&\n            (state.scope === 'all' || (state.scope === 'onsite') === !!e.onsite);\n        });\n      });\n      if (keys.length < 2) return box;\n      var mk = function(key, label) {\n        var b = el('button', 'ea-cat' + (key === 'all' ? ' ea-cat--all' : ''), label);\n        b.type = 'button';\n        b.setAttribute('aria-pressed', state.cat === key ? 'true' : 'false');\n        if (key !== 'all') applyCat(b, key);\n        b.addEventListener('click', function() {\n          setCat(state.cat === key ? 'all' : key);\n          var again = document.querySelector('.ea-cat[aria-pressed=\"true\"]');\n          if (again) again.focus();\n        });\n        box.appendChild(b);\n      };\n      mk('all', T.anim_all_f);\n      keys.forEach(function(k) {\n        mk(k, CATEGORIES[k].label);\n      });\n      return box;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 3. AUJOURD'HUI\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function renderToday() {\n      var sec = document.getElementById('ea-sec-today');\n      sec.innerHTML = '';\n      var day = state.day;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, ucfirst(fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }))));\n      side.appendChild(round('\u2039', T.anim_prev_day, function() {\n        state.day = addDays(state.day, -1);\n        state.todayAll = false;\n        renderToday();\n      }, day <= TODAY));\n      side.appendChild(round('\u203a', T.anim_next_day, function() {\n        state.day = addDays(state.day, 1);\n        state.todayAll = false;\n        renderToday();\n      }));\n\n      \/\/ Titres neutres : la page sert aussi aux h\u00f4tels, mus\u00e9es, offices de tourisme\u2026\n      var title = day === TODAY ? T.anim_today_title :\n        (day === addDays(TODAY, 1) ? T.anim_tomorrow_title : tf('anim_day_title', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-today-title', 'sun', title, null, side));\n      sec.appendChild(catFilters());\n\n      var list = eventsOn(day);\n      if (!list.length) {\n        var next = nextEventDay(day);\n        sec.appendChild(empty(\n          day === TODAY ? T.anim_relax_today : T.anim_nothing_day,\n          next ? tf('anim_next_on', fmt(next, { weekday: 'long', day: 'numeric', month: 'long' })) : T.anim_soon,\n          next ? {\n            label: T.anim_see_day,\n            onClick: function() {\n              state.day = next;\n              renderToday();\n            }\n          } : null));\n        return;\n      }\n\n      sec.appendChild(list.length > TODAY_MAX ? carousel(list, { day: day }) : grid(list, { day: day }));\n    }\n\n    \/**\n     * Carrousel horizontal (3 cartes visibles sur ordinateur, d\u00e9filement au doigt\n     * sur mobile), fl\u00e8ches affich\u00e9es seulement s'il reste des cartes de ce c\u00f4t\u00e9.\n     *\/\n    function carousel(list, o, four) {\n      var wrap = el('div', 'ea-carousel' + (four ? ' ea-carousel--4' : ''));\n      var track = el('div', 'ea-carousel-track');\n      track.setAttribute('role', 'list');\n      list.forEach(function(e) {\n        var c = card(e, o);\n        c.setAttribute('role', 'listitem');\n        track.appendChild(c);\n      });\n      var prev = el('button', 'ea-carousel-btn ea-carousel-btn--prev', '\u2039');\n      var next = el('button', 'ea-carousel-btn ea-carousel-btn--next', '\u203a');\n      prev.type = next.type = 'button';\n      prev.setAttribute('aria-label', T.anim_prev_acts);\n      next.setAttribute('aria-label', T.anim_next_acts);\n      var step = function(dir) {\n        var first = track.firstElementChild;\n        var w = first ? first.getBoundingClientRect().width + 16 : track.clientWidth;\n        track.scrollBy({ left: dir * w * Math.max(1, Math.floor(track.clientWidth \/ w)), behavior: 'smooth' });\n      };\n      prev.addEventListener('click', function() {\n        step(-1);\n      });\n      next.addEventListener('click', function() {\n        step(1);\n      });\n      var update = function() {\n        var max = track.scrollWidth - track.clientWidth;\n        prev.hidden = track.scrollLeft <= 4;\n        next.hidden = track.scrollLeft >= max - 4;\n      };\n      track.addEventListener('scroll', update, { passive: true });\n      window.addEventListener('resize', update);\n      wrap.appendChild(prev);\n      wrap.appendChild(track);\n      wrap.appendChild(next);\n      setTimeout(update, 0);\n      return wrap;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 4. TEMPS FORTS DE LA SEMAINE\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function firstBusyDay(from) {\n      for (var i = 0; i < 7; i++) {\n        var d = addDays(from, i);\n        if (d >= TODAY && eventsOn(d).length) return d;\n      }\n      return null;\n    }\n\n    function renderWeek() {\n      var sec = document.getElementById('ea-sec-week');\n      sec.innerHTML = '';\n      var thisWeek = weekStart(TODAY);\n      var from = state.week || thisWeek;\n      var to = addDays(from, 6);\n      if (state.weekDay < from || state.weekDay > to) state.weekDay = firstBusyDay(from) || from;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, tf('from_to', shortDate(from), shortDate(to))));\n      side.appendChild(round('\u2039', T.anim_prev_week, function() {\n        state.week = addDays(from, -7);\n        state.weekDay = state.week === thisWeek ? TODAY : state.week;\n        renderWeek();\n      }, from <= thisWeek));\n      side.appendChild(round('\u203a', T.anim_next_week, function() {\n        state.week = addDays(from, 7);\n        state.weekDay = firstBusyDay(state.week) || state.week;\n        renderWeek();\n      }));\n\n      var title = from === thisWeek ? T.anim_week_title :\n        (from === addDays(thisWeek, 7) ? T.anim_next_week_title : tf('anim_week_of', fmt(from, { day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-week-title', 'calendar', title, null, side));\n\n      var days = el('div', 'ea-days');\n      days.setAttribute('role', 'group');\n      days.setAttribute('aria-label', T.anim_week_days);\n      for (var i = 0; i < 7; i++) {\n        (function(day) {\n          var n = eventsOn(day).length;\n          var b = el('button', 'ea-day' + (day === TODAY ? ' is-today' : '') + (n ? ' has-events' : ''));\n          b.type = 'button';\n          b.setAttribute('aria-pressed', day === state.weekDay ? 'true' : 'false');\n          b.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + (day === TODAY ? ' ' + T.anim_today_paren : '') + ' : ' + (n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing));\n          b.appendChild(el('span', 'ea-day-name', ucfirst(fmt(day, { weekday: 'short' }).replace('.', ''))));\n          b.appendChild(el('span', 'ea-day-date', shortDate(day)));\n          b.addEventListener('click', function() {\n            state.weekDay = day;\n            renderWeek();\n            var btn = document.querySelector('.ea-day[aria-pressed=\"true\"]');\n            if (btn) btn.focus();\n          });\n          days.appendChild(b);\n        })(addDays(from, i));\n      }\n      sec.appendChild(days);\n\n      var list = eventsOn(state.weekDay);\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_nothing_day, T.anim_pick_day));\n        return;\n      }\n      \/\/ Au-del\u00e0 de 4 activit\u00e9s : carrousel (4 cartes visibles) au lieu d'une grille qui s'allonge\n      sec.appendChild(list.length > 4 ? carousel(list, { day: state.weekDay }, true) : grid(list, { day: state.weekDay }, true));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 5. TOUS LES \u00c9V\u00c9NEMENTS \u00c0 VENIR\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/** Liste d\u00e9roulante accessible (libell\u00e9 masqu\u00e9) *\/\n    function selectBox(label, options, value, onChange) {\n      var wrap = el('label');\n      wrap.appendChild(el('span', 'ea-sr', label));\n      var sel = el('select', 'ea-select');\n      options.forEach(function(o) {\n        var opt = el('option', null, o[1]);\n        opt.value = o[0];\n        opt.selected = value === o[0];\n        sel.appendChild(opt);\n      });\n      sel.addEventListener('change', function() {\n        onChange(sel.value);\n      });\n      wrap.appendChild(sel);\n      return wrap;\n    }\n\n    function renderUpcoming() {\n      var sec = document.getElementById('ea-sec-upcoming');\n      sec.innerHTML = '';\n\n      \/\/ Tri (le filtre cat\u00e9gorie est global, sous \u00ab Activit\u00e9s du jour \u00bb)\n      var side = el('div', 'ea-head-side');\n      side.appendChild(selectBox(T.anim_sort, [\n        ['date', T.anim_sort_date],\n        ['name', T.anim_sort_name]\n      ], state.sort, function(v) {\n        state.sort = v;\n        renderUpcoming();\n        focusUpcoming(0);\n      }));\n      sec.appendChild(head('ea-upcoming-title', 'leaf', T.anim_upcoming_title, null, side));\n\n      var list = EVENTS.filter(function(e) {\n        return visible(e) && e.end >= TODAY;\n      }).sort(function(a, b) {\n        if (state.sort === 'name') return a.name.localeCompare(b.name, T.date_locale);\n        var sa = a.start < TODAY ? TODAY : a.start;\n        var sb = b.start < TODAY ? TODAY : b.start;\n        return sa.localeCompare(sb) || byTime(a, b);\n      });\n\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_no_upcoming, state.cat === 'all' ? T.anim_soon : T.anim_try_cat));\n        return;\n      }\n\n      sec.appendChild(grid(list.slice(0, state.upcomingLimit), { date: true }, true));\n\n      if (list.length > state.upcomingLimit) {\n        var more = el('div', 'ea-more');\n        var b = el('button', 'ea-btn ea-btn--soft', tf('anim_more', list.length - state.upcomingLimit));\n        b.appendChild(icon('arrow'));\n        b.type = 'button';\n        b.addEventListener('click', function() {\n          state.upcomingLimit += UPCOMING_STEP;\n          renderUpcoming();\n        });\n        more.appendChild(b);\n        sec.appendChild(more);\n      }\n    }\n\n    function setCat(key) {\n      state.cat = key;\n      rerenderAll();\n    }\n\n    function setScope(scope) {\n      state.scope = scope;\n      state.cat = 'all';\n      app.querySelectorAll('.ea-scope button').forEach(function(b) {\n        b.setAttribute('aria-pressed', b.getAttribute('data-scope') === scope ? 'true' : 'false');\n      });\n      rerenderAll();\n    }\n\n    function rerenderAll() {\n      state.upcomingLimit = UPCOMING_STEP;\n      state.todayAll = false;\n      renderToday();\n      renderWeek();\n      renderUpcoming();\n      renderCalendar();\n    }\n\n    \/** Apr\u00e8s un re-rendu, garde le focus sur la liste d\u00e9roulante utilis\u00e9e *\/\n    function focusUpcoming(i) {\n      var sel = document.querySelectorAll('#ea-sec-upcoming .ea-select')[i];\n      if (sel) sel.focus();\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 6. CALENDRIER DU MOIS (secondaire, repliable)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var MAX_LANES = 3;\n\n    \/** Place les \u00e9v\u00e9nements d'une semaine en couloirs sans chevauchement *\/\n    function layoutLanes(from, to) {\n      var items = eventsBetween(from, to).map(function(e) {\n        var s = e.start < from ? from : e.start;\n        var t = e.end > to ? to : e.end;\n        return { e: e, col: daysBetween(from, s) + 1, span: daysBetween(s, t) + 1, fromBefore: e.start < from, toAfter: e.end > to };\n      });\n      items.sort(function(a, b) {\n        return (a.col - b.col) || (b.span - a.span) || (a.e.start_time || '').localeCompare(b.e.start_time || '');\n      });\n      var ends = [];\n      items.forEach(function(it) {\n        var lane = 0;\n        while (ends[lane] !== undefined && ends[lane] >= it.col) lane++;\n        ends[lane] = it.col + it.span - 1;\n        it.lane = lane;\n      });\n      return items;\n    }\n\n    function renderCalendar() {\n      var sec = document.getElementById('ea-sec-calendar');\n      if (!sec) return; \/\/ calendrier masqu\u00e9 (r\u00e9glage ou calendrier=\"non\")\n      sec.innerHTML = '';\n\n      var toggle = el('button', 'ea-btn ea-btn--soft', state.calendarOpen ? T.anim_hide_cal : T.anim_show_cal);\n      toggle.appendChild(icon('arrow'));\n      toggle.type = 'button';\n      toggle.setAttribute('aria-expanded', state.calendarOpen ? 'true' : 'false');\n      toggle.setAttribute('aria-controls', 'ea-cal-panel');\n      toggle.addEventListener('click', function() {\n        state.calendarOpen = !state.calendarOpen;\n        renderCalendar();\n        var b = document.querySelector('#ea-sec-calendar [aria-controls=\"ea-cal-panel\"]');\n        if (b) b.focus();\n      });\n      sec.appendChild(head('ea-calendar-title', 'calendar', T.anim_cal_title, T.anim_cal_sub, toggle));\n\n      var panel = el('div', 'ea-cal-panel');\n      panel.id = 'ea-cal-panel';\n      panel.hidden = !state.calendarOpen;\n      sec.appendChild(panel);\n      if (!state.calendarOpen) return;\n\n      var first = state.month + '-01';\n      var firstDate = toDate(first);\n      var lastDay = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 0, 12));\n      var gridStart = weekStart(first);\n      var gridEnd = addDays(weekStart(lastDay), 6);\n\n      var bar = el('div', 'ea-cal-toolbar');\n      bar.appendChild(el('h3', 'ea-cal-month', ucfirst(fmt(first, { month: 'long', year: 'numeric' }))));\n      var nav = el('div', 'ea-head-side');\n      nav.appendChild(round('\u2039', T.anim_prev_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() - 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      nav.appendChild(round('\u203a', T.anim_next_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      bar.appendChild(nav);\n      panel.appendChild(bar);\n\n      var month = el('div', 'ea-month');\n      var mh = el('div', 'ea-month-head');\n      \/\/ Lundi \u2192 dimanche, abr\u00e9g\u00e9s dans la langue de la page (5 janv. 2026 = un lundi)\n      [5, 6, 7, 8, 9, 10, 11].map(function(dd) { return ucfirst(fmt('2026-01-' + (dd < 10 ? '0' : '') + dd, { weekday: 'short' }).replace('.', '')); }).forEach(function(d) {\n        mh.appendChild(el('div', null, d));\n      });\n      month.appendChild(mh);\n      for (var ws = gridStart; ws <= gridEnd; ws = addDays(ws, 7)) month.appendChild(monthRow(ws));\n      panel.appendChild(month);\n\n      \/\/ D\u00e9tail uniquement apr\u00e8s un clic sur un jour\n      if (state.selectedDay) {\n        var dp = el('div', 'ea-daypanel');\n        dp.id = 'ea-daypanel';\n        dp.appendChild(el('h3', 'ea-daypanel-title', ucfirst(fmt(state.selectedDay, { weekday: 'long', day: 'numeric', month: 'long' }))));\n        var list = eventsOn(state.selectedDay);\n        dp.appendChild(list.length ? grid(list, { day: state.selectedDay }) : empty(T.anim_nothing_day));\n        panel.appendChild(dp);\n      }\n    }\n\n    function monthRow(from) {\n      var to = addDays(from, 6);\n      var items = layoutLanes(from, to);\n      var row = el('div', 'ea-mrow');\n      var hidden = [0, 0, 0, 0, 0, 0, 0];\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) {\n          for (var d = it.col; d < it.col + it.span; d++) hidden[d - 1]++;\n        }\n      });\n\n      for (var i = 0; i < 7; i++) {\n        (function(day, i) {\n          var inMonth = day.slice(0, 7) === state.month;\n          var cell = el('button', 'ea-mcell' + (inMonth ? '' : ' ea-mcell--out') + (day === state.selectedDay ? ' ea-mcell--selected' : ''));\n          cell.type = 'button';\n          cell.style.gridColumn = String(i + 1);\n          cell.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + ' : ' + (function(n) { return n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing; })(eventsOn(day).length));\n          cell.addEventListener('click', function() {\n            state.selectedDay = day;\n            if (!inMonth) state.month = day.slice(0, 7);\n            renderCalendar();\n            var dp = document.getElementById('ea-daypanel');\n            if (dp && dp.scrollIntoView) dp.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n          });\n          row.appendChild(cell);\n\n          var num = el('span', 'ea-mnum' + (inMonth ? '' : ' ea-mnum--out') + (day === TODAY ? ' ea-mnum--today' : ''), String(toDate(day).getDate()));\n          num.style.gridColumn = String(i + 1);\n          row.appendChild(num);\n\n          if (hidden[i]) {\n            var more = el('span', 'ea-mmore', '+' + hidden[i]);\n            more.style.gridColumn = String(i + 1);\n            row.appendChild(more);\n          }\n        })(addDays(from, i), i);\n      }\n\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) return;\n        var e = it.e;\n        var b = el('button', 'ea-mbar' +\n          (it.fromBefore ? ' ea-mbar--from-before' : '') +\n          (it.toAfter ? ' ea-mbar--to-after' : '') +\n          (e.end < TODAY ? ' ea-mbar--ended' : ''), ((!it.fromBefore && e.start_time) ? e.start_time + ' ' : '') + e.name);\n        b.type = 'button';\n        b.title = e.name;\n        applyCat(b, e.category);\n        b.style.gridColumn = it.col + ' \/ span ' + it.span;\n        b.style.gridRow = String(it.lane + 2);\n        b.addEventListener('click', function() {\n          openModal(e);\n        });\n        row.appendChild(b);\n      });\n      return row;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ MODAL \u2014 d\u00e9plac\u00e9e dans <body> pour \u00e9chapper \u00e0 la largeur max du contenu\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var modal = document.getElementById('ea-modal');\n    if (modal && modal.parentNode !== document.body) document.body.appendChild(modal);\n    var modalContent = document.getElementById('ea-modal-content');\n    var lastFocus = null;\n\n    function openModal(e) {\n      lastFocus = document.activeElement;\n      modalContent.innerHTML = '';\n\n      if (e.image || DEFAULT_IMG) {\n        var img = media(e, 'ea-modal-img');\n        img.loading = 'eager';\n        var mm = el('div', 'ea-modal-media');\n        mm.appendChild(img);\n        var mcr = credit(e);\n        if (mcr) mm.appendChild(mcr);\n        modalContent.appendChild(mm);\n      }\n\n      var body = el('div', 'ea-modal-body');\n      if (catLabel(e)) body.appendChild(pill(e));\n      var t = el('h2', 'ea-modal-title', e.name);\n      t.id = 'ea-modal-title';\n      body.appendChild(t);\n\n      var info = el('div', 'ea-modal-info');\n      var when = el('span');\n      when.appendChild(icon('calendar'));\n      when.appendChild(document.createTextNode(fullWhenLabel(e)));\n      info.appendChild(when);\n      if (placeLabel(e)) {\n        var where = el('span');\n        where.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        where.appendChild(document.createTextNode(placeLabel(e)));\n        info.appendChild(where);\n      }\n      if (e.registration) {\n        var reg = el('span');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(el('strong', null, T.registration));\n        info.appendChild(reg);\n      }\n      body.appendChild(info);\n\n      if (e.description) body.appendChild(el('p', 'ea-modal-desc', e.description));\n\n      if (e.link) {\n        var a = el('a', 'ea-btn', T.anim_more_info);\n        a.href = e.link;\n        a.target = '_blank';\n        a.rel = 'noopener';\n        a.appendChild(icon('external'));\n        a.appendChild(el('span', 'ea-sr', T.anim_new_tab));\n        body.appendChild(a);\n      }\n      modalContent.appendChild(body);\n\n      modal.hidden = false;\n      document.documentElement.style.overflow = 'hidden';\n      document.getElementById('ea-modal-close').focus();\n    }\n\n    function closeModal() {\n      modal.hidden = true;\n      document.documentElement.style.overflow = '';\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n\n    document.getElementById('ea-modal-close').addEventListener('click', closeModal);\n    modal.addEventListener('click', function(ev) {\n      if (ev.target === modal) closeModal();\n    });\n    document.addEventListener('keydown', function(ev) {\n      if (modal.hidden) return;\n      if (ev.key === 'Escape') closeModal();\n      \/\/ Focus gard\u00e9 dans la modal\n      if (ev.key === 'Tab') {\n        var f = modal.querySelectorAll('button, a[href]');\n        if (!f.length) return;\n        var firstF = f[0],\n          lastF = f[f.length - 1];\n        if (ev.shiftKey && document.activeElement === firstF) {\n          ev.preventDefault();\n          lastF.focus();\n        } else if (!ev.shiftKey && document.activeElement === lastF) {\n          ev.preventDefault();\n          firstF.focus();\n        }\n      }\n    });\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ NAVIGATION RAPIDE + SUIVI DE SECTION\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/**\n     * Hauteur occup\u00e9e en haut de l'\u00e9cran par les barres fixes \/ collantes du site\n     * (barre d'admin, en-t\u00eate, barre de r\u00e9servation\u2026), quelle que soit leur classe :\n     * on sonde le haut de l'\u00e9cran et on empile les barres trouv\u00e9es.\n     *\/\n    function headerOffset() {\n      var bottom = 0;\n      var vw = window.innerWidth,\n        vh = window.innerHeight;\n      var isBar = function(el) {\n        if (!el || el === document.body || el === document.documentElement) return false;\n        if (el.closest('#ea-app, .ea-modal-overlay, .mv-modal-overlay')) return false;\n        var pos = getComputedStyle(el).position;\n        if (pos !== 'fixed' && pos !== 'sticky') return false;\n        var r = el.getBoundingClientRect();\n        \/\/ vraie barre : large, pas trop haute (exclut bulles de chat, boutons flottants, popups)\n        return r.width >= vw * 0.3 && r.height > 0 && r.height < vh * 0.45;\n      };\n      for (var pass = 0; pass < 5; pass++) {\n        var y = bottom + 2,\n          found = 0;\n        if (y >= vh * 0.5) break;\n        [0.15, 0.5, 0.85].forEach(function(fx) {\n          (document.elementsFromPoint(vw * fx, y) || []).forEach(function(el) {\n            for (var n = el; n && n !== document.body; n = n.parentElement) {\n              if (isBar(n)) {\n                var r = n.getBoundingClientRect();\n                if (r.top <= y + 1 && r.bottom > found) found = r.bottom;\n                break;\n              }\n            }\n          });\n        });\n        if (found <= bottom) break;\n        bottom = found;\n      }\n      app.style.setProperty('--ea-header', Math.round(bottom) + 'px');\n      return bottom;\n    }\n\n    var navLinks = Array.prototype.slice.call(app.querySelectorAll('.ea-nav a'));\n\n    function setCurrent(id) {\n      navLinks.forEach(function(a) {\n        a.setAttribute('aria-current', a.getAttribute('href') === '#' + id ? 'true' : 'false');\n      });\n    }\n\n    navLinks.forEach(function(a) {\n      a.addEventListener('click', function(ev) {\n        var target = document.getElementById(a.getAttribute('href').slice(1));\n        if (!target) return;\n        ev.preventDefault();\n        if (a.getAttribute('href') === '#ea-sec-calendar' && !state.calendarOpen) {\n          state.calendarOpen = true;\n          renderCalendar();\n        }\n        setCurrent(target.id);\n        target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      });\n    });\n\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function(entries) {\n        entries.forEach(function(en) {\n          if (en.isIntersecting) setCurrent(en.target.id);\n        });\n      }, { rootMargin: '-35% 0px -55% 0px' });\n      ['ea-sec-today', 'ea-sec-week', 'ea-sec-upcoming', 'ea-sec-calendar'].forEach(function(id) {\n        var sec = document.getElementById(id);\n        if (sec) io.observe(sec);\n      });\n    }\n\n    var ticking = false;\n    window.addEventListener('scroll', function() {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function() {\n        headerOffset();\n        ticking = false;\n      });\n    }, { passive: true });\n    window.addEventListener('resize', headerOffset);\n\n    \/\/ Semaine : on ouvre sur le prochain jour anim\u00e9 (aujourd'hui est d\u00e9j\u00e0 en haut de page)\n    (function() {\n      var ws = weekStart(TODAY);\n      for (var d = addDays(TODAY, 1); d <= addDays(ws, 6); d = addDays(d, 1)) {\n        if (eventsOn(d).length) {\n          state.weekDay = d;\n          return;\n        }\n      }\n    })();\n\n    app.querySelectorAll('.ea-scope button').forEach(function(b) {\n      b.addEventListener('click', function() {\n        setScope(b.getAttribute('data-scope'));\n      });\n    });\n\n    headerOffset();\n    renderToday();\n    renderWeek();\n    renderUpcoming();\n    renderCalendar();\n  })();\n<\/script>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":2710,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_gt_ctv_global_id":"775","_gt_ctv_id_group":false,"inline_featured_image":false,"gt_fse_maillage_image":"https:\/\/www.chalets-de-fiolles.com\/wp-content\/uploads\/2026\/10\/marche-gaillac.jpg","gt_fse_maillage_titre":"Actividades locales","gt_fse_maillage_alt":"Animaciones y eventos","gt_fse_maillage_resume":"","gt_fse_maillage_url":"https:\/\/www.chalets-de-fiolles.com\/animations-evenements-locaux\/","footnotes":""},"categories":[],"tags":[],"class_list":["post-2104","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/pages\/2104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/comments?post=2104"}],"version-history":[{"count":3,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/pages\/2104\/revisions"}],"predecessor-version":[{"id":2837,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/pages\/2104\/revisions\/2837"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/media\/2710"}],"wp:attachment":[{"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/media?parent=2104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/categories?post=2104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.chalets-de-fiolles.com\/es\/wp-json\/wp\/v2\/tags?post=2104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}