{"id":2434,"date":"2026-10-09T11:23:00","date_gmt":"2026-10-09T09:23:00","guid":{"rendered":"https:\/\/www.camping-lannbrick.com\/elaia-animations-2\/"},"modified":"2026-10-20T12:13:11","modified_gmt":"2026-10-20T10:13:11","slug":"elaia-animations","status":"publish","type":"page","link":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/","title":{"rendered":"Activities and events"},"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> 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 ea-hero--plain\">\n    <div class=\"ea-hero-inner\">\n      <span class=\"ea-eyebrow\">Enjoy unforgettable moments<\/span>\n      <h1 class=\"ea-hero-title\">Activities &amp; events<\/h1>\n      <p class=\"ea-hero-text\">Find all current activities, this week&#039;s highlights and upcoming events during your stay.<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- 2. Navigation rapide (collante) + filtre sur place \/ aux alentours -->\n  <nav class=\"ea-nav\" aria-label=\"Page sections\">\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>Today<\/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>This week<\/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>Upcoming<\/a>\n              <\/div>\n              <span class=\"ea-nav-sep\" aria-hidden=\"true\"><\/span>\n        <div class=\"ea-scope\" role=\"group\" aria-label=\"Where?\">\n          <button type=\"button\" data-scope=\"all\" aria-pressed=\"true\">All<\/button>\n                    <button type=\"button\" data-scope=\"onsite\" aria-pressed=\"false\" disabled title=\"No on-site activity at the moment\">On site<\/button>\n          <button type=\"button\" data-scope=\"nearby\" aria-pressed=\"false\">Nearby<\/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>Exhibition &quot;A Family Affair&quot;<\/strong> \u2014 Du 11\/07\/2023 au 01\/06\/2027 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Exhibition: Solange Nunney<\/strong> \u2014 Du 01\/01\/2026 au 31\/12\/2026 \u00e0 23:59 \u2014 56360 Le Palais<\/li>\n              <li><strong>Exhibition: Secrets of the Abyss<\/strong> \u2014 Du 05\/01\/2026 au 03\/01\/2027 \u00e0 23:59 \u2014 56370 Le Tour-du-Parc<\/li>\n              <li><strong>Engrave your menhir!<\/strong> \u2014 Du 08\/06\/2026 au 06\/06\/2027 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Training course &quot;Eat Wild Plants!&quot;<\/strong> \u2014 Du 26\/09\/2026 \u00e0 09:30 au 12\/06\/2027 \u00e0 23:59 \u2014 56390 Brandivy<\/li>\n              <li><strong>Exhibition: Shells in all their forms<\/strong> \u2014 Du 10\/10\/2026 au 13\/12\/2026 \u00e0 23:59 \u2014 56370 Le Tour-du-Parc<\/li>\n              <li><strong>Micro-Folie: November schedule<\/strong> \u2014 Du 02\/11\/2026 au 30\/11\/2026 \u00e0 23:59 \u2014 56510 Saint-Pierre-Quiberon<\/li>\n              <li><strong>Bretagne Vagabonde Exhibition<\/strong> \u2014 Du 03\/11\/2026 au 28\/11\/2026 \u00e0 23:59 \u2014 56510 Saint-Pierre-Quiberon<\/li>\n              <li><strong>Exhibition &quot;Let\u2019s tie ourselves together&quot;<\/strong> \u2014 Du 03\/11\/2026 au 28\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Funny dinosaurs<\/strong> \u2014 Du 03\/11\/2026 \u00e0 10:00 au 14\/11\/2026 \u00e0 23:59 \u2014 56740 Locmariaquer<\/li>\n              <li><strong>Breton dance workshop - Da\u00f1s Alre<\/strong> \u2014 Du 10\/11\/2026 \u00e0 05:00 au 11\/11\/2026 \u00e0 23:59 \u2014 56400 Auray<\/li>\n              <li><strong>Weekly market in Locmariaquer<\/strong> \u2014 Du 10\/11\/2026 \u00e0 09:00 au 10\/11\/2026 \u00e0 23:59 \u2014 56740 Locmariaquer<\/li>\n              <li><strong>D\u00eener Jazz \u2022 Mokka<\/strong> \u2014 Du 10\/11\/2026 \u00e0 20:00 au 10\/11\/2026 \u00e0 23:59 \u2014 56880 Ploeren<\/li>\n              <li><strong>Film discussion: Being 20 in the Aur\u00e8s<\/strong> \u2014 Du 10\/11\/2026 \u00e0 21:20 au 10\/11\/2026 \u00e0 23:59 \u2014 56410 \u00c9tel<\/li>\n              <li><strong>Weekly market of Landaul<\/strong> \u2014 Du 11\/11\/2026 \u00e0 16:00 au 11\/11\/2026 \u00e0 23:59 \u2014 56690 Landaul<\/li>\n              <li><strong>Let&#039;s play with books!<\/strong> \u2014 Du 12\/11\/2026 \u00e0 10:30 au 12\/11\/2026 \u00e0 23:59 \u2014 56950 Crach<\/li>\n              <li><strong>Charity craft market<\/strong> \u2014 Du 13\/11\/2026 \u00e0 14:50 au 13\/11\/2026 \u00e0 23:59 \u2014 56470 Saint-Philibert<\/li>\n              <li><strong>The little Friday market<\/strong> \u2014 Du 13\/11\/2026 \u00e0 16:00 au 13\/11\/2026 \u00e0 23:59 \u2014 56330 Camors<\/li>\n              <li><strong>Weekly market in Locoal-Mendon<\/strong> \u2014 Du 13\/11\/2026 \u00e0 16:30 au 13\/11\/2026 \u00e0 23:59 \u2014 56550 Locoal-Mendon<\/li>\n              <li><strong>Live Music Dinners<\/strong> \u2014 Du 13\/11\/2026 \u00e0 20:00 au 13\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Weekly market of Quiberon<\/strong> \u2014 Du 14\/11\/2026 \u00e0 08:00 au 14\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Photo workshop for adults<\/strong> \u2014 Du 14\/11\/2026 \u00e0 15:00 au 14\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Meal: Ham hock and fries<\/strong> \u2014 Du 14\/11\/2026 \u00e0 19:00 au 14\/11\/2026 \u00e0 23:59 \u2014 56690 Landaul<\/li>\n              <li><strong>Comedy Festival<\/strong> \u2014 Du 14\/11\/2026 \u00e0 20:30 au 14\/11\/2026 \u00e0 23:59 \u2014 56950 Crach<\/li>\n              <li><strong>Theatre and music: Four hands<\/strong> \u2014 Du 14\/11\/2026 \u00e0 20:30 au 14\/11\/2026 \u00e0 23:59 \u2014 56400 Brech<\/li>\n              <li><strong>Afternoon Ti Ludique<\/strong> \u2014 Du 15\/11\/2026 \u00e0 14:00 au 15\/11\/2026 \u00e0 23:59 \u2014 56400 Ploemel<\/li>\n              <li><strong>Fest Deiz: Anne-Marie Nicol and Gw\u00e9na\u00eblle Pineau<\/strong> \u2014 Du 15\/11\/2026 \u00e0 14:30 au 15\/11\/2026 \u00e0 23:59 \u2014 56400 Ploemel<\/li>\n              <li><strong>Screening - 50 years of traditional music and songs in Pluvigner<\/strong> \u2014 Du 15\/11\/2026 \u00e0 17:00 au 15\/11\/2026 \u00e0 23:59 \u2014 56330 Pluvigner<\/li>\n              <li><strong>Games evening for adults!<\/strong> \u2014 Du 17\/11\/2026 \u00e0 19:00 au 17\/11\/2026 \u00e0 23:59 \u2014 56470 Saint-Philibert<\/li>\n              <li><strong>Rhymes and fingerplay games<\/strong> \u2014 Du 18\/11\/2026 \u00e0 10:30 au 18\/11\/2026 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Cin\u00e9-Doc: P\u00e9rou<\/strong> \u2014 Du 18\/11\/2026 \u00e0 15:00 au 18\/11\/2026 \u00e0 23:59 \u2014 56470 Saint-Philibert<\/li>\n              <li><strong>Photo and drawing workshop for children<\/strong> \u2014 Du 18\/11\/2026 \u00e0 15:00 au 18\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Doc screening - Futur, Reza and the future of the world<\/strong> \u2014 Du 19\/11\/2026 \u00e0 20:30 au 19\/11\/2026 \u00e0 23:59 \u2014 56330 Pluvigner<\/li>\n              <li><strong>Games evening<\/strong> \u2014 Du 20\/11\/2026 \u00e0 18:00 au 20\/11\/2026 \u00e0 23:59 \u2014 56400 Sainte-Anne-d&#039;Auray<\/li>\n              <li><strong>Concerts at Le Coota<\/strong> \u2014 Du 20\/11\/2026 \u00e0 22:00 au 20\/11\/2026 \u00e0 23:59 \u2014 56410 Erdeven<\/li>\n              <li><strong>Knightesses<\/strong> \u2014 Du 21\/11\/2026 \u00e0 20:30 au 21\/11\/2026 \u00e0 23:59 \u2014 56470 La Trinit\u00e9-sur-Mer<\/li>\n              <li><strong>Preview screening: &quot;A Good Little Soldier&quot;<\/strong> \u2014 Du 21\/11\/2026 \u00e0 20:30 au 21\/11\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Documentary Month: Sainte Julie by Giulia Montineri<\/strong> \u2014 Du 24\/11\/2026 \u00e0 18:00 au 24\/11\/2026 \u00e0 23:59 \u2014 56360 Le Palais<\/li>\n              <li><strong>Story Time<\/strong> \u2014 Du 25\/11\/2026 \u00e0 10:30 au 25\/11\/2026 \u00e0 23:59 \u2014 56400 Brech<\/li>\n              <li><strong>CINE-DOCS TRAVEL: The Mekong<\/strong> \u2014 Du 25\/11\/2026 \u00e0 15:00 au 25\/11\/2026 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Cinema, comics, literature weekend<\/strong> \u2014 Du 27\/11\/2026 au 27\/11\/2026 \u00e0 23:59 \u2014 56410 \u00c9tel<\/li>\n              <li><strong>Dance show &quot;Around the world in 80 steps&quot;<\/strong> \u2014 Du 27\/11\/2026 \u00e0 19:00 au 27\/11\/2026 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Festive and solidarity braderie<\/strong> \u2014 Du 28\/11\/2026 \u00e0 10:00 au 28\/11\/2026 \u00e0 23:59 \u2014 56690 Land\u00e9vant<\/li>\n              <li><strong>Games afternoon: Ribouldingue!<\/strong> \u2014 Du 28\/11\/2026 \u00e0 14:00 au 28\/11\/2026 \u00e0 23:59 \u2014 56510 Saint-Pierre-Quiberon<\/li>\n              <li><strong>Docu-film screenings The Silk Road &quot;In the footsteps of Marco Polo&quot;<\/strong> \u2014 Du 28\/11\/2026 \u00e0 16:00 au 28\/11\/2026 \u00e0 23:59 \u2014 56410 Erdeven<\/li>\n              <li><strong>Christmas market and entertainment<\/strong> \u2014 Du 28\/11\/2026 \u00e0 17:00 au 28\/11\/2026 \u00e0 23:59 \u2014 56400 Plumergat<\/li>\n              <li><strong>Concert - FI\u00d1V<\/strong> \u2014 Du 28\/11\/2026 \u00e0 20:30 au 28\/11\/2026 \u00e0 23:59 \u2014 56330 Pluvigner<\/li>\n              <li><strong>Christmas market of the Crevettes bleues school<\/strong> \u2014 Du 29\/11\/2026 \u00e0 09:00 au 29\/11\/2026 \u00e0 23:59 \u2014 56470 La Trinit\u00e9-sur-Mer<\/li>\n              <li><strong>Documentary screening - The voice of the Mekong, from Tibet to Ho Chi Minh<\/strong> \u2014 Du 29\/11\/2026 \u00e0 17:00 au 29\/11\/2026 \u00e0 23:59 \u2014 56330 Pluvigner<\/li>\n              <li><strong>Early childhood games morning<\/strong> \u2014 Du 02\/12\/2026 \u00e0 10:00 au 02\/12\/2026 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>Fireworks<\/strong> \u2014 Du 04\/12\/2026 \u00e0 19:30 au 04\/12\/2026 \u00e0 23:59 \u2014 56400 Auray<\/li>\n              <li><strong>Ballet &amp; opera season: &quot;Manon&quot;<\/strong> \u2014 Du 04\/12\/2026 \u00e0 20:00 au 04\/12\/2026 \u00e0 23:59 \u2014 56410 \u00c9tel<\/li>\n              <li><strong>Daoud jazz concert<\/strong> \u2014 Du 04\/12\/2026 \u00e0 20:30 au 04\/12\/2026 \u00e0 23:59 \u2014 56470 La Trinit\u00e9-sur-Mer<\/li>\n              <li><strong>Nature worksite on the Kercadoret heathland<\/strong> \u2014 Du 05\/12\/2026 \u00e0 09:00 au 05\/12\/2026 \u00e0 23:59 \u2014 56740 Locmariaquer<\/li>\n              <li><strong>Locoal Mendon Christmas Market<\/strong> \u2014 Du 05\/12\/2026 \u00e0 10:00 au 05\/12\/2026 \u00e0 23:59 \u2014 56550 Locoal-Mendon<\/li>\n              <li><strong>Avant-premi\u00e8re : &quot; Le jour d&#039;apr\u00e8s &quot;<\/strong> \u2014 Du 05\/12\/2026 \u00e0 20:30 au 05\/12\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/li>\n              <li><strong>Film Concert &quot;And Rain Is All&quot;<\/strong> \u2014 Du 06\/12\/2026 \u00e0 16:00 au 06\/12\/2026 \u00e0 23:59 \u2014 56410 Erdeven<\/li>\n              <li><strong>Les Milles Musicaux: Very Virtuoso(s)...<\/strong> \u2014 Du 06\/12\/2026 \u00e0 16:00 au 06\/12\/2026 \u00e0 23:59 \u2014 56470 La Trinit\u00e9-sur-Mer<\/li>\n              <li><strong>Exhibition: Folds and books by Marie Reneaud<\/strong> \u2014 Du 08\/12\/2026 au 19\/12\/2026 \u00e0 23:59 \u2014 56340 Carnac<\/li>\n              <li><strong>A Christmas show at the media library<\/strong> \u2014 Du 09\/12\/2026 \u00e0 10:30 au 09\/12\/2026 \u00e0 23:59 \u2014 56170 Quiberon<\/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=\"Close\">\u00d7<\/button>\n    <div id=\"ea-modal-content\"><\/div>\n  <\/div>\n<\/div>\n\n<script>\n  (function() {\n    var EVENTS = [{\"id\":26,\"name\":\"Exhibition \\\"A Family Affair\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 11\\\/07\\\/2023 au 01\\\/06\\\/2027 \\u00e0 23:59\",\"start\":\"2023-07-11\",\"end\":\"2027-06-01\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Exhibition \\\"A Family Affair\\\", photographic archives and megaliths of Carnac.\\n\\n\\\"Do you have a photo of yourself, or someone in your family, in the Carnac Alignments? Can you date this photo? We are interested!\\\" Initially conceived to keep in touch with followers of the Carnac Alignments Facebook page during lockdown, the collection of souvenir photos began in March 2020, via the social network in question.\\n\\nContinued until 2022, this \\\"collection\\\" was particularly abundant: more than 250 photographs were submitted, dating from 1920 for the oldest to 2022 for the most recent. But what to do with this treasure after sharing one or two photos each week on the Alignments page?\\nThe families who took part all quickly embraced the idea of an exhibition at the Maison des M\\u00e9galithes de Carnac.\\n\\nEnriched by features written by several contributors, Messrs. Dominique Sellier, Olivier Agogu\\u00e9, Fran\\u00e7ois de l'R, Jarne Da Silva, the exhibition \\\"A Family Affair\\\" makes it possible to address several topics as diverse as the history of photography, traditional Breton costume, the fragility of archaeological sites, etc. So many testimonies to the unsuspected richness of the \\\"souvenir photo\\\" as a source of information on the very identity of the megalithic monuments and their history. As such, complementary work is underway to go further in studying and showcasing this inexhaustible popular imagery. A \\\"family history\\\" to be continued!\\n\\nAt the Maison des m\\u00e9galithes.\\nFree admission.\\nUntil June 2027.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.menhirs-carnac.fr\\\/\"},{\"id\":16,\"name\":\"Exhibition: Solange Nunney\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 01\\\/01\\\/2026 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-01-01\",\"end\":\"2026-12-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56360 Le Palais\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Paintings, ceramics, korrigans, fabric-based works\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":49,\"name\":\"Exhibition: Secrets of the Abyss\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 05\\\/01\\\/2026 au 03\\\/01\\\/2027 \\u00e0 23:59\",\"start\":\"2026-01-05\",\"end\":\"2027-01-03\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56370 Le Tour-du-Parc\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Our new photo exhibition is open to the public! It features images by Gilles Martin made in partnership with IFREMER during the mission \\ud835\\ude52\\ud835\\ude5d\\ud835\\ude6e \\ud835\\ude63\\ud835\\ude64\\ud835\\ude69 \\ud835\\ude69\\ud835\\ude5d\\ud835\\ude5a \\ud835\\ude56\\ud835\\ude57\\ud835\\ude6e\\ud835\\ude68\\ud835\\ude68\\ud835\\ude5a\\ud835\\ude68? \\ud83e\\udd80\\n\\nThere you will discover species living at depths of up to 8,000 m and surprising photography techniques. The microscopic fauna will leave you indifferent, given how much we have to learn from it.\\n\\nWe have imagined a children\\u2019s corner, from the scenography to the mediation tools, so that the little ones can also dive into this mysterious and fascinating world... the \\ud835\\ude48\\ud835\\ude5e\\ud835\\ude68\\ud835\\ude68\\ud835\\ude5e\\ud835\\ude64\\ud835\\ude63 \\ud835\\ude3c\\ud835\\ude57\\ud835\\ude6e\\ud835\\ude68\\ud835\\ude68\\ud835\\ude5a\\ud835\\ude68 is underway! \\ud83c\\udf0a\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.ostreapolis.bzh\\\/\"},{\"id\":31,\"name\":\"Engrave your menhir!\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 08\\\/06\\\/2026 au 06\\\/06\\\/2027 \\u00e0 23:59\",\"start\":\"2026-06-08\",\"end\":\"2027-06-06\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\\"Ink, colors and Prehistory\\\": a project created by schoolchildren accompanied by artist Emma Burr.\\n\\nThe middle school students of Carnac and the visual artist Emma BURR create a gallery of portraits of the menhirs of the Alignments. First, a discovery trail through the Alignments is offered: a historical approach to the megalithic phenomenon and a broad sequence devoted to drawing \\u201cin situ\\u201d and from life are on the program.\\nThen Emma BURR leads artistic practice sessions in the two middle schools of Carnac: reworking the drawings made directly in contact with the monuments, drypoint engraving on plexiglass plate, inking and printing with a hand press. Coloring using watercolor technique is the final step.\\n\\nEmma Burr's work revolves around drawing, watercolor and engraving. She draws her inspiration from what surrounds her: architecture and the city, nature and flora in particular, and scenes from beaches, walks, and museum outings.\\nLearn more about Emma Burr: https:\\\/\\\/emmaburr.com\\\/\\n\\nThe project \\\"Engrave your menhir!\\\" illustrates the artistic and cultural education policy of the Centre des monuments nationaux, which aims to make the territory's young people actors in the promotion, enhancement and preservation of the monuments they have inherited from previous generations. This project benefited from the involvement of many stakeholders and partners, all of whom are warmly thanked.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.menhirs-carnac.fr\\\/agenda\\\/grave-ton-menhir-!-encre-couleurs-et-prehistoire\"},{\"id\":5,\"name\":\"Training course \\\"Eat Wild Plants!\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"sport-hiking\",\"label\":\"Du 26\\\/09\\\/2026 \\u00e0 09:30 au 12\\\/06\\\/2027 \\u00e0 23:59\",\"start\":\"2026-09-26\",\"end\":\"2027-06-12\",\"start_time\":\"09:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56390 Brandivy\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The School of Connection with Living Beings is offering for the second consecutive year its course \\\"Eat Wild!\\\", a practical and sensitive botany and ethnobotany training course.\\n9 days between practice and theory - and gastronomy of course! - to learn how to identify, know, pick and cook edible wild plants.\\nWe will also cover medicinal plants, and of course toxic plants.\\nThe sensitive approach will complete the learning experience, bringing all our senses on board in this adventure alongside living beings!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/luciebenoit.com\\\/formation-mangez-sauvage\"},{\"id\":19,\"name\":\"Exhibition: Shells in all their forms\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 10\\\/10\\\/2026 au 13\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-10-10\",\"end\":\"2026-12-13\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56370 Le Tour-du-Parc\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Ostr\\u00e9apolis welcomes the shell collections of the Museum of History and Archaeology of the city of Vannes\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/ostreapolis.bzh\\\/\"},{\"id\":35,\"name\":\"Micro-Folie: November schedule\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 02\\\/11\\\/2026 au 30\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-02\",\"end\":\"2026-11-30\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56510 Saint-Pierre-Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"In November, Micro-Folie invites you to discover culture in a different way, through immersive experiences, games and digital creation. Virtual reality, tablets, a Mario Kart tournament and a digital cutter open the doors to new worlds, to be explored through play, experimentation and curiosity.\\n\\n> 2 collections: \\u201cGrand Est Region\\u201d and \\u201cQuebec\\u201d\\n> 2 virtual reality headset sessions: Saturday 7 and Friday 27\\n> 1 video game tournament: Wednesday 18\\n> 1 games morning: Saturday 21\\n> 1 FabLab workshop: Saturday 28\\n\\nOpening hours:\\nTuesday: 4:00 PM - 6:00 PM\\nWednesday: 10:00 AM - 12:30 PM\\nFriday: 4:00 PM - 6:00 PM\\nSaturday: 10:00 AM - 12:30 PM\\n\\ud83d\\udcccInformation and bookings: mediationculturelle@saintpierrequiberon.fr\\nhttps:\\\/\\\/www.saintpierrequiberon.fr\\\/listes\\\/micro-folie\\\/\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":32,\"name\":\"Bretagne Vagabonde Exhibition\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 03\\\/11\\\/2026 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-03\",\"end\":\"2026-11-28\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56510 Saint-Pierre-Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The media library of Saint-Pierre-Quiberon is hosting an exhibition of watercolors created by members of the Aquamer association \\u2013 Painting Workshop, based in Quiberon.\\n\\nFounded in 2015, the association brings together members from Saint-Pierre-Quiberon and Quiberon around a shared passion for painting.\\nEvery week, they meet to attend classes led by two painter artists. Once a month, they extend their practice outdoors, on the peninsula or in the surrounding area.\\nActive in local cultural life, the association also takes part in events and exhibitions in both communes.\\n\\nCome and discover their watercolors and the Breton landscapes they have immortalized throughout the year during classes and workshops.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":18,\"name\":\"Exhibition \\\"Let\\u2019s tie ourselves together\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 03\\\/11\\\/2026 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-03\",\"end\":\"2026-11-28\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The media library of Quiberon welcomes \\u00ab Nouons-nous \\u00bb, a photographic exhibition by Auxane Caqueret and L\\u00e9andre Bellin.\\n\\nAn opening reception is scheduled for Friday 6 November at 6 p.m.\\nTwo workshops will also explore photography:\\n- \\u00ab The story through we \\u00bb, for adults, on Saturday 14 November at 3 p.m.\\n- \\u00ab Beyond the image \\u00bb, for children aged 7 to 12, on Wednesday 18 November at 3 p.m.\\nThe workshops require registration with the media library.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":33,\"name\":\"Funny dinosaurs\",\"type\":\"evenements-locaux-69\",\"category\":\"family\",\"label\":\"Du 03\\\/11\\\/2026 \\u00e0 10:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-03\",\"end\":\"2026-11-14\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56740 Locmariaquer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A whimsical take on dinosaurs.\\nExhibition of creations made by the children from the UFCV leisure centre during the All Saints' holiday.\\n\\nSchedule: Tuesday, Wednesday, Saturday 10:00\\\/12:30 - Wednesday 3:00 PM\\\/6:00 PM and Friday 4:00 PM\\\/6:00 PM\\n\\nFree\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.calameo.com\\\/read\\\/0046368566d55c4deb482?utm_id=97758_v0_s00_e0_tv2_a1demo0ed4g20i\"},{\"id\":14,\"name\":\"Breton dance workshop - Da\\u00f1s Alre\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 10\\\/11\\\/2026 \\u00e0 05:00 au 11\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-10\",\"end\":\"2026-11-11\",\"start_time\":\"05:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Auray\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Join the dance with host Kevin Guillo! These classes are open to everyone, whether you are a beginner or already experienced. Come and discover Breton dances or deepen your practice, in a friendly and warm atmosphere!\\n\\nEvery Tuesday, except during school holidays\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":11,\"name\":\"Weekly market in Locmariaquer\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 10\\\/11\\\/2026 \\u00e0 09:00 au 10\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-10\",\"end\":\"2026-11-10\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56740 Locmariaquer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"It takes place every Tuesday and Saturday morning from 9 a.m. to 1 p.m.:\\n\\n- Centre Bourg from September to May.\\n- Place De Gaulle from June to August.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":43,\"name\":\"D\\u00eener Jazz \\u2022 Mokka\",\"type\":\"evenements-locaux-69\",\"category\":\"en-famille\",\"label\":\"Du 10\\\/11\\\/2026 \\u00e0 20:00 au 10\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-10\",\"end\":\"2026-11-10\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56880 Ploeren\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Le Domaine Le Mezo vous invite \\u00e0 un d\\u00eener jazz aux accents soul, R&B et bossa nova. Dans une ambiance douce et intimiste, le duo nantais Mokka accompagne la soir\\u00e9e avec un live acoustique \\u00e9l\\u00e9gant, entre groove feutr\\u00e9, voix chaleureuse et guitare d\\u00e9licate.\\n\\n S\\u00e9lection du sommelier : accords au verre vins & Champagne ou accords sans alcool ou Grands vins \\u00e0 la bouteille avec coupe de Champagne.\\n\\nMokka\\nen d\\u00eener-concert au Mezo\\nMokka est un duo acoustique nantais qui revisite avec finesse un r\\u00e9pertoire m\\u00ealant R&B, soul et bossa nova. Port\\u00e9 par une complicit\\u00e9 naturelle, le duo cr\\u00e9e une atmosph\\u00e8re musicale \\u00e0 la fois chaleureuse, moderne et enveloppante, id\\u00e9ale pour accompagner un d\\u00eener en musique.\\n\\nEntre douceur vocale, rythmes groovy et couleurs br\\u00e9siliennes, Mokka propose un moment live tout en \\u00e9l\\u00e9gance, pens\\u00e9 comme une parenth\\u00e8se sensible et conviviale.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.domainelemezo.fr\\\/\"},{\"id\":7,\"name\":\"Film discussion: Being 20 in the Aur\\u00e8s\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 10\\\/11\\\/2026 \\u00e0 21:20 au 10\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-10\",\"end\":\"2026-11-10\",\"start_time\":\"21:20\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56410 \\u00c9tel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A group of Breton dissidents and pacifists is sent to Algeria. These people, confronted with the horrors of war, gradually become killing machines. One of them will not accept it and deserts, taking with him a FLN prisoner who was due to be executed the following day.\\n\\nA moment to talk over a drink is offered after the film.\\n\\nIn support of the Ren\\u00e9 Vautier cinema in Elne\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.cinemalariviere.org\\\/events\\\/84963-avoir-20-ans-dans-les-aures\\\/\"},{\"id\":0,\"name\":\"Weekly market of Landaul\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 11\\\/11\\\/2026 \\u00e0 16:00 au 11\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-11\",\"end\":\"2026-11-11\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56690 Landaul\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"An exclusively food market takes place every Wednesday from 4 p.m. to 7 p.m. on the Town Hall square.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":57,\"name\":\"Let's play with books!\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 12\\\/11\\\/2026 \\u00e0 10:30 au 12\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-12\",\"end\":\"2026-11-12\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56950 Crach\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Let's get back on the trail of books and reading games with the youngest children.\\n\\nThese sessions are for children from 3 months to 2 years old, with parents, grandparents and childminders.\\n\\nFree with registration\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":38,\"name\":\"Charity craft market\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 14:50 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"14:50\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 Saint-Philibert\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The association \\u201cCourir pour Lylou\\u201d invites you to Le Mousker hall in Saint-Philibert for its Charity Craft Market: a weekend all about friendliness, sharing and the magic of Christmas!\\n\\nCome and discover the creations and know-how of 25 exhibitors:\\nJewellery and handmade creations \\\/ Photographs \\\/ Soft toys \\\/ Soaps and candles \\\/ Food products and local specialities\\nAnd many other lovely surprises!\\n\\nSaturday at 6:30 pm: performance by Juke, Les Aventures du T\\u00e9nor de Brest.\\nSunday around 3:30 pm: Santa Claus arrival to delight young and old alike!\\n\\nRaffle on site with many prizes to win!\\n\\nFood truck and catering on site.\\n\\nAn event organised to support the solidarity challenge \\u201c420 km for Lylou\\u201d, which will take place from 1 to 10 June 2027, i.e. one marathon per day.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":34,\"name\":\"The little Friday market\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 16:00 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56330 Camors\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"From 4:00 p.m. Small market with three vendors.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":25,\"name\":\"Weekly market in Locoal-Mendon\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 16:30 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"16:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56550 Locoal-Mendon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The weekly market of local produce and handmade creations takes place every Friday from 4:30 p.m. to 7:00 p.m., in front of the church.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":39,\"name\":\"Live Music Dinners\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 20:00 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Every Friday evening, enjoy a live musical atmosphere in the Kasino restaurant.\\n\\nSet menu at \\u20ac30 (main course + dessert) + \\u20ac7 offered in game tokens.\\nDiscover the band of the day on the Kasino website: https:\\\/\\\/quiberon.kasino.bzh\\\/diners-music-live-n768.html\\n\\nGambling is prohibited for under-18s.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/quiberon.kasino.bzh\\\/diners-music-live-n446.html\"},{\"id\":1,\"name\":\"Weekly market of Quiberon\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 08:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Every Saturday, all year round from 8 a.m. to 1 p.m. Food market.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.ville-quiberon.fr\\\/\"},{\"id\":22,\"name\":\"Photo workshop for adults\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 15:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The story through we\\n\\nHow does a photograph tell a story, on its own or as part of a series? \\nOn Saturday, 14 November 2026 at 3 p.m., L\\u00e9andre Bellin offers adults of all ages a workshop to explore storytelling through images.\\n\\nParticipants are invited to bring 5 to 10 photographs they have taken. Put together, they will be used to create the pages of a collective notebook, which will then be made available to visitors of the media library.\\n\\nAdults of all ages. Registration required.\\nPlease bring: 5 to 10 personal photographs.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":40,\"name\":\"Meal: Ham hock and fries\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 19:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"19:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56690 Landaul\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The veterans of \\\"Landaul Sport\\\" invite you to join them for a tasty and festive evening around a good ham hock and fries!\\n\\nPrices:\\nAdult meal: \\u20ac14 (kir, main course, cheese and dessert)\\nChildren's meal: \\u20ac6\\n\\nReservations by phone\\n\\nA great opportunity to get together, share a good meal and support our veterans in a warm, family atmosphere!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.landaul.fr\\\/%E2%9A%BDles-veterans-de-landaul-sport-vous-invitent-a-leur-repas-jarret-frites\\\/\"},{\"id\":37,\"name\":\"Comedy Festival\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 20:30 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56950 Crach\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"After a first edition that was a real hit, the Crac'h Comedy Festival is back for its 2nd edition... and it promises to be very, very big!\\n5 comedians will take to the stage in turn:\\n- Yann Ricordel\\n- Tim Solac\\n- Quentin Ferjou\\n- St\\u00e9phane Resche\\n- Chris Baranzelli\\n\\nAnd once again this year, it is YOU who will have a say: Vote for your favourite comedian and take part in choosing the audience favourite!\\n\\nMicky MJ, patron of this 2nd edition, will be there, along with Mlle Redge and Mr Marc Assin as presenters.\\n\\nAnd because we don\\u2019t mess around with the interval, the Crac'h Festival Committee will run the refreshment bar so you can recharge before the second part!\\n\\nTickets on sale at the Town Hall or on site on the evening itself (cheque or cash).\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.ville-crach.fr\\\/festival-dhumour-2\\\/\"},{\"id\":15,\"name\":\"Theatre and music: Four hands\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 20:30 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Brech\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Aline and \\u00c9lios meet again after 30 years. At the invitation of Jean, their former fellow student from the Conservatory who is preparing a mysterious performance, they return to the piano with Schubert's Fantaisie in F minor, a four-hand piece.\\nThey play and recall their life before: their music studies, their teenage friendship and Schubert's music, which, saying nothing, already said everything. Memories come back, the difficulties of learning, inspiring or sadistic teachers, emotional confusions where friendship becomes mixed up with love. Each rehearsal becomes a space for sharing, where music expresses what words did not say.\\n\\nFour Hands is an emotional journey that tenderly reveals the way art crosses time and transforms human relationships.\\n\\\"Four Hands is an original play in its spirit and execution, sensitive, endearing and funny. It teaches us that music theory and interpretation classes are not necessarily tedious, and that successes, failures and discouragements are part of a lifetime of dreams. Just like the greatest passions.\\\" Avignon OFF Festival: \\\"Franz Schubert and friendship forever\\\" - l'Humanit\\u00e9\\n\\nA post-show discussion will be offered after the performances on Saturday 14 November and Sunday 15 November (5 p.m. showing) to chat with the company.\\n\\nFrom age 14 - duration 1h20\\nInformation and bookings by phone and online.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/athena-auray.mapado.com\\\/event\\\/793033-quatre-mains\"},{\"id\":45,\"name\":\"Afternoon Ti Ludique\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 14:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"14:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Ploemel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Here we go with Ti Ludique\\nA new association for board games, role-playing games and cultural activities is arriving in the town. Why? Because we wanted to offer our teenagers something other than screens on weekends (and because we were starting to run short of players).\\n\\nMeetings will take place 1 to 2 Sunday afternoons per month.\\nWe\\u2019re starting quietly... in Salle Kolibri (the new sports and leisure area of Gro\\u00ebz Ven) and we\\u2019ll see afterwards if you get too hooked!\\n\\nWhat awaits you:\\nWe\\u2019re coming with a great collection of games that we\\u2019ll be delighted to lend you during the meetings (in exchange for careful handling and respectful love for the boxes). In return, we\\u2019d be thrilled to discover your hidden gems!\\nWe\\u2019re looking forward to seeing lots of you to roll the first dice!\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.tiludique.fr\\\/pages\\\/evenements.html\"},{\"id\":47,\"name\":\"Fest Deiz: Anne-Marie Nicol and Gw\\u00e9na\\u00eblle Pineau\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 14:30 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"14:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Ploemel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Dalc'h Atau association offers you a fest-deiz with Anne-Marie Nicol and Gw\\u00e9na\\u00eblle Pineau: bombarde and diatonic accordion, on Sunday 15 November in the Gro\\u00ebz Ven hall in Ploemel\\n\\nAdmission \\u20ac5\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/dalchatau.tolpin.bzh\\\/\"},{\"id\":10,\"name\":\"Screening - 50 years of traditional music and songs in Pluvigner\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 17:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56330 Pluvigner\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Bagad of Pluvigner was founded in 1955. It experienced remarkable growth, peaking in the 1960s and 1970s, and has been a major player in passing on music and, more broadly, Breton culture in Pluvigner. The film highlights the legacy of Yvon Palamour and Guigner Le H\\u00e9nanff through videos collected and produced by Youn Pensec. He has spent a great deal of time filming and recording singers, pipers and musicians for over 50 years. A film presented by the association Plijadur Cant\\u00eb Nouz in partnership with Pluvigner Patrimoines\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":46,\"name\":\"Games evening for adults!\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 17\\\/11\\\/2026 \\u00e0 19:00 au 17\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-17\",\"end\":\"2026-11-17\",\"start_time\":\"19:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 Saint-Philibert\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"An adults-only board game aperitif evening at the media library-toy library \\\"Le Chat Pitre\\\"\\nA fun evening where strategy, bluffing and laughter are on the agenda! No children, just fun among adults, new discoveries and great encounters.\\n\\nCome and discover our new board games, laugh and share a friendly moment.\\n\\nIf you wish, bring a little something to nibble or drink for a shared aperitif.\\n\\nFree\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":36,\"name\":\"Rhymes and fingerplay games\",\"type\":\"evenements-locaux-69\",\"category\":\"family\",\"label\":\"Du 18\\\/11\\\/2026 \\u00e0 10:30 au 18\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-18\",\"end\":\"2026-11-18\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"At 10:30 a.m. at the media library, it\\u2019s the meeting place for little ones: ages 0 to 6, to share stories and fingerplay games.\\nFree with registration.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/mediatheques-terre-atlantique.fr\\\/node\\\/content\\\/nid\\\/545474\"},{\"id\":52,\"name\":\"Cin\\u00e9-Doc: P\\u00e9rou\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 18\\\/11\\\/2026 \\u00e0 15:00 au 18\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-18\",\"end\":\"2026-11-18\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 Saint-Philibert\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Screening of the film P\\u00e9rou\\u2013des civilisations et des hommes in the presence of director Bernard Bruel\\n\\nPeru\\u2014who hasn\\u2019t dreamed upon hearing this name, synonymous with Spanish conquistadors and the hidden treasures of El Dorado?\\nThe film takes you on a journey to discover these lands and the mysterious people of this mythical country.\\nThe Pacific coast, home to the first civilizations, and a source of delicious raw fish dishes for Peruvians.\\nThe Andes, where indigenous communities in colorful ponchos live, then the Amazonian valleys, where fair-trade coffee and chocolate are harvested.\\nMachu Picchu and the many sites of the sacred valley of Cuzco, with the many stone constructions of the Incas.\\nThe high peaks of the Cordillera Blanca, a paradise for trekkers and the domain of alpaca herders, with their wonderfully soft wool...\\nFinally, the famous Lake Titicaca with its terraced \\u0916\\u0947\\u0924\\u0940, at an altitude of 4,000 m...\\n\\nRocked since his teens by the images of \\u201cTintin in the Land of the Sun\\u201d and the sounds of the Indian flute, Bernard Bruel was very quickly irresistibly drawn to the Andes, and especially Bolivia. It is this country of many facets, where he has spent many stays over the years, that he invites you to discover. He is one of the members of the Rennes Latin music group \\u201cOpakuna\\u201d.\\n\\nDuration: 84 minutes\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.le-cercle-des-voyageurs.fr\\\/seance\\\/terre-neuve-au-large-du-canada-24-10-2026\\\/\"},{\"id\":12,\"name\":\"Photo and drawing workshop for children\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 18\\\/11\\\/2026 \\u00e0 15:00 au 18\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-18\",\"end\":\"2026-11-18\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Beyond the image\\n\\nWhat does a photograph show? What can we imagine beyond the frame? On Wednesday 18 November 2026 at 3 p.m., Auxane Caqueret invites children aged 7 to 12 to explore these questions in the workshop \\\"Beyond the image\\\".\\n\\nThe children will discover the field, what appears in the photograph, and the out-of-frame, what remains outside the image. They will then extend the photograph through drawing to imagine what the frame does not show.\\n\\nFor children aged 7 to 12. Registration required.\\nQuiberon Media Library, 16 Rue Michelet\\n02 97 50 44 15 \\u00b7 mediatheque@ville-quiberon.fr\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":17,\"name\":\"Doc screening - Futur, Reza and the future of the world\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 19\\\/11\\\/2026 \\u00e0 20:30 au 19\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-19\",\"end\":\"2026-11-19\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56330 Pluvigner\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Screening in the presence of the director, Philippe Bonhomme, presented by the media library as part of Documentary Film Month. La R\\u00e9union, a reflection of a dreamed future. On this island, inhabitants can practice several religions at the same time. The arts and gastronomy claim multiple influences, and each new marriage represents one more step toward a \\\"universal village.\\\" Does this colorful society not show the path of the future? This is what Reza, photographer and humanist, came to discover.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":42,\"name\":\"Games evening\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 20\\\/11\\\/2026 \\u00e0 18:00 au 20\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-20\",\"end\":\"2026-11-20\",\"start_time\":\"18:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Sainte-Anne-d'Auray\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"In partnership with the youth centre of Sainte-Anne-d'Auray\\n\\nBoard games, Gibao, Switch, and werewolves will be on the programme for a fun family evening.\\nPlease bring some savoury or sweet snacks to share to enjoy during the evening.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":44,\"name\":\"Concerts at Le Coota\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 20\\\/11\\\/2026 \\u00e0 22:00 au 20\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-20\",\"end\":\"2026-11-20\",\"start_time\":\"22:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56410 Erdeven\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Le Coota organizes around 120 concerts a year. It is also, like any bistro, a place for exchange and meetings...\\nLe Coota provides you with the essential instruments to improvise together and get Kerhillio grooving!\\n\\nComing up...\\n20 Nov 2026: Forr\\u00f3 na chuva - Style: Forr\\u00f3\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.lecoota.fr\\\/\"},{\"id\":50,\"name\":\"Knightesses\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 21\\\/11\\\/2026 \\u00e0 20:30 au 21\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-21\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 La Trinit\\u00e9-sur-Mer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Knightesses is a saving blow, a luminous, poetic and political work, written and performed by Nolwenn Le Doth, in the service of freeing women\\u2019s speech, still to be conquered.\\n\\nThere is the older brother. And the little sister. It is a family story. A special one and a terribly ordinary one.\\nIt is the story of incest. A story of lineage and of everything that begins again. A story of society too, and of everything that begins again.\\nThe mouth opens, the silence bursts, speech asserts itself, necessary. And it rises to tell: the struggle of a knightess, the workings of a traumatic mechanism, the urgency of breaking the taboo, telling all that is beyond us. And above all, all that we can overcome.\\nIt is the story of what we are capable of. Rising again. Being free.\\n\\nAges 14+\\nDuration: 1h15\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/athena-auray.mapado.com\\\/event\\\/793054-chevaleresses\"},{\"id\":20,\"name\":\"Preview screening: \\\"A Good Little Soldier\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 21\\\/11\\\/2026 \\u00e0 20:30 au 21\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-21\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Le Paradis welcomes director St\\u00e9phane Briz\\u00e9 and actress Alba Rohrwacher for the preview screening of the film \\u00ab A Good Little Soldier \\u00bb.\\n\\nDirected by St\\u00e9phane Briz\\u00e9, the film stars Alba Rohrwacher and Vincent Lindon.\\n\\nReservations open on Sunday 1 November at 10 a.m.\\n\\nInformation and reservations at the cinema or by phone on 02 97 50 17 20, during opening hours, and by email at cinemaleparadis@ville-quiberon.fr.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":51,\"name\":\"Documentary Month: Sainte Julie by Giulia Montineri\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 24\\\/11\\\/2026 \\u00e0 18:00 au 24\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-24\",\"end\":\"2026-11-24\",\"start_time\":\"18:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56360 Le Palais\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On March 3, 2019, in Corsica, Julie Douib is murdered by her ex-husband. The femicide was foreseeable; the man's dangerousness was known. Why was the murder not prevented?\\nBeyond this particular case, #SainteJulie reveals the mechanisms of ordinary misogyny at work in society, still deadly.\\nA wide-ranging investigation, carried out with intelligence and great sensitivity.\\nThe film echoes the International Day for the Elimination of Violence against Women, which this year takes place on November 25.\\nMeeting and discussion with Giulia Montineri, director, and Soazig Lanco, elected official in charge of the CCAS of Le Palais.\\n\\nInformation and registration: bibliotheque@lepalais.fr or 02 97 31 45 58\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":58,\"name\":\"Story Time\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 25\\\/11\\\/2026 \\u00e0 10:30 au 25\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-25\",\"end\":\"2026-11-25\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Brech\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Reading and visual arts, from age 4.\\n\\nActivity open to everyone (subscribers and non-subscribers to the Terre Atlantique media library network).\\n\\nLimited places \\u2013 Registration at the media library.\\nActivity offered and organized by the Brec'h media library.\\n\\nFree activity.\\nRegistration required, by phone or email.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":55,\"name\":\"CINE-DOCS TRAVEL: The Mekong\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 25\\\/11\\\/2026 \\u00e0 15:00 au 25\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-25\",\"end\":\"2026-11-25\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"At 3 p.m. and 6:30 p.m.\\nFrom Tibet to the delta, the Mekong runs for 4,350 km and crosses six countries. From China to Laos, from Cambodia to Vietnam, the film traces 20 years of change in the cities and peoples living along its banks. A journey along a mythical river, witness to the upheavals of a world in full transformation. A film by Patrick Math\\u00e9.\\n\\nBooking recommended until November 24, specifying the chosen screening: aec.reservation@gmail.com\\n\\nTickets sold on site 45 minutes before each screening.\",\"image\":\"\",\"credit\":\"\",\"link\":\"http:\\\/\\\/www.artetculture-carnac.com\\\/\"},{\"id\":53,\"name\":\"Cinema, comics, literature weekend\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"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\":\"56410 \\u00c9tel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Films adapted from comics or comics adapted from films.\\nStories and heroes on drawing boards and on film.\\n\\nBookshops will present famous or lesser-known comics and the La Rivi\\u00e8re cinema will screen films evoking these comics.\\n\\nOn the program:\\nFriday 27:\\n7:00 p.m.: talk \\\"Telling in images\\\"\\n8:30 p.m.: In Waves\\n\\nSaturday 28:\\n11:00 a.m.: Persepolis\\n3:00 p.m.: The Summit of the Gods\\n5:00 p.m.: Klara and the Sun\\n8:30 p.m.: fancy-dress evening > Asterix and the Kingdom of Nubia contest (preview)\\n\\nSunday 29:\\n11:00 a.m.: film tale Ernest and Celestine (preview)\\n3:30 p.m.: Rosalie Blum\\n5:00 p.m.: Tintin and the Secret of the Unicorn\\n8:30 p.m.: Snowpiercer\\n\\nEach film will be accompanied by a short illustrated introduction.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.cinemalariviere.org\\\/events\\\/78421-week-end-cinema-bd-litterature\\\/\"},{\"id\":8,\"name\":\"Dance show \\\"Around the world in 80 steps\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 27\\\/11\\\/2026 \\u00e0 19:00 au 27\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-27\",\"end\":\"2026-11-27\",\"start_time\":\"19:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Friday and Saturday at 7 p.m.\\nSunday at 3 p.m.\\n\\n\\\"Around the world in 80 steps\\\"\\nTwo dancers find themselves in a rather unusual dance workshop... A magical elevator takes them from floor to floor, across countries and eras, following the trail of world dances, from their birth to their evolution over time. At each stop, they discover a new dance and, as if by magic, instantly master the steps. Here they are transported to the heart of the country and era in which it was born, as if they were part of it!\\nTo the rhythm of the music, they take us on a danced journey full of fantasy, color and energy. But what is happening in this elevator?\\n\\nAn original creation bringing together members of the CVK association around world dances and urban dances, on the occasion of the association's 10th anniversary.\\n\\nOnline booking. Price: \\u20ac10. Drinks and snacks on site.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":56,\"name\":\"Festive and solidarity braderie\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-garage-sales\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 10:00 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56690 Land\\u00e9vant\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On Saturday, November 28, from 10 a.m. to 6 p.m., the media library will come alive under the banner of conviviality, solidarity and sustainable development.\\n\\nCome and stock up on reading material at bargain prices: more than 500 books (novels, comics, picture books, nonfiction) will be sold for \\u20ac1 and magazines for \\u20ac0.50.\\n\\nA doubly positive and warm-hearted day thanks to several key initiatives:\\n\\u2022 Solidarity action: Part of the proceeds will be donated to a local association, whose name will be revealed a few days after the braderie.\\n\\u2022 Eco-responsible action: As part of European Waste Reduction Week from November 21 to 29, the network of media libraries is joining forces with Auray Quiberon Terre Atlantique and becoming a collection point. Bring your unused mobile phones to give them a second life (reuse or recycling).\\n\\u2022 Festive atmosphere: A piano will be made available to the public to share a few musical notes. The media library team, easy to spot thanks to their lovely flower necklaces, will be there to welcome you and introduce you to its services.\\n\\nIt's the perfect opportunity to combine the pleasure of reading with two good deeds!\\n\\nOpen to all \\\/ Free admission\\n\\nPayment for purchases will be accepted either in cash or by cheque.\\n\\nContact: 02 97 56 93 15 or mediatheque@landevant.bzh\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":41,\"name\":\"Games afternoon: Ribouldingue!\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 14:00 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"14:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56510 Saint-Pierre-Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Games afternoon: Ribouldingue!\\n\\nFancy discovering a 100% Breton card game that promises to get your brains working and spark a few bursts of laughter?\\n\\nThe media library invites you to try Ribouldingue, the game that drives you crazy! A friendly game to share with friends or family, where everyone must get rid of their cards as quickly as possible, avoid collecting points, and outsmart the special cards that can change everything!\\n\\nFrom 8 years old\\nFree \\u2013 Registration recommended\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":23,\"name\":\"Docu-film screenings The Silk Road \\\"In the footsteps of Marco Polo\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 16:00 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56410 Erdeven\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\\"Who has not dreamed of travelling the Silk Road in the footsteps of Marco Polo? For more than 2,000 years, people from all walks of life have travelled the caravan routes of China which, starting from the imperial city of Xi'an, crossed the hostile deserts of the Gobi and the Taklamakan, as well as the formidable Pamir plateau often called the \\\"Roof of the World\\\". Caravanserais, ghost towns and gigantic Buddhist sanctuaries are today witnesses to the richness of this extraordinary history. Today, in landscapes of rare beauty, everyday life continues in Central Asia.\\n\\nPrice: \\u20ac8 \\nDocu-film duration: 2h \\nDiscussion after the film \\nThe film starts after the author's presentation of about 15 minutes\\nBox office opens 30 minutes before the screening\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.le-cercle-des-voyageurs.fr\\\/seance\\\/la-route-de-la-soie-dans-les-pas-de-marco-polo-28-11-2026\\\/\"},{\"id\":48,\"name\":\"Christmas market and entertainment\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 17:00 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Plumergat\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"In partnership with the merchants and artisans association of M\\u00e9riadec, the municipality is taking part in the long-awaited magical Christmas event!\\n\\nMeet at 5 p.m. at Place de l\\u2019\\u00c9glise, M\\u00e9riadec\\n\\nFree \\u2013 Open to all\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.plumergat.fr\\\/programmation-culturelle\\\/\"},{\"id\":4,\"name\":\"Concert - FI\\u00d1V\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 20:30 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56330 Pluvigner\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Illustrated concert by Roland Conq and Florent Grouazel\\n\\nFI\\u00d1V in Breton means movement.\\n\\nThe movement of dances and airs for walking that inspire the guitarist, but also the movement of the illustrator's pencil on the paper, the rhythm, the rhythms, of the hand on the drawing board. It is from the momentum, the exchange between the two artists, that the show emerges, each time new, guided more by pulse, place, and the vibrations of the moment than by a rigid framework. It is also their attachment to shared values, their appropriation of culture, history, and the identities that shape them, that allow Roland and Florent to meet.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":9,\"name\":\"Christmas market of the Crevettes bleues school\",\"type\":\"evenements-locaux-69\",\"category\":\"markets-fairs\",\"label\":\"Du 29\\\/11\\\/2026 \\u00e0 09:00 au 29\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-29\",\"end\":\"2026-11-29\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 La Trinit\\u00e9-sur-Mer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A pleasant moment to share with family or friends during the Christmas market.\\nMany exhibitors offer gift ideas, handmade creations and Christmas treats.\\nDespite a busy schedule, Santa Claus should be there around 4 p.m.\\n\\nA refreshment stand and on-site catering are offered in support of the school children.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":28,\"name\":\"Documentary screening - The voice of the Mekong, from Tibet to Ho Chi Minh\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 29\\\/11\\\/2026 \\u00e0 17:00 au 29\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-29\",\"end\":\"2026-11-29\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56330 Pluvigner\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Mekong runs for 4,350 km and crosses six countries. The film traces twenty years of change in the cities and peoples living on its banks: Tibetan salt flats, Angkor, Phnom Penh, dragon boat races, the house of Marguerite Duras's lover, Ho Chi Minh at Christmas... Between unchanging traditions, modernization and the memory of explorers, it is a journey along a mythical river, witness to the upheavals of a world in transition. Screening in the presence of the director, Patrick Math\\u00e9 from Cercle des Voyageurs\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":24,\"name\":\"Early childhood games morning\",\"type\":\"evenements-locaux-69\",\"category\":\"family\",\"label\":\"Du 02\\\/12\\\/2026 \\u00e0 10:00 au 02\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-02\",\"end\":\"2026-12-02\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On the first Wednesday of every month, the toy library offers playtime for children aged 0 to 6 and their parents, grandparents, childminders, with a variety of suitable play areas.\\n\\nFree admission\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/mediatheques-terre-atlantique.fr\\\/node\\\/content\\\/nid\\\/540340\"},{\"id\":2,\"name\":\"Fireworks\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 04\\\/12\\\/2026 \\u00e0 19:30 au 04\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-04\",\"end\":\"2026-12-04\",\"start_time\":\"19:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56400 Auray\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"250 years ago... Benjamin Franklin in Auray\\n\\nTo close these celebrations, come and attend a fireworks display launched on the same day as Benjamin Franklin's landing. The musical theme will celebrate Franco-American friendship.\\n\\nDepending on weather conditions, the fireworks may be postponed to a later date, with priority given to Saturday, December 5.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.auray.fr\\\/culture-loisirs\\\/archives-et-patrimoine\\\/il-y-250-ans-benjamin-franklin-auray\"},{\"id\":54,\"name\":\"Ballet & opera season: \\\"Manon\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"shows-cinema\",\"label\":\"Du 04\\\/12\\\/2026 \\u00e0 20:00 au 04\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-04\",\"end\":\"2026-12-04\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56410 \\u00c9tel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\\"Manon\\\", an emblematic work of the Royal Ballet, will open the season.\\n\\nThis moving adaptation of the novel by Abb\\u00e9 Pr\\u00e9vost, choreographed by one of Covent Garden's most influential dance directors, Kenneth MacMillan, takes us into the underworld of 18th-century Paris, where the young Manon lives and loses herself.\\nJules Massenet's score and Nicholas Georgiadis's sets wonderfully illustrate all its decadence and decline.\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.cinemalariviere.org\\\/events\\\/78673-operas-et-ballets-au-cinema\\\/\"},{\"id\":27,\"name\":\"Daoud jazz concert\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 04\\\/12\\\/2026 \\u00e0 20:30 au 04\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-04\",\"end\":\"2026-12-04\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 La Trinit\\u00e9-sur-Mer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Daoud presents his jazz repertoire with recent compositions and pieces from his album ok (ACT, 2025). The artist, also the author of Good boy in 2024, has already given sold-out concerts at Ronnie Scott's, Montreux and Marciac.\\n\\nOn stage, the band offers lyrical passages and rhythmic shifts, favoring improvisation and instrumental interaction.\\n\\nAll audiences\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.auray.fr\\\/culture-loisirs\\\/centre-culturel-athena\\\/saison-2026-2027\\\/les-spectacles-de-la-saison-26-27\\\/daoud\"},{\"id\":21,\"name\":\"Nature worksite on the Kercadoret heathland\",\"type\":\"evenements-locaux-69\",\"category\":\"sport-hiking\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 09:00 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56740 Locmariaquer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On the programme:\\n* Mowing grass and heathland\\n* Collecting broken branches\\n* Filling in ruts\\n* Uprooting Baccharis and pine seedlings\\n* Clearing scrub\\n* Cutting willows and birches \\u2026\\n\\nYou must bring boots and gloves.\\nOptional (but always useful\\u2026): large bags, small hand tools, rakes, secateurs, loppers, chainsaw, brush cutter\\u2026\\nCakes, coffee, tea\\u2026 are always welcome!\\n\\nThese work sessions are also an opportunity for nature-focused exchange and a visit to the heathland.\\n\\nMeet at 9 a.m. in the Kerran industrial area (on the boundary with the commune of Saint-Philibert) at the end of the first street on the right\\n\\nContact & information: Jean David: 06.32.26.65.82 jeandavid.bzh@gmail.com\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/www.bretagne-vivante.org\\\/agenda\\\/chantier-nature-sur-la-lande-de-kercadoret-a-locmariaquer-56-2\\\/\"},{\"id\":29,\"name\":\"Locoal Mendon Christmas Market\",\"type\":\"evenements-locaux-69\",\"category\":\"family\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 10:00 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56550 Locoal-Mendon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A magical family day awaits you on Saturday, December 5, from 10 a.m. to 6 p.m., on the church square and in the nearby streets\\n\\nProgram:\\n\\u2192 Gourmet discoveries: cr\\u00eapes, mulled wine, cotton candy, refreshments and food\\n\\u2192 Local artisans and producers for unique gift ideas\\n\\u2192 Children\\u2019s songs from Hugues Aufray school\\n\\u2192 Pony ride\\n\\u2192 Arrival of Santa Claus\\n\\u2192 Fireworks organized by the Mairie de Locoal-Mendon at 6 p.m. at the stadium!\\n\\nArtisans and producers, registrations are open until November 20!\\nWant to take part? Information and registration here: https:\\\/\\\/www.helloasso.com\\\/...\\\/emplacement-stand-au-marche...\\nor by email at alha56550@gmail.com\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":59,\"name\":\"Avant-premi\\u00e8re : \\\" Le jour d'apr\\u00e8s \\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"spectacles-cinema\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 20:30 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"D\\u00e9couvrez \\u00ab Les Jours d\\u2019apr\\u00e8s \\u00bb en avant-premi\\u00e8re au cin\\u00e9ma Le Paradis, en pr\\u00e9sence de la r\\u00e9alisatrice St\\u00e9phanie Pillonca.\\n\\nLe film met en sc\\u00e8ne Val\\u00e9rie Donzelli et Jalil Lespert.\\n\\nTarifs habituels.\\n\\nInformations et r\\u00e9servations au cin\\u00e9ma ou par t\\u00e9l\\u00e9phone au 02 97 50 17 20, aux heures d\\u2019ouverture, et par courriel \\u00e0 cinemaleparadis@ville-quiberon.fr.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":3,\"name\":\"Film Concert \\\"And Rain Is All\\\"\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 06\\\/12\\\/2026 \\u00e0 16:00 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-06\",\"end\":\"2026-12-06\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56410 Erdeven\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On Sunday, December 6, discover \\\"And Rain Is All,\\\" a young audience film concert produced by Label Caravan, for children aged 3 and up\\nSynopsis\\n\\nAnd Rain Is All is a young audience film concert produced by Label Caravan, for children aged 3 and up. Through six animated short films, the show celebrates the forces of nature \\u2014 rain, sun, wind, earth and water \\u2014 and tells, with poetry and humor, the fragile balances of living things.\\n\\nOn stage, two musicians perform the soundtrack live using traditional instruments, repurposed objects and sound effects, creating a sensitive dialogue between image and music. Between wonder and environmental awareness, And Rain Is All invites children and adults alike on an immersive journey where each drop of water becomes the starting point of an adventure full of life and imagination.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":6,\"name\":\"Les Milles Musicaux: Very Virtuoso(s)...\",\"type\":\"evenements-locaux-69\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 06\\\/12\\\/2026 \\u00e0 16:00 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-06\",\"end\":\"2026-12-06\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56470 La Trinit\\u00e9-sur-Mer\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"A little story of virtuosity at the keyboard... With 2 strong personalities...\\n\\nTwo pianists. One keyboard. Who will have the last word?\\nLaure Favre-Kahn and Maxence Pilchen take you into a little story of virtuosity, between complicity, rivalry and humor. From Schubert to Liszt, solo and four hands, the piano becomes the stage for a dialogue that is as musical as it is mischievous. Staging: Flannan Ob\\u00e9.\\n\\nAn event to share with piano lovers... and the curious!\\n\\nAudience admission: 45 minutes before each performance\\n\\nTickets at the tourist office of La Trinit\\u00e9-sur-Mer, on site, or by phone: 02 44 84 56 56\\nor at https:\\\/\\\/billetterie.festik.net\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"},{\"id\":13,\"name\":\"Exhibition: Folds and books by Marie Reneaud\",\"type\":\"evenements-locaux-69\",\"category\":\"exhibitions\",\"label\":\"Du 08\\\/12\\\/2026 au 19\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-08\",\"end\":\"2026-12-19\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56340 Carnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Coming from the Decorative Arts school in Nice, the books in Marie Reneaud's hands become three-dimensional objects. These paper architectures are another way of reading, which we invite you to discover through this exhibition.\\n\\\"I like the idea that books, once read, continue their life. In my hands, they become three-dimensional objects, volumes to look at.\\\"\\n\\nFree - open to all\\nDuring the media library's opening hours:\\nTuesday, Thursday, Friday: 3 p.m. - 6 p.m. \\\/ Wednesday, Saturday: 10 a.m. - 1 p.m. & 2 p.m. - 6 p.m. (5 p.m. on Saturday)\\nClosed on Monday and Sunday\",\"image\":\"\",\"credit\":\"\",\"link\":\"https:\\\/\\\/mediatheques-terre-atlantique.fr\\\/carnac?&page=3&nidPagination=544026&nidPagi=544026\"},{\"id\":30,\"name\":\"A Christmas show at the media library\",\"type\":\"evenements-locaux-69\",\"category\":\"for-families\",\"label\":\"Du 09\\\/12\\\/2026 \\u00e0 10:30 au 09\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-09\",\"end\":\"2026-12-09\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"56170 Quiberon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Quiberon Media Library is offering a Christmas show for children aged 0 to 6.\\nThe company Toutouic will present Flocons, neige et tourbillon on Wednesday 9 December at 10:30 a.m.\",\"image\":\"\",\"credit\":\"\",\"link\":\"\"}];\n    var CATEGORIES = {\"markets-fairs\":{\"key\":\"markets-fairs\",\"label\":\"Markets & fairs\",\"color\":\"#ef4444\",\"count\":7},\"shows-cinema\":{\"key\":\"shows-cinema\",\"label\":\"Shows & cinema\",\"color\":\"#3b82f6\",\"count\":14},\"for-families\":{\"key\":\"for-families\",\"label\":\"For families\",\"color\":\"#10b981\",\"count\":12},\"concerts-music-festivals\":{\"key\":\"concerts-music-festivals\",\"label\":\"Concerts, music & festivals\",\"color\":\"#f59e0b\",\"count\":8},\"sport-hiking\":{\"key\":\"sport-hiking\",\"label\":\"Sport & hiking\",\"color\":\"#a855f7\",\"count\":2},\"exhibitions\":{\"key\":\"exhibitions\",\"label\":\"Exhibitions\",\"color\":\"#0891b2\",\"count\":10},\"family\":{\"key\":\"family\",\"label\":\"Family\",\"color\":\"#db2777\",\"count\":4},\"en-famille\":{\"key\":\"en-famille\",\"label\":\"En famille\",\"color\":\"#65a30d\",\"count\":1},\"markets-garage-sales\":{\"key\":\"markets-garage-sales\",\"label\":\"Markets & garage sales\",\"color\":\"#ea580c\",\"count\":1},\"spectacles-cinema\":{\"key\":\"spectacles-cinema\",\"label\":\"Spectacles & cin\\u00e9ma\",\"color\":\"#6366f1\",\"count\":1}};\n    var TODAY = \"2026-11-09\";\n    \/\/ Textes et format des dates dans la langue de la page (includes\/i18n.php)\n    var T = {\"blog_read_more\":\"Read the article\",\"blog_empty\":\"No articles yet.\",\"blog_newer\":\"Newer articles\",\"blog_older\":\"Older articles\",\"blog_label\":\"Articles\",\"hero_title\":\"Things to discover nearby\",\"hero_text\":\"Villages, beaches, walks, good addresses and experiences selected around your stay.\",\"around\":\"Around\",\"search_placeholder\":\"Search for a place, an activity, a village\\u2026\",\"search\":\"Search\",\"max_distance\":\"Maximum distance\",\"all\":\"All\",\"prev_categories\":\"Previous categories\",\"next_categories\":\"Next categories\",\"categories\":\"Categories\",\"display\":\"Display\",\"list\":\"List\",\"map\":\"Map\",\"close\":\"Close\",\"featured\":\"Featured\",\"discover\":\"Discover\",\"idea\":\"idea\",\"ideas\":\"ideas\",\"around_you\":\"around you\",\"no_result\":\"No results\",\"no_result_hint\":\"Try another search, category or distance.\",\"pagination\":\"Ideas pagination\",\"prev_page\":\"Previous page\",\"next_page\":\"Next page\",\"ideas_title\":\"Ideas to suit your mood\",\"ideas_sub\":\"Suggestions to plan your perfect stay.\",\"reset_view\":\"Back to the overview\",\"map_hint\":\"Click a marker on the map to show its details here.\",\"official_site\":\"Official website\",\"video\":\"Video\",\"gallery\":\"Gallery\",\"documents\":\"Documents\",\"faq\":\"Frequently asked questions\",\"no_answer\":\"No answer yet.\",\"see_on_maps\":\"View on Google Maps\",\"see_place_on_maps\":\"View the campsite on Google Maps\",\"yes\":\"Yes\",\"no\":\"No\",\"practical_info\":\"Practical information\",\"reviews\":\"reviews\",\"read_more\":\"Read more\",\"prev_review\":\"Previous review\",\"next_review\":\"Next review\",\"prev_item\":\"Previous\",\"next_item\":\"Next\",\"photo_credit\":\"Photo: %s\",\"directions\":\"Directions\",\"read_less\":\"Show less\",\"article_in_this\":\"In this article\",\"article_toc\":\"Article contents\",\"see_original\":\"Automatically translated \\u00b7 See original\",\"see_translation\":\"See translation\",\"stars_out_of_5\":\"%s stars out of 5\",\"owner_reply\":\"Response from the owner\",\"customer\":\"Guest\",\"customer_reviews\":\"Guest reviews\",\"rating_label\":\"Rated %1$s out of 5, %2$s reviews \\u2014 see the reviews\",\"reviews_by\":\"Reviews presented by Elaia\",\"powered_by\":\"Powered by\",\"today\":\"Today\",\"today_lc\":\"today\",\"tomorrow\":\"Tomorrow\",\"until\":\"Until %s\",\"from_to\":\"From %1$s to %2$s\",\"registration\":\"Booking required\",\"full\":\"Full\",\"all_animations\":\"See all activities \\u2192\",\"ago_day\":\"%d day ago\",\"ago_days\":\"%d days ago\",\"ago_week\":\"%d week ago\",\"ago_weeks\":\"%d weeks ago\",\"ago_month\":\"%d month ago\",\"ago_months\":\"%d months ago\",\"ago_year\":\"%d year ago\",\"ago_years\":\"%d years ago\",\"anim_unavailable\":\"The programme is temporarily unavailable\",\"content_unavailable\":\"This content is temporarily unavailable\",\"anim_eyebrow\":\"Enjoy unforgettable moments\",\"anim_title\":\"Activities & events\",\"anim_hero_text\":\"Find all current activities, this week's highlights and upcoming events during your stay.\",\"anim_sections\":\"Page sections\",\"anim_nav_today\":\"Today\",\"anim_nav_week\":\"This week\",\"anim_nav_upcoming\":\"Upcoming\",\"anim_nav_calendar\":\"Calendar\",\"anim_where\":\"Where?\",\"anim_onsite\":\"On site\",\"anim_nearby\":\"Nearby\",\"anim_no_onsite\":\"No on-site activity at the moment\",\"anim_no_nearby\":\"No nearby event at the moment\",\"anim_all_day\":\"All day\",\"anim_at\":\"at %s\",\"anim_see_detail\":\"see details\",\"anim_live\":\"Ongoing\",\"anim_onsite_spot\":\"On site \\u00b7 %s\",\"anim_badge_until\":\"Until\",\"anim_badge_from\":\"From\",\"anim_badge_today\":\"Today\",\"anim_filter_cat\":\"Filter by category\",\"anim_all_f\":\"All\",\"anim_prev_day\":\"Previous day\",\"anim_next_day\":\"Next day\",\"anim_today_title\":\"Today's activities\",\"anim_tomorrow_title\":\"Tomorrow's activities\",\"anim_day_title\":\"Activities on %s\",\"anim_relax_today\":\"A relaxing day today\",\"anim_nothing_day\":\"Nothing planned that day\",\"anim_next_on\":\"Next event on %s.\",\"anim_soon\":\"The programme will be updated soon.\",\"anim_see_day\":\"See that day\",\"anim_prev_acts\":\"Previous activities\",\"anim_next_acts\":\"Next activities\",\"anim_prev_week\":\"Previous week\",\"anim_next_week\":\"Next week\",\"anim_week_title\":\"This week's highlights\",\"anim_next_week_title\":\"Next week\",\"anim_week_of\":\"Week of %s\",\"anim_week_days\":\"Days of the week\",\"anim_today_paren\":\"(today)\",\"anim_activity\":\"%d activity\",\"anim_activities\":\"%d activities\",\"anim_nothing\":\"nothing planned\",\"anim_pick_day\":\"Select another day to see its programme.\",\"anim_sort\":\"Sort events\",\"anim_sort_date\":\"Sort by date\",\"anim_sort_name\":\"Sort by name\",\"anim_upcoming_title\":\"All upcoming events\",\"anim_no_upcoming\":\"No upcoming events\",\"anim_try_cat\":\"Try another category.\",\"anim_more\":\"See more events (%d)\",\"anim_hide_cal\":\"Hide the calendar\",\"anim_show_cal\":\"See the full calendar\",\"anim_cal_title\":\"Monthly calendar\",\"anim_cal_sub\":\"All of the month's events at a glance.\",\"anim_prev_month\":\"Previous month\",\"anim_next_month\":\"Next month\",\"anim_more_info\":\"More information\",\"anim_new_tab\":\"(new tab)\",\"date_locale\":\"en-GB\",\"page_faq\":\"FAQ\",\"page_metadatas\":\"Discover around you\",\"page_animations\":\"Activities and events\",\"page_corpus\":\"Practical information\",\"anim_event\":\"Event\"};\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\\\/IeWs4gOR4JQuEpD6Z5ZQ0F3WwWTvvO1pt0jQRTB3.webp\";\n\n    var app = document.getElementById('ea-app');\n    if (!app) return;\n\n    var TODAY_MAX = 3; \/\/ cartes \u00ab aujourd'hui \u00bb avant \u00ab Voir les autres \u00bb\n    var UPCOMING_STEP = 8;\n\n    var state = {\n      day: TODAY,\n      todayAll: false,\n      week: null,\n      weekDay: TODAY,\n      cat: 'all',\n      scope: 'all', \/\/ all | onsite | nearby\n      sort: 'date',\n      upcomingLimit: UPCOMING_STEP,\n      calendarOpen: false,\n      month: TODAY.slice(0, 7),\n      selectedDay: null\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ IC\u00d4NES (SVG statiques)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var ICONS = {\n      pin: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z\"\/><circle cx=\"12\" cy=\"9.5\" r=\"2.5\"\/><\/svg>',\n      calendar: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"\/><path d=\"M16 3v4M8 3v4M3 10h18\"\/><\/svg>',\n      arrow: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>',\n      external: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M14 5h5v5M19 5l-8 8M18 14v5H5V6h5\"\/><\/svg>',\n      sun: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\/><\/svg>',\n      pen: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11l2 2 4-4\"\/><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\"\/><path d=\"M8 7h8\"\/><\/svg>',\n      clock: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg>',\n      star: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"><path d=\"M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3 6.4 20.2l1.1-6.2L3 9.6l6.2-.9z\"\/><\/svg>',\n      leaf: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 19c0-8 5-14 15-14 0 10-6 15-14 15\"\/><path d=\"M5 19l7-7\"\/><\/svg>',\n      tent: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4L3 20h18L12 4z\"\/><path d=\"M12 4v16M9 20l3-6 3 6\"\/><\/svg>'\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ CAT\u00c9GORIES \u2014 pastels harmonieux d\u00e9duits du libell\u00e9\n    \/\/ (le libell\u00e9 est toujours affich\u00e9 : l'info ne passe pas que par la couleur)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var CAT_STYLES = [\n      [\/enfant|kid|junior\/, '#fff1c9', '#6f5200'],\n      [\/famil\/, '#fdf0d5', '#7a4e00'],\n      [\/bien.?etre|yoga|zen|detente|relax|spa\/, '#e3f1e6', '#24613a'],\n      [\/concert|musique|soiree|dj|bal\\b\/, '#ece6fa', '#4b3a8c'],\n      [\/spectacle|theatre|cinema|cirque|magie\/, '#fbe3e1', '#8f2d27'],\n      [\/sport|rando|velo|course|tournoi|petanque|nautique\/, '#dcefeb', '#1f5f55'],\n      [\/expo|musee|culture|patrimoine|visite\/, '#f3e6ef', '#7a2f5c'],\n      [\/march|brocante|vide.?grenier|artisan|terroir|degust\/, '#e8f0dc', '#3f5a1e'],\n      [\/animation|fete|festiv|atelier|jeu\/, '#fbe7d7', '#8e4214']\n    ];\n\n    function norm(s) {\n      return (s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, '');\n    }\n\n    function catStyle(key) {\n      var hay = norm(key + ' ' + (CATEGORIES[key] ? CATEGORIES[key].label : ''));\n      for (var i = 0; i < CAT_STYLES.length; i++) {\n        if (CAT_STYLES[i][0].test(hay)) return { bg: CAT_STYLES[i][1], fg: CAT_STYLES[i][2] };\n      }\n      return { bg: '#eceee8', fg: '#3c463f' };\n    }\n\n    function applyCat(node, key) {\n      var s = catStyle(key);\n      node.style.setProperty('--ea-cat-bg', s.bg);\n      node.style.setProperty('--ea-cat-fg', s.fg);\n    }\n\n    function catLabel(e) {\n      return CATEGORIES[e.category] ? CATEGORIES[e.category].label : '';\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DATES \u2014 cha\u00eenes Y-m-d (pas de d\u00e9calage de fuseau)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function toDate(ymd) {\n      var p = ymd.split('-');\n      return new Date(+p[0], +p[1] - 1, +p[2], 12);\n    }\n\n    function toYmd(d) {\n      return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n    }\n\n    function addDays(ymd, n) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() + n);\n      return toYmd(d);\n    }\n\n    function daysBetween(a, b) {\n      return Math.round((toDate(b) - toDate(a)) \/ 86400000);\n    }\n\n    function weekStart(ymd) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() - (d.getDay() + 6) % 7);\n      return toYmd(d);\n    }\n\n    function fmt(ymd, opts) {\n      return toDate(ymd).toLocaleDateString(T.date_locale, opts);\n    }\n\n    function ucfirst(s) {\n      return s.charAt(0).toUpperCase() + s.slice(1);\n    }\n\n    function shortDate(ymd) {\n      return fmt(ymd, { day: 'numeric', month: 'short' });\n    }\n\n    function byTime(a, b) {\n      return (a.start_time || '').localeCompare(b.start_time || '') || a.name.localeCompare(b.name, T.date_locale);\n    }\n\n    \/** Filtres globaux : sur place \/ aux alentours + cat\u00e9gorie *\/\n    function visible(e) {\n      if (state.scope === 'onsite' && !e.onsite) return false;\n      if (state.scope === 'nearby' && e.onsite) return false;\n      return state.cat === 'all' || e.category === state.cat;\n    }\n\n    function eventsOn(ymd) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= ymd && e.end >= ymd;\n      }).sort(byTime);\n    }\n\n    function eventsBetween(from, to) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= to && e.end >= from;\n      });\n    }\n\n    \/** Ligne horaire d'une carte vue depuis un jour donn\u00e9 *\/\n    function timeLabel(e, day) {\n      if (e.start === day && e.start_time) return e.start_time + (e.end_time && e.start === e.end ? ' \u2013 ' + e.end_time : '');\n      if (e.start !== e.end || e.open_start) return tf('until', shortDate(e.end));\n      return T.anim_all_day;\n    }\n\n    \/** Ligne date d'une carte \u00ab \u00e0 venir \u00bb *\/\n    function dateLabel(e) {\n      if (e.open_start) return tf('until', shortDate(e.end));\n      if (e.start !== e.end) return tf('from_to', shortDate(e.start), shortDate(e.end));\n      var d = ucfirst(fmt(e.start, { weekday: 'short', day: 'numeric', month: 'short' }));\n      return d + (e.start_time ? ' \u00b7 ' + e.start_time : '');\n    }\n\n    function fullWhenLabel(e) {\n      var opts = { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' };\n      if (e.open_start) return tf('until', fmt(e.end, opts));\n      var time = e.start_time ? ' ' + tf('anim_at', e.start_time) : '';\n      if (e.start === e.end) return ucfirst(fmt(e.start, opts)) + time + (e.end_time ? ' \u2013 ' + e.end_time : '');\n      return tf('from_to', fmt(e.start, { day: 'numeric', month: 'long' }) + time, fmt(e.end, opts) + (e.end_time ? ' ' + tf('anim_at', e.end_time) : ''));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DOM\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function el(tag, cls, text) {\n      var n = document.createElement(tag);\n      if (cls) n.className = cls;\n      if (text != null) n.textContent = text;\n      return n;\n    }\n\n    function icon(name) {\n      var s = el('span', 'ea-icon');\n      s.setAttribute('aria-hidden', 'true');\n      s.innerHTML = ICONS[name];\n      return s;\n    }\n\n    \/** Image de la fiche \u2192 image par d\u00e9faut du chatbot \u2192 aplat illustr\u00e9 *\/\n    function media(e, cls) {\n      var fallback = function() {\n        var f = el('div', 'ea-card-fallback');\n        f.appendChild(icon('tent'));\n        return f;\n      };\n      if (!e.image && !DEFAULT_IMG) return fallback();\n      var img = el('img', cls);\n      var useDefault = !e.image;\n      img.src = useDefault ? DEFAULT_IMG : e.image;\n      img.alt = e.name;\n      img.loading = 'lazy';\n      img.decoding = 'async';\n      if (useDefault) img.classList.add('ea-img--default');\n      img.onerror = function() {\n        \/\/ Le cr\u00e9dit n'est plus celui de l'image affich\u00e9e\n        var cr = img.parentNode && img.parentNode.querySelector('.ea-credit');\n        if (cr) cr.remove();\n        if (!useDefault && DEFAULT_IMG) {\n          useDefault = true;\n          img.classList.add('ea-img--default');\n          img.src = DEFAULT_IMG;\n        } else if (img.parentNode) {\n          img.replaceWith(fallback());\n        }\n      };\n      return img;\n    }\n\n    \/** Cr\u00e9dit photo en bas \u00e0 droite de l'image (rien sans image propre) *\/\n    function credit(e) {\n      if (!e.image || !e.credit) return null;\n      var txt = \/^(\u00a9|\\(c\\))\/i.test(e.credit) ? e.credit : '\u00a9 ' + e.credit;\n      var c = el('span', 'ea-credit', txt);\n      c.title = txt;\n      return c;\n    }\n\n    function pill(e) {\n      var p = el('span', 'ea-pill', catLabel(e));\n      applyCat(p, e.category);\n      return p;\n    }\n\n    \/**\n     * Carte \u00e9v\u00e9nement (composant unique).\n     * @param {object} e\n     * @param {object} o { day: 'Y-m-d' \u2192 heure du jour | date: true \u2192 dates de l'\u00e9v\u00e9nement }\n     *\/\n    function card(e, o) {\n      o = o || {};\n      var c = el('article', 'ea-card' + (e.end < TODAY ? ' ea-card--ended' : ''));\n      c.tabIndex = 0;\n      c.setAttribute('role', 'button');\n      c.setAttribute('aria-label', e.name + ' \u2014 ' + (o.date ? dateLabel(e) : timeLabel(e, o.day)) + ' \u2014 ' + T.anim_see_detail);\n      applyCat(c, e.category);\n\n      var m = el('div', 'ea-card-media');\n      m.appendChild(media(e));\n      var cr = credit(e);\n      if (cr) m.appendChild(cr);\n      m.appendChild(dateBadge(e));\n      if (o.day === TODAY && e.start < TODAY && e.end >= TODAY) {\n        m.appendChild(el('span', 'ea-live', T.anim_live));\n      }\n      if (e.registration) {\n        var reg = el('span', 'ea-reg');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(document.createTextNode(T.registration));\n        m.appendChild(reg);\n      }\n      c.appendChild(m);\n\n      var b = el('div', 'ea-card-body');\n      var top = el('div', 'ea-card-top');\n      if (!o.date) {\n        var w = el('span', 'ea-when');\n        w.appendChild(icon('clock'));\n        w.appendChild(document.createTextNode(timeLabel(e, o.day)));\n        top.appendChild(w);\n      }\n      if (top.childNodes.length) b.appendChild(top);\n      b.appendChild(el('h3', 'ea-card-title', e.name));\n      var where = placeLabel(e);\n      if (where) {\n        var p = el('p', 'ea-place');\n        p.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        p.appendChild(document.createTextNode(where));\n        b.appendChild(p);\n      }\n      if (e.description) b.appendChild(el('p', 'ea-card-desc', e.description));\n      var cta = el('span', 'ea-cta', T.discover);\n      cta.appendChild(icon('arrow'));\n      b.appendChild(cta);\n      c.appendChild(b);\n\n      c.addEventListener('click', function() {\n        openModal(e);\n      });\n      c.addEventListener('keydown', function(ev) {\n        if (ev.key === 'Enter' || ev.key === ' ') {\n          ev.preventDefault();\n          openModal(e);\n        }\n      });\n      return c;\n    }\n\n    \/** O\u00f9 : lieu dans l'\u00e9tablissement (sur place) ou ville (aux alentours) *\/\n    function placeLabel(e) {\n      if (e.onsite) return e.spot ? tf('anim_onsite_spot', e.spot) : T.anim_onsite;\n      return e.city;\n    }\n\n    \/**\n     * Badge date sur l'image, toujours sur 3 lignes et de taille fixe :\n     *   un jour     \u2192 LUN \/ 28 \/ SEPT\n     *   jusqu'au    \u2192 JUSQU'AU \/ 18 \/ OCT\n     *   p\u00e9riode     \u2192 25 SEPT \u2192 \/ 7 \/ OCT   (du 25 sept. au 7 oct.)\n     *\/\n    function dateBadge(e) {\n      var month = function(ymd) {\n        return fmt(ymd, { month: 'short' }).replace('.', '');\n      };\n      var top, day, end = '';\n      if (e.open_start) {\n        top = T.anim_badge_until;\n        day = e.end;\n      } else if (e.start !== e.end) {\n        \/\/ P\u00e9riode : le D\u00c9BUT en gros, la fin en petit dessous (\u2192 1 nov)\n        top = T.anim_badge_from;\n        day = e.start;\n        end = '\u2192 ' + toDate(e.end).getDate() + ' ' + month(e.end);\n      } else {\n        top = e.start === TODAY ? T.anim_badge_today : fmt(e.start, { weekday: 'short' }).replace('.', '');\n        day = e.start;\n      }\n      \/\/ Couleur selon le cas : aujourd'hui \/ un jour \u00e0 venir \/ p\u00e9riode \u00e0 venir \/ en cours\n      var kind = (e.start === e.end && !e.open_start) ? (e.start === TODAY ? 'today' : 'day') :\n        ((e.open_start || e.start <= TODAY) ? 'ongoing' : 'period');\n      var d = el('span', 'ea-date ea-date--' + kind);\n      d.setAttribute('aria-hidden', 'true');\n      d.appendChild(el('span', 'ea-date-top', top));\n      d.appendChild(el('span', 'ea-date-day', String(toDate(day).getDate())));\n      d.appendChild(el('span', 'ea-date-month', month(day)));\n      if (end) d.appendChild(el('span', 'ea-date-end', end));\n      return d;\n    }\n\n    function grid(list, o, four) {\n      var g = el('div', 'ea-grid' + (four ? ' ea-grid--4' : ''));\n      list.forEach(function(e) {\n        g.appendChild(card(e, o));\n      });\n      return g;\n    }\n\n    function head(id, iconName, title, sub, side) {\n      var h = el('div', 'ea-section-head');\n      var left = el('div');\n      var t = el('h2', 'ea-section-title');\n      if (iconName) t.appendChild(icon(iconName));\n      t.appendChild(document.createTextNode(title));\n      t.id = id;\n      left.appendChild(t);\n      if (sub) left.appendChild(el('p', 'ea-section-sub', sub));\n      h.appendChild(left);\n      if (side) h.appendChild(side);\n      return h;\n    }\n\n    function round(label, aria, onClick, disabled) {\n      var b = el('button', 'ea-round', label);\n      b.type = 'button';\n      b.setAttribute('aria-label', aria);\n      b.disabled = !!disabled;\n      b.addEventListener('click', onClick);\n      return b;\n    }\n\n    function empty(title, text, action) {\n      var box = el('div', 'ea-empty');\n      box.appendChild(icon('sun'));\n      box.appendChild(el('strong', null, title));\n      if (text) box.appendChild(el('span', null, text));\n      if (action) {\n        var b = el('button', 'ea-btn ea-btn--soft', action.label);\n        b.type = 'button';\n        b.addEventListener('click', action.onClick);\n        box.appendChild(b);\n      }\n      return box;\n    }\n\n    function nextEventDay(after) {\n      var next = null;\n      EVENTS.forEach(function(e) {\n        if (visible(e) && e.start > after && (!next || e.start < next)) next = e.start;\n      });\n      return next;\n    }\n\n    \/** Pastilles de cat\u00e9gories (filtre global de la page) *\/\n    function catFilters() {\n      var box = el('div', 'ea-cats');\n      box.setAttribute('role', 'group');\n      box.setAttribute('aria-label', T.anim_filter_cat);\n      \/\/ Cat\u00e9gories pr\u00e9sentes dans le p\u00e9rim\u00e8tre choisi (sur place \/ alentours)\n      var keys = Object.keys(CATEGORIES).filter(function(k) {\n        return EVENTS.some(function(e) {\n          return e.category === k && e.end >= TODAY &&\n            (state.scope === 'all' || (state.scope === 'onsite') === !!e.onsite);\n        });\n      });\n      if (keys.length < 2) return box;\n      var mk = function(key, label) {\n        var b = el('button', 'ea-cat' + (key === 'all' ? ' ea-cat--all' : ''), label);\n        b.type = 'button';\n        b.setAttribute('aria-pressed', state.cat === key ? 'true' : 'false');\n        if (key !== 'all') applyCat(b, key);\n        b.addEventListener('click', function() {\n          setCat(state.cat === key ? 'all' : key);\n          var again = document.querySelector('.ea-cat[aria-pressed=\"true\"]');\n          if (again) again.focus();\n        });\n        box.appendChild(b);\n      };\n      mk('all', T.anim_all_f);\n      keys.forEach(function(k) {\n        mk(k, CATEGORIES[k].label);\n      });\n      return box;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 3. AUJOURD'HUI\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function renderToday() {\n      var sec = document.getElementById('ea-sec-today');\n      sec.innerHTML = '';\n      var day = state.day;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, ucfirst(fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }))));\n      side.appendChild(round('\u2039', T.anim_prev_day, function() {\n        state.day = addDays(state.day, -1);\n        state.todayAll = false;\n        renderToday();\n      }, day <= TODAY));\n      side.appendChild(round('\u203a', T.anim_next_day, function() {\n        state.day = addDays(state.day, 1);\n        state.todayAll = false;\n        renderToday();\n      }));\n\n      \/\/ Titres neutres : la page sert aussi aux h\u00f4tels, mus\u00e9es, offices de tourisme\u2026\n      var title = day === TODAY ? T.anim_today_title :\n        (day === addDays(TODAY, 1) ? T.anim_tomorrow_title : tf('anim_day_title', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-today-title', 'sun', title, null, side));\n      sec.appendChild(catFilters());\n\n      var list = eventsOn(day);\n      if (!list.length) {\n        var next = nextEventDay(day);\n        sec.appendChild(empty(\n          day === TODAY ? T.anim_relax_today : T.anim_nothing_day,\n          next ? tf('anim_next_on', fmt(next, { weekday: 'long', day: 'numeric', month: 'long' })) : T.anim_soon,\n          next ? {\n            label: T.anim_see_day,\n            onClick: function() {\n              state.day = next;\n              renderToday();\n            }\n          } : null));\n        return;\n      }\n\n      sec.appendChild(list.length > TODAY_MAX ? carousel(list, { day: day }) : grid(list, { day: day }));\n    }\n\n    \/**\n     * Carrousel horizontal (3 cartes visibles sur ordinateur, d\u00e9filement au doigt\n     * sur mobile), fl\u00e8ches affich\u00e9es seulement s'il reste des cartes de ce c\u00f4t\u00e9.\n     *\/\n    function carousel(list, o, four) {\n      var wrap = el('div', 'ea-carousel' + (four ? ' ea-carousel--4' : ''));\n      var track = el('div', 'ea-carousel-track');\n      track.setAttribute('role', 'list');\n      list.forEach(function(e) {\n        var c = card(e, o);\n        c.setAttribute('role', 'listitem');\n        track.appendChild(c);\n      });\n      var prev = el('button', 'ea-carousel-btn ea-carousel-btn--prev', '\u2039');\n      var next = el('button', 'ea-carousel-btn ea-carousel-btn--next', '\u203a');\n      prev.type = next.type = 'button';\n      prev.setAttribute('aria-label', T.anim_prev_acts);\n      next.setAttribute('aria-label', T.anim_next_acts);\n      var step = function(dir) {\n        var first = track.firstElementChild;\n        var w = first ? first.getBoundingClientRect().width + 16 : track.clientWidth;\n        track.scrollBy({ left: dir * w * Math.max(1, Math.floor(track.clientWidth \/ w)), behavior: 'smooth' });\n      };\n      prev.addEventListener('click', function() {\n        step(-1);\n      });\n      next.addEventListener('click', function() {\n        step(1);\n      });\n      var update = function() {\n        var max = track.scrollWidth - track.clientWidth;\n        prev.hidden = track.scrollLeft <= 4;\n        next.hidden = track.scrollLeft >= max - 4;\n      };\n      track.addEventListener('scroll', update, { passive: true });\n      window.addEventListener('resize', update);\n      wrap.appendChild(prev);\n      wrap.appendChild(track);\n      wrap.appendChild(next);\n      setTimeout(update, 0);\n      return wrap;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 4. TEMPS FORTS DE LA SEMAINE\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function firstBusyDay(from) {\n      for (var i = 0; i < 7; i++) {\n        var d = addDays(from, i);\n        if (d >= TODAY && eventsOn(d).length) return d;\n      }\n      return null;\n    }\n\n    function renderWeek() {\n      var sec = document.getElementById('ea-sec-week');\n      sec.innerHTML = '';\n      var thisWeek = weekStart(TODAY);\n      var from = state.week || thisWeek;\n      var to = addDays(from, 6);\n      if (state.weekDay < from || state.weekDay > to) state.weekDay = firstBusyDay(from) || from;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, tf('from_to', shortDate(from), shortDate(to))));\n      side.appendChild(round('\u2039', T.anim_prev_week, function() {\n        state.week = addDays(from, -7);\n        state.weekDay = state.week === thisWeek ? TODAY : state.week;\n        renderWeek();\n      }, from <= thisWeek));\n      side.appendChild(round('\u203a', T.anim_next_week, function() {\n        state.week = addDays(from, 7);\n        state.weekDay = firstBusyDay(state.week) || state.week;\n        renderWeek();\n      }));\n\n      var title = from === thisWeek ? T.anim_week_title :\n        (from === addDays(thisWeek, 7) ? T.anim_next_week_title : tf('anim_week_of', fmt(from, { day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-week-title', 'calendar', title, null, side));\n\n      var days = el('div', 'ea-days');\n      days.setAttribute('role', 'group');\n      days.setAttribute('aria-label', T.anim_week_days);\n      for (var i = 0; i < 7; i++) {\n        (function(day) {\n          var n = eventsOn(day).length;\n          var b = el('button', 'ea-day' + (day === TODAY ? ' is-today' : '') + (n ? ' has-events' : ''));\n          b.type = 'button';\n          b.setAttribute('aria-pressed', day === state.weekDay ? 'true' : 'false');\n          b.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + (day === TODAY ? ' ' + T.anim_today_paren : '') + ' : ' + (n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing));\n          b.appendChild(el('span', 'ea-day-name', ucfirst(fmt(day, { weekday: 'short' }).replace('.', ''))));\n          b.appendChild(el('span', 'ea-day-date', shortDate(day)));\n          b.addEventListener('click', function() {\n            state.weekDay = day;\n            renderWeek();\n            var btn = document.querySelector('.ea-day[aria-pressed=\"true\"]');\n            if (btn) btn.focus();\n          });\n          days.appendChild(b);\n        })(addDays(from, i));\n      }\n      sec.appendChild(days);\n\n      var list = eventsOn(state.weekDay);\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_nothing_day, T.anim_pick_day));\n        return;\n      }\n      \/\/ Au-del\u00e0 de 4 activit\u00e9s : carrousel (4 cartes visibles) au lieu d'une grille qui s'allonge\n      sec.appendChild(list.length > 4 ? carousel(list, { day: state.weekDay }, true) : grid(list, { day: state.weekDay }, true));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 5. TOUS LES \u00c9V\u00c9NEMENTS \u00c0 VENIR\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/** Liste d\u00e9roulante accessible (libell\u00e9 masqu\u00e9) *\/\n    function selectBox(label, options, value, onChange) {\n      var wrap = el('label');\n      wrap.appendChild(el('span', 'ea-sr', label));\n      var sel = el('select', 'ea-select');\n      options.forEach(function(o) {\n        var opt = el('option', null, o[1]);\n        opt.value = o[0];\n        opt.selected = value === o[0];\n        sel.appendChild(opt);\n      });\n      sel.addEventListener('change', function() {\n        onChange(sel.value);\n      });\n      wrap.appendChild(sel);\n      return wrap;\n    }\n\n    function renderUpcoming() {\n      var sec = document.getElementById('ea-sec-upcoming');\n      sec.innerHTML = '';\n\n      \/\/ Tri (le filtre cat\u00e9gorie est global, sous \u00ab Activit\u00e9s du jour \u00bb)\n      var side = el('div', 'ea-head-side');\n      side.appendChild(selectBox(T.anim_sort, [\n        ['date', T.anim_sort_date],\n        ['name', T.anim_sort_name]\n      ], state.sort, function(v) {\n        state.sort = v;\n        renderUpcoming();\n        focusUpcoming(0);\n      }));\n      sec.appendChild(head('ea-upcoming-title', 'leaf', T.anim_upcoming_title, null, side));\n\n      var list = EVENTS.filter(function(e) {\n        return visible(e) && e.end >= TODAY;\n      }).sort(function(a, b) {\n        if (state.sort === 'name') return a.name.localeCompare(b.name, T.date_locale);\n        var sa = a.start < TODAY ? TODAY : a.start;\n        var sb = b.start < TODAY ? TODAY : b.start;\n        return sa.localeCompare(sb) || byTime(a, b);\n      });\n\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_no_upcoming, state.cat === 'all' ? T.anim_soon : T.anim_try_cat));\n        return;\n      }\n\n      sec.appendChild(grid(list.slice(0, state.upcomingLimit), { date: true }, true));\n\n      if (list.length > state.upcomingLimit) {\n        var more = el('div', 'ea-more');\n        var b = el('button', 'ea-btn ea-btn--soft', tf('anim_more', list.length - state.upcomingLimit));\n        b.appendChild(icon('arrow'));\n        b.type = 'button';\n        b.addEventListener('click', function() {\n          state.upcomingLimit += UPCOMING_STEP;\n          renderUpcoming();\n        });\n        more.appendChild(b);\n        sec.appendChild(more);\n      }\n    }\n\n    function setCat(key) {\n      state.cat = key;\n      rerenderAll();\n    }\n\n    function setScope(scope) {\n      state.scope = scope;\n      state.cat = 'all';\n      app.querySelectorAll('.ea-scope button').forEach(function(b) {\n        b.setAttribute('aria-pressed', b.getAttribute('data-scope') === scope ? 'true' : 'false');\n      });\n      rerenderAll();\n    }\n\n    function rerenderAll() {\n      state.upcomingLimit = UPCOMING_STEP;\n      state.todayAll = false;\n      renderToday();\n      renderWeek();\n      renderUpcoming();\n      renderCalendar();\n    }\n\n    \/** Apr\u00e8s un re-rendu, garde le focus sur la liste d\u00e9roulante utilis\u00e9e *\/\n    function focusUpcoming(i) {\n      var sel = document.querySelectorAll('#ea-sec-upcoming .ea-select')[i];\n      if (sel) sel.focus();\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 6. CALENDRIER DU MOIS (secondaire, repliable)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var MAX_LANES = 3;\n\n    \/** Place les \u00e9v\u00e9nements d'une semaine en couloirs sans chevauchement *\/\n    function layoutLanes(from, to) {\n      var items = eventsBetween(from, to).map(function(e) {\n        var s = e.start < from ? from : e.start;\n        var t = e.end > to ? to : e.end;\n        return { e: e, col: daysBetween(from, s) + 1, span: daysBetween(s, t) + 1, fromBefore: e.start < from, toAfter: e.end > to };\n      });\n      items.sort(function(a, b) {\n        return (a.col - b.col) || (b.span - a.span) || (a.e.start_time || '').localeCompare(b.e.start_time || '');\n      });\n      var ends = [];\n      items.forEach(function(it) {\n        var lane = 0;\n        while (ends[lane] !== undefined && ends[lane] >= it.col) lane++;\n        ends[lane] = it.col + it.span - 1;\n        it.lane = lane;\n      });\n      return items;\n    }\n\n    function renderCalendar() {\n      var sec = document.getElementById('ea-sec-calendar');\n      if (!sec) return; \/\/ calendrier masqu\u00e9 (r\u00e9glage ou calendrier=\"non\")\n      sec.innerHTML = '';\n\n      var toggle = el('button', 'ea-btn ea-btn--soft', state.calendarOpen ? T.anim_hide_cal : T.anim_show_cal);\n      toggle.appendChild(icon('arrow'));\n      toggle.type = 'button';\n      toggle.setAttribute('aria-expanded', state.calendarOpen ? 'true' : 'false');\n      toggle.setAttribute('aria-controls', 'ea-cal-panel');\n      toggle.addEventListener('click', function() {\n        state.calendarOpen = !state.calendarOpen;\n        renderCalendar();\n        var b = document.querySelector('#ea-sec-calendar [aria-controls=\"ea-cal-panel\"]');\n        if (b) b.focus();\n      });\n      sec.appendChild(head('ea-calendar-title', 'calendar', T.anim_cal_title, T.anim_cal_sub, toggle));\n\n      var panel = el('div', 'ea-cal-panel');\n      panel.id = 'ea-cal-panel';\n      panel.hidden = !state.calendarOpen;\n      sec.appendChild(panel);\n      if (!state.calendarOpen) return;\n\n      var first = state.month + '-01';\n      var firstDate = toDate(first);\n      var lastDay = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 0, 12));\n      var gridStart = weekStart(first);\n      var gridEnd = addDays(weekStart(lastDay), 6);\n\n      var bar = el('div', 'ea-cal-toolbar');\n      bar.appendChild(el('h3', 'ea-cal-month', ucfirst(fmt(first, { month: 'long', year: 'numeric' }))));\n      var nav = el('div', 'ea-head-side');\n      nav.appendChild(round('\u2039', T.anim_prev_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() - 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      nav.appendChild(round('\u203a', T.anim_next_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      bar.appendChild(nav);\n      panel.appendChild(bar);\n\n      var month = el('div', 'ea-month');\n      var mh = el('div', 'ea-month-head');\n      \/\/ Lundi \u2192 dimanche, abr\u00e9g\u00e9s dans la langue de la page (5 janv. 2026 = un lundi)\n      [5, 6, 7, 8, 9, 10, 11].map(function(dd) { return ucfirst(fmt('2026-01-' + (dd < 10 ? '0' : '') + dd, { weekday: 'short' }).replace('.', '')); }).forEach(function(d) {\n        mh.appendChild(el('div', null, d));\n      });\n      month.appendChild(mh);\n      for (var ws = gridStart; ws <= gridEnd; ws = addDays(ws, 7)) month.appendChild(monthRow(ws));\n      panel.appendChild(month);\n\n      \/\/ D\u00e9tail uniquement apr\u00e8s un clic sur un jour\n      if (state.selectedDay) {\n        var dp = el('div', 'ea-daypanel');\n        dp.id = 'ea-daypanel';\n        dp.appendChild(el('h3', 'ea-daypanel-title', ucfirst(fmt(state.selectedDay, { weekday: 'long', day: 'numeric', month: 'long' }))));\n        var list = eventsOn(state.selectedDay);\n        dp.appendChild(list.length ? grid(list, { day: state.selectedDay }) : empty(T.anim_nothing_day));\n        panel.appendChild(dp);\n      }\n    }\n\n    function monthRow(from) {\n      var to = addDays(from, 6);\n      var items = layoutLanes(from, to);\n      var row = el('div', 'ea-mrow');\n      var hidden = [0, 0, 0, 0, 0, 0, 0];\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) {\n          for (var d = it.col; d < it.col + it.span; d++) hidden[d - 1]++;\n        }\n      });\n\n      for (var i = 0; i < 7; i++) {\n        (function(day, i) {\n          var inMonth = day.slice(0, 7) === state.month;\n          var cell = el('button', 'ea-mcell' + (inMonth ? '' : ' ea-mcell--out') + (day === state.selectedDay ? ' ea-mcell--selected' : ''));\n          cell.type = 'button';\n          cell.style.gridColumn = String(i + 1);\n          cell.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + ' : ' + (function(n) { return n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing; })(eventsOn(day).length));\n          cell.addEventListener('click', function() {\n            state.selectedDay = day;\n            if (!inMonth) state.month = day.slice(0, 7);\n            renderCalendar();\n            var dp = document.getElementById('ea-daypanel');\n            if (dp && dp.scrollIntoView) dp.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n          });\n          row.appendChild(cell);\n\n          var num = el('span', 'ea-mnum' + (inMonth ? '' : ' ea-mnum--out') + (day === TODAY ? ' ea-mnum--today' : ''), String(toDate(day).getDate()));\n          num.style.gridColumn = String(i + 1);\n          row.appendChild(num);\n\n          if (hidden[i]) {\n            var more = el('span', 'ea-mmore', '+' + hidden[i]);\n            more.style.gridColumn = String(i + 1);\n            row.appendChild(more);\n          }\n        })(addDays(from, i), i);\n      }\n\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) return;\n        var e = it.e;\n        var b = el('button', 'ea-mbar' +\n          (it.fromBefore ? ' ea-mbar--from-before' : '') +\n          (it.toAfter ? ' ea-mbar--to-after' : '') +\n          (e.end < TODAY ? ' ea-mbar--ended' : ''), ((!it.fromBefore && e.start_time) ? e.start_time + ' ' : '') + e.name);\n        b.type = 'button';\n        b.title = e.name;\n        applyCat(b, e.category);\n        b.style.gridColumn = it.col + ' \/ span ' + it.span;\n        b.style.gridRow = String(it.lane + 2);\n        b.addEventListener('click', function() {\n          openModal(e);\n        });\n        row.appendChild(b);\n      });\n      return row;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ MODAL \u2014 d\u00e9plac\u00e9e dans <body> pour \u00e9chapper \u00e0 la largeur max du contenu\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var modal = document.getElementById('ea-modal');\n    if (modal && modal.parentNode !== document.body) document.body.appendChild(modal);\n    var modalContent = document.getElementById('ea-modal-content');\n    var lastFocus = null;\n\n    function openModal(e) {\n      lastFocus = document.activeElement;\n      modalContent.innerHTML = '';\n\n      if (e.image || DEFAULT_IMG) {\n        var img = media(e, 'ea-modal-img');\n        img.loading = 'eager';\n        var mm = el('div', 'ea-modal-media');\n        mm.appendChild(img);\n        var mcr = credit(e);\n        if (mcr) mm.appendChild(mcr);\n        modalContent.appendChild(mm);\n      }\n\n      var body = el('div', 'ea-modal-body');\n      if (catLabel(e)) body.appendChild(pill(e));\n      var t = el('h2', 'ea-modal-title', e.name);\n      t.id = 'ea-modal-title';\n      body.appendChild(t);\n\n      var info = el('div', 'ea-modal-info');\n      var when = el('span');\n      when.appendChild(icon('calendar'));\n      when.appendChild(document.createTextNode(fullWhenLabel(e)));\n      info.appendChild(when);\n      if (placeLabel(e)) {\n        var where = el('span');\n        where.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        where.appendChild(document.createTextNode(placeLabel(e)));\n        info.appendChild(where);\n      }\n      if (e.registration) {\n        var reg = el('span');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(el('strong', null, T.registration));\n        info.appendChild(reg);\n      }\n      body.appendChild(info);\n\n      if (e.description) body.appendChild(el('p', 'ea-modal-desc', e.description));\n\n      if (e.link) {\n        var a = el('a', 'ea-btn', T.anim_more_info);\n        a.href = e.link;\n        a.target = '_blank';\n        a.rel = 'noopener';\n        a.appendChild(icon('external'));\n        a.appendChild(el('span', 'ea-sr', T.anim_new_tab));\n        body.appendChild(a);\n      }\n      modalContent.appendChild(body);\n\n      modal.hidden = false;\n      document.documentElement.style.overflow = 'hidden';\n      document.getElementById('ea-modal-close').focus();\n    }\n\n    function closeModal() {\n      modal.hidden = true;\n      document.documentElement.style.overflow = '';\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n\n    document.getElementById('ea-modal-close').addEventListener('click', closeModal);\n    modal.addEventListener('click', function(ev) {\n      if (ev.target === modal) closeModal();\n    });\n    document.addEventListener('keydown', function(ev) {\n      if (modal.hidden) return;\n      if (ev.key === 'Escape') closeModal();\n      \/\/ Focus gard\u00e9 dans la modal\n      if (ev.key === 'Tab') {\n        var f = modal.querySelectorAll('button, a[href]');\n        if (!f.length) return;\n        var firstF = f[0],\n          lastF = f[f.length - 1];\n        if (ev.shiftKey && document.activeElement === firstF) {\n          ev.preventDefault();\n          lastF.focus();\n        } else if (!ev.shiftKey && document.activeElement === lastF) {\n          ev.preventDefault();\n          firstF.focus();\n        }\n      }\n    });\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ NAVIGATION RAPIDE + SUIVI DE SECTION\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/**\n     * Hauteur occup\u00e9e en haut de l'\u00e9cran par les barres fixes \/ collantes du site\n     * (barre d'admin, en-t\u00eate, barre de r\u00e9servation\u2026), quelle que soit leur classe :\n     * on sonde le haut de l'\u00e9cran et on empile les barres trouv\u00e9es.\n     *\/\n    function headerOffset() {\n      var bottom = 0;\n      var vw = window.innerWidth,\n        vh = window.innerHeight;\n      var isBar = function(el) {\n        if (!el || el === document.body || el === document.documentElement) return false;\n        if (el.closest('#ea-app, .ea-modal-overlay, .mv-modal-overlay')) return false;\n        var pos = getComputedStyle(el).position;\n        if (pos !== 'fixed' && pos !== 'sticky') return false;\n        var r = el.getBoundingClientRect();\n        \/\/ vraie barre : large, pas trop haute (exclut bulles de chat, boutons flottants, popups)\n        return r.width >= vw * 0.3 && r.height > 0 && r.height < vh * 0.45;\n      };\n      for (var pass = 0; pass < 5; pass++) {\n        var y = bottom + 2,\n          found = 0;\n        if (y >= vh * 0.5) break;\n        [0.15, 0.5, 0.85].forEach(function(fx) {\n          (document.elementsFromPoint(vw * fx, y) || []).forEach(function(el) {\n            for (var n = el; n && n !== document.body; n = n.parentElement) {\n              if (isBar(n)) {\n                var r = n.getBoundingClientRect();\n                if (r.top <= y + 1 && r.bottom > found) found = r.bottom;\n                break;\n              }\n            }\n          });\n        });\n        if (found <= bottom) break;\n        bottom = found;\n      }\n      app.style.setProperty('--ea-header', Math.round(bottom) + 'px');\n      return bottom;\n    }\n\n    var navLinks = Array.prototype.slice.call(app.querySelectorAll('.ea-nav a'));\n\n    function setCurrent(id) {\n      navLinks.forEach(function(a) {\n        a.setAttribute('aria-current', a.getAttribute('href') === '#' + id ? 'true' : 'false');\n      });\n    }\n\n    navLinks.forEach(function(a) {\n      a.addEventListener('click', function(ev) {\n        var target = document.getElementById(a.getAttribute('href').slice(1));\n        if (!target) return;\n        ev.preventDefault();\n        if (a.getAttribute('href') === '#ea-sec-calendar' && !state.calendarOpen) {\n          state.calendarOpen = true;\n          renderCalendar();\n        }\n        setCurrent(target.id);\n        target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      });\n    });\n\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function(entries) {\n        entries.forEach(function(en) {\n          if (en.isIntersecting) setCurrent(en.target.id);\n        });\n      }, { rootMargin: '-35% 0px -55% 0px' });\n      ['ea-sec-today', 'ea-sec-week', 'ea-sec-upcoming', 'ea-sec-calendar'].forEach(function(id) {\n        var sec = document.getElementById(id);\n        if (sec) io.observe(sec);\n      });\n    }\n\n    var ticking = false;\n    window.addEventListener('scroll', function() {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function() {\n        headerOffset();\n        ticking = false;\n      });\n    }, { passive: true });\n    window.addEventListener('resize', headerOffset);\n\n    \/\/ Semaine : on ouvre sur le prochain jour anim\u00e9 (aujourd'hui est d\u00e9j\u00e0 en haut de page)\n    (function() {\n      var ws = weekStart(TODAY);\n      for (var d = addDays(TODAY, 1); d <= addDays(ws, 6); d = addDays(d, 1)) {\n        if (eventsOn(d).length) {\n          state.weekDay = d;\n          return;\n        }\n      }\n    })();\n\n    app.querySelectorAll('.ea-scope button').forEach(function(b) {\n      b.addEventListener('click', function() {\n        setScope(b.getAttribute('data-scope'));\n      });\n    });\n\n    headerOffset();\n    renderToday();\n    renderWeek();\n    renderUpcoming();\n    renderCalendar();\n  })();\n<\/script>\n\n","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,"inline_featured_image":false,"footnotes":""},"sujet":[],"class_list":["post-2434","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>Activities and events - Camping Lann Brick<\/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.camping-lannbrick.com\/en\/elaia-animations\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Activities and events - Camping Lann Brick\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/\" \/>\n<meta property=\"og:site_name\" content=\"Camping Lann Brick\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-20T10:13:11+00:00\" \/>\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.camping-lannbrick.com\\\/en\\\/elaia-animations\\\/\",\"url\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/elaia-animations\\\/\",\"name\":\"Activities and events - Camping Lann Brick\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#website\"},\"datePublished\":\"2026-10-09T09:23:00+00:00\",\"dateModified\":\"2026-10-20T10:13:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/elaia-animations\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/elaia-animations\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/elaia-animations\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Camping Morbihan\",\"item\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Activities and events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/\",\"name\":\"Camping Lann Brick\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#organization\",\"name\":\"Camping Lann Brick\",\"url\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/cropped-LOGO-Lann-Brick-svg.webp\",\"contentUrl\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/cropped-LOGO-Lann-Brick-svg.webp\",\"width\":465,\"height\":398,\"caption\":\"Camping Lann Brick\"},\"image\":{\"@id\":\"https:\\\/\\\/www.camping-lannbrick.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Activities and events - Camping Lann Brick","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.camping-lannbrick.com\/en\/elaia-animations\/","og_locale":"en_US","og_type":"article","og_title":"Activities and events - Camping Lann Brick","og_url":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/","og_site_name":"Camping Lann Brick","article_modified_time":"2026-10-20T10:13:11+00:00","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/","url":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/","name":"Activities and events - Camping Lann Brick","isPartOf":{"@id":"https:\/\/www.camping-lannbrick.com\/en\/#website"},"datePublished":"2026-10-09T09:23:00+00:00","dateModified":"2026-10-20T10:13:11+00:00","breadcrumb":{"@id":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.camping-lannbrick.com\/en\/elaia-animations\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Camping Morbihan","item":"https:\/\/www.camping-lannbrick.com\/en\/"},{"@type":"ListItem","position":2,"name":"Activities and events"}]},{"@type":"WebSite","@id":"https:\/\/www.camping-lannbrick.com\/en\/#website","url":"https:\/\/www.camping-lannbrick.com\/en\/","name":"Camping Lann Brick","description":"","publisher":{"@id":"https:\/\/www.camping-lannbrick.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.camping-lannbrick.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.camping-lannbrick.com\/en\/#organization","name":"Camping Lann Brick","url":"https:\/\/www.camping-lannbrick.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.camping-lannbrick.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.camping-lannbrick.com\/wp-content\/uploads\/2024\/09\/cropped-LOGO-Lann-Brick-svg.webp","contentUrl":"https:\/\/www.camping-lannbrick.com\/wp-content\/uploads\/2024\/09\/cropped-LOGO-Lann-Brick-svg.webp","width":465,"height":398,"caption":"Camping Lann Brick"},"image":{"@id":"https:\/\/www.camping-lannbrick.com\/en\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/pages\/2434","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/comments?post=2434"}],"version-history":[{"count":1,"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/pages\/2434\/revisions"}],"predecessor-version":[{"id":2435,"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/pages\/2434\/revisions\/2435"}],"wp:attachment":[{"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/media?parent=2434"}],"wp:term":[{"taxonomy":"sujet","embeddable":true,"href":"https:\/\/www.camping-lannbrick.com\/en\/wp-json\/wp\/v2\/sujet?post=2434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}