# 📝 Journal des modifications (Changelog)

Toutes les modifications notables apportées à ce projet sont consignées dans ce document.

Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/) et ce projet adhère à la [Gestion sémantique de version (SemVer)](https://semver.org/lang/fr/).

## [1.6.5] - 24/09/2026 à 22h50

### 🚀 Nouveautés et Ergonomie
- **Panneau Outils et Affichage** : Ajout d'un panneau accordéon pour regrouper les outils de mesure et les options d'affichage sur la droite. Ce panneau est replié par défaut pour gagner de la place sur l'espace de travail.

## [1.6.0] - 18/09/2026 à 20h00

### 🚀 Nouveautés, Buzzer, Grillage en Surtension & Partage QR Code / URL
- **Nouveau dipôle : Buzzer / Avertisseur sonore piézoélectrique** :
  - **Modélisation électrique** : Intégré sous le type `BUZZER` (60 Ω nominal sous 6 V), seuil d'activation à 15 mA.
  - **Rendu graphique réaliste** : Boîtier cylindrique noir mat avec repères de polarité (+ rouge, - noir), orifice acoustique et ondes sonores animées pulsant en direct autour du boîtier.
  - **Symbole schématique normalisé** : Symbole AFNOR / CEI (pavillon en demi-cercle avec bornes de raccordement et ondes acoustiques).
  - **Synthèse sonore Web Audio API** : Fréquence piézoélectrique de 1400 Hz à volume très doux, avec bouton de coupure du son « 🔇 Mute » directement intégré dans la barre supérieure (état mémorisé en `localStorage`).
  - **Intégration universelle** : Disponible dans la boîte à outils de tous les niveaux (5e, 4e, 3e et hors-ligne), compatible avec l'export/import JSON, la duplication et la persistance locale.
- **Modèle thermique de surtension et grillage réaliste des lampes** :
  - **Seuil physique de grillage** : Déclenchement automatique en cas de surtension prolongée ($|U| > 9\text{ V}$ ou $I > 1{,}5 \times I_{nom}$ pendant plus de 0,5 s) ou de surtension brutale ($|U| \ge 12\text{ V}$ instantané).
  - **Rupture visuelle & ouverture du circuit** : Le filament se brise visiblement dans l'ampoule, un léger dépôt sombre apparaît sur le verre avec mention « GRILLÉE », le symbole schématique est barré et la résistance devient infinie ($R = 10^7\ \Omega$, courant coupé à 0 A).
  - **Bouton de remplacement** : Un bouton dédié « 💡 Remplacer l'ampoule » apparaît dans la barre de sélection inférieure pour réparer l'ampoule et restaurer son calibre nominal.
- **Correctif d'ergonomie et robustesse du modal de partage QR Code / URL** :
  - Restauration de l'affichage complet du champ de lien direct, du bouton « Copier » (avec retour visuel instantané) et du bouton « Télécharger QR Code (PNG) ».
  - Fermeture fluide et immédiate sur PC, tablette et mobile : écouteurs en mode capture sur le bouton de fermeture `✕`, fermeture au clic/toucher sur le fond sombre semi-transparent (backdrop) et à l'appui sur la touche `Échap`.
  - Élimination des conflits d'interception d'événements tactiles/pointeurs avec le moteur graphique PhET Scenery.
- **Partage express de circuit par QR Code & URL courtes** :
  - **Générateur autonome de QR Code intégré** : Mini-moteur QR Code 100% autonome en pur JavaScript (Kazuhiko Arase, licence MIT), fonctionnant entièrement hors-ligne sans aucune requête réseau.
  - **Encodage compact URL** : Compression Base64URL du circuit sous forme condensée générant un paramètre `?c=...` ultra-court.
  - **Fenêtre modale de partage moderne** : Nouveau bouton « Partager le circuit » dans la barre supérieure avec affichage du QR Code, bouton « 📋 Copier le lien » (avec animation de confirmation) et bouton « 📥 Télécharger le QR Code (PNG) » pour polycopiés de TP.
  - **Auto-chargement immédiat** : À l'ouverture d'un lien contenant `?c=...` ou `#c=...`, le montage est instantanément décodé, chargé et centré sur le plan de travail.

---

## [1.5.4] - 17/09/2026 à 19h31

### 🔧 Correctif, Alignement Voltmètre & Gestion Système du Cache
- **Vidage systématique du cache et auto-actualisation (Anti-Cache / Cache Busting)** :
  - En-têtes HTTP `<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">` intégrés dans l'ensemble des pages (`index.html` et simulations).
  - Détection automatique et transparente des nouvelles versions via `version.json` : si un client (iPad sous Jamf, PC en classe, etc.) charge une version antérieure depuis son cache, la page purge automatiquement `CacheStorage` et recharge immédiatement la version la plus récente.
  - Horodatage dynamique anti-cache (`?v=1.5.4&_nocache=...`) sur l'ensemble des liens de sélection de niveau (5ème, 4ème, 3ème) et du portail d'accueil.
  - Ajout d'un bouton « 🔄 Vider le cache & Recharger » directement dans la barre supérieure de chaque simulation et sur le portail d'accueil.
- **Inversion des bornes sur le boîtier du voltmètre** :
  - La borne rouge/orange est désormais positionnée à gauche du boîtier, et la borne noire à droite, en parfaite conformité avec les pointes de touche (fil rouge branché sur la borne rouge, fil noir branché sur la borne noire).
- **Alignement géométrique sub-pixel des fils de mesure** :
  - Recalcul exact des coordonnées d'ancrage des fils sur le boîtier (`dx = -6.5, dy = -13.8` pour la borne rouge ; `dx = 6.2, dy = -13.8` pour la borne noire) pour qu'ils pénètrent précisément au centre géométrique des alvéoles.
  - Recalcul de l'ancrage des fils à la base des pointes de touche (`dx = ±24, dy = -3`) adapté à l'échelle compacte 0,251, éliminant tout décalage avec le manche de la sonde.

---

## [1.5.3] - 17/09/2026 à 19h05

### 🚀 Nouveautés, 4 Voltmètres & Sélection Souris PC
- **Passage à 4 voltmètres simultanés au maximum** :
  - Possibilité de sortir jusqu'à 4 voltmètres depuis la boîte à outils pour mesurer simultanément toutes les tensions d'un circuit complexe (loi des mailles, comparaison générateur / récepteurs).
  - L'icône de voltmètre reste disponible tant que les 4 appareils ne sont pas tous sur le plan de travail.
  - Prise en charge intégrale de la sauvegarde et du rechargement de circuits (`localStorage` et fichiers JSON) jusqu'à 4 voltmètres.
- **Voltmètres redessinés 25% plus compacts (échelle 0,375)** :
  - Réduction proportionnelle du boîtier et des sondes pour permettre à 4 voltmètres et leurs 8 cordons de cohabiter harmonieusement autour du circuit sans encombrer le plan de travail, tout en conservant une lisibilité numérique parfaite.
- **Inversion des sondes Rouge et Noire** :
  - La borne et le cordon rouges sont désormais positionnés à gauche du boîtier (pointe de touche rouge inclinée à gauche).
  - La borne et le cordon noirs sont positionnés à droite (pointe de touche noire inclinée à droite).
- **Sélection rapide et intuitive à la souris sur PC** :
  - **Double-clic sur n'importe quel dipôle** : sélectionne instantanément **la totalité du circuit connecté** en un seul geste naturel à la souris.
  - **Bouton « ⛶ Tout sélectionner »** : Ajouté directement dans la barre d'outils supérieure (avec rappel du raccourci clavier `Ctrl+A`).

---

## [1.5.2] - 17/09/2026 à 18h46

### 🚀 Améliorations, Duplication & Déplacement fluide
- **Positionnement séparé intelligent de la duplication (anti-chevauchement & anti-aimantation)** :
  - Calcul dynamique de l'espace disponible sur le plan de travail pour positionner le circuit dupliqué à côté du circuit initial (décalage propre d'au moins 120 px à droite, ou en dessous/à gauche selon la place).
  - Élimine tout chevauchement visuel et empêche la fusion ou l'accrochage involontaire de sommets voisins (`SNAP_RADIUS`).
- **Déplacement immédiat et direct du circuit dupliqué (iPad & Desktop)** :
  - Dès la duplication, l'ensemble du clone reste activement sélectionné.
  - Possibilité de déplacer le circuit en bloc en touchant/glissant **n'importe quel dipôle** (fil, pile, lampe, interrupteur...), nœud, badge `✥ Déplacer` ou zone de sélection, sans aucune déformation.
  - Prise en charge du glissement immédiat dès l'appui sur le bouton `⧉ Dupliquer` et capture continue d'événement Scenery sur écran tactile.

---

## [1.5.1] - 17/09/2026 à 18h25

### 🚀 Nouveautés, Duplication & Ergonomie iPad
- **Duplication de circuit après sélection (Desktop & iPad)** :
  - **Bouton tactile dédié `⧉ Dupliquer`** : Intégré directement sur le badge au-dessus de la sélection pour doubler n'importe quel circuit d'un simple toucher sur iPad ou tablette, sans clavier.
  - **Raccourci clavier `Ctrl+D` / `Cmd+D`** : Duplication instantanée sur ordinateur.
  - **Positionnement séparé intelligent (anti-chevauchement & anti-accrochage)** : Le circuit dupliqué est automatiquement positionné à côté du circuit d'origine (selon l'espace libre disponible sur le plan de travail), évitant tout recouvrement visuel ou fusion involontaire de connexions (`SNAP_RADIUS`).
  - **Déplacement immédiat et fluide (iPad & Desktop)** : Dès la duplication, le nouveau circuit est sélectionné et peut être déplacé en bloc en glissant son doigt ou sa souris sur n'importe quel composant (fil, pile, lampe...), nœud, badge ou zone de sélection, sans aucune déformation du circuit. Capture d'événement Scenery continue pour une réactivité parfaite sur écran tactile.
- **Horodatage dynamique précis à l'exportation JSON & PNG** :
  - La date et l'heure réelles de l'exportation sont calculées dynamiquement à la seconde du clic dans les métadonnées du fichier JSON (`date` et `time`).
  - Intégration systématique de la date et de l'heure dans les noms de fichiers téléchargés (`circuit_<niveau>_YYYY-MM-DD_HHhMM.json` et `.png`).
- **Suppression des rectangles de focus d'accessibilité parasites** :
  - Élimination complète des boîtes bleues foncées individuelles et du cadre supérieur flottant sur le moteur, pour un rendu visuel net et fluide.

---

## [1.5.0] - 17/09/2026 à 17h15

### 🚀 Nouveautés & Ergonomie
- **Sélection multiple et déplacement groupé d'éléments** :
  - **Sélection par rectangle de capture (marquee)** : Cliquez et glissez sur un espace vide du plan de travail pour tracer un rectangle de sélection fluide aux contours cyan. Tous les composants et fils traversés ou englobés sont instantanément sélectionnés et mis en surbrillance.
  - **Sélection par combinaison de touches** : Raccourci `Ctrl+A` (ou `Cmd+A`) pour sélectionner la totalité du circuit d'un coup, et `Shift+Clic` / `Ctrl+Clic` sur un composant pour l'ajouter ou le retirer de la sélection.
  - **Déplacement groupé rigide** : Dès que plusieurs éléments sont sélectionnés, un cadre englobant surmonté d'un badge interactif « ✥ Déplacer (N) » apparaît. Cliquez et glissez n'importe où sur le groupe pour déplacer tous les composants et leurs fils de connexion ensemble, sans déformer le circuit ni étirer les fils.
  - **Déplacement précis au clavier** : Les touches fléchées (`↑`, `↓`, `←`, `→`) permettent de déplacer le groupe de 5 px (ou 25 px avec `Shift`).
  - **Suppression groupée & désélection** : Touche `Suppr` / `Retour arrière` pour supprimer simultanément tous les dipôles sélectionnés, et touche `Échap` (ou clic dans le vide) pour désélectionner.
- **Recentrage vertical automatique lors du chargement ou de la restauration du circuit** :
  - Lors d'une restauration automatique (`localStorage`) ou de l'importation d'un fichier JSON, un circuit situé trop bas sur le plan de travail (proche des boutons ou du panneau de réglage) est automatiquement et intelligemment recentré au milieu de la zone visible.
- **Recentrage pixel-perfect de la bulle d'aide du cadenas du moteur** :
  - La bulle explicative (« Bloquer le rotor (faire forcer le moteur) » / « Rotor bloqué ») est désormais parfaitement centrée à l'horizontale au-dessus du bouton cadenas du moteur, sans aucun décalage latéral.

---

## [1.4.0] - 17/09/2026 à 16h42

### 🚀 Nouveautés & Modélisation
- **Nouveau Moteur Électrique interactif** :
  - **Rotation dynamique réaliste** : Le rotor tourne avec une vitesse angulaire proportionnelle à l'intensité du courant qui le traverse ($|I|$).
  - **Inversion du sens de rotation** : Le sens de rotation change instantanément en inversant les bornes ou la polarité du générateur.
  - **Blocage mécanique du rotor & Bulle d'aide** : Bouton cadenas dans la barre d'outils inférieure lorsque le moteur est sélectionné. Une bulle d'aide explicative apparaît au survol et à la sélection (« Bloquer le rotor (faire forcer le moteur) » / « Rotor bloqué (le moteur force et risque de griller !) »). En position bloquée, la résistance interne chute (2&nbsp;Ω contre 20&nbsp;Ω à vide), ce qui provoque un fort appel de courant.
  - **Modèle thermique, grillage & fumée réaliste** : En cas de blocage prolongé avec courant élevé ($I > 0{,}8\text{ A}$ pendant plus de 1,6 s) ou de surintensité extrême ($I > 8\text{ A}$), le moteur grille : il ne disparaît pas du plan de travail, son boîtier reste visible et noircit avec mention « GRILLÉ », et des volutes de fumée animées s'en échappent en continu. Le circuit s'ouvre et le rotor s'arrête. En vue schématique, le symbole normalisé du moteur (cercle avec lettre M) est barré d'une croix rouge.
  - **Réparation et réinitialisation** : Un bouton de réinitialisation apparaît au bas de l'écran lorsqu'un moteur grillé est sélectionné (sur le même principe que le remplacement d'un fusible fondu).
  - **Intégration complète** : Disponible dans la boîte à outils de tous les niveaux, compatible avec la persistance automatique (`localStorage`) et l'export/import JSON.
- **Calibre par défaut du fusible fixé à 2 A** :
  - Le calibre nominal par défaut du fusible passe de 4&nbsp;A à 2&nbsp;A sur l'ensemble des niveaux (5e, 4e, 3e et version hors-ligne).
  - Ce réglage permet une coordination de protection optimale en collège : sous une alimentation usuelle de 6&nbsp;V, le moteur consomme 0,3&nbsp;A à vide (le fusible tient) et 3&nbsp;A lorsqu'il est bloqué (le fusible de 2&nbsp;A fond immédiatement, protégeant ainsi le moteur de la surchauffe et du grillage).

---

## [1.3.0] - 16/09/2026 à 22h20

### 🚀 Nouveautés & Ergonomie
- **Persistance automatique du circuit lors du rechargement de la page (anti-perte)** :
  - Sauvegarde en temps réel de l'état du circuit (topologie, sommets, coordonnées, composants, calibres, DEL, objets du quotidien et appareils de mesure) dans la mémoire locale du navigateur (`localStorage`).
  - Restauration automatique et fluide dès l'initialisation de la simulation lors d'un rafraîchissement (F5), d'un rechargement de page ou d'une réouverture d'onglet.
  - Déclenchement réactif lors de toute modification du circuit (`circuitChangedEmitter`), avec sauvegarde de secours périodique et lors de la fermeture de la page (`beforeunload`, `pagehide`, `visibilitychange`).
  - Effacement propre de la mémoire locale si l'utilisateur vide délibérément son plan de travail (bouton effacer/réinitialiser).

---

## [1.2.1] - 16/09/2026 à 21h55

### 🚀 Nouveautés & Améliorations
- **Compatibilité totale de l'import / export entre niveaux scolaires (5ème, 4ème, 3ème)** :
  - **Conversion automatique des calibres des lampes** : un circuit créé en 5e ou 4e avec une lampe exprimée en milliampères (`6V 50mA`, `6V 100mA`, `6V 300mA`, `6V 350mA`) s'adapte automatiquement en Watts (`6V 0,3W`, `6V 0,6W`, `6V 1,8W`, `6V 2,1W`) lors de l'importation en 3ème, et inversement, avec ajustement précis de la résistance physique interne.
  - **Prise en compte intégrale des objets du quotidien et des DELs (`householdObjectGroup`)** : sauvegarde et réimportation complètes des DELs (diodes électroluminescentes), béchers de solutions aqueuses (eau pure, eau du robinet, eau salée), pièces, trombones, gommes et crayons.
  - **Support des ampèremètres sans contact et des lampes extrêmes** : intégration dans l'export/import JSON avec isolation sécurisée pour la 5ème (les multimètres importés restent invisibles en 5e pour ne pas surcharger l'écran).
- **Indication systématique de l'heure en plus de la date** :
  - Ajout de l'heure de mise à jour (`16/09/2026 à 21h55`) dans le pied de page de chaque écran de simulation, sur la page d'accueil ainsi que dans les métadonnées de fichier JSON (`date: "16/09/2026"`, `time: "21:55"`).

---

## [1.2.0] - 16/09/2026

### 🚀 Nouveautés & Fonctionnalités
- **Sauvegarde et chargement de circuits (Export / Import JSON)** :
  - Ajout des boutons Sauvegarder (💾) et Charger (📤) dans la barre de navigation supérieure.
  - **Correction de l'importation** : enregistrement direct et systématique de chaque dipôle recréé dans `circuit.circuitElements`, assurant leur affichage graphique immédiat sur le plan de travail et leur prise en compte par le moteur de résolution MNA.
  - Sauvegarde fidèle de la topologie (sommets, coordonnées, dipôles, calibres nominaux, réglages de tension et de résistance) et de l'état des multimètres (voltmètre, ohmmètre et leurs pointes de touche).
- **Exportation en image PNG haute résolution** :
  - Ajout du bouton Exporter PNG (🖼️) dans la barre supérieure.
  - Capture haute fidélité générée directement par le moteur PhET (`ScreenshotGenerator`), sans éléments d'interface parasites.
- **Affichage dynamique de la version et de la date** :
  - Mention systématique du numéro de version (`v1.2.0`) et de la date de dernière mise à jour (`16/09/2026`) dans le pied de page de chaque écran de simulation ainsi que sur la page d'accueil.

### ⚡ Modélisation physique & Calibrage
- **Extinction de la lampe 350 mA à faible courant (0,044 A)** :
  - Implémentation d'un modèle d'incandescence avec seuil thermique physique : en dessous de 30% du courant nominal ($I/I_{\text{nom}} < 0{,}30$), le filament de tungstène ne s'échauffe pas assez pour émettre de la lumière visible et la lampe est rigoureusement éteinte (0 rayon).
  - Dans un circuit en série sous 6 V avec une lampe 50 mA et une lampe 350 mA ($I \approx 0{,}044\text{ A}$), la lampe 350 mA reste parfaitement éteinte tandis que la lampe 50 mA produit sa lueur visible normale.
  - Correction du test de sous-chaîne pour les calibres nominaux (`350mA` et `300mA` prioritaires sur `50mA`).

---

## [1.1.0] - 16/09/2026

### ⚡ Multimètres & Précision
- **Ampèremètre précis à 0,001 A près** : affichage à 3 décimales pour mesurer précisément les intensités de l'ordre du milliampère.
- **Ohmmètre autonome PhET** : multimètre dédié affichant « Résistance » sur la face avant, détection de court-circuit (0.00 Ω) et avertissement en cas de tension active (ERR).
- **Résistances calibrées normalisées** : 47 Ω, 68 Ω, 100 Ω, 220 Ω avec anneaux normalisés.

### 🛠️ Ergonomie & Corrections
- **Correction du freeze lors de la suppression d'une lampe** (erreur `dispose` sur `resistanceText`).
- **Correction du freeze lors de la sélection dans l'EditPanel**.
- **Suppression totale du son** pour un environnement de classe serein.
- **Suppression de la barre noire inférieure** (`NavigationBar`) et de la roue dentée de réglages.
- **Pied de page discret de licence CC BY-NC 4.0**.

---

## [1.0.0] - 16/09/2026

### 🎓 Initialisation du projet Collège
- Déclinaison en 3 niveaux scolaires adaptés au cycle 4 : **5ème**, **4ème**, **3ème**.
- Sélecteur flottant permettant de basculer instantanément d'un niveau à un autre.
- Pile 6 V avec borne positive (+) orientée à gauche par défaut.
- Lampes étalonnées avec marquage nominal visible sur l'ampoule (50 mA, 100 mA, 300 mA, 350 mA en 5e/4e ; 0,3 W, 0,6 W, 1,8 W, 2,1 W en 3e).
- Verrouillage du curseur de résistance sur les lampes étalonnées.
- DEL directionnelle et solutions aqueuses conductrices/isolantes.
- Portail d'accueil responsive avec liens vers les sources officielles de la Forge des Communs Numériques Éducatifs.
