{"id":6291,"date":"2026-03-03T09:12:48","date_gmt":"2026-03-03T08:12:48","guid":{"rendered":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/"},"modified":"2026-03-03T09:12:48","modified_gmt":"2026-03-03T08:12:48","slug":"elaia-metadatas","status":"publish","type":"page","link":"https:\/\/www.campinglesviolettes.com\/en\/elaia-metadatas\/","title":{"rendered":"Discover your surroundings"},"content":{"rendered":"\n\n\n<style>\n  html {\n    scroll-behavior: smooth;\n  }\n\n  .em-wrap.em-mobile-filters-open {\n    z-index: 100000 !important;\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     BASE \u2014 Layout principal et typographie\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  .em-wrap {\n    position: relative !important;\n    z-index: 10 !important;\n    isolation: isolate;\n\n    display: flex;\n    flex-direction: column;\n    \/* Hauteur auto : la page coule naturellement et le footer du th\u00e8me suit le contenu.\n       Anciennement height:calc(100vh - --em-header-offset) qui for\u00e7ait un viewport entier\n       et faisait appara\u00eetre le footer \u00e0 un endroit bizarre. *\/\n\n    font-family: 'Inter', -apple-system, sans-serif !important;\n    color: #0f172a;\n    max-width: 1400px;\n    margin: 0 auto;\n    padding: 0 24px 40px;\n    -webkit-font-smoothing: antialiased;\n  }\n\n  .em-wrap * {\n    box-sizing: border-box;\n  }\n\n  \/* \u2500\u2500\u2500 Header \u2014 Titre + barre de recherche \u2500\u2500\u2500 *\/\n  .em-header {\n    padding: 40px 0 24px;\n    display: flex;\n    align-items: flex-end;\n    justify-content: space-between;\n    gap: 16px;\n    flex-wrap: wrap;\n    flex-shrink: 0;\n    \/* le header ne se compresse pas *\/\n  }\n\n  .em-header-title {\n    font-size: 24px !important;\n    font-weight: 800 !important;\n    margin: 0 !important;\n    color: #0f172a;\n  }\n\n  .em-header-sub {\n    font-size: 14px;\n    color: #64748b;\n    margin: 4px 0 0;\n  }\n\n  \/* \u2500\u2500\u2500 Recherche \u2014 Champ avec ic\u00f4ne loupe \u2500\u2500\u2500 *\/\n  .em-search-wrap {\n    position: relative;\n  }\n\n  .em-sidebar .em-search-wrap {\n    margin-top: 16px;\n  }\n\n  .em-search-icon {\n    position: absolute;\n    left: 12px;\n    top: 50%;\n    transform: translateY(-50%);\n    width: 16px;\n    height: 16px;\n    color: #94a3b8;\n    pointer-events: none;\n  }\n\n  .em-search {\n    width: 100% !important;\n    padding: 10px 16px 10px 36px !important;\n    font-size: 14px !important;\n    font-family: inherit;\n    border: 1px solid #e2e8f0 !important;\n    border-radius: 12px !important;\n    background: #fff !important;\n    color: #0f172a;\n    outline: none;\n  }\n\n  .em-search:focus {\n    border-color: #3b82f6 !important;\n    box-shadow: 0 0 0 3px #3b82f618 !important;\n  }\n\n  .em-search::placeholder {\n    color: #94a3b8;\n  }\n\n  .em-main {\n    flex: 1;\n    min-width: 0;\n    width: 100%;\n    display: flex;\n    flex-direction: column;\n    gap: 24px;\n  }\n\n  \/* \u2500\u2500\u2500 Onglets \u2014 Filtrage par cat\u00e9gorie \u2500\u2500\u2500 *\/\n  \/* --em-header-offset est calcul\u00e9 au runtime par le JS (hauteur d'un header sticky\/fix\u00e9 du th\u00e8me, sinon 0) *\/\n  .em-tabs {\n    display: flex !important;\n    flex-wrap: wrap;\n    gap: 8px;\n    flex-shrink: 0;\n  }\n\n  \/* Overlay opaque sous le header du th\u00e8me, affich\u00e9 uniquement pendant le scroll \u2014 masque les cards qui d\u00e9filent \u00e0 travers un header semi-transparent *\/\n  #em-header-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--em-header-offset, 0px);\n    pointer-events: none;\n    opacity: 0;\n    transition: opacity 0.15s;\n  }\n\n  html.em-scrolled #em-header-overlay {\n    opacity: 1;\n  }\n\n  .em-tab {\n    flex: 0 1 auto;\n    max-width: 100%;\n    padding: 8px 16px;\n    border-radius: 8px;\n    font-size: 14px;\n    font-weight: 500;\n    cursor: pointer;\n    border: 1px solid #e2e8f0;\n    background: #fff;\n    color: #64748b;\n    transition: all 0.15s;\n    font-family: inherit;\n    white-space: normal;\n    overflow-wrap: anywhere;\n    text-align: left;\n  }\n\n  .em-tab:hover {\n    border-color: #cbd5e1;\n  }\n\n  .em-tab.active {\n    background: #3b82f6 !important;\n    color: #fff !important;\n    border-color: #3b82f6 !important;\n  }\n\n  .em-tab-count {\n    margin-left: 6px;\n    font-size: 12px;\n    opacity: 0.7;\n  }\n\n  .em-main-body {\n    display: flex;\n    flex-direction: column;\n    gap: 24px;\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     CARTE \u2014 Leaflet + l\u00e9gende + marqueurs\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  .em-map-section {\n    \/* margin-bottom: 24px; *\/\n    isolation: isolate;\n  }\n\n  .em-map-section--hidden {\n    display: none;\n  }\n\n  .em-map-wrap {\n    border-radius: 16px;\n    overflow: hidden;\n    border: 1px solid #e2e8f0;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n  }\n\n  .em-map {\n    height: 420px;\n    width: 100%;\n  }\n\n  \/* Personnalisation des popups Leaflet *\/\n  .em-map .leaflet-popup-content-wrapper {\n    border-radius: 12px;\n    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n    padding: 0;\n    overflow: hidden;\n  }\n\n  .em-map .leaflet-popup-content {\n    margin: 0;\n    min-width: 200px;\n  }\n\n  .em-map .leaflet-popup-tip {\n    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n  }\n\n  .em-map-popup {\n    padding: 12px 14px;\n  }\n\n  .em-map-popup-name {\n    font-size: 14px;\n    font-weight: 700;\n    color: #0f172a;\n    margin: 0 0 4px;\n    line-height: 1.3;\n  }\n\n  .em-map-popup-cat {\n    font-size: 11px;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: 0.3px;\n    margin: 0 0 8px;\n  }\n\n  .em-map-popup-btn {\n    display: inline-flex;\n    align-items: center;\n    gap: 4px;\n    font-size: 12px;\n    font-weight: 600;\n    color: #3b82f6;\n    cursor: pointer;\n    background: none;\n    border: none;\n    padding: 0;\n    font-family: inherit;\n  }\n\n  .em-map-popup-btn:hover {\n    text-decoration: underline;\n  }\n\n  \/* L\u00e9gende de la carte *\/\n  .em-map-legend {\n    display: flex;\n    gap: 16px;\n    padding: 10px 16px;\n    background: #fff;\n    border-top: 1px solid #e2e8f0;\n    flex-wrap: wrap;\n  }\n\n  .em-map-legend-item {\n    display: flex;\n    min-width: 0;\n    max-width: 100%;\n    align-items: center;\n    gap: 6px;\n    font-size: 12px;\n    font-weight: 600;\n    color: #64748b;\n    cursor: pointer;\n    transition: opacity 0.15s;\n    overflow-wrap: anywhere;\n  }\n\n  .em-map-legend-item:hover {\n    opacity: 0.7;\n  }\n\n  .em-map-legend-item--off {\n    opacity: 0.3;\n  }\n\n  .em-map-legend-item--off .em-map-legend-dot {\n    background: #cbd5e1 !important;\n    box-shadow: none !important;\n  }\n\n  .em-map-legend-dot {\n    width: 10px;\n    height: 10px;\n    border-radius: 50%;\n    flex-shrink: 0;\n    box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.08);\n  }\n\n  \/* Bouton toggle carte *\/\n  .em-map-toggle {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    padding: 8px 14px;\n    border-radius: 8px;\n    border: 1px solid #e2e8f0;\n    background: #fff;\n    color: #64748b;\n    font-size: 13px;\n    font-weight: 600;\n    cursor: pointer;\n    font-family: inherit;\n    transition: all 0.15s;\n    margin-bottom: 16px;\n  }\n\n  .em-map-toggle:hover {\n    border-color: #3b82f6;\n    color: #3b82f6;\n  }\n\n  .em-map-toggle.active {\n    background: #3b82f6;\n    color: #fff;\n    border-color: #3b82f6;\n  }\n\n  \/* Quand le bouton Carte est plac\u00e9 dans la barre des onglets, alignement avec .em-tab *\/\n  .em-tabs .em-map-toggle {\n    font-size: 14px;\n    padding: 8px 16px;\n    margin-bottom: 0;\n    flex-shrink: 0;\n  }\n\n  \/* Marqueurs personnalis\u00e9s SVG *\/\n  .em-marker {\n    transition: transform 0.15s ease;\n  }\n\n  .em-marker:hover {\n    transform: scale(1.3);\n    z-index: 1000 !important;\n  }\n\n  .em-marker--active {\n    transform: scale(1.4);\n    z-index: 1000 !important;\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     LAYOUT \u2014 Sidebar filtres + grille cards\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  .em-layout {\n    display: flex;\n    min-width: 0;\n    width: 100%;\n    gap: 24px;\n    align-items: flex-start;\n    scroll-margin-top: calc(var(--em-header-offset, 0px) + 16px);\n  }\n\n  .em-sidebar {\n    flex: 0 0 285px;\n    position: sticky;\n    top: calc(var(--em-header-offset, 0px) + 24px);\n    align-self: flex-start;\n    max-height: calc(100vh - var(--em-header-offset, 0px) - 48px);\n    overflow-y: auto;\n    scroll-behavior: smooth;\n  }\n\n\n  \/* \u2500\u2500\u2500 Filtres lat\u00e9raux \u2500\u2500\u2500 *\/\n  .em-filters {\n    background: #fff;\n    border-radius: 12px;\n    padding: 20px;\n    border: 1px solid #e2e8f0;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n  }\n\n  .em-filters-title {\n    width: 100%;\n    padding: 0;\n    border: 0;\n    background: none;\n    text-align: left;\n    font-family: inherit;\n    font-size: 15px !important;\n    font-weight: 700 !important;\n    margin: 0 0 16px !important;\n    color: #0f172a;\n  }\n\n  .em-filters-title-main {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n  }\n\n  .em-filters-title-icon {\n    width: 18px;\n    height: 18px;\n    flex-shrink: 0;\n  }\n\n  .em-filters-title-hint {\n    display: none;\n  }\n\n  .em-filter-group {\n    margin-bottom: 18px;\n  }\n\n  .em-filter-group:last-child {\n    margin-bottom: 0;\n  }\n\n  .em-filter-label {\n    display: block;\n    font-size: 12px;\n    font-weight: 700;\n    color: #94a3b8;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    margin-bottom: 8px;\n  }\n\n  .em-filter-check {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 5px 0;\n    cursor: pointer;\n  }\n\n  .em-filter-check input[type=\"checkbox\"] {\n    cursor: pointer;\n    accent-color: #3b82f6;\n    width: 15px;\n    height: 15px;\n  }\n\n  .em-filter-check span {\n    font-size: 13px;\n    color: #64748b;\n    font-weight: 500;\n  }\n\n  .em-filter-reset {\n    width: 100%;\n    padding: 10px;\n    background: #0f172a;\n    color: #fff;\n    border: none;\n    border-radius: 8px;\n    font-size: 13px;\n    font-weight: 600;\n    cursor: pointer;\n    font-family: inherit;\n    margin-top: 16px;\n  }\n\n  .em-filter-reset:hover {\n    background: #000;\n  }\n\n  \/* \u2500\u2500\u2500 Compteurs \u2500\u2500\u2500 *\/\n  .em-stats {\n    display: flex;\n    gap: 8px;\n    margin-bottom: 20px;\n    flex-wrap: wrap;\n    justify-content: center;\n  }\n\n  .em-stat {\n    background: #fff;\n    border: 1px solid #e2e8f0;\n    border-radius: 8px;\n    padding: 8px 14px;\n    font-size: 13px;\n    color: #64748b;\n  }\n\n  .em-stat strong {\n    color: #0f172a;\n    font-weight: 700;\n    margin-left: 4px;\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     CARDS \u2014 Grille de fiches m\u00e9tadonn\u00e9es\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  .em-cards {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)) !important;\n    gap: 20px !important;\n  }\n\n  .em-card {\n    background: #fff !important;\n    border: 1px solid #e2e8f0 !important;\n    border-radius: 12px !important;\n    overflow: hidden !important;\n    cursor: pointer;\n    transition: all 0.2s;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n    display: block !important;\n  }\n\n  .em-card.em-hidden {\n    display: none !important;\n  }\n\n  .em-card:hover {\n    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.07) !important;\n    transform: translateY(-2px);\n    border-color: #3b82f6 !important;\n  }\n\n  .em-card--highlight {\n    box-shadow: 0 0 0 3px #3b82f6 !important;\n  }\n\n  \/* Image de la card *\/\n  .em-card-img-wrap {\n    position: relative;\n  }\n\n  .em-card-img {\n    width: 100% !important;\n    height: 160px !important;\n    object-fit: cover !important;\n    display: block !important;\n    background: #f1f5f9;\n  }\n\n  .em-card-placeholder {\n    width: 100%;\n    height: 160px;\n    background: linear-gradient(135deg, #f1f5f9, #e2e8f0);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: #94a3b8;\n    font-size: 14px;\n    font-weight: 500;\n  }\n\n  .em-card-badge {\n    position: absolute;\n    top: 10px;\n    left: 10px;\n    max-width: calc(100% - 20px);\n    padding: 4px 10px;\n    border-radius: 6px;\n    font-size: 11px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.3px;\n    backdrop-filter: blur(8px);\n    white-space: normal;\n    overflow-wrap: anywhere;\n    line-height: 1.25;\n  }\n\n  \/* Badges de cat\u00e9gorie (couleurs par type) *\/\n  .badge-accom {\n    background: rgba(16, 185, 129, 0.9);\n    color: #fff;\n  }\n\n  .badge-city {\n    background: rgba(59, 130, 246, 0.9);\n    color: #fff;\n  }\n\n  .badge-activity {\n    background: rgba(168, 85, 247, 0.9);\n    color: #fff;\n  }\n\n  .badge-event {\n    background: rgba(239, 68, 68, 0.9);\n    color: #fff;\n  }\n\n  .badge-restaurant {\n    background: rgba(245, 158, 11, 0.9);\n    color: #fff;\n  }\n\n  .badge-service {\n    background: rgba(99, 102, 241, 0.9);\n    color: #fff;\n  }\n\n  .badge-default {\n    background: rgba(100, 116, 139, 0.9);\n    color: #fff;\n  }\n\n  \/* Contenu de la card *\/\n  .em-card-body {\n    padding: 16px;\n  }\n\n  .em-card-title {\n    font-size: 15px !important;\n    font-weight: 700 !important;\n    margin: 0 0 8px !important;\n    color: #0f172a;\n    line-height: 1.3;\n  }\n\n  .em-card-tags {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 5px;\n    margin-bottom: 10px;\n  }\n\n  .em-tag {\n    display: inline-flex;\n    align-items: center;\n    gap: 3px;\n    padding: 3px 8px;\n    border-radius: 5px;\n    font-size: 11px;\n    font-weight: 600;\n    background: #f1f5f9;\n    color: #64748b;\n  }\n\n  .em-tag-blue {\n    background: #dbeafe;\n    color: #1e40af;\n  }\n\n  .em-tag-green {\n    background: #d1fae5;\n    color: #065f46;\n  }\n\n  .em-tag-orange {\n    background: #fed7aa;\n    color: #92400e;\n  }\n\n  .em-tag-purple {\n    background: #ede9fe;\n    color: #6b21a8;\n  }\n\n  \/* Champs r\u00e9sum\u00e9s visibles sur la card *\/\n  .em-card-fields {\n    margin-bottom: 10px;\n  }\n\n  .em-card-field {\n    display: flex;\n    gap: 6px;\n    font-size: 12px;\n    margin-bottom: 4px;\n  }\n\n  .em-card-field-label {\n    color: #94a3b8;\n    flex-shrink: 0;\n  }\n\n  .em-card-field-value {\n    color: #0f172a;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n\n  \/* Pied de card *\/\n  .em-card-footer {\n    padding-top: 10px;\n    border-top: 1px solid #e2e8f0;\n    display: flex;\n    align-items: center;\n    gap: 4px;\n    font-size: 12px;\n    font-weight: 600;\n    color: #3b82f6;\n  }\n\n  .em-card-footer svg {\n    width: 14px;\n    height: 14px;\n    transition: transform 0.15s;\n  }\n\n  .em-card:hover .em-card-footer svg {\n    transform: translateX(2px);\n  }\n\n  \/* \u00c9tat vide *\/\n  .em-empty {\n    text-align: center;\n    padding: 60px 20px;\n    color: #64748b;\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\u00e9tail d'une fiche\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  .em-modal-overlay {\n    position: fixed;\n    inset: 0;\n    background: rgba(0, 0, 0, 0.5);\n    backdrop-filter: blur(4px);\n    z-index: 99999;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 16px;\n    animation: emFadeIn 0.2s ease;\n  }\n\n  @keyframes emFadeIn {\n    from {\n      opacity: 0\n    }\n\n    to {\n      opacity: 1\n    }\n  }\n\n  .em-modal {\n    background: #fff;\n    border-radius: 16px;\n    max-width: 640px;\n    width: 100%;\n    max-height: 85vh;\n    overflow: hidden;\n    box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.08);\n    display: flex;\n    flex-direction: column;\n    animation: emSlideUp 0.25s ease;\n  }\n\n  @keyframes emSlideUp {\n    from {\n      opacity: 0;\n      transform: translateY(20px)\n    }\n\n    to {\n      opacity: 1;\n      transform: translateY(0)\n    }\n  }\n\n  \/* Modal avec image *\/\n  .em-modal-img-wrap {\n    position: relative;\n    flex-shrink: 0;\n  }\n\n  .em-modal-img {\n    width: 100%;\n    height: 220px;\n    object-fit: cover;\n    display: block;\n  }\n\n  .em-modal-img-gradient {\n    position: absolute;\n    inset: 0;\n    background: linear-gradient(to top, rgba(0, 0, 0, 0.4), transparent);\n  }\n\n  .em-modal-img-info {\n    position: absolute;\n    bottom: 16px;\n    left: 20px;\n    right: 20px;\n  }\n\n  .em-modal-img-cat {\n    font-size: 12px;\n    font-weight: 500;\n    color: rgba(255, 255, 255, 0.8);\n    margin: 0 0 4px;\n  }\n\n  .em-modal-img-title {\n    font-size: 20px;\n    font-weight: 800;\n    color: #fff;\n    margin: 0;\n  }\n\n  .em-modal-close {\n    position: absolute;\n    top: 12px;\n    right: 12px;\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    background: rgba(0, 0, 0, 0.4);\n    color: #fff;\n    border: none;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 16px;\n  }\n\n  .em-modal-close:hover {\n    background: rgba(0, 0, 0, 0.6);\n  }\n\n  \/* Modal sans image *\/\n  .em-modal-header-noimg {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 20px 24px;\n    border-bottom: 1px solid #e2e8f0;\n  }\n\n  .em-modal-header-noimg-cat {\n    font-size: 12px;\n    color: #94a3b8;\n    margin: 0 0 2px;\n  }\n\n  .em-modal-header-noimg-title {\n    font-size: 18px;\n    font-weight: 800;\n    color: #0f172a;\n    margin: 0;\n  }\n\n  .em-modal-close-noimg {\n    width: 32px;\n    height: 32px;\n    border-radius: 8px;\n    border: none;\n    cursor: pointer;\n    color: #94a3b8;\n    background: none;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 16px;\n  }\n\n  .em-modal-close-noimg:hover {\n    background: #f1f5f9;\n    color: #0f172a;\n  }\n\n  \/* Corps et entr\u00e9es de la modal *\/\n  .em-modal-body {\n    padding: 20px 24px;\n    overflow-y: auto;\n    flex: 1;\n    scroll-behavior: smooth;\n  }\n\n  .em-modal-entry {\n    margin-bottom: 16px;\n  }\n\n  .em-modal-entry-label {\n    font-size: 11px;\n    font-weight: 700;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    color: #94a3b8;\n    margin: 0 0 4px;\n  }\n\n  .em-modal-entry-value {\n    font-size: 14px;\n    color: #0f172a;\n    margin: 0;\n    line-height: 1.5;\n    white-space: pre-line;\n  }\n\n  \/* Badge date d'\u00e9v\u00e9nement *\/\n  .em-modal-event {\n    display: inline-flex;\n    align-items: center;\n    padding: 6px 12px;\n    margin-bottom: 16px;\n    background: #fff7ed;\n    color: #c2410c;\n    border-radius: 8px;\n    font-size: 13px;\n    font-weight: 600;\n  }\n\n  \/* Player vid\u00e9o *\/\n  .em-modal-video-wrap {\n    position: relative;\n    width: 100%;\n    padding-top: 56.25%;\n    overflow: hidden;\n    border-radius: 8px;\n    background: #000;\n  }\n\n  .em-modal-video-wrap iframe {\n    position: absolute;\n    inset: 0;\n    width: 100%;\n    height: 100%;\n    border: 0;\n  }\n\n  .em-modal-video-file {\n    width: 100%;\n    border-radius: 8px;\n    background: #000;\n    display: block;\n  }\n\n  \/* Galerie d'images *\/\n  .em-modal-gallery {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 8px;\n  }\n\n  @media (min-width: 480px) {\n    .em-modal-gallery {\n      grid-template-columns: repeat(4, 1fr);\n    }\n  }\n\n  .em-modal-gallery-item {\n    display: block;\n    aspect-ratio: 1 \/ 1;\n    border-radius: 8px;\n    overflow: hidden;\n    border: 1px solid #e2e8f0;\n    background: #f1f5f9;\n    transition: transform .15s ease, border-color .15s ease;\n  }\n\n  .em-modal-gallery-item:hover {\n    transform: scale(1.03);\n    border-color: #cbd5e1;\n  }\n\n  .em-modal-gallery-item img {\n    width: 100%;\n    height: 100%;\n    object-fit: cover;\n    display: block;\n  }\n\n  \/* Documents PDF *\/\n  .em-modal-docs {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n    display: flex;\n    flex-direction: column;\n    gap: 6px;\n  }\n\n  .em-modal-doc {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 8px 12px;\n    border: 1px solid #fce7f3;\n    background: rgba(253, 242, 248, .6);\n    color: #be185d;\n    border-radius: 8px;\n    text-decoration: none;\n    font-size: 14px;\n    transition: border-color .15s ease, background .15s ease;\n  }\n\n  .em-modal-doc:hover {\n    border-color: #f9a8d4;\n    background: #fdf2f8;\n  }\n\n  .em-modal-doc svg {\n    flex-shrink: 0;\n  }\n\n  .em-modal-doc-name {\n    flex: 1;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    font-weight: 500;\n  }\n\n  .em-modal-doc-type {\n    flex-shrink: 0;\n    padding: 2px 6px;\n    background: #fce7f3;\n    color: #be185d;\n    border-radius: 4px;\n    font-size: 10px;\n    font-weight: 600;\n    text-transform: uppercase;\n    letter-spacing: .04em;\n  }\n\n  \/* Questions fr\u00e9quentes *\/\n  .em-modal-faq {\n    margin-top: 16px;\n    padding-top: 16px;\n    border-top: 1px solid #e2e8f0;\n  }\n\n  .em-modal-faq-item {\n    margin-top: 12px;\n    border: 1px solid #e2e8f0;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #f8fafc;\n  }\n\n  .em-modal-faq-q {\n    padding: 10px 12px;\n    font-size: 13px;\n    font-weight: 600;\n    color: #0f172a;\n  }\n\n  .em-modal-faq-a {\n    padding: 10px 12px;\n    font-size: 13px;\n    color: #475569;\n    line-height: 1.5;\n    border-top: 1px solid #e2e8f0;\n    background: #fff;\n    white-space: pre-line;\n  }\n\n  .em-modal-faq-a-empty {\n    color: #94a3b8;\n    font-style: italic;\n  }\n\n  \/* Pied de modal *\/\n  .em-modal-footer {\n    padding: 16px 24px;\n    border-top: 1px solid #e2e8f0;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n  }\n\n  .em-modal-link {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 14px;\n    font-weight: 600;\n    color: #3b82f6;\n    text-decoration: none;\n  }\n\n  .em-modal-link:hover {\n    opacity: 0.8;\n  }\n\n  .em-modal-close-btn {\n    padding: 8px 16px;\n    font-size: 14px;\n    font-weight: 500;\n    color: #64748b;\n    background: none;\n    border: none;\n    cursor: pointer;\n    font-family: inherit;\n  }\n\n  .em-modal-close-btn:hover {\n    color: #0f172a;\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     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: 1024px) {\n    .em-layout {\n      flex-direction: column;\n    }\n\n    .em-sidebar {\n      flex-basis: auto;\n      height: auto;\n      position: static;\n      width: 100%;\n      max-height: none;\n      overflow: visible;\n    }\n\n    \/* Sidebar collapsible sur mobile *\/\n    .em-sidebar {\n      order: -1;\n    }\n\n    .em-filters {\n      padding: 14px;\n    }\n\n    .em-filters-title {\n      font-size: 14px !important;\n      margin-bottom: 0 !important;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n    }\n\n    .em-filters-title-hint {\n      display: block;\n      margin-top: 2px;\n      font-size: 12px;\n      line-height: 1.3;\n      font-weight: 500;\n      color: #64748b;\n    }\n\n    .em-filters-title::after {\n      content: 'Fermer';\n      margin-left: 12px;\n      font-size: 12px;\n      font-weight: 700;\n      color: #3b82f6;\n    }\n\n    .em-filters.collapsed .em-filters-title::after {\n      content: 'Ouvrir \u2192';\n      transform: none;\n    }\n\n    .em-filters.collapsed {\n      padding: 0;\n      border-color: #3b82f655;\n      background: #3b82f618;\n      box-shadow: none;\n    }\n\n    .em-filters.collapsed .em-filters-title {\n      padding: 14px 16px;\n    }\n\n    .em-filters.collapsed .em-stats,\n    .em-filters.collapsed .em-filter-group,\n    .em-filters.collapsed .em-filter-reset,\n    .em-filters.collapsed .em-search-wrap {\n      display: none;\n    }\n  }\n\n  @media (max-width: 720px) {\n    html.em-filters-open,\n    html.em-filters-open body {\n      overflow: hidden !important;\n    }\n\n    .em-wrap {\n      padding: 0 12px;\n    }\n\n    .em-header {\n      \/* flex-direction: column;\n      align-items: stretch; *\/\n      padding: 24px 0 16px;\n      gap: 12px;\n    }\n\n    .em-header-title {\n      font-size: 20px !important;\n    }\n\n    .em-search-wrap {\n      width: 100%;\n    }\n\n    .em-tabs {\n      gap: 6px;\n      margin-bottom: 16px;\n    }\n\n    .em-tab {\n      padding: 6px 12px;\n      font-size: 13px;\n    }\n\n    .em-tabs .em-map-toggle {\n      padding: 6px 12px;\n      font-size: 13px;\n    }\n\n    .em-filter-backdrop {\n      position: fixed;\n      inset: 0;\n      z-index: 100000;\n      background: rgba(15, 23, 42, 0.48);\n      opacity: 0;\n      visibility: hidden;\n      transition: opacity 0.2s ease, visibility 0.2s ease;\n    }\n\n    .em-filter-backdrop.is-visible {\n      opacity: 1;\n      visibility: visible;\n    }\n\n    .em-filters:not(.collapsed) {\n      position: fixed;\n      z-index: 100001;\n      top: max(16px, env(safe-area-inset-top));\n      right: 12px;\n      bottom: max(16px, env(safe-area-inset-bottom));\n      left: 12px;\n      max-height: none;\n      overflow-y: auto;\n      overscroll-behavior: contain;\n      scroll-behavior: smooth;\n      box-shadow: 0 24px 60px rgba(15, 23, 42, 0.24);\n    }\n\n    .em-filters:not(.collapsed) .em-filters-title {\n      position: sticky;\n      top: -14px;\n      z-index: 1;\n      margin: -14px -14px 16px !important;\n      padding: 14px;\n      background: #fff;\n      border-bottom: 1px solid #e2e8f0;\n    }\n\n    .em-filters:not(.collapsed) .em-filters-title::after {\n      content: '\u2715';\n      transform: none;\n      font-size: 16px;\n    }\n\n    \/* Carte mobile *\/\n    .em-map {\n      height: 280px;\n    }\n\n    .em-map-wrap {\n      border-radius: 12px;\n    }\n\n    .em-map-legend {\n      gap: 10px;\n      padding: 8px 12px;\n    }\n\n    .em-map-legend-item {\n      font-size: 11px;\n    }\n\n\n\n    \/* Cards mobile *\/\n    .em-cards {\n      grid-template-columns: 1fr !important;\n      gap: 14px !important;\n    }\n\n    .em-card-img,\n    .em-card-placeholder {\n      height: 140px !important;\n    }\n\n    .em-card-body {\n      padding: 12px;\n    }\n\n    .em-card-title {\n      font-size: 14px !important;\n    }\n\n    .em-card-tags {\n      gap: 4px;\n    }\n\n    .em-tag {\n      font-size: 10px;\n      padding: 2px 6px;\n    }\n\n    \/* Compteurs compacts *\/\n    .em-stats {\n      gap: 8px;\n      margin-bottom: 14px;\n    }\n\n    .em-stat {\n      padding: 6px 10px;\n      font-size: 12px;\n    }\n\n    \/* Modal \u2192 bottom sheet sur mobile *\/\n    .em-modal-overlay {\n      align-items: flex-end;\n      padding: 0;\n    }\n\n    .em-modal {\n      border-radius: 16px 16px 0 0;\n      max-height: 90vh;\n      max-width: 100%;\n      animation: emSlideUpMobile 0.3s cubic-bezier(0.22, 1, 0.36, 1);\n    }\n\n    @keyframes emSlideUpMobile {\n      from {\n        transform: translateY(100%);\n      }\n\n      to {\n        transform: translateY(0);\n      }\n    }\n\n    .em-modal-img {\n      height: 180px;\n    }\n\n    .em-modal-body {\n      padding: 16px;\n    }\n\n    .em-modal-footer {\n      padding: 12px 16px;\n    }\n\n    .em-modal-entry-value {\n      font-size: 13px;\n    }\n  }\n\n  @media (max-width: 380px) {\n    .em-map {\n      height: 220px;\n    }\n\n    .em-card-img,\n    .em-card-placeholder {\n      height: 120px !important;\n    }\n\n    .em-card-fields {\n      display: none;\n    }\n  }\n<\/style>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"ItemList\",\"name\":\"Villes aux alentours\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"Thing\",\"name\":\"Toulouse\",\"description\":\"Capitale dynamique de la r\u00e9gion Occitanie connue comme la ville rose, riche en patrimoine et activit\u00e9s culturelles.\",\"image\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/cite-espace-toulouse-camping-les-violettes.jpg\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.604482,\"longitude\":1.443962},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de la ville\",\"value\":\"Toulouse\"},{\"@type\":\"PropertyValue\",\"name\":\"Type de la ville (ville \/ villages \/ bourg...)\",\"value\":\"Ville\"},{\"@type\":\"PropertyValue\",\"name\":\"D\u00e9partement\",\"value\":\"Haute-Garonne\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"17\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"17\"},{\"@type\":\"PropertyValue\",\"name\":\"Points d'int\u00e9r\u00eats\",\"value\":\"Place du Capitole, Cit\u00e9 de l'Espace, Canal du Midi, march\u00e9 Victor Hugo, mus\u00e9e d'Histoire Naturelle\"},{\"@type\":\"PropertyValue\",\"name\":\"Coups de coeur des g\u00e9rants\",\"value\":\"La culture vibrant au Capitole et les sp\u00e9cialit\u00e9s locales \u00e0 ne pas manquer.\"}]}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"Thing\",\"name\":\"Lab\u00e8ge\",\"description\":\"Zone commerciale et technologique dynamique proche de Toulouse, id\u00e9ale pour le shopping et les affaires.\",\"image\":\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a86bbdd808a6.jpeg\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.53,\"longitude\":1.5308333},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de la ville\",\"value\":\"Lab\u00e8ge\"},{\"@type\":\"PropertyValue\",\"name\":\"Type de la ville (ville \/ villages \/ bourg...)\",\"value\":\"Ville\"},{\"@type\":\"PropertyValue\",\"name\":\"D\u00e9partement\",\"value\":\"Haute-Garonne\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"8\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"15\"},{\"@type\":\"PropertyValue\",\"name\":\"Points d'int\u00e9r\u00eats\",\"value\":\"Parc technologique du Canal, centre commercial Lab\u00e8ge 2\"},{\"@type\":\"PropertyValue\",\"name\":\"Coups de coeur des g\u00e9rants\",\"value\":\"Le m\u00e9lange d'innovation et de commerces modernes \u00e0 d\u00e9couvrir sans faute.\"}]}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"Thing\",\"name\":\"Castanet-Tolosan\",\"description\":\"Ville agr\u00e9able offrant des espaces verts et des sentiers de randonn\u00e9e, id\u00e9al pour les balades familiales.\",\"image\":\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef3bc4e133.png\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.5163889,\"longitude\":1.4988889},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de la ville\",\"value\":\"Castanet-Tolosan\"},{\"@type\":\"PropertyValue\",\"name\":\"Type de la ville (ville \/ villages \/ bourg...)\",\"value\":\"Ville\"},{\"@type\":\"PropertyValue\",\"name\":\"D\u00e9partement\",\"value\":\"Haute-Garonne\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"4.6\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"10\"},{\"@type\":\"PropertyValue\",\"name\":\"Points d'int\u00e9r\u00eats\",\"value\":\"Parc de la Mairie, sentiers de randonn\u00e9e\"},{\"@type\":\"PropertyValue\",\"name\":\"Coups de coeur des g\u00e9rants\",\"value\":\"Les balades paisibles au parc et les petits commerces locaux charmants.\"}]}},{\"@type\":\"ListItem\",\"position\":4,\"item\":{\"@type\":\"Thing\",\"name\":\"Donneville\",\"description\":\"Petit village tranquille \u00e0 proximit\u00e9 du camping, parfait pour une balade paisible et la d\u00e9couverte du Canal du Midi.\",\"image\":\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef41aa677c.jpeg\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.4736111,\"longitude\":1.5497222},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de la ville\",\"value\":\"Donneville\"},{\"@type\":\"PropertyValue\",\"name\":\"Type de la ville (ville \/ villages \/ bourg...)\",\"value\":\"Village\"},{\"@type\":\"PropertyValue\",\"name\":\"D\u00e9partement\",\"value\":\"Haute-Garonne\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"2.5\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"5\"},{\"@type\":\"PropertyValue\",\"name\":\"Points d'int\u00e9r\u00eats\",\"value\":\"Canal du Midi, \u00e9glise Saint-Barth\u00e9l\u00e9my\"},{\"@type\":\"PropertyValue\",\"name\":\"Coups de coeur des g\u00e9rants\",\"value\":\"La proximit\u00e9 directe avec le Canal du Midi et son calme reposant.\"}]}},{\"@type\":\"ListItem\",\"position\":5,\"item\":{\"@type\":\"Thing\",\"name\":\"Pompertuzat\",\"description\":\"Village charmant \u00e0 quelques kilom\u00e8tres du camping, offrant un cadre convivial et plusieurs options de restauration.\",\"image\":\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a86b9c2364f6.jpeg\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.4916667,\"longitude\":1.5177778},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de la ville\",\"value\":\"Pompertuzat\"},{\"@type\":\"PropertyValue\",\"name\":\"Type de la ville (ville \/ villages \/ bourg...)\",\"value\":\"Village\"},{\"@type\":\"PropertyValue\",\"name\":\"D\u00e9partement\",\"value\":\"Haute-Garonne\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"2\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"5\"},{\"@type\":\"PropertyValue\",\"name\":\"Points d'int\u00e9r\u00eats\",\"value\":\"Restaurants, places de village, petit march\u00e9\"},{\"@type\":\"PropertyValue\",\"name\":\"Coups de coeur des g\u00e9rants\",\"value\":\"Les d\u00e9licieux repas au Jardin de Lana et l'ambiance paisible du village.\"}]}}]},{\"@type\":\"ItemList\",\"name\":\"Activit\u00e9s aux alentours \",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"Thing\",\"name\":\"Terrain multisports et aire de jeux\",\"description\":\"Terrain multisports avec foot, basket, ping-pong, p\u00e9tanque et trampoline. Aire de jeux pour enfants avec balan\u00e7oires, toboggans et trampoline, id\u00e9al pour toute la famille.\",\"image\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/07\/violettes-5-4.jpg\",\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de l'activit\u00e9\",\"value\":\"Terrain multisports et aire de jeux\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"0\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"0\"},{\"@type\":\"PropertyValue\",\"name\":\"Type d'activit\u00e9 (nature, sport, culture, etc.)\",\"value\":\"Sport, Animation\"},{\"@type\":\"PropertyValue\",\"name\":\"Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"value\":\"Famille, Enfants, Ados\"},{\"@type\":\"PropertyValue\",\"name\":\"R\u00e9servation ? (oui \/ non)\",\"value\":\"Non\"},{\"@type\":\"PropertyValue\",\"name\":\"Horaires\",\"value\":\"Toute l'ann\u00e9e de 9h00 \u00e0 20h00\"},{\"@type\":\"PropertyValue\",\"name\":\"Informations et contact\",\"value\":\"Camping Les Violettes, 17, RD 813 Toulouse 31450\"},{\"@type\":\"PropertyValue\",\"name\":\"Langues parl\u00e9es\",\"value\":\"Fran\u00e7ais, Anglais\"},{\"@type\":\"PropertyValue\",\"name\":\"Animaux accept\u00e9 (oui \/ non)\",\"value\":\"Oui\"}]}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"Thing\",\"name\":\"Pot d'accueil et animations estivales\",\"description\":\"Animations vari\u00e9es durant l'\u00e9t\u00e9 incluant soir\u00e9es karaok\u00e9, mini-discos, quiz musicaux, pot d'accueil pour rencontrer d'autres vacanciers et d\u00e9couvrir le camping.\",\"image\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/10\/chalets-camping-les-violettes-2.webp\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.486776,\"longitude\":1.532408},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de l'activit\u00e9\",\"value\":\"Pot d'accueil et animations estivales\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"0\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"0\"},{\"@type\":\"PropertyValue\",\"name\":\"Type d'activit\u00e9 (nature, sport, culture, etc.)\",\"value\":\"Animation, Loisirs\"},{\"@type\":\"PropertyValue\",\"name\":\"Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"value\":\"Famille, Adultes, Ados\"},{\"@type\":\"PropertyValue\",\"name\":\"R\u00e9servation ? (oui \/ non)\",\"value\":\"Non\"},{\"@type\":\"PropertyValue\",\"name\":\"Horaires\",\"value\":\"Soir\u00e9es du dimanche au vendredi en haute saison\"},{\"@type\":\"PropertyValue\",\"name\":\"Informations et contact\",\"value\":\"Camping Les Violettes, +33 5 61 33 22 11\"},{\"@type\":\"PropertyValue\",\"name\":\"Langues parl\u00e9es\",\"value\":\"Fran\u00e7ais, Anglais\"},{\"@type\":\"PropertyValue\",\"name\":\"Animaux accept\u00e9 (oui \/ non)\",\"value\":\"Oui\"}]}},{\"@type\":\"ListItem\",\"position\":3,\"item\":{\"@type\":\"Thing\",\"name\":\"Balade le long du Canal du Midi\",\"description\":\"Balade au bord du Canal du Midi, patrimoine mondial de l'UNESCO, id\u00e9ale pour la promenade \u00e0 pied ou le v\u00e9lo. Vous pourrez profiter d'un cadre naturel et historique \u00e0 seulement quelques minutes du camping.\",\"image\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/11\/balade-canal-du-midi-1.webp\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.405278,\"longitude\":3.6975},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de l'activit\u00e9\",\"value\":\"Balade le long du Canal du Midi\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"0.8\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"5\"},{\"@type\":\"PropertyValue\",\"name\":\"Type d'activit\u00e9 (nature, sport, culture, etc.)\",\"value\":\"Nature, Balade\"},{\"@type\":\"PropertyValue\",\"name\":\"Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"value\":\"Famille, Enfants, Senior\"},{\"@type\":\"PropertyValue\",\"name\":\"R\u00e9servation ? (oui \/ non)\",\"value\":\"Non\"},{\"@type\":\"PropertyValue\",\"name\":\"Horaires\",\"value\":\"Libre toute la journ\u00e9e\"},{\"@type\":\"PropertyValue\",\"name\":\"Informations et contact\",\"value\":\"Camping Les Violettes, 17, RD 813 Toulouse 31450\"},{\"@type\":\"PropertyValue\",\"name\":\"Langues parl\u00e9es\",\"value\":\"Fran\u00e7ais, Anglais\"},{\"@type\":\"PropertyValue\",\"name\":\"Animaux accept\u00e9 (oui \/ non)\",\"value\":\"Oui\"}]}},{\"@type\":\"ListItem\",\"position\":4,\"item\":{\"@type\":\"Thing\",\"name\":\"Visite du Quartier Saint-Cyprien\",\"description\":\"D\u00e9couverte d'un quartier cosmopolite avec ses ruelles typiques, caf\u00e9s et le mus\u00e9e Les Abattoirs d'art moderne et contemporain, \u00e0 proximit\u00e9 du centre-ville de Toulouse.\",\"image\":\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef4ec3597f.png\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":44.8686142,\"longitude\":1.045332},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de l'activit\u00e9\",\"value\":\"Visite du Quartier Saint-Cyprien\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"3\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"10\"},{\"@type\":\"PropertyValue\",\"name\":\"Type d'activit\u00e9 (nature, sport, culture, etc.)\",\"value\":\"Visite culturelle, D\u00e9couverte urbaine\"},{\"@type\":\"PropertyValue\",\"name\":\"Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"value\":\"Famille, Adultes, Senior\"},{\"@type\":\"PropertyValue\",\"name\":\"R\u00e9servation ? (oui \/ non)\",\"value\":\"Non\"},{\"@type\":\"PropertyValue\",\"name\":\"Horaires\",\"value\":\"9h00 \u00e0 18h00\"},{\"@type\":\"PropertyValue\",\"name\":\"Informations et contact\",\"value\":\"Office de Tourisme Toulouse, +33 5 61 22 22 22\"},{\"@type\":\"PropertyValue\",\"name\":\"Langues parl\u00e9es\",\"value\":\"Fran\u00e7ais, Anglais, Espagnol\"},{\"@type\":\"PropertyValue\",\"name\":\"Animaux accept\u00e9 (oui \/ non)\",\"value\":\"Non\"}]}},{\"@type\":\"ListItem\",\"position\":5,\"item\":{\"@type\":\"Thing\",\"name\":\"Visite de la Halle de la Machine\",\"description\":\"Spectacle et parcours immersif avec bestiaire m\u00e9canique. Exp\u00e9rience unique avec une balade sur le dos du Minotaure Ast\u00e9rion, 14 m\u00e8tres de haut.\",\"image\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/11\/1200x680.jpg\",\"geo\":{\"@type\":\"GeoCoordinates\",\"latitude\":43.572547,\"longitude\":1.478417},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Nom de l'activit\u00e9\",\"value\":\"Visite de la Halle de la Machine\"},{\"@type\":\"PropertyValue\",\"name\":\"Distance depuis le camping (km)\",\"value\":\"4\"},{\"@type\":\"PropertyValue\",\"name\":\"Temps de route depuis le camping (min.)\",\"value\":\"15\"},{\"@type\":\"PropertyValue\",\"name\":\"Type d'activit\u00e9 (nature, sport, culture, etc.)\",\"value\":\"Attraction touristique, Spectacle\"},{\"@type\":\"PropertyValue\",\"name\":\"Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"value\":\"Famille, Enfants, Adultes\"},{\"@type\":\"PropertyValue\",\"name\":\"R\u00e9servation ? (oui \/ non)\",\"value\":\"Oui\"},{\"@type\":\"PropertyValue\",\"name\":\"Horaires\",\"value\":\"10h00 - 18h00\"},{\"@type\":\"PropertyValue\",\"name\":\"Informations et contact\",\"value\":\"La Halle de la Machine, +33 5 61 12 12 12\"},{\"@type\":\"PropertyValue\",\"name\":\"Langues parl\u00e9es\",\"value\":\"Fran\u00e7ais, Anglais\"},{\"@type\":\"PropertyValue\",\"name\":\"Animaux accept\u00e9 (oui \/ non)\",\"value\":\"Non\"}]}}]}]}<\/script>\n\n  \n  <!-- Injection des labels pour le JS (modal) -->\n  <script>\n    var emFieldLabels = {\"nom_de_la_ville\":\"Nom de la ville\",\"type_de_la_ville_ville_villages_bourg\":\"Type de la ville (ville \\\/ villages \\\/ bourg...)\",\"departement\":\"D\\u00e9partement\",\"description\":\"Description\",\"distance_depuis_le_camping_km\":\"Distance depuis le camping (km)\",\"temps_de_route_depuis_le_camping_min\":\"Temps de route depuis le camping (min.)\",\"points_dinterets\":\"Points d'int\\u00e9r\\u00eats\",\"coups_de_coeur_des_gerants\":\"Coups de coeur des g\\u00e9rants\",\"nom_de_lactivite\":\"Nom de l'activit\\u00e9\",\"type_dactivite_nature_sport_culture_etc\":\"Type d'activit\\u00e9 (nature, sport, culture, etc.)\",\"categorie_de_public_famille_enfants_senior_ado_etc\":\"Cat\\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.)\",\"reservation_oui_non\":\"R\\u00e9servation ? (oui \\\/ non)\",\"horaires\":\"Horaires\",\"informations_et_contact\":\"Informations et contact\",\"langues_parlees\":\"Langues parl\\u00e9es\",\"animaux_accepte_oui_non\":\"Animaux accept\\u00e9 (oui \\\/ non)\",\"nom\":\"Nom\",\"categorie_devenement_musique_exposition_festival_foire_brocante_marche_etc\":\"Cat\\u00e9gorie d'\\u00e9v\\u00e9nement : (Musique, exposition, festival, foire, brocante, march\\u00e9, etc.)\",\"public_cible_famille_enfants_adultes_seniors_adolescents_etc\":\"Public cible : (Famille, enfants, adultes, seniors, adolescents, etc.)\",\"reservation_ouinon\":\"R\\u00e9servation (oui\\\/non)\",\"informations_pratiques_et_contact\":\"Informations pratiques et contact\",\"distance_depuis_lhotel_en_km\":\"Distance depuis l'h\\u00f4tel : (en km)\",\"temps_de_route_depuis_lhotel_en_min\":\"Temps de route depuis l'h\\u00f4tel (en min)\",\"animaux_acceptes_ou_non\":\"Animaux : (Accept\\u00e9s ou non)\",\"nom_de_la_piscine\":\"Nom de la piscine\",\"type_de_piscine_couverte_ext_lagune_pataugeoire\":\"Type de piscine (Couverte, ext, Lagune, pataugeoire...)\",\"surface_en_m2\":\"Surface (en m2)\",\"profondeur_maximum_et_minimum\":\"Profondeur maximum et minimum\",\"capacite_dacceuil\":\"Capacit\\u00e9 d'acceuil\",\"emplacement_dans_le_camping\":\"Emplacement (dans le camping)\",\"equipements_toboggans_jacuzzi_jets_riviere_a_contre_courant\":\"Equipements (Toboggans, jacuzzi, jets, rivi\\u00e8re \\u00e0 contre-courant...)\",\"autour_de_la_piscine_transats_parasols_douches\":\"Autour de la piscine (Transats, parasols, douches)\",\"acces_pmr_ouinon\":\"Acc\\u00e8s PMR (Oui\\\/Non)\",\"dates_douverture\":\"Dates d'ouverture\",\"horaires_douverture\":\"Horaires d'ouverture\",\"nom_de_lanimation\":\"Nom de l'animation\",\"type_spectacle_atelier_sport_soiree_concours\":\"Type (Spectacle, Atelier, Sport, Soir\\u00e9e, Concours\\u2026)\",\"categorie_de_public_famille_enfants_adultes_ados_seniors\":\"Cat\\u00e9gorie de public (Famille, Enfants, Adultes, Ados, Seniors)\",\"lieu_sur_le_camping_scene_piscine_salle_plein_air\":\"Lieu sur le camping (sc\\u00e8ne, piscine, salle, plein air\\u2026)\",\"duree_estimee\":\"Dur\\u00e9e estim\\u00e9e\",\"capacite_max\":\"Capacit\\u00e9 max\",\"reservation_obligatoire_ouinon\":\"R\\u00e9servation obligatoire (Oui\\\/Non)\",\"niveau_requis_si_sportifatelier\":\"Niveau requis (si sportif\\\/atelier)\",\"anime_par_equipe_interne_artiste_exterieur\":\"Anim\\u00e9 par (\\u00e9quipe interne \\\/ artiste ext\\u00e9rieur)\",\"nom_de_lequipement\":\"Nom de l'\\u00e9quipement\",\"type_sport_jeux_detente_aquatique_restauration\":\"Type (Sport, Jeux, D\\u00e9tente, Aquatique, Restauration\\u2026)\",\"les_acces_libre_ou_sur_reservation\":\"Les Acc\\u00e8s (libre ou sur r\\u00e9servation)\",\"age_minimum\":\"\\u00c2ge minimum\",\"accessible_pmr_ouinon\":\"Accessible PMR (Oui\\\/Non)\",\"zone_sur_le_camping_nom_position_sur_plan\":\"Zone sur le camping (nom + position sur plan)\",\"distance_depuis_la_reception_min_a_pied\":\"Distance depuis la r\\u00e9ception (min \\u00e0 pied)\",\"eclairage_nocturne_ouinon\":\"\\u00c9clairage nocturne (Oui\\\/Non)\",\"animaux_acceptes_ouinon\":\"Animaux accept\\u00e9s (Oui\\\/Non)\",\"materiel_fourni_ouinon_detail\":\"Mat\\u00e9riel fourni (Oui\\\/Non + d\\u00e9tail)\",\"nom_de_lhebergement\":\"Nom de l'h\\u00e9bergement\",\"type_mobil_home_emplacement_lodge_cabane_tente_glamping_roulotte\":\"Type (Mobil-home, Emplacement, Lodge, Cabane, Tente glamping, Roulotte\\u2026)\",\"gamme_standing_confort_premium_luxe\":\"Gamme \\\/ Standing (Confort, Premium, Luxe\\u2026)\",\"nombre_de_personnes_max\":\"Nombre de personnes max\",\"nombre_de_chambres_couchages_lit_double_lits_simples_canape_lit\":\"Nombre de chambres \\\/ couchages (lit double, lits simples, canap\\u00e9-lit\\u2026)\",\"surface_interieure_m2\":\"Surface int\\u00e9rieure (m\\u00b2)\",\"equipements_exterieur_terrasse_veranda_parking_privatif_bbq_salon_de_jardin_hamac_vue\":\"\\u00c9quipements exterieur (Terrasse, V\\u00e9randa, Parking privatif, Bbq, Salon de jardin, Hamac , vue)\",\"equipements_interieurs_climatisation_cuisine_equipee_lave_linge_television_wifi_inclus_draps_inclus_serviettes_incluses\":\"\\u00c9quipements int\\u00e9rieurs (Climatisation, Cuisine \\u00e9quip\\u00e9e, Lave-linge, T\\u00e9l\\u00e9vision, Wifi inclus, Draps inclus, Serviettes incluses...)\",\"accessibilite_pmr_age_minimum_enfants_distance_depuis_reception_distance_depuis_piscine_min_a_pied\":\"Accessibilit\\u00e9  (PMR, \\u00c2ge minimum enfants, Distance depuis r\\u00e9ception, Distance depuis piscine (min \\u00e0 pied)\",\"type_hebergement\":\"Type h\\u00e9bergement\",\"nom_des_nos_hebergements\":\"Nom des nos h\\u00e9bergements\",\"descriptions\":\"Descriptions\",\"les_gammes_confort_premium_luxe\":\"Les Gammes (Confort, Premium, Luxe\\u2026)\",\"les_points_forts\":\"Les points forts\",\"nom_du_service\":\"Nom du service\",\"type_laverie_wifi_superette_location_materiel_sante_transport_divertissement\":\"Type (Laverie, Wifi, Sup\\u00e9rette, Location mat\\u00e9riel, Sant\\u00e9, Transport, Divertissement\\u2026)\",\"gratuit_payant_ouinon\":\"Gratuit \\\/ Payant (oui\\\/non)\",\"acces_libre_ou_sur_demande\":\"Acc\\u00e8s libre ou sur demande\",\"nom_du_spot\":\"Nom du Spot\",\"sous_titre\":\"Sous-titre\",\"type_de_bord_deau\":\"Type de bord d'eau\",\"type_de_plagerive_sable_galets_herbe_rochers_sable_et_galets\":\"Type de plage\\\/rive (Sable Galets Herbe Rochers Sable et galets)\",\"surveillance\":\"Surveillance\",\"type_deau_eau_salee_eau_douce_eau_saumatre\":\"Type d'eau (Eau sal\\u00e9e, Eau douce, Eau saum\\u00e2tre)\",\"baignade_autorisee_interdite_a_vos_risques\":\"Baignade (Autoris\\u00e9e, Interdite ,\\u00c0 vos risques)\",\"adapte_aux_enfants_ouinon_avec_surveillance\":\"Adapt\\u00e9 aux enfants (Oui\\\/Non, Avec surveillance)\",\"distance_depuis_le_camping\":\"Distance depuis le camping\",\"temps_de_trajet_depuis_le_camping\":\"Temps de trajet depuis le camping\",\"parking_gratuit_payant_limite_non_disponible\":\"Parking (Gratuit, Payant Limit\\u00e9, Non disponible)\",\"accessibilite_pmr\":\"Accessibilit\\u00e9 PMR\",\"activites_possibles_baignade_snorkeling_paddle_kayak_peche_voile_plongee_pedalo\":\"Activit\\u00e9s possibles (Baignade ,Snorkeling, Paddle, Kayak, P\\u00eache, Voile, Plong\\u00e9e, P\\u00e9dalo)\",\"equipements_sur_place_douches_toilettes_restaurantsnack_location_de_materiel_transats_prives_aire_de_pique_nique_surf\":\"\\u00c9quipements sur place (Douches, Toilettes, Restaurant\\\/Snack, Location de mat\\u00e9riel, Transats priv\\u00e9s, Aire de pique-nique, Surf...))\",\"nom_du_restaurant\":\"Nom du restaurant\",\"categorie_gastronomique_bistronomique_traditionnel_brasserie_snack_food_truck_pizzeria\":\"Cat\\u00e9gorie (Gastronomique, Bistronomique, Traditionnel, Brasserie, Snack, Food truck, Pizzeria)\",\"ambiance_familial_decontracte_chicvue_panoramique\":\"Ambiance (Familial, D\\u00e9contract\\u00e9, Chic,Vue panoramique)\",\"cadre_terrasse_bord_de_piscine_bord_de_mer_vue_sur_le_village_climatise_jardin\":\"Cadre (Terrasse, Bord de piscine, Bord de mer, Vue sur le village, climatis\\u00e9, Jardin)\",\"menu_enfant_ouinon\":\"Menu enfant (Oui\\\/Non)\",\"options_regime_vegetarien_vegan_sans_gluten_halal\":\"Options r\\u00e9gime (V\\u00e9g\\u00e9tarien V\\u00e9gan Sans gluten Halal)\",\"distance_depuis_le_camping_si_exterieur_au_camping\":\"Distance depuis le camping (Si exterieur au camping)\",\"temps_de_trajet_si_exterieur_au_camping\":\"Temps de trajet (Si exterieur au camping)\",\"parking_sur_place_a_proximite_difficile_non_disponible\":\"Parking (Sur place \\u00c0 proximit\\u00e9 Difficile Non disponible)\",\"accessibilite_pmroui_non\":\"Accessibilit\\u00e9 PMR(Oui \\\/Non)\",\"animaux_acceptes_ouinon_en_terrasse_uniquement\":\"Animaux accept\\u00e9s (Oui\\\/Non ;En terrasse uniquement)\",\"jours_douverture\":\"Jours d'ouverture\",\"periode_douverture\":\"P\\u00e9riode d'ouverture\",\"reservation_recommandee_obligatoire_non_requise\":\"R\\u00e9servation (Recommand\\u00e9e, Obligatoire, Non requise)\",\"nom_de_linformation\":\"Nom de l'information\",\"accroche_courte\":\"Accroche courte\",\"contenu\":\"Contenu\",\"adresse\":\"Adresse\",\"telephone\":\"T\\u00e9l\\u00e9phone\",\"e_mail\":\"E-mail\",\"site_web\":\"Site web\",\"horaires_de_la_reception\":\"Horaires de la r\\u00e9ception\",\"horaires_darrivee\":\"Horaires d'arriv\\u00e9e\",\"google_maps\":\"Google Maps\",\"presentation_de_lequipe\":\"Pr\\u00e9sentation de l'\\u00e9quipe\",\"aeroports_les_plus_proches\":\"A\\u00e9roports les plus proches\",\"gares_les_plus_proches\":\"Gares les plus proches\",\"nom_de_la_randonnee\":\"Nom de la randonn\\u00e9e\",\"descriptif\":\"Descriptif\",\"duree_moyenne\":\"Dur\\u00e9e moyenne\",\"distance\":\"Distance\",\"denivele_positif\":\"D\\u00e9nivel\\u00e9 positif\",\"denivele_negatif\":\"D\\u00e9nivel\\u00e9 n\\u00e9gatif\",\"difficulte\":\"Difficult\\u00e9\",\"commune\":\"Commune\",\"point_de_depart\":\"Point de d\\u00e9part\",\"point_darrivee\":\"Point d'arriv\\u00e9e\",\"type_de_terrain\":\"Type de terrain\",\"points_dinteret\":\"Points d'int\\u00e9r\\u00eat\"};\n  <\/script>\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\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     HTML \u2014 Interface principale\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\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  <div class=\"em-wrap\">\n\n    <!-- \u2500\u2500\u2500 Header : titre \u2500\u2500\u2500 -->\n    <div class=\"em-header\">\n      <div>\n        <h1 class=\"em-header-title\">D\u00e9couvrez autour de vous<\/h1>\n        <p class=\"em-header-sub\">10 fiche(s) dans 2 cat\u00e9gorie(s)<\/p>\n      <\/div>\n      <button class=\"em-map-toggle active\" id=\"em-map-toggle\">\ud83d\udccd Carte<\/button>\n    <\/div>\n\n\n\n    <!-- \u2500\u2500\u2500 Layout principal : sidebar filtres + grille de cards \u2500\u2500\u2500 -->\n    <div class=\"em-layout\">\n\n      <!-- Sidebar \u2014 Filtres par type et \u00e9quipements -->\n      <aside class=\"em-sidebar\">\n        <div class=\"em-filters collapsed\">\n          <button type=\"button\" class=\"em-filters-title\" aria-expanded=\"false\">\n            <span>\n              <span class=\"em-filters-title-main\">\n                <svg class=\"em-filters-title-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n                  <path d=\"M4 6h16M7 12h10M10 18h4\"><\/path>\n                <\/svg>\n                <span>Filtres<\/span>\n              <\/span>\n              <span class=\"em-filters-title-hint\">Affiner les r\u00e9sultats par type ou \u00e9quipement<\/span>\n            <\/span>\n          <\/button>\n          <div class=\"em-stats\">\n\n            <div class=\"em-stat\">Total : <strong id=\"em-stat-total\">10<\/strong><\/div>\n            <div class=\"em-stat\">Affich\u00e9s : <strong id=\"em-stat-visible\">10<\/strong><\/div>\n          <\/div>\n          <div class=\"em-filter-group\">\n            <label class=\"em-filter-label\">Type<\/label>\n                          <label class=\"em-filter-check\"><input type=\"checkbox\" value=\"villes-aux-alentours\" class=\"em-filter-type\" checked><span>Villes aux alentours<\/span><\/label>\n                          <label class=\"em-filter-check\"><input type=\"checkbox\" value=\"activites-aux-alentours\" class=\"em-filter-type\" checked><span>Activit\u00e9s aux alentours <\/span><\/label>\n                      <\/div>\n          \n          <!-- \u2500\u2500\u2500 Recherche (sous les filtres) \u2500\u2500\u2500 -->\n          <div class=\"em-search-wrap\">\n            <svg class=\"em-search-icon\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\"><\/path>\n            <\/svg>\n            <input type=\"text\" class=\"em-search\" id=\"em-search\" placeholder=\"Rechercher une fiche...\">\n          <\/div>\n          <button class=\"em-filter-reset\" id=\"em-reset-filters\">R\u00e9initialiser<\/button>\n        <\/div>\n      <\/aside>\n\n      <!-- Contenu principal \u2014 Compteurs + grille de cards -->\n      <main class=\"em-main\">\n\n        <!-- \u2500\u2500\u2500 Onglets de cat\u00e9gories (affich\u00e9s si > 1 cat\u00e9gorie) \u2500\u2500\u2500 -->\n                  <div class=\"em-tabs\" id=\"em-tabs\">\n\n            <button class=\"em-tab active\" data-filter=\"all\">Tout<span class=\"em-tab-count\">10<\/span><\/button>\n                          <button class=\"em-tab\" data-filter=\"villes-aux-alentours\">Villes aux alentours<span class=\"em-tab-count\">5<\/span><\/button>\n                          <button class=\"em-tab\" data-filter=\"activites-aux-alentours\">Activit\u00e9s aux alentours <span class=\"em-tab-count\">5<\/span><\/button>\n                      <\/div>\n        \n        <div class=\"em-main-body\">\n          <!-- \u2500\u2500\u2500 Carte interactive (affich\u00e9e si des points GPS existent) \u2500\u2500\u2500 -->\n                      <div class=\"em-map-section\">\n              <div class=\"em-map-wrap\" id=\"em-map-wrap\">\n                <div id=\"em-map\" class=\"em-map\"><\/div>\n                <div class=\"em-map-legend\">\n                                                          <div class=\"em-map-legend-item\" data-type=\"villes-aux-alentours\">\n                      <span class=\"em-map-legend-dot\" style=\"background:#0891b2;\"><\/span>\n                      Villes aux alentours                    <\/div>\n                                                          <div class=\"em-map-legend-item\" data-type=\"activites-aux-alentours\">\n                      <span class=\"em-map-legend-dot\" style=\"background:#db2777;\"><\/span>\n                      Activit\u00e9s aux alentours                     <\/div>\n                                  <\/div>\n              <\/div>\n            <\/div>\n          \n          <div class=\"em-cards\" id=\"em-cards\">\n                          <article class=\"em-card\"\n                data-type=\"villes-aux-alentours\"\n                data-features=\"\"\n                data-name=\"toulouse\"\n                data-json=\"{&quot;name&quot;:&quot;Toulouse&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/cite-espace-toulouse-camping-les-violettes.jpg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_la_ville&quot;:&quot;Toulouse&quot;,&quot;type_de_la_ville_ville_villages_bourg&quot;:&quot;Ville&quot;,&quot;departement&quot;:&quot;Haute-Garonne&quot;,&quot;description&quot;:&quot;Capitale dynamique de la r\\u00e9gion Occitanie connue comme la ville rose, riche en patrimoine et activit\\u00e9s culturelles.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;17&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;17&quot;,&quot;points_dinterets&quot;:&quot;Place du Capitole, Cit\\u00e9 de l&#039;Espace, Canal du Midi, march\\u00e9 Victor Hugo, mus\\u00e9e d&#039;Histoire Naturelle&quot;,&quot;coups_de_coeur_des_gerants&quot;:&quot;La culture vibrant au Capitole et les sp\\u00e9cialit\\u00e9s locales \\u00e0 ne pas manquer.&quot;,&quot;name&quot;:&quot;Toulouse&quot;,&quot;latitude&quot;:&quot;43.6044820&quot;,&quot;longitude&quot;:&quot;1.4439620&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/cite-espace-toulouse-camping-les-violettes.jpg&quot;},&quot;category&quot;:&quot;Villes aux alentours&quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Y&#039;a t il des commerces essentiels ?&quot;,&quot;answer&quot;:&quot;Oui, Toulouse dispose de nombreux commerces essentiels, notamment au centre-ville et autour du march\\u00e9 Victor Hugo.&quot;},{&quot;question&quot;:&quot;Quel est le meilleur moment pour visiter la ville ?&quot;,&quot;answer&quot;:&quot;Le printemps et l&#039;automne offrent un climat agr\\u00e9able pour visiter Toulouse.&quot;},{&quot;question&quot;:&quot;O\\u00f9 manger sans se tromper ?&quot;,&quot;answer&quot;:&quot;Le march\\u00e9 Victor Hugo et les restaurants autour offrent les meilleures exp\\u00e9riences culinaires.&quot;},{&quot;question&quot;:&quot;O\\u00f9 se garer facilement ?&quot;,&quot;answer&quot;:&quot;Les parkings publics proches du centre-ville sont nombreux, comme le parking Jean Jaur\\u00e8s.&quot;},{&quot;question&quot;:&quot;Le centre ville est il accessible aux PMR et poussettes ?&quot;,&quot;answer&quot;:&quot;Le centre-ville est globalement accessible aux PMR et poussettes, avec des trottoirs adapt\\u00e9s.&quot;},{&quot;question&quot;:&quot;Que faire quand il pleut dans la ville ?&quot;,&quot;answer&quot;:&quot;Profitez des mus\\u00e9es comme le mus\\u00e9e d&#039;Histoire Naturelle ou la Maison de la Violette.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/cite-espace-toulouse-camping-les-violettes.jpg\" alt=\"Toulouse\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Villes aux alentours<\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Toulouse<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de la ville :<\/span>\n                        <span class=\"em-card-field-value\">Toulouse<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type de la ville (ville \/ villages \/ bourg...) :<\/span>\n                        <span class=\"em-card-field-value\">Ville<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">D\u00e9partement :<\/span>\n                        <span class=\"em-card-field-value\">Haute-Garonne<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"villes-aux-alentours\"\n                data-features=\"\"\n                data-name=\"lab\u00e8ge\"\n                data-json=\"{&quot;name&quot;:&quot;Lab\\u00e8ge&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a86bbdd808a6.jpeg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_la_ville&quot;:&quot;Lab\\u00e8ge&quot;,&quot;type_de_la_ville_ville_villages_bourg&quot;:&quot;Ville&quot;,&quot;departement&quot;:&quot;Haute-Garonne&quot;,&quot;description&quot;:&quot;Zone commerciale et technologique dynamique proche de Toulouse, id\\u00e9ale pour le shopping et les affaires.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;8&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;15&quot;,&quot;points_dinterets&quot;:&quot;Parc technologique du Canal, centre commercial Lab\\u00e8ge 2&quot;,&quot;coups_de_coeur_des_gerants&quot;:&quot;Le m\\u00e9lange d&#039;innovation et de commerces modernes \\u00e0 d\\u00e9couvrir sans faute.&quot;,&quot;name&quot;:&quot;Lab\\u00e8ge&quot;,&quot;latitude&quot;:&quot;43.5300000&quot;,&quot;longitude&quot;:&quot;1.5308333&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a86bbdd808a6.jpeg&quot;},&quot;category&quot;:&quot;Villes aux alentours&quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Y&#039;a t il des commerces essentiels ?&quot;,&quot;answer&quot;:&quot;Oui, le centre commercial Lab\\u00e8ge 2 offre tous les commerces essentiels.&quot;},{&quot;question&quot;:&quot;Quel est le meilleur moment pour visiter la ville ?&quot;,&quot;answer&quot;:&quot;Toute l&#039;ann\\u00e9e gr\\u00e2ce \\u00e0 ses centres couverts et activit\\u00e9s.&quot;},{&quot;question&quot;:&quot;O\\u00f9 manger sans se tromper ?&quot;,&quot;answer&quot;:&quot;Les restaurants du centre commercial sont recommand\\u00e9s, notamment cuisine asiatique et fran\\u00e7aise contemporaine.&quot;},{&quot;question&quot;:&quot;O\\u00f9 se garer facilement ?&quot;,&quot;answer&quot;:&quot;Le parking de Lab\\u00e8ge 2 est tr\\u00e8s spacieux et facile d&#039;acc\\u00e8s.&quot;},{&quot;question&quot;:&quot;Le centre ville est il accessible aux PMR et poussettes ?&quot;,&quot;answer&quot;:&quot;Le centre commercial et ses alentours sont totalement accessibles.&quot;},{&quot;question&quot;:&quot;Que faire quand il pleut dans la ville ?&quot;,&quot;answer&quot;:&quot;Profiter des boutiques et restaurants couverts du centre commercial.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a86bbdd808a6.jpeg\" alt=\"Lab\u00e8ge\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Villes aux alentours<\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Lab\u00e8ge<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de la ville :<\/span>\n                        <span class=\"em-card-field-value\">Lab\u00e8ge<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type de la ville (ville \/ villages \/ bourg...) :<\/span>\n                        <span class=\"em-card-field-value\">Ville<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">D\u00e9partement :<\/span>\n                        <span class=\"em-card-field-value\">Haute-Garonne<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"villes-aux-alentours\"\n                data-features=\"\"\n                data-name=\"castanet-tolosan\"\n                data-json=\"{&quot;name&quot;:&quot;Castanet-Tolosan&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef3bc4e133.png&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_la_ville&quot;:&quot;Castanet-Tolosan&quot;,&quot;type_de_la_ville_ville_villages_bourg&quot;:&quot;Ville&quot;,&quot;departement&quot;:&quot;Haute-Garonne&quot;,&quot;description&quot;:&quot;Ville agr\\u00e9able offrant des espaces verts et des sentiers de randonn\\u00e9e, id\\u00e9al pour les balades familiales.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;4.6&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;10&quot;,&quot;points_dinterets&quot;:&quot;Parc de la Mairie, sentiers de randonn\\u00e9e&quot;,&quot;coups_de_coeur_des_gerants&quot;:&quot;Les balades paisibles au parc et les petits commerces locaux charmants.&quot;,&quot;name&quot;:&quot;Castanet-Tolosan&quot;,&quot;latitude&quot;:&quot;43.5163889&quot;,&quot;longitude&quot;:&quot;1.4988889&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef3bc4e133.png&quot;},&quot;category&quot;:&quot;Villes aux alentours&quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Y&#039;a t il des commerces essentiels ?&quot;,&quot;answer&quot;:&quot;Oui, petits commerces et march\\u00e9s locaux sont pr\\u00e9sents.&quot;},{&quot;question&quot;:&quot;Quel est le meilleur moment pour visiter la ville ?&quot;,&quot;answer&quot;:&quot;Le printemps et l&#039;\\u00e9t\\u00e9 pour profiter des espaces verts.&quot;},{&quot;question&quot;:&quot;O\\u00f9 manger sans se tromper ?&quot;,&quot;answer&quot;:&quot;Les restaurants locaux proposent une cuisine traditionnelle de qualit\\u00e9.&quot;},{&quot;question&quot;:&quot;O\\u00f9 se garer facilement ?&quot;,&quot;answer&quot;:&quot;Des parkings gratuits sont disponibles pr\\u00e8s du parc de la Mairie.&quot;},{&quot;question&quot;:&quot;Le centre ville est il accessible aux PMR et poussettes ?&quot;,&quot;answer&quot;:&quot;Oui, le centre-ville est accessible aux PMR et poussettes.&quot;},{&quot;question&quot;:&quot;Que faire quand il pleut dans la ville ?&quot;,&quot;answer&quot;:&quot;Visiter les commerces locaux ou prendre un caf\\u00e9 dans les petits bistrots.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef3bc4e133.png\" alt=\"Castanet-Tolosan\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Villes aux alentours<\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Castanet-Tolosan<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de la ville :<\/span>\n                        <span class=\"em-card-field-value\">Castanet-Tolosan<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type de la ville (ville \/ villages \/ bourg...) :<\/span>\n                        <span class=\"em-card-field-value\">Ville<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">D\u00e9partement :<\/span>\n                        <span class=\"em-card-field-value\">Haute-Garonne<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"villes-aux-alentours\"\n                data-features=\"\"\n                data-name=\"donneville\"\n                data-json=\"{&quot;name&quot;:&quot;Donneville&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef41aa677c.jpeg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_la_ville&quot;:&quot;Donneville&quot;,&quot;type_de_la_ville_ville_villages_bourg&quot;:&quot;Village&quot;,&quot;departement&quot;:&quot;Haute-Garonne&quot;,&quot;description&quot;:&quot;Petit village tranquille \\u00e0 proximit\\u00e9 du camping, parfait pour une balade paisible et la d\\u00e9couverte du Canal du Midi.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;2.5&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;5&quot;,&quot;points_dinterets&quot;:&quot;Canal du Midi, \\u00e9glise Saint-Barth\\u00e9l\\u00e9my&quot;,&quot;coups_de_coeur_des_gerants&quot;:&quot;La proximit\\u00e9 directe avec le Canal du Midi et son calme reposant.&quot;,&quot;name&quot;:&quot;Donneville&quot;,&quot;latitude&quot;:&quot;43.4736111&quot;,&quot;longitude&quot;:&quot;1.5497222&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef41aa677c.jpeg&quot;},&quot;category&quot;:&quot;Villes aux alentours&quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Y&#039;a t il des commerces essentiels ?&quot;,&quot;answer&quot;:&quot;Quelques petits commerces de proximit\\u00e9 sont pr\\u00e9sents au village.&quot;},{&quot;question&quot;:&quot;Quel est le meilleur moment pour visiter la ville ?&quot;,&quot;answer&quot;:&quot;Le printemps est id\\u00e9al pour profiter de la nature et du canal.&quot;},{&quot;question&quot;:&quot;O\\u00f9 manger sans se tromper ?&quot;,&quot;answer&quot;:&quot;Le restaurant L&#039;Enclos est tr\\u00e8s appr\\u00e9ci\\u00e9 des visiteurs.&quot;},{&quot;question&quot;:&quot;O\\u00f9 se garer facilement ?&quot;,&quot;answer&quot;:&quot;Parking proche de l&#039;\\u00e9glise et du canal disponible.&quot;},{&quot;question&quot;:&quot;Le centre ville est il accessible aux PMR et poussettes ?&quot;,&quot;answer&quot;:&quot;Oui, les rues du village sont accessibles aux poussettes et PMR.&quot;},{&quot;question&quot;:&quot;Que faire quand il pleut dans la ville ?&quot;,&quot;answer&quot;:&quot;Profitez d&#039;un repas au restaurant local ou d&#039;une visite de l&#039;\\u00e9glise.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef41aa677c.jpeg\" alt=\"Donneville\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Villes aux alentours<\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Donneville<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de la ville :<\/span>\n                        <span class=\"em-card-field-value\">Donneville<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type de la ville (ville \/ villages \/ bourg...) :<\/span>\n                        <span class=\"em-card-field-value\">Village<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">D\u00e9partement :<\/span>\n                        <span class=\"em-card-field-value\">Haute-Garonne<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"villes-aux-alentours\"\n                data-features=\"\"\n                data-name=\"pompertuzat\"\n                data-json=\"{&quot;name&quot;:&quot;Pompertuzat&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a86b9c2364f6.jpeg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_la_ville&quot;:&quot;Pompertuzat&quot;,&quot;type_de_la_ville_ville_villages_bourg&quot;:&quot;Village&quot;,&quot;departement&quot;:&quot;Haute-Garonne&quot;,&quot;description&quot;:&quot;Village charmant \\u00e0 quelques kilom\\u00e8tres du camping, offrant un cadre convivial et plusieurs options de restauration.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;2&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;5&quot;,&quot;points_dinterets&quot;:&quot;Restaurants, places de village, petit march\\u00e9&quot;,&quot;coups_de_coeur_des_gerants&quot;:&quot;Les d\\u00e9licieux repas au Jardin de Lana et l&#039;ambiance paisible du village.&quot;,&quot;name&quot;:&quot;Pompertuzat&quot;,&quot;latitude&quot;:&quot;43.4916667&quot;,&quot;longitude&quot;:&quot;1.5177778&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a86b9c2364f6.jpeg&quot;},&quot;category&quot;:&quot;Villes aux alentours&quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Y&#039;a t il des commerces essentiels ?&quot;,&quot;answer&quot;:&quot;Oui, surtout des restaurants et commerces de bouche locaux.&quot;},{&quot;question&quot;:&quot;Quel est le meilleur moment pour visiter la ville ?&quot;,&quot;answer&quot;:&quot;Le week-end, notamment lors des march\\u00e9s locaux.&quot;},{&quot;question&quot;:&quot;O\\u00f9 manger sans se tromper ?&quot;,&quot;answer&quot;:&quot;L&#039;Escarbille, l&#039;Enclos et Le Jardin de Lana dont des restaurants tr\\u00e8s recommand\\u00e9s.&quot;},{&quot;question&quot;:&quot;O\\u00f9 se garer facilement ?&quot;,&quot;answer&quot;:&quot;Parkings pr\\u00e8s de la place centrale du village.&quot;},{&quot;question&quot;:&quot;Le centre ville est il accessible aux PMR et poussettes ?&quot;,&quot;answer&quot;:&quot;Oui, sur la place principale et les rues adjacentes.&quot;},{&quot;question&quot;:&quot;Que faire quand il pleut dans la ville ?&quot;,&quot;answer&quot;:&quot;Profitez d&#039;un bon repas dans un des restaurants du village.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a86b9c2364f6.jpeg\" alt=\"Pompertuzat\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Villes aux alentours<\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Pompertuzat<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de la ville :<\/span>\n                        <span class=\"em-card-field-value\">Pompertuzat<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type de la ville (ville \/ villages \/ bourg...) :<\/span>\n                        <span class=\"em-card-field-value\">Village<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">D\u00e9partement :<\/span>\n                        <span class=\"em-card-field-value\">Haute-Garonne<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"activites-aux-alentours\"\n                data-features=\"\"\n                data-name=\"terrain multisports et aire de jeux\"\n                data-json=\"{&quot;name&quot;:&quot;Terrain multisports et aire de jeux&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/violettes-5-4.jpg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_lactivite&quot;:&quot;Terrain multisports et aire de jeux&quot;,&quot;description&quot;:&quot;Terrain multisports avec foot, basket, ping-pong, p\\u00e9tanque et trampoline. Aire de jeux pour enfants avec balan\\u00e7oires, toboggans et trampoline, id\\u00e9al pour toute la famille.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;0&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;0&quot;,&quot;type_dactivite_nature_sport_culture_etc&quot;:&quot;Sport, Animation&quot;,&quot;categorie_de_public_famille_enfants_senior_ado_etc&quot;:&quot;Famille, Enfants, Ados&quot;,&quot;reservation_oui_non&quot;:&quot;Non&quot;,&quot;horaires&quot;:&quot;Toute l&#039;ann\\u00e9e de 9h00 \\u00e0 20h00&quot;,&quot;informations_et_contact&quot;:&quot;Camping Les Violettes, 17, RD 813 Toulouse 31450&quot;,&quot;langues_parlees&quot;:&quot;Fran\\u00e7ais, Anglais&quot;,&quot;animaux_accepte_oui_non&quot;:&quot;Oui&quot;,&quot;name&quot;:&quot;Terrain multisports et aire de jeux&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/violettes-5-4.jpg&quot;},&quot;category&quot;:&quot;Activit\\u00e9s aux alentours &quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle adapt\\u00e9e aux d\\u00e9butants ?&quot;,&quot;answer&quot;:&quot;Oui, accessible \\u00e0 tous niveaux \\u00e0 l&#039;int\\u00e9rieur du camping.&quot;},{&quot;question&quot;:&quot;Quel est le tarif moyen ?&quot;,&quot;answer&quot;:&quot;Gratuit pour les clients du camping.&quot;},{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle praticable par mauvais temps ?&quot;,&quot;answer&quot;:&quot;Non, d\\u00e9pend des conditions m\\u00e9t\\u00e9o car en ext\\u00e9rieur.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/07\/violettes-5-4.jpg\" alt=\"Terrain multisports et aire de jeux\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Activit\u00e9s aux alentours <\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Terrain multisports et aire de jeux<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de l&#039;activit\u00e9 :<\/span>\n                        <span class=\"em-card-field-value\">Terrain multisports et aire de jeux<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type d&#039;activit\u00e9 (nature, sport, culture, etc.) :<\/span>\n                        <span class=\"em-card-field-value\">Sport, Animation<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.) :<\/span>\n                        <span class=\"em-card-field-value\">Famille, Enfants, Ados<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"activites-aux-alentours\"\n                data-features=\"\"\n                data-name=\"pot d&#039;accueil et animations estivales\"\n                data-json=\"{&quot;name&quot;:&quot;Pot d&#039;accueil et animations estivales&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/chalets-camping-les-violettes-2.webp&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_lactivite&quot;:&quot;Pot d&#039;accueil et animations estivales&quot;,&quot;description&quot;:&quot;Animations vari\\u00e9es durant l&#039;\\u00e9t\\u00e9 incluant soir\\u00e9es karaok\\u00e9, mini-discos, quiz musicaux, pot d&#039;accueil pour rencontrer d&#039;autres vacanciers et d\\u00e9couvrir le camping.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;0&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;0&quot;,&quot;type_dactivite_nature_sport_culture_etc&quot;:&quot;Animation, Loisirs&quot;,&quot;categorie_de_public_famille_enfants_senior_ado_etc&quot;:&quot;Famille, Adultes, Ados&quot;,&quot;reservation_oui_non&quot;:&quot;Non&quot;,&quot;horaires&quot;:&quot;Soir\\u00e9es du dimanche au vendredi en haute saison&quot;,&quot;informations_et_contact&quot;:&quot;Camping Les Violettes, +33 5 61 33 22 11&quot;,&quot;langues_parlees&quot;:&quot;Fran\\u00e7ais, Anglais&quot;,&quot;animaux_accepte_oui_non&quot;:&quot;Oui&quot;,&quot;name&quot;:&quot;Pot d&#039;accueil et animations estivales&quot;,&quot;latitude&quot;:&quot;43.4867760&quot;,&quot;longitude&quot;:&quot;1.5324080&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/chalets-camping-les-violettes-2.webp&quot;},&quot;category&quot;:&quot;Activit\\u00e9s aux alentours &quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle adapt\\u00e9e aux d\\u00e9butants ?&quot;,&quot;answer&quot;:&quot;Oui, toutes les animations sont ouvertes \\u00e0 tous.&quot;},{&quot;question&quot;:&quot;Quel est le tarif moyen ?&quot;,&quot;answer&quot;:&quot;Gratuit pour les clients du camping.&quot;},{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle praticable par mauvais temps ?&quot;,&quot;answer&quot;:&quot;Principalement en terrasse ext\\u00e9rieure, donc peuvent \\u00eatre annul\\u00e9es  par mauvais temps.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/10\/chalets-camping-les-violettes-2.webp\" alt=\"Pot d&#039;accueil et animations estivales\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Activit\u00e9s aux alentours <\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Pot d&#039;accueil et animations estivales<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de l&#039;activit\u00e9 :<\/span>\n                        <span class=\"em-card-field-value\">Pot d&#039;accueil et animations estivales<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Type d&#039;activit\u00e9 (nature, sport, culture, etc.) :<\/span>\n                        <span class=\"em-card-field-value\">Animation, Loisirs<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Cat\u00e9gorie de public (Famille, Enfants, Senior, Ado, etc.) :<\/span>\n                        <span class=\"em-card-field-value\">Famille, Adultes, Ados<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"activites-aux-alentours\"\n                data-features=\"\"\n                data-name=\"balade le long du canal du midi\"\n                data-json=\"{&quot;name&quot;:&quot;Balade le long du Canal du Midi&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/balade-canal-du-midi-1.webp&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_lactivite&quot;:&quot;Balade le long du Canal du Midi&quot;,&quot;description&quot;:&quot;Balade au bord du Canal du Midi, patrimoine mondial de l&#039;UNESCO, id\\u00e9ale pour la promenade \\u00e0 pied ou le v\\u00e9lo. Vous pourrez profiter d&#039;un cadre naturel et historique \\u00e0 seulement quelques minutes du camping.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;0.8&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;5&quot;,&quot;type_dactivite_nature_sport_culture_etc&quot;:&quot;Nature, Balade&quot;,&quot;categorie_de_public_famille_enfants_senior_ado_etc&quot;:&quot;Famille, Enfants, Senior&quot;,&quot;reservation_oui_non&quot;:&quot;Non&quot;,&quot;horaires&quot;:&quot;Libre toute la journ\\u00e9e&quot;,&quot;informations_et_contact&quot;:&quot;Camping Les Violettes, 17, RD 813 Toulouse 31450&quot;,&quot;langues_parlees&quot;:&quot;Fran\\u00e7ais, Anglais&quot;,&quot;animaux_accepte_oui_non&quot;:&quot;Oui&quot;,&quot;name&quot;:&quot;Balade le long du Canal du Midi&quot;,&quot;latitude&quot;:&quot;43.4052780&quot;,&quot;longitude&quot;:&quot;3.6975000&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/balade-canal-du-midi-1.webp&quot;},&quot;category&quot;:&quot;Activit\\u00e9s aux alentours &quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle adapt\\u00e9e aux d\\u00e9butants ?&quot;,&quot;answer&quot;:&quot;Oui, la balade est adapt\\u00e9e \\u00e0 tous les niveaux, facile et accessible.&quot;},{&quot;question&quot;:&quot;Quel est le tarif moyen ?&quot;,&quot;answer&quot;:&quot;Gratuit, accessible sans frais.&quot;},{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle praticable par mauvais temps ?&quot;,&quot;answer&quot;:&quot;En cas de pluie, la balade peut \\u00eatre moins agr\\u00e9able, pr\\u00e9f\\u00e9rez un jour sec.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/11\/balade-canal-du-midi-1.webp\" alt=\"Balade le long du Canal du Midi\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Activit\u00e9s aux alentours <\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Balade le long du Canal du Midi<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de l&#039;activit\u00e9 :<\/span>\n                        <span class=\"em-card-field-value\">Balade le long du Canal du Midi<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Distance depuis le camping (km) :<\/span>\n                        <span class=\"em-card-field-value\">0.8<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Temps de route depuis le camping (min.) :<\/span>\n                        <span class=\"em-card-field-value\">5<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"activites-aux-alentours\"\n                data-features=\"\"\n                data-name=\"visite du quartier saint-cyprien\"\n                data-json=\"{&quot;name&quot;:&quot;Visite du Quartier Saint-Cyprien&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef4ec3597f.png&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_lactivite&quot;:&quot;Visite du Quartier Saint-Cyprien&quot;,&quot;description&quot;:&quot;D\\u00e9couverte d&#039;un quartier cosmopolite avec ses ruelles typiques, caf\\u00e9s et le mus\\u00e9e Les Abattoirs d&#039;art moderne et contemporain, \\u00e0 proximit\\u00e9 du centre-ville de Toulouse.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;3&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;10&quot;,&quot;type_dactivite_nature_sport_culture_etc&quot;:&quot;Visite culturelle, D\\u00e9couverte urbaine&quot;,&quot;categorie_de_public_famille_enfants_senior_ado_etc&quot;:&quot;Famille, Adultes, Senior&quot;,&quot;reservation_oui_non&quot;:&quot;Non&quot;,&quot;horaires&quot;:&quot;9h00 \\u00e0 18h00&quot;,&quot;informations_et_contact&quot;:&quot;Office de Tourisme Toulouse, +33 5 61 22 22 22&quot;,&quot;langues_parlees&quot;:&quot;Fran\\u00e7ais, Anglais, Espagnol&quot;,&quot;animaux_accepte_oui_non&quot;:&quot;Non&quot;,&quot;name&quot;:&quot;Visite du Quartier Saint-Cyprien&quot;,&quot;latitude&quot;:&quot;44.8686142&quot;,&quot;longitude&quot;:&quot;1.0453320&quot;,&quot;image&quot;:&quot;https:\\\/\\\/elaia-public.s3.fr-par.scw.cloud\\\/metadata_images\\\/image_6a7ef4ec3597f.png&quot;},&quot;category&quot;:&quot;Activit\\u00e9s aux alentours &quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle adapt\\u00e9e aux d\\u00e9butants ?&quot;,&quot;answer&quot;:&quot;Oui, id\\u00e9ale pour une premi\\u00e8re d\\u00e9couverte culturelle de Toulouse.&quot;},{&quot;question&quot;:&quot;Quel est le tarif moyen ?&quot;,&quot;answer&quot;:&quot;Gratuit sauf pour certains mus\\u00e9es sp\\u00e9cifiques.&quot;},{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle praticable par mauvais temps ?&quot;,&quot;answer&quot;:&quot;Partiellement, la visite urbaine est possible par mauvais temps mais en limitant les balades en ext\\u00e9rieur.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/elaia-public.s3.fr-par.scw.cloud\/metadata_images\/image_6a7ef4ec3597f.png\" alt=\"Visite du Quartier Saint-Cyprien\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Activit\u00e9s aux alentours <\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Visite du Quartier Saint-Cyprien<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de l&#039;activit\u00e9 :<\/span>\n                        <span class=\"em-card-field-value\">Visite du Quartier Saint-Cyprien<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Distance depuis le camping (km) :<\/span>\n                        <span class=\"em-card-field-value\">3<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Temps de route depuis le camping (min.) :<\/span>\n                        <span class=\"em-card-field-value\">10<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                          <article class=\"em-card\"\n                data-type=\"activites-aux-alentours\"\n                data-features=\"\"\n                data-name=\"visite de la halle de la machine\"\n                data-json=\"{&quot;name&quot;:&quot;Visite de la Halle de la Machine&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1200x680.jpg&quot;,&quot;link&quot;:&quot;&quot;,&quot;data&quot;:{&quot;nom_de_lactivite&quot;:&quot;Visite de la Halle de la Machine&quot;,&quot;description&quot;:&quot;Spectacle et parcours immersif avec bestiaire m\\u00e9canique. Exp\\u00e9rience unique avec une balade sur le dos du Minotaure Ast\\u00e9rion, 14 m\\u00e8tres de haut.&quot;,&quot;distance_depuis_le_camping_km&quot;:&quot;4&quot;,&quot;temps_de_route_depuis_le_camping_min&quot;:&quot;15&quot;,&quot;type_dactivite_nature_sport_culture_etc&quot;:&quot;Attraction touristique, Spectacle&quot;,&quot;categorie_de_public_famille_enfants_senior_ado_etc&quot;:&quot;Famille, Enfants, Adultes&quot;,&quot;reservation_oui_non&quot;:&quot;Oui&quot;,&quot;horaires&quot;:&quot;10h00 - 18h00&quot;,&quot;informations_et_contact&quot;:&quot;La Halle de la Machine, +33 5 61 12 12 12&quot;,&quot;langues_parlees&quot;:&quot;Fran\\u00e7ais, Anglais&quot;,&quot;animaux_accepte_oui_non&quot;:&quot;Non&quot;,&quot;name&quot;:&quot;Visite de la Halle de la Machine&quot;,&quot;latitude&quot;:&quot;43.5725470&quot;,&quot;longitude&quot;:&quot;1.4784170&quot;,&quot;image&quot;:&quot;https:\\\/\\\/www.campinglesviolettes.com\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1200x680.jpg&quot;},&quot;category&quot;:&quot;Activit\\u00e9s aux alentours &quot;,&quot;faq&quot;:[{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle adapt\\u00e9e aux d\\u00e9butants ?&quot;,&quot;answer&quot;:&quot;Oui, adapt\\u00e9e \\u00e0 tous les visiteurs, guid\\u00e9e pour les novices.&quot;},{&quot;question&quot;:&quot;Quel est le tarif moyen ?&quot;,&quot;answer&quot;:&quot;Environ 15 euros par personne.&quot;},{&quot;question&quot;:&quot;Cette activit\\u00e9 est-elle praticable par mauvais temps ?&quot;,&quot;answer&quot;:&quot;Oui, enti\\u00e8rement en int\\u00e9rieur, donc praticable par mauvais temps.&quot;}],&quot;event&quot;:&quot;&quot;,&quot;video_url&quot;:&quot;&quot;,&quot;video_embed&quot;:null,&quot;documents&quot;:[],&quot;gallery&quot;:[]}\">\n\n                <!-- Image + badge cat\u00e9gorie -->\n                <div class=\"em-card-img-wrap\">\n                                      <img decoding=\"async\" class=\"em-card-img\" src=\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2025\/11\/1200x680.jpg\" alt=\"Visite de la Halle de la Machine\" loading=\"lazy\" onerror=\"this.style.setProperty('display','none','important');this.nextElementSibling.style.display='flex';\">\n                    <div class=\"em-card-placeholder\" style=\"display:none;\">\ud83d\udcf7 Image indisponible<\/div>\n                                    <span class=\"em-card-badge badge-default\">Activit\u00e9s aux alentours <\/span>\n                <\/div>\n\n                <!-- Contenu de la card -->\n                <div class=\"em-card-body\">\n                  <h3 class=\"em-card-title\">Visite de la Halle de la Machine<\/h3>\n\n                  <!-- Tags r\u00e9sum\u00e9s (max 4) -->\n                  <div class=\"em-card-tags\">\n                                                          <\/div>\n\n                  <!-- Champs suppl\u00e9mentaires (max 3) -->\n                  <div class=\"em-card-fields\">\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Nom de l&#039;activit\u00e9 :<\/span>\n                        <span class=\"em-card-field-value\">Visite de la Halle de la Machine<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Distance depuis le camping (km) :<\/span>\n                        <span class=\"em-card-field-value\">4<\/span>\n                      <\/div>\n                                          <div class=\"em-card-field\">\n                        <span class=\"em-card-field-label\">Temps de route depuis le camping (min.) :<\/span>\n                        <span class=\"em-card-field-value\">15<\/span>\n                      <\/div>\n                                      <\/div>\n\n                  <!-- Lien vers le d\u00e9tail -->\n                  <div class=\"em-card-footer\">\n                    <span>Voir le d\u00e9tail<\/span>\n                    <svg fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3\"><\/path>\n                    <\/svg>\n                  <\/div>\n                <\/div>\n              <\/article>\n                      <\/div>\n\n          <!-- \u00c9tat vide (aucun r\u00e9sultat apr\u00e8s filtrage) -->\n          <div class=\"em-empty\" id=\"em-empty\" style=\"display:none;\">\n            <p><strong>Aucun r\u00e9sultat<\/strong><br>Modifiez vos filtres pour voir plus de r\u00e9sultats<\/p>\n          <\/div>\n        <\/div>\n      <\/main>\n    <\/div>\n  <\/div>\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\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     JAVASCRIPT \u2014 Filtres, modal, carte Leaflet\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\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  <script>\n    (function() {\n      'use strict';\n\n      \/\/ Labels des champs (inject\u00e9s depuis PHP)\n      var FIELD_LABELS = window.emFieldLabels || {};\n\n      \/\/ Cl\u00e9s exclues de la modal (donn\u00e9es internes \/ d\u00e9j\u00e0 affich\u00e9es)\n      var EXCLUDED_KEYS = [\n        'name', 'image', 'images', 'image_url', 'link', 'site_officiel',\n        'gps_coordinates_latitude', 'gps_coordinates_longitude',\n        'latitude', 'longitude', 'latitude_deg', 'longitude_deg',\n        'address', 'available_image_urls'\n      ];\n\n      \/**\n       * Retourne le label lisible d'un champ\n       * Utilise les labels API si disponibles, sinon formate la cl\u00e9\n       *\/\n      function getFieldLabel(key) {\n        if (FIELD_LABELS[key]) return FIELD_LABELS[key];\n        \/\/ Suffixe legacy `_xxxxxxx` (7 alphanum) \u2014 cf. em_field_label() c\u00f4t\u00e9 PHP.\n        var cleaned = key.replace(\/_[a-z0-9]{7}$\/i, '');\n        if (FIELD_LABELS[cleaned]) return FIELD_LABELS[cleaned];\n        return cleaned.replace(\/_\/g, ' ').replace(\/^\\w\/, function(c) {\n          return c.toUpperCase();\n        });\n      }\n\n      \/**\n       * \u00c9chappe le HTML pour \u00e9viter les injections XSS\n       *\/\n      function escapeHtml(str) {\n        if (!str) return '';\n        var div = document.createElement('div');\n        div.textContent = str;\n        return div.innerHTML;\n      }\n\n      \/**\n       * Normalise une cha\u00eene pour une recherche insensible aux accents et \u00e0 la casse\n       * \"Caf\u00e9\" \u2192 \"cafe\" | \"H\u00f4tel\" \u2192 \"hotel\" | \"BI\u00c8RE\" \u2192 \"biere\"\n       *\/\n      function stripAccents(str) {\n        return (str || '').toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '');\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      \/\/ FILTRES \u2014 Onglets, checkboxes, recherche\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      var activeCategoryFilter = 'all';\n      var searchQuery = '';\n\n      \/**\n       * Applique tous les filtres actifs (cat\u00e9gorie, type, \u00e9quipements, recherche)\n       * Met \u00e0 jour la visibilit\u00e9 des cards et les compteurs\n       *\/\n      function applyFilters() {\n        var selectedTypes = Array.from(document.querySelectorAll('.em-filter-type:checked')).map(function(cb) {\n          return cb.value;\n        });\n        var selectedFeatures = Array.from(document.querySelectorAll('.em-filter-feat:checked')).map(function(cb) {\n          return cb.value;\n        });\n        var cards = document.querySelectorAll('.em-card');\n        var visibleCount = 0;\n        var normalizedQuery = stripAccents(searchQuery);\n\n        cards.forEach(function(card) {\n          var cardType = card.getAttribute('data-type');\n          var cardFeatures = (card.getAttribute('data-features') || '').split(',').filter(Boolean);\n          var cardName = card.getAttribute('data-name') || '';\n\n          \/\/ V\u00e9rifier chaque crit\u00e8re de filtre\n          var matchesCategory = (activeCategoryFilter === 'all' || activeCategoryFilter === cardType);\n          var matchesType = selectedTypes.indexOf(cardType) !== -1;\n          var matchesSearch = (normalizedQuery === '' || stripAccents(cardName).indexOf(normalizedQuery) !== -1);\n\n          var isVisible = matchesCategory && matchesType && matchesSearch;\n\n          \/\/ Filtre \u00e9quipements (uniquement pour les h\u00e9bergements)\n          if (isVisible && (cardType === 'accommodation' || cardType === 'accomodation') && selectedFeatures.length > 0) {\n            isVisible = selectedFeatures.every(function(feat) {\n              return cardFeatures.indexOf(feat) !== -1;\n            });\n          }\n\n          card.classList.toggle('em-hidden', !isVisible);\n          if (isVisible) visibleCount++;\n        });\n\n        \/\/ Mise \u00e0 jour des compteurs\n        document.getElementById('em-stat-visible').textContent = visibleCount;\n        document.getElementById('em-empty').style.display = visibleCount === 0 ? 'block' : 'none';\n\n        \/\/ Mise \u00e0 jour des marqueurs de la carte\n        if (typeof updateMapMarkers === 'function') {\n          updateMapMarkers(activeCategoryFilter === 'all' ? selectedTypes : [activeCategoryFilter]);\n        }\n\n        \/\/ Sync visuel de la l\u00e9gende carte avec les filtres actifs\n        document.querySelectorAll('.em-map-legend-item').forEach(function(item) {\n          var type = item.getAttribute('data-type');\n          var matchesCategory = (activeCategoryFilter === 'all' || activeCategoryFilter === type);\n          var matchesType = selectedTypes.indexOf(type) !== -1;\n          item.classList.toggle('em-map-legend-item--off', !(matchesCategory && matchesType));\n        });\n\n        \/\/ Masque le groupe \u00e9quipements si accommodation n'est pas dans les filtres actifs\n        var featGroup = document.querySelector('.em-filter-group .em-filter-label');\n        var equipGroup = Array.from(document.querySelectorAll('.em-filter-group')).find(function(g) {\n          return g.querySelector('.em-filter-feat');\n        });\n\n        if (equipGroup) {\n          var accomActive = (activeCategoryFilter === 'all' || activeCategoryFilter === 'accommodation' || activeCategoryFilter === 'accomodation') &&\n            selectedTypes.some(function(t) {\n              return t === 'accommodation' || t === 'accomodation';\n            });\n          equipGroup.style.display = accomActive ? '' : 'none';\n        }\n      }\n\n      \/**\n       * Synchronise les checkboxes Type avec l'onglet actif\n       * \"all\" \u2192 toutes coch\u00e9es | type X \u2192 seule la checkbox X coch\u00e9e\n       *\/\n      function syncTypeCheckboxesFromTab() {\n        document.querySelectorAll('.em-filter-type').forEach(function(cb) {\n          cb.checked = (activeCategoryFilter === 'all') || (cb.value === activeCategoryFilter);\n        });\n      }\n\n      \/**\n       * Synchronise l'onglet actif avec l'\u00e9tat des checkboxes Type\n       * Toutes coch\u00e9es \u2192 \"all\" | exactement une \u2192 onglet de ce type | sous-ensemble \u2192 aucun onglet (cas personnalis\u00e9)\n       *\/\n      function syncTabsFromTypeCheckboxes() {\n        var typeCbs = Array.from(document.querySelectorAll('.em-filter-type'));\n        var checked = typeCbs.filter(function(cb) {\n          return cb.checked;\n        });\n        var matchingTab = null;\n        if (checked.length === typeCbs.length) matchingTab = 'all';\n        else if (checked.length === 1) matchingTab = checked[0].value;\n        \/\/ sous-ensemble : matchingTab reste null \u2192 aucun onglet n'est actif, le filtre logique tombe sur 'all'\n        activeCategoryFilter = matchingTab || 'all';\n        document.querySelectorAll('.em-tab').forEach(function(t) {\n          t.classList.toggle('active', t.getAttribute('data-filter') === matchingTab);\n        });\n      }\n\n      \/**\n       * Replace le d\u00e9but du layout sous l'\u00e9ventuel header sticky du th\u00e8me.\n       *\/\n      function scrollToLayoutTop() {\n        var layout = document.querySelector('.em-layout');\n        if (!layout) return;\n\n        var headerOffset = parseFloat(\n          getComputedStyle(document.documentElement).getPropertyValue('--em-header-offset')\n        ) || 0;\n        var top = window.scrollY + layout.getBoundingClientRect().top - headerOffset - 16;\n\n        window.scrollTo({\n          top: Math.max(0, top),\n          behavior: 'smooth'\n        });\n      }\n\n      \/\/ \u2500\u2500\u2500 Onglets de cat\u00e9gories \u2500\u2500\u2500\n      document.querySelectorAll('.em-tab').forEach(function(tab) {\n        tab.addEventListener('click', function() {\n          document.querySelectorAll('.em-tab').forEach(function(t) {\n            t.classList.remove('active');\n          });\n          tab.classList.add('active');\n          activeCategoryFilter = tab.getAttribute('data-filter');\n          syncTypeCheckboxesFromTab();\n\n          \/\/ Reset \u00e9quipements si on revient sur \"Tout\" ou un onglet non-accommodation\n          if (activeCategoryFilter !== 'accommodation' && activeCategoryFilter !== 'accomodation') {\n            document.querySelectorAll('.em-filter-feat').forEach(function(cb) {\n              cb.checked = false;\n            });\n          }\n\n          applyFilters();\n          scrollToLayoutTop();\n        });\n      });\n\n      \/\/ \u2500\u2500\u2500 Checkboxes filtres \u2500\u2500\u2500\n      document.querySelectorAll('.em-filter-type, .em-filter-feat').forEach(function(checkbox) {\n        checkbox.addEventListener('change', function() {\n          if (checkbox.classList.contains('em-filter-type')) {\n            syncTabsFromTypeCheckboxes();\n\n            \/\/ Reset \u00e9quipements si accommodation n'est plus le seul type s\u00e9lectionn\u00e9\n            var selectedTypes = Array.from(document.querySelectorAll('.em-filter-type:checked')).map(function(cb) {\n              return cb.value;\n            });\n            var onlyAccom = selectedTypes.every(function(t) {\n              return t === 'accommodation' || t === 'accomodation';\n            });\n            if (!onlyAccom) {\n              document.querySelectorAll('.em-filter-feat').forEach(function(cb) {\n                cb.checked = false;\n              });\n            }\n          }\n\n          \/\/ Si \u00e9quipement coch\u00e9 \u2192 active l'onglet accommodation\n          if (checkbox.classList.contains('em-filter-feat') && checkbox.checked) {\n            activeCategoryFilter = 'accommodation';\n\n            \/\/ Coche uniquement accommodation dans les types\n            document.querySelectorAll('.em-filter-type').forEach(function(cb) {\n              cb.checked = cb.value === 'accommodation' || cb.value === 'accomodation';\n            });\n\n            \/\/ Active l'onglet visuellement\n            document.querySelectorAll('.em-tab').forEach(function(t) {\n              var filter = t.getAttribute('data-filter');\n              t.classList.toggle('active', filter === 'accommodation' || filter === 'accomodation');\n            });\n          }\n\n          applyFilters();\n          scrollToLayoutTop();\n        });\n      });\n\n      \/\/ \u2500\u2500\u2500 L\u00e9gende carte cliquable : toggle de la checkbox Type correspondante \u2500\u2500\u2500\n      \/\/ R\u00e9utilise la pipeline checkbox (sync onglets + applyFilters via dispatchEvent)\n      document.querySelectorAll('.em-map-legend-item').forEach(function(item) {\n        item.addEventListener('click', function() {\n          var type = item.getAttribute('data-type');\n          var typeCb = Array.from(document.querySelectorAll('.em-filter-type')).find(function(cb) {\n            return cb.value === type;\n          });\n          if (typeCb) {\n            typeCb.checked = !typeCb.checked;\n            typeCb.dispatchEvent(new Event('change'));\n          }\n        });\n      });\n\n      \/\/ \u2500\u2500\u2500 Barre de recherche \u2500\u2500\u2500\n      var searchInput = document.getElementById('em-search');\n      if (searchInput) {\n        searchInput.addEventListener('input', function(e) {\n          searchQuery = e.target.value;\n          applyFilters();\n        });\n      }\n\n      \/\/ \u2500\u2500\u2500 Bouton r\u00e9initialiser \u2500\u2500\u2500\n      var resetButton = document.getElementById('em-reset-filters');\n      if (resetButton) {\n        resetButton.addEventListener('click', function() {\n          document.querySelectorAll('.em-filter-type').forEach(function(cb) {\n            cb.checked = true;\n          });\n          document.querySelectorAll('.em-filter-feat').forEach(function(cb) {\n            cb.checked = false;\n          });\n          if (searchInput) searchInput.value = '';\n          searchQuery = '';\n          activeCategoryFilter = 'all';\n\n          \/\/ Remettre l'onglet \"Tout\" actif\n          document.querySelectorAll('.em-tab').forEach(function(t) {\n            t.classList.remove('active');\n          });\n          var allTab = document.querySelector('.em-tab[data-filter=\"all\"]');\n          if (allTab) allTab.classList.add('active');\n\n          applyFilters();\n        });\n      }\n\n      \/\/ Application initiale des filtres\n      applyFilters();\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\u00e9tail d'une fiche\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      \/\/ Clic sur une card \u2192 ouvrir la modal\n      document.querySelectorAll('.em-card').forEach(function(card) {\n        card.addEventListener('click', function() {\n          var cardData = JSON.parse(card.getAttribute('data-json'));\n          openDetailModal(cardData);\n        });\n      });\n\n      \/**\n       * Ouvre la modal de d\u00e9tail pour une fiche\n       * Affiche l'image (si disponible), les champs et le lien externe\n       *\/\n      function openDetailModal(item) {\n        var entries = Object.entries(item.data || {}).filter(function(entry) {\n          return EXCLUDED_KEYS.indexOf(entry[0]) === -1 &&\n            entry[1] && entry[1] !== '' &&\n            typeof entry[1] !== 'object';\n        }).map(function(entry) {\n          var value = entry[1];\n          if (value === true || value === 'true') value = 'Oui';\n          else if (value === false || value === 'false') value = 'Non';\n          return {\n            label: getFieldLabel(entry[0]),\n            value: String(value)\n          };\n        });\n\n        var hasImage = item.image && item.image.indexOf('http') === 0;\n        var html = '<div class=\"em-modal\">';\n\n        if (hasImage) {\n          html += '<div class=\"em-modal-img-wrap\">' +\n            '<img decoding=\"async\" class=\"em-modal-img\" src=\"' + escapeHtml(item.image) + '\" alt=\"' + escapeHtml(item.name) + '\" onerror=\"this.style.display=\\'none\\'\">' +\n            '<div class=\"em-modal-img-gradient\"><\/div>' +\n            '<button class=\"em-modal-close\" data-close>&times;<\/button>' +\n            '<div class=\"em-modal-img-info\">' +\n            '<p class=\"em-modal-img-cat\">' + escapeHtml(item.category || '') + '<\/p>' +\n            '<h3 class=\"em-modal-img-title\">' + escapeHtml(item.name) + '<\/h3>' +\n            '<\/div><\/div>';\n        } else {\n          html += '<div class=\"em-modal-header-noimg\"><div>' +\n            '<p class=\"em-modal-header-noimg-cat\">' + escapeHtml(item.category || '') + '<\/p>' +\n            '<h3 class=\"em-modal-header-noimg-title\">' + escapeHtml(item.name) + '<\/h3>' +\n            '<\/div><button class=\"em-modal-close-noimg\" data-close>&times;<\/button><\/div>';\n        }\n\n        html += '<div class=\"em-modal-body\">';\n\n        \/\/ Badge date d'\u00e9v\u00e9nement\n        if (item.event) {\n          html += '<div class=\"em-modal-event\">' +\n            '<svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"1.8\" style=\"vertical-align:middle;margin-right:6px\">' +\n            '<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.75 3v2.25M17.25 3v2.25M3.75 18.75V7.5a2.25 2.25 0 012.25-2.25h12a2.25 2.25 0 012.25 2.25v11.25m-16.5 0A2.25 2.25 0 006 21h12a2.25 2.25 0 002.25-2.25m-16.5 0V11.25h16.5v7.5M3.75 11.25h16.5\"\/><\/svg>' +\n            escapeHtml(item.event) + '<\/div>';\n        }\n\n        \/\/ Champs g\u00e9n\u00e9riques\n        entries.forEach(function(entry) {\n          html += '<div class=\"em-modal-entry\">' +\n            '<p class=\"em-modal-entry-label\">' + escapeHtml(entry.label) + '<\/p>' +\n            '<p class=\"em-modal-entry-value\">' + escapeHtml(entry.value) + '<\/p>' +\n            '<\/div>';\n        });\n\n        \/\/ Vid\u00e9o (iframe ou <video>)\n        if (item.video_url) {\n          html += '<div class=\"em-modal-entry\"><p class=\"em-modal-entry-label\">Vid\u00e9o<\/p>';\n          var embed = item.video_embed;\n          if (embed && (embed.type === 'youtube' || embed.type === 'vimeo')) {\n            html += '<div class=\"em-modal-video-wrap\"><iframe src=\"' + escapeHtml(embed.src) + '\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen referrerpolicy=\"strict-origin-when-cross-origin\"><\/iframe><\/div>';\n          } else if (embed && embed.type === 'file') {\n            html += '<video src=\"' + escapeHtml(embed.src) + '\" controls preload=\"metadata\" class=\"em-modal-video-file\"><\/video>';\n          } else {\n            html += '<a href=\"' + escapeHtml(item.video_url) + '\" target=\"_blank\" rel=\"noopener\" class=\"em-modal-link\">' + escapeHtml(item.video_url) + '<\/a>';\n          }\n          html += '<\/div>';\n        }\n\n        \/\/ Galerie d'images (template has_gallery=true)\n        if (Array.isArray(item.gallery) && item.gallery.length > 0) {\n          html += '<div class=\"em-modal-entry\"><p class=\"em-modal-entry-label\">Galerie (' + item.gallery.length + ')<\/p>' +\n            '<div class=\"em-modal-gallery\">';\n          item.gallery.forEach(function(imgUrl) {\n            if (typeof imgUrl !== 'string' || imgUrl === '') return;\n            html += '<a href=\"' + escapeHtml(imgUrl) + '\" target=\"_blank\" rel=\"noopener\" class=\"em-modal-gallery-item\">' +\n              '<img decoding=\"async\" src=\"' + escapeHtml(imgUrl) + '\" alt=\"\" loading=\"lazy\" \/><\/a>';\n          });\n          html += '<\/div><\/div>';\n        }\n\n        \/\/ Documents PDF (template has_documents=true)\n        if (Array.isArray(item.documents) && item.documents.length > 0) {\n          html += '<div class=\"em-modal-entry\"><p class=\"em-modal-entry-label\">Documents (' + item.documents.length + ')<\/p>' +\n            '<ul class=\"em-modal-docs\">';\n          item.documents.forEach(function(doc) {\n            if (!doc || typeof doc !== 'object' || !doc.url) return;\n            var docName = doc.nom || 'Document';\n            var docType = (doc.type || '').toString().toLowerCase();\n            html += '<li><a href=\"' + escapeHtml(doc.url) + '\" target=\"_blank\" rel=\"noopener\" class=\"em-modal-doc\">' +\n              '<svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">' +\n              '<path fill-rule=\"evenodd\" d=\"M4 4a2 2 0 0 1 2-2h4.586A2 2 0 0 1 12 2.586L15.414 6A2 2 0 0 1 16 7.414V16a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4Z\" clip-rule=\"evenodd\" \/><\/svg>' +\n              '<span class=\"em-modal-doc-name\">' + escapeHtml(docName) + '<\/span>' +\n              (docType ? '<span class=\"em-modal-doc-type\">' + escapeHtml(docType) + '<\/span>' : '') +\n              '<\/a><\/li>';\n          });\n          html += '<\/ul><\/div>';\n        }\n\n        \/\/ Questions fr\u00e9quentes\n        if (Array.isArray(item.faq) && item.faq.length > 0) {\n          html += '<div class=\"em-modal-faq\">' +\n            '<p class=\"em-modal-entry-label\">Questions fr\u00e9quentes (' + item.faq.length + ')<\/p>';\n          item.faq.forEach(function(qa) {\n            html += '<div class=\"em-modal-faq-item\">' +\n              '<div class=\"em-modal-faq-q\">' + escapeHtml(qa.question) + '<\/div>' +\n              '<div class=\"em-modal-faq-a' + (qa.answer ? '' : ' em-modal-faq-a-empty') + '\">' +\n              escapeHtml(qa.answer || 'Pas encore de r\u00e9ponse.') +\n              '<\/div><\/div>';\n          });\n          html += '<\/div>';\n        }\n\n        html += '<\/div>';\n\n        html += '<div class=\"em-modal-footer\">';\n        if (item.link && item.link.indexOf('http') === 0) {\n          html += '<a href=\"' + escapeHtml(item.link) + '\" target=\"_blank\" rel=\"noopener\" class=\"em-modal-link\">Ouvrir le lien &rarr;<\/a>';\n        } else {\n          html += '<span><\/span>';\n        }\n        html += '<button class=\"em-modal-close-btn\" data-close>Fermer<\/button><\/div><\/div>';\n\n        var overlay = document.createElement('div');\n        overlay.className = 'em-modal-overlay';\n        overlay.innerHTML = html;\n        document.body.appendChild(overlay);\n\n        \/\/ Bloque le scroll arri\u00e8re-plan\n        document.body.style.overflow = 'hidden';\n\n        function closeModal() {\n          document.body.style.overflow = '';\n          overlay.remove();\n        }\n\n        overlay.querySelectorAll('[data-close]').forEach(function(btn) {\n          btn.addEventListener('click', closeModal);\n        });\n        overlay.addEventListener('click', function(e) {\n          if (e.target === overlay) closeModal();\n        });\n        document.addEventListener('keydown', function escapeHandler(e) {\n          if (e.key === 'Escape') {\n            closeModal();\n            document.removeEventListener('keydown', escapeHandler);\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      \/\/ CARTE LEAFLET \u2014 Marqueurs + interactions\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      var initLeafletTries = 0;\n      function initLeafletMap() {\n        var mapElement = document.getElementById('em-map');\n        \/\/ Si le div n'est pas encore pars\u00e9 (script d\u00e9plac\u00e9 par un optimiseur) ou si Leaflet\n        \/\/ est encore en train de se charger (defer\/async), on retente. Cap \u00e0 100 essais (~10s).\n        if (!mapElement || typeof L === 'undefined') {\n          if (++initLeafletTries > 100) return;\n          return setTimeout(initLeafletMap, 100);\n        }\n\n        \/\/ Initialisation de la carte\n        var map = L.map(mapElement, {\n          zoomControl: false,\n          attributionControl: false,\n          scrollWheelZoom: false,\n        }).setView([46.6, 1.9], 6);\n\n        \/\/ Tuiles en premier\n        L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/rastertiles\/voyager\/{z}\/{x}\/{y}{r}.png', {\n          maxZoom: 19,\n          subdomains: 'abcd'\n        }).addTo(map);\n\n        \/\/ Contr\u00f4les UI ensuite\n        L.control.zoom({\n          position: 'topright'\n        }).addTo(map);\n        L.control.attribution({\n            position: 'bottomright',\n            prefix: false\n          })\n          .addAttribution('&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OSM<\/a> &copy; <a href=\"https:\/\/carto.com\/\">CARTO<\/a>')\n          .addTo(map);\n\n        \/\/ Bouton de recentrage\n        L.Control.Recenter = L.Control.extend({\n          onAdd: function() {\n            const container = L.DomUtil.create('div', 'leaflet-bar leaflet-control');\n            const btn = L.DomUtil.create('a', '', container);\n            btn.innerHTML = '<svg width=\"16\" height=\"16\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"3\"><circle cx=\"12\" cy=\"12\" r=\"3\"\/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 2v3M12 19v3M2 12h3M19 12h3\"\/><\/svg>';\n            btn.href = '#';\n            btn.title = 'Recentrer la carte';\n            btn.style.display = 'flex';\n            btn.style.alignItems = 'center';\n            btn.style.justifyContent = 'center';\n            L.DomEvent.on(btn, 'click', function(e) {\n              L.DomEvent.preventDefault(e);\n              if (allBounds.length > 1) map.fitBounds(allBounds, {\n                padding: [40, 40]\n              });\n              else if (allBounds.length === 1) map.setView(allBounds[0], 13);\n            });\n            return container;\n          }\n        });\n        new L.Control.Recenter({\n          position: 'topright'\n        }).addTo(map);\n\n        \/\/ Donn\u00e9es inject\u00e9es depuis PHP\n        var gpsPoints = [{\"lat\":43.604482,\"lng\":1.443962,\"name\":\"Toulouse\",\"type\":\"villes-aux-alentours\",\"idx\":0},{\"lat\":43.53,\"lng\":1.5308333,\"name\":\"Lab\\u00e8ge\",\"type\":\"villes-aux-alentours\",\"idx\":1},{\"lat\":43.5163889,\"lng\":1.4988889,\"name\":\"Castanet-Tolosan\",\"type\":\"villes-aux-alentours\",\"idx\":2},{\"lat\":43.4736111,\"lng\":1.5497222,\"name\":\"Donneville\",\"type\":\"villes-aux-alentours\",\"idx\":3},{\"lat\":43.4916667,\"lng\":1.5177778,\"name\":\"Pompertuzat\",\"type\":\"villes-aux-alentours\",\"idx\":4},{\"lat\":43.486776,\"lng\":1.532408,\"name\":\"Pot d'accueil et animations estivales\",\"type\":\"activites-aux-alentours\",\"idx\":6},{\"lat\":43.405278,\"lng\":3.6975,\"name\":\"Balade le long du Canal du Midi\",\"type\":\"activites-aux-alentours\",\"idx\":7},{\"lat\":44.8686142,\"lng\":1.045332,\"name\":\"Visite du Quartier Saint-Cyprien\",\"type\":\"activites-aux-alentours\",\"idx\":8},{\"lat\":43.572547,\"lng\":1.478417,\"name\":\"Visite de la Halle de la Machine\",\"type\":\"activites-aux-alentours\",\"idx\":9}];\n        var categoryColorMap = {\"villes-aux-alentours\":\"#0891b2\",\"activites-aux-alentours\":\"#db2777\"};\n        var categoryLabelMap = {\"villes-aux-alentours\":\"Villes aux alentours\",\"activites-aux-alentours\":\"Activit\\u00e9s aux alentours \"};\n\n        var markers = []; \/\/ Tous les marqueurs [{marker, type, latLng, idx}]\n        var allBounds = []; \/\/ Coordonn\u00e9es pour le fitBounds initial\n        var activeMarker = null; \/\/ Marqueur actuellement s\u00e9lectionn\u00e9\n\n        \/**\n         * Cr\u00e9e une ic\u00f4ne SVG circulaire pour un marqueur Leaflet\n         * @param {string} color  \u2014 Couleur de remplissage\n         * @param {number} size   \u2014 Diam\u00e8tre du cercle int\u00e9rieur (d\u00e9faut: 12)\n         *\/\n        function createMarkerIcon(color, size) {\n          size = size || 12;\n          var outerSize = size + 8;\n          var center = outerSize \/ 2;\n          return L.divIcon({\n            className: 'em-marker',\n            html: '<svg width=\"' + outerSize + '\" height=\"' + outerSize + '\" viewBox=\"0 0 ' + outerSize + ' ' + outerSize + '\">' +\n              '<circle cx=\"' + center + '\" cy=\"' + center + '\" r=\"' + (size \/ 2 + 2) + '\" fill=\"white\" opacity=\"0.9\"\/>' +\n              '<circle cx=\"' + center + '\" cy=\"' + center + '\" r=\"' + (size \/ 2) + '\" fill=\"' + color + '\"\/>' +\n              '<\/svg>',\n            iconSize: [outerSize, outerSize],\n            iconAnchor: [center, center],\n            popupAnchor: [0, -(size \/ 2 + 6)]\n          });\n        }\n\n        \/\/ \u2500\u2500\u2500 Placement des marqueurs sur la carte \u2500\u2500\u2500\n        gpsPoints.forEach(function(point) {\n          var color = categoryColorMap[point.type] || '#6b7280';\n          var catLabel = categoryLabelMap[point.type] || point.type;\n          var icon = createMarkerIcon(color, 12);\n          var marker = L.marker([point.lat, point.lng], {\n            icon: icon\n          }).addTo(map);\n\n          \/\/ Popup au clic\n          var popupHtml = '<div class=\"em-map-popup\">' +\n            '<p class=\"em-map-popup-name\">' + escapeHtml(point.name) + '<\/p>' +\n            '<p class=\"em-map-popup-cat\" style=\"color:' + color + '\">' + escapeHtml(catLabel) + '<\/p>' +\n            '<button class=\"em-map-popup-btn\" data-card-idx=\"' + point.idx + '\">Voir la fiche \u2192<\/button>' +\n            '<\/div>';\n          marker.bindPopup(popupHtml, {\n            closeButton: false,\n            minWidth: 180\n          });\n\n          \/\/ Highlight du marqueur actif\n          marker.on('click', function() {\n            if (activeMarker && activeMarker.getElement()) activeMarker.getElement().classList.remove('em-marker--active');\n            if (marker.getElement()) marker.getElement().classList.add('em-marker--active');\n            activeMarker = marker;\n          });\n\n          \/\/ Bouton \"Voir la fiche\" dans la popup\n          marker.on('popupopen', function() {\n            var popupBtn = document.querySelector('.em-map-popup-btn[data-card-idx=\"' + point.idx + '\"]');\n            if (popupBtn) {\n              popupBtn.addEventListener('click', function() {\n                var allCards = document.querySelectorAll('.em-card');\n                var targetCard = allCards[point.idx];\n                if (targetCard) {\n                  var cardData = JSON.parse(targetCard.getAttribute('data-json'));\n                  openDetailModal(cardData);\n                }\n                map.closePopup();\n              });\n            }\n          });\n\n          markers.push({\n            marker: marker,\n            type: point.type,\n            latLng: [point.lat, point.lng],\n            idx: point.idx\n          });\n          allBounds.push([point.lat, point.lng]);\n        });\n\n        \/\/ Cadrage initial de la carte\n        if (allBounds.length > 1) map.fitBounds(allBounds, {\n          padding: [40, 40]\n        });\n        else if (allBounds.length === 1) map.setView(allBounds[0], 13);\n        setTimeout(function() {\n          map.invalidateSize();\n        }, 100);\n\n        \/\/ \u2500\u2500\u2500 Interaction cards \u2194 marqueurs (hover) \u2500\u2500\u2500\n        document.querySelectorAll('.em-card').forEach(function(card, cardIndex) {\n          card.addEventListener('mouseenter', function() {\n            markers.forEach(function(m) {\n              if (m.idx === cardIndex) {\n                m.marker.setIcon(createMarkerIcon(categoryColorMap[m.type] || '#6b7280', 18));\n                m.marker.setZIndexOffset(1000);\n              }\n            });\n          });\n          card.addEventListener('mouseleave', function() {\n            markers.forEach(function(m) {\n              if (m.idx === cardIndex) {\n                m.marker.setIcon(createMarkerIcon(categoryColorMap[m.type] || '#6b7280', 12));\n                m.marker.setZIndexOffset(0);\n              }\n            });\n          });\n        });\n\n        \/**\n         * Met \u00e0 jour la visibilit\u00e9 des marqueurs selon les types s\u00e9lectionn\u00e9s\n         * Appel\u00e9 par applyFilters() quand les filtres changent\n         *\/\n        window.updateMapMarkers = function(visibleTypes) {\n          var visibleBounds = [];\n          markers.forEach(function(m) {\n            if (visibleTypes.indexOf(m.type) !== -1) {\n              if (!map.hasLayer(m.marker)) map.addLayer(m.marker);\n              visibleBounds.push(m.latLng);\n            } else {\n              if (map.hasLayer(m.marker)) map.removeLayer(m.marker);\n            }\n          });\n\n          var hasPoints = visibleBounds.length > 0;\n          var mapSection = document.querySelector('.em-map-section');\n          var mapToggleBtn = document.getElementById('em-map-toggle');\n\n          if (mapSection) mapSection.style.display = hasPoints ? '' : 'none';\n          if (mapToggleBtn) {\n            mapToggleBtn.disabled = !hasPoints;\n            mapToggleBtn.style.opacity = hasPoints ? '' : '0.4';\n            mapToggleBtn.style.cursor = hasPoints ? '' : 'not-allowed';\n            \/\/ Ne touche pas \u00e0 .active \u2014 c'est le listener toggle qui le g\u00e8re\n          }\n\n          if (visibleBounds.length > 1) map.fitBounds(visibleBounds, {\n            padding: [40, 40],\n            maxZoom: 14\n          });\n          else if (visibleBounds.length === 1) map.setView(visibleBounds[0], 13);\n        };\n\n        \/\/ \u2500\u2500\u2500 Toggle visibilit\u00e9 de la carte \u2500\u2500\u2500\n        var mapToggle = document.getElementById('em-map-toggle');\n        var mapWrapper = document.getElementById('em-map-wrap');\n        if (mapToggle && mapWrapper) {\n          mapToggle.addEventListener('click', function() {\n            if (mapToggle.disabled) return;\n            var isVisible = mapWrapper.style.display !== 'none';\n            mapWrapper.style.display = isVisible ? 'none' : '';\n            mapToggle.classList.toggle('active', !isVisible);\n            if (!isVisible) setTimeout(function() {\n              map.invalidateSize();\n            }, 100);\n          });\n        }\n\n      }\n      initLeafletMap();\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      \/\/ MOBILE \/ TABLETTE \u2014 Sidebar filtres collapsible\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      \/**\n       * Sur mobile et tablette (\u22641024px), la sidebar filtres est repli\u00e9e par d\u00e9faut\n       * Un clic sur le titre la d\u00e9plie\/replie\n       *\/\n      function initMobileFilters() {\n        var filtersContainer = document.querySelector('.em-filters');\n        var filtersTitle = document.querySelector('.em-filters-title');\n        if (!filtersContainer || !filtersTitle) return;\n\n        var wrap = filtersContainer.closest('.em-wrap');\n        var backdrop = document.createElement('div');\n        backdrop.className = 'em-filter-backdrop';\n        filtersContainer.parentNode.insertBefore(backdrop, filtersContainer);\n\n        function isMobileOverlay() {\n          return window.innerWidth <= 720;\n        }\n\n        function setFiltersOpen(isOpen) {\n          filtersContainer.classList.toggle('collapsed', !isOpen);\n          filtersTitle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');\n          backdrop.classList.toggle('is-visible', isOpen && isMobileOverlay());\n          document.documentElement.classList.toggle('em-filters-open', isOpen && isMobileOverlay());\n          if (wrap) wrap.classList.toggle('em-mobile-filters-open', isOpen && isMobileOverlay());\n        }\n\n        if (window.innerWidth <= 1024) {\n          setFiltersOpen(false);\n        } else {\n          setFiltersOpen(true);\n        }\n\n        filtersTitle.addEventListener('click', function() {\n          if (window.innerWidth <= 1024) {\n            setFiltersOpen(filtersContainer.classList.contains('collapsed'));\n          }\n        });\n\n        backdrop.addEventListener('click', function() {\n          setFiltersOpen(false);\n        });\n\n        document.addEventListener('keydown', function(event) {\n          if (event.key === 'Escape' && !filtersContainer.classList.contains('collapsed')) {\n            setFiltersOpen(false);\n          }\n        });\n\n        window.addEventListener('resize', function() {\n          if (window.innerWidth > 1024) {\n            setFiltersOpen(true);\n          } else if (window.innerWidth > 720) {\n            backdrop.classList.remove('is-visible');\n            document.documentElement.classList.remove('em-filters-open');\n            if (wrap) wrap.classList.remove('em-mobile-filters-open');\n          } else if (!filtersContainer.classList.contains('collapsed')) {\n            backdrop.classList.add('is-visible');\n            document.documentElement.classList.add('em-filters-open');\n            if (wrap) wrap.classList.add('em-mobile-filters-open');\n          }\n        });\n      }\n\n      initMobileFilters();\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      \/\/ OFFSET HEADER TH\u00c8ME \u2014 D\u00e9tecte un header sticky\/fix\u00e9 + injecte un overlay opaque sous celui-ci pour les th\u00e8mes au header semi-transparent\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 HEADER_SELECTORS = 'header, .site-header, #masthead, #header, .header, .navbar, .nav-bar, body > nav, body > .top-bar';\n\n      \/\/ Inject l'overlay opaque dans le body (au niveau racine, \u00e9vite les pi\u00e8ges de stacking context si le th\u00e8me a un transform sur un anc\u00eatre)\n      if (!document.getElementById('em-header-overlay')) {\n        var overlay = document.createElement('div');\n        overlay.id = 'em-header-overlay';\n        document.body.appendChild(overlay);\n      }\n\n      function updateThemeHeaderOffset() {\n        var bottom = 0;\n        document.querySelectorAll(HEADER_SELECTORS).forEach(function(el) {\n          var style = window.getComputedStyle(el);\n          if (style.position !== 'fixed' && style.position !== 'sticky') return;\n          var rect = el.getBoundingClientRect();\n          if (rect.top <= 50 && rect.bottom > bottom) bottom = rect.bottom;\n        });\n        document.documentElement.style.setProperty('--em-header-offset', Math.max(0, bottom) + 'px');\n      }\n\n      function updateScrolledClass() {\n        document.documentElement.classList.toggle('em-scrolled', window.scrollY > 0);\n      }\n\n      updateThemeHeaderOffset();\n      updateScrolledClass();\n\n      window.addEventListener('resize', updateThemeHeaderOffset);\n\n      var headerTicking = false;\n      window.addEventListener('scroll', function() {\n        if (headerTicking) return;\n        headerTicking = true;\n        requestAnimationFrame(function() {\n          updateThemeHeaderOffset();\n          updateScrolledClass();\n          headerTicking = false;\n        });\n      }, {\n        passive: true\n      });\n\n    })();\n  <\/script>\n\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"sujet":[],"class_list":["post-6291","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Discover your surroundings - Les Violettes<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Discover your surroundings - Les Violettes\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/\" \/>\n<meta property=\"og:site_name\" content=\"Les Violettes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/\",\"url\":\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/\",\"name\":\"Discover your surroundings - Les Violettes\",\"isPartOf\":{\"@id\":\"https:\/\/www.campinglesviolettes.com\/#website\"},\"datePublished\":\"2026-03-03T08:12:48+00:00\",\"dateModified\":\"2026-03-03T08:12:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Camping Occitanie\",\"item\":\"https:\/\/www.campinglesviolettes.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Discover your surroundings\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.campinglesviolettes.com\/#website\",\"url\":\"https:\/\/www.campinglesviolettes.com\/\",\"name\":\"Les Violettes\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.campinglesviolettes.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.campinglesviolettes.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.campinglesviolettes.com\/#organization\",\"name\":\"Les Violettes\",\"url\":\"https:\/\/www.campinglesviolettes.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.campinglesviolettes.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/logo-camping-les-violettes.png\",\"contentUrl\":\"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/logo-camping-les-violettes.png\",\"width\":250,\"height\":206,\"caption\":\"Les Violettes\"},\"image\":{\"@id\":\"https:\/\/www.campinglesviolettes.com\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Discover your surroundings - Les Violettes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/","og_locale":"en_US","og_type":"article","og_title":"Discover your surroundings - Les Violettes","og_url":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/","og_site_name":"Les Violettes","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/","url":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/","name":"Discover your surroundings - Les Violettes","isPartOf":{"@id":"https:\/\/www.campinglesviolettes.com\/#website"},"datePublished":"2026-03-03T08:12:48+00:00","dateModified":"2026-03-03T08:12:48+00:00","breadcrumb":{"@id":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.campinglesviolettes.com\/elaia-metadatas\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Camping Occitanie","item":"https:\/\/www.campinglesviolettes.com\/en\/"},{"@type":"ListItem","position":2,"name":"Discover your surroundings"}]},{"@type":"WebSite","@id":"https:\/\/www.campinglesviolettes.com\/#website","url":"https:\/\/www.campinglesviolettes.com\/","name":"Les Violettes","description":"","publisher":{"@id":"https:\/\/www.campinglesviolettes.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.campinglesviolettes.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.campinglesviolettes.com\/#organization","name":"Les Violettes","url":"https:\/\/www.campinglesviolettes.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.campinglesviolettes.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/logo-camping-les-violettes.png","contentUrl":"https:\/\/www.campinglesviolettes.com\/wp-content\/uploads\/2023\/02\/logo-camping-les-violettes.png","width":250,"height":206,"caption":"Les Violettes"},"image":{"@id":"https:\/\/www.campinglesviolettes.com\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/pages\/6291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/comments?post=6291"}],"version-history":[{"count":0,"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/pages\/6291\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/media?parent=6291"}],"wp:term":[{"taxonomy":"sujet","embeddable":true,"href":"https:\/\/www.campinglesviolettes.com\/en\/wp-json\/wp\/v2\/sujet?post=6291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}