BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기🎲 Lanceur de dé à 6 faces — PWA mobile-first, 100 % offline, sans tracking
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Lanceur de dé à 6 faces, mobile-first, 100 % offline, installable. Toute la surface de l'écran est une zone de tap : on touche, le dé roule, une face se pose. Sans pub, sans tracking, sans backend — seules les préférences locales sont stockées dans le navigateur. Membre de la famille PWA miss-* / mister-*, bâti sur les conventions partagées de @mister-guiiug/dev-pwa-config (ESLint React, Prettier, tsconfig strict, Vitest, PWA). Séparation stricte métier / animation / rendu / config, comme demandé :README 전문 보기 ↗
Lanceur de dés D4 à D20, mobile-first, 100 % offline, installable.
Toute la surface de l'écran est une zone de tap : on touche, le dé roule,
une face se pose. Autour du lancer libre : trois jeux en pass-and-play
(Yahtzee, 421, Cochon), un lanceur en notation JDR (4d6kh3) et un
écran Décider.
Sans pub et sans serveur propre : réglages, parties en cours, statistiques et
historique restent dans le navigateur (localStorage). Deux services tiers
sont branchés au déploiement :
Membre de la famille PWA miss-* / mister-*, bâti sur les conventions
partagées de @mister-guiiug/dev-pwa-config
(ESLint React, Prettier, tsconfig strict, Vitest, PWA).
Séparation stricte métier / animation / rendu / config, comme demandé :
| Couche | Fichier(s) | Rôle |
|---|---|---|
| Aléa | src/dice/random.ts | Tirage uniforme 1..N + multi-dés (rng injectable) |
| Types de dés | src/dice/diceTypes.ts | D4/D6/D8/D10/D12/D20 : faces, silhouette, rendu |
| Disposition points | src/dice/pips.ts | Grille 3×3 → points (réservé au D6) |
| Couleurs | src/dice/colors.ts | Une teinte par face (palette cyclée au-delà du D6) |
| Cadence d'animation | src/dice/rollSchedule.ts | Instants de défilement (pur, testé) |
| Contrôleur de lancer | src/react/hooks/useDiceRoll.ts | État repos → défilement → résultat multi-dés, anti-double-tap |
| Secouer pour lancer | src/react/hooks/useShakeToRoll.ts | Détection de secousse (DeviceMotion) + permission iOS |
| Clavier (desktop) | src/react/hooks/useKeyboardRoll.ts | Espace/Entrée lance, +/−/flèches changent le nombre de dés |
| Annonce vocale | src/react/hooks/useSpeak.ts | Branche le speech du socle (Web Speech) sur le réglage et la locale |
| Voix disponibles | src/react/hooks/useVoices.ts | Voix de la langue courante ; s'abonne, car la liste arrive en différé |
| Sons | src/audio/sounds.ts, src/react/hooks/useSound.ts | Retours audio synthétisés (WebAudio, aucun asset), entièrement gardés |
| Notation JDR | src/dice/notation.ts | Parseur pur 2d6+3, 4d6kh3, 2d20kh1, 4dF → total + détail |
| Décider | src/decide/decisions.ts | Pile ou face, oui/non, tirage au sort, mélange (pur) |
| Rendu d'une face | src/react/components/DiceFace.tsx | Points (D6) ou chiffre + silhouette (sans logique métier) |
| Plateau de dés | src/react/components/DiceTray.tsx | Disposition de N dés, taille adaptative |
| Écran principal | src/react/components/DiceScreen.tsx |
La logique pure (src/dice/**) ne connaît ni React ni le DOM : elle est
testable seule et couverte à ≥ 90 % (seuil CI).
miss-dice/
├── index.html
├── vite.config.ts # React + PWA + base path + 404 SPA + SEO (robots.txt, sitemap.xml)
├── vitest.config.ts
├── tsconfig*.json # strict, étend tsconfig-app-react et tsconfig-node du socle
├── eslint.config.js # @mister-guiiug/dev-pwa-config/eslint-react
├── prettier.config.js
├── scripts/generate-pwa-icons.mjs
├── scripts/captures-prepare.mjs # met l'écran en scène avant chaque capture
├── content/pages/regles-du-yahtzee.md # page de contenu, rendue en HTML statique au build
├── e2e/ # Playwright : fumée, entrée, a11y, palettes
├── public/
│ ├── favicon.svg
│ ├── og-image.jpg # image de partage (aperçus de liens)
│ ├── screenshots/ # captures du manifeste (npm run captures)
│ └── icons/ # PNG 192/512/maskable/180/64 (générés)
└── src/
├── main.tsx # racine React + enregistrement du SW
├── types.ts
├── links.ts # URL canonique à partager, résolue à l'exécution
├── dice/ # logique pure + tests
│ ├── random.ts colors.ts diceTypes.ts
│ ├── pips.ts rollSchedule.ts notation.ts
│ └── *.test.ts
├── store/createStore.ts # micro-store réactif, base de tous les autres
├── settings/{settingsStore,legacyMigration,palette}.ts
├── stats/rollStats.ts # distribution des faces
├── log/rollLog.ts # historique local + export CSV
├── audio/sounds.ts # WebAudio, sans asset
├── decide/decisions.ts # pile ou face, tirage, mélange
├── i18n/{messages,useI18n}.ts # 6 langues + clés typées + tests
├── app/appMode.ts # écran actif (lancer libre / jeux)
├── games/ # moteurs purs + tests
│ ├── persistence.ts # sauvegarde locale versionnée
│ ├── transfer.ts # la partie en cours, en lien ou en QR
│ ├── diceTurn.ts # tour de dés partagé par Yahtzee et 421
│ ├── yahtzee/{scoring,engine}.ts
│ ├── dice421/{scoring,engine}.ts
│ └── pig/engine.ts
├── styles/{tokens,styles}.css # tokens + pont --dwc-* + sections du socle
├── react/
│ ├── {App,ErrorBoundary,ThemeProvider,AppUpdatesProvider}.tsx
│ ├── components/{DiceScreen,DiceTray,DiceFace,SettingsDrawer,ModeMenu}.tsx
│ ├── components/{NotationRoller,DecideScreen,FamilyLinks,Sheet,RepriseRecue}.tsx
│ ├── components/{DicePicker,DiceControls}.tsx
│ ├── components/games/{GameShell,PlayerSetup,GameDice,YahtzeeGame,Dice421Game,PigGame,RepriseSheet}.tsx
│ ├── hooks/{useDiceRoll,useDiceReveal,useShakeToRoll,useKeyboardRoll,useReducedMotion}.ts
│ ├── hooks/{useSpeak,useVoices,useSound,useTheme,useUndoableGame}.ts
│ └── feedback/haptics.ts
├── assets/rive/README.md # comment activer Rive (optionnel)
└── test/{setup.ts,renderWithProviders.tsx}
+/=/↑ ajoute un
dé, -/↓ en retire - neutralisé pendant la saisie et tant qu'une feuille
modale est ouverte (src/react/hooks/useKeyboardRoll.ts).useDiceRoll).prefers-reduced-motion (ou réglage manuel) → résultat direct, sans
défilement.Regroupés sous trois intertitres, Affichage, Lancer et Accessibilité, suivis des blocs Statistiques, Historique (dès le premier lancer libre), À propos et Nos autres applications :
<html lang>
aussi).theme-color).auto. Chaque couleur est mesurée
(WCAG AA), et src/styles/tokens.test.ts refait le calcul depuis la feuille
à chaque exécution des tests.speech du socle).
Silencieuse et sans erreur là où l'API manque.Microsoft Hortense écorche « cinq » dès qu'une ponctuation le précède,
alors que Julie et Paul sont justes sur la même machine. Aucune
propriété de SpeechSynthesisVoice n'annonce la qualité d'une voix : le
bouton d'essai énonce donc la phrase RÉELLE de l'annonce, l'oreille étant
le seul juge. Le choix est retenu par name, pas par voiceURI - Chrome
et Firefox ne nomment pas la même voix pareil.FamilyApps du socle, alimentée par
son catalogue. Elle est rendue (, le
tiroir est étroit) et () :
dix-neuf cartes d'affilée faisaient un mur, elles sont rangées sous sept
catégories. Les groupes s'ouvrent dépliés ; un groupe replié le reste, dans
toute la famille (clé ).Toutes ces préférences sont persistées localement (localStorage).
Plusieurs écrans, accessibles depuis le lanceur ; on revient au lancer
libre par la flèche ou le bouton retour du navigateur/Android (intégré
à l'History API). Raccourcis longue-pression sur l'icône installée
(shortcuts du manifest → ?play=).
2d6+3, 1d20, 4d6kh3, avantage
2d20kh1, 1d100, dés Fudge 4dF… - parseur pur testé, total + détail
des dés gardés/retirés (logique src/dice/notation.ts).src/decide/decisions.ts).Pass-and-play 1 à 8 joueurs (1 joueur = solo) pour les jeux suivants.
Yahtzee - 5 dés, jusqu'à 3 lancers par tour (on garde les dés au
tap entre les lancers) : on peut s'arrêter et inscrire une case dès le
1er ou le 2e lancer (le statut le rappelle). Grille de 13 combinaisons,
bonus supérieur (+35 si la somme des « 1…6 » atteint 63). Chaque joueur
remplit sa propre grille ; le plus haut total l'emporte. Logique :
src/games/yahtzee/.
Yahtzee supplémentaire : bonus ET joker. Un second Yahtzee vaut +100 quand la case Yahtzee porte déjà 50 - et, dans tous les cas où elle est remplie (50 comme 0), le placement devient imposé : la case haute de la figure si elle est libre (cinq 4 → « Les 4 »), sinon n'importe quelle combinaison libre payée plein (full 25, petite suite 30, grande suite 40, même si les dés n'en forment pas la figure), sinon seulement un zéro dans une case haute. Le zéro dans la case Yahtzee compte : il ne donne pas les +100 mais impose le même ordre. La grille grise ce qui est interdit et le statut dit pourquoi.
421 - 3 dés, jeu à jetons (version classique simplifiée, assumée et
documentée dans src/games/dice421/scoring.ts) :
4-2-1 = 10 jetons (la meilleure), 1-1-1 = 7,
autre brelan d-d-d = d (2…6), suite de trois faces consécutives = 2,
nénette 2-2-1 = 2 (et pourtant la plus faible main du classement), toute
autre main = 1.Cochon (« Pig ») - 1 dé, jeu de stop-ou-encore : à son tour, on relance
autant qu'on veut, chaque face 2–6 s'ajoute au cumul du tour ; un 1
efface ce cumul et passe la main ; banquer verse le cumul au score. Le
premier à 100 gagne (à un joueur : atteindre la cible en un minimum de
tours). Logique : src/games/pig/engine.ts.
L'aléa, le score et l'enchaînement des tours sont des fonctions pures
(engine.ts) testées indépendamment de l'UI ; les composants ne font que
les afficher.
Confort de jeu : reprise d'une partie après refresh (sauvegarde
locale, signalée « Reprendre » dans le menu), annuler le dernier coup
(mistaps), rejouer avec les mêmes joueurs, partager le résultat, et
l'écran reste allumé pendant la partie (Screen Wake Lock). Le bouton qui
quitte efface la sauvegarde : il demande donc confirmation par défaut, et
ne s'en passe qu'en fin de partie, où il n'y a plus rien à perdre. Les icônes
de la barre sont dessinées, pas des glyphes ← ↶ ↺ dont le rendu
dépendait de la police de l'appareil. Le Yahtzee gère le bonus
Yahtzee (+100) et la règle du joker (ci-dessus), et rappelle dans son
statut qu'on peut inscrire une case dès le 1er lancer ; le 421 reconnaît
suites et nénette, et laisse choisir la taille du pot ainsi que la
règle du décideur.
Continuer ailleurs (lien ou QR) : depuis la barre d'un jeu, la partie en
cours s'emballe dans une URL - l'autre appareil scanne le QR, ou reçoit le
lien, et reprend exactement où on en était. Ce n'est PAS une synchronisation :
pas de serveur, pas de session partagée, pas de va-et-vient. On transmet un
instantané, une fois ; l'appareil de départ garde le sien, figé à l'instant
de l'envoi, et l'écran le dit. L'état est compressé quand le navigateur sait le
faire (CompressionStream) - une partie de Yahtzee à quatre joueurs tient
alors en 354 caractères au lieu de 1 410, ce qui fait la différence entre un QR
qui demande une main sûre et un QR qui se scanne du premier coup. À l'arrivée,
un lien d'une version de schéma antérieure est migré comme une sauvegarde
locale ; un lien d'une version plus récente que l'app, d'avant le
versionnement, tronqué ou fantaisiste est refusé avec un message ; et s'il
existe déjà une partie en cours pour ce jeu sur l'appareil, la reprise
demande avant de la remplacer.
src/assets/rive/README.md : le rendu est
isolé du contrôleur, on peut le remplacer sans toucher au métier.crypto.getRandomValues normalisé sur [0, 1) (résolution
32 bits → biais de mappage négligeable pour 4 à 20 faces), repli
Math.random. Source injectable → tests déterministes.useSyncExternalStore + localStorage (tolérant au mode privé).
Réglages, statistiques, mode courant et journal partagent la même
plomberie (src/store/createStore.ts) : un store concret ne décrit plus
que sa logique métier.components/base.css (les bases communes à tous
les composants du socle : cible tactile, focus, animations, contraste forcé,
impression) et components/app-footer.css (pied de page et grille famille),
pas la feuille entière. Tout est en
@layer components, donc chaque règle de styles.css continue de gagner.
Le contrat --dwc-* qu'elles lisent est un pont posé dans
src/styles/tokens.css : il pointe les jetons déjà déclarés au-dessus, et
la bascule clair/sombre suit sans être redite. Seuls les quatre tons d'état
y portent une valeur, faute d'équivalent dans l'app - en light-dark(),
color-scheme étant déclaré dans les deux blocs de thème.typescript-eslint
refuse la 7 par une assertion à l'import - ESLint meurt alors pour tous les
fichiers. La cohabitation est la voie documentée : npm run type-check:7
fait tourner le portage natif Go à côté de la 6, en continue-on-error en
CI. Il sert à voir venir, pas à bloquer.aria-label - jamais uniquement à la couleur.<button> → clavier (Entrée/Espace) gratuit.useKeyboardRoll) : lancer et
changer le nombre de dés sans viser une cible à la souris. Ils se taisent
dès qu'un champ ou une feuille modale a le focus..game-shell__body
déborde mais ne contenait, avant le premier lancer, aucun élément focalisable
disabled tant qu'on n'a pas lancé, et
un bouton désactivé sort du parcours. Elle porte donc un tabIndex
inconditionnel : mesurer le débordement en continu laisserait manquer
l'arrêt de tabulation à l'instant précis où l'on tabule.:focus-visible net, contrastes sombres élevés. Sur la zone de jeu, le
contour se dessine à l'INTÉRIEUR (outline-offset: -3px) : posé dehors sur
un bloc pleine largeur, il sortirait de l'écran à gauche et à droite.aria-live annonçant « Résultat : N », doublée au besoin par
l'annonce vocale (speech du socle, réglage « Annonce vocale »).role="img" + libellé chiffré sur chaque face.prefers-reduced-motion respecté (CSS + logique).nvm use # Node 26 (.nvmrc)
npm install # nécessite l'accès au registre @mister-guiiug
npm run dev # http://localhost:5173
Le registre GitHub Packages héberge
@mister-guiiug/dev-pwa-config. En CI le token est injecté ; en local, exporterNODE_AUTH_TOKEN(cf..npmrc).
Autres scripts :
npm test # tests unitaires (Vitest)
npm run test:coverage # couverture (seuil 90 % sur les domaines purs)
npm run lint # ESLint
npm run format # Prettier --write
npm run type-check # tsc -b (TypeScript 6)
npm run type-check:7 # second avis TypeScript 7 (portage natif Go)
npm run icons # régénère public/icons/ (dé procédural)
npm run captures # reconstruit, puis refait les captures du manifeste
npm run test:e2e # e2e Playwright (après `npx playwright install`)
npm run build:analyze # build + visualisation du poids des chunks
npm run build # tsc -b && vite build && pwa-bundle-budget -> dist/
npm run preview # prévisualise sous /miss-dice/
Déploiement automatique via .github/workflows/deploy.yml :
push sur main → build avec VITE_BASE_PATH=/<repo>/, plus VITE_SENTRY_DSN
et VITE_POSTHOG_KEY lues dans les variables du dépôt → publication sur
GitHub Pages. Sans ces deux variables, ni Sentry ni PostHog ne se chargent.
pwa-bundle-budget fait échouer le build si le poids dépasse le budget de
package.json. Un 404.html identique à index.html est émis pour que les
rafraîchissements de liens profonds bootent l'app shell. Le base Vite et
le scope du service worker sont alignés sur ce chemin.
Activer une fois dans Settings → Pages → Source : GitHub Actions.
src/dice/random.test.ts - mapping des tranches, bornes, multi-dés, uniformité.src/dice/diceTypes.test.ts - set de dés, rendu pips/chiffre, repli D6.src/dice/pips.test.ts - N points pour la face N, symétrie 180°.src/dice/colors.test.ts - teintes valides, distinctes, palette cyclée.src/dice/rollSchedule.test.ts - courbe accélère/décélère, robustesse.src/react/components/DiceFace.test.tsx - points (D6) et chiffre (autres) + a11y.src/react/components/DicePicker.test.tsx - la pastille, sa feuille (type et nombre de
dés, bornes) et le tiroir regroupé sous de vrais titres.src/react/hooks/useDiceRoll.test.ts - états, multi-dés, callbacks, anti-double-tap.src/react/hooks/useShakeToRoll.test.ts - seuil de secousse + temporisation.src/dice/notation.test.ts - parseur de notation (avantage, drop, Fudge).src/i18n/messages.test.ts - parité des clés des six langues, valeurs non vides, interpolation.src/i18n/useI18n.test.tsx - bascule de langue, <html lang>, persistance.src/games/yahtzee/{scoring,engine}.test.ts - 13 combinaisons, bonus, tours, fin.src/games/dice421/{scoring,engine}.test.ts - classement des mains, charge/décharge, victoire.src/games/pig/engine.test.ts - cumul du tour, perte sur le 1, banque, victoire, solo.src/react/components/SettingsDrawer.test.tsx - le lien de signalement et son préremplissage.src/games/persistence.test.ts - sauvegarde/reprise/effacement de partie.src/react/hooks/useUndoableGame.test.ts - annuler, persister, reprendre.src/react/components/Sheet.test.tsx - dialogue modal, focus, Échap.src/react/components/games/GameShell.test.tsx - coquille de jeu, retour, confirmation.src/settings/settingsStore.test.ts + src/stats/rollStats.test.ts - préfs et stats.src/settings/legacyMigration.test.ts - reprise des anciennes clés de réglages.src/store/createStore.test.ts - abonnement, émission, isolation entre stores.src/log/rollLog.test.ts - journal borné, export CSV.src/games/transfer.test.ts - aller-retour d'une partie par URL, repli sans
, et tout ce qu'un lien d'ailleurs ne doit PAS pouvoir faire.Couverture : 98,65 % d'instructions (CI du 27/09/2026), seuil CI ≥ 90 %. La porte ne mesure
que les domaines PURS - src/dice/**, src/games/**, src/decide/**,
src/log/** et src/store/createStore.ts (cf. vitest.config.ts). La
surface d'interface en est volontairement exclue : l'y verser diluerait le
seuil au lieu de le renforcer.
Sont livrés : types de dés, multi-dés, secouer-pour-lancer, six langues (FR/EN/ES/DE/IT/PT), jeux Yahtzee, 421 et Cochon, notation JDR et écran Décider, partage/source/sponsor, signalement d'un problème, thème clair/auto, sons, annonce vocale et choix de la voix, mode daltonien, raccourcis clavier, statistiques, historique exportable en CSV, reprise de partie, annuler, rejouer, partage de résultat, wake lock. Côté technique : jeux en lazy-load, error boundary, feuilles modales accessibles (focus trap + Échap), habillage du socle importé par section, husky/lint-staged/commitlint, Lighthouse CI, second avis TypeScript 7 et e2e Playwright (fumée, entrée, a11y, palettes). Livrés le 22/09/2026 : le joker Yahtzee complet (bonus +100 ET placement imposé), la règle du décideur au 421, deux palettes (feutrine et braise) et la reprise d'une partie sur un autre appareil, par lien ou par QR - tous décrits au § 3. Cette dernière était listée « synchronisation multi-appareils » : la synchronisation continue demanderait un serveur, donc une refonte ; le transfert d'un instantané couvre le cas réel sans rien ajouter d'infrastructure. Plus de piste ouverte.
MIT - voir LICENSE.
| Zone de tap plein écran, total, teinte immersive, a11y |
| Micro-store réactif | src/store/createStore.ts | Plomberie commune à tous les états globaux (useSyncExternalStore) |
| Réglages | src/settings/settingsStore.ts, SettingsDrawer.tsx | Préfs locales, groupées : affichage, lancer, accessibilité, données |
| Choix des dés | src/react/components/{DicePicker,DiceControls}.tsx | Pastille « 2 × D20 » de l'écran principal : type et nombre de dés |
| Reprise des anciennes clés | src/settings/legacyMigration.ts | Extrait locale et theme du blob historique vers les clés du socle |
| Statistiques | src/stats/rollStats.ts | Distribution des faces du lancer libre, réinitialisable |
| Journal des lancers | src/log/rollLog.ts | Historique local borné, exportable en CSV ; rien ne sort de l'appareil |
| Traductions | src/i18n/messages.ts, useI18n.ts | Six langues, clés typées, mécanique createI18n du socle |
| Liens famille | src/links.ts, src/react/components/FamilyLinks.tsx | URL à partager (locale) ; source et soutien dès le PREMIER écran |
| Jeu Yahtzee | src/games/yahtzee/{scoring,engine}.ts | Score des 13 cases + machine d'état pure (pass-and-play) |
| Jeu 421 | src/games/dice421/{scoring,engine}.ts | Classement des mains + manches à jetons (charge/décharge) |
| Jeu Cochon (Pig) | src/games/pig/engine.ts | Stop-ou-encore à un dé : cumul du tour, perte sur le 1, banque |
| Aiguillage écrans | src/app/appMode.ts | Lancer libre / Yahtzee / 421 / Cochon / notation / décider |
| Reprise ailleurs | src/games/transfer.ts | La partie en cours dans une URL : encodage, compression, validation |
| PWA | vite.config.ts, src/main.tsx | Manifest, service worker, base path GH Pages |
| Observabilité | src/main.tsx | Sentry dès l'ouverture, sans consentement : rapports d'erreur |
| Mesure d'audience | src/react/App.tsx, useUndoableGame.ts | PostHog après accord (ConsentBanner) : vues de page, parties |
| Thème | src/styles/tokens.css, src/react/hooks/useTheme.ts | Trois palettes x clair/sombre et le pont --dwc-* lu par le socle |
| Palette | src/settings/palette.ts | Le second axe du thème : choix, persistance, barre système |
layout="list"groupBy="category"dwc_family_groupssrc/links.ts, les liens source et soutien du catalogue du socle
(repoUrl, SPONSOR_URL) ; le partage et le signalement viennent des
modules share et issue-report du socle.issues/new?template=bug.yml) prérempli avec la version, le commit,
l'écran et le navigateur : l'utilisateur n'a plus qu'à décrire ce qui ne va
pas. L'URL est recalculée au clic (currentIssueReportUrl), jamais figée
au chargement.vite-plugin-pwaregisterType: 'prompt'CompressionStreamsrc/audio/sounds.test.ts - silence garanti quand l'API WebAudio manque.src/decide/decisions.test.ts - pièce, oui/non, tirage, mélange.src/react/ThemeProvider.test.tsx - thème auto/clair/sombre, pas de flash.src/settings/palette.test.ts - palette relue au démarrage, valeur inconnue écartée.src/styles/tokens.test.ts - contrastes recalculés depuis tokens.css, et les
trois copies de la table des fonds (CSS, TS, script de pré-peinture) tenues ensemble.src/react/AppUpdatesProvider.test.tsx - bandeau de mise à jour, dans la bonne langue.src/react/a11y.test.tsx - axe-core sur les écrans clés (hors contraste : jsdom ne
calcule pas la mise en page).src/react/App.test.tsx - un seul h1 sur l'écran de lancer, qui dit ce qu'est l'app.src/readme.test.ts - ce document ne cite aucun fichier de src/ disparu.e2e/smoke.spec.ts - fumée Playwright (lancer, menu des jeux, partie de Cochon,
statut du Yahtzee jamais rogné).e2e/a11y.spec.ts - axe-core dans un VRAI navigateur : là, le contraste est
réellement évalué (WCAG 2.0/2.1 A + AA).e2e/a11y-palettes.spec.ts - le même contrôle pour chacune des trois palettes, en
clair et en sombre, sur quatre écrans (lancer, choix des dés, réglages, Yahtzee).e2e/entree.spec.ts - l'écran d'entrée, vérifié là où il casse : rien à effet de
bord ne doit se monter derrière la porte.