{"id":47491,"date":"2026-10-15T14:43:19","date_gmt":"2026-10-15T12:43:19","guid":{"rendered":"https:\/\/www.lespialades.com\/elaia-animations-2\/"},"modified":"2026-10-20T12:13:48","modified_gmt":"2026-10-20T10:13:48","slug":"elaia-animations","status":"publish","type":"page","link":"https:\/\/www.lespialades.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. Sans bandeau (R\u00e9glages > Elaia) : titre et introduction aux couleurs du th\u00e8me -->\n  <div class=\"ea-intro\">\n    <h1 class=\"ea-intro-title\">Activities &amp; events<\/h1>\n    <p class=\"ea-intro-text\">Find all current activities, this week&#039;s highlights and upcoming events during your stay.<\/p>\n  <\/div>\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 - Past Future<\/strong> \u2014 Du 12\/06\/2026 au 31\/01\/2028 \u00e0 23:59 \u2014 24620 Les Eyzies<\/li>\n              <li><strong>Exhibition: &quot;The Court of Tales&quot; at the Duravel Library<\/strong> \u2014 Du 26\/10\/2026 \u00e0 09:00 au 06\/12\/2026 \u00e0 23:59 \u2014 46700 Duravel<\/li>\n              <li><strong>Market in Duravel<\/strong> \u2014 Du 14\/11\/2026 \u00e0 09:00 au 14\/11\/2026 \u00e0 23:59 \u2014 46700 Duravel<\/li>\n              <li><strong>Classical music concert<\/strong> \u2014 Du 14\/11\/2026 \u00e0 18:30 au 14\/11\/2026 \u00e0 23:59 \u2014 46140 Luzech<\/li>\n              <li><strong>Big raffle by the Firefighters<\/strong> \u2014 Du 14\/11\/2026 \u00e0 19:00 au 14\/11\/2026 \u00e0 23:59 \u2014 24120 Terrasson-Lavilledieu<\/li>\n              <li><strong>Techn&#039;\u00d4 Chai<\/strong> \u2014 Du 14\/11\/2026 \u00e0 19:30 au 14\/11\/2026 \u00e0 23:59 \u2014 46140 Parnac<\/li>\n              <li><strong>Toy sale in Martel<\/strong> \u2014 Du 15\/11\/2026 \u00e0 09:00 au 15\/11\/2026 \u00e0 23:59 \u2014 24290 Martel<\/li>\n              <li><strong>Tree and Garden Festival<\/strong> \u2014 Du 15\/11\/2026 \u00e0 09:00 au 15\/11\/2026 \u00e0 23:59 \u2014 24540 Monpazier<\/li>\n              <li><strong>Extra plants<\/strong> \u2014 Du 15\/11\/2026 \u00e0 10:00 au 15\/11\/2026 \u00e0 23:59 \u2014 24580 Plazac<\/li>\n              <li><strong>Cultural Centre: The Wackids<\/strong> \u2014 Du 15\/11\/2026 \u00e0 16:00 au 15\/11\/2026 \u00e0 23:59 \u2014 24200 Sarlat-la-Can\u00e9da<\/li>\n              <li><strong>Concert by Olivier Pons and Helen Lind\u00e9n<\/strong> \u2014 Du 15\/11\/2026 \u00e0 17:00 au 15\/11\/2026 \u00e0 23:59 \u2014 46250 Cazals<\/li>\n              <li><strong>Market in Saint-Clair<\/strong> \u2014 Du 17\/11\/2026 \u00e0 17:00 au 17\/11\/2026 \u00e0 23:59 \u2014 46300 Saint-Clair<\/li>\n              <li><strong>Writing workshop<\/strong> \u2014 Du 20\/11\/2026 \u00e0 15:00 au 20\/11\/2026 \u00e0 23:59 \u2014 24540 Monpazier<\/li>\n              <li><strong>Toy fair in Martel<\/strong> \u2014 Du 21\/11\/2026 \u00e0 09:00 au 22\/11\/2026 \u00e0 23:59 \u2014 46600 Martel<\/li>\n              <li><strong>Parenting workshop \u2013 Discovering circus arts<\/strong> \u2014 Du 21\/11\/2026 \u00e0 10:00 au 21\/11\/2026 \u00e0 23:59 \u2014 24200 Carsac-Aillac<\/li>\n              <li><strong>Documentary Film Month: the epic journey of a hedgehog<\/strong> \u2014 Du 21\/11\/2026 \u00e0 15:00 au 21\/11\/2026 \u00e0 23:59 \u2014 46000 Cahors<\/li>\n              <li><strong>Children&#039;s garage sale (ages 0-16) Le Bugue<\/strong> \u2014 Du 22\/11\/2026 \u00e0 09:00 au 22\/11\/2026 \u00e0 23:59 \u2014 24260 Le Bugue<\/li>\n              <li><strong>Christmas Market in Audrix<\/strong> \u2014 Du 22\/11\/2026 \u00e0 10:00 au 22\/11\/2026 \u00e0 23:59 \u2014 24260 Audrix<\/li>\n              <li><strong>Livestock fair in B\u00e9laye<\/strong> \u2014 Du 22\/11\/2026 \u00e0 10:00 au 22\/11\/2026 \u00e0 23:59 \u2014 46140 B\u00e9laye<\/li>\n              <li><strong>Concert by Isabelle Aubret &quot;You can&#039;t stop a bird from singing&quot; at the Jean Carmet cultural centre<\/strong> \u2014 Du 22\/11\/2026 \u00e0 15:00 au 22\/11\/2026 \u00e0 23:59 \u2014 46300 Le Vigan<\/li>\n              <li><strong>Arcades Musiques | LUDWIG string quartet concert<\/strong> \u2014 Du 22\/11\/2026 \u00e0 15:30 au 22\/11\/2026 \u00e0 23:59 \u2014 24480 Le Buisson-de-Cadouin<\/li>\n              <li><strong>documenTerre Film Festival - Film debate &quot;The Fabulous Story of Birds: Dinosaurs Among Us&quot;<\/strong> \u2014 Du 26\/11\/2026 \u00e0 21:00 au 26\/11\/2026 \u00e0 23:59 \u2014 24290 Montignac-Lascaux<\/li>\n              <li><strong>CIAS PN cooking workshop<\/strong> \u2014 Du 27\/11\/2026 au 27\/11\/2026 \u00e0 23:59 \u2014 24200 Sarlat-la-Can\u00e9da<\/li>\n              <li><strong>documenTerre Film Festival - Exhibition &quot;The Birds&quot; by illustrator Troubs<\/strong> \u2014 Du 27\/11\/2026 \u00e0 18:00 au 27\/11\/2026 \u00e0 23:59 \u2014 24290 Montignac-Lascaux<\/li>\n              <li><strong>Opening night of the documenTerre film festival - Film discussion &quot;The Mysterious Journey of Shorebirds&quot;<\/strong> \u2014 Du 27\/11\/2026 \u00e0 20:30 au 27\/11\/2026 \u00e0 23:59 \u2014 24290 Montignac-Lascaux<\/li>\n              <li><strong>DJ Slin concert<\/strong> \u2014 Du 27\/11\/2026 \u00e0 21:00 au 27\/11\/2026 \u00e0 23:59 \u2014 24260 Le Bugue<\/li>\n              <li><strong>Christmas Market in Saint-Laurent-la-Vall\u00e9e<\/strong> \u2014 Du 28\/11\/2026 \u00e0 10:00 au 29\/11\/2026 \u00e0 23:59 \u2014 24170 Saint-Laurent-la-Vall\u00e9e<\/li>\n              <li><strong>Christmas market in Lanzac<\/strong> \u2014 Du 28\/11\/2026 \u00e0 10:00 au 28\/11\/2026 \u00e0 23:59 \u2014 46200 Lanzac<\/li>\n              <li><strong>Book fair: &quot;Plumes d&#039;ici&quot;<\/strong> \u2014 Du 28\/11\/2026 \u00e0 10:30 au 28\/11\/2026 \u00e0 23:59 \u2014 46140 Luzech<\/li>\n              <li><strong>documenTerre Film Festival - Film discussion &quot;Bird Language&quot;<\/strong> \u2014 Du 28\/11\/2026 \u00e0 10:30 au 28\/11\/2026 \u00e0 23:59 \u2014 24290 Montignac-Lascaux<\/li>\n              <li><strong>Manu Lanvin live in concert<\/strong> \u2014 Du 28\/11\/2026 \u00e0 20:30 au 28\/11\/2026 \u00e0 23:59 \u2014 46090 Pradines<\/li>\n              <li><strong>Enchanting Christmas festivities at Ch\u00e2teau de Lantis<\/strong> \u2014 Du 29\/11\/2026 \u00e0 14:00 au 29\/11\/2026 \u00e0 23:59 \u2014 46340 D\u00e9gagnac<\/li>\n              <li><strong>DocumenTerre Film Festival - Screening and discussion &quot;Dusts of Stars&quot;<\/strong> \u2014 Du 29\/11\/2026 \u00e0 17:00 au 29\/11\/2026 \u00e0 23:59 \u2014 24290 Montignac-Lascaux<\/li>\n              <li><strong>Christmas market and ice rink<\/strong> \u2014 Du 02\/12\/2026 au 31\/12\/2026 \u00e0 23:59 \u2014 24200 Sarlat-la-Can\u00e9da<\/li>\n              <li><strong>Christmas music market in Concor\u00e8s<\/strong> \u2014 Du 05\/12\/2026 \u00e0 17:00 au 05\/12\/2026 \u00e0 23:59 \u2014 46310 Concor\u00e8s<\/li>\n              <li><strong>Loto<\/strong> \u2014 Du 05\/12\/2026 \u00e0 20:00 au 05\/12\/2026 \u00e0 23:59 \u2014 46300 Gourdon<\/li>\n              <li><strong>Telethon - Dancing dinner in Aubas<\/strong> \u2014 Du 05\/12\/2026 \u00e0 20:00 au 05\/12\/2026 \u00e0 23:59 \u2014 24290 Aubas<\/li>\n              <li><strong>Christmas Market in Crayssac<\/strong> \u2014 Du 06\/12\/2026 \u00e0 09:30 au 06\/12\/2026 \u00e0 23:59 \u2014 46150 Crayssac<\/li>\n              <li><strong>Christmas market<\/strong> \u2014 Du 06\/12\/2026 \u00e0 10:00 au 06\/12\/2026 \u00e0 23:59 \u2014 24480 Moli\u00e8res<\/li>\n              <li><strong>Concert - Nicolas Lestoquoy, S\u00e9bastien Llinares, Maitane Seb [S\u00e9choir d&#039;Aillac]<\/strong> \u2014 Du 06\/12\/2026 \u00e0 15:30 au 06\/12\/2026 \u00e0 23:59 \u2014 24200 Carsac-Aillac<\/li>\n              <li><strong>Christmas market of craft artisans<\/strong> \u2014 Du 11\/12\/2026 \u00e0 10:00 au 13\/12\/2026 \u00e0 23:59 \u2014 46220 Prayssac<\/li>\n              <li><strong>Show: &quot;Leaves (Escapades)&quot;, KD Danse Company<\/strong> \u2014 Du 11\/12\/2026 \u00e0 18:00 au 11\/12\/2026 \u00e0 23:59 \u2014 46000 Cahors<\/li>\n              <li><strong>Micro-Folie - An exceptional evening around opera<\/strong> \u2014 Du 11\/12\/2026 \u00e0 20:00 au 11\/12\/2026 \u00e0 23:59 \u2014 46500 Gramat<\/li>\n              <li><strong>Christmas at the Grand Couvent de Gramat<\/strong> \u2014 Du 12\/12\/2026 au 13\/12\/2026 \u00e0 23:59 \u2014 46500 Gramat<\/li>\n              <li><strong>18th Truffle Fair of Cuzance<\/strong> \u2014 Du 12\/12\/2026 \u00e0 08:30 au 12\/12\/2026 \u00e0 23:59 \u2014 46600 Cuzance<\/li>\n              <li><strong>Christmas in Martel<\/strong> \u2014 Du 12\/12\/2026 \u00e0 10:00 au 03\/01\/2027 \u00e0 23:59 \u2014 46600 Martel<\/li>\n              <li><strong>Christmas Market<\/strong> \u2014 Du 12\/12\/2026 \u00e0 14:00 au 12\/12\/2026 \u00e0 23:59 \u2014 24540 Monpazier<\/li>\n              <li><strong>Christmas Market in Castelfranc<\/strong> \u2014 Du 13\/12\/2026 \u00e0 09:00 au 13\/12\/2026 \u00e0 23:59 \u2014 46140 Castelfranc<\/li>\n              <li><strong>Christmas market in Cazals<\/strong> \u2014 Du 13\/12\/2026 \u00e0 10:00 au 13\/12\/2026 \u00e0 23:59 \u2014 46250 Cazals<\/li>\n              <li><strong>Christmas Market of Prayssac<\/strong> \u2014 Du 18\/12\/2026 \u00e0 17:00 au 18\/12\/2026 \u00e0 23:59 \u2014 46220 Prayssac<\/li>\n              <li><strong>Christmas Party in Souillac<\/strong> \u2014 Du 19\/12\/2026 \u00e0 17:00 au 19\/12\/2026 \u00e0 23:59 \u2014 46200 Souillac<\/li>\n              <li><strong>Christmas flea market<\/strong> \u2014 Du 20\/12\/2026 \u00e0 08:00 au 20\/12\/2026 \u00e0 23:59 \u2014 46700 Puy-l&#039;\u00c9v\u00eaque<\/li>\n              <li><strong>Christmas bingo of the Costeraste festival committee<\/strong> \u2014 Du 20\/12\/2026 \u00e0 14:30 au 20\/12\/2026 \u00e0 23:59 \u2014 46300 Payrignac<\/li>\n              <li><strong>The Galactic Magician [S\u00e9choir d&#039;Aillac]<\/strong> \u2014 Du 20\/12\/2026 \u00e0 16:00 au 20\/12\/2026 \u00e0 23:59 \u2014 24200 Carsac-Aillac<\/li>\n              <li><strong>Floral workshop - Festive table centrepiece<\/strong> \u2014 Du 23\/12\/2026 \u00e0 16:00 au 23\/12\/2026 \u00e0 23:59 \u2014 24260 Le Bugue<\/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\":56,\"name\":\"Exhibition - Past Future\",\"type\":\"evenements-locaux-341\",\"category\":\"exhibitions\",\"label\":\"Du 12\\\/06\\\/2026 au 31\\\/01\\\/2028 \\u00e0 23:59\",\"start\":\"2026-06-12\",\"end\":\"2028-01-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24620 Les Eyzies\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Archaeological treasures of the 21st century AD.\\nWhat will remain of us in 2000 years?\\nWhat will archaeologists understand about our society and way of life?\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/12062026-expo-Futur-anterieur-PIP.jpg\",\"credit\":\"PIP, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":53,\"name\":\"Exhibition: \\\"The Court of Tales\\\" at the Duravel Library\",\"type\":\"evenements-locaux-341\",\"category\":\"family\",\"label\":\"Du 26\\\/10\\\/2026 \\u00e0 09:00 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-10-26\",\"end\":\"2026-12-06\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46700 Duravel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Interactive detective exhibition for ages 7 and up.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/affiche-cour-des-contes.png\",\"credit\":\"\\u00a9dominique nachtergaele\",\"link\":\"\"},{\"id\":18,\"name\":\"Market in Saint-Germain-du-Bel-Air\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 08:00 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Saint-Germain-du-Bel-Air\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Friday meeting place to prepare your little dishes for the start of the weekend with fresh, seasonal produce.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Marche--de-Saint-Germain-du-Bel-Air.jpg\",\"credit\":\"\\u00a9 Michel Sirot\",\"link\":\"\"},{\"id\":43,\"name\":\"Market of Saint Cirq Souillaguet\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/11\\\/2026 \\u00e0 17:00 au 13\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-13\",\"end\":\"2026-11-13\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Saint-Cirq-Souillaguet\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Find organic fruits and vegetables, bread... at this small market.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Legumes---marche---Sven-Hilker-from-Pixabay.jpg\",\"credit\":\"\\u00a9 Sven Hilker from Pixabay\",\"link\":\"\"},{\"id\":51,\"name\":\"Market in Duravel\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 09:00 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46700 Duravel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Weekly producers' market, 2 to 3 vendors.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Marche-Duravel.png\",\"credit\":\"\\u00a9OT Lot-Vignoble\",\"link\":\"\"},{\"id\":52,\"name\":\"Classical music concert\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 18:30 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"18:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46140 Luzech\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"\\u00c9cho de la Luz association closes its season in style with two exceptional piano events The \\u00c9cho de la Luz association, under the artistic direction of pianist and harpsichordist Alejandro C\\u00e9spedes Mart\\u00edn, invites the public to celebrate the end of its 2026 musical season with two concerts at the Barry hall in Luzech. For these two events, the artists will make a remarkable instrument resonate: a 1920 \\u00c9rard grand piano.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Photo-artiste-14-novembre---Miriam-Gomez-Moran.jpg\",\"credit\":\"\\u00a9Echo de la Luz\",\"link\":\"\"},{\"id\":31,\"name\":\"Big raffle by the Firefighters\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"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\":\"24120 Terrasson-Lavilledieu\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"On Saturday 14 November, the firefighters of Terrasson-Lavilledieu invite you to the village hall for a big raffle full of conviviality and solidarity!\\nOn the programme: plenty of gifts for young and old, a tombola and a special quine reserved for children under 12.\\nDoors will open from 7 p.m. to welcome participants.\\nA refreshment stand and food area will also be available on site so you can fully enjoy the evening.\\nPrices: Adults: \\u20ac10, children under 12: \\u20ac5\\nPlease note: access only upon presentation of an entry card (1 card per person). Cards are available at Extra or Royal Kebab.\\nInformation:  +33 6 52 63 28 99\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/IMG-1731-4.JPG\",\"credit\":\"otvpn, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":42,\"name\":\"Techn'\\u00d4 Chai\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 14\\\/11\\\/2026 \\u00e0 19:30 au 14\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-14\",\"end\":\"2026-11-14\",\"start_time\":\"19:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46140 Parnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"TECHN\\u2019\\u00d4 CHAI returns for a third edition at Ch\\u00e2teau Saint-Sernin. Never two without three... and this time, TECHN\\u2019\\u00d4 CHAI is raising the bar even higher!After two first editions, TECHN\\u2019\\u00d4 CHAI returns with an ambitious line-up and four DJs ready to make the winery walls vibrate. For this new edition, Ch\\u00e2teau Saint-Sernin welcomes REN\\u2019ART, an essential association on the electronic scene, with Sara_Labb and Gounito, alongside Collectif BPM, with Medusa and Raf.On the program: four artists, four worlds and the same desire to get the crowd dancing. Tech house with trancy and groovy sounds, Italo-trance and hardgroove will follow one another throughout the night to offer an evolving musical experience, between sonic discoveries and collective energy.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Affiche-Techn-O-Chai-page-0001.jpg\",\"credit\":\"\\u00a9Ch\\u00e2teau Saint Sernin\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/techn-chai2\"},{\"id\":6,\"name\":\"Toy sale in Martel\",\"type\":\"evenements-locaux-341\",\"category\":\"flea-markets-garage-sales\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 09:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Martel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Organized by the parents' association in support of the school in Coly Saint Amand.\\n\\nRefreshments, food, and activities for all ages.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/15112026-vide-ta-chambre-Coly-Saint-Amand.jpg\",\"credit\":\"\\u00c9cole Saint Amand de Coly, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":15,\"name\":\"Tree and Garden Festival\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 09:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24540 Monpazier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Sale of tree seedlings, demonstrations and educational activities.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/leonardoiheme-plant-4427146-1920.jpg\",\"credit\":\"@pixabay, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":24,\"name\":\"Extra plants\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 10:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24580 Plazac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come share your plants, seeds, garden tools, surplus harvest and exchange with plant enthusiasts, \\nShared picnic\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/francesco-gallarotti-Bfdia-aJOvI-unsplash-2.jpg\",\"credit\":\"Francesco Gallarotti d'Unssplash, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":33,\"name\":\"Cultural Centre: The Wackids\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 15\\\/11\\\/2026 \\u00e0 16:00 au 15\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-15\",\"end\":\"2026-11-15\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24200 Sarlat-la-Can\\u00e9da\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Wackids is a rock band that revisits the greatest hits of the 2000s using children's instruments, sound gadgets and musical toys.\\n\\nFrom cult classics to must-hear hits, each song is introduced by an anecdote. The artists put on superhero costumes, in a cartoon-like universe, to offer a show mixing Rock'n'Toys, musical performance, offbeat humour and a touch of nostalgia.\\n\\nThe Wackids take us aboard their Futur 2000 spaceship for an intergalactic journey through the musical culture of the 21st century.\\n\\nA Rock'n'Toys concert for adults, where children must be brought along.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/The-Wackids.jpeg\",\"credit\":\"Centre Culturel de Sarlat, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.sarlat-centreculturel.fr\\\/evenement\\\/the-wackids\"},{\"id\":20,\"name\":\"Concert by Olivier Pons and Helen Lind\\u00e9n\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"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\":\"46250 Cazals\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Association Musique en Bouriane is delighted to invite you to the concert by Olivier Pons, violinist, and Helen Lind\\u00e9n, cellist, internationally renowned musicians.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Olivier-Pons--Helen-Linden.jpg\",\"credit\":\"Olivier-Pons--Helen-Linden\",\"link\":\"https:\\\/\\\/www.musique-en-bouriane.org\\\/\"},{\"id\":11,\"name\":\"Market in Saint-Clair\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 17\\\/11\\\/2026 \\u00e0 17:00 au 17\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-17\",\"end\":\"2026-11-17\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Saint-Clair\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Short supply chain fruits and vegetables, bread, seasonal produce, pizza truck,...\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/peter-wendt--r5KSMkyoSc-unsplash--1-.jpg\",\"credit\":\"\\u00a9Peter Wendt Unsplash LDD\",\"link\":\"\"},{\"id\":10,\"name\":\"Writing workshop\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 20\\\/11\\\/2026 \\u00e0 15:00 au 20\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-20\",\"end\":\"2026-11-20\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24540 Monpazier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and nurture your writing and let your ideas flow during this friendly workshop!\\n\\nRegistration required.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/pexels-new-year-background-1850177-1920.jpg\",\"credit\":\"@pixabay, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":2,\"name\":\"Toy fair in Martel\",\"type\":\"evenements-locaux-341\",\"category\":\"flea-markets-garage-sales\",\"label\":\"Du 21\\\/11\\\/2026 \\u00e0 09:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-22\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46600 Martel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Association for Children is organizing a toy, children's clothing and childcare equipment sale (ages 0-16). On site: sweet and savory panini sales, cr\\u00eapes and cakes, Christmas decorations for sale, game demonstrations, refreshments. Proceeds go to the leisure center \\\"Les Lutins des 7 tours\\\"\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/anan-ahmed-HOTxUVWr3Vw-unsplash.jpg\",\"credit\":\"Anan Ahmed\",\"link\":\"\"},{\"id\":38,\"name\":\"Parenting workshop \\u2013 Discovering circus arts\",\"type\":\"evenements-locaux-341\",\"category\":\"for-families\",\"label\":\"Du 21\\\/11\\\/2026 \\u00e0 10:00 au 21\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-21\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24200 Carsac-Aillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and share a special moment with your child around movement, the body, and circus arts! \\nThis free parenting workshop offers a fun introduction to acrobatics, balance, and juggling, to enjoy together in a friendly atmosphere. Two sessions are offered: Saturday, November 7, 2026 at the ALSH La Tribu in Saint-Geni\\u00e8s and Saturday, November 21, 2026 at the ALSH Saint-Rome in Carsac-Aillac. From 10 a.m. to 11 a.m. for children aged 2 to 5 and from 11 a.m. to 12 p.m. for ages 6 to 10. \\n\\nFree workshop by registration. \\nInformation: marine.jardel@paysdefenelon.fr or 06 10 91 02 09.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/atelier-parentalite-.jpg\",\"credit\":\"atelier parentalit\\u00e9, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":3,\"name\":\"Documentary Film Month: the epic journey of a hedgehog\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 21\\\/11\\\/2026 \\u00e0 15:00 au 21\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-21\",\"end\":\"2026-11-21\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46000 Cahors\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"THE EPIC JOURNEY OF A HEDGEHOG&nbsp;by Guillaume Poyet&nbsp;France \\\/ 2020 \\\/ 50 minutesToday threatened with extinction, this small animal, more than 60 million years old, is undergoing a true rural exodus. Forced to flee its natural habitat because of our intensive farming methods, the hedgehog migrates to urban green spaces in search of food. A road movie with a young female hedgehog whose adaptability will be repeatedly put to the test. Through the adventures of this heroine, this animal tale offers an entry point into human activities that impact the environment and transform our ecosystems.Followed by a meeting with the Lot delegation of LPO Occitanie, an environmental protection association.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/21-11Voyage-epique-du-herisson--Guillaume-Poyet-Camera-Lucida.jpg\",\"credit\":\"\\u00a9 Guillaume Poyet-Camera Lucida\",\"link\":\"https:\\\/\\\/mediatheque.grandcahors.fr\\\/\"},{\"id\":32,\"name\":\"Children's garage sale (ages 0-16) Le Bugue\",\"type\":\"evenements-locaux-341\",\"category\":\"flea-markets-garage-sales\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 09:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24260 Le Bugue\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Children's garage sale for ages 0-16 organized by the association La Souris Jaune.\\n\\nRefreshments and food on site\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/22112026-vide-grenier-Le-Bugue.jpg\",\"credit\":\"Association la Souris Jaune, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":1,\"name\":\"Christmas Market in Audrix\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 10:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24260 Audrix\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Organized by the Audrix festival committee.\\nNativity scene exhibition.\\nRefreshments\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/22112026-marche-de-noel-Audrix.jpg\",\"credit\":\"Comit\\u00e9 des f\\u00eates de Audrix, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":37,\"name\":\"Livestock fair in B\\u00e9laye\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 10:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46140 B\\u00e9laye\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The B\\u00e9laye festival committee is organizing the livestock fair.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/856934525-1416442723948243-3426814590733576931-n.jpg\",\"credit\":\"\\u00a9Comit\\u00e9desf\\u00eatesdeB\\u00e9laye\",\"link\":\"\"},{\"id\":46,\"name\":\"Concert by Isabelle Aubret \\\"You can't stop a bird from singing\\\" at the Jean Carmet cultural centre\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 15:00 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"15:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Le Vigan\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Isabelle Aubret returns to the stage to present an unprecedented solo performance:A final show written and directed by the artist herself, in which she reflects on the highlights of her artistic career as well as her family and personal life, performing throughout the show a selection of songs from her repertoire.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Musique-6.jpg\",\"credit\":\"\\u00a9musique\",\"link\":\"\"},{\"id\":0,\"name\":\"Arcades Musiques | LUDWIG string quartet concert\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 22\\\/11\\\/2026 \\u00e0 15:30 au 22\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-22\",\"end\":\"2026-11-22\",\"start_time\":\"15:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24480 Le Buisson-de-Cadouin\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Arcades Musiques association offers you classical music concerts throughout the year. On the program today: works by Mozart and Schubert.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/concert-de-musique-classique-arcades-musiques-6.png\",\"credit\":\"Arcades musiques, By-NC-ND 4.0\",\"link\":\"http:\\\/\\\/www.arcadesinfo.com\\\/\"},{\"id\":55,\"name\":\"documenTerre Film Festival - Film debate \\\"The Fabulous Story of Birds: Dinosaurs Among Us\\\"\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 26\\\/11\\\/2026 \\u00e0 21:00 au 26\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-26\",\"end\":\"2026-11-26\",\"start_time\":\"21:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Montignac-Lascaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"By ThomaCirotteau France 2026. 90 min. Original version. Production Perene Media\\n\\nSYNOPSIS :\\nThe incredible story of birds began 220 million years ago, with the \\u0638\\u0647\\u0648\\u0631 of the first dinosaurs, of which they are today the only descendants on the planet. Birds are therefore living proof that dinosaurs did not disappear! There are twice as many bird species as mammal species. So how can we explain the triumph of their evolution?\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/26112026-Festval-du-film-DocumenTerre-2.png\",\"credit\":\"Cin\\u00e9toile24, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/festival-documenterre-2026\"},{\"id\":13,\"name\":\"CIAS PN cooking workshop\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"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\":\"24200 Sarlat-la-Can\\u00e9da\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"CIAS Cooking Workshops: launched in 2018, this social project brings together 10 residents one Friday per month (9:30 a.m. to 1:30 p.m.) at Le Colombier. \\n\\nLed by a family and social welfare adviser, these workshops focus on sharing, health and savings. In 2026, the emphasis is on local produce and vegetarian cooking.\\n\\n2026 schedule:\\n\\n27\\\/02: Therapeutic education (Sarlat Hospital)\\n27\\\/03: Pantry recipes & anti-waste\\n24\\\/04: Therapeutic education (Sarlat Hospital)\\n29\\\/05: Gluten-free cooking\\n26\\\/06: Therapeutic education (Sarlat Hospital)\\n17\\\/07: Mexican street food picnic\\n28\\\/08: Discover raw cuisine\\n25\\\/09: Heading to Italy\\n23\\\/10: Seafood recipes (seaweed)\\n27\\\/11: Therapeutic education (Sarlat Hospital)\\n\\nShared meal and collective cleanup included.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/Atelier-Cuisine-46.jpg\",\"credit\":\"OT Sarlat, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":7,\"name\":\"documenTerre Film Festival - Exhibition \\\"The Birds\\\" by illustrator Troubs\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 27\\\/11\\\/2026 \\u00e0 18:00 au 27\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-27\",\"end\":\"2026-11-27\",\"start_time\":\"18:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Montignac-Lascaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Illustrator Troubs published a graphic novel, \\\"The Birds\\\", in 2022, with Futuropolis.\\n\\nTroubs embarks on a philosophical and ecological journey between Dordogne and Beirut, and talks with turtledoves and sparrows that speak to him about global warming. In France, birds are disappearing from our countryside, while in Lebanon, despite wars and destruction, nature is managing to adapt and even sometimes reclaim its rights.\\n\\nTroubs will present his graphic novel during the Festival Opening Evening.\\nHe will exhibit some pages from his graphic novel in the M3 hall and will be present for a signing session during the opening evening cocktail.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/26112026-Festval-du-film-DocumenTerre-2.png\",\"credit\":\"Cin\\u00e9toile24, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.cinetoile24.fr\\\/festival\\\/festival-du-film-documenterre-2026\"},{\"id\":49,\"name\":\"Opening night of the documenTerre film festival - Film discussion \\\"The Mysterious Journey of Shorebirds\\\"\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 27\\\/11\\\/2026 \\u00e0 20:30 au 27\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-27\",\"end\":\"2026-11-27\",\"start_time\":\"20:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Montignac-Lascaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"By Randall Wood. Australia 2022. 60 min. French version\\nZED PRODUCTIONS\\\/ARTE\\nParc Prize 2023 at the 39th M\\u00e9nigoute Festival\\n\\nSYNOPSIS:\\nThrough breathtaking images, this film follows for one year the odyssey of three bird species, capable of flying at 80 km\\\/h for nine days without feeding, alongside passionate ornithologists and scientists mobilized to study and protect them. A race against time has begun to uncover the secrets of these exceptional athletes and save them from extinction. This is a major environmental issue, as the survival of shorebirds, which depend on fragile ecosystems, is essential to the planet's future.\\n\\nDiscussion, cocktail at the end of the evening around book sales and signing by the speakers\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/26112026-Festval-du-film-DocumenTerre-2.png\",\"credit\":\"Cin\\u00e9toile24, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/festival-documenterre-2026\"},{\"id\":8,\"name\":\"DJ Slin concert\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 27\\\/11\\\/2026 \\u00e0 21:00 au 27\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-27\",\"end\":\"2026-11-27\",\"start_time\":\"21:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24260 Le Bugue\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Slin is a 25-year-old DJ from P\\u00e9rigord and a member of the Vizara collective.\\nHe is interested in all styles and adapts to your wishes in any situation! Between house, trance, techno and acid, with punchy, groovy and melodic beats, he can just as easily build the atmosphere during warm-up as get the crowd dancing for the closing set.\\n\\nFor several years now, he has also been producing, mixing and mastering tracks in a wide range of styles and BPMs, from tech-house to acid techno, usually having fun with samples more or less known to the audience.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/marcela-laskoski-YrtFlrLo2DQ-unsplash-Marcela-Laskoski-sur-unsplash-2.jpg\",\"credit\":\"Marcela Laskoski sur unsplash, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":19,\"name\":\"Christmas Market in Saint-Laurent-la-Vall\\u00e9e\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 10:00 au 29\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-29\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24170 Saint-Laurent-la-Vall\\u00e9e\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The ECLA association invites you to the 14th edition of its Christmas Market. \\nIt will take place over 2 days:\\n- Saturday 28 November from 2 pm to 6 pm\\n- Sunday 29 November from 10 am to 6 pm\\nOn the programme: local artists, artisans, creators and producers.\\nPlenty of activities, Santa Claus, pony rides, ...\\nOn site: mulled wine, cr\\u00eapes, waffles.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/lenahelfinger-christmas-6691610-640.jpg\",\"credit\":\"pixabay, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":44,\"name\":\"Christmas market in Lanzac\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"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\":\"46200 Lanzac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and share a lovely moment in the magical Christmas atmosphere, a first for Lanzac! Stroll, discover and find great ideas for your Christmas giftsOrganized by the Chorale Esperanza association\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/juncala-christmas-market-7616575-1920.jpg\",\"credit\":\"Juncala de Pixabay\",\"link\":\"\"},{\"id\":34,\"name\":\"Book fair: \\\"Plumes d'ici\\\"\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 10:30 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46140 Luzech\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Commune of Luzech, the association Lire \\u00e0 Luzech  and the bookshop \\u00ab le bon Air est dans les livres\\u201d in Albas invite you to the fifth edition of the Book Fair \\u201cPlumes d\\u2019ici\\u201d, on Saturday 28 November from 10:30 a.m. to 6:30 p.m..This event brings together authors and passionate readers every year for a warm day at the media library of Luzech and at the Armand Vir\\u00e9 &amp; Ichnospace museums.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/AFFICHE-SALON-LIVRE-LUZECH-2026-WEB-V2-1280x768-1.jpg\",\"credit\":\"\\u00a9Lire\\u00e0Luzech\",\"link\":\"\"},{\"id\":5,\"name\":\"documenTerre Film Festival - Film discussion \\\"Bird Language\\\"\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 28\\\/11\\\/2026 \\u00e0 10:30 au 28\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-28\",\"end\":\"2026-11-28\",\"start_time\":\"10:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Montignac-Lascaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"By Erik Bullot. France 2022. 54 min. Original version with French subtitles\\nIntangible Cultural Heritage Award at the Cin\\u00e9ma du r\\u00e9el festival in 2022.\\n \\nSYNOPSIS:\\nNarrated by a female voice from the future, after the sixth extinction, the film explores the virtues of translation, the desire for communication between humans and birds, and the attempts made to establish a possible exchange. It explores how ornithologists, but also poets, artists and scientists, have tried to understand, interpret and translate birdsong. Through these different acts of translation, the film subtly raises the question of the evolution of our ethical and philosophical relationship with animals.\\n\\nDiscussion with\\nVinciane DESPRET, philosopher, festival godmother\\nFanny RYBAK, bioacoustician and research lecturer at the Neurosciences Institute of Paris Saclay University\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/26112026-Festval-du-film-DocumenTerre-2.png\",\"credit\":\"Cin\\u00e9toile24, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/festival-documenterre-2026\"},{\"id\":27,\"name\":\"Manu Lanvin live in concert\",\"type\":\"evenements-locaux-341\",\"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\":\"46090 Pradines\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The La Prade venue in Pradines and the association Lot of Good Day will welcome Manu Lanvin on Saturday, November 28, 2026 for an evening dedicated to blues-rock.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/content.png\",\"credit\":\"\\u00a9laprade\",\"link\":\"https:\\\/\\\/billetterie.festik.net\\\/lotofgoodday\\\/product\\\/manu-lanvin-en-concert\\\/\"},{\"id\":29,\"name\":\"Enchanting Christmas festivities at Ch\\u00e2teau de Lantis\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 29\\\/11\\\/2026 \\u00e0 14:00 au 29\\\/11\\\/2026 \\u00e0 23:59\",\"start\":\"2026-11-29\",\"end\":\"2026-11-29\",\"start_time\":\"14:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46340 D\\u00e9gagnac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and discover the \\\"Christmas festivities of the little elves\\\" at Ch\\u00e2teau de Lantis, with a Quercy crafts market for your gifts, entertainment for young and old, Christmas carols... And if you have been good, you may even get a visit from Santa Claus! The castle is fully decorated and illuminated for the occasion.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/chateau-de-lantis-neige.jpg\",\"credit\":\"\\u00a9kikidi46\",\"link\":\"https:\\\/\\\/www.chateau-de-lantis.fr\\\/\"},{\"id\":39,\"name\":\"DocumenTerre Film Festival - Screening and discussion \\\"Dusts of Stars\\\"\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"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\":\"24290 Montignac-Lascaux\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"By C\\u00e9cile Verstraeten. France 2021. 75 min. Original French version\\n\\nA poetic and political documentary that explores the coexistence between birds and human beings in prison, in hospital and on stage, through Tristan Plot\\u2019s animal-assisted mediation sessions. A bird educator, he runs mediation sessions in prison and in nursing homes, and creates performances. He shows us how the closeness of birds and the exchanges with them bring poetry and gently change our perceptions, our behavior and our relationship with life. Bonds are formed and question everyone\\u2019s place among living beings.\\n\\nBy reservation\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/Affiche-Des-poussieres-d-etoiles.jpg\",\"credit\":\"Cin\\u00e9toile24, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.billetweb.fr\\\/festival-documenterre-2026\"},{\"id\":4,\"name\":\"Christmas market and ice rink\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 02\\\/12\\\/2026 au 31\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-02\",\"end\":\"2026-12-31\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24200 Sarlat-la-Can\\u00e9da\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Christmas market in Sarlat invites you from 2 to 31 December! Lights, decorations, entertainment, shows, market stalls and ice rinks will bring the town to life during this enchanting time of year.\\n\\nThe Christmas village will take over the entire Grande Rigaudie area, with its 3 alleys!\\nVisitors, young and old, will be able to find many gift ideas among the 70 chalets open every day from 10 a.m. to 8 p.m., and until 10 p.m. on Fridays and Saturdays.\\nIn an atmosphere of Christmas scents and flavours, the exhibitors will offer craft products, decorative items, gift ideas and gourmet treats to enjoy on site or take away.\\n\\nAt the bottom of the steps, on Place du 14 Juillet, visitors will once again discover a magical Christmas setting: a forest of fir trees, Father Christmas's house, the letter box...\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/DAN-9537-3.jpg\",\"credit\":\"DAN COURTICE, By-NC-ND 4.0\",\"link\":\"http:\\\/\\\/www.sarlat-tourisme.com\\\/\"},{\"id\":12,\"name\":\"Christmas music market in Concor\\u00e8s\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 17:00 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46310 Concor\\u00e8s\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"All the magic of Christmas markets and the preparations for the end-of-year celebrations in Concor\\u00e8s. This 9th edition has been carefully prepared by the volunteers of the Festi'C\\u00e9ou association, just for you: Santa Claus will be there, meet your local producers and beautiful creations by Artisans d'art.... Let yourself be tempted!\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Noel---flocon---Gerd-Altmann-from-Pixabay.jpg\",\"credit\":\"\\u00a9 Gerd Altmann from Pixabay\",\"link\":\"\"},{\"id\":41,\"name\":\"Loto\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 20:00 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Gourdon\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"organized by the Judo club of Gourdon and the Roquemeyrine Equestrian Center\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/russkoe-loto-2676332-1920-2-.jpg\",\"credit\":\"\\u00a9Romi_Lado de Pixabay LDD\",\"link\":\"\"},{\"id\":17,\"name\":\"Telethon - Dancing dinner in Aubas\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 05\\\/12\\\/2026 \\u00e0 20:00 au 05\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-05\",\"end\":\"2026-12-05\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24290 Aubas\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and join us to support the Telethon.\\n\\nMenu:\\n- Aperitif\\n- Pumpkin and red lentil velout\\u00e9\\n- Fish puff pastry\\n- Aubas-style chicken couscous\\n- Cheese\\n- Apricot clafoutis, whipped cream ice cream\\n- Coffee\\n\\nReservation required\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/05122026-Telethon-Repas-dansant-Aubas.jpg\",\"credit\":\"Aubas, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":21,\"name\":\"Christmas Market in Crayssac\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 06\\\/12\\\/2026 \\u00e0 09:30 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-06\",\"end\":\"2026-12-06\",\"start_time\":\"09:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46150 Crayssac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Crayssac Christmas Market is being prepared and is looking for exhibitors, creators, artisans and producers to come and present their creations and products in a friendly and festive atmosphere.Crafts, original creations, decorations, gourmet products, gift ideas\\u2026 we want to offer visitors a varied and welcoming market\\u2026By the Ecoute Joue Vis association.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/christmas-market-550323-1280-2.jpg\",\"credit\":\"\\u00a9garten-gg\",\"link\":\"\"},{\"id\":14,\"name\":\"Christmas market\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 06\\\/12\\\/2026 \\u00e0 10:00 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-06\",\"end\":\"2026-12-06\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24480 Moli\\u00e8res\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and discover the Christmas market in Moli\\u00e8res!\\n\\nYour presence directly contributes to the survival of the village's community school.\\nEvery year, the Christmas market in Moli\\u00e8res features more than twenty varied exhibitors and great entertainment in the village for the whole family.\\n\\nLooking for exhibitors \\\/ artisans indoors or outdoors\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/marche-de-noel-molieres.jpg\",\"credit\":\"Ecole Associative les Petits Moli\\u00e8res, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":36,\"name\":\"Concert - Nicolas Lestoquoy, S\\u00e9bastien Llinares, Maitane Seb [S\\u00e9choir d'Aillac]\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 06\\\/12\\\/2026 \\u00e0 15:30 au 06\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-06\",\"end\":\"2026-12-06\",\"start_time\":\"15:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24200 Carsac-Aillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"As part of Hors Saison Musicale, an exceptional concert will take place at the church of Carsac-Aillac featuring Nicolas Lestoquoy and S\\u00e9bastien Llinares on guitars, accompanied by Ma\\u00eftane Sebastian on cello. An intimate musical encounter at the heart of the heritage site, to bring music to rural areas and create a moment of sharing with local residents.\\n\\nSunday, December 6 at 3:30 p.m. \\u2013 Free admission.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/Capture-d-ecran-2026-09-15-111857.png\",\"credit\":\"Concert carsac, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.vostickets.fr\\\/Billet\\\/FR\\\/representation-LE_SECHOIR_AILLAC-36112-0.wb?REFID=CmQFAAAAAAAAAAAAdQA\"},{\"id\":54,\"name\":\"Christmas market of craft artisans\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 11\\\/12\\\/2026 \\u00e0 10:00 au 13\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-11\",\"end\":\"2026-12-13\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46220 Prayssac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The potter from Maison Rose invites you to discover her Christmas market of Craft Artisans. Wood, leather, ceramics, plants, glass, painting, engraving... about ten creators will be present.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Maison-rose-2026-A6-page-0001.jpg\",\"credit\":\"\\u00a9Manon Collot\",\"link\":\"\"},{\"id\":30,\"name\":\"Show: \\\"Leaves (Escapades)\\\", KD Danse Company\",\"type\":\"evenements-locaux-341\",\"category\":\"for-families\",\"label\":\"Du 11\\\/12\\\/2026 \\u00e0 18:00 au 11\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-11\",\"end\":\"2026-12-11\",\"start_time\":\"18:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46000 Cahors\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Bringing imagination to life with Mondrian.Awakening the imagination with a body and abstract shapes. That is the challenge of this choreographic piece inspired by the universe of the Dutch painter Piet Mondrian.From the floor to the back of the stage, the set appears entirely like the master's canvas: a white background crossed by black orthogonal lines, on which shapes in primary colors are arranged or hidden. Here, we simply follow the dancer as she discovers the objects and colors. The \\\"canvas\\\" holds many surprises and reveals a poetic world as they appear and are handled.There is no need to tell a story for the child to make his or her own the simple shapes and bold colors of this abstract universe, where everything is about purity, contrast and harmony. Freed from the constraints of representing reality, the imagination can unfold there as it wishes, without imposed direction, and reveal all its richness.From 4 years oldA parent-child workshop is offered before this show, with the artists. Information and booking at 05.65.20.88.60.\\u00a0\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/1434.gif\",\"credit\":\"\\u00a9Kddanse\",\"link\":\"https:\\\/\\\/indiv.themisweb.fr\\\/0060\\\/fChoixSeanceWidget.aspx?idstructure=0060&EventId=1434&request=QcE+w0WHSuDvpkhbpqIkkOwwvOmHMsuBPLtEklOMpUM8m8oahF0+N2NeZPFgM+emQFfPMQEDVr+dmhAUhOLhwQ==&tn=8861&quHash=fc\"},{\"id\":35,\"name\":\"Micro-Folie - An exceptional evening around opera\",\"type\":\"evenements-locaux-341\",\"category\":\"concerts-music-festivals\",\"label\":\"Du 11\\\/12\\\/2026 \\u00e0 20:00 au 11\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-11\",\"end\":\"2026-12-11\",\"start_time\":\"20:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46500 Gramat\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Plat\\u00e9e, Jean-Philippe Rameau's masterpiece, combines humor, dance and baroque opera. A wild staging by Laurent Pelly. Conducted by Marc Minkowski, Production: Julie Fuchs and Lawrence Brownlee in a musical comedy that is as brilliant as it is burlesque\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/MICRO-FOLIE-PROJECTION-OPERA.jpg\",\"credit\":\"Micro-folie\",\"link\":\"https:\\\/\\\/bibliotheque.gramat.fr\\\/microfolie\"},{\"id\":23,\"name\":\"Christmas at the Grand Couvent de Gramat\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 12\\\/12\\\/2026 au 13\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-12\",\"end\":\"2026-12-13\",\"start_time\":\"\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46500 Gramat\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Great markets of local artisans in the exceptional setting of the Grand Couvent de Gramat\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Grand-Couvent-de-Gramat-Lot-Tourisme---C.-Novello-200206-174525.jpg\",\"credit\":\"Lot Tourisme - C. Novello\",\"link\":\"\"},{\"id\":48,\"name\":\"18th Truffle Fair of Cuzance\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 12\\\/12\\\/2026 \\u00e0 08:30 au 12\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-12\",\"end\":\"2026-12-12\",\"start_time\":\"08:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46600 Cuzance\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Truffle Fair of Cuzance celebrates the black diamond of gastronomy and highlights local producers and traditional know-how. The public discovers a truffle market accompanied by a gourmet market, truffle-based specialties prepared by chef St\\u00e9phane Chambon and the students of the Souillac hotel school. A truffle-hunting demonstration in the municipal truffle grove, folk entertainment and horse-drawn carriage rides complete this day dedicated to truffles and local gastronomy.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Cauvaldor-Cavage--MalikaTurin-7608.jpg-1200px.JPG\",\"credit\":\"MalikaTurin\",\"link\":\"\"},{\"id\":26,\"name\":\"Christmas in Martel\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 12\\\/12\\\/2026 \\u00e0 10:00 au 03\\\/01\\\/2027 \\u00e0 23:59\",\"start\":\"2026-12-12\",\"end\":\"2027-01-03\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46600 Martel\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Christmas in Martel will take place from Saturday, December 12 to Sunday, January 3, 2027The ice rink set up under the market hall, the gourmet cabin, and the carousel on cours des foss\\u00e9s, along with the decorations at place Henri ramet, will bring all the magic of the festive season\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/roberto-nickson-5PQn41LFsQk-unsplash.jpg\",\"credit\":\"Roberto Nickson\",\"link\":\"\"},{\"id\":9,\"name\":\"Christmas Market\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 12\\\/12\\\/2026 \\u00e0 14:00 au 12\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-12\",\"end\":\"2026-12-12\",\"start_time\":\"14:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24540 Monpazier\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and enjoy Monpazier's Christmas market until the evening, with many exhibitors, artisans and associations, not forgetting the grand fireworks display at 9:30 p.m.!\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/Marche-de-noel-1-2-2.jpg\",\"credit\":\"@m\\u00e9diath\\u00e8que, By-NC-ND 4.0\",\"link\":\"\"},{\"id\":28,\"name\":\"Christmas Market in Castelfranc\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/12\\\/2026 \\u00e0 09:00 au 13\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-13\",\"end\":\"2026-12-13\",\"start_time\":\"09:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46140 Castelfranc\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Under the covered market hall, the market will bring together arts and crafts artisans, creators, and producers. The tree in the central square will be lit up. A face-painting stand will be offered to children. Father Christmas will come to meet them, and a horse-drawn carriage ride will be offered by the Parents' Association.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/-RitaE-Pixabay-decorationsdenoel-5.jpg\",\"credit\":\"\\u00a9APE46140\",\"link\":\"\"},{\"id\":45,\"name\":\"Christmas market in Cazals\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 13\\\/12\\\/2026 \\u00e0 10:00 au 13\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-13\",\"end\":\"2026-12-13\",\"start_time\":\"10:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46250 Cazals\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"We look forward to the traditional Christmas market. Come stroll among the stalls, find your Christmas gifts and enjoy traditional Christmas songs.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/deco-Noel-boule---Kerstin-Riemer-Pixabay.jpg\",\"credit\":\"\\u00a9 Kerstin Riemer_Pixabay\",\"link\":\"\"},{\"id\":16,\"name\":\"Christmas Market of Prayssac\",\"type\":\"evenements-locaux-341\",\"category\":\"markets-fairs\",\"label\":\"Du 18\\\/12\\\/2026 \\u00e0 17:00 au 18\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-18\",\"end\":\"2026-12-18\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46220 Prayssac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Christmas Market of the town of Prayssac is scheduled for December 18 and 18 on Place Dutours! There will be rides, magicians, Santa Claus in a horse-drawn carriage and much more...\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/th4djgyh24kj3g-i4k3l5u-3ho6p54-----omji3m.png\",\"credit\":\"\\u00a9Comit\\u00e9 des f\\u00eates de Prayssac\",\"link\":\"\"},{\"id\":25,\"name\":\"Christmas Party in Souillac\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 19\\\/12\\\/2026 \\u00e0 17:00 au 19\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-19\",\"end\":\"2026-12-19\",\"start_time\":\"17:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46200 Souillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Christmas Party, Souillac en Bodega invites you to celebrate Christmas, enjoy a snack and visit Santa Claus, followed by an evening of wine &amp; oysters with music by a DJ.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/Noel-Party.JPG\",\"credit\":\"Ville de Souillac\",\"link\":\"\"},{\"id\":40,\"name\":\"Christmas flea market\",\"type\":\"evenements-locaux-341\",\"category\":\"flea-markets-garage-sales\",\"label\":\"Du 20\\\/12\\\/2026 \\u00e0 08:00 au 20\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-20\",\"end\":\"2026-12-20\",\"start_time\":\"08:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46700 Puy-l'\\u00c9v\\u00eaque\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Come and find great bargains!\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/190508-Vide-grenier-a-Castelfranc--L.-Da-Ascencao---Office-de-Tourisme-Cahors---Vallee-du-Lot--44--2.jpg\",\"credit\":\"\\u00a9L. Da Ascen\\u00e7ao - Office de Tourisme Cahors - Vall\\u00e9e du Lot (44)\",\"link\":\"\"},{\"id\":47,\"name\":\"Christmas bingo of the Costeraste festival committee\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 20\\\/12\\\/2026 \\u00e0 14:30 au 20\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-20\",\"end\":\"2026-12-20\",\"start_time\":\"14:30\",\"end_time\":\"\",\"open_start\":false,\"city\":\"46300 Payrignac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"The Costeraste festival committee invites you to a friendly moment: its annual bingo.\",\"image\":\"https:\\\/\\\/cdt46.media.tourinsoft.eu\\\/upload\\\/loto-generique.jpg\",\"credit\":\"\\u00a9pixabay\",\"link\":\"\"},{\"id\":50,\"name\":\"The Galactic Magician [S\\u00e9choir d'Aillac]\",\"type\":\"evenements-locaux-341\",\"category\":\"for-families\",\"label\":\"Du 20\\\/12\\\/2026 \\u00e0 16:00 au 20\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-20\",\"end\":\"2026-12-20\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24200 Carsac-Aillac\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Get ready to embark on a magical journey with \\u00ab The Galactic Magician \\u00bb by R\\u00e9my Marvely! Alongside Sana the Magician and his dragon L\\u00e9onos, young and old alike will discover illusions, levitating objects, and interactive experiences in a funny, enchanting show for the whole family. A snack will be offered after the performance.\\n\\nSunday, December 20 at 4:00 pm \\u2013 Price: \\u20ac10 \\u2013 Free for children under 10.\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/Capture-d-ecran-2026-09-15-113827.png\",\"credit\":\"Magie carsac aillac, By-NC-ND 4.0\",\"link\":\"https:\\\/\\\/www.vostickets.fr\\\/Billet\\\/FR\\\/representation-LE_SECHOIR_AILLAC-36114-0.wb?REFID=FfcFAAAAAAAAAAAAVgA\"},{\"id\":22,\"name\":\"Floral workshop - Festive table centrepiece\",\"type\":\"evenements-locaux-341\",\"category\":\"local-events\",\"label\":\"Du 23\\\/12\\\/2026 \\u00e0 16:00 au 23\\\/12\\\/2026 \\u00e0 23:59\",\"start\":\"2026-12-23\",\"end\":\"2026-12-23\",\"start_time\":\"16:00\",\"end_time\":\"\",\"open_start\":false,\"city\":\"24260 Le Bugue\",\"onsite\":false,\"spot\":\"\",\"registration\":false,\"description\":\"Create the floral arrangement that will brighten up your festive table.\\nOpen to children aged 7 and over\\n\\nMaterials included. Complimentary gourmet break.\\nLimited places. Reservation required\",\"image\":\"https:\\\/\\\/cdt24.media.tourinsoft.eu\\\/upload\\\/10102026-Affiche-ateliers-boutique-Florivore-Le-Bugue-2.png\",\"credit\":\"Florivore, By-NC-ND 4.0\",\"link\":\"\"}];\n    var CATEGORIES = {\"concerts-music-festivals\":{\"key\":\"concerts-music-festivals\",\"label\":\"Concerts, music & festivals\",\"color\":\"#ef4444\",\"count\":16},\"markets-fairs\":{\"key\":\"markets-fairs\",\"label\":\"Markets & fairs\",\"color\":\"#3b82f6\",\"count\":21},\"flea-markets-garage-sales\":{\"key\":\"flea-markets-garage-sales\",\"label\":\"Flea markets & garage sales\",\"color\":\"#10b981\",\"count\":4},\"local-events\":{\"key\":\"local-events\",\"label\":\"Local events\",\"color\":\"#f59e0b\",\"count\":11},\"for-families\":{\"key\":\"for-families\",\"label\":\"For families\",\"color\":\"#a855f7\",\"count\":3},\"family\":{\"key\":\"family\",\"label\":\"Family\",\"color\":\"#0891b2\",\"count\":1},\"exhibitions\":{\"key\":\"exhibitions\",\"label\":\"Exhibitions\",\"color\":\"#db2777\",\"count\":1}};\n    var TODAY = \"2026-11-14\";\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\\\/1GRCI2Nxfhw3gn3XEbWpWQFqgosXDilegz6Zefaj.png\";\n\n    var app = document.getElementById('ea-app');\n    if (!app) return;\n\n    var TODAY_MAX = 3; \/\/ cartes \u00ab aujourd'hui \u00bb avant \u00ab Voir les autres \u00bb\n    var UPCOMING_STEP = 8;\n\n    var state = {\n      day: TODAY,\n      todayAll: false,\n      week: null,\n      weekDay: TODAY,\n      cat: 'all',\n      scope: 'all', \/\/ all | onsite | nearby\n      sort: 'date',\n      upcomingLimit: UPCOMING_STEP,\n      calendarOpen: false,\n      month: TODAY.slice(0, 7),\n      selectedDay: null\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ IC\u00d4NES (SVG statiques)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var ICONS = {\n      pin: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 21s-7-6.2-7-11.5a7 7 0 0 1 14 0C19 14.8 12 21 12 21z\"\/><circle cx=\"12\" cy=\"9.5\" r=\"2.5\"\/><\/svg>',\n      calendar: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"\/><path d=\"M16 3v4M8 3v4M3 10h18\"\/><\/svg>',\n      arrow: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>',\n      external: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><path d=\"M14 5h5v5M19 5l-8 8M18 14v5H5V6h5\"\/><\/svg>',\n      sun: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\"\/><\/svg>',\n      pen: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11l2 2 4-4\"\/><rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\"\/><path d=\"M8 7h8\"\/><\/svg>',\n      clock: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3 2\"\/><\/svg>',\n      star: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"><path d=\"M12 3l2.8 5.7 6.2.9-4.5 4.4 1.1 6.2L12 17.3 6.4 20.2l1.1-6.2L3 9.6l6.2-.9z\"\/><\/svg>',\n      leaf: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 19c0-8 5-14 15-14 0 10-6 15-14 15\"\/><path d=\"M5 19l7-7\"\/><\/svg>',\n      tent: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4L3 20h18L12 4z\"\/><path d=\"M12 4v16M9 20l3-6 3 6\"\/><\/svg>'\n    };\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ CAT\u00c9GORIES \u2014 pastels harmonieux d\u00e9duits du libell\u00e9\n    \/\/ (le libell\u00e9 est toujours affich\u00e9 : l'info ne passe pas que par la couleur)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var CAT_STYLES = [\n      [\/enfant|kid|junior\/, '#fff1c9', '#6f5200'],\n      [\/famil\/, '#fdf0d5', '#7a4e00'],\n      [\/bien.?etre|yoga|zen|detente|relax|spa\/, '#e3f1e6', '#24613a'],\n      [\/concert|musique|soiree|dj|bal\\b\/, '#ece6fa', '#4b3a8c'],\n      [\/spectacle|theatre|cinema|cirque|magie\/, '#fbe3e1', '#8f2d27'],\n      [\/sport|rando|velo|course|tournoi|petanque|nautique\/, '#dcefeb', '#1f5f55'],\n      [\/expo|musee|culture|patrimoine|visite\/, '#f3e6ef', '#7a2f5c'],\n      [\/march|brocante|vide.?grenier|artisan|terroir|degust\/, '#e8f0dc', '#3f5a1e'],\n      [\/animation|fete|festiv|atelier|jeu\/, '#fbe7d7', '#8e4214']\n    ];\n\n    function norm(s) {\n      return (s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, '');\n    }\n\n    function catStyle(key) {\n      var hay = norm(key + ' ' + (CATEGORIES[key] ? CATEGORIES[key].label : ''));\n      for (var i = 0; i < CAT_STYLES.length; i++) {\n        if (CAT_STYLES[i][0].test(hay)) return { bg: CAT_STYLES[i][1], fg: CAT_STYLES[i][2] };\n      }\n      return { bg: '#eceee8', fg: '#3c463f' };\n    }\n\n    function applyCat(node, key) {\n      var s = catStyle(key);\n      node.style.setProperty('--ea-cat-bg', s.bg);\n      node.style.setProperty('--ea-cat-fg', s.fg);\n    }\n\n    function catLabel(e) {\n      return CATEGORIES[e.category] ? CATEGORIES[e.category].label : '';\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DATES \u2014 cha\u00eenes Y-m-d (pas de d\u00e9calage de fuseau)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function toDate(ymd) {\n      var p = ymd.split('-');\n      return new Date(+p[0], +p[1] - 1, +p[2], 12);\n    }\n\n    function toYmd(d) {\n      return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n    }\n\n    function addDays(ymd, n) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() + n);\n      return toYmd(d);\n    }\n\n    function daysBetween(a, b) {\n      return Math.round((toDate(b) - toDate(a)) \/ 86400000);\n    }\n\n    function weekStart(ymd) {\n      var d = toDate(ymd);\n      d.setDate(d.getDate() - (d.getDay() + 6) % 7);\n      return toYmd(d);\n    }\n\n    function fmt(ymd, opts) {\n      return toDate(ymd).toLocaleDateString(T.date_locale, opts);\n    }\n\n    function ucfirst(s) {\n      return s.charAt(0).toUpperCase() + s.slice(1);\n    }\n\n    function shortDate(ymd) {\n      return fmt(ymd, { day: 'numeric', month: 'short' });\n    }\n\n    function byTime(a, b) {\n      return (a.start_time || '').localeCompare(b.start_time || '') || a.name.localeCompare(b.name, T.date_locale);\n    }\n\n    \/** Filtres globaux : sur place \/ aux alentours + cat\u00e9gorie *\/\n    function visible(e) {\n      if (state.scope === 'onsite' && !e.onsite) return false;\n      if (state.scope === 'nearby' && e.onsite) return false;\n      return state.cat === 'all' || e.category === state.cat;\n    }\n\n    function eventsOn(ymd) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= ymd && e.end >= ymd;\n      }).sort(byTime);\n    }\n\n    function eventsBetween(from, to) {\n      return EVENTS.filter(function(e) {\n        return visible(e) && e.start <= to && e.end >= from;\n      });\n    }\n\n    \/** Ligne horaire d'une carte vue depuis un jour donn\u00e9 *\/\n    function timeLabel(e, day) {\n      if (e.start === day && e.start_time) return e.start_time + (e.end_time && e.start === e.end ? ' \u2013 ' + e.end_time : '');\n      if (e.start !== e.end || e.open_start) return tf('until', shortDate(e.end));\n      return T.anim_all_day;\n    }\n\n    \/** Ligne date d'une carte \u00ab \u00e0 venir \u00bb *\/\n    function dateLabel(e) {\n      if (e.open_start) return tf('until', shortDate(e.end));\n      if (e.start !== e.end) return tf('from_to', shortDate(e.start), shortDate(e.end));\n      var d = ucfirst(fmt(e.start, { weekday: 'short', day: 'numeric', month: 'short' }));\n      return d + (e.start_time ? ' \u00b7 ' + e.start_time : '');\n    }\n\n    function fullWhenLabel(e) {\n      var opts = { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' };\n      if (e.open_start) return tf('until', fmt(e.end, opts));\n      var time = e.start_time ? ' ' + tf('anim_at', e.start_time) : '';\n      if (e.start === e.end) return ucfirst(fmt(e.start, opts)) + time + (e.end_time ? ' \u2013 ' + e.end_time : '');\n      return tf('from_to', fmt(e.start, { day: 'numeric', month: 'long' }) + time, fmt(e.end, opts) + (e.end_time ? ' ' + tf('anim_at', e.end_time) : ''));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ DOM\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function el(tag, cls, text) {\n      var n = document.createElement(tag);\n      if (cls) n.className = cls;\n      if (text != null) n.textContent = text;\n      return n;\n    }\n\n    function icon(name) {\n      var s = el('span', 'ea-icon');\n      s.setAttribute('aria-hidden', 'true');\n      s.innerHTML = ICONS[name];\n      return s;\n    }\n\n    \/** Image de la fiche \u2192 image par d\u00e9faut du chatbot \u2192 aplat illustr\u00e9 *\/\n    function media(e, cls) {\n      var fallback = function() {\n        var f = el('div', 'ea-card-fallback');\n        f.appendChild(icon('tent'));\n        return f;\n      };\n      if (!e.image && !DEFAULT_IMG) return fallback();\n      var img = el('img', cls);\n      var useDefault = !e.image;\n      img.src = useDefault ? DEFAULT_IMG : e.image;\n      img.alt = e.name;\n      img.loading = 'lazy';\n      img.decoding = 'async';\n      if (useDefault) img.classList.add('ea-img--default');\n      img.onerror = function() {\n        \/\/ Le cr\u00e9dit n'est plus celui de l'image affich\u00e9e\n        var cr = img.parentNode && img.parentNode.querySelector('.ea-credit');\n        if (cr) cr.remove();\n        if (!useDefault && DEFAULT_IMG) {\n          useDefault = true;\n          img.classList.add('ea-img--default');\n          img.src = DEFAULT_IMG;\n        } else if (img.parentNode) {\n          img.replaceWith(fallback());\n        }\n      };\n      return img;\n    }\n\n    \/** Cr\u00e9dit photo en bas \u00e0 droite de l'image (rien sans image propre) *\/\n    function credit(e) {\n      if (!e.image || !e.credit) return null;\n      var txt = \/^(\u00a9|\\(c\\))\/i.test(e.credit) ? e.credit : '\u00a9 ' + e.credit;\n      var c = el('span', 'ea-credit', txt);\n      c.title = txt;\n      return c;\n    }\n\n    function pill(e) {\n      var p = el('span', 'ea-pill', catLabel(e));\n      applyCat(p, e.category);\n      return p;\n    }\n\n    \/**\n     * Carte \u00e9v\u00e9nement (composant unique).\n     * @param {object} e\n     * @param {object} o { day: 'Y-m-d' \u2192 heure du jour | date: true \u2192 dates de l'\u00e9v\u00e9nement }\n     *\/\n    function card(e, o) {\n      o = o || {};\n      var c = el('article', 'ea-card' + (e.end < TODAY ? ' ea-card--ended' : ''));\n      c.tabIndex = 0;\n      c.setAttribute('role', 'button');\n      c.setAttribute('aria-label', e.name + ' \u2014 ' + (o.date ? dateLabel(e) : timeLabel(e, o.day)) + ' \u2014 ' + T.anim_see_detail);\n      applyCat(c, e.category);\n\n      var m = el('div', 'ea-card-media');\n      m.appendChild(media(e));\n      var cr = credit(e);\n      if (cr) m.appendChild(cr);\n      m.appendChild(dateBadge(e));\n      if (o.day === TODAY && e.start < TODAY && e.end >= TODAY) {\n        m.appendChild(el('span', 'ea-live', T.anim_live));\n      }\n      if (e.registration) {\n        var reg = el('span', 'ea-reg');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(document.createTextNode(T.registration));\n        m.appendChild(reg);\n      }\n      c.appendChild(m);\n\n      var b = el('div', 'ea-card-body');\n      var top = el('div', 'ea-card-top');\n      if (!o.date) {\n        var w = el('span', 'ea-when');\n        w.appendChild(icon('clock'));\n        w.appendChild(document.createTextNode(timeLabel(e, o.day)));\n        top.appendChild(w);\n      }\n      if (top.childNodes.length) b.appendChild(top);\n      b.appendChild(el('h3', 'ea-card-title', e.name));\n      var where = placeLabel(e);\n      if (where) {\n        var p = el('p', 'ea-place');\n        p.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        p.appendChild(document.createTextNode(where));\n        b.appendChild(p);\n      }\n      if (e.description) b.appendChild(el('p', 'ea-card-desc', e.description));\n      var cta = el('span', 'ea-cta', T.discover);\n      cta.appendChild(icon('arrow'));\n      b.appendChild(cta);\n      c.appendChild(b);\n\n      c.addEventListener('click', function() {\n        openModal(e);\n      });\n      c.addEventListener('keydown', function(ev) {\n        if (ev.key === 'Enter' || ev.key === ' ') {\n          ev.preventDefault();\n          openModal(e);\n        }\n      });\n      return c;\n    }\n\n    \/** O\u00f9 : lieu dans l'\u00e9tablissement (sur place) ou ville (aux alentours) *\/\n    function placeLabel(e) {\n      if (e.onsite) return e.spot ? tf('anim_onsite_spot', e.spot) : T.anim_onsite;\n      return e.city;\n    }\n\n    \/**\n     * Badge date sur l'image, toujours sur 3 lignes et de taille fixe :\n     *   un jour     \u2192 LUN \/ 28 \/ SEPT\n     *   jusqu'au    \u2192 JUSQU'AU \/ 18 \/ OCT\n     *   p\u00e9riode     \u2192 25 SEPT \u2192 \/ 7 \/ OCT   (du 25 sept. au 7 oct.)\n     *\/\n    function dateBadge(e) {\n      var month = function(ymd) {\n        return fmt(ymd, { month: 'short' }).replace('.', '');\n      };\n      var top, day, end = '';\n      if (e.open_start) {\n        top = T.anim_badge_until;\n        day = e.end;\n      } else if (e.start !== e.end) {\n        \/\/ P\u00e9riode : le D\u00c9BUT en gros, la fin en petit dessous (\u2192 1 nov)\n        top = T.anim_badge_from;\n        day = e.start;\n        end = '\u2192 ' + toDate(e.end).getDate() + ' ' + month(e.end);\n      } else {\n        top = e.start === TODAY ? T.anim_badge_today : fmt(e.start, { weekday: 'short' }).replace('.', '');\n        day = e.start;\n      }\n      \/\/ Couleur selon le cas : aujourd'hui \/ un jour \u00e0 venir \/ p\u00e9riode \u00e0 venir \/ en cours\n      var kind = (e.start === e.end && !e.open_start) ? (e.start === TODAY ? 'today' : 'day') :\n        ((e.open_start || e.start <= TODAY) ? 'ongoing' : 'period');\n      var d = el('span', 'ea-date ea-date--' + kind);\n      d.setAttribute('aria-hidden', 'true');\n      d.appendChild(el('span', 'ea-date-top', top));\n      d.appendChild(el('span', 'ea-date-day', String(toDate(day).getDate())));\n      d.appendChild(el('span', 'ea-date-month', month(day)));\n      if (end) d.appendChild(el('span', 'ea-date-end', end));\n      return d;\n    }\n\n    function grid(list, o, four) {\n      var g = el('div', 'ea-grid' + (four ? ' ea-grid--4' : ''));\n      list.forEach(function(e) {\n        g.appendChild(card(e, o));\n      });\n      return g;\n    }\n\n    function head(id, iconName, title, sub, side) {\n      var h = el('div', 'ea-section-head');\n      var left = el('div');\n      var t = el('h2', 'ea-section-title');\n      if (iconName) t.appendChild(icon(iconName));\n      t.appendChild(document.createTextNode(title));\n      t.id = id;\n      left.appendChild(t);\n      if (sub) left.appendChild(el('p', 'ea-section-sub', sub));\n      h.appendChild(left);\n      if (side) h.appendChild(side);\n      return h;\n    }\n\n    function round(label, aria, onClick, disabled) {\n      var b = el('button', 'ea-round', label);\n      b.type = 'button';\n      b.setAttribute('aria-label', aria);\n      b.disabled = !!disabled;\n      b.addEventListener('click', onClick);\n      return b;\n    }\n\n    function empty(title, text, action) {\n      var box = el('div', 'ea-empty');\n      box.appendChild(icon('sun'));\n      box.appendChild(el('strong', null, title));\n      if (text) box.appendChild(el('span', null, text));\n      if (action) {\n        var b = el('button', 'ea-btn ea-btn--soft', action.label);\n        b.type = 'button';\n        b.addEventListener('click', action.onClick);\n        box.appendChild(b);\n      }\n      return box;\n    }\n\n    function nextEventDay(after) {\n      var next = null;\n      EVENTS.forEach(function(e) {\n        if (visible(e) && e.start > after && (!next || e.start < next)) next = e.start;\n      });\n      return next;\n    }\n\n    \/** Pastilles de cat\u00e9gories (filtre global de la page) *\/\n    function catFilters() {\n      var box = el('div', 'ea-cats');\n      box.setAttribute('role', 'group');\n      box.setAttribute('aria-label', T.anim_filter_cat);\n      \/\/ Cat\u00e9gories pr\u00e9sentes dans le p\u00e9rim\u00e8tre choisi (sur place \/ alentours)\n      var keys = Object.keys(CATEGORIES).filter(function(k) {\n        return EVENTS.some(function(e) {\n          return e.category === k && e.end >= TODAY &&\n            (state.scope === 'all' || (state.scope === 'onsite') === !!e.onsite);\n        });\n      });\n      if (keys.length < 2) return box;\n      var mk = function(key, label) {\n        var b = el('button', 'ea-cat' + (key === 'all' ? ' ea-cat--all' : ''), label);\n        b.type = 'button';\n        b.setAttribute('aria-pressed', state.cat === key ? 'true' : 'false');\n        if (key !== 'all') applyCat(b, key);\n        b.addEventListener('click', function() {\n          setCat(state.cat === key ? 'all' : key);\n          var again = document.querySelector('.ea-cat[aria-pressed=\"true\"]');\n          if (again) again.focus();\n        });\n        box.appendChild(b);\n      };\n      mk('all', T.anim_all_f);\n      keys.forEach(function(k) {\n        mk(k, CATEGORIES[k].label);\n      });\n      return box;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 3. AUJOURD'HUI\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function renderToday() {\n      var sec = document.getElementById('ea-sec-today');\n      sec.innerHTML = '';\n      var day = state.day;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, ucfirst(fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }))));\n      side.appendChild(round('\u2039', T.anim_prev_day, function() {\n        state.day = addDays(state.day, -1);\n        state.todayAll = false;\n        renderToday();\n      }, day <= TODAY));\n      side.appendChild(round('\u203a', T.anim_next_day, function() {\n        state.day = addDays(state.day, 1);\n        state.todayAll = false;\n        renderToday();\n      }));\n\n      \/\/ Titres neutres : la page sert aussi aux h\u00f4tels, mus\u00e9es, offices de tourisme\u2026\n      var title = day === TODAY ? T.anim_today_title :\n        (day === addDays(TODAY, 1) ? T.anim_tomorrow_title : tf('anim_day_title', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-today-title', 'sun', title, null, side));\n      sec.appendChild(catFilters());\n\n      var list = eventsOn(day);\n      if (!list.length) {\n        var next = nextEventDay(day);\n        sec.appendChild(empty(\n          day === TODAY ? T.anim_relax_today : T.anim_nothing_day,\n          next ? tf('anim_next_on', fmt(next, { weekday: 'long', day: 'numeric', month: 'long' })) : T.anim_soon,\n          next ? {\n            label: T.anim_see_day,\n            onClick: function() {\n              state.day = next;\n              renderToday();\n            }\n          } : null));\n        return;\n      }\n\n      sec.appendChild(list.length > TODAY_MAX ? carousel(list, { day: day }) : grid(list, { day: day }));\n    }\n\n    \/**\n     * Carrousel horizontal (3 cartes visibles sur ordinateur, d\u00e9filement au doigt\n     * sur mobile), fl\u00e8ches affich\u00e9es seulement s'il reste des cartes de ce c\u00f4t\u00e9.\n     *\/\n    function carousel(list, o, four) {\n      var wrap = el('div', 'ea-carousel' + (four ? ' ea-carousel--4' : ''));\n      var track = el('div', 'ea-carousel-track');\n      track.setAttribute('role', 'list');\n      list.forEach(function(e) {\n        var c = card(e, o);\n        c.setAttribute('role', 'listitem');\n        track.appendChild(c);\n      });\n      var prev = el('button', 'ea-carousel-btn ea-carousel-btn--prev', '\u2039');\n      var next = el('button', 'ea-carousel-btn ea-carousel-btn--next', '\u203a');\n      prev.type = next.type = 'button';\n      prev.setAttribute('aria-label', T.anim_prev_acts);\n      next.setAttribute('aria-label', T.anim_next_acts);\n      var step = function(dir) {\n        var first = track.firstElementChild;\n        var w = first ? first.getBoundingClientRect().width + 16 : track.clientWidth;\n        track.scrollBy({ left: dir * w * Math.max(1, Math.floor(track.clientWidth \/ w)), behavior: 'smooth' });\n      };\n      prev.addEventListener('click', function() {\n        step(-1);\n      });\n      next.addEventListener('click', function() {\n        step(1);\n      });\n      var update = function() {\n        var max = track.scrollWidth - track.clientWidth;\n        prev.hidden = track.scrollLeft <= 4;\n        next.hidden = track.scrollLeft >= max - 4;\n      };\n      track.addEventListener('scroll', update, { passive: true });\n      window.addEventListener('resize', update);\n      wrap.appendChild(prev);\n      wrap.appendChild(track);\n      wrap.appendChild(next);\n      setTimeout(update, 0);\n      return wrap;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 4. TEMPS FORTS DE LA SEMAINE\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    function firstBusyDay(from) {\n      for (var i = 0; i < 7; i++) {\n        var d = addDays(from, i);\n        if (d >= TODAY && eventsOn(d).length) return d;\n      }\n      return null;\n    }\n\n    function renderWeek() {\n      var sec = document.getElementById('ea-sec-week');\n      sec.innerHTML = '';\n      var thisWeek = weekStart(TODAY);\n      var from = state.week || thisWeek;\n      var to = addDays(from, 6);\n      if (state.weekDay < from || state.weekDay > to) state.weekDay = firstBusyDay(from) || from;\n\n      var side = el('div', 'ea-head-side');\n      side.appendChild(el('span', null, tf('from_to', shortDate(from), shortDate(to))));\n      side.appendChild(round('\u2039', T.anim_prev_week, function() {\n        state.week = addDays(from, -7);\n        state.weekDay = state.week === thisWeek ? TODAY : state.week;\n        renderWeek();\n      }, from <= thisWeek));\n      side.appendChild(round('\u203a', T.anim_next_week, function() {\n        state.week = addDays(from, 7);\n        state.weekDay = firstBusyDay(state.week) || state.week;\n        renderWeek();\n      }));\n\n      var title = from === thisWeek ? T.anim_week_title :\n        (from === addDays(thisWeek, 7) ? T.anim_next_week_title : tf('anim_week_of', fmt(from, { day: 'numeric', month: 'long' })));\n      sec.appendChild(head('ea-week-title', 'calendar', title, null, side));\n\n      var days = el('div', 'ea-days');\n      days.setAttribute('role', 'group');\n      days.setAttribute('aria-label', T.anim_week_days);\n      for (var i = 0; i < 7; i++) {\n        (function(day) {\n          var n = eventsOn(day).length;\n          var b = el('button', 'ea-day' + (day === TODAY ? ' is-today' : '') + (n ? ' has-events' : ''));\n          b.type = 'button';\n          b.setAttribute('aria-pressed', day === state.weekDay ? 'true' : 'false');\n          b.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + (day === TODAY ? ' ' + T.anim_today_paren : '') + ' : ' + (n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing));\n          b.appendChild(el('span', 'ea-day-name', ucfirst(fmt(day, { weekday: 'short' }).replace('.', ''))));\n          b.appendChild(el('span', 'ea-day-date', shortDate(day)));\n          b.addEventListener('click', function() {\n            state.weekDay = day;\n            renderWeek();\n            var btn = document.querySelector('.ea-day[aria-pressed=\"true\"]');\n            if (btn) btn.focus();\n          });\n          days.appendChild(b);\n        })(addDays(from, i));\n      }\n      sec.appendChild(days);\n\n      var list = eventsOn(state.weekDay);\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_nothing_day, T.anim_pick_day));\n        return;\n      }\n      \/\/ Au-del\u00e0 de 4 activit\u00e9s : carrousel (4 cartes visibles) au lieu d'une grille qui s'allonge\n      sec.appendChild(list.length > 4 ? carousel(list, { day: state.weekDay }, true) : grid(list, { day: state.weekDay }, true));\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 5. TOUS LES \u00c9V\u00c9NEMENTS \u00c0 VENIR\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/** Liste d\u00e9roulante accessible (libell\u00e9 masqu\u00e9) *\/\n    function selectBox(label, options, value, onChange) {\n      var wrap = el('label');\n      wrap.appendChild(el('span', 'ea-sr', label));\n      var sel = el('select', 'ea-select');\n      options.forEach(function(o) {\n        var opt = el('option', null, o[1]);\n        opt.value = o[0];\n        opt.selected = value === o[0];\n        sel.appendChild(opt);\n      });\n      sel.addEventListener('change', function() {\n        onChange(sel.value);\n      });\n      wrap.appendChild(sel);\n      return wrap;\n    }\n\n    function renderUpcoming() {\n      var sec = document.getElementById('ea-sec-upcoming');\n      sec.innerHTML = '';\n\n      \/\/ Tri (le filtre cat\u00e9gorie est global, sous \u00ab Activit\u00e9s du jour \u00bb)\n      var side = el('div', 'ea-head-side');\n      side.appendChild(selectBox(T.anim_sort, [\n        ['date', T.anim_sort_date],\n        ['name', T.anim_sort_name]\n      ], state.sort, function(v) {\n        state.sort = v;\n        renderUpcoming();\n        focusUpcoming(0);\n      }));\n      sec.appendChild(head('ea-upcoming-title', 'leaf', T.anim_upcoming_title, null, side));\n\n      var list = EVENTS.filter(function(e) {\n        return visible(e) && e.end >= TODAY;\n      }).sort(function(a, b) {\n        if (state.sort === 'name') return a.name.localeCompare(b.name, T.date_locale);\n        var sa = a.start < TODAY ? TODAY : a.start;\n        var sb = b.start < TODAY ? TODAY : b.start;\n        return sa.localeCompare(sb) || byTime(a, b);\n      });\n\n      if (!list.length) {\n        sec.appendChild(empty(T.anim_no_upcoming, state.cat === 'all' ? T.anim_soon : T.anim_try_cat));\n        return;\n      }\n\n      sec.appendChild(grid(list.slice(0, state.upcomingLimit), { date: true }, true));\n\n      if (list.length > state.upcomingLimit) {\n        var more = el('div', 'ea-more');\n        var b = el('button', 'ea-btn ea-btn--soft', tf('anim_more', list.length - state.upcomingLimit));\n        b.appendChild(icon('arrow'));\n        b.type = 'button';\n        b.addEventListener('click', function() {\n          state.upcomingLimit += UPCOMING_STEP;\n          renderUpcoming();\n        });\n        more.appendChild(b);\n        sec.appendChild(more);\n      }\n    }\n\n    function setCat(key) {\n      state.cat = key;\n      rerenderAll();\n    }\n\n    function setScope(scope) {\n      state.scope = scope;\n      state.cat = 'all';\n      app.querySelectorAll('.ea-scope button').forEach(function(b) {\n        b.setAttribute('aria-pressed', b.getAttribute('data-scope') === scope ? 'true' : 'false');\n      });\n      rerenderAll();\n    }\n\n    function rerenderAll() {\n      state.upcomingLimit = UPCOMING_STEP;\n      state.todayAll = false;\n      renderToday();\n      renderWeek();\n      renderUpcoming();\n      renderCalendar();\n    }\n\n    \/** Apr\u00e8s un re-rendu, garde le focus sur la liste d\u00e9roulante utilis\u00e9e *\/\n    function focusUpcoming(i) {\n      var sel = document.querySelectorAll('#ea-sec-upcoming .ea-select')[i];\n      if (sel) sel.focus();\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ 6. CALENDRIER DU MOIS (secondaire, repliable)\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var MAX_LANES = 3;\n\n    \/** Place les \u00e9v\u00e9nements d'une semaine en couloirs sans chevauchement *\/\n    function layoutLanes(from, to) {\n      var items = eventsBetween(from, to).map(function(e) {\n        var s = e.start < from ? from : e.start;\n        var t = e.end > to ? to : e.end;\n        return { e: e, col: daysBetween(from, s) + 1, span: daysBetween(s, t) + 1, fromBefore: e.start < from, toAfter: e.end > to };\n      });\n      items.sort(function(a, b) {\n        return (a.col - b.col) || (b.span - a.span) || (a.e.start_time || '').localeCompare(b.e.start_time || '');\n      });\n      var ends = [];\n      items.forEach(function(it) {\n        var lane = 0;\n        while (ends[lane] !== undefined && ends[lane] >= it.col) lane++;\n        ends[lane] = it.col + it.span - 1;\n        it.lane = lane;\n      });\n      return items;\n    }\n\n    function renderCalendar() {\n      var sec = document.getElementById('ea-sec-calendar');\n      if (!sec) return; \/\/ calendrier masqu\u00e9 (r\u00e9glage ou calendrier=\"non\")\n      sec.innerHTML = '';\n\n      var toggle = el('button', 'ea-btn ea-btn--soft', state.calendarOpen ? T.anim_hide_cal : T.anim_show_cal);\n      toggle.appendChild(icon('arrow'));\n      toggle.type = 'button';\n      toggle.setAttribute('aria-expanded', state.calendarOpen ? 'true' : 'false');\n      toggle.setAttribute('aria-controls', 'ea-cal-panel');\n      toggle.addEventListener('click', function() {\n        state.calendarOpen = !state.calendarOpen;\n        renderCalendar();\n        var b = document.querySelector('#ea-sec-calendar [aria-controls=\"ea-cal-panel\"]');\n        if (b) b.focus();\n      });\n      sec.appendChild(head('ea-calendar-title', 'calendar', T.anim_cal_title, T.anim_cal_sub, toggle));\n\n      var panel = el('div', 'ea-cal-panel');\n      panel.id = 'ea-cal-panel';\n      panel.hidden = !state.calendarOpen;\n      sec.appendChild(panel);\n      if (!state.calendarOpen) return;\n\n      var first = state.month + '-01';\n      var firstDate = toDate(first);\n      var lastDay = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 0, 12));\n      var gridStart = weekStart(first);\n      var gridEnd = addDays(weekStart(lastDay), 6);\n\n      var bar = el('div', 'ea-cal-toolbar');\n      bar.appendChild(el('h3', 'ea-cal-month', ucfirst(fmt(first, { month: 'long', year: 'numeric' }))));\n      var nav = el('div', 'ea-head-side');\n      nav.appendChild(round('\u2039', T.anim_prev_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() - 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      nav.appendChild(round('\u203a', T.anim_next_month, function() {\n        state.month = toYmd(new Date(firstDate.getFullYear(), firstDate.getMonth() + 1, 1, 12)).slice(0, 7);\n        state.selectedDay = null;\n        renderCalendar();\n      }));\n      bar.appendChild(nav);\n      panel.appendChild(bar);\n\n      var month = el('div', 'ea-month');\n      var mh = el('div', 'ea-month-head');\n      \/\/ Lundi \u2192 dimanche, abr\u00e9g\u00e9s dans la langue de la page (5 janv. 2026 = un lundi)\n      [5, 6, 7, 8, 9, 10, 11].map(function(dd) { return ucfirst(fmt('2026-01-' + (dd < 10 ? '0' : '') + dd, { weekday: 'short' }).replace('.', '')); }).forEach(function(d) {\n        mh.appendChild(el('div', null, d));\n      });\n      month.appendChild(mh);\n      for (var ws = gridStart; ws <= gridEnd; ws = addDays(ws, 7)) month.appendChild(monthRow(ws));\n      panel.appendChild(month);\n\n      \/\/ D\u00e9tail uniquement apr\u00e8s un clic sur un jour\n      if (state.selectedDay) {\n        var dp = el('div', 'ea-daypanel');\n        dp.id = 'ea-daypanel';\n        dp.appendChild(el('h3', 'ea-daypanel-title', ucfirst(fmt(state.selectedDay, { weekday: 'long', day: 'numeric', month: 'long' }))));\n        var list = eventsOn(state.selectedDay);\n        dp.appendChild(list.length ? grid(list, { day: state.selectedDay }) : empty(T.anim_nothing_day));\n        panel.appendChild(dp);\n      }\n    }\n\n    function monthRow(from) {\n      var to = addDays(from, 6);\n      var items = layoutLanes(from, to);\n      var row = el('div', 'ea-mrow');\n      var hidden = [0, 0, 0, 0, 0, 0, 0];\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) {\n          for (var d = it.col; d < it.col + it.span; d++) hidden[d - 1]++;\n        }\n      });\n\n      for (var i = 0; i < 7; i++) {\n        (function(day, i) {\n          var inMonth = day.slice(0, 7) === state.month;\n          var cell = el('button', 'ea-mcell' + (inMonth ? '' : ' ea-mcell--out') + (day === state.selectedDay ? ' ea-mcell--selected' : ''));\n          cell.type = 'button';\n          cell.style.gridColumn = String(i + 1);\n          cell.setAttribute('aria-label', fmt(day, { weekday: 'long', day: 'numeric', month: 'long' }) + ' : ' + (function(n) { return n ? tf(n > 1 ? 'anim_activities' : 'anim_activity', n) : T.anim_nothing; })(eventsOn(day).length));\n          cell.addEventListener('click', function() {\n            state.selectedDay = day;\n            if (!inMonth) state.month = day.slice(0, 7);\n            renderCalendar();\n            var dp = document.getElementById('ea-daypanel');\n            if (dp && dp.scrollIntoView) dp.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n          });\n          row.appendChild(cell);\n\n          var num = el('span', 'ea-mnum' + (inMonth ? '' : ' ea-mnum--out') + (day === TODAY ? ' ea-mnum--today' : ''), String(toDate(day).getDate()));\n          num.style.gridColumn = String(i + 1);\n          row.appendChild(num);\n\n          if (hidden[i]) {\n            var more = el('span', 'ea-mmore', '+' + hidden[i]);\n            more.style.gridColumn = String(i + 1);\n            row.appendChild(more);\n          }\n        })(addDays(from, i), i);\n      }\n\n      items.forEach(function(it) {\n        if (it.lane >= MAX_LANES) return;\n        var e = it.e;\n        var b = el('button', 'ea-mbar' +\n          (it.fromBefore ? ' ea-mbar--from-before' : '') +\n          (it.toAfter ? ' ea-mbar--to-after' : '') +\n          (e.end < TODAY ? ' ea-mbar--ended' : ''), ((!it.fromBefore && e.start_time) ? e.start_time + ' ' : '') + e.name);\n        b.type = 'button';\n        b.title = e.name;\n        applyCat(b, e.category);\n        b.style.gridColumn = it.col + ' \/ span ' + it.span;\n        b.style.gridRow = String(it.lane + 2);\n        b.addEventListener('click', function() {\n          openModal(e);\n        });\n        row.appendChild(b);\n      });\n      return row;\n    }\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ MODAL \u2014 d\u00e9plac\u00e9e dans <body> pour \u00e9chapper \u00e0 la largeur max du contenu\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    var modal = document.getElementById('ea-modal');\n    if (modal && modal.parentNode !== document.body) document.body.appendChild(modal);\n    var modalContent = document.getElementById('ea-modal-content');\n    var lastFocus = null;\n\n    function openModal(e) {\n      lastFocus = document.activeElement;\n      modalContent.innerHTML = '';\n\n      if (e.image || DEFAULT_IMG) {\n        var img = media(e, 'ea-modal-img');\n        img.loading = 'eager';\n        var mm = el('div', 'ea-modal-media');\n        mm.appendChild(img);\n        var mcr = credit(e);\n        if (mcr) mm.appendChild(mcr);\n        modalContent.appendChild(mm);\n      }\n\n      var body = el('div', 'ea-modal-body');\n      if (catLabel(e)) body.appendChild(pill(e));\n      var t = el('h2', 'ea-modal-title', e.name);\n      t.id = 'ea-modal-title';\n      body.appendChild(t);\n\n      var info = el('div', 'ea-modal-info');\n      var when = el('span');\n      when.appendChild(icon('calendar'));\n      when.appendChild(document.createTextNode(fullWhenLabel(e)));\n      info.appendChild(when);\n      if (placeLabel(e)) {\n        var where = el('span');\n        where.appendChild(icon(e.onsite ? 'tent' : 'pin'));\n        where.appendChild(document.createTextNode(placeLabel(e)));\n        info.appendChild(where);\n      }\n      if (e.registration) {\n        var reg = el('span');\n        reg.appendChild(icon('pen'));\n        reg.appendChild(el('strong', null, T.registration));\n        info.appendChild(reg);\n      }\n      body.appendChild(info);\n\n      if (e.description) body.appendChild(el('p', 'ea-modal-desc', e.description));\n\n      if (e.link) {\n        var a = el('a', 'ea-btn', T.anim_more_info);\n        a.href = e.link;\n        a.target = '_blank';\n        a.rel = 'noopener';\n        a.appendChild(icon('external'));\n        a.appendChild(el('span', 'ea-sr', T.anim_new_tab));\n        body.appendChild(a);\n      }\n      modalContent.appendChild(body);\n\n      modal.hidden = false;\n      document.documentElement.style.overflow = 'hidden';\n      document.getElementById('ea-modal-close').focus();\n    }\n\n    function closeModal() {\n      modal.hidden = true;\n      document.documentElement.style.overflow = '';\n      if (lastFocus && lastFocus.focus) lastFocus.focus();\n    }\n\n    document.getElementById('ea-modal-close').addEventListener('click', closeModal);\n    modal.addEventListener('click', function(ev) {\n      if (ev.target === modal) closeModal();\n    });\n    document.addEventListener('keydown', function(ev) {\n      if (modal.hidden) return;\n      if (ev.key === 'Escape') closeModal();\n      \/\/ Focus gard\u00e9 dans la modal\n      if (ev.key === 'Tab') {\n        var f = modal.querySelectorAll('button, a[href]');\n        if (!f.length) return;\n        var firstF = f[0],\n          lastF = f[f.length - 1];\n        if (ev.shiftKey && document.activeElement === firstF) {\n          ev.preventDefault();\n          lastF.focus();\n        } else if (!ev.shiftKey && document.activeElement === lastF) {\n          ev.preventDefault();\n          firstF.focus();\n        }\n      }\n    });\n\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/\/ NAVIGATION RAPIDE + SUIVI DE SECTION\n    \/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n    \/**\n     * Hauteur occup\u00e9e en haut de l'\u00e9cran par les barres fixes \/ collantes du site\n     * (barre d'admin, en-t\u00eate, barre de r\u00e9servation\u2026), quelle que soit leur classe :\n     * on sonde le haut de l'\u00e9cran et on empile les barres trouv\u00e9es.\n     *\/\n    function headerOffset() {\n      var bottom = 0;\n      var vw = window.innerWidth,\n        vh = window.innerHeight;\n      var isBar = function(el) {\n        if (!el || el === document.body || el === document.documentElement) return false;\n        if (el.closest('#ea-app, .ea-modal-overlay, .mv-modal-overlay')) return false;\n        var pos = getComputedStyle(el).position;\n        if (pos !== 'fixed' && pos !== 'sticky') return false;\n        var r = el.getBoundingClientRect();\n        \/\/ vraie barre : large, pas trop haute (exclut bulles de chat, boutons flottants, popups)\n        return r.width >= vw * 0.3 && r.height > 0 && r.height < vh * 0.45;\n      };\n      for (var pass = 0; pass < 5; pass++) {\n        var y = bottom + 2,\n          found = 0;\n        if (y >= vh * 0.5) break;\n        [0.15, 0.5, 0.85].forEach(function(fx) {\n          (document.elementsFromPoint(vw * fx, y) || []).forEach(function(el) {\n            for (var n = el; n && n !== document.body; n = n.parentElement) {\n              if (isBar(n)) {\n                var r = n.getBoundingClientRect();\n                if (r.top <= y + 1 && r.bottom > found) found = r.bottom;\n                break;\n              }\n            }\n          });\n        });\n        if (found <= bottom) break;\n        bottom = found;\n      }\n      app.style.setProperty('--ea-header', Math.round(bottom) + 'px');\n      return bottom;\n    }\n\n    var navLinks = Array.prototype.slice.call(app.querySelectorAll('.ea-nav a'));\n\n    function setCurrent(id) {\n      navLinks.forEach(function(a) {\n        a.setAttribute('aria-current', a.getAttribute('href') === '#' + id ? 'true' : 'false');\n      });\n    }\n\n    navLinks.forEach(function(a) {\n      a.addEventListener('click', function(ev) {\n        var target = document.getElementById(a.getAttribute('href').slice(1));\n        if (!target) return;\n        ev.preventDefault();\n        if (a.getAttribute('href') === '#ea-sec-calendar' && !state.calendarOpen) {\n          state.calendarOpen = true;\n          renderCalendar();\n        }\n        setCurrent(target.id);\n        target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      });\n    });\n\n    if ('IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function(entries) {\n        entries.forEach(function(en) {\n          if (en.isIntersecting) setCurrent(en.target.id);\n        });\n      }, { rootMargin: '-35% 0px -55% 0px' });\n      ['ea-sec-today', 'ea-sec-week', 'ea-sec-upcoming', 'ea-sec-calendar'].forEach(function(id) {\n        var sec = document.getElementById(id);\n        if (sec) io.observe(sec);\n      });\n    }\n\n    var ticking = false;\n    window.addEventListener('scroll', function() {\n      if (ticking) return;\n      ticking = true;\n      requestAnimationFrame(function() {\n        headerOffset();\n        ticking = false;\n      });\n    }, { passive: true });\n    window.addEventListener('resize', headerOffset);\n\n    \/\/ Semaine : on ouvre sur le prochain jour anim\u00e9 (aujourd'hui est d\u00e9j\u00e0 en haut de page)\n    (function() {\n      var ws = weekStart(TODAY);\n      for (var d = addDays(TODAY, 1); d <= addDays(ws, 6); d = addDays(d, 1)) {\n        if (eventsOn(d).length) {\n          state.weekDay = d;\n          return;\n        }\n      }\n    })();\n\n    app.querySelectorAll('.ea-scope button').forEach(function(b) {\n      b.addEventListener('click', function() {\n        setScope(b.getAttribute('data-scope'));\n      });\n    });\n\n    headerOffset();\n    renderToday();\n    renderWeek();\n    renderUpcoming();\n    renderCalendar();\n  })();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"sujet":[],"class_list":["post-47491","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/pages\/47491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/comments?post=47491"}],"version-history":[{"count":1,"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/pages\/47491\/revisions"}],"predecessor-version":[{"id":47492,"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/pages\/47491\/revisions\/47492"}],"wp:attachment":[{"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/media?parent=47491"}],"wp:term":[{"taxonomy":"sujet","embeddable":true,"href":"https:\/\/www.lespialades.com\/en\/wp-json\/wp\/v2\/sujet?post=47491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}