FormLayout
ImplementedMulti-step wizard layout — vertical step rail (240 px, left) + step content panel (right) + optional footer CTA slot. Owns no <form>, no fields, no validation, no data: the route fills each step via children and drives navigation via steps/currentStepId/onStepChange. Bilingual rail heading via locale (default fr); step labels stay caller-localized. Dormant organism (no consumer yet).
components/organisms/formlayout/FormLayout.tsxSquelette multi-étapes — rail latéral d'étapes et panneau de contenu, avec slot footer pour les CTA (démo : parcours d'achat en 4 étapes). FR-CA : « Étapes · Vos billets · Coordonnées · Paiement · Confirmation ».
FormLayout
Organism
Disposition deux colonnes : rail vertical d'étapes à gauche (240 px) avec coche pour les étapes complétées, contenu principal à droite. L'étape courante est marquée par aria-current="step".
Coordonnées de l'acheteur
Les billets seront envoyés à cette adresse courriel.
This component supports light and dark mode.
Props
steps*FormStep[]Étapes du parcours.
currentStepId*stringÉtape active.
onStepChange(id) => voidNavigation latérale (clic sur une étape).
children*React.ReactNodeContenu de l'étape.
footerReact.ReactNodePied de page (boutons Suivant / Précédent).
locale"fr" | "en"Bascule le heading du rail : « Étapes » (fr, défaut) / "Steps" (en). Labels caller-localisés.
classNamestringClasses CSS additionnelles sur la racine <section>.
Props
FormLayout
stepsFormStep[]—Ordered wizard steps for the left rail; each is { id, label, description? }. Array order is visual order; ids must be unique.
currentStepIdstring—id of the active step. The rail item gets aria-current="step" + teal tint; steps before it show the completed check.
onStepChange(id: string) => void—Rail item click handler. Omit for a read-only progress rail (buttons render but do nothing).
childrenReact.ReactNode—Content of the active step, rendered inside the right panel card.
footerReact.ReactNode—Footer slot at the bottom of the content panel (CTA row, e.g. Précédent/Continuer Button atoms); right-aligned above a top border.
locale"fr" | "en"'fr'Switches the section/rail heading: « Étapes » (fr) / "Steps" (en). Step labels and descriptions are caller-localized.
classNamestring—Additional CSS classes appended to the root <section> (spacing/width overrides).
<FormLayout />Accessibility
ARIA
1 ruleKeyboard
1 rulei18n
1 ruleUsage
Import
import { FormLayout } from "@epasslive/design-system"Example 1
<FormLayout steps={[{ id: "tickets", label: "Vos billets" }, { id: "info", label: "Coordonnées", description: "Acheteur et destinataire" }, { id: "pay", label: "Paiement" }]} currentStepId="info" onStepChange={setStep} footer={<Button variant="primary">Continuer</Button>}>{stepContent}</FormLayout>Example 2
<FormLayout steps={steps} currentStepId="pay" locale="en">{paymentForm}</FormLayout>Anti-patterns
— Do not fetch data directly in organisms
— Avoid tight coupling to specific data sources
— Do not pass title/sections/onSubmit — legacy scaffold API that was never implemented here