{"id":14,"date":"2026-06-02T09:50:49","date_gmt":"2026-06-02T09:50:49","guid":{"rendered":"http:\/\/remplirmagourde.com\/?page_id=14"},"modified":"2026-08-24T09:53:08","modified_gmt":"2026-08-24T09:53:08","slug":"14-2","status":"publish","type":"page","link":"https:\/\/remplirmagourde.com\/","title":{"rendered":"Accueil"},"content":{"rendered":"\n<div style=\"height:21px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Trouvez facilement un point d&#8217;eau potable pr\u00e8s de vous<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Remplir Ma Gourde vous permet de localiser rapidement les points d&#8217;eau potable accessibles autour de vous, partout dans le monde. Recherchez une adresse, utilisez votre position actuelle ou explorez la carte pour trouver o\u00f9 remplir votre gourde en quelques clics. Une solution simple pour s&#8217;hydrater, r\u00e9duire les d\u00e9chets plastiques et adopter des gestes plus responsables au quotidien.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En Is\u00e8re, retrouvez \u00e9galement les \u00e9tablissements priv\u00e9s pr\u00eats \u00e0 remplir votre gourde gratuitement<\/p>\n\n\n\n<style data-wp-block-html=\"css\">\n\/* ==========================\n   RECHERCHE\n========================== *\/\n\n#search-container{\n    display:flex;\n    align-items:center;\n    gap:16px;\n    margin-bottom:24px;\n    flex-wrap:wrap;\n}\n\n#search-wrapper{\n    position:relative;\n    flex:1;\n    min-width:300px;\n}\n\n#searchInput{\n    width:100%;\n    height:64px;\n    padding:0 28px;\n    border:none;\n    border-radius:999px;\n    background:#ffffff;\n    color:#283583;\n    font-size:18px;\n    font-weight:600;\n    box-shadow:0 8px 24px rgba(0,0,0,.08);\n    transition:all .25s ease;\n}\n\n#searchInput::placeholder{\n    color:#283583;\n    opacity:.6;\n}\n\n#searchInput:focus{\n    outline:none;\n    box-shadow:0 10px 30px rgba(40,53,131,.15);\n}\n\n\/* ==========================\n   SUGGESTIONS ADRESSES\n========================== *\/\n\n#suggestions{\n    position:absolute;\n    top:72px;\n    left:0;\n    right:0;\n\n    background:#ffffff;\n\n    border-radius:24px;\n\n    overflow:hidden;\n\n    box-shadow:0 15px 40px rgba(0,0,0,.12);\n\n    z-index:9999;\n\n    display:none;\n\n    padding:8px;\n}\n\n.suggestion-item{\n    padding:14px 18px;\n\n    color:#283583;\n\n    font-size:15px;\n    font-weight:500;\n\n    cursor:pointer;\n\n    transition:all .2s ease;\n\n    border-radius:16px;\n}\n\n.suggestion-item:hover{\n    background:#f4f6fb;\n    transform:translateX(2px);\n}\n\n\/* ==========================\n   BOUTON GEOLOCALISATION\n========================== *\/\n\n#locateBtn{\n    height:64px;\n    padding:0 32px;\n    border:none;\n    border-radius:999px;\n    background:#000;\n    color:#fff;\n    font-size:16px;\n    font-weight:700;\n    cursor:pointer;\n    transition:all .25s ease;\n}\n\n#locateBtn:hover{\n    transform:translateY(-2px);\n    box-shadow:0 10px 24px rgba(0,0,0,.18);\n}\n\n.btn-arrow{\n    display:inline-block;\n    margin-right:12px;\n    font-size:20px;\n    transform:translateY(-1px);\n}\n\n\/* ==========================\n   CARTE\n========================== *\/\n\n#map{\n    width:100%;\n    height:75vh;\n    min-height:600px;\n    border-radius:24px;\n    overflow:hidden;\n    box-shadow:0 20px 40px rgba(0,0,0,.08);\n    position:relative;\n    z-index:1;\n}\n\n\/* ==========================\n   CORRECTION LEAFLET \/ HEADER\n========================== *\/\n\n.leaflet-container{\n    z-index:1;\n}\n\n.leaflet-pane,\n.leaflet-top,\n.leaflet-bottom{\n    z-index:400 !important;\n}\n\n.ct-header,\n.site-header{\n    position:relative;\n    z-index:1000 !important;\n}\n\n\/* ==========================\n   MESSAGE ZOOM\n========================== *\/\n\n#zoom-message{\n    margin-top:16px;\n    color:#283583;\n    font-size:14px;\n    font-weight:500;\n}\n\n\/* ==========================\n   POPUPS\n========================== *\/\n\n.leaflet-popup-content{\n    color:#283583;\n    font-size:14px;\n    line-height:1.5;\n}\n\n.leaflet-popup-content h3{\n    margin:0 0 10px 0;\n    color:#283583;\n    font-size:18px;\n}\n\n\/* ==========================\n   CLUSTERS\n========================== *\/\n\n.marker-cluster-small,\n.marker-cluster-medium,\n.marker-cluster-large{\n    background:rgba(40,53,131,.15);\n}\n\n.marker-cluster div{\n    background:#283583;\n    color:#fff;\n    font-weight:700;\n}\n\n\/* ==========================\n   MOBILE\n========================== *\/\n\n@media (max-width:768px){\n\n    #search-container{\n        flex-direction:column;\n        align-items:stretch;\n    }\n\n    #search-wrapper{\n        width:100%;\n        min-width:auto;\n    }\n\n    #locateBtn{\n        width:100%;\n    }\n\n    #map{\n        height:65vh;\n        min-height:500px;\n    }\n\n}\n\n\/* ==========================\n   FICHE PARTENAIRE\n========================== *\/\n\n.watermap-partner-popup{\n    width:100%;\n    color:#283583;\n    font-size:14px;\n}\n\n.watermap-partner-popup .partner-title{\n    margin:0 0 18px 0;\n    color:#283583;\n    font-size:20px;\n    line-height:1.2;\n    font-weight:700;\n}\n\n.partner-info{\n    display:flex;\n    align-items:flex-start;\n    gap:10px;\n    margin-bottom:13px;\n    line-height:1.45;\n}\n\n.partner-icon{\n    width:22px;\n    flex:0 0 22px;\n    text-align:center;\n    font-size:16px;\n}\n\n.partner-info a{\n    color:#283583;\n    font-weight:600;\n    text-decoration:none;\n}\n\n.partner-info a:hover{\n    text-decoration:underline;\n}\n\n.partner-actions{\n    display:flex;\n    gap:8px;\n    flex-wrap:wrap;\n    margin-top:18px;\n    padding-top:16px;\n    border-top:1px solid #eeeeee;\n}\n\n.partner-action{\n    display:inline-flex;\n    align-items:center;\n    justify-content:center;\n    min-height:40px;\n    padding:0 15px;\n    border-radius:999px;\n    background:#f4f6fb;\n    color:#283583 !important;\n    font-size:13px;\n    font-weight:700;\n    text-decoration:none !important;\n    transition:all .25s ease;\n}\n\n.partner-action:hover{\n    transform:translateY(-2px);\n    box-shadow:0 6px 16px rgba(40,53,131,.12);\n}\n\n.partner-action-primary{\n    background:#283583;\n    color:#fff !important;\n}\n\n.partner-action-primary:hover{\n    background:#202b6d;\n}\n\n\/* ==========================\n   \/* ==========================\n   FILTRES CARTE\n========================== *\/\n\n#watermap-filters{\n    display:flex;\n    align-items:center;\n    gap:10px;\n    margin-bottom:16px;\n    flex-wrap:wrap;\n}\n\n.watermap-filter{\n    height:42px;\n    padding:0 18px;\n    border:none;\n    border-radius:999px;\n    background:#ffffff;\n    color:#283583;\n    font-size:14px;\n    font-weight:600;\n    cursor:pointer;\n    box-shadow:0 6px 18px rgba(0,0,0,.06);\n    transition:all .25s ease;\n\n    display:flex;\n    align-items:center;\n    gap:8px;\n}\n\n.watermap-filter:hover{\n    transform:translateY(-2px);\n    box-shadow:0 8px 22px rgba(40,53,131,.12);\n}\n\n.watermap-filter:not(.active){\n    opacity:.4;\n}\n\n.filter-dot{\n    width:9px;\n    height:9px;\n    border-radius:50%;\n    display:inline-block;\n    flex-shrink:0;\n}\n\n.filter-dot-osm{\n    background:#5B8DEF;\n}\n\n.filter-dot-partner{\n    background:#283583;\n}\n\n\n\/* ==========================\n   MOBILE\n========================== *\/\n\n@media (max-width:768px){\n\n    #watermap-filters{\n        gap:8px;\n        margin-bottom:12px;\n    }\n\n    .watermap-filter{\n        height:40px;\n        padding:0 15px;\n        font-size:13px;\n    }\n\n}\n\/* ==========================\n   PRIORIT\u00c9 INTERFACE CARTE\n========================== *\/\n\n#search-container{\n    position:relative;\n    z-index:5000;\n}\n\n#search-wrapper{\n    position:relative;\n    z-index:5001;\n}\n\n#searchInput{\n    position:relative;\n    z-index:5002;\n    pointer-events:auto;\n}\n\n#locateBtn{\n    position:relative;\n    z-index:5002;\n    pointer-events:auto;\n}\n\n#suggestions{\n    z-index:5003;\n    pointer-events:auto;\n}\n\/* ==========================\n   BOUTON RECHERCHE\n========================== *\/\n\n#search-wrapper{\n    position:relative;\n}\n\n#searchInput{\n    padding-right:80px;\n}\n\n#searchBtn{\n    position:absolute;\n    top:8px;\n    right:8px;\n\n    width:48px;\n    height:48px;\n\n    border:none;\n    border-radius:50%;\n\n    background:#283583;\n    color:#fff;\n\n    font-size:22px;\n    font-weight:700;\n\n    cursor:pointer;\n\n    display:flex;\n    align-items:center;\n    justify-content:center;\n\n    transition:all .25s ease;\n\n    z-index:5002;\n}\n\n#searchBtn:hover{\n    transform:translateY(-2px);\n    box-shadow:0 8px 18px rgba(40,53,131,.18);\n}\n\n#searchBtn:active{\n    transform:translateY(0);\n}\n\n\n\/* ==========================\n   MOBILE\n========================== *\/\n\n@media (max-width:768px){\n\n    #searchInput{\n        padding-right:72px;\n    }\n\n    #searchBtn{\n        width:48px;\n        height:48px;\n        right:8px;\n    }\n\n}\n<\/style>\n\n<script data-wp-block-html=\"js\">\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n    \/* =========================================================\n       CARTE\n    ========================================================= *\/\n\n    const map = L.map(\"map\").setView([45.1885, 5.7245], 10);\n\n    L.tileLayer(\n        \"https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png\",\n        {\n            attribution: \"\u00a9 OpenStreetMap contributors\"\n        }\n    ).addTo(map);\n\n\n    \/* =========================================================\n       GROUPES DE MARQUEURS\n    ========================================================= *\/\n\n    const partnerMarkers = L.markerClusterGroup({\n        showCoverageOnHover: false,\n        spiderfyOnMaxZoom: true,\n        maxClusterRadius: 50\n    });\n\n    const osmMarkers = L.markerClusterGroup({\n        showCoverageOnHover: false,\n        spiderfyOnMaxZoom: true,\n        maxClusterRadius: 50\n    });\n\n    map.addLayer(partnerMarkers);\n    map.addLayer(osmMarkers);\n\n    let userMarker = null;\n\n\n    \/* =========================================================\n       FILTRES\n    ========================================================= *\/\n\n    const toggleOSM =\n        document.getElementById(\"toggle-osm\");\n\n    const togglePartners =\n        document.getElementById(\"toggle-partners\");\n\n\n    if (toggleOSM) {\n\n        toggleOSM.addEventListener(\"click\", function () {\n\n            if (map.hasLayer(osmMarkers)) {\n\n                map.removeLayer(osmMarkers);\n                this.classList.remove(\"active\");\n\n            } else {\n\n                map.addLayer(osmMarkers);\n                this.classList.add(\"active\");\n\n            }\n\n        });\n\n    }\n\n\n    if (togglePartners) {\n\n        togglePartners.addEventListener(\"click\", function () {\n\n            if (map.hasLayer(partnerMarkers)) {\n\n                map.removeLayer(partnerMarkers);\n                this.classList.remove(\"active\");\n\n            } else {\n\n                map.addLayer(partnerMarkers);\n                this.classList.add(\"active\");\n\n            }\n\n        });\n\n    }\n\n\n    \/* =========================================================\n       PARTENAIRES\n    ========================================================= *\/\n\n    async function loadPartners() {\n\n        try {\n\n            const response = await fetch(\n                \"\/index.php?rest_route=\/watermap\/v1\/points&source=partenaire\"\n            );\n\n            if (!response.ok) {\n\n                throw new Error(\n                    \"Erreur API partenaires : \" +\n                    response.status\n                );\n\n            }\n\n            const points = await response.json();\n\n            console.log(\n                \"Partenaires charg\u00e9s :\",\n                points.length\n            );\n\n            partnerMarkers.clearLayers();\n\n            const seen = new Set();\n\n\n            points.forEach(point => {\n\n                const lat =\n                    parseFloat(point.latitude);\n\n                const lon =\n                    parseFloat(point.longitude);\n\n\n                if (\n                    !Number.isFinite(lat) ||\n                    !Number.isFinite(lon)\n                ) {\n                    return;\n                }\n\n\n                const key =\n                    lat.toFixed(6) +\n                    \"_\" +\n                    lon.toFixed(6);\n\n\n                if (seen.has(key)) {\n                    return;\n                }\n\n                seen.add(key);\n\n\n                const name =\n                    point.name ||\n                    \"Partenaire\";\n\n                const address =\n                    point.address ||\n                    \"\";\n\n                const postcode =\n                    point.postcode ||\n                    \"\";\n\n                const city =\n                    point.city ||\n                    \"\";\n\n                const phone =\n                    point.phone ||\n                    \"\";\n\n                const email =\n                    point.email ||\n                    \"\";\n\n                const openingHours =\n                    point.opening_hours ||\n                    \"\";\n\n                const services =\n                    point.services ||\n                    \"\";\n\n                const website =\n                    point.website ||\n                    \"\";\n\n\n                \/* -------------------------------------------------\n                   MARQUEUR PARTENAIRE\n                ------------------------------------------------- *\/\n\n                const marker =\n                    L.circleMarker(\n                        [lat, lon],\n                        {\n                            radius: 8,\n                            color: \"#283583\",\n                            fillColor: \"#283583\",\n                            fillOpacity: 0.9,\n                            weight: 2\n                        }\n                    );\n\n\n                \/* -------------------------------------------------\n                   FICHE PARTENAIRE\n                ------------------------------------------------- *\/\n\n                let popup = `\n                    <div class=\"watermap-partner-popup\">\n\n                        <h3 class=\"partner-title\">\n                            ${escapeHtml(name)}\n                        <\/h3>\n                `;\n\n\n                const fullAddress = [\n                    address,\n                    postcode,\n                    city\n                ]\n                .filter(Boolean)\n                .join(\", \");\n\n\n                if (fullAddress) {\n\n                    popup += `\n                        <div class=\"partner-info\">\n                            <span class=\"partner-icon\">\ud83d\udccd<\/span>\n                            <div>\n                                ${escapeHtml(fullAddress)}\n                            <\/div>\n                        <\/div>\n                    `;\n\n                }\n\n\n                if (openingHours) {\n\n                    popup += `\n                        <div class=\"partner-info\">\n                            <span class=\"partner-icon\">\ud83d\udd50<\/span>\n                            <div>\n                                ${escapeHtml(openingHours)}\n                            <\/div>\n                        <\/div>\n                    `;\n\n                }\n\n\n                if (services) {\n\n                    popup += `\n                        <div class=\"partner-info\">\n                            <span class=\"partner-icon\">\ud83d\udca7<\/span>\n                            <div>\n                                ${escapeHtml(services)}\n                            <\/div>\n                        <\/div>\n                    `;\n\n                }\n\n\n                if (phone) {\n\n                    popup += `\n                        <div class=\"partner-info\">\n                            <span class=\"partner-icon\">\u260e<\/span>\n                            <div>\n                                <a href=\"tel:${escapeHtml(phone)}\">\n                                    ${escapeHtml(phone)}\n                                <\/a>\n                            <\/div>\n                        <\/div>\n                    `;\n\n                }\n\n\n                if (email) {\n\n                    popup += `\n                        <div class=\"partner-info\">\n                            <span class=\"partner-icon\">\u2709<\/span>\n                            <div>\n                                <a href=\"mailto:${escapeHtml(email)}\">\n                                    ${escapeHtml(email)}\n                                <\/a>\n                            <\/div>\n                        <\/div>\n                    `;\n\n                }\n\n\n                \/* -------------------------------------------------\n                   BOUTONS\n                ------------------------------------------------- *\/\n\n                popup += `\n                    <div class=\"partner-actions\">\n                `;\n\n\n                if (website) {\n\n                    popup += `\n                        <a\n                            class=\"partner-action\"\n                            href=\"${normalizeUrl(website)}\"\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                        >\n                            \ud83c\udf10 Site web\n                        <\/a>\n                    `;\n\n                }\n\n\n                const mapsUrl =\n                    \"https:\/\/www.google.com\/maps\/dir\/?api=1&destination=\" +\n                    encodeURIComponent(\n                        lat + \",\" + lon\n                    );\n\n\n                popup += `\n                    <a\n                        class=\"partner-action partner-action-primary\"\n                        href=\"${mapsUrl}\"\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                    >\n                        \ud83d\udccd Itin\u00e9raire\n                    <\/a>\n                `;\n\n\n                popup += `\n                    <\/div>\n                `;\n\n                popup += `\n                    <\/div>\n                `;\n\n\n                marker.bindPopup(\n                    popup,\n                    {\n                        maxWidth: 340,\n                        minWidth: 280\n                    }\n                );\n\n\n                partnerMarkers.addLayer(marker);\n\n            });\n\n        }\n        catch (error) {\n\n            console.error(\n                \"Erreur chargement partenaires :\",\n                error\n            );\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       POINTS OSM\n    ========================================================= *\/\n\n    async function loadOSMPoints() {\n\n        try {\n\n            const response = await fetch(\n                \"\/index.php?rest_route=\/watermap\/v1\/points&source=osm\"\n            );\n\n            if (!response.ok) {\n\n                throw new Error(\n                    \"Erreur API OSM : \" +\n                    response.status\n                );\n\n            }\n\n            const points = await response.json();\n\n            console.log(\n                \"Points OSM charg\u00e9s :\",\n                points.length\n            );\n\n            osmMarkers.clearLayers();\n\n            const seen = new Set();\n\n\n            points.forEach(point => {\n\n                const lat =\n                    parseFloat(point.latitude);\n\n                const lon =\n                    parseFloat(point.longitude);\n\n\n                if (\n                    !Number.isFinite(lat) ||\n                    !Number.isFinite(lon)\n                ) {\n                    return;\n                }\n\n\n                const key =\n                    lat.toFixed(6) +\n                    \"_\" +\n                    lon.toFixed(6);\n\n\n                if (seen.has(key)) {\n                    return;\n                }\n\n                seen.add(key);\n\n\n                const name =\n                    point.name ||\n                    \"Point d'eau potable\";\n\n\n                const marker =\n                    L.circleMarker(\n                        [lat, lon],\n                        {\n                            radius: 6,\n                            color: \"#5B8DEF\",\n                            fillColor: \"#5B8DEF\",\n                            fillOpacity: 0.85,\n                            weight: 2\n                        }\n                    );\n\n\n                marker.bindPopup(`\n                    <div style=\"max-width:250px;\">\n\n                        <h3>\n                            ${escapeHtml(name)}\n                        <\/h3>\n\n                        <p>\n                            <strong>Source :<\/strong>\n                            OpenStreetMap\n                        <\/p>\n\n                    <\/div>\n                `);\n\n\n                osmMarkers.addLayer(marker);\n\n            });\n\n        }\n        catch (error) {\n\n            console.error(\n                \"Erreur chargement points OSM :\",\n                error\n            );\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       CHARGEMENT INITIAL\n    ========================================================= *\/\n\n    loadPartners();\n    loadOSMPoints();\n\n\n    \/* =========================================================\n       RECHERCHE\n    ========================================================= *\/\n\n    const searchInput =\n        document.getElementById(\"searchInput\");\n\n    const suggestions =\n        document.getElementById(\"suggestions\");\n\n    const searchBtn =\n        document.getElementById(\"searchBtn\");\n\n    let searchTimer = null;\n\n\n    \/*\n     * ---------------------------------------------------------\n     * RECHERCHE AUTOMATIQUE\n     * ---------------------------------------------------------\n     *\/\n\n    if (\n        searchInput &&\n        suggestions\n    ) {\n\n        searchInput.addEventListener(\n            \"input\",\n            function () {\n\n                clearTimeout(searchTimer);\n\n                const query =\n                    this.value.trim();\n\n\n                if (query.length < 3) {\n\n                    suggestions.innerHTML = \"\";\n\n                    suggestions.style.display =\n                        \"none\";\n\n                    return;\n\n                }\n\n\n                searchTimer =\n                    setTimeout(\n                        function () {\n\n                            fetchSuggestions(\n                                query\n                            );\n\n                        },\n                        300\n                    );\n\n            }\n        );\n\n\n        \/*\n         * -----------------------------------------------------\n         * TOUCHE ENTR\u00c9E\n         * -----------------------------------------------------\n         *\/\n\n        searchInput.addEventListener(\n            \"keydown\",\n            function (event) {\n\n                if (event.key !== \"Enter\") {\n                    return;\n                }\n\n                event.preventDefault();\n\n                const firstSuggestion =\n                    suggestions.querySelector(\n                        \".suggestion-item\"\n                    );\n\n\n                \/*\n                 * S'il y a des suggestions,\n                 * on s\u00e9lectionne la premi\u00e8re.\n                 *\/\n\n                if (firstSuggestion) {\n\n                    firstSuggestion.click();\n\n                    return;\n\n                }\n\n\n                \/*\n                 * Sinon on lance la recherche.\n                 *\/\n\n                const query =\n                    this.value.trim();\n\n\n                if (query.length >= 3) {\n\n                    fetchSuggestions(query);\n\n                }\n\n            }\n        );\n\n    }\n\n\n    \/*\n     * ---------------------------------------------------------\n     * BOUTON RECHERCHE\n     * ---------------------------------------------------------\n     *\/\n\n    if (searchBtn) {\n\n        searchBtn.addEventListener(\n            \"click\",\n            function () {\n\n                const firstSuggestion =\n                    suggestions.querySelector(\n                        \".suggestion-item\"\n                    );\n\n\n                if (firstSuggestion) {\n\n                    firstSuggestion.click();\n\n                    return;\n\n                }\n\n\n                const query =\n                    searchInput.value.trim();\n\n\n                if (query.length >= 3) {\n\n                    fetchSuggestions(query);\n\n                }\n\n            }\n        );\n\n    }\n\n\n    \/* =========================================================\n       SUGGESTIONS NOMINATIM\n    ========================================================= *\/\n\n    async function fetchSuggestions(query) {\n\n        try {\n\n            const response =\n                await fetch(\n                    `https:\/\/nominatim.openstreetmap.org\/search?format=jsonv2&addressdetails=1&limit=5&countrycodes=fr&q=${encodeURIComponent(query)}`\n                );\n\n\n            if (!response.ok) {\n\n                throw new Error(\n                    \"Erreur Nominatim : \" +\n                    response.status\n                );\n\n            }\n\n\n            const results =\n                await response.json();\n\n\n            suggestions.innerHTML = \"\";\n\n\n            if (\n                !results ||\n                results.length === 0\n            ) {\n\n                suggestions.style.display =\n                    \"none\";\n\n                return;\n\n            }\n\n\n            results.forEach(\n                function (result) {\n\n                    const address =\n                        result.address || {};\n\n\n                    const street =\n                        [\n                            address.house_number,\n                            address.road\n                        ]\n                        .filter(Boolean)\n                        .join(\" \");\n\n\n                    const city =\n                        address.city ||\n                        address.town ||\n                        address.village ||\n                        address.municipality ||\n                        \"\";\n\n\n                    const postcode =\n                        address.postcode ||\n                        \"\";\n\n\n                    const mainLabel =\n                        street ||\n                        result.name ||\n                        city ||\n                        result.display_name;\n\n\n                    const secondaryLabel =\n                        [\n                            postcode,\n                            city\n                        ]\n                        .filter(Boolean)\n                        .join(\" \u2022 \");\n\n\n                    const item =\n                        document.createElement(\n                            \"div\"\n                        );\n\n\n                    item.className =\n                        \"suggestion-item\";\n\n\n                    \/*\n                     * Ligne principale\n                     *\/\n\n                    const title =\n                        document.createElement(\n                            \"div\"\n                        );\n\n                    title.textContent =\n                        mainLabel;\n\n                    title.style.fontWeight =\n                        \"600\";\n\n                    title.style.fontSize =\n                        \"15px\";\n\n\n                    item.appendChild(\n                        title\n                    );\n\n\n                    \/*\n                     * Ligne secondaire\n                     *\/\n\n                    if (secondaryLabel) {\n\n                        const subtitle =\n                            document.createElement(\n                                \"div\"\n                            );\n\n                        subtitle.textContent =\n                            secondaryLabel;\n\n                        subtitle.style.marginTop =\n                            \"3px\";\n\n                        subtitle.style.fontSize =\n                            \"13px\";\n\n                        subtitle.style.opacity =\n                            \"0.6\";\n\n\n                        item.appendChild(\n                            subtitle\n                        );\n\n                    }\n\n\n                    \/*\n                     * S\u00e9lection\n                     *\/\n\n                    item.addEventListener(\n                        \"click\",\n                        function () {\n\n                            const selectedAddress =\n                                [\n                                    street,\n                                    postcode,\n                                    city\n                                ]\n                                .filter(Boolean)\n                                .join(\", \");\n\n\n                            searchInput.value =\n                                selectedAddress ||\n                                result.display_name;\n\n\n                            suggestions.style.display =\n                                \"none\";\n\n\n                            map.setView(\n                                [\n                                    parseFloat(\n                                        result.lat\n                                    ),\n                                    parseFloat(\n                                        result.lon\n                                    )\n                                ],\n                                16\n                            );\n\n                        }\n                    );\n\n\n                    suggestions.appendChild(\n                        item\n                    );\n\n                }\n            );\n\n\n            suggestions.style.display =\n                \"block\";\n\n        }\n        catch (error) {\n\n            console.error(\n                \"Erreur recherche adresse :\",\n                error\n            );\n\n            suggestions.style.display =\n                \"none\";\n\n        }\n\n    }\n\n\n    \/* =========================================================\n       FERMETURE DES SUGGESTIONS\n    ========================================================= *\/\n\n    document.addEventListener(\n        \"click\",\n        function (event) {\n\n            if (\n                searchInput &&\n                suggestions &&\n                !searchInput.contains(\n                    event.target\n                ) &&\n                !suggestions.contains(\n                    event.target\n                ) &&\n                (!searchBtn ||\n                    !searchBtn.contains(\n                        event.target\n                    ))\n            ) {\n\n                suggestions.style.display =\n                    \"none\";\n\n            }\n\n        }\n    );\n\n\n    \/* =========================================================\n       G\u00c9OLOCALISATION\n    ========================================================= *\/\n\n    const locateBtn =\n        document.getElementById(\n            \"locateBtn\"\n        );\n\n\n    if (locateBtn) {\n\n        locateBtn.addEventListener(\n            \"click\",\n            function () {\n\n                navigator.geolocation.getCurrentPosition(\n\n                    function (position) {\n\n                        const lat =\n                            position.coords.latitude;\n\n                        const lon =\n                            position.coords.longitude;\n\n\n                        map.setView(\n                            [lat, lon],\n                            16\n                        );\n\n\n                        if (userMarker) {\n\n                            map.removeLayer(\n                                userMarker\n                            );\n\n                        }\n\n\n                        userMarker =\n                            L.marker(\n                                [lat, lon]\n                            )\n                            .addTo(map)\n                            .bindPopup(\n                                \"Vous \u00eates ici\"\n                            )\n                            .openPopup();\n\n                    },\n\n\n                    function (error) {\n\n                        console.error(\n                            error\n                        );\n\n                        alert(\n                            \"Impossible de r\u00e9cup\u00e9rer votre position.\"\n                        );\n\n                    }\n\n                );\n\n            }\n        );\n\n    }\n\n\n    \/* =========================================================\n       UTILITAIRES\n    ========================================================= *\/\n\n    function escapeHtml(value) {\n\n        const div =\n            document.createElement(\n                \"div\"\n            );\n\n\n        div.textContent =\n            String(\n                value ?? \"\"\n            );\n\n\n        return div.innerHTML;\n\n    }\n\n\n    function normalizeUrl(url) {\n\n        url =\n            String(\n                url || \"\"\n            ).trim();\n\n\n        if (!url) {\n            return \"\";\n        }\n\n\n        if (\n            !\/^https?:\\\/\\\/\/i.test(url)\n        ) {\n\n            url =\n                \"https:\/\/\" +\n                url;\n\n        }\n\n\n        return url;\n\n    }\n\n});\n<\/script>\n\n<div id=\"search-container\">\n\n    <div id=\"search-wrapper\">\n\n    <input type=\"text\" id=\"searchInput\" placeholder=\"Rechercher une adresse...\" autocomplete=\"off\">\n\n    <button type=\"button\" id=\"searchBtn\" aria-label=\"Rechercher\">\n        \u2192\n    <\/button>\n\n    <div id=\"suggestions\"><\/div>\n\n<\/div>\n\n    <button id=\"locateBtn\">\n        \u2192 Me localiser\n    <\/button>\n\n<\/div>\n\n\n<div id=\"watermap-filters\">\n\n    <button type=\"button\" id=\"toggle-osm\" class=\"watermap-filter active\">\n        <span class=\"filter-dot filter-dot-osm\"><\/span>\n        Points d&#8217;eau\n    <\/button>\n\n    <button type=\"button\" id=\"toggle-partners\" class=\"watermap-filter active\">\n        <span class=\"filter-dot filter-dot-partner\"><\/span>\n        Partenaires\n    <\/button>\n\n<\/div>\n\n\n<div id=\"map\"><\/div>\n\n\n<p id=\"zoom-message\">\n    \ud83d\udd0d Explorez la carte pour trouver un point d&#8217;eau potable.\n<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Trouvez facilement un point d&#8217;eau potable pr\u00e8s de vous Remplir Ma Gourde vous permet de localiser rapidement les points d&#8217;eau potable accessibles autour de vous, partout dans le monde. Recherchez une adresse, utilisez votre position actuelle ou explorez la carte pour trouver o\u00f9 remplir votre gourde en quelques clics. Une solution simple pour s&#8217;hydrater, r\u00e9duire [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-14","page","type-page","status-publish","hentry"],"blocksy_meta":{"content_style_source":"inherit","content_style":"wide","vertical_spacing_source":"custom","content_area_spacing":"none","styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6},"disable_header":"no","disable_share_box":"yes","disable_featured_image":"yes","has_hero_section":"disabled"},"_links":{"self":[{"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/pages\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":47,"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/pages\/14\/revisions"}],"predecessor-version":[{"id":133,"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/pages\/14\/revisions\/133"}],"wp:attachment":[{"href":"https:\/\/remplirmagourde.com\/index.php\/wp-json\/wp\/v2\/media?parent=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}