Translate the whole project to English and fix outdated comments and help

Comments, docstrings, logs, CLI help, map UI, legends, PDF sheet, scripts,
compose files and AGENTS.md are now English. Data keys stay unchanged
(relief_oriente, densite_sol, visualisations/, API JSON keys, link params).
Wrong comments and help defaults found along the way are corrected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine
2026-09-27 23:16:45 +02:00
parent cc1c22d2b8
commit fb892ea9f2
52 changed files with 4356 additions and 4323 deletions

View File

@ -1,13 +1,13 @@
/* Carte LiDAR — tuiles XYZ, habillage minimal type carte grand public. */
/* LiDAR map — XYZ tiles, minimal consumer-map style chrome. */
/* Réglages communs : toute règle y puise (couleurs, texte, arrondis,
espacements, ombres, superpositions). Deux palettes : claire par défaut,
sombre si le système le demande (sauf clair forcé) ou si elle est forcée. */
/* Shared settings: every rule draws from them (colours, text, radii,
spacing, shadows, stacking). Two palettes: light by default, dark when
the system asks for it (unless light is forced) or when dark is forced. */
:root {
color-scheme: light;
--bg: #eef0f3;
--surface: rgba(251, 251, 250, 0.96);
--surface-2: #eef0f3; /* champs, segments, boutons neutres */
--surface-2: #eef0f3; /* fields, segments, neutral buttons */
--border: #d6d9de;
--text: #1d232b;
--muted: #5b6573;
@ -19,8 +19,8 @@
--gen-pending: #0b8fc0;
--gen-failed: #c8452c;
--gen-sel: var(--accent);
/* Contour de sélection de dalle : plus sombre en thème clair (lisible sur
le fond OSM clair), jaune franc en thème sombre. */
/* Tile selection outline: darker in the light theme (readable on the
light OSM base map), bright yellow in the dark theme. */
--tile-sel: #b8860b;
--gps: #39d98a;
--fs-xs: 11px; --fs-sm: 12px; --fs-md: 13px; --fs-lg: 16px;
@ -57,20 +57,20 @@
html, body { height: 100%; overflow: hidden; background: var(--bg); color: var(--text);
font: var(--fs-md)/1.45 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
#map { position: absolute; inset: 0; background: var(--bg); }
/* Mode Comparer : barre glissante qui sépare les deux couches. */
/* Compare mode: sliding divider between the two layers. */
#compareBar { position: fixed; top: 0; bottom: 0; width: 4px; margin-left: -2px; z-index: var(--z-map-ui);
background: var(--surface); box-shadow: var(--shadow-sm); cursor: ew-resize; touch-action: none; }
/* Poignée au milieu de la carte visible, au-dessus du volet (téléphone) : à
mi-hauteur de l'écran elle tombait sous l'échelle Leaflet posée sur le volet. */
/* Handle in the middle of the visible map, above the bottom sheet (phone): at
half screen height it fell under the Leaflet scale sitting on the sheet. */
#compareBar span { position: absolute; top: calc((100% - var(--sheet-h)) / 2); left: 50%; transform: translate(-50%, -50%);
width: 36px; height: 36px; border-radius: var(--r-full); display: flex; align-items: center;
justify-content: center; background: var(--surface); color: var(--text); border: 1px solid var(--border);
box-shadow: var(--shadow-sm); font-size: var(--fs-lg); }
.leaflet-container { background: var(--bg); font: inherit; }
/* Fond OSM assombri pour laisser ressortir les rendus LiDAR. Filtre posé sur
le conteneur de la couche, pas sur chaque tuile : même rendu (opérations
par pixel), mais une seule passe de filtre au lieu d'une par tuile —
−30 % de CPU (moteur de rendu + GPU) en déplacement, mesuré sous Chrome. */
/* Dimmed OSM base map so the LiDAR renderings stand out. The filter sits on
the layer container, not on each tile: same result (per-pixel operations),
but a single filter pass instead of one per tile — −30% CPU (renderer +
GPU process) while panning, measured in Chrome. */
.leaflet-tile-pane .leaflet-layer.base-dark { filter: brightness(0.38) contrast(1.1) saturate(0.7); }
.info-sec { margin-top: 10px; }
@ -86,7 +86,7 @@ html, body { height: 100%; overflow: hidden; background: var(--bg); color: var(-
.rose-cap span { color: var(--muted); font-size: var(--fs-xs); }
.tile-head .sec-title { margin: 0; flex: 1; }
/* --- composants communs --------------------------------------------------- */
/* --- shared components ---------------------------------------------------- */
.btn, button { display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-1);
min-height: 32px; padding: 0 var(--sp-3); border-radius: var(--r-sm); border: 1px solid var(--border);
background: var(--surface-2); color: var(--text); font: inherit; font-size: var(--fs-sm); cursor: pointer; }
@ -126,12 +126,12 @@ input[type="range"]::-moz-range-thumb { width: 10px; height: 10px; border-radius
.field { height: 40px; }
}
/* Ligne du fond de carte : œil, nom, opacité. */
/* Base map row: eye, name, opacity. */
.base-row { display: grid; grid-template-columns: 32px minmax(0, 1fr) auto; align-items: center;
gap: var(--sp-2); padding: var(--sp-1) 0; }
.base-row .base-ctl { grid-column: 2 / -1; display: grid; grid-template-columns: minmax(0, 1fr) 40px;
gap: var(--sp-2); align-items: center; }
/* Affichage : une couche principale, la précision seule ou en comparaison. */
/* Display: one main layer, precision alone or in comparison. */
.view-row { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center;
gap: 8px; padding: 8px 4px 4px; border-top: 1px solid var(--border); margin-top: 4px; }
.view-label { font-size: var(--fs-xs); font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
@ -159,12 +159,12 @@ input[type="range"]::-moz-range-thumb { width: 10px; height: 10px; border-radius
@media (max-width: 720px) {
#tools { top: var(--sp-3); bottom: auto; }
}
/* L'attribution Leaflet reste en bas à droite : les outils passent au-dessus. */
/* The Leaflet attribution stays bottom right: the tools sit above it. */
@media (min-width: 721px) { #tools { bottom: 44px; } }
#tools button { width: 38px; height: 38px; padding: 0; font-size: var(--fs-lg); background: var(--surface);
border: 1px solid var(--border); box-shadow: var(--shadow-sm); }
/* Indicateur de chargement : tuiles restantes pour finir la vue courante
(fond + LiDAR), barre de progression du lot en cours. */
/* Loading indicator: tiles left to finish the current view (base map +
LiDAR), progress bar of the current batch. */
.tileload { position: fixed; left: calc(var(--panel-w) + (100vw - var(--panel-w)) / 2); top: auto;
bottom: calc(var(--sheet-h) + var(--sp-3)); transform: translateX(-50%); z-index: var(--z-loading);
display: flex; align-items: center; gap: 8px; padding: 5px 12px; border-radius: var(--r-full);
@ -195,12 +195,12 @@ input[type="range"]::-moz-range-thumb { width: 10px; height: 10px; border-radius
.leaflet-control-attribution { background: var(--surface) !important; color: var(--muted) !important; }
.leaflet-control-attribution a { color: var(--accent) !important; }
/* --- génération de tuiles ------------------------------------------------ */
/* --- PDF export and tile generation --------------------------------------- */
.print-msg { font-size: var(--fs-sm); margin-left: 8px; }
/* #1b1b1b (glyphe + bordure) reste en dur volontairement : --print est un jaune/ambre
proche dans les deux thèmes (#d99a00 clair, #ffd166 sombre), un texte sombre fixe
y garde un contraste correct dans les deux cas — un token --text/--on-accent
changerait de sens (clair en thème sombre) et casserait ce contraste. */
/* #1b1b1b (glyph + border) is hard-coded on purpose: --print is a similar
yellow/amber in both themes (#d99a00 light, #ffd166 dark), and a fixed dark text
keeps good contrast on it in both cases — a --text/--on-accent token would flip
(light in the dark theme) and break that contrast. */
.print-handle { display: flex; align-items: center; justify-content: center; cursor: move;
font-size: var(--fs-lg); color: #1b1b1b; background: var(--print); border: 2px solid #1b1b1b;
border-radius: var(--r-full); box-shadow: 0 1px 6px rgba(0,0,0,0.5); }
@ -216,17 +216,17 @@ body.drawing .leaflet-container { cursor: crosshair !important; }
padding: 6px 8px; max-height: 130px; overflow-y: auto; white-space: pre-wrap;
word-break: break-all; margin: 6px 0; }
#tools button.busy { color: var(--accent); border-color: var(--accent); }
/* Cadres des dalles du run : orange pulsant = rendu en cours, bleu = en
attente, rouge = échec. Les dalles faites n'ont pas de cadre. */
/* Frames of the run's tiles: pulsing orange = rendering, blue = pending,
red = failed. Finished tiles have no frame. */
@keyframes genpulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
.gen-frame-running { stroke: var(--gen-running); fill: color-mix(in srgb, var(--gen-running) 13%, transparent); animation: genpulse 1.4s ease-in-out infinite; }
.gen-frame-pending { stroke: var(--gen-pending); fill: color-mix(in srgb, var(--gen-pending) 8%, transparent); stroke-dasharray: 6 4; }
.gen-frame-failed { stroke: var(--gen-failed); fill: color-mix(in srgb, var(--gen-failed) 20%, transparent); }
.gen-sel { stroke: var(--accent); fill: color-mix(in srgb, var(--accent) 12%, transparent); cursor: pointer; }
/* --- panneau unique à onglets ------------------------------------------------
Ordinateur : colonne à gauche, repliable en bande d'icônes.
Téléphone : volet en bas à trois hauteurs (fermé / mi-hauteur / plein). */
/* --- single tabbed panel ------------------------------------------------------
Desktop: left column, collapsible into an icon strip.
Phone: bottom sheet with three heights (closed / half / full). */
#panel { position: fixed; z-index: var(--z-panel); display: flex; flex-direction: column;
background: var(--surface); color: var(--text); border: 1px solid var(--border);
box-shadow: var(--shadow-lg); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
@ -252,7 +252,7 @@ body.drawing .leaflet-container { cursor: crosshair !important; }
#panel.collapsed .panel-head { flex-direction: column; border-bottom: none; }
#panel.collapsed .panel-tabs { flex-direction: column; align-self: stretch; }
#panel.collapsed #panelCollapse { transform: rotate(180deg); }
/* La carte, l'échelle et les messages se décalent de la largeur du panneau. */
/* The map, the scale and the messages shift by the panel width. */
body { --panel-w: 364px; --sheet-h: 0px; }
body.panel-collapsed { --panel-w: 84px; }
.leaflet-bottom.leaflet-left { left: var(--panel-w); }
@ -270,8 +270,8 @@ body.panel-collapsed { --panel-w: 84px; }
.sheet-grip span { width: 36px; height: 4px; border-radius: var(--r-full); background: var(--muted); }
.panel-head { padding: var(--sp-1) var(--sp-2); }
.leaflet-bottom { bottom: var(--sheet-h); }
/* Attribution sur toute la largeur : l'échelle passe au-dessus d'elle,
l'indicateur de chargement en haut de l'écran (à gauche des outils). */
/* Full-width attribution: the scale sits above it, the loading indicator
at the top of the screen (left of the tools). */
.leaflet-bottom.leaflet-left .leaflet-control-scale { margin-bottom: 28px; }
.tileload { top: var(--sp-3); bottom: auto; }
}

View File

@ -1,141 +1,141 @@
<!DOCTYPE html>
<html lang="fr">
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
<title>Carte LiDAR</title>
<title>LiDAR map</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 16 16%27%3E%3Crect width=%2716%27 height=%2716%27 rx=%273%27 fill=%27%230b0e13%27/%3E%3Cpath d=%27M2 11l4-5 3 4 2-2 3 3z%27 fill=%27%235aa9e6%27/%3E%3C/svg%3E">
<link rel="stylesheet" href="assets/vendor/leaflet/leaflet.css"/>
<link rel="stylesheet" href="assets/app.css?v=__ASSETS_V__"/>
</head>
<body>
<div id="map"></div>
<div id="compareBar" hidden title="Glisser pour déplacer la séparation"><span>⇆</span></div>
<div id="compareBar" hidden title="Drag to move the divider"><span>⇆</span></div>
<aside id="panel" data-sheet="half" aria-label="Réglages de la carte">
<div id="sheetGrip" class="sheet-grip" title="Glisser pour agrandir ou réduire"><span></span></div>
<aside id="panel" data-sheet="half" aria-label="Map settings">
<div id="sheetGrip" class="sheet-grip" title="Drag to expand or shrink"><span></span></div>
<div class="panel-head">
<nav id="panelTabs" class="panel-tabs" role="tablist">
<button role="tab" data-tab="view" title="Affichage (1)"><span class="tab-ico">◧</span><span class="tab-lbl">Vue</span></button>
<button role="tab" data-tab="tile" title="Dalle (2)"><span class="tab-ico">▦</span><span class="tab-lbl" id="tileTabLbl">Dalle</span></button>
<button role="tab" data-tab="print" title="Export PDF (3)"><span class="tab-ico">⎙</span><span class="tab-lbl">PDF</span></button>
<button role="tab" data-tab="gen" title="Génération (4)" hidden><span class="tab-ico">+</span><span class="tab-lbl">Générer</span></button>
<button role="tab" data-tab="share" title="Partager (5)"><span class="tab-ico">⎘</span><span class="tab-lbl">Partager</span></button>
<button role="tab" data-tab="view" title="Display (1)"><span class="tab-ico">◧</span><span class="tab-lbl">View</span></button>
<button role="tab" data-tab="tile" title="Tile (2)"><span class="tab-ico">▦</span><span class="tab-lbl" id="tileTabLbl">Tile</span></button>
<button role="tab" data-tab="print" title="PDF export (3)"><span class="tab-ico">⎙</span><span class="tab-lbl">PDF</span></button>
<button role="tab" data-tab="gen" title="Generation (4)" hidden><span class="tab-ico">+</span><span class="tab-lbl">Generate</span></button>
<button role="tab" data-tab="share" title="Share (5)"><span class="tab-ico">⎘</span><span class="tab-lbl">Share</span></button>
</nav>
<button id="panelCollapse" class="btn-icon" title="Replier le panneau">‹</button>
<button id="panelCollapse" class="btn-icon" title="Collapse the panel">‹</button>
</div>
<div id="panelBody" class="panel-body">
<section id="tab-view" role="tabpanel" hidden>
<div class="base-row" id="baseRow">
<button class="eye on" id="baseToggle" title="Afficher / masquer le fond de carte"></button>
<span class="layer-name" id="baseName" title="Cliquer : fond clair / assombri">Fond OpenStreetMap</span>
<button class="eye on" id="baseToggle" title="Show / hide the base map"></button>
<span class="layer-name" id="baseName" title="Click: light / dimmed base map">OpenStreetMap base map</span>
<span class="pct" id="basePct"></span>
<div class="base-ctl">
<input type="range" id="baseOpacity" min="0" max="100" step="1" title="Opacité du fond">
<input type="range" id="baseOpacity" min="0" max="100" step="1" title="Base map opacity">
</div>
</div>
<div class="view-row">
<span class="view-label">Affichage</span>
<span class="view-label">Display</span>
<span class="layer-name" id="mainName"></span>
<select id="mainSel" class="field" title="Couche d'affichage principal" hidden></select>
<select id="mainSel" class="field" title="Main display layer" hidden></select>
</div>
<div id="precBlock" hidden>
<div class="seg" id="modeSeg" role="group" aria-label="Relief, précision ou comparaison (touche P)">
<button type="button" data-mode="relief" title="Relief seul (touche P : mode suivant)">Relief</button>
<button type="button" data-mode="precision" title="Précision géométrique seule : densité de points sol">Précision</button>
<button type="button" data-mode="compare" title="Comparer deux couches de part et d'autre d'une barre glissante (touche P : mode suivant)">Comparer</button>
<div class="seg" id="modeSeg" role="group" aria-label="Relief, precision or comparison (P key)">
<button type="button" data-mode="relief" title="Relief only (P key: next mode)">Relief</button>
<button type="button" data-mode="precision" title="Geometric precision only: ground point density">Precision</button>
<button type="button" data-mode="compare" title="Compare two layers on either side of a sliding divider (P key: next mode)">Compare</button>
</div>
<div class="row" id="compareCtl" hidden>
<select id="compareLeft" class="field" title="Couche à gauche de la barre"></select>
<select id="compareLeft" class="field" title="Layer left of the divider"></select>
<span class="hint">⇆</span>
<select id="compareRight" class="field" title="Couche à droite de la barre"></select>
<select id="compareRight" class="field" title="Layer right of the divider"></select>
</div>
<div class="prec-legend" id="precLegend" hidden>
<div class="prec-bar" id="precBar"></div>
<div class="prec-ticks"><span>≤ 0,35</span><span>4</span><span>≥ 45 pts/m²</span></div>
<div class="prec-ticks"><span>≤ 0.35</span><span>4</span><span>≥ 45 pts/m²</span></div>
</div>
</div>
<div class="row" id="intensityRow">
<label for="reliefIntensity" class="hint">Intensité du relief</label>
<label for="reliefIntensity" class="hint">Relief intensity</label>
<input type="range" id="reliefIntensity" min="0.5" max="2" step="0.1" value="1"
title="Contraste du relief (1 = rendu standard, le PDF garde le rendu standard)">
title="Relief contrast (1 = standard rendering; the PDF always uses the standard rendering)">
<span class="panel-stat" id="reliefIntensityVal">1×</span>
</div>
<div class="legend" id="legendBlock" title="Relief orienté : la teinte donne l'orientation de la pente, la clarté le relief local">
<div class="legend" id="legendBlock" title="Oriented relief: hue shows the slope direction, lightness the local relief">
<canvas id="roseCanvas" width="96" height="96"></canvas>
<div class="rose-cap">Pente orientée vers…<br><span>clair = bosse · sombre = creux</span></div>
<div class="rose-cap">Slope facing…<br><span>light = bump · dark = hollow</span></div>
</div>
<details id="readingBlock" class="reading">
<summary>Comment lire la carte</summary>
<summary>How to read the map</summary>
<ul id="readingList"></ul>
</details>
</section>
<section id="tab-tile" role="tabpanel" hidden>
<p class="hint" id="tileHint">Cliquez une dalle sur la carte pour la sélectionner.</p>
<p class="hint" id="tileHint">Click a tile on the map to select it.</p>
<div id="tileCard" hidden>
<div class="row tile-head"><span class="sec-title" id="tileTitle">Dalle</span></div>
<div class="row tile-head"><span class="sec-title" id="tileTitle">Tile</span></div>
<div id="tileBody"></div>
</div>
</section>
<section id="tab-print" role="tabpanel" hidden>
<div class="panel-stat" id="printInfo"></div>
<div class="row"><select id="printPaper" class="field" title="Format papier">
<div class="row"><select id="printPaper" class="field" title="Paper size">
<option value="A4" selected>A4</option><option value="A3">A3</option></select>
<select id="printOrient" class="field" title="Orientation">
<option value="paysage" selected>Paysage</option><option value="portrait">Portrait</option></select>
<select id="printScale" class="field" title="Échelle d'impression">
<option value="1000">1:1 000</option><option value="2000" selected>1:2 000</option>
<option value="5000">1:5 000</option><option value="10000">1:10 000</option></select></div>
<option value="paysage" selected>Landscape</option><option value="portrait">Portrait</option></select>
<select id="printScale" class="field" title="Print scale">
<option value="1000">1:1,000</option><option value="2000" selected>1:2,000</option>
<option value="5000">1:5,000</option><option value="10000">1:10,000</option></select></div>
<div class="row"><input id="printTitle" class="field" type="text" maxlength="120"
placeholder="Titre (optionnel)" title="Titre imprimé dans le cartouche"></div>
<p class="hint">Faites glisser la poignée ✥ pour placer le cadre jaune sur la zone à imprimer.</p>
placeholder="Title (optional)" title="Title printed in the title block"></div>
<p class="hint">Drag the ✥ handle to place the yellow frame over the area to print.</p>
<div class="row"><button id="printHere" class="btn"
title="Placer le cadre au centre de la vue">⌖ Centrer ici</button>
<button id="printFit" class="btn" title="Zoomer sur le cadre">⤢ Voir le cadre</button></div>
<div class="row"><button id="printGo" class="btn btn-primary">Exporter le PDF</button>
title="Place the frame at the centre of the view">⌖ Centre here</button>
<button id="printFit" class="btn" title="Zoom to the frame">⤢ Show frame</button></div>
<div class="row"><button id="printGo" class="btn btn-primary">Export PDF</button>
<span id="printMsg" class="print-msg"></span></div>
</section>
<section id="tab-gen" role="tabpanel" hidden>
<div class="row"><button id="btnZone" class="btn" title="Générer une nouvelle zone : dessiner un rectangle, téléchargement IGN + traitement">+ Zone</button>
<button id="btnComplete" class="btn" title="Compléter : traiter toutes les dalles déjà téléchargées qui manquent des couches choisies">⤒ Compléter</button></div>
<div class="row"><button id="btnZone" class="btn" title="Generate a new area: draw a rectangle, IGN download + processing">+ Area</button>
<button id="btnComplete" class="btn" title="Complete: process every already-downloaded tile missing the chosen layers">⤒ Complete</button></div>
<div class="panel-stat" id="genBadge"></div>
<div id="genMsg" class="meta">Dessinez une zone (+) ou complétez les dalles existantes (⤒).</div>
<div id="genMsg" class="meta">Draw an area (+) or complete the existing tiles (⤒).</div>
<div id="genOpts">
<div class="gen-row"><span class="gen-lbl">Couches</span>
<select id="genViz" class="field" multiple size="4" title="Laisser vide pour les couches du panneau"></select></div>
<label class="chk"><input type="checkbox" id="genRegen"> Régénérer les tuiles existantes</label>
<div class="meta">Sol : classification IGN · bords raccordés aux dalles voisines (bande 100 m)</div>
<div class="gen-row"><span class="gen-lbl">Layers</span>
<select id="genViz" class="field" multiple size="4" title="Leave empty for the panel layers"></select></div>
<label class="chk"><input type="checkbox" id="genRegen"> Regenerate existing tiles</label>
<div class="meta">Ground: IGN classification · edges stitched to neighbouring tiles (100 m band)</div>
</div>
<div class="row" id="genActions">
<button id="genGo" class="btn btn-primary" title="Télécharge (géoplateforme IGN) puis traite les dalles sélectionnées">Générer</button>
<button id="genClear" title="Vider la sélection de dalles">Effacer la sélection</button>
<button id="genGo" class="btn btn-primary" title="Downloads (IGN Géoplateforme) then processes the selected tiles">Generate</button>
<button id="genClear" title="Clear the tile selection">Clear selection</button>
</div>
<div id="genRun" hidden>
<div class="meta" id="genProgress"></div>
<pre id="genLog" class="gen-log"></pre>
<div class="row">
<button id="genStop" title="SIGTERM au pipeline (nettoyage propre), SIGKILL en repli">Arrêter</button>
<button id="genQueueClear" title="Retirer les demandes en attente (le run en cours continue)">Vider la file</button>
<button id="genStop" title="SIGTERM to the pipeline (clean shutdown), SIGKILL as a fallback">Stop</button>
<button id="genQueueClear" title="Remove pending requests (the current run continues)">Clear queue</button>
</div>
</div>
</section>
<section id="tab-share" role="tabpanel" hidden>
<div class="row"><button id="btnShare" class="btn btn-primary" title="Copier un lien vers cette vue">⎘ Copier le lien de la vue</button></div>
<h4 class="sec-title">Fond d'imagerie XYZ (JOSM, QGIS, iD…)</h4>
<div class="row"><button id="btnShare" class="btn btn-primary" title="Copy a link to this view">⎘ Copy link to this view</button></div>
<h4 class="sec-title">XYZ imagery background (JOSM, QGIS, iD…)</h4>
<div id="useBody"></div>
<h4 class="sec-title">Configuration par défaut</h4>
<div class="row"><button id="btnDefault" class="btn" title="Figer l'affichage courant (couche principale, mode, fond) comme configuration par défaut de tous les navigateurs">★ Définir par défaut</button>
<button id="btnReset" class="btn" title="Revenir à la configuration par défaut">↺ Réinitialiser</button></div>
<h4 class="sec-title">Default configuration</h4>
<div class="row"><button id="btnDefault" class="btn" title="Save the current display (main layer, mode, base map) as the default configuration for every browser">★ Set as default</button>
<button id="btnReset" class="btn" title="Revert to the default configuration">↺ Reset</button></div>
</section>
</div>
</aside>
<nav id="tools">
<button id="zoomIn" title="Zoomer">+</button>
<button id="zoomOut" title="Dézoomer">−</button>
<button id="zoomFit" title="Recadrer sur les données">⤢</button>
<button id="gps" title="Centrer sur ma position">⌖</button>
<button id="btnTheme" class="btn-icon" title="Thème">◐</button>
<button id="zoomIn" title="Zoom in">+</button>
<button id="zoomOut" title="Zoom out">−</button>
<button id="zoomFit" title="Zoom to the data">⤢</button>
<button id="gps" title="Centre on my location">⌖</button>
<button id="btnTheme" class="btn-icon" title="Theme">◐</button>
</nav>
<div id="toast" class="toast" hidden></div>
<div id="tileload" class="tileload" hidden aria-live="polite">

File diff suppressed because it is too large Load Diff