Listen to the article
La campagne officielle des élections municipales 2026 s’est ouverte, lundi 2 mars. Plus de 50 000 listes et 900 000 candidats se préparent donc dans les 34 944 communes de France et les arrondissements de Paris, Lyon et Marseille où auront lieu des élections municipales et communautaires les 15 et 22 mars.
Retrouvez toutes les listes candidates dans votre commune grâce au moteur de recherche ci-dessous :
`;
const code_dept = code_commune.startsWith(« 97 ») || code_commune.startsWith(« 98 ») ? code_commune.slice(0, 3) : « 0 » + code_commune.slice(0, 2);
const url_dept = `https://assets-decodeurs.lemonde.fr/decodeurs/municipales_2026_snippets/municipales/exports/2026/T1/json-candidatures/${code_dept}.json`;
console.log(« Fetching data for department », url_dept);
const data_dept = await fetch(url_dept)
.then((response) => response.json())
.catch((error) => {
console.error(« Error fetching data for department », code_dept, error);
container.querySelector(« .municipalesResultsList .municipalesResults__bars »).innerHTML = `
Les candidatures ne sont pas encore disponibles pour cette commune. Revenez plus tard.
`;
return null;
});
if (data_dept) {
return data_dept[code_commune];
}
return null;
});
if (!data) {
return;
}
console.log(data);
container.querySelector(« .lmui-chart__title »).innerHTML = mdm_html(force_cityname ? city_name : data.lib);
const sieges_a_pourvoir_html = data.sieges_a_pourvoir ? `${data.sieges_a_pourvoir.toLocaleString(locale)} siège${data.sieges_a_pourvoir > 1 ? « s » : « »} à pourvoir dans la commune` : « »;
const sieges_epci_html = data.sieges_a_pourvoir_epci ? ` et ${data.sieges_a_pourvoir_epci.toLocaleString(locale)} siège${data.sieges_a_pourvoir_epci > 1 ? « s » : « »} à pourvoir au niveau communautaire` : « »;
const population_html = data.population ? `${(+data.population).toLocaleString(locale)} habitant${+data.population > 1 ? « s » : « »}` : « »;
// Call shared function to render lists
container.querySelector(« .municipalesResultsList .municipalesResults__mentions »).innerHTML = `
${population_html}
${sieges_a_pourvoir_html}${sieges_epci_html}
`;
if (data.sans_candidatures) {
container.querySelector(« .municipalesResultsList .municipalesResults__bars »).innerHTML = `
Aucune candidature n’a été déposée dans cette commune.
`;
} else {
const sortedListes = data.listes;
sortedListes.sort((a, b) => slugify(a.tete.nom).localeCompare(slugify(b.tete.nom)));
const listItemsHtml = sortedListes.map((liste, index_liste) => {
const nuanceData = nuances ? nuances[liste.nuance] : null;
const lightColor = nuanceData ? nuanceData.couleur : « #7f7f7f »;
const darkColor = nuanceData ? nuanceData.couleur_dark : « #7f7f7f »;
const nuanceShortLabel = nuanceData ? nuanceData.nom_long : liste.nuance;
let nuanceHtml = « »;
if (nuanceShortLabel) {
nuanceHtml = `${nuanceShortLabel}`;
}
return `
${liste.tete.civ} ${liste.tete.prenom} ${liste.tete.nom}
${nuanceHtml}
Liste : « ${liste.lib} »
`;
});
container.querySelector(« .municipalesResultsList .municipalesResults__bars »).innerHTML = listItemsHtml.join(« »);
}
}
let max_n_to_display = 5,
min_char_to_search = 1,
format_to_search = slugify,
no_results_message = « Aucun résultat avec cette recherche »;
// Paramètres définits à l’initialisation
function reset_func() {}
async function autocomplete_communes_decodeurs(id_container, func_to_treat_result, func_to_reset, max_n_to_display = 5, no_results_message = « Aucun résultat avec cette recherche ») {
const get_search_value_in_data = (f) => {
const postcode = f.properties.postcode;
const dept_code = (postcode.startsWith(« 97 ») || postcode.startsWith(« 98 ») ? postcode.slice(0, 3) : postcode.slice(0, 2));
return f.properties.city + (f.properties.postcode ? ` (${dept_code})` : « »);
};
// OnSearch / OnResults
const onSearch = async (currentValue) => {
// Typical search
if (currentValue.replaceAll(/s/g, « »).length < 3) return;
const q = currentValue.replaceAll(/s/g, « + »);
const api_communes = `https://data.geopf.fr/geocodage/search/?q=${q}&type=municipality&limit=${max_n_to_display}`;
const data = await fetch(api_communes);
const rep = await data.json();
const data_communes = rep.features;
return data_communes;
};
await _generic_autocomplete(id_container, get_search_value_in_data, onSearch, func_to_treat_result, func_to_reset, 3, no_results_message);
}
autocomplete_communes_decodeurs(
// L’id du lmui-search
« search_communes »,
//Une fonction qui s’execute quand on sélectionne un item
(result) => {
const code_commune = result.properties.citycode;
const city_name = result.properties.city;
if (arrondissementsPLM[code_commune]) {
const arrondissement = arrondissementsPLM[code_commune];
return updateResults(arrondissement.code_secteur, arrondissement.lib, true);
}
return updateResults(code_commune, city_name);
},
// Une fonction qui s’execute quand on désélectionne / reset
reset_func,
// Nombre de choix dans le autocomplete, par défaut 5
max_n_to_display,
// Nombre de lettres avant le déclenchement de l’autocomplete, par défaut 3
min_char_to_search,
// Une fonction qui normalise les input pour la recherche, par défaut slugify,
// c’est à dire que la casse et les accents sont ignorés
format_to_search,
// Texte à afficher si aucun resultat, par défaut « Aucun résultat avec cette recherche »
no_results_message
);
`,
)
.join(« »);
const content = `
${ville} ${departement != « Paris » ? `(${departement})` : « »}
${articlesStrings}
`;
// Fill tooltip
tooltip
.select(« .tooltipcontent »)
.attr(« aria-label », « Articles politiquess »)
.html(content);
tooltip.select(« .tooltipcross »).on(« click », onMouseOut);
// Display and translate tooltip
console.log(« isMobile », isMobile);
if (isMobile) {
tooltip
.classed(« tooltip–hidden », false)
.style(« bottom », 0)
.style(« left », 0);
} else {
tooltip
.classed(« tooltip–hidden », false)
.style(« bottom », `${y}px`)
.style(« left », `${x}px`);
}
}
// Hide tooltip
function onMouseOut() {
// document.querySelector(‘canvas’).style.cursor= »unset »;
tooltip.classed(« tooltip–hidden », true);
}
const mapSettings = {
center: [4.7, 47],
zoom: 4,
minZoom: 4,
maxZoom: 12,
bearing: 0,
pitch: 0,
};
const themeUrl = isDark
? « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps/contrast_daltoniens_darkmode_fr_v0.0.5.json »
: « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps/contrast_daltoniens_fr_v0.0.5.json »;
const theme = await d3.json(themeUrl);
const map = new maplibregl.Map({
container: « carte_reportage_municipales »,
style: {
version: 8,
glyphs: « https://assets-decodeurs.lemonde.fr/decodeurs/assets/protomaps_fonts/{fontstack}/{range}.pbf »,
sources: {
protomaps: {
type: « vector »,
maxzoom: 15,
tiles: [
« https://prd-protomap.8084.lemonde.io/20240111/{z}/{x}/{y}.mvt »,
],
},
},
layers: theme,
},
center: mapSettings.center,
zoom: mapSettings.zoom,
minZoom: mapSettings.minZoom,
maxZoom: mapSettings.maxZoom,
//pitch: mapSettings.pitch,
//bearing: mapSettings.bearing,
//maxBounds: mapSettings.bounds
});
const deckOverlay = new deck.MapboxOverlay({
onClick: ({ x, y, object }) => {
if (object == undefined) return onMouseOut();
const mapContainer = document.getElementById(
« carte_reportage_municipales »,
);
const adjustedY = mapContainer.offsetHeight – y;
return (
object && fillTooltip({ x, y: adjustedY, object })
);
},
onDragStart: () => onMouseOut(),
onResize: () => onMouseOut(),
pickingRadius: isMobile ? 20 : 8,
});
// Add deck layer
map.addControl(deckOverlay);
let scale = new maplibregl.ScaleControl({
maxWidth: 80,
unit: « metric »,
});
map.addControl(scale);
// Enable exploration
map.boxZoom.disable();
map.keyboard.disable();
map.doubleClickZoom.disable();
map.touchZoomRotate.disable();
map.dragRotate.disable();
map.touchPitch.disable();
map.scrollZoom.enable();
map.boxZoom.enable();
map.touchZoomRotate.enable();
map.dragPan.enable();
map.fitBounds(boundsMetropole);
// map.flyTo({
// center: mapSettings.center,
// zoom: mapSettings.zoom + 0.2,
// speed: 0.25,
// curve: 0.2,
// });
map.addControl(
new maplibregl.NavigationControl({ showCompass: false }),
« top-left »,
);
// Render layerspolys
function render() {
const layerArticles = new deck.IconLayer({
id: « layerarticles »,
data: data,
getPosition: (d) => {
return [+d[« Longitude »], +d[« Latitude »], 0];
},
getColor: [0, 0, 0, 220],
mask: false,
getIcon: (d) => ({
url: isDark? »https://assets-decodeurs.lemonde.fr/decodeurs/assets/2410-gaza-1an-medias/marker-svg-test.svg »: »https://assets-decodeurs.lemonde.fr/decodeurs/medias/icon lemonde article/picto.png »,
width: 254,
height: 376,
anchorY: 376,
}),
getSize: 25,
pickable: true,
//parameters: {
// blendFunc: [1, 100], // GL.ONE, GL.ONE_MINUS_SRC_ALPHA
//},
loadOptions: {
imagebitmap: {
premultiplyAlpha: « none »,
},
},
});
deckOverlay.setProps({ layers: [layerArticles] });
}
// Render first view
render();
// Watch flyto
document
.querySelectorAll(« .carte_reportage_municipales__flytobtn »)
.forEach((btn) => {
btn.onclick = () => {
const place = btn.getAttribute(« data-attr »);
switch (place) {
case « reset »:
map.fitBounds(boundsMetropole, {
animate: false,
});
break;
case « reunion »:
map.fitBounds(boundsReunion, {
center: [55.558823, -21.109403],
animate: false,
});
break;
case « guyane »:
map.fitBounds(boundsGuyane, {
center: [-53.14191, 4.113978],
animate: false,
});
break;
case « antilles »:
map.fitBounds(boundsAntilles, {
center: [-61.235294, 15.125274],
animate: false,
});
break;
case « mayotte »:
map.fitBounds(boundsMayotte, {
center: [45.150284, -12.800424],
animate: false,
});
break;
case « polynesie »:
map.fitBounds(boundsPolynesie, {
animate: false,
});
break;
default:
map.fitBounds(boundsMetropole, {
animate: false,
});
break;
}
};
});
/* AUTOCOMPLETE*/
let max_n_to_display = 6;
let min_char_to_search = 1;
let format_to_search = slugify;
let no_results_message = « Aucun résultat avec cette recherche »;
const reset_func = () => {
};
const func_to_treat_result_donnees = (result) => {
map.flyTo({
center: [result[« Longitude »], result[« Latitude »]],
zoom: 10,
});
};
const dedupedData = Array.from(
new Set(data.map((d) => d[« Ville »].trim().toLowerCase())),
).map((ville) => {
return data.find((d) => d[« Ville »].trim().toLowerCase() === ville.trim().toLowerCase());
});
const get_text_in_data = (x) => x[« Ville »] + (x[« Département »]? ` (${x[« Département »]})`: « »);
autocomplete_decodeurs(
// L’id du lmui-search
« ecoles-pesticides-search »,
// Les données dans lesquelles chercher
dedupedData,
// Une fonction qui s’execute quand on sélectionne un item, elle prend en argument
// l’objet sélectionné
func_to_treat_result_donnees,
// Une fonction qui s’execute quand on désélectionne / reset
reset_func,
// Une fonction qui sélectionne le texte à chercher dans le tableau (optionnel si vos données
// ne sont que du texte)
get_text_in_data,
// Nombre de choix dans le autocomplete, par défaut 5
max_n_to_display,
// Nombre de lettres avant le déclenchement de l’autocomplete, par défaut 3
min_char_to_search,
// Une fonction qui normalise les input pour la recherche, par défaut slugify, c’est à dire que la casse
// et les accents sont ignorés
format_to_search,
// Texte à afficher si aucun resultat, par défaut « Aucun résultat avec cette recherche »
no_results_message,
);
}
}
// const INIT_DELAY = 2000; // 2 secondes
document.addEventListener(« DOMContentLoaded », () => {
initMap();
});
window.onresize = () => {
isMobile = window.innerWidth <= 600;
};
}
initViz();









13 commentaires
Uranium names keep pushing higher—supply still tight into 2026.
Exploration results look promising, but permitting will be the key risk.
Good point. Watching costs and grades closely.
Good point. Watching costs and grades closely.
Exploration results look promising, but permitting will be the key risk.
Silver leverage is strong here; beta cuts both ways though.
Good point. Watching costs and grades closely.
If AISC keeps dropping, this becomes investable for me.
If AISC keeps dropping, this becomes investable for me.
Good point. Watching costs and grades closely.
Good point. Watching costs and grades closely.
Exploration results look promising, but permitting will be the key risk.
Good point. Watching costs and grades closely.