{"id":13535,"date":"2026-11-12T13:31:22","date_gmt":"2026-11-12T12:31:22","guid":{"rendered":"https:\/\/www.campingbonport.com\/elaia-animations-3\/"},"modified":"2026-11-12T13:31:22","modified_gmt":"2026-11-12T12:31:22","slug":"elaia-animations","status":"publish","type":"page","link":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/","title":{"rendered":"Animationen und Veranstaltungen"},"content":{"rendered":"\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 data-rsssl=1> 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. Bandeau immersif -->\n  <section class=\"ea-hero\" style=\"background-image:url(https:\/\/www.grandpicsaintloup-tourisme.fr\/_objects\/tao_suite_agenda\/fma\/photos\/affiche-projet-1-52111-52436.jpg)\">\n    <div class=\"ea-hero-inner\">\n      <span class=\"ea-eyebrow\">Erleben Sie unvergessliche Momente<\/span>\n      <h1 class=\"ea-hero-title\">Animationen &amp; Veranstaltungen<\/h1>\n      <p class=\"ea-hero-text\">Alle aktuellen Aktivit\u00e4ten, die H\u00f6hepunkte der Woche und kommende Veranstaltungen w\u00e4hrend Ihres Aufenthalts.<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- 2. Navigation rapide (collante) + filtre sur place \/ aux alentours -->\n  <nav class=\"ea-nav\" aria-label=\"Seitenbereiche\">\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>Heute<\/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>Diese Woche<\/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>Demn\u00e4chst<\/a>\n              <\/div>\n              <span class=\"ea-nav-sep\" aria-hidden=\"true\"><\/span>\n        <div class=\"ea-scope\" role=\"group\" aria-label=\"Wo?\">\n          <button type=\"button\" data-scope=\"all\" aria-pressed=\"true\">Alle<\/button>\n                    <button type=\"button\" data-scope=\"onsite\" aria-pressed=\"false\" disabled title=\"Derzeit keine Aktivit\u00e4t vor Ort\">Vor Ort<\/button>\n          <button type=\"button\" data-scope=\"nearby\" aria-pressed=\"false\">In der Umgebung<\/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>W\u00f6chentlicher Markt von Aimargues<\/strong> \u2014 Du 01\/01\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 30470 Aimargues<\/li>\n              <li><strong>W\u00f6chentlicher Markt von Junas<\/strong> \u2014 Du 01\/01\/2026 \u00e0 09:00 au 31\/12\/2026 \u00e0 23:59 \u2014 30250 Junas<\/li>\n              <li><strong>Wochenmarkt in Calvisson<\/strong> \u2014 Du 20\/07\/2026 \u00e0 08:00 au 31\/12\/2026 \u00e0 23:59 \u2014 30420 Calvisson<\/li>\n              <li><strong>Ausstellung von Julia Kaulbach<\/strong> \u2014 Du 23\/08\/2026 au 14\/11\/2026 \u00e0 23:59 \u2014 34270 Lauret<\/li>\n              <li><strong>Lou Casa, Barbara et Brel<\/strong> \u2014 Du 12\/11\/2026 \u00e0 20:30 au 12\/11\/2026 \u00e0 23:59 \u2014 34980 Saint-G\u00e9ly-du-Fesc<\/li>\n              <li><strong>HANDBALL: MHB GEGEN DUNKERQUE<\/strong> \u2014 Du 13\/11\/2026 au 13\/11\/2026 \u00e0 23:59 \u2014 34090 Montpellier<\/li>\n              <li><strong>VERY IMPRO PEOPLE - GAZETTE CAF\u00c9<\/strong> \u2014 Du 13\/11\/2026 au 13\/11\/2026 \u00e0 23:59 \u2014 34000 Montpellier<\/li>\n              <li><strong>EISHOCKEY: VIPERS GEGEN HCMP<\/strong> \u2014 Du 14\/11\/2026 au 14\/11\/2026 \u00e0 23:59 \u2014 34000 Montpellier<\/li>\n              <li><strong>MONTPELLIER BASKET VS SAINT-VALLIER (NM2)<\/strong> \u2014 Du 14\/11\/2026 au 14\/11\/2026 \u00e0 23:59 \u2014 34080 Montpellier<\/li>\n              <li><strong>THEATER \u00abMIRABEAU DER UNVERFRORENE\u00bb<\/strong> \u2014 Du 15\/11\/2026 au 15\/11\/2026 \u00e0 23:59 \u2014 34250 Palavas-les-Flots<\/li>\n              <li><strong>DIE K\u00d6NIGINNEN DES BURLESQUE<\/strong> \u2014 Du 19\/11\/2026 au 19\/11\/2026 \u00e0 23:59 \u2014 34000 Montpellier<\/li>\n              <li><strong>MIT WENIG GEP\u00c4CK<\/strong> \u2014 Du 19\/11\/2026 au 19\/11\/2026 \u00e0 23:59 \u2014 34090 Montpellier<\/li>\n              <li><strong>EOLIENNE-LAUF 2026<\/strong> \u2014 Du 21\/11\/2026 au 21\/11\/2026 \u00e0 23:59 \u2014 34830 Clapiers<\/li>\n              <li><strong>BLMA VS LANDERNEAU<\/strong> \u2014 Du 22\/11\/2026 au 22\/11\/2026 \u00e0 23:59 \u2014 34970 Lattes<\/li>\n              <li><strong>Weihnachtsmarkt<\/strong> \u2014 Du 22\/11\/2026 \u00e0 10:00 au 22\/11\/2026 \u00e0 23:59 \u2014 34270 Sainte-Croix-de-Quintillargues<\/li>\n              <li><strong>DAS DACH DER WELT<\/strong> \u2014 Du 27\/11\/2026 au 27\/11\/2026 \u00e0 23:59 \u2014 34090 Montpellier<\/li>\n              <li><strong>BLMA GEGEN CHARNAY<\/strong> \u2014 Du 09\/12\/2026 au 09\/12\/2026 \u00e0 23:59 \u2014 34970 Lattes<\/li>\n              <li><strong>P\u00c9TROLE<\/strong> \u2014 Du 10\/12\/2026 au 10\/12\/2026 \u00e0 23:59 \u2014 34000 Montpellier<\/li>\n              <li><strong>MICHELE LAROQUE &amp; KAD MERAD &quot;L&#039;\u00c2GE B\u00caTE&quot;<\/strong> \u2014 Du 11\/12\/2026 au 11\/12\/2026 \u00e0 23:59 \u2014 34000 Montpellier<\/li>\n              <li><strong>SCHWARZ, J\u00dcDISCH UND EIN\u00e4UGIG, DIE GESCHICHTE VON SAMMY DAVIS<\/strong> \u2014 Du 11\/12\/2026 au 11\/12\/2026 \u00e0 23:59 \u2014 34170 Castelnau-le-Lez<\/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=\"Schlie\u00dfen\">\u00d7<\/button>\n    <div id=\"ea-modal-content\"><\/div>\n  <\/div>\n<\/div>\n\n<script>\n  (function() {\n    var EVENTS = [{\"id\":4,\"name\":\"W\\u00f6chentlicher Markt von Aimargues\",\"type\":\"evenements-locaux-203\",\"category\":\"maerkte-messen\",\"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\":\"30470 Aimargues\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Markt mit regionalen Erzeugnissen und Flohmarkt\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":12,\"name\":\"W\\u00f6chentlicher Markt von Junas\",\"type\":\"evenements-locaux-203\",\"category\":\"maerkte-messen\",\"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\":\"30250 Junas\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Jeden Dienstag. Der kleine Markt begr\\u00fc\\u00dft zwei lokale Erzeuger im Ortszentrum.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.junas.fr\\\/notre-village\\\/junas-pratique\\\/commerces\\\/joomlannuaire\\\/fiche\\\/14-le-petit-marche-du-mardi\\\/5-commerces.html\"},{\"id\":9,\"name\":\"Wochenmarkt in Calvisson\",\"type\":\"evenements-locaux-203\",\"category\":\"maerkte-messen\",\"label\":\"Du 20\\\/07\\\/2026 \\u00e0 08:00 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-07-20\",\"end\":\"2026-12-31\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"30420 Calvisson\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Jeden Sonntag findet auf dem gro\\u00dfen Platz von Calvisson das ganze Jahr \\u00fcber ein farbenfroher Markt mit zahlreichen H\\u00e4ndlern statt.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.calvisson.com\\\/\"},{\"id\":13,\"name\":\"Ausstellung von Julia Kaulbach\",\"type\":\"evenements-locaux-203\",\"category\":\"ausstellungen\",\"label\":\"Du 23\\\/08\\\/2026 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-08-23\",\"end\":\"2026-11-14\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34270 Lauret\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Julia Kaulbach, eine deutsche K\\u00fcnstlerin, die in Sauve lebt und arbeitet, zeigt vom 23. August bis 14. November 2026 im Auberge du C\\u00e8dre in Lauret eine Auswahl ihrer j\\u00fcngsten Werke. Kommen Sie am Sonntag, den 23. August um 17 Uhr zur Vernissage, lernen Sie sie in geselliger Atmosph\\u00e4re kennen und entdecken Sie ihre \\u00d6lgem\\u00e4lde, Aquarelle, Radierungen, Linolschnitte und Werke aus ihrer neuen Acrylserie mit dem Titel \\u00ab Multiverses \\u00bb. In ihrem Werk treffen traditionelle Techniken auf eine zeitgen\\u00f6ssische Bildsprache. Viele ihrer Aquarelle entstehen direkt in den Landschaften der C\\u00e9vennes und sogar in der Auberge, w\\u00e4hrend ihre gro\\u00dfformatigen Gem\\u00e4lde Themen wie Wahrnehmung, Verwandlung und die unsichtbaren Verbindungen zwischen den Dingen erforschen. Bis bald zu dieser sch\\u00f6nen Begegnung.\",\"image\":\"https:\\\/\\\/www.grandpicsaintloup-tourisme.fr\\\/_objects\\\/tao_suite_agenda\\\/fma\\\/photos\\\/affiche-projet-1-52111-52436.jpg\",\"credit\":\"\",\"link\":\"http:\\\/\\\/auberge-du-cedre.com\\\/\"},{\"id\":6,\"name\":\"Lou Casa, Barbara et Brel\",\"type\":\"evenements-locaux-203\",\"category\":\"konzerte-musik-festivals\",\"label\":\"Du 12\\\/11\\\/2026 \\u00e0 20:30 au 12\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-12\",\"end\":\"2026-11-12\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34980 Saint-G\\u00e9ly-du-Fesc\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Die Lieder von Brel und Barbara treten in einen Dialog miteinander und offenbaren eine unerwartete Einheit und Feinf\\u00fchligkeit sowie die k\\u00fcnstlerischen und freundschaftlichen Bande, die sie verbanden. Lou Casa bringt seine eigene N\\u00e4he zum Publikum ein, in einer sensiblen und warmen Interpretation.\",\"image\":\"https:\\\/\\\/www.grandpicsaintloup-tourisme.fr\\\/_objects\\\/tao_suite_agenda\\\/fma\\\/photos\\\/75027757-1322514097908288-5103157588510375936-n-54384.jpg\",\"credit\":\"Lou Casa\",\"link\":\"https:\\\/\\\/www.helloasso.com\\\/associations\\\/j-ai-rendez-vous-avec-vous\\\/evenements\\\/festival12nov26\"},{\"id\":5,\"name\":\"HANDBALL: MHB GEGEN DUNKERQUE\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-wandern\",\"label\":\"Du 13\\\/11\\\/2026 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34090 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Das FDI stadium in Montpellier empf\\u00e4ngt das Spiel MHB \\\/ Dunkerque am 13. November um 20:00 Uhr in der Daikin StarLigue!\\n\\nKommt und unterst\\u00fctzt euer Lieblingsteam!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.montpellierhandball.com\\\/fr\\\/venir-au-match\\\/les-matchs-venir\"},{\"id\":8,\"name\":\"VERY IMPRO PEOPLE - GAZETTE CAF\\u00c9\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 13\\\/11\\\/2026 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34000 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Drei Improvisationsabende im Gazette Caf\\u00e9\\nIm November \\u00fcbernehmen Very Impro People das Gazette Caf\\u00e9 f\\u00fcr drei Termine rund um die theatralische Improvisation.\\n\\nCabaret, ein originelles Konzept oder eine lang angelegte improvisierte Geschichte: Jeder Abend bietet eine andere M\\u00f6glichkeit, die Truppe kennenzulernen und das Unvorhersehbare mit den K\\u00fcnstlern zu teilen.\\nAuf dem Programm\\n\\nFreitag, 13. November 2026: Le Cabaret \\u2014 kurze, spontane Szenen, inspiriert von den Vorschl\\u00e4gen des Publikums.\\nFreitag, 20. November 2026: Carte Blanche \\u2014 die VIPs erkunden ein originelles Konzept und eine andere Art zu improvisieren.\\nFreitag, 27. November 2026: STORIES \\u2014 eine improvisierte Geschichte, mit einer Welt und Figuren, die vor den Augen des Publikums entstehen.\\n\\num 20:00 Uhr\\n\\nPreis: freier Eintritt, Austritt auf Hutgeldbasis\\nReservierung: dringend empfohlen, per E-Mail an vip.impro@gmail.com\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":10,\"name\":\"EISHOCKEY: VIPERS GEGEN HCMP\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-wandern\",\"label\":\"Du 14\\\/11\\\/2026 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34000 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Die Vipers empfangen HCMP am 14. November 2026 in der Eishalle V\\u00e9gapolis.\\nKommen Sie und unterst\\u00fctzen Sie Ihr Lieblingsteam!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.montpellier-vipers.com\\\/\"},{\"id\":3,\"name\":\"MONTPELLIER BASKET VS SAINT-VALLIER (NM2)\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-wandern\",\"label\":\"Du 14\\\/11\\\/2026 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34080 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"USA-ABEND\\nTreffen Sie uns am Samstag, den 14. November um 20:30 Uhr im Palais des Sports Pierre de Coubertin in Montpellier zu einem Abend im amerikanischen Flair!\\n\\nAuf dem Programm: Basketball, Show und jede Menge Genuss!\\n\\nDie Pompoms der ENSCM, unsere Cheerleaderinnen des Abends, sorgen mit mehreren Shows w\\u00e4hrend des Spiels f\\u00fcr Stimmung.\\nAuch Burger und Hotdogs werden angeboten.\\n\\nZu diesem Anlass ziehen Sie Ihr sch\\u00f6nstes Basketballtrikot an und tauchen Sie ein in die Atmosph\\u00e4re dieses USA-Abends!\\nWir freuen uns darauf, viele von Ihnen zur Unterst\\u00fctzung von Montpellier begr\\u00fc\\u00dfen zu d\\u00fcrfen und diesen Abend mit uns zu teilen!\\n\\nMit Reservierung\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.helloasso.com\\\/associations\\\/montpellier-basket-mosson\\\/evenements\\\/montpellier-basket-mosson-saint-vallier?utm_source=app_ha&utm_campaign=share_campaign_button&utm_medium=ios&utm_\"},{\"id\":15,\"name\":\"THEATER \\u00abMIRABEAU DER UNVERFRORENE\\u00bb\",\"type\":\"evenements-locaux-203\",\"category\":\"spectacles-cinema\",\"label\":\"Du 15\\\/11\\\/2026 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34250 Palavas-les-Flots\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"von Les Rid O\\u2019Philes\\n\\nPreis: 8 \\u20ac, kostenlos f\\u00fcr unter 14-J\\u00e4hrige und Abo m\\u00f6glich\\n\\nChapelle Notre-Dame-de-la-Route\\n\\nInfos und Reservierung: www.billetweb.fr\\\/ridophiles-palavas-les-flots\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/ridophiles-palavas-les-flots\"},{\"id\":18,\"name\":\"DIE K\\u00d6NIGINNEN DES BURLESQUE\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 19\\\/11\\\/2026 au 19\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-19\",\"end\":\"2026-11-19\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34000 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Humor und Glamour in der reinsten Tradition amerikanischer Shows!\\n\\nEin glitzerndes Cabaret, aus dem Sie mit Sternen in den Augen hinausgehen werden! Unter der Leitung von LILI CHANTILLY, der ber\\u00fchmten Burlesque-Striptease-K\\u00fcnstlerin, begleitet von ihrer fr\\u00f6hlichen T\\u00e4nzerinnentruppe! F\\u00fcr LILI CHANTILLY, die vom Hollywood-Charme und der raffinierten Welt der 30er-Jahre begeistert ist, ist Burlesque-Striptease eine Kunst, eine Kunst von Kost\\u00fcm, Tanz und Kom\\u00f6die, die sie gerne mit Ihnen teilen m\\u00f6chte!\\n\\nNur mit Reservierung\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/book.montpellier-tourisme.fr\\\/fr\\\/voir-faire\\\/2868270\\\/th%C3%A9%C3%A2tre-le-point-com%C3%A9die-les-reines-du-burlesque\\\/afficher-les-details?page=2&filter=c%3D58791%2C33858%2C32320%3Bd%3D20220408%7C99991231\"},{\"id\":16,\"name\":\"MIT WENIG GEP\\u00c4CK\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 19\\\/11\\\/2026 au 19\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-19\",\"end\":\"2026-11-19\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34090 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Eine Chronik der Ereignisse des Spanischen B\\u00fcrgerkriegs.\\n\\nDiese Auff\\u00fchrung beleuchtet das Ende des Spanischen B\\u00fcrgerkriegs, das Exil und anschlie\\u00dfend die \\\"Aufnahme\\\" und Internierung jener fast 500.000 Fl\\u00fcchtlinge, die kurz vor dem Zweiten Weltkrieg in verschiedenen Lagern im S\\u00fcden Frankreichs eingesperrt wurden.\\n\\nDarin folgt man einem Enkel, der verstehen will, und seinem Gro\\u00dfvater, der aus schmerzlicher Erinnerung von seiner retirada und seinem sp\\u00e4teren Leben erz\\u00e4hlt.\\n\\nMehr als eine Geschichte \\u00fcber die retirada, inspiriert von Zeugenaussagen, stellt sich die Frage nach dem Erbe aus humanistischer, politischer und historischer Perspektive.\\n\\nDauer: 1 Std. + 30 Min. Diskussion - Ab 12 Jahren\\nHistorisch\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/beauxartstabard.fr\\\/spectacles-adultes\"},{\"id\":1,\"name\":\"EOLIENNE-LAUF 2026\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-randonnee\",\"label\":\"Du 21\\\/11\\\/2026 au 21\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-21\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34830 Clapiers\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Organisiert von den Coureurs de l\\u2019Eolienne, mit Unterst\\u00fctzung der Ville de Clapiers, des D\\u00e9partement de l\\u2019H\\u00e9rault und logistischer Hilfe von H\\u00e9rault Sport, bietet die 24. Ausgabe der Foul\\u00e9es de l\\u2019Eolienne zwei L\\u00e4ufe \\u00fcber 8 km und 14 km sowie einen 7-km-Zeitmarsch und einen Lauf f\\u00fcr die Altersklassen minimes und benjamins mit Start an der avenue Charles de Gaulle.\\n\\nDie Anmeldegeb\\u00fchren betragen online bis Freitag, den 20. November, 10 Euro f\\u00fcr den 8-km-Lauf und den Marsch sowie 15 Euro f\\u00fcr den 14-km-Lauf. Vor Ort kommen 2 Euro hinzu.\\n\\nZeiten:\\n11:00 Uhr \\u2013 Empfang \\u2013 Abholung der Startnummern - Anmeldung\\n13:30 Uhr \\u2013 Jugendl\\u00e4ufe\\n14:30 Uhr \\u2013 Zeitmarsch\\n15:00 Uhr \\u2013 L\\u00e4ufe \\u00fcber 8 und 14 km\\n17:00 Uhr \\u2013 Siegerehrung am Podiumsfahrzeug von H\\u00e9rault Sport\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.3wsport.com\\\/\"},{\"id\":17,\"name\":\"BLMA VS LANDERNEAU\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-randonnee\",\"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\":\"34970 Lattes\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Frauen-Basketballliga\\nDas BLMA aus LATTES trifft am 22. November 2026 um 15:30 Uhr im Palais des Rencontres in Lattes auf Landerneau.\\n\\nKommen Sie und unterst\\u00fctzen Sie Ihr Lieblingsteam!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.blma.fr\\\/\"},{\"id\":11,\"name\":\"Weihnachtsmarkt\",\"type\":\"evenements-locaux-203\",\"category\":\"maerkte-messen\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 10:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34270 Sainte-Croix-de-Quintillargues\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Am 22. November l\\u00e4dt Sainte-Croix-de-Quintillargues Sie zu seinem Weihnachtsmarkt im Espace Claude Saumade ein.\\n\\nEntdecken Sie zahlreiche Aussteller in festlicher Atmosph\\u00e4re: Geschenkideen, Leckereien, Verpflegung und Animationen pr\\u00e4gen den Tag, insbesondere mit den Weihnachtsliedern der Magic Christmas Band.\\n\\nEin geselliges Treffen f\\u00fcr Jung und Alt im Herzen des Dorfes!\",\"image\":\"https:\\\/\\\/www.grandpicsaintloup-tourisme.fr\\\/_objects\\\/tao_suite_agenda\\\/fma\\\/photos\\\/flyer-marche-de-noel-2026-54389-54407.png\",\"credit\":\"Mairie Sainte-Croix-de-Quintillargues\",\"link\":\"https:\\\/\\\/mairie-saintecroixdequintillargues.fr\\\/\"},{\"id\":19,\"name\":\"DAS DACH DER WELT\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 27\\\/11\\\/2026 au 27\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-27\",\"end\":\"2026-11-27\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34090 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Paris, 1945. Henry Vernot sucht nach seinem Bruder Antoine, der spurlos verschwunden ist.\\n\\nDer einzige Weg, Antoine zu finden, besteht darin, sich ein Gem\\u00e4lde zu sichern, oder besser gesagt das, was sich darin befindet... Als Opfer einer Vergangenheit, die er vergessen m\\u00f6chte, wird die Suche nach seinem Bruder eine sch\\u00e4ndliche Wahrheit ans Licht bringen, die er lieber geheim gehalten h\\u00e4tte. Paris, 1945. Es ist die Geschichte von Antoine und Henry Vernot.\\n\\nDauer: 1h10 - Ab 12 Jahren\\nTheaterthriller\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/book.montpellier-tourisme.fr\\\/fr\\\/voir-faire\\\/2881196\\\/th%C3%A9%C3%A2tre-beaux-arts-tabard\\\/afficher-les-details?filter=c%3D58791%2C33858%2C32320%3Bd%3D20220408%7C99991231\"},{\"id\":0,\"name\":\"BLMA GEGEN CHARNAY\",\"type\":\"evenements-locaux-203\",\"category\":\"sport-wandern\",\"label\":\"Du 09\\\/12\\\/2026 au 09\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-09\",\"end\":\"2026-12-09\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34970 Lattes\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Frauen-Basketballliga\\nBLMA aus LATTES trifft am 09. Dezember 2026 um 20:00 Uhr im Palais des Rencontres in Lattes auf Charnay.\\n\\nKommen Sie und unterst\\u00fctzen Sie Ihr Lieblingsteam!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.blma.fr\\\/\"},{\"id\":2,\"name\":\"P\\u00c9TROLE\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 10\\\/12\\\/2026 au 10\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-10\",\"end\":\"2026-12-10\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34000 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Sylvain Creuzevault nimmt sich hier Pasolinis letztem, explosivem, unvollendetem und fragmentarischem Roman an, den er kurz vor seinem Tod schrieb und der erst lange danach ver\\u00f6ffentlicht wurde. Zu sehen am 10. und 11. Dezember, Dauer 3 Std. 30 Min. mit 20-min\\u00fctiger Pause.\\n\\nIn einem Magma aus Informationen und bissigen Notizen verfolgen wir die Wirren eines Mannes, der zwischen seinen hohen \\u00f6ffentlichen \\u00c4mtern in einem ehemaligen faschistischen Kohlenwasserstoffunternehmen und seinen privaten Sehns\\u00fcchten nach einer Sexualit\\u00e4t jenseits der Norm zerrissen ist. All dies vor dem Hintergrund der enormen politischen, sozialen und k\\u00fcnstlerischen Spannung jener Zeit, als die Welt kopf\\u00fcber in einen widerw\\u00e4rtigen Neoliberalismus kippte, der in vielerlei Hinsicht an unseren erinnert, an die bleiernen Jahre zwischen 1970 und 1980, in Italien wie anderswo. Der Ausdruck \\u201emit Haut und Haaren\\u201c scheint passend, so sehr lassen die Darsteller Pasolinis zornige Sprache erklingen und ringen mit ihr...\\n\\nEin ganzer Roman bis an seine Grenzen getrieben, in einem prophetischen und polemischen visuellen Gedicht, das das Theater und unsere Wahrnehmungen ersch\\u00fcttert.\\n\\nDauer 3 Std. 30 Min. mit 20 Min. Pause\\n\\nDo 10 Dez 19:00 Uhr\\nFr 11 Dez 19:00 Uhr\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/book.montpellier-tourisme.fr\\\/fr\\\/voir-faire\\\/2888999\\\/th%C3%A9%C3%A2tre-des-13-vents-centre-dramatique-national-montpellie\\\/afficher-les-details\"},{\"id\":7,\"name\":\"MICHELE LAROQUE & KAD MERAD \\\"L'\\u00c2GE B\\u00caTE\\\"\",\"type\":\"evenements-locaux-203\",\"category\":\"shows-kino\",\"label\":\"Du 11\\\/12\\\/2026 au 11\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-11\",\"end\":\"2026-12-11\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34000 Montpellier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Benoit und Claire haben sich gerade erst kennengelernt und wollen ihre neue Liebesgeschichte in vollen Z\\u00fcgen und ohne Grenzen leben. Rebellisch und frei stehen sie zu ihrer Liebe zu Sex, Alkohol und Fu\\u00dfball: Sie sind die neuen Sechzigj\\u00e4hrigen. Sie weigern sich, sich vom Alter einengen zu lassen. Trotz ihrer tief verwurzelten Gewohnheiten wollen sie weiterhin leben wie junge Leute und richtig Spa\\u00df haben. Willkommen in ihrem \\u201e\\u00e2ge b\\u00eate\\u201c.\\n\\nReservierung f\\u00fcr barrierefreie Pl\\u00e4tze\\njulie@adamconcerts.com\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.zenithsud-montpellier.com\\\/fr\\\/agenda\\\/theatre-humour\\\/michele-laroque-kad-merad\"},{\"id\":14,\"name\":\"SCHWARZ, J\\u00dcDISCH UND EIN\\u00e4UGIG, DIE GESCHICHTE VON SAMMY DAVIS\",\"type\":\"evenements-locaux-203\",\"category\":\"spectacles-cinema\",\"label\":\"Du 11\\\/12\\\/2026 au 11\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-11\",\"end\":\"2026-12-11\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"34170 Castelnau-le-Lez\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Sammy Davis Jr. ist au\\u00dfergew\\u00f6hnlich und stellt den Begriff der Identit\\u00e4t st\\u00e4ndig infrage. In einer Zeit, in der jedem eingeredet wird, er k\\u00f6nne sich nur \\u00fcber ein einziges Merkmal definieren, ist diese Haltung wirklich radikal.\\n\\nHeute die Geschichte von Sammy Davis Jr. zu erz\\u00e4hlen, ist eine Notwendigkeit.\\n\\nIn einer Welt, in der Nuancen vergessen wurden, macht er daraus eine Lebenslektion.\\n\\nSchwarz, J\\u00fcdisch und Ein\\u00e4ugig \\u00abDie Geschichte von Sammy Davis Jr.\\u00bb\\n\\nEr ist dieses Kind aus Harlem\\n\\nEr ist derjenige, der schon mit 3 Jahren auf der B\\u00fchne stand\\n\\nEr ist derjenige, der den Krieg miterlebt hat\\n\\nEr ist derjenige, der JFK an die Macht brachte\\n\\nEr ist ein Freund von Frank Sinatra und Elvis Presley\\n\\nEr ist Schauspieler\\n\\nEr ist T\\u00e4nzer\\n\\nEr ist Hollywood\\n\\nEr ist schwarz, j\\u00fcdisch und ein\\u00e4ugig\\n\\nEr ist Sammy Davis Jr.\\n\\nFreitag, 11. Dezember 2026 um 20:00 Uhr\\n\\nMusicalshow\\nDauer: 1 Std. 10 Min.\\nF\\u00fcr alle Altersgruppen\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/lekiasma.vostickets.fr\\\/Billet\\\/FR\\\/representation-LE_KIASMA-35426-0.wb?REFID=DzUcAAAAAAAAAAAAFAA\"}];\n    var CATEGORIES = {\"sport-wandern\":{\"key\":\"sport-wandern\",\"label\":\"Sport & Wandern\",\"color\":\"#ef4444\",\"count\":4},\"sport-randonnee\":{\"key\":\"sport-randonnee\",\"label\":\"Sport & randonn\\u00e9e\",\"color\":\"#3b82f6\",\"count\":2},\"shows-kino\":{\"key\":\"shows-kino\",\"label\":\"Shows & Kino\",\"color\":\"#10b981\",\"count\":6},\"maerkte-messen\":{\"key\":\"maerkte-messen\",\"label\":\"M\\u00e4rkte & Messen\",\"color\":\"#f59e0b\",\"count\":4},\"konzerte-musik-festivals\":{\"key\":\"konzerte-musik-festivals\",\"label\":\"Konzerte, Musik & Festivals\",\"color\":\"#a855f7\",\"count\":1},\"ausstellungen\":{\"key\":\"ausstellungen\",\"label\":\"Ausstellungen\",\"color\":\"#0891b2\",\"count\":1},\"spectacles-cinema\":{\"key\":\"spectacles-cinema\",\"label\":\"Spectacles & cin\\u00e9ma\",\"color\":\"#db2777\",\"count\":2}};\n    var TODAY = \"2026-11-12\";\n    \/\/ Textes et format des dates dans la langue de la page (includes\/i18n.php)\n    var T = {\"blog_read_more\":\"Artikel lesen\",\"blog_empty\":\"Noch keine Artikel.\",\"blog_newer\":\"Neuere Artikel\",\"blog_older\":\"\\u00c4ltere Artikel\",\"blog_label\":\"Artikel\",\"hero_title\":\"In der Umgebung entdecken\",\"hero_text\":\"D\\u00f6rfer, Str\\u00e4nde, Spazierg\\u00e4nge, gute Adressen und Erlebnisse rund um Ihren Aufenthalt.\",\"around\":\"Rund um\",\"search_placeholder\":\"Einen Ort, eine Aktivit\\u00e4t, ein Dorf suchen\\u2026\",\"search\":\"Suchen\",\"max_distance\":\"Maximale Entfernung\",\"all\":\"Alle\",\"prev_categories\":\"Vorherige Kategorien\",\"next_categories\":\"N\\u00e4chste Kategorien\",\"categories\":\"Kategorien\",\"display\":\"Ansicht\",\"list\":\"Liste\",\"map\":\"Karte\",\"close\":\"Schlie\\u00dfen\",\"featured\":\"Highlight\",\"discover\":\"Entdecken\",\"idea\":\"Idee\",\"ideas\":\"Ideen\",\"around_you\":\"in Ihrer N\\u00e4he\",\"no_result\":\"Keine Ergebnisse\",\"no_result_hint\":\"Versuchen Sie eine andere Suche, Kategorie oder Entfernung.\",\"pagination\":\"Seitennavigation\",\"prev_page\":\"Vorherige Seite\",\"next_page\":\"N\\u00e4chste Seite\",\"ideas_title\":\"Ideen nach Lust und Laune\",\"ideas_sub\":\"Vorschl\\u00e4ge f\\u00fcr Ihren perfekten Aufenthalt.\",\"reset_view\":\"Zur\\u00fcck zur \\u00dcbersicht\",\"map_hint\":\"Klicken Sie auf eine Markierung, um die Details hier anzuzeigen.\",\"official_site\":\"Offizielle Website\",\"video\":\"Video\",\"gallery\":\"Galerie\",\"documents\":\"Dokumente\",\"faq\":\"H\\u00e4ufige Fragen\",\"no_answer\":\"Noch keine Antwort.\",\"see_on_maps\":\"Auf Google Maps ansehen\",\"see_place_on_maps\":\"Den Campingplatz auf Google Maps ansehen\",\"yes\":\"Ja\",\"no\":\"Nein\",\"practical_info\":\"Praktische Infos\",\"reviews\":\"Bewertungen\",\"read_more\":\"Weiterlesen\",\"prev_review\":\"Vorherige Bewertung\",\"next_review\":\"N\\u00e4chste Bewertung\",\"prev_item\":\"Zur\\u00fcck\",\"next_item\":\"Weiter\",\"photo_credit\":\"Foto: %s\",\"directions\":\"Route\",\"read_less\":\"Weniger\",\"article_in_this\":\"In diesem Artikel\",\"article_toc\":\"Inhalt des Artikels\",\"see_original\":\"Automatisch \\u00fcbersetzt \\u00b7 Original anzeigen\",\"see_translation\":\"\\u00dcbersetzung anzeigen\",\"stars_out_of_5\":\"%s von 5 Sternen\",\"owner_reply\":\"Antwort des Gastgebers\",\"customer\":\"Gast\",\"customer_reviews\":\"G\\u00e4stebewertungen\",\"rating_label\":\"Bewertet mit %1$s von 5, %2$s Bewertungen \\u2014 Bewertungen ansehen\",\"reviews_by\":\"Bewertungen pr\\u00e4sentiert von Elaia\",\"powered_by\":\"Bereitgestellt von\",\"today\":\"Heute\",\"today_lc\":\"heute\",\"tomorrow\":\"Morgen\",\"until\":\"Bis %s\",\"from_to\":\"Vom %1$s bis %2$s\",\"registration\":\"Anmeldung erforderlich\",\"full\":\"Ausgebucht\",\"all_animations\":\"Alle Aktivit\\u00e4ten ansehen \\u2192\",\"ago_day\":\"vor %d Tag\",\"ago_days\":\"vor %d Tagen\",\"ago_week\":\"vor %d Woche\",\"ago_weeks\":\"vor %d Wochen\",\"ago_month\":\"vor %d Monat\",\"ago_months\":\"vor %d Monaten\",\"ago_year\":\"vor %d Jahr\",\"ago_years\":\"vor %d Jahren\",\"anim_unavailable\":\"Das Programm ist vor\\u00fcbergehend nicht verf\\u00fcgbar\",\"content_unavailable\":\"Dieser Inhalt ist vor\\u00fcbergehend nicht verf\\u00fcgbar\",\"anim_eyebrow\":\"Erleben Sie unvergessliche Momente\",\"anim_title\":\"Animationen & Veranstaltungen\",\"anim_hero_text\":\"Alle aktuellen Aktivit\\u00e4ten, die H\\u00f6hepunkte der Woche und kommende Veranstaltungen w\\u00e4hrend Ihres Aufenthalts.\",\"anim_sections\":\"Seitenbereiche\",\"anim_nav_today\":\"Heute\",\"anim_nav_week\":\"Diese Woche\",\"anim_nav_upcoming\":\"Demn\\u00e4chst\",\"anim_nav_calendar\":\"Kalender\",\"anim_where\":\"Wo?\",\"anim_onsite\":\"Vor Ort\",\"anim_nearby\":\"In der Umgebung\",\"anim_no_onsite\":\"Derzeit keine Aktivit\\u00e4t vor Ort\",\"anim_no_nearby\":\"Derzeit keine Veranstaltung in der Umgebung\",\"anim_all_day\":\"Ganzt\\u00e4gig\",\"anim_at\":\"um %s\",\"anim_see_detail\":\"Details ansehen\",\"anim_live\":\"L\\u00e4uft\",\"anim_onsite_spot\":\"Vor Ort \\u00b7 %s\",\"anim_badge_until\":\"Bis\",\"anim_badge_from\":\"Ab\",\"anim_badge_today\":\"Heute\",\"anim_filter_cat\":\"Nach Kategorie filtern\",\"anim_all_f\":\"Alle\",\"anim_prev_day\":\"Vorheriger Tag\",\"anim_next_day\":\"N\\u00e4chster Tag\",\"anim_today_title\":\"Aktivit\\u00e4ten heute\",\"anim_tomorrow_title\":\"Aktivit\\u00e4ten morgen\",\"anim_day_title\":\"Aktivit\\u00e4ten am %s\",\"anim_relax_today\":\"Heute ein entspannter Tag\",\"anim_nothing_day\":\"An diesem Tag ist nichts geplant\",\"anim_next_on\":\"N\\u00e4chste Veranstaltung am %s.\",\"anim_soon\":\"Das Programm wird bald aktualisiert.\",\"anim_see_day\":\"Diesen Tag ansehen\",\"anim_prev_acts\":\"Vorherige Aktivit\\u00e4ten\",\"anim_next_acts\":\"N\\u00e4chste Aktivit\\u00e4ten\",\"anim_prev_week\":\"Vorherige Woche\",\"anim_next_week\":\"N\\u00e4chste Woche\",\"anim_week_title\":\"Die Highlights der Woche\",\"anim_next_week_title\":\"N\\u00e4chste Woche\",\"anim_week_of\":\"Woche vom %s\",\"anim_week_days\":\"Wochentage\",\"anim_today_paren\":\"(heute)\",\"anim_activity\":\"%d Aktivit\\u00e4t\",\"anim_activities\":\"%d Aktivit\\u00e4ten\",\"anim_nothing\":\"nichts geplant\",\"anim_pick_day\":\"W\\u00e4hlen Sie einen anderen Tag, um sein Programm zu sehen.\",\"anim_sort\":\"Veranstaltungen sortieren\",\"anim_sort_date\":\"Nach Datum sortieren\",\"anim_sort_name\":\"Nach Name sortieren\",\"anim_upcoming_title\":\"Alle kommenden Veranstaltungen\",\"anim_no_upcoming\":\"Keine kommenden Veranstaltungen\",\"anim_try_cat\":\"Versuchen Sie eine andere Kategorie.\",\"anim_more\":\"Weitere Veranstaltungen (%d)\",\"anim_hide_cal\":\"Kalender ausblenden\",\"anim_show_cal\":\"Ganzen Kalender ansehen\",\"anim_cal_title\":\"Monatskalender\",\"anim_cal_sub\":\"Alle Termine des Monats auf einen Blick.\",\"anim_prev_month\":\"Vorheriger Monat\",\"anim_next_month\":\"N\\u00e4chster Monat\",\"anim_more_info\":\"Mehr Informationen\",\"anim_new_tab\":\"(neuer Tab)\",\"date_locale\":\"de-DE\",\"page_faq\":\"FAQ\",\"page_metadatas\":\"Entdecken Sie die Umgebung\",\"page_animations\":\"Animationen und Veranstaltungen\",\"page_corpus\":\"Praktische Informationen\",\"anim_event\":\"Veranstaltung\"};\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\\\/A7psMMV4cj7v9YgY8H5BDxDjigpViaqRBj8qr37o.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 data-rsssl=1> 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","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-13535","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Animationen und Veranstaltungen - Camping Bon Port<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.campingbonport.com\/de\/elaia-animations\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Animationen und Veranstaltungen - Camping Bon Port\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.campingbonport.com\/de\/elaia-animations\/\" \/>\n<meta property=\"og:site_name\" content=\"Camping Bon Port\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/elaia-animations\\\/\",\"url\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/elaia-animations\\\/\",\"name\":\"Animationen und Veranstaltungen - Camping Bon Port\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#website\"},\"datePublished\":\"2026-11-12T12:31:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/elaia-animations\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/elaia-animations\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/elaia-animations\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Camping Camargue\",\"item\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Animationen und Veranstaltungen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/\",\"name\":\"Camping Bon Port\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#organization\",\"name\":\"Camping Bon Port\",\"url\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.campingbonport.com\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/logo-bon-port.jpg\",\"contentUrl\":\"https:\\\/\\\/www.campingbonport.com\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/logo-bon-port.jpg\",\"width\":736,\"height\":917,\"caption\":\"Camping Bon Port\"},\"image\":{\"@id\":\"https:\\\/\\\/www.campingbonport.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Animationen und Veranstaltungen - Camping Bon Port","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/","og_locale":"de_DE","og_type":"article","og_title":"Animationen und Veranstaltungen - Camping Bon Port","og_url":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/","og_site_name":"Camping Bon Port","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/","url":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/","name":"Animationen und Veranstaltungen - Camping Bon Port","isPartOf":{"@id":"https:\/\/www.campingbonport.com\/de\/#website"},"datePublished":"2026-11-12T12:31:22+00:00","breadcrumb":{"@id":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.campingbonport.com\/de\/elaia-animations\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.campingbonport.com\/de\/elaia-animations\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Camping Camargue","item":"https:\/\/www.campingbonport.com\/de\/"},{"@type":"ListItem","position":2,"name":"Animationen und Veranstaltungen"}]},{"@type":"WebSite","@id":"https:\/\/www.campingbonport.com\/de\/#website","url":"https:\/\/www.campingbonport.com\/de\/","name":"Camping Bon Port","description":"","publisher":{"@id":"https:\/\/www.campingbonport.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.campingbonport.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.campingbonport.com\/de\/#organization","name":"Camping Bon Port","url":"https:\/\/www.campingbonport.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.campingbonport.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.campingbonport.com\/wp-content\/uploads\/2021\/11\/logo-bon-port.jpg","contentUrl":"https:\/\/www.campingbonport.com\/wp-content\/uploads\/2021\/11\/logo-bon-port.jpg","width":736,"height":917,"caption":"Camping Bon Port"},"image":{"@id":"https:\/\/www.campingbonport.com\/de\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/pages\/13535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/comments?post=13535"}],"version-history":[{"count":1,"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/pages\/13535\/revisions"}],"predecessor-version":[{"id":13537,"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/pages\/13535\/revisions\/13537"}],"wp:attachment":[{"href":"https:\/\/www.campingbonport.com\/de\/wp-json\/wp\/v2\/media?parent=13535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}