3.8 KiB
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: viewBox0 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 Androidicon-foreground.svg: viewBox0 0 108 108; groupe tuiles+glyphes du master, scale66/92 ≈ 0.7174centré, translaté au centre(54,54)→ couche foregroundicon-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(rendulogo.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-convertrequis (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:compileKotlinOK- Companion visuel : grille des icônes générées + simulation du masque rond Android (foreground dans zone sûre)
- iOS : chaque
filenamedeContents.jsonexiste 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)
.icnsbundle macOS, splash screens, favicons web- Retouche du design du logo lui-même