Fenêtre modale

Dialogue modal avec overlay, fermeture Échap, piège de focus et restauration du focus sur l’élément déclencheur.

Taille par défaut (medium)

Sans modificateur de largeur, la boîte suit la largeur standard du design system.

<button type="button" class="bj-btn" data-bj-modal-open="id">Ouvrir</button>
<div class="bj-modal" id="id" role="dialog" aria-modal="true" aria-labelledby="id-t">
  <div class="bj-modal__overlay" data-bj-modal-close tabindex="-1"></div>
  <div class="bj-modal__dialog">
    <header class="bj-modal__header">
      <h2 class="bj-modal__title" id="id-t">Titre</h2>
      <button type="button" class="bj-modal__close" data-bj-modal-close aria-label="Fermer">
        <i class="ri-close-line" aria-hidden="true"></i>
      </button>
    </header>
    <div class="bj-modal__body">…</div>
    <footer class="bj-modal__footer">…</footer>
  </div>
</div>
<div class="bj-modal" id="id" role="dialog" aria-modal="true" aria-labelledby="id-t">…</div>

Petite (sm)

Idéal pour les confirmations courtes ou les messages légers.

<div class="bj-modal bj-modal--sm" id="ex-sm" role="dialog" aria-modal="true" aria-labelledby="ex-sm-t">…</div>

Grande (lg)

Pour formulaires ou tableaux plus larges dans le corps du dialogue.

<div class="bj-modal bj-modal--lg" id="ex-lg" role="dialog" aria-modal="true" aria-labelledby="ex-lg-t">…</div>

Plein écran (full)

Occupe presque toute la hauteur utile (visionneuse, assistant, contenu dense).

<div class="bj-modal bj-modal--full" id="ex-full" role="dialog" aria-modal="true" aria-labelledby="ex-full-t">…</div>

Attributs et état ouvert

data-bj-modal-open / data-bj-modal-close ; bj-modal-open sur le body. Le script DSBJ ouvre la modale en posant data-bj-expanded sur le conteneur bj-modal; le style affiche alors la boîte ( bj-modal--openedéquivaut à un état ouvert sans JS).

Classes CSS

Classe / attributDescription
bj-modalConteneur plein écran ; masqué par défaut, visible avec data-bj-expanded ou bj-modal--opened.
data-bj-expandedÉtat ouvert : posé par le script sur le conteneur bj-modal. Sans JS, bj-modal--opened joue le même rôle pour l’affichage.
bj-modal__overlayFond cliquable pour fermer (souvent avec data-bj-modal-close).
bj-modal__dialogBoîte de dialogue (largeur max selon la taille).
bj-modal__headerEn-tête optionnel (titre + fermeture).
bj-modal__titleTitre de la modale ; cible de aria-labelledby.
bj-modal__closeBouton de fermeture (icône seule ; aria-label requis).
bj-modal__bodyZone de contenu principale.
bj-modal__footerPied optionnel (actions).
bj-modal--sm / bj-modal--lg / bj-modal--fullLargeurs : petite, grande, plein écran.
data-bj-modal-openSur le bouton d’ouverture : valeur = id de la modale.
data-bj-modal-closeSur un contrôle qui ferme : overlay, bouton, liens du pied.

React (BjModal)

Le paquet @flrxnt/dsbj/react exporte BjModal : états open et onClose, title, size, footer, closeLabel pour le libellé accessible du bouton fermer (icône seule), avec les mêmes comportements que le script HTML (piège de focus, restauration du focus, role="dialog", aria-modal="true", aria-labelledby="id-title").

import { useState } from 'react'
import { BjModal } from '@flrxnt/dsbj/react'

export function Example() {
  const [open, setOpen] = useState(false)

  return (
    <>
      <button type="button" onClick={() => setOpen(true)}>Ouvrir</button>
      <BjModal
        open={open}
        onClose={() => setOpen(false)}
        title="Confirmation"
        closeLabel="Fermer"
      >
        <p>Contenu de la modale.</p>
      </BjModal>
    </>
  )
}

Accessibilité

Le conteneur doit exposer role="dialog", aria-modal="true" et aria-labelledby vers l’identifiant du titre de la modale, afin d’associer un nom accessible au dialogue.

Avec le script DSBJ ou les composants BjModal Vue/React, le focus est piégé dans la modale ouverte : Tab et Maj+Tab parcourent uniquement les éléments focalisables à l’intérieur du dialogue, sans retourner à la page de fond. À la fermeture, le focus est restauré sur l’élément qui a ouvert la modale (sélecteur data-bj-modal-open en HTML pur).

La touche Échap ferme la modale lorsque le comportement clavier est actif. Pour le bouton de fermeture à icône seule, fournissez un libellé accessible (aria-label en HTML) ; les composants Vue et React exposent la prop closeLabel pour l’internationalisation.

Raccourcis clavier

  • Tab : élément focalisable suivant dans la modale.
  • Maj+Tab : élément focalisable précédent ; le cycle reste dans le dialogue.
  • Échap : fermeture (script DSBJ ou composants).