Files
livrets/docs/superpowers/specs/2026-08-31-icons-launcher-design.md
T

66 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 (~51 %) pour tenir dans le cercle de sûreté de 66 dp de **diamètre** (les 4 coins de la grille doivent y rester) |
| 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·√2) ≈ 0.5073` (la diagonale de la grille 92×92 du master doit tenir dans le cercle de sûreté de 66 dp de diamètre), 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