From dd75875521c7fdb4b610676f0db64b38bda1641f Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Mon, 31 Aug 2026 09:15:26 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20spec=20g=C3=A9n=C3=A9ration=20des=20ic?= =?UTF-8?q?=C3=B4nes=20launcher=20depuis=20le=20logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../specs/2026-08-31-icons-launcher-design.md | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 docs/superpowers/specs/2026-08-31-icons-launcher-design.md diff --git a/docs/superpowers/specs/2026-08-31-icons-launcher-design.md b/docs/superpowers/specs/2026-08-31-icons-launcher-design.md new file mode 100644 index 0000000..ec80142 --- /dev/null +++ b/docs/superpowers/specs/2026-08-31-icons-launcher-design.md @@ -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