Drawers — fermeture au glisser vers le bas — v1.83.0 — 2026-10-09
- Geste : sur mobile (tactile/stylet), on ferme un drawer en tirant son en-tête vers le
bas, avec une barre de préhension comme repère. Le panneau suit le doigt et le fond s'éclaircit. Il se ferme au-delà de 25 % de sa hauteur ou sur un geste rapide, sinon il revient en place. Seul l'en-tête capte le geste, pour ne jamais gêner le défilement du contenu. Le bouton ✕ reste (WCAG 2.5.1).
- Échap ferme aussi le drawer (desktop / clavier).
- Assistant de bonus : il passe sur le
BottomSheet partagé (il en recopiait le code) et
gagne ainsi le geste, Échap et role="dialog".
- Code :
useSwipeToDismiss (Pointer Events, sans dépendance) + shouldDismiss, une fonction
pure testée.
iOS — crash au lancement sous iOS 27 — v1.82.2 — 2026-10-02
- Cause : depuis le build 12 (1.71.2), l'app iOS est compilée avec Xcode 27 / SDK iOS 27, qui
impose le cycle de vie UIScene. Sans UIApplicationSceneManifest, iOS 27 tue l'app au lancement (_UIApplicationEvaluateRuntimeIssueForNoSceneLifecycleAdoption) ; iOS ≤ 26 n'est pas touché. Builds 12 (1.71.2) et 13 (1.80.0) concernés ; PWA et Android non concernés. Reproduit sur simulateur iOS 27 (témoin iOS 26.5 OK).
- Correctif : Capacitor 8.4.1 → 8.5.2 (support UIScene) et migration officielle
(SceneDelegate.swift, manifest de scène dans Info.plist, configurationForConnecting dans AppDelegate). Écart au template : le SceneDelegate instancie ScoriaViewController (qui enregistre le plugin StoreKit local) au lieu de CAPBridgeViewController, et le manifest ne déclare pas de storyboard de scène — la fenêtre est construite en code, une seule WebView. Vérifié sur simulateurs iOS 27.0 et 26.5 (lancement, un seul bridge, plugin ScoriaIAP joignable).
Lanceur de dés — dés libres recentrés — v1.82.1 — 2026-10-01
- Plein écran : un dé bloqué ne laisse plus d'emplacement vide en fin de rangée. Après une
relance (qui range les dés bloqués à la fin), les dés libres étaient décalés vers la gauche ; l'emplacement vide ne subsiste qu'entre deux dés libres, pour que bloquer un dé ne fasse pas bouger ses voisins.
- Vitrine : captures du lanceur refaites (types, couleurs, cadenas, relances libellées) ; la
capture plein écran est au ratio de son cadre (1,12:1) pour ne plus être rognée.
Lanceur de dés — types, couleurs, relances libellées — v1.82.0 — 2026-10-01
Le lanceur ne proposait que des d6 alors que la logique pure (dice.ts) gérait déjà d4 → d100.
- Choix du type : une rangée de 7 puces (d4, d6, d8, d10, d12, d20, d100) remplace le bouton
« Dé 6 faces ». Un tap ajoute un dé ; un badge compte les dés de ce type dans la main. Les dés restent l'aperçu de la main : avec une couleur par dé, des compteurs par type ne sauraient pas dire « 3 d6 rouges + 2 d6 blancs ».
- Mode édition au lieu d'un écran de configuration : en vue réduite, un seul écran — le crayon
(à la place de la pastille de l'outil) déplie le configurateur au-dessus de la même piste, dont les dés portent alors un ✕ ; le bouton or devient ✓ pour valider. En plein écran, un bouton « Modifier » fait de même et « Terminé » revient au jeu. Le choix de couleur est une pastille libellée « ● Couleur » (option caption ajoutée au ColorDotPicker partagé), les types passent sur leur propre ligne. Remplace la consigne « Touchez un dé pour le retirer ». Les blocages survivent à une édition en cours de tour ; une nouvelle ouverture de l'outil repart sans dé bloqué.
- Couleur par dé : le rond en tête de rangée réutilise le
ColorDotPicker des setups
(PICKER_PALETTE) et colore les prochains dés ajoutés (blanc par défaut, retour « Blanc »). Couvre Risk (rouges contre blancs) et Qwixx (2 blancs + 4 couleurs). Pips et chiffres prennent l'encre lisible (textColorForHex). Champ Die.color optionnel : mains persistées compatibles.
- Silhouettes par type (DieShape, SVG) : triangle d4, carré d6,
losange d8, cerf-volant d10, pentagone d12, hexagone d20 ; le d100 garde le carré et son tag.
- Dé bloqué explicite : contour or et badge cadenas (le contour seul ne disait pas « ne
sera pas relancé ») ; la consigne devient « Touchez un dé pour le bloquer : il ne sera pas relancé ».
- Plein écran — deux relances distinctes : bouton principal « Relancer », qui devient
« Relancer les N dés libres » dès qu'un dé est bloqué ; bouton secondaire « Tout relancer » (contour, libellé), désactivé tant que rien n'est bloqué — il ferait alors la même chose.
Fiche jeu — lien vers les règles officielles — v1.81.0 — 2026-09-29
La fiche d'un jeu propose désormais un lien « Règles officielles ↗ » sous le rappel de règles, vers la page ou le PDF publié par l'éditeur ou la fédération (78 jeux et sports sur 89). Le même lien figure en cours de partie, dans le panneau « Comptage des points » (ou un panneau « Règles » pour les jeux result_only) : on ne quitte pas la partie pour trancher un litige. Composant partagé OfficialRulesLink. Pas sur la vitrine (choix assumé).
- Lien, jamais copie : Scoria n'héberge aucun PDF. Le texte d'une règle est protégé par
le droit d'auteur ; un lien vers une œuvre librement accessible avec l'accord de l'ayant droit n'est pas une communication au public (CJUE *Svensson*). Sources limitées aux sites des éditeurs/fédérations (jamais de miroir tiers : *GS Media* présume la connaissance d'un site lucratif). Page stable de l'éditeur préférée au PDF versionné ; pas de vérification automatique des liens (choix assumé).
- Champ
officialRules (schema) : URL https par locale du document,
tout sous-ensemble (en seul si l'éditeur n'a pas de règles FR). La fiche prend la locale courante, puis FR, puis EN, et nomme la langue quand elle diffère : « Règles officielles (en anglais) » (Intl.DisplayNames). Hors garde-fou i18n (URL, pas du texte).
- Sans lien (rien d'officiel ou de fiable trouvé) : 5000, Président, Rami, Dobble,
Mille Bornes, Dominos, Triominos, Mini-golf, Futsal, Dito!, Ping-pong.
Timer — fin de sablier signalée et tic-tac — v1.80.0 — 2026-09-27
Jusqu'ici, un sablier écoulé ne se voyait qu'en regardant l'écran (0:00 en jaune).
Fin du sablier
- Alarme : carillon synthétisé en Web Audio (timerSound,
aucun fichier, hors-ligne), répété toutes les 1,2 s jusqu'à l'arrêt (plafond 60 s pour un téléphone oublié) : un bip isolé passe inaperçu à table. Audio débloqué par l'appui sur Play (contrainte iOS : l'audio doit naître d'un geste). Pas de sonnerie si la fin est constatée plus de 60 s en retard (app rouverte longtemps après) : le sablier se fige en silence.
- Vibration :
haptics.alarm() (500 ms), à chaque répétition. Écart assumé : aucune
vibration dans Safari/PWA iOS (pas de navigator.vibrate) ; OK sur Android et en app Capacitor.
- Visuel : le 0:00 pulse (dock et plein écran), neutralisé par « réduire les animations ».
- Arrêter : sur un sablier écoulé, le bouton doré devient ■ « Arrêter » — le CTA visible pour
couper les bips (pas de geste caché à deviner). Il remet le sablier plein en pause et redevient aussitôt ▶ (avant : ▶ sans effet, il fallait ↺). Fermer (✕) ou toucher le temps pour le modifier coupent aussi l'alarme.
Compte à rebours sonore
- 10 dernières secondes (actif par défaut) : un bip par seconde à hauteur fixe (880 Hz, même
timbre et volume que l'alarme), puis 2 bips/s sur les 5 dernières et 4 bips/s sur les 2 dernières (bips plus courts). Programmé sur l'horloge audio, donc calé sur la seconde malgré le rafraîchissement UI de 200 ms. Une hauteur montante a été essayée puis écartée (sonnait comme une mélodie fausse).
- Tic-tac d'ambiance (option du réglage Sablier, désactivé par défaut) : tic/tac doux sur
toute la durée. Choix assumé : un tic-tac permanent lasse vite sur un sablier de réflexion de 3–5 min, alors que les 10 dernières secondes apportent la tension sans gêner.
- Bouton 🔊/🔇 dans la barre et en plein écran (sablier seulement), activé par défaut et
mémorisé : coupe les tics, jamais l'alarme de fin, qui reste le signal fiable.
- Robustesse : seuls la pause, un réglage son ou la fermeture annulent le tic en attente. Le
faire aussi au passage de chaque seconde coupait ou sautait des tics au hasard (les horloges UI et audio divergent de quelques ms).
Barre
- ▶/⏸ et ↺ sont collés au temps (plein écran / fermer restent à droite), dont la largeur est
calée sur la durée du sablier : les boutons ne bougent pas pendant le décompte. ↺ ne s'affiche que s'il sert, c.-à-d. en pause avec du temps déjà écoulé (chrono comme sablier).
Code : préférences soundOn / ambience dans le store persisté ; découpage par responsabilité — réglage dans TimerSetup, programmation des tics dans useSablierTicks, piste d'interrupteur partagée SwitchTrack (réutilisée par TurnDrawSwitch).
Limite connue : écran verrouillé / app en arrière-plan, le JS est suspendu, donc aucun signal avant le retour dans l'app.
Catalogue — Carcassonne — v1.79.0 — 2026-09-26
- Carcassonne (
board, 2–5) : ScoreCard end_tally avec cumul dans la catégorie (patron
des Aventuriers du Rail). « Pendant la partie » se construit au fil des éléments achevés avec des boutons unitaires — Route +1 (par tuile), Ville +2 (par tuile), Blason +2, Abbaye +9 — le champ restant modifiable (abbé repris, correction). Décompte final : routes inachevées (Tuile +1), villes inachevées (Tuile +1, Blason +1), abbayes/jardins inachevés (Tuile +1), prés (Ville +3). Barème vérifié sur le livret Z-Man actuel (Rivière et Abbé inclus : un jardin compte comme une abbaye). Pas de départage officiel : égalité = victoire partagée.
- Moteur de fiche : l'intitulé d'un bouton
presets accepte désormais un LocalizedText
(en plus d'une chaîne brute, toujours utilisée par les longueurs de route des Aventuriers).
- Scénarios (total, égalité, partie en cours), i18n 6 langues, illustration existante (juillet)
réutilisée.
Catalogue — Tichu — v1.78.0 — 2026-09-26
- Tichu (
cards, 4, 2 équipes obligatoires) : RoundAccumulation + round_entry_table par
équipe (config Time's Up!), fin à 1000 à la frontière de manche ; si les deux équipes passent 1000 sur la même manche, le plus grand total gagne (règle officielle, déjà le comportement du moteur). Barème vérifié sur le livret Fata Morgana : 5 → 5, 10/Roi → 10, Dragon +25, Phénix −25 (100 par manche), doublé 200 sans décompte, Tichu ±100, Grand Tichu ±200. Variantes officielles à 3 (Threechu) et 6 (Tientsin) non couvertes.
- Aide à l'addition : un catalogue
bonuses (assistant générique de Sushi Go!) compte, par
équipe, les cartes gagnées (5, 10, Roi, Dragon, Phénix), les annonces réussies / ratées et le doublé. Pour ça, RoundEntryTable tient désormais le catalogue par équipe en mode équipes (jusqu'ici il repassait par personne ; aucun jeu en équipes n'en avait). Le script capture-game-screenshots.mjs (cible bonus) lit les libellés des lignes affichées au lieu des prénoms, pour gérer les équipes.
- Scénarios (double franchissement de 1000, négatifs sous 1000), i18n 6 langues, illustration et
captures vitrine (tichu.webp, tichu-bonus.webp) livrées.
Catalogue — Triominos — v1.77.0 — 2026-09-26
- Triominos (
board, 2–6) : RoundAccumulation + turn_entry, un score par tour (on marque à
chaque pose). Barème vérifié sur les livrets officiels Goliath (FR) et Pressman (EN) : somme des trois chiffres, pont +40, hexagone +50, double hexagone +60, pioche −5 (trois au plus), passe −10 de plus, fin de manche +25 + tuiles restantes des autres, décompte spécial en cas de blocage. Le « triple hexagone +70 » et le bonus de première pose, fréquents en ligne, sont absents des règles officielles. Boutons rapides (quickInputs) pour les bonus et pénalités, saisie −25…400.
- Fin de partie : la règle ne fait que suggérer 400 points ; choix au setup « Fin à » 400
(défaut) / Libre, seules options prévues par le livret. « Libre » stocke la valeur non numérique "none", que RoundAccumulation lit déjà comme « pas de seuil » (fin manuelle) — couvert par un scénario. Arrêt au tour de table où le seuil est atteint.
- Écart assumé : le bonus de fin de manche se compte une fois le tour de table terminé ; la fiche
demande de l'ajouter au tour suivant de la personne concernée, ce qui peut retarder d'un tour de table l'arrêt à 400 (la fin manuelle reste possible). Joueurs 2–6 : le livret Goliath annonce 2–4 sur sa page FR mais sa table de distribution va jusqu'à 6, comme le livret Pressman.
- Scénarios (seuil 400, partie en cours, objectif désactivé), i18n 6 langues, illustration livrée.
Catalogue — Qwirkle — v1.76.0 — 2026-09-26
- Qwirkle (
board, 2–4) : RoundAccumulation + turn_entry, un score par tour comme au
Scrabble (et non round_entry_table / free_tally envisagés au ROADMAP : on marque à chaque pose). Plus grand total gagne, égalité partagée ; fin manuelle (sac vide et dernière tuile posée, invisible pour l'app). Saisie 0–100, pas de 6 (valeur du bonus Qwirkle). Barème vérifié sur les livrets officiels MindWare et IELLO 2022 : 1 point par tuile de chaque ligne créée ou prolongée, Qwirkle +6, dernière tuile +6 (à ajouter au dernier tour), échange = 0. Scénarios (fin manuelle + partie en cours), i18n 6 langues, illustration livrée.