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

3.8 KiB
Raw Blame History

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