feat(web): page vitrine publique à la racine (#41) #57

Merged
kyuno merged 1 commit from feat/landing-page into main 2026-09-06 05:06:19 +02:00
Owner

Corrige l'issue #41. Un visiteur déconnecté sur / voit désormais une vraie page de présentation avant qu'on lui demande de se connecter, au lieu d'être renvoyé directement vers /login.

Routage — une seule ligne de changement

RequireAuth.tsx devient sensible au chemin : dans sa branche !user, pathname === "/" rend <LandingPage /> ; toutes les autres routes protégées redirigent vers /login exactement comme avant. Aucun changement de la table de routes (App.tsx inchangé) — / reste <PlanningPage> niché sous RequireAuth+AppLayout. AppLayout (donc la sidebar) ne monte jamais pour la vitrine ; une fois connecté, / retombe sur children (le planning) sans changement. Documenté dans le JSDoc de RequireAuth et dans specs/frontend-architecture.md.

Page

pages/landing/LandingPage.tsx + landing-page.scss, sur les tokens de _theme.scss, responsive (@media 640/860px), zéro nouvelle dépendance ni asset externe :

  1. Hero — accroche + illustration SVG dessinée à la main (traits 2px, currentColor, même langage que lucide-react) + deux CTA (/signup, /login).
  2. Fonctionnalités — grille de 4 cartes (icône lucide + titre + texte), basées sur les capacités réelles du README (planning hebdo, import multi-sources, allergies/régimes/ingrédients détestés, foyer partagé).
  3. Aperçu — 3 captures d'écran réelles, servies statiquement depuis public/landing/ (un fichier manquant retombe sur son alt, ne casse pas le build). À produire par un humain avec l'app lancée sur des données réelles — impossible à générer proprement en headless sans backend ; instructions dans public/landing/README.md. Même esprit que l'étape « projet natif » de la phase 2 de #39.
  4. CTA final.

Copie entièrement sous le namespace i18n landing.* (le contenu des étapes reste du texte, pas de maquette).

Bonus (demandé dans le ticket)

index.html gagne un favicon SVG (monogramme « bC », couleur primaire) et un <meta name="description"> — / est maintenant une page publique partageable.

Tests

cypress/e2e/landing.feature (5 scénarios) : vitrine visible déconnecté sur / (titre + CTA vers /signup et /login), clic « Se connecter » → /login, clic « Créer un compte » → /signup, /recettes déconnecté redirige toujours vers /login, visiteur connecté sur / voit bien le planning et pas la vitrine. smoke.cy.ts mis à jour pour tester la redirection depuis /recettes (puisque / ne redirige plus).

Vérifié en local : pnpm build + pnpm lint verts ; Cypress landing / smoke / auth.feature / layout / planning-page / sidebar = 39/39 sur deux runs (start-server-and-test, même harnais que le job e2e).

Closes #41

🤖 Generated with Claude Code

Corrige l'[issue #41](https://git.dev.kyuno.fr/kyuno/batchCooking/issues/41). Un visiteur déconnecté sur `/` voit désormais une vraie page de présentation avant qu'on lui demande de se connecter, au lieu d'être renvoyé directement vers `/login`. ## Routage — une seule ligne de changement `RequireAuth.tsx` devient sensible au chemin : dans sa branche `!user`, `pathname === "/"` rend `<LandingPage />` ; **toutes les autres routes protégées redirigent vers `/login` exactement comme avant**. Aucun changement de la table de routes (`App.tsx` inchangé) — `/` reste `<PlanningPage>` niché sous `RequireAuth`+`AppLayout`. `AppLayout` (donc la sidebar) ne monte jamais pour la vitrine ; une fois connecté, `/` retombe sur `children` (le planning) sans changement. Documenté dans le JSDoc de `RequireAuth` et dans `specs/frontend-architecture.md`. ## Page `pages/landing/LandingPage.tsx` + `landing-page.scss`, sur les tokens de `_theme.scss`, responsive (`@media` 640/860px), **zéro nouvelle dépendance ni asset externe** : 1. **Hero** — accroche + illustration SVG dessinée à la main (traits 2px, `currentColor`, même langage que `lucide-react`) + deux CTA (`/signup`, `/login`). 2. **Fonctionnalités** — grille de 4 cartes (icône lucide + titre + texte), basées sur les capacités réelles du README (planning hebdo, import multi-sources, allergies/régimes/ingrédients détestés, foyer partagé). 3. **Aperçu** — 3 captures d'écran réelles, servies statiquement depuis `public/landing/` (un fichier manquant retombe sur son `alt`, ne casse pas le build). **À produire par un humain** avec l'app lancée sur des données réelles — impossible à générer proprement en headless sans backend ; instructions dans `public/landing/README.md`. Même esprit que l'étape « projet natif » de la phase 2 de #39. 4. **CTA final**. Copie entièrement sous le namespace i18n `landing.*` (le contenu des étapes reste du texte, pas de maquette). ## Bonus (demandé dans le ticket) `index.html` gagne un favicon SVG (monogramme « bC », couleur primaire) et un `<meta name="description">` — `/` est maintenant une page publique partageable. ## Tests `cypress/e2e/landing.feature` (5 scénarios) : vitrine visible déconnecté sur `/` (titre + CTA vers `/signup` et `/login`), clic « Se connecter » → `/login`, clic « Créer un compte » → `/signup`, `/recettes` déconnecté redirige toujours vers `/login`, visiteur connecté sur `/` voit bien le planning et **pas** la vitrine. `smoke.cy.ts` mis à jour pour tester la redirection depuis `/recettes` (puisque `/` ne redirige plus). **Vérifié en local** : `pnpm build` + `pnpm lint` verts ; Cypress `landing` / `smoke` / `auth.feature` / `layout` / `planning-page` / `sidebar` = **39/39** sur deux runs (`start-server-and-test`, même harnais que le job `e2e`). Closes #41 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 04:51:17 +02:00
feat(web): page vitrine publique à la racine (#41)
All checks were successful
CI / lint (push) Successful in 2m1s
CI / build (push) Successful in 2m16s
CI / intent-service-test (push) Successful in 3m47s
CI / e2e (push) Successful in 7m45s
CI / test (push) Successful in 14m48s
da7b077098
Un visiteur déconnecté sur `/` voit désormais une vraie page de
présentation avant qu'on lui demande de se connecter, au lieu d'être
renvoyé directement vers `/login`.

- `RequireAuth.tsx` devient sensible au chemin : dans sa branche `!user`,
  `pathname === "/"` rend `<LandingPage />` ; toutes les autres routes
  protégées redirigent vers `/login` exactement comme avant. Aucun
  changement de la table de routes — `/` reste `<PlanningPage>` niché sous
  `RequireAuth`+`AppLayout`, et `AppLayout` (donc la sidebar) ne monte
  jamais pour la vitrine.
- `pages/landing/LandingPage.tsx` + `landing-page.scss` : hero (accroche +
  illustration SVG dessinée à la main dans le langage de `lucide-react`,
  zéro dépendance ni asset externe) + deux CTA, grille de 4
  fonctionnalités (icônes lucide), section « aperçu », CTA final. Copie
  entièrement sous le namespace i18n `landing.*`.
- `index.html` : favicon SVG (monogramme « bC ») + `<meta description>` —
  `/` est maintenant une page publique partageable.
- Les 3 captures d'écran réelles de la section « aperçu » sont servies
  statiquement depuis `public/landing/` (un fichier manquant retombe sur
  son `alt`, ne casse pas le build) ; elles restent à produire par un
  humain avec l'app lancée sur des données réelles — cf.
  `public/landing/README.md`.
- Tests Cypress `landing.feature` : vitrine visible déconnecté sur `/`,
  CTA vers `/login` et `/signup`, autre route protégée toujours redirigée,
  visiteur connecté voit bien le planning. `smoke.cy.ts` mis à jour pour
  tester la redirection depuis `/recettes` (puisque `/` ne redirige plus).

Closes #41
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit 9174f80282 into main 2026-09-06 05:06:19 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#57
No description provided.