From c2bda75885d16b63e6d09f92d6486239cb7e66c3 Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Wed, 12 Aug 2026 14:23:39 +0200 Subject: [PATCH] =?UTF-8?q?Maquette=20:=20Article=20et=20=C3=89v=C3=A9neme?= =?UTF-8?q?nt=20en=20paysage=20sur=20la=20borne=20(K3,=20K7,=20K8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une seule passe de design pour les deux écrans. Les trancher séparément donnerait deux grammaires différentes sur la même dalle, alors qu'ils posent la même question : ces écrans sont dessinés pour un téléphone tenu debout, une borne fait 1280 px de large et se lit à un mètre. Six règles communes, chacune corrigeant un idiome de téléphone qui devient faux sur une dalle large et fixe : deux colonnes (un ancrage fixe, un flux qui défile), texte plafonné à ~65 caractères, héros à 26 % au lieu de 52 %, plus de showModalBottomSheet (il y a la place à côté), carte affichée à sa taille utile sans « Agrandir », et accents dérivés de configuration.primaryColor — précédent K4, tablet-app n'a pas de flavor. Quatre décisions prises le 12/08 : - Fond clair, aux valeurs réelles de l'app (kBackgroundColor #FFFFFF, kBackgroundLight #F3F3F3), pour que la section ne dénote pas. - Pas de sélecteur de langue : elle est choisie en amont. - Hors dates, aucune prose : le programme reste, sans pastille EN COURS, et les dates du héros disent qu'on est avant ou après. - Retour automatique après 5 min : adopté mais sorti du périmètre, K8. Trois états incomplets, tous possibles en configuration. La règle qui les couvre : le rail média n'existe que s'il a quelque chose à ancrer. - Sans audio : le dock tombe, l'image reprend la hauteur. - Sans photo : le rail tombe — une colonne de 38 % avec un seul lecteur serait un trou. L'audio passe en tête de la colonne de lecture. - Texte seul : une colonne centrée, toujours plafonnée. Le vide latéral est voulu, c'est lui qui garde le texte lisible. Quatre vérifications faites dans le code plutôt que supposées : - Les statistiques sont déjà acquises. section_page_detail émet sectionView et sectionLeave avec durée et enveloppe les treize types : l'article sera compté dès que son case entre dans le switch. - tablet-app n'a aucun i18n — pas de l10n/, pas d'AppLocalizations, libellés français en dur. C'est ce qui interdit un bandeau « Édition passée » et impose d'exprimer l'état hors dates par des dates. - audioIds est une List : « sans audio » est un état de la langue courante, pas de l'article. Un article peut avoir sa version française et pas sa néerlandaise. - isContentTop existe déjà et dit si le texte passe avant le média. En paysage il ne veut plus dire « au-dessus » mais « à gauche » : à câbler, sinon un réglage déjà offert dans manager-app reste sans effet. Retiré de la maquette : un repère « 3 / 8 » en pied d'article, inventé pour occuper la place libérée par le sélecteur de langue. SectionPageDetail ne reçoit qu'une section et un booléen isFromMenu, jamais la liste de ses voisines — le repère n'était adossé à aucune donnée. K8 ajouté au plan et au kanban : le retour à l'accueil s'écrit une seule fois dans section_page_detail. Bénéfice de bord, il passe par le même dispose et émet donc un sectionLeave avec sa durée réelle au lieu de laisser une consultation ouverte jusqu'au visiteur suivant. Source de vérité dans le repo, artifact pour la diffusion (convention DB0). Co-Authored-By: Claude Opus 5 --- .../kiosk-paysage-article-event.html | 22 +++++++++++-------- v1-plan.md | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/claude design/kiosk-paysage-article-event.html b/claude design/kiosk-paysage-article-event.html index 4e9c960..e0b8a69 100644 --- a/claude design/kiosk-paysage-article-event.html +++ b/claude design/kiosk-paysage-article-event.html @@ -683,9 +683,9 @@

Sans audio

- Le dock disparaît, l'image reprend la hauteur libérée. Aucune autre reprise — - c'est le cas le plus simple des trois. - audioIds vide pour la langue courante + Le dock disparaît, l'image reprend la hauteur libérée. Pas de lecteur grisé, pas de + repli sur une autre langue — le lecteur n'existe pas pour ce visiteur. + pas d'entrée audioIds pour la langue choisie

@@ -771,15 +771,19 @@

audioIds est une List<TranslationDTO>, pas un id. L'audio est donc par langue : un article peut avoir sa version française et pas sa - néerlandaise. « Sans audio » n'est pas un état de l'article, c'est un état de - l'article dans la langue courante — et la borne doit basculer sur la variante - du milieu pour ce visiteur-là seulement. + néerlandaise. La règle est donc stricte — pas d'entrée pour la langue choisie, pas de + lecteur du tout. Ni lecteur grisé, ni repli sur une autre langue : un visiteur + néerlandophone à qui la borne servirait l'audio français serait plus mal servi que par le + silence. « Sans audio » est un état du visiteur, pas de l'article.

isContentTop existe déjà et dit si le texte passe avant le média. - En portrait, « avant » veut dire au-dessus. En paysage, il n'y a plus de dessus : le drapeau - devient l'ordre des deux colonnes — média à gauche, ou texte à gauche. À câbler, pas à ignorer, - sinon un réglage déjà offert dans manager-app devient sans effet sur la borne. + En portrait, « avant » veut dire au-dessus ; en paysage il n'y a plus de dessus, donc + le drapeau devient le côté : + isContentTop == truetexte à gauche, rail média à droite ; + sinon la disposition par défaut des maquettes, média à gauche. Le rail garde sa composition + dans les deux cas — image, vignettes, audio docké — il change de bord, pas de contenu. À + câbler, sinon un réglage déjà offert dans manager-app reste sans effet sur la borne.

diff --git a/v1-plan.md b/v1-plan.md index be826aa..49a76b9 100644 --- a/v1-plan.md +++ b/v1-plan.md @@ -284,7 +284,7 @@ Ordre du §2 de STATUS.md, corrigé par **L12**. | ~~**K4**~~ ✅ **2026-08-12** | **Écran Game repris de mymuseum.** Les 6 fichiers de `Screens/Sections/Game/` sont dans `tablet-app/lib/Screens/Game/`, contexte adapté ; `lib/Screens/Puzzle/` supprimé ; `main_view` bascule sur `SectionType.Game` / `GameDTO` / `GamePage`. **Gains** : le puzzle glissant (mélange par mouvements valides, donc toujours soluble), le bouton d'indice, et un dimensionnement qui respecte le ratio de l'image — 508 lignes contre 237 à l'ancien `puzzle_view`.
⚠️ **Une décision de rendu à valider à l'œil** : mymuseum code ses couleurs **en dur par flavor client** (`kMainColor0/1/2` — rouge MDLF, bleu Fort). `tablet-app` n'a pas de flavor : un seul APK sert tous les clients et la charte vient de la configuration choisie au pincode. Recopier ces constantes aurait affiché du bleu chez MDLF. Le dégradé et le bouton d'indice sont donc **dérivés de `configuration.primaryColor`** (même parsing que `audio_player`/`loading_common`, repli `kTestSecondColor`, 3 nuances par `Color.lerp`). Plus juste sur le fond, mais **le rendu diffère de la version mobile** : si le dégradé dessiné à la main est préféré, figer les trois couleurs | | ~~K4 — énoncé d'origine~~ | **`SectionPuzzle` → `SectionGame` + le type glissant.** Le serveur a renommé et porte `GameTypes { Puzzle, SlidingPuzzle }` ; `tablet-app` a encore un écran `Puzzle/` qui ne connaît que l'ancien. **Reprendre le code de `mymuseum-visitapp/lib/Screens/Sections/Game/`** — `game_page.dart` et `sliding_puzzle_piece.dart` existent déjà là-bas, et cette version est **moins buguée** que celle de tablet-app | Récupération, pas réécriture | | ~~**K5**~~ ✅ **2026-08-12** | **Les trois flavors de `mymuseum-visitapp` construisent** (`dev`, `mdlf`, `fortsaintheribert`), exit 0, APK à l'appui. **D0 est débloqué.**
⛔ **L'énoncé était faux : il n'y avait pas de « même rattrapage » à faire.** Sa config Android était **déjà à niveau** — Gradle 8.11.1, AGP 8.9.0, `-Xmx4096M`, `enableJetifier=false`, aucun forçage d'`androidx.lifecycle`. Les dix crans de K1 ont amené **`tablet-app` jusqu'à `mymuseum`** ; le lot supposait la symétrie du problème, elle n'existait pas. Le réflexe du diff annoncé en K1 a donné la réponse en deux `cat`.
**Ce qui restait, et qui est fait** : les deux avertissements du build. NDK **27.0.12077973 → 28.2.13676358** (`speech_to_text` le réclame nommément) et Kotlin **2.1.0 → 2.3.10** (seuil 2.2.20 annoncé comme rupture ; c'est la version de `tablet-app`, donc un alignement). Six builds — trois avant, trois après. APK de **382 à 349 Mo**.
⚠️ **Un cran de plus existe, délibérément non pris** : Kotlin réglé, Flutter réclame Gradle 8.14.0 et AGP 8.11.1. C'est du **terrain neuf pour les deux repos** (`tablet-app` est à 8.11.1/8.9.1, mêmes avertissements latents) — le faire ici seul **désaligne** les deux apps. À faire d'un bloc sur les deux, ou pas du tout : c'est la dette d'outillage déjà parquée en V2 | Son code était déjà porté sur le nouveau contrat — **c'est ce qui aurait dû mettre la puce à l'oreille** : le repo qui a servi de modèle au portage K2 n'avait pas de raison d'être en retard d'outillage sur celui qui le copiait | -| **K7** | **`SectionArticle` sur le kiosk — ajouté le 2026-08-12**, en recomptant les types couverts. Son `case` est commenté « TODO » dans `main_view.getContent` et `Screens/Article/article_view.dart` fait 1 Ko : un article rend « Ce type n'est pas supporté ». **Contrairement à `SectionEvent` et `SectionParcours`, ce type existait dans Mongo** — c'est donc un vrai retard, pas un type né avec Postgres v3, et il sortira de la migration avec du contenu réel.
**Le code est une reprise de `mymuseum-visitapp/lib/Screens/Sections/Article/`**, pas une conception. **Le travail n'est pas là** : il est dans le **passage en paysage**. Les écrans de mymuseum sont pensés pour un téléphone tenu debout ; une borne est large, et un article rendu en colonne unique sur 1280 px de large est illisible. C'est le seul endroit du lot K où il y a une décision de mise en page à prendre, pas une copie à faire.
✅ **Maquette faite et validée le 2026-08-12** — `DOCS/claude design/kiosk-paysage-article-event.html`, une seule passe pour K3 et K7. Six règles communes (deux colonnes ancrage/flux, texte à 65 caractères, héros à 26 % au lieu de 52 %, plus de `showModalBottomSheet`, carte sans « Agrandir », accents dérivés de `configuration.primaryColor` selon le précédent K4) et quatre décisions tranchées : **fond clair** aux valeurs réelles de l'app (`kBackgroundColor` / `kBackgroundLight`), **pas de sélecteur de langue** (choisie en amont), **hors dates : aucune prose**, et le **retour automatique** sorti du périmètre (ligne suivante).
⚠️ **Deux vérifications faites dans le code plutôt que supposées.** Les **statistiques sont déjà acquises** : `section_page_detail.dart:60/72` émet `sectionView` et `sectionLeave` avec durée, et il enveloppe les treize types — l'article sera compté dès que son `case` entre dans le `switch`, sans une ligne à écrire. Et **`tablet-app` n'a aucun i18n** : pas de `l10n/`, pas d'`AppLocalizations`, libellés français en dur. C'est ce qui interdit un bandeau « Édition passée » — il serait français pour un visiteur néerlandophone — et c'est pourquoi l'état hors dates s'exprime par les **dates**, numériques donc sans traduction | **À traiter avec K3** : `SectionEvent` pose exactement la même question de paysage (héros, programme, carte), et la trancher deux fois donnerait deux mises en page différentes sur la même borne. Une seule passe de design pour les deux, même raisonnement d'économie que **L5** et **L15**.
**Trois états incomplets couverts par la maquette** : sans audio (le dock tombe, l'image reprend la hauteur), sans photo (le rail tombe, l'audio passe en tête de la colonne de lecture), texte seul (une colonne centrée, toujours plafonnée). ⚠️ **`audioIds` est une `List`** : « sans audio » est un état **de la langue courante**, pas de l'article. Et **`isContentTop` existe déjà** — en paysage il ne veut plus dire « au-dessus » mais « à gauche », à câbler sous peine de rendre sans effet un réglage déjà offert dans `manager-app` | +| **K7** | **`SectionArticle` sur le kiosk — ajouté le 2026-08-12**, en recomptant les types couverts. Son `case` est commenté « TODO » dans `main_view.getContent` et `Screens/Article/article_view.dart` fait 1 Ko : un article rend « Ce type n'est pas supporté ». **Contrairement à `SectionEvent` et `SectionParcours`, ce type existait dans Mongo** — c'est donc un vrai retard, pas un type né avec Postgres v3, et il sortira de la migration avec du contenu réel.
**Le code est une reprise de `mymuseum-visitapp/lib/Screens/Sections/Article/`**, pas une conception. **Le travail n'est pas là** : il est dans le **passage en paysage**. Les écrans de mymuseum sont pensés pour un téléphone tenu debout ; une borne est large, et un article rendu en colonne unique sur 1280 px de large est illisible. C'est le seul endroit du lot K où il y a une décision de mise en page à prendre, pas une copie à faire.
✅ **Maquette faite et validée le 2026-08-12** — `DOCS/claude design/kiosk-paysage-article-event.html`, une seule passe pour K3 et K7. Six règles communes (deux colonnes ancrage/flux, texte à 65 caractères, héros à 26 % au lieu de 52 %, plus de `showModalBottomSheet`, carte sans « Agrandir », accents dérivés de `configuration.primaryColor` selon le précédent K4) et quatre décisions tranchées : **fond clair** aux valeurs réelles de l'app (`kBackgroundColor` / `kBackgroundLight`), **pas de sélecteur de langue** (choisie en amont), **hors dates : aucune prose**, et le **retour automatique** sorti du périmètre (ligne suivante).
⚠️ **Deux vérifications faites dans le code plutôt que supposées.** Les **statistiques sont déjà acquises** : `section_page_detail.dart:60/72` émet `sectionView` et `sectionLeave` avec durée, et il enveloppe les treize types — l'article sera compté dès que son `case` entre dans le `switch`, sans une ligne à écrire. Et **`tablet-app` n'a aucun i18n** : pas de `l10n/`, pas d'`AppLocalizations`, libellés français en dur. C'est ce qui interdit un bandeau « Édition passée » — il serait français pour un visiteur néerlandophone — et c'est pourquoi l'état hors dates s'exprime par les **dates**, numériques donc sans traduction | **À traiter avec K3** : `SectionEvent` pose exactement la même question de paysage (héros, programme, carte), et la trancher deux fois donnerait deux mises en page différentes sur la même borne. Une seule passe de design pour les deux, même raisonnement d'économie que **L5** et **L15**.
**Trois états incomplets couverts par la maquette** : sans audio (le dock tombe, l'image reprend la hauteur), sans photo (le rail tombe, l'audio passe en tête de la colonne de lecture), texte seul (une colonne centrée, toujours plafonnée). ⚠️ **`audioIds` est une `List`** : « sans audio » est un état **du visiteur**, pas de l'article. Règle actée le 2026-08-12 — **pas d'entrée pour la langue choisie, pas de lecteur du tout** : ni lecteur grisé, ni repli sur une autre langue. Et **`isContentTop` existe déjà** ; en paysage il n'y a plus de « dessus », donc **le drapeau devient le côté** : `isContentTop == true` → texte à gauche et rail média à droite, sinon média à gauche. Le rail change de bord, pas de contenu. À câbler sous peine de rendre sans effet un réglage déjà offert dans `manager-app` | | **K8** | **Retour automatique à l'accueil après inactivité — ajouté le 2026-08-12**, sorti de la maquette K3/K7. Un visiteur part sans fermer l'écran ; le suivant trouve l'article du précédent. Délai proposé : **5 minutes**.
**À écrire une seule fois pour les treize types**, dans `section_page_detail` — il enveloppe déjà toutes les sections et porte déjà les crochets `initState`/`dispose`. Bénéfice de bord : le retour passant par le même `dispose`, il émet un `sectionLeave` **avec sa durée réelle** au lieu de laisser une consultation ouverte jusqu'au prochain visiteur. **La statistique devient juste, en plus de l'écran** | Ce n'est ni K3 ni K7 : c'est un comportement de borne qui vaut pour tous les types. À ne pas glisser dans le port des deux écrans, sinon il sera écrit deux fois puis une troisième | | **K6** | **Publier les APK à jour**, puis vérifier le renouvellement du parc | **L19**. Les tablettes kiosk sont des appareils que tu gères — mise à jour maîtrisée. **Les téléphones des visiteurs, non** : aucune manœuvre technique ne force une mise à jour, d'où la stratégie de coexistence du lot I |