From 0fd4928efc0022611239aef487625dfc8abe8c82 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Mon, 7 Sep 2026 12:03:43 +0200 Subject: [PATCH 1/3] feat(layout): socle UI mobile - nav, feuille et dialogs plein ecran Fondation du chantier UI mobile & tablette (#91) : jusqu'ici, toute adaptation mobile de ce repo etait du CSS pur sur le meme DOM (aucun composant ne branchait son JSX selon la largeur/plateforme). Ce ticket introduit le premier vrai branchement, et les primitifs que les 8 tickets suivants du chantier reutiliseront. - useIsMobileViewport() (apps/web/src/lib/) : point de verite unique, base sur matchMedia, live (reagit a un resize/une rotation). - _breakpoints.scss : $phone/$tablet Sass + mixins phone/phone-up/ tablet-down, remplacant les nombres magiques 640/1024 repetes en dur dans 6 fichiers (AppLayout, landing, recipes, recipe-picker-dialog, planning-page, dialog, tours-page). Les deux occurrences de 860px (landing hero, tours-page) sont deliberement laissees telles quelles - un collapse de grille 2 colonnes qui n'a rien a voir avec le breakpoint tablette du catalogue recettes, les unifier aurait change un comportement visuel reel sans raison. - useNativeDialogBehavior : mecanique (showModal/close event/clic exterieur) extraite de Dialog.tsx, partagee avec le nouveau BottomSheet.tsx (feuille mobile plein-largeur, meme fondation natif que Dialog, juste ancree en bas). - AppLayout : sur telephone, la sidebar n'est plus reflow-ee en CSS en barre horizontale (l'ancien traitement) - elle est remplacee par une vraie barre d'onglets basse (Planning/Recettes/Liste de courses + Plus), le "Plus" ouvrant une BottomSheet combinant Parametres et Compte (deux dropdowns flottants separes cote desktop -> un seul point d'entree mobile, IA plus simple, un seul emplacement d'onglet). - dialog.scss : vrai plein-ecran (bord a bord, sans arrondi) sous le breakpoint phone au lieu d'une marge simplement reduite. Verifie en local : pnpm --filter web exec tsc -b --force, biome check, pnpm --filter web build, suite Cypress e2e complete (140/140) et composants (63/63) - y compris layout.cy.ts, reecrit pour tester la nouvelle barre basse (l'ancien test de la barre horizontale n'a plus de sens, ce traitement n'existe plus). Closes #91 Co-Authored-By: Claude Sonnet 5 --- apps/web/cypress/e2e/layout.cy.ts | 82 +++-- apps/web/src/components/ui/BottomSheet.tsx | 65 ++++ apps/web/src/components/ui/Dialog.tsx | 62 +--- apps/web/src/components/ui/bottom-sheet.scss | 76 +++++ apps/web/src/components/ui/dialog.scss | 22 +- .../components/ui/useNativeDialogBehavior.ts | 69 ++++ .../planning/recipe-picker-dialog.scss | 4 +- apps/web/src/features/recipes/recipes.scss | 4 +- apps/web/src/layouts/AppLayout.scss | 300 ++++++++++-------- apps/web/src/layouts/AppLayout.tsx | 293 ++++++++++++----- apps/web/src/layouts/nav-icons.tsx | 5 + apps/web/src/lib/useIsMobileViewport.ts | 59 ++++ apps/web/src/locales/fr/translation.json | 3 +- .../web/src/pages/admin/tours/tours-page.scss | 7 +- apps/web/src/pages/landing/landing-page.scss | 13 +- .../web/src/pages/planning/planning-page.scss | 4 +- apps/web/src/styles/_breakpoints.scss | 49 +++ 17 files changed, 829 insertions(+), 288 deletions(-) create mode 100644 apps/web/src/components/ui/BottomSheet.tsx create mode 100644 apps/web/src/components/ui/bottom-sheet.scss create mode 100644 apps/web/src/components/ui/useNativeDialogBehavior.ts create mode 100644 apps/web/src/lib/useIsMobileViewport.ts create mode 100644 apps/web/src/styles/_breakpoints.scss diff --git a/apps/web/cypress/e2e/layout.cy.ts b/apps/web/cypress/e2e/layout.cy.ts index 4369ea5..65f6589 100644 --- a/apps/web/cypress/e2e/layout.cy.ts +++ b/apps/web/cypress/e2e/layout.cy.ts @@ -172,44 +172,78 @@ describe("Page width — full-bleed pages vs. centered reading columns (#21 regr } }); -describe("Responsive breakpoint — sidebar becomes a horizontal top bar under 640px", () => { +describe("Responsive breakpoint — the sidebar becomes a bottom tab bar under 640px", () => { + // Regression coverage for the mobile/tablet UI chantier's foundation + // ticket: below this point the desktop `