docs: spec génération des icônes launcher depuis le logo

This commit is contained in:
herel committed 2026-08-31 09:15:26 +02:00
1 parent bc89f098f0
commit dd75875521
1 file changed
+65
@@ -0,0 +1,65 @@
# Design : icônes launcher depuis le logo — Livrets
Date : 2026-08-31
Statut : Validé par le produit
## 1. Objectif
Décliner le logo maître (`docs/branding/logo.svg`, spec 2026-08-31-logo-design) en icônes launcher pour Android (adaptive + legacy), iOS (AppIcon.appiconset) et desktop (icône de fenêtre), via un script reproductible committé. Remplacer les icônes template KMP actuelles.
## 2. Décisions clés
| Décision | Choix |
|---|---|
| Pipeline | Script `docs/branding/generate-icons.sh` + `rsvg-convert` (déjà installé) ; `python3` pour lire `Contents.json` iOS |
| Rejetés | Tâche Gradle custom (lourde pour un usage occasionnel) ; PNGs sans script (non reproductible) |
| Variantes SVG | 4 fichiers dans `docs/branding/` : `logo.svg` (master), `icon-square.svg`, `icon-foreground.svg`, `icon-monochrome.svg` |
| Android adaptive | background = bleu nuit uni plein cadre ; foreground et monochrome réduits (~72 %) pour tenir dans la zone sûre 66/108 |
| Android legacy | Rendu du master (carte arrondie), 48→192 px |
| iOS | PNG remplacés in situ, tailles lues dans `Contents.json` existant (ce fichier n'est pas modifié) |
| Desktop | PNG 512 px dans les ressources + `icon = ...` dans `Main.kt` |
| Monochrome | Silhouette blanche des 4 tuiles **sans glyphes** (glyphes impossibles : blanc sur blanc ; tuiles seules = grille lisible en themed icon Android 13+) |
## 3. Spécification
### 3.1 Variantes SVG sources (`docs/branding/`)
- `icon-square.svg` : viewBox `0 0 128 128` ; rect plein `(0,0,128,128)` sans arrondi fill `#1D3557` ; tuiles et glyphes aux positions exactes du master → iOS (masque arrondi appliqué par l'OS) et background Android
- `icon-foreground.svg` : viewBox `0 0 108 108` ; groupe tuiles+glyphes du master, scale `66/92 ≈ 0.7174` centré, translaté au centre `(54,54)` → couche foreground
- `icon-monochrome.svg` : géométrie du foreground, seules les 4 tuiles en fill `#FFFFFF`, fond transparent → couche monochrome
### 3.2 Assets Android (remplacement in situ, mêmes chemins)
- Legacy `ic_launcher.png` (rendu `logo.svg`) : mdpi 48, hdpi 72, xhdpi 96, xxhdpi 144, xxxhdpi 192
- Couches adaptive (108 dp) : `ic_launcher_background.png` (navy uni), `ic_launcher_foreground.png`, `ic_launcher_monochrome.png` : mdpi 108, hdpi 162, xhdpi 216, xxhdpi 324, xxxhdpi 432
### 3.3 iOS
`generate-icons.sh` lance un script `python3` inline qui : parcourt chaque entrée `size`×`scale` de `Contents.json`, calcule la taille pixel, rastérise `icon-square.svg` et écrase le `filename` correspondant.
### 3.4 Desktop
`desktopApp/src/main/resources/icons/icon.png` (512×512, rendu `logo.svg`) ; `Main.kt` : `Window(icon = painterResource("icons/icon.png"), ...)`. API exacte (import `painterResource`) vérifiée à l'implémentation.
### 3.5 Script `docs/branding/generate-icons.sh`
- `set -euo pipefail`, racine repo détectée par rapport au script, `rsvg-convert` requis (erreur claire sinon)
- Étapes : variantes SVG (fichiers committés, pas générés) → Android legacy → Android adaptive → iOS (python3) → desktop
- Idempotent, sans interaction ; exécutable (`chmod +x`)
## 4. Faisabilité
`rsvg-convert` présent ; `python3` présent ; Compose Multiplatform expose `painterResource` côté desktop ; aucune nouvelle dépendance Gradle.
## 5. Vérifications
- `./gradlew :sharedUI:jvmTest :androidApp:assembleDebug :desktopApp:compileKotlin` OK
- Companion visuel : grille des icônes générées + simulation du masque rond Android (foreground dans zone sûre)
- iOS : chaque `filename` de `Contents.json` existe et est un PNG non vide (`file` + taille > 0)
- Test de non-régression : les PNG remplacés ont les dimensions exactes attendues (`sips -g pixelWidth`)
## 6. Hors périmètre
- Icône marketing Play Store 512 px (asset store)
- `.icns` bundle macOS, splash screens, favicons web
- Retouche du design du logo lui-même