[UI mobile] Socle : nav, popovers et dialogs mobile-natifs #91
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Résumé
Ticket fondation du chantier "UI mobile & tablette" — dont dépendent tous
les autres tickets ci-dessous. Introduit les quelques composants
vraiment repensés pour mobile (pas juste du CSS resserré sur le DOM
desktop) là où l'audit du chantier a trouvé de vrais problèmes structurels,
plus les breakpoints nommés qui servent de source unique à tout le reste.
Ce chantier en entier (index)
Ce ticket est le socle technique ; les 8 autres, tous
planned, couvrentle reste du périmètre identifié :
Contexte
L'app mobile (Capacitor, Android) partage 100% de son code avec le site
web — mêmes routes, mêmes composants, même DOM. Un premier passage
responsive existe (#55) mais s'arrête à la coquille de
AppLayout(sidebar → barre horizontale scrollable sous 640px). Un audit du code (fait
pour ce chantier, pas deviné) trouve que :
.scsssur 28 ont ne serait-ce qu'une règle@media; 20n'en ont aucune.
selon la plateforme ou la largeur — chaque adaptation existante est du
CSS pur sur un DOM identique (
main.tsxne branche que le routeur et lestockage du token ;
useAppUpdateCheckne branche qu'un effet de bord,jamais du rendu). "Séparer le mobile du web" est donc un pattern
entièrement nouveau à introduire ici, pas l'extension d'un existant.
<dialog>générique n'ont aucune gestion dédiée à un petit écran au-delàd'un ajustement de marge.
Décision d'architecture (tranchée avec l'utilisateur)
Une seule app/build (pas de
apps/mobileséparé) — jugé disproportionnévu qu'aucune infra de partage (package de hooks/services dédié) n'existe
aujourd'hui pour l'amortir, et vu qu'aucun problème mobile trouvé par
l'audit n'est un problème de logique, seulement de présentation. Les
hooks/services/formulaires/logique métier/client API/i18n restent 100%
partagés sans aucun doublon ; seuls les quelques composants listés
ci-dessous gagnent une variante mobile réelle.
Contenu attendu
useIsMobileViewport()(apps/web/src/hooks/oulib/) — un seulpoint de vérité pour "faut-il rendre la variante mobile", basé sur
window.matchMedia, pas un check ponctuel par composant. Zéro précédentdans le repo aujourd'hui (vérifié : aucun
matchMedia/useMediaQuerynulle part) — ce hook devient la référence pour tous les tickets
suivants qui ont besoin de brancher du JSX (pas juste du CSS) selon la
largeur.
apps/web/src/styles/_theme.scss(
--breakpoint-phone: 640px,--breakpoint-tablet: 1024px) remplaçantles nombres magiques dispersés aujourd'hui (640/860/1024 répétés en dur
dans
AppLayout.scss,landing-page.scss,recipes.scss,recipe-picker-dialog.scss,planning-page.scss,dialog.scss,tours-page.scss) — source unique, réutilisée par le hook ci-dessus, parchaque
@mediaexistant (à migrer versvar(--breakpoint-*)dans ceticket) et par les tests Cypress de #83.
AppLayout: nouvelle nav mobile en barre d'onglets basse (bottomtab bar) sous le breakpoint phone, à la place de l'actuelle barre
horizontale scrollable. Paramètres et compte y deviennent des feuilles
(voir primitif ci-dessous) plutôt que des popovers flottants ancrés —
mêmes items de nav (
NAV_ITEMS/SETTINGS_ITEMS), même logique derouting, juste une présentation différente sous ce breakpoint.
le bas, fermeture par swipe/tap-outside) réutilisable dans
apps/web/src/components/ui/— utilisé par la nav ci-dessus et par #87pour les popovers flottants existants.
components/ui/dialog.scss: vrai plein-écran (bord à bord, sansborder-radius, sans marge) sous le breakpoint phone, pas juste lamarge réduite actuelle (
max-width: calc(100vw - var(--space-md))) —bénéficie à
RecipePickerDialoget tout<dialog>futur sanschangement par appelant.
Dépendances
Aucune — c'est le point de départ du chantier. #83–#90 en dépendent tous
(directement ou via le hook/primitif/breakpoints introduits ici).