# 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