# Journal des versions

Format : [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), numérotation
[SemVer](https://semver.org/lang/fr/).

- **MAJEURE** : une option, une méthode, un événement ou une classe CSS `.sgi-*`
  disparaît ou change de sens ; ou le format des données (`spanb-grille-tuiles`)
  change de version majeure.
- **MINEURE** : ajout sans rupture (option, événement, texte, variable CSS).
- **CORRECTIVE** : correction sans changement de l'API.

Les données ont leur **propre** version (`public/donnees/X.Y.Z/`), indépendante
de celle du module.

## [1.5.0] — 2026-09-29

### Ajouté
- **`couches.sites` accepte une liste de couches** : une URL par fichier, et au
  besoin `{ url, type, libelle, couleur }` pour une couche propre au site. Seuls les
  fichiers listés sont téléchargés ; un fichier illisible n'empêche pas les autres.
- **Données** : les sites publiés en un fichier par type,
  `donnees/1.0.0/sites/{AP,TGRN,TGRH,LMMA}.geojson` (+ `SHA256SUMS`), identiques site
  pour site à `sites.geojson`, qui reste en place. Outil : `outils/decouper-sites.mjs`.
- `maille.sites` (et `proprietes.sites`), la teinte des mailles et la ligne
  « Site : … » ne citent que les **types des couches chargées**. Une couche propre
  au site est affichée, mais n'entre pas dans `maille.sites`.
- Type exporté `CoucheSites`.

### Modifié
- Formulaire de modification : les couches de sites sont lues dès l'affichage du
  champ (pour que `getSelection()` soit juste), et non plus à l'ouverture de la carte.

### Compatibilité
- `couches.sites: '…/sites.geojson'` (une URL) fonctionne comme en 1.4.0, et sans
  `couches.sites`, `maille.sites` cite toujours tous les sites.

## [1.4.0] — 2026-09-29

### Ajouté
- **Clé d'accès aux données** : option `cle`, ou paramètre `k=` dans l'URL de la
  grille. La clé est reportée sur **toutes** les URL de données du même domaine que
  la grille (tuiles, index, régions, sites), et **jamais** envoyée à un autre domaine
  (fond de carte, couche hébergée ailleurs).
- Contrôle côté Cloudflare : `functions/donnees/_middleware.js` (Pages Function).
  Clés valides dans la variable `CLES_DONNEES` du tableau de bord ; fermé par défaut.
- Clé refusée (403) : le champ s'affiche en **« Carte indisponible »** avec la
  raison, la valeur déjà enregistrée est conservée, l'envoi reste bloqué si la
  maille est obligatoire et vide ; `create()` est rejetée par une `ErreurAcces`,
  et l'événement `error` est émis. Aussi en cours d'utilisation (clé retirée).
- La valeur de la clé est masquée (`k=…`) dans les messages d'erreur.
- Textes `indisponible` et `accesRefuse` (français et anglais).

### Modifié
- `create()` construit le champ **avant** d'ouvrir la grille : une grille
  inaccessible n'est plus une page où le champ reste invisible.

### ⚠ Compatibilité
- Une fois le contrôle d'accès déployé, **la 1.3.0 ne peut plus lire les données** :
  elle ne transmet pas la clé aux tuiles. Elle reste en ligne (une version publiée
  est immuable), mais tout site doit utiliser la 1.4.0 ou suivante.

## [1.3.0] — 2026-09-28

Première version publiable de ce paquet. Elle succède aux modules livrés
`spanb-grille` 1.1.1 et `spanb-grille-modal` 1.0.0, dont elle reprend le
comportement vérifié.

### Ajouté
- `create(élément, config)` sur le modèle de CKEditor : une balise `<script>`,
  puis la configuration. API `getValue`, `getSelection`, `setValue`, `open`,
  `close`, `on`, `off`, `destroy`, et `createAll`.
- **Données externes** : la grille, les régions et les sites se donnent par URL.
  Le module n'embarque aucune donnée géographique.
- Grille en **tuiles GeoJSON** standard, décrite par `grille.json` (format
  `spanb-grille-tuiles` 1.0), ou en FeatureCollection unique pour une petite grille.
- `setValue({ id, lat, lon })` et `data-lat` / `data-lon` : la maille est retrouvée
  sans passer par l'index.
- Apparence : option `theme`, variables `--sgi-*`, thème sombre (`sombre`),
  `css: false` pour fournir sa propre feuille.
- Langues française et anglaise ; tous les textes sont remplaçables (`textes`).
- Fond de carte configurable (`fond`), ou aucun fond.
- Légende construite à partir des types de site présents dans les données.
- Distribution **UMD** et **ESM**, types TypeScript, source maps, en-tête de
  licence dans chaque fichier, empreintes **SRI** (`sri.json`) et `SHA256SUMS`.
- Outils : `decouper-grille.mjs` (toute grille GeoJSON → tuiles),
  `publier-version.mjs` (copie versionnée et immuable), `verifier-localisation.ts`
  (contrôle contre PostGIS), `serveur-cdn-local.php` (test sur deux origines).

### Choix de conception
- La feuille de style est insérée **en tête** du `<head>`, et non dans une couche
  `@layer` : une couche ferait perdre au module toutes ses règles face aux règles
  génériques du site (`button { … }`, `input { width: 100% }`).
- La fenêtre conclut **au clic**, sans attendre l'événement `close` (asynchrone,
  et non émis par Chrome tant que la page ne se redessine pas).
- Le descripteur liste les blocs d'index existants : un id hors de la grille est
  déclaré inconnu **sans requête**, donc sans erreur 404 dans la console du site.
- Une requête qui échoue en CORS est signalée avec son adresse et les deux causes
  possibles, au lieu du seul « Failed to fetch ».
