# Changelog ## v1.1.6 ### Mise à jour automatique - **Migration electron-updater** : remplacement du système custom (download HTTP + script batch) par `electron-updater` (generic provider) - Vérification sha512 automatique des mises à jour - Installation NSIS native (plus de script batch hack) - Restart automatique après installation - Code simplifié (~60 lignes vs ~200) - Compatible Gitea : découverte via API + `latest.yml` uploadé en asset de release - Nouveau workflow de release : uploader le `.exe` ET `latest.yml` sur Gitea ### Architecture - Migration complète vers une architecture DDD hexagonale (Vite + TypeScript) - Couche **domain** : entités, value objects, services purs, ports - Couche **application** : CQRS (CommandBus / QueryBus), handlers - Couche **infrastructure** : LocalStorage, Electron notifications, WebAudio alarm - Couche **presentation** : composants, helpers, UIState - Suppression du monolithe legacy, Vite est désormais le seul build - Setup Vitest avec alias de chemins (`@domain`, `@application`, etc.) ### Nouvelles fonctionnalités - **Timer** : session robuste (pause/reprise fiable), alarme unique, ETA niveau 200 - **Accouplement** : images des dragodindes (66 races en base64), barre de recherche par nom, filtres par génération (AND logique) - **Réapprovisionnement** : barre de recherche, sauvegarde de workflow depuis les résultats de calcul - **Inventaire** : barre de recherche, simulation proportionnelle multi-générations, bouton sauvegarder le workflow - **Workflows** : filtre par génération, barre de recherche sur les noms - **Mises à jour en temps réel** : barres de progression du workflow, compteur DD en stock de l'inventaire — se mettent à jour pendant la frappe ### Corrections de bugs - **Recette Ebène** : les parents étaient inversés (Amande et Rousse → corrigé en Amande et Dorée + Dorée et Rousse) - **Simulation inventaire** : l'algorithme glouton épuisait tout le stock pour le premier croisement. Remplacé par une allocation proportionnelle dynamique (chaque parent est divisé équitablement entre les croisements qui l'utilisent) - **Dirty flag** sur tous les écrans (accouplement, réappro, inventaire, workflows) : le rAF loop à 60fps reconstruisait le DOM à chaque frame, détruisant les event listeners et empêchant les clics/inputs de fonctionner - **Persistance inventaire** : `update-settings` ne gérait pas le champ `inventaire` — le stock était perdu à chaque changement d'écran - **Chargement inventaire** : `get-inventaire` retournait un résultat de simulation au lieu du stock brut — l'écran se chargeait avec des données corrompues - **Comportement focus/blur des inputs** : uniformisé sur tous les écrans — focus vide le champ, blur sans valeur restaure l'ancienne, blur avec valeur applique la nouvelle - **ReapproView** : constructeur corrigé (commandBus manquant), bouton save-workflow branché sur la commande - **CSP** : ajout de `img-src 'self' data:` pour les images base64 des dragodindes - **Inventaire** : import `RACES_DATA` manquant + type `CalcCrossing` → `SimulationCrossing` — l'écran ne s'affichait plus - **Baffeur/Caresseur** : exclusion mutuelle (activer l'un désactive l'autre), bouton opposé grisé dans l'UI, contrainte de signe sur la cible sérénité (négatif pour baffeur, positif pour caresseur) — corrige le timer qui affichait "terminé" avec des cibles positives + baffeur - **Paramètres** : écran refait à l'identique du monolithe (boutons compacts avec emojis, modal ntfy avec QR codes et génération automatique du topic) - **Sons d'alarme** : fréquences et types d'oscillateurs corrigés pour correspondre au monolithe (arpège 440/554/659/880, fanfare triangle 6 notes, cloche 440/880/1320/1760, pulsation 5 pulses) - **Bouton Test son** : ne fonctionnait pas (passait par IPC sans écouteur) — joue maintenant directement via WebAudio - **CSP** : ajout de `img-src https://api.qrserver.com` pour les QR codes ntfy ### Tests - Tests unitaires pour `StockSimulator` (simulation proportionnelle : 13 cas) - Tests unitaires pour `SaveWorkflow` et `UpdateSettings` avec inventaire - Tests de régression pour la simulation inventaire (scénario du monolithe) - Test de la recette Ebène corrigée - Mise à jour des tests `GetInventaire` (stock brut au lieu de résultat calculé) ### Refonte graphique "Obsidienne" (MD3) - **Design system Obsidienne** : glassmorphism, tokens Material Design 3 (primary, secondary, surface, outline…), polices Manrope/Inter/Plus Jakarta Sans - **Nouveau fichier `obsidienne.css`** (~2100 lignes) : design MD3 pour tous les composants - **Migration emojis → Material Symbols Outlined** : toutes les icônes (stats, navigation, actions) - **Variables CSS MD3** : 37 tokens ajoutés dans `variables.css` (`--md-primary`, `--md-surface-container`, etc.) - **Sidebar** : refonte complète avec logo Obsidienne, sections organisées (Principal, Enclos, Outils, Paramètres), icônes Material Symbols, pastille de statut timer, version dans le footer — ouvert par défaut - **App Shell** : nouveau layout `app-shell` (sidebar + main-area), header avec hamburger, suppression de l'overlay sidebar - **Dashboard** : grille KPI (bébés, DD actives, couples, taux de réussite, races), bouton reset stats intégré, aperçu enclos - **EnclosView** : barres de jauge visuelles avec gradient par tier, bouton timer Material (DÉMARRER/PAUSE/REPRENDRE), zone "Alarme dans" réorganisée, bouton reset timer ajouté - **DragodindeCard** : stats avec icônes Material, jauge XP restructurée avec niveau + % + ETA - **Accouplement** : refonte de wizard 3 étapes → layout single-page (Parent 1 | Coeur+inputs | Parent 2 + grille de races en dessous), glassmorphism, chips génération pill, preview du bébé au centre - **UpdateBanner** : aligné sur le nouveau design MD3 - **Drag & drop accouplement** : les cartes de race sont glissables vers les zones Parent 1 / Parent 2, avec feedback visuel (halo violet), vérification de compatibilité partenaire au drop - **Numérotation smart des enclos** : la création comble les trous (supprimer Enclos 2 puis créer → "Enclos 2" au lieu de "Enclos N+1") - **Icône Windows native** : migration `icon.png` → `icon.ico` pour la fenêtre et la tray - **10 tests de régression `level-target-timer`** : vérifient que `levelTarget` affecte correctement le countdown mangeoire, `enclosGlobalState`, `calcLevelEtaLive`, et le flag `done` - **Auto-scroll drag & drop** : le conteneur remonte automatiquement quand on drag une race vers le haut de l'écran - **Correction scroll petit écran** : compensation du zoom CSS pour que le scroll atteigne le bas de la grille - Retrait des labels "MÂLE REQUIS" / "FEMELLE REQUISE" des panneaux parent ## v1.1.5 - Ajout de nouvelles features. ## v1.1.4 - Ajout de nouvelles features et correction de bugs. ## v1.1.3 - Correctif de bug mineur + features.