# Design : cible desktop macOS — Livrets Date : 2026-08-28 Statut : Validé par le produit ## 1. Objectif Ajouter une cible desktop macOS (Compose Multiplatform desktop) à l'app Livrets existante (Android + iOS), lançable via `./gradlew :desktopApp:run`. Zéro modification du code métier/UI existant. ## 2. Décisions clés | Décision | Choix | |---|---| | Usage | Run Gradle uniquement (pas de packaging .app/.dmg en v1) | | Structure | Nouveau module hôte `desktopApp/` (miroir d'`androidApp`), dépend de `:sharedUI` | | Fenêtre | "Livrets", 480×800 dp, fermeture = exit | | Stockage | `~/.livrets/history.json` (créé à la première sauvegarde par HistoryRepository) | | JVM | compat source/target Java 17 + jvmTarget Kotlin 17 (alignement des deux tâches) | Rejeté : cible desktop dans `sharedUI` (mélange bibliothèque/hôte) ; UI desktop native (UI Compose déjà partagée). ## 3. Architecture - `settings.gradle.kts` : + `include(":desktopApp")` - `desktopApp/build.gradle.kts` : plugins kotlin-jvm + compose-compiler + compose-multiplatform (aliases existants) ; `java { source/targetCompatibility 17 }` + `kotlin { jvmTarget 17 }` (sinon conflit compileJava 18 vs compileKotlin 17) ; dépendances `implementation(project(":sharedUI"))` + `implementation(compose.desktop.currentOs)` ; bloc `compose.desktop { application { mainClass = "com.livrets.desktop.MainKt" } }` - `desktopApp/src/main/kotlin/com/livrets/desktop/Main.kt` : `fun main() = application { Window(onCloseRequest = ::exitApplication, title = "Livrets", state = rememberWindowState(480.dp, 800.dp)) { App(filesDirPath = storageDir()) } }` ; `storageDir() = System.getProperty("user.home") + "/.livrets"` - `README.MD` : section "macOS desktop" (lancement) ## 4. Faisabilité (validée en sandbox) `:desktopApp:jar` compile ; `:desktopApp:run` ouvre la fenêtre et le processus JVM reste vivant (testé sur cette machine, JDK 18, JVM x86_64 sous Rosetta — sans conséquence pour desktop). ## 5. Tests & vérifications - `:desktopApp:jar` → compile - `:desktopApp:run` → fenêtre visible (vérification manuelle de l'utilisateur) - Régression : `:sharedUI:jvmTest` (20/20) + `:androidApp:assembleDebug` inchangés ## 6. Hors périmètre - Packaging .app/.dmg, signature/notarisation - Redimensionnement adaptatif de l'UI desktop, raccourcis clavier - Distribution (DMG, Homebrew)