# Catalogue Material Symbols

Source : https://github.com/google/material-design-icons, fichiers
`symbols/web/<nom>/materialsymbolsrounded/<nom>_24px.svg` uniquement.
Variante : Rounded, poids 400, FILL 0, GRAD 0, taille optique 24.

## Organisation

- `current.json` : révision active, empreinte de l'index et éventuelle révision précédente.
- `public/icons/material-symbols/<révision>/*.svg` : dessins normalisés.
- Dans le même répertoire : `index.json` (empreintes source et locale, tailles),
  `names.json` (liste légère pour le Cockpit), `LICENSE` et `provenance.json`.

Tous ces fichiers sont versionnés ensemble. Les dessins officiels sont conservés ;
les dimensions fixes sont remplacées par une taille en em au rendu, la couleur par
`currentColor`. Lorsqu'un SVG officiel possède seulement un viewport de 24 × 24,
le viewBox équivalent `0 0 24 24` est ajouté. Les autres viewBox restent inchangés.

## Mise à jour volontaire

```sh
npm run update:material-symbols
```

Nécessite Node 18+ avec fetch, PHP (DOM et PDO SQLite), les dépendances Composer
installées et la base locale `var/database_sensipode_v2.db`. Aucun paquet npm
supplémentaire n'est téléchargé. Cette commande n'est jamais appelée par le build.

La commande fige le commit officiel, récupère uniquement la variante choisie,
valide tous les SVG et contrôle les noms utilisés dans les templates et la base
locale (ouverte en lecture seule). Une disparition utilisée, un fichier invalide,
un index incomplet ou une panne réseau interrompt l'opération avant activation.
Le nom d'une icône n'est jamais renommé automatiquement dans les contenus.

Le téléchargement se fait dans un staging ; le manifeste actif est remplacé par
renommage atomique, seulement après validation. Un verrou empêche deux imports
simultanés. Un processus tué brutalement peut laisser un verrou dans
`var/material-symbols-update.lock` : vérifier qu'aucun import ne tourne avant
son retrait et le nettoyage du staging correspondant.

Au plus deux révisions activées sont conservées : l'actuelle et la précédente.
La précédente reste disponible pour les pages déjà ouvertes. Relire le diff avant
tout commit. Un rollback doit restaurer ensemble le manifeste et les assets Git.

Contrôle local hors réseau :

```sh
php scripts/check-material-symbols.php public/icons/material-symbols/<révision>
```

Les données locales ne certifient pas les usages de production : vérifier aussi
les noms Enjeu.icon de production avant de retirer une ancienne icône.

## Rendu et administration

```twig
{{ material_icon('rocket') }}
{{ material_icon(enjeu.icon, 'flexContainer') }}
{{ material_icon('rocket', '', 'Décoller') }}
```

Le helper ne lit que des noms présents dans l'index. Les dessins sont mémorisés
pendant la requête. Par défaut, ils sont décoratifs. Un nom inconnu est journalisé
et omis en production ; il déclenche une exception explicite en développement.
Les boutons purement graphiques doivent posséder leur propre libellé accessible.

Les deux masques CSS reçoivent leurs URL versionnées depuis le layout Twig. Ils
suivent ainsi le manifeste actif sans reconstruction CSS à chaque mise à jour.

Dans le Cockpit Pôle, la recherche porte sur tous les noms et affiche au maximum
20 résultats. L'index est chargé au premier focus puis partagé entre les champs.
Flèches, Entrée, Échap et Tab sont pris en charge, y compris pour les Enjeux ajoutés
dans la collection. Sans JavaScript, le champ texte et la validation serveur restent
utilisables. Aucun SVG du catalogue complet n'est injecté dans le HTML public.

## Déploiement et vérifications

OVH ne nécessite pas Node : déployer les PHP/Twig, le CSS compilé, le catalogue et
son manifeste. Envoyer les nouveaux assets avant d'activer le manifeste. Ne pas
supprimer prématurément les assets précédents si des pages HTML restent en cache.
Le répertoire versionné permet un cache HTTP long des SVG ; les règles HTTP restent
gérées séparément au déploiement. Aucun changement de `.htaccess` n'est inclus.

Tests :

```sh
vendor/bin/phpunit --bootstrap vendor/autoload.php tests
node --test tests/MaterialSymbols/update.test.mjs
npm run build:css
php bin/console lint:twig templates
php bin/console lint:container
php bin/console cache:warmup --env=prod --no-debug
git diff --check
```

Contrôle visuel manuel : homepage, Pôle, détails Offre/Projet/Ressource, Contact,
menu et filtres, boutons et avatars, citations/liens externes, recherche Cockpit
et ajout d'un Enjeu dans la collection. Vérifier alignements, couleurs et tailles.
