Maquettes de la refonte de l'éditeur, posées sur l'inventaire complet de ce que les quatre surfaces d'écriture savent déjà faire en bêta 0.60.0. Rien n'est retiré : tout ce qui existe est replacé, et ce qui est replacé rend des pixels au champ de saisie.
23 septembre 2026 — ces maquettes ne font plus foi. La spec de l'éditeur (v0.3, relue deux fois contre le code) les remplace et les corrige sur plusieurs points : les citations sont en BBCode dans le champ par défaut (les cartes sont opt-in) ; le titre et la sous-catégorie d'un sujet, les destinataires et le sujet d'un MP quittent la colonne pour un panneau d'en-tête ; le lot R3 sort de la phase ; deux lots préalables (R0a, R0b) s'ajoutent. Les rendus Roborazzi montrent la cible à jour.
Le contrat de la refonte : chaque ligne ci-dessous doit se retrouver dans les
maquettes. Relevé dans le code de 0.60.0 — :core:ui/editor,
:feature:editor, :feature:messages, QuickReplySheet.
[quotemsg] matérialisé à l'envoi, jamais dans le champSur un S9 en 360 × 740 dp, clavier ouvert, il reste 330 dp de fenêtre. Le chrome actuel en mange 202. Voici ce que le testeur voit.
Tout est empilé en colonne : bandeau, titre, barre d'outils, cartes, aperçu, puis le champ, puis la barre d'envoi.
Le budget borné a sauvé la barre d'envoi et les 160 dp du champ. Mais trois lignes de texte, c'est le retour terrain d'antiseptiqueIncolore sur S9.
Répartition de la fenêtre utile (330 dp) quand le clavier est ouvert, aujourd'hui contre la proposition.
Le principe produit vient de styx42 sur le topic DEV : les bords du champ restent visibles et le texte défile dedans. Ces trois règles en sont la conséquence de mise en page.
Une app bar de 48 dp en haut (retour, titre, contexte), une barre d'action de 56 dp en bas. Entre les deux, le champ prend tout, jamais moins de 160 dp.
Le titre d'écran et le sujet cité montent dans l'app bar, sur deux lignes : c'est le seul endroit qui ne bouge plus jamais.
Portrait Compact. Sous 400 dp de hauteur de fenêtre — paysage téléphone — l'app bar s'efface avec son titre ; la barre d'action reste et accueille 👁 en sixième icône, le retour passe par le geste système. Sans cette clause le chrome fixe vaudrait 136 dp sur les ~150 disponibles, et la règle serait fausse.
La barre d'action porte cinq actions permanentes en icônes : format, smileys, image, options, envoyer. Les chips BBCode vivent dans un tiroir déplié par Aa, replié à la frappe suivante.
Le tiroir est superposé au bas du champ, pas inséré dans la colonne : sinon son ouverture et son repli feraient sauter le texte à chaque aller-retour. Rien n'est perdu — les dix chips (neuf actions plus Couleur ; Image a rejoint le menu 🖼) sont à un tap.
Contrepartie à tenir : le champ réserve la hauteur du tiroir comme marge basse de défilement, sinon un caret dans les dernières lignes se retrouve recouvert et l'insertion se fait hors de vue — ce que le critère C5 interdit.
Citations armées, brouillon retrouvé, upload, erreur : une bande de contexte de 32 dp au-dessus de la barre d'action. L'état durable à gauche en pastilles, l'événement du moment à droite, réduit à un résumé d'une ligne avec un accès au détail.
Elle est absente quand elle n'a rien à dire, et elle n'apparaît ni ne disparaît sur une frappe. Deux conséquences, l'une sur le dessin, l'autre sur le code : l'autosave reste silencieuse, sinon 32 dp surgiraient sous le caret une seconde après la première lettre ; et une erreur cesse de s'effacer au premier caractère tapé — elle attend « Masquer », le prochain envoi, ou la fermeture de l'éditeur. Aujourd'hui elle part toute seule, et la bande se replierait sous le doigt.
Les citations deviennent un panneau qui remplace le champ au lieu de le comprimer. L'aperçu, lui, reste à côté du source — en dessous en portrait, à droite en paysage — parce que comparer les deux est tout son intérêt.
Douze écrans, quatorze états, rendus avec le schéma de couleurs réel de l'app et les libellés
français réels des strings.xml.
Le contexte du sujet est dans l'app bar. Le champ démarre plein écran, curseur posé.
TooltipBox) : une première dans l'app, sur une API encore expérimentale — mais 32 fichiers du projet utilisent déjà des API M3 expérimentales.Clavier ouvert, même écran : sept lignes au lieu de trois. La bande se réduit au compteur de citations.
navigationBars ∪ ime.Les dix chips — neuf actions plus Couleur — à un tap sur Aa. Le tiroir se superpose au bas du champ et se replie à la frappe suivante.
Les cartes prennent l'écran au lieu de le grignoter : on réordonne, on coupe, on revient. Ouvre la porte à l'interleaving.
Le source reste à l'écran, l'aperçu s'ouvre dessous. L'écran montre l'état après le cran, clavier fermé.
La largeur devient la ressource à partager ; la hauteur, elle, reste comptée (note 13) : sur un paysage téléphone, l'app bar s'efface. Même partage sur tablette et en écran scindé large, où l'app bar reste.
windowWidthSizeClass au-delà de Compact, ou hauteur utile sous 400 dp. Une seule mise en page, deux directions de flex. Sans app bar, 👁 passe dans la barre d'action, qui a toute la largeur pour une sixième icône ; le retour passe par le geste système.Les deux onglets actuels, plus les sections que les testeurs réclament. La décoration de cellule reste un réglage.
Les trois bascules HFR et les 16 tons, à l'identique. Le ton se choisit sans déplier une seconde fois.
msg_icon. Seul le repli par défaut du ton disparaît — la grille tient dans la feuille.Tout ce qui était un bandeau empilé en tête vit ici : état durable à gauche, événement du moment à droite. Un seul événement à la fois, par priorité erreur → upload. Le brouillon retrouvé est une pastille, pas un événement. Hauteur constante dans tous les cas.
État seul — 32 dp. Les pastilles portent leur libellé complet.
État + événement — toujours 32 dp. Les pastilles se réduisent à leur compteur nu et restent visibles.
Erreur — toujours 32 dp. Un résumé court, le texte entier derrière « Détails ».
Titre et sous-catégorie sont des champs d'en-tête collants : ils restent atteignables sans jamais chasser le corps (critère C7).
Destinataires en puces plutôt qu'en CSV brut, avec le même contrat : plusieurs pseudos = conversation de groupe.
La même barre d'action, la même barre de format : la réponse rapide devient l'éditeur en mode feuille, pas une surface parallèle amputée.
Le geste qui a occupé tout #447. Avec BTF2, le menu contextuel devient un point d'entrée produit.
ContextWrapper qui neutralise le TextClassifier — à vérifier sur device avant de le promettre.Le contrôle de non-perte : une ligne par fonction existante, sa place dans la refonte, et l'écran qui la montre.
| Fonction en 0.60.0 | Dans la refonte | Écran | État |
|---|---|---|---|
| Champ BBCode borné 160 dp | Champ élastique, plancher 160 dp conservé | 1, 2 | conservé |
| Label « Contenu BBCode » | Label « Message », court à fontScale 1.3 | 1 | corrigé #872 |
| Titre d'écran, 28 dp | Ligne 1 de l'app bar, + le sujet en ligne 2 | 1 | déplacé |
| 11 chips BBCode (dont Couleur) | Tiroir Aa, 10 chips en deux rangées — Image passe dans le menu 🖼 | 3 | déplacé |
| Bouton « Uploader » épinglé | Icône 🖼 permanente de la barre d'action | 1, 8 | déplacé |
| Dialogue « Insérer une image » | Second choix du menu 🖼 (upload / URL) | — | conservé |
| Compteur « Envoi n/N… » | Événement de la bande + fine barre de progression | 8 | déplacé |
| 7 erreurs d'upload typées | Résumé d'une ligne + « Détails » ; ne s'efface plus à la frappe | 8 · § 06 | reformulé |
| 9 erreurs d'envoi typées | Résumé d'une ligne + « Détails » ; ne s'efface plus à la frappe | 8 · § 06 | reformulé |
| Bandeau brouillon Restaurer/Ignorer | Pastille de la bande, mêmes deux actions | 8 | déplacé |
| Cartes de citation ↑ ↓ ✕ | Panneau plein écran + pastille dans la bande | 1, 4 | déplacé |
| « Tout vider » (≥ 2 cartes) | Action d'app bar du panneau citations | 4 | conservé |
| Aperçu Afficher / Masquer | Icône 👁 d'app bar → partage source / rendu, dessous en portrait, à droite en paysage | 5, 5b | enrichi |
| Feuille Smileys Standard / Wiki | Identique (Favoris / Récents : #1154, hors phase) | 6 | conservé |
| Décoration de cellule (#989) | Reste un réglage, inchangé | 6 | conservé |
| 3 bascules d'options HFR | Feuille Options, identique | 7 | conservé |
| Ton du message, 16 icônes | Grille dépliée dans la feuille Options | 7 | déplié |
| Envoi armé → « Confirmer » | Identique, secondaires masqués | 1 | conservé |
| Titre du sujet + sous-catégorie | En-tête collant, replié en une ligne pendant la frappe | 9 | déplacé |
| Note sondage non éditable | Pastille durable, mode « Modifier le premier message » seulement | — | déplacé |
| Destinataires CSV | Puces, même POST | 10 | reformulé |
| Compteur de sujet MP | Suffixe du champ Sujet | 10 | conservé |
| « Destinataires : N · Gérer » | Identique en réponse de conversation | 10 | conservé |
| Feuille de réponse rapide | Même éditeur en mode feuille, + format et smileys | 11 | unifié #951 |
| Bouton plein écran de la feuille | ⤢, conserve le texte et les citations (pas la sélection) | 11 | conservé |
| « Insertion de la citation… » | Bande de contexte de la feuille | 11 | déplacé |
| Confirmation « Publier la réponse ? » | Envoi armé, comme les autres surfaces | 11 | unifié |
| Poignées de sélection + autoscroll | BTF2, inchangé | 3, 12 | conservé |
| Autofocus, capitalisation phrase | Inchangé | toutes | conservé |
| Autosave et purge des brouillons | Inchangé et silencieux : aucune pastille | — | conservé |
Une bande d'une seule ligne laisse environ 204 dp au message, soit ≈ 34 caractères à fontScale 1 et ≈ 22 au pire cas (1,3 système × 1,15 du préréglage de lecture L de l'app, qui se multiplient). Cible : 30 caractères, une ligne, ellipse. Les textes actuels doivent donc être réécrits en résumés, avec le texte intégral derrière « Détails ». Une troncature automatique couperait le remède.
| Cause | Résumé dans la bande | Détail |
|---|---|---|
| Message vide | Message vide | — |
| Hash invalide | Formulaire rechargé, réessayez | oui |
| Anti-flood | Anti-flood HFR, patientez | oui — la règle des 3 par 10 min |
| Sujet fermé | Sujet fermé, envoi impossible | — |
| Connexion requise | Connexion requise | oui — l'onglet Messages |
| Réponse inattendue | Réponse inattendue, réessayez | oui |
| Réseau | Erreur réseau, réessayez | — |
| Session expirée | Session expirée, reconnectez-vous | — |
| Sous-catégorie absente | Sujet à actualiser avant envoi | oui |
| Aucune image reçue | Aucune image reçue | oui — explorateur, redémarrage |
| Image trop lourde | Image trop volumineuse | oui |
| Type refusé | Format d'image refusé | oui |
| Refus serveur | Refus de %1$s (HTTP %2$d) | oui |
| Réponse illisible | Réponse illisible de %1$s | oui |
| Hébergeur non configuré | Hébergeur non configuré | oui — Client-ID, Réglages |
| Upload interrompu | Upload interrompu, réessayez | oui |
| Citation non récupérée | Citation non récupérée | oui — le bouton Citer |
Deux boutons ne tiennent pas dans les 204 dp. La surface de détail porte elle-même le « Masquer ». Évolution naturelle : quand le remède est une navigation — Se connecter, Réglages, Actualiser — l'emplacement porte le remède au lieu de « Détails ».
:core:ui porte les 7 d'upload, :feature:editor 9 d'envoi,
:feature:topic 8 copies mot pour mot plus une qui lui est propre, et :feature:messages 8 avec une
rédaction différente pour la même cause — plus un état que les autres n'ont pas,
l'avertissement « votre message a peut-être été envoyé ».
Une bande partagée a besoin d'une seule paire (résumé, détail) par cause. R1a pose le type
dans :core:ui et y migre le jeu de l'éditeur ; MP suit en R1b, la feuille en R4.
Ce qui est décidé, dans quel ordre on le livre, et ce qui reste ouvert. Trois avis se sont croisés sur ce cadrage ; les désaccords sont notés là où ils portent.
Cinq icônes, pour rendre la largeur à « Envoyer ». Le nom accessible TalkBack reprend les libellés, et un appui long les affiche en info-bulle, dès R1a.
32 dp, jamais plus, absente quand elle n'a rien à dire. L'autosave reste silencieuse pour qu'elle n'apparaisse jamais en pleine frappe, et elle ne disparaît pas davantage sur une frappe : une erreur attend un geste. Les erreurs passent par un résumé.
Pas de réglage. Ouvrir l'aperçu ne touche pas au clavier ; le séparateur s'arrête quand le champ atteint 160 dp, au-delà le glissement devient élastique et une puce « Relâcher pour fermer le clavier » apparaît sur l'aperçu. La résistance est l'affordance — un libellé permanent ne tient physiquement pas dans 18 dp à fontScale 1,3.
Sous 400 dp de hauteur, l'app bar s'efface avec son titre ; 👁 rejoint la barre d'action, le retour passe par le geste système. Sinon le chrome fixe vaudrait 136 dp sur les ~150 d'un paysage téléphone.
Un lot = une PR = une build dev = un retour des testeurs avant le suivant. Promotion en bêta seulement à la fin de la phase, pas lot par lot : entre deux lots, le critère C9 est explicitement dérogé et annoncé, pas prétendu tenu.
| Lot | Contenu | Écrans | Précondition |
|---|---|---|---|
| R1a | Composants partagés dans :core:ui — app bar, bande, barre d'action en icônes, tiroir superposé — appliqués à l'éditeur de post seul. Type (résumé, détail) posé et jeu de l'éditeur migré. | 1-3, 8 | — |
| R1b | Nouveau sujet, nouveau MP, réponse MP. Migration des jeux de messages restants. Clôture de C9. | 9, 10 | géométrie R1a validée sur device |
| R2 | Panneau citations (réordonner, interleaving) et partage de l'aperçu avec son cran. | 4, 5, 5b | parse d'aperçu hors main thread ; mécanisme d'insertion au curseur défini |
| R3 | Menu de sélection : citer la portion sélectionnée. | 12 | — |
| R4 | Unification de la réponse rapide : même éditeur en mode feuille, même confirmation, format et smileys. | 11 | géométrie du tiroir en fenêtre Dialog tranchée |
La réponse rapide est une autre implémentation : champ BTF1 et non
BbcodeTextField, ViewModel distinct, brouillon appliqué d'office au lieu de la
bannière, confirmation par dialogue au lieu du bouton armé, et surtout une fenêtre Dialog
avec ses propres insets empilés. L'inclure dans R1, c'est faire R4 dans le premier lot.
Le contre-argument — deux façons de répondre incohérentes dans la vue Topic — ne tient pas : la feuille est opt-in depuis #951, l'éditeur plein écran est le défaut, et elle est déjà visuellement étrangère faute de barre de format et de smileys.
R2 est bloqué par une régression latente : l'aperçu re-parse tout le BBCode à chaque caractère, sur le thread principal. Tolérable pour un aperçu qu'on ouvre rarement, intenable en partage permanent. Debounce et parse hors main d'abord.
R4 a deux problèmes non résolus : dans la feuille, titre, cartes, champ, bande, barre et tiroir demandent ~420 dp sur les 330 disponibles — soit le tiroir y est superposé, soit la feuille devient plein écran, c'est-à-dire l'éditeur. Et « Insertion de la citation… » s'y termine de façon asynchrone pendant que la frappe est autorisée : la bande s'y viderait en pleine saisie, ce que la règle 3 interdit ailleurs.
Un validateur d'équilibre de balises BBCode : la V3 en montrait un dans la bande, il n'existe pas. Retiré des maquettes, fiché à part hors de cette phase. #1444