Forme DS

Composants

Modal & Dialog

Un adaptateur de compatibilité react-aria : le trio ModalOverlay > Modal > Dialog remappé sur le Dialog natif d'Astryx. ModalOverlay porte l'ouverture ; Modal et Dialog sont des wrappers transparents — l'API est préservée pour un simple échange d'import.

import { ModalOverlay, Modal, Dialog, Button } from "@forme-ch/ui/controls";

const [open, setOpen] = useState(false);

<Button label="Ouvrir la modale" variant="primary" onClick={() => setOpen(true)} />
<ModalOverlay isOpen={open} onOpenChange={setOpen}>
  <Modal>
    <Dialog aria-label="Confirmation de suppression">
      <h3>Supprimer la facture ?</h3>
      …
      <Button label="Supprimer" variant="destructive" onClick={() => setOpen(false)} />
    </Dialog>
  </Modal>
</ModalOverlay>

Modale d'information

Une modale simple avec une action de confirmation ; isDismissable autorise la fermeture au clic sur le fond.

<ModalOverlay isOpen={open} onOpenChange={setOpen} isDismissable>
  <Modal>
    <Dialog aria-label="Synchronisation terminée">
      <h3>Synchronisation terminée</h3>
      …
      <Button label="Compris" variant="primary" onClick={() => setOpen(false)} />
    </Dialog>
  </Modal>
</ModalOverlay>

Props — ModalOverlay

Porte l'ouverture (mappé sur le Dialog Astryx).

PropTypeDéfautDescription
isOpen boolean true État d'ouverture — porte l'ouverture de la modale.
onOpenChange (isOpen: boolean) => void — Notifie l'ouverture / fermeture (à brancher sur ton useState).
isDismissable boolean — Typée sur ModalOverlay (compat react-aria).
children ReactNode — Généralement un <Modal>.
className string — Classe CSS additionnelle.
style CSSProperties — Styles inline.

Props — Dialog

Wrapper transparent qui propage les attributs aria / role. Modal n'accepte que children, className et style.

PropTypeDéfautDescription
children ReactNode — Contenu de la boîte de dialogue.
aria-label string — Nom accessible du dialogue (ou utilise aria-labelledby).
aria-labelledby string — id de l'élément qui titre le dialogue.
aria-busy boolean — État occupé propagé sur le wrapper.
role string — Rôle ARIA (propagé tel quel).
className string — Classe CSS additionnelle.
style CSSProperties — Styles inline.

Accessibilité

Nomme toujours le dialogue : aria-label sur Dialog, ou aria-labelledby pointant vers son titre. La modale piège le focus, se ferme sur Échap et rend le focus au déclencheur. Réserve la modale aux décisions courtes et bloquantes ; pour un contenu riche à consulter en contexte, préfère SlideOver.

Do & Don't

✓ À faire

Brancher onOpenChange sur ton état. Nommer le Dialog. L'utiliser pour confirmer une action risquée.

✕ À éviter

Empiler des modales. Y loger un long formulaire (préférer SlideOver). Oublier le nom accessible du dialogue.