COMPOSANTS

Modals

Modal de base (dialog DaisyUI)

Utiliser l'élément natif <dialog> via DaisyUI. L'ouverture se fait via showModal(). Le clic sur le backdrop ferme automatiquement le modal.

<button class="btn btn-primary btn-sm" onclick="document.getElementById('demo-modal').showModal()">
  Ouvrir le modal
</button>

<dialog id="demo-modal" class="modal">
  <div class="modal-box">
    <h3 class="font-accent font-bold text-lg text-mc-navy">Titre du modal</h3>
    <p class="py-4 text-sm text-base-content/70">Contenu du modal. Confirmez-vous cette action ?</p>
    <div class="modal-action">
      <form method="dialog">
        <button class="btn btn-ghost">Annuler</button>
      </form>
      <button class="btn btn-primary">Confirmer</button>
    </div>
  </div>
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
</dialog>

Modal de confirmation destructive

Obligatoire pour toute action irréversible. Toujours nommer l'objet dans le titre. Le bouton de confirmation porte le label de l'action, jamais "Oui" ou "Confirmer".

<button class="btn btn-error btn-sm" onclick="document.getElementById('demo-modal-delete').showModal()">
  Supprimer
</button>

<dialog id="demo-modal-delete" class="modal">
  <div class="modal-box">
    <h3 class="font-accent font-bold text-lg text-mc-navy">Supprimer CMD-0241 ?</h3>
    <p class="py-4 text-sm text-base-content/70">
      Cette action est irréversible. La commande et tous ses articles seront définitivement supprimés.
    </p>
    <div class="modal-action">
      <form method="dialog">
        <button class="btn btn-ghost">Annuler</button>
      </form>
      <button class="btn btn-error">Supprimer la commande</button>
    </div>
  </div>
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
</dialog>

Modal avec formulaire

Pour les formulaires courts (2 à 4 champs). Au-delà, préférer une page dédiée. Utiliser fieldset.fieldset avec legend.fieldset-legend pour les labels.

<button class="btn btn-primary btn-sm" onclick="document.getElementById('demo-modal-form').showModal()">
  Ajouter un article
</button>

<dialog id="demo-modal-form" class="modal">
  <div class="modal-box">
    <h3 class="font-accent font-bold text-lg text-mc-navy mb-4">Ajouter un article</h3>
    <fieldset class="fieldset mb-3">
      <legend class="fieldset-legend">Référence produit</legend>
      <input type="text" class="input w-full" placeholder="ex. STTU755">
    </fieldset>
    <fieldset class="fieldset mb-3">
      <legend class="fieldset-legend">Quantité</legend>
      <input type="number" class="input w-full" placeholder="0">
    </fieldset>
    <div class="modal-action">
      <form method="dialog">
        <button class="btn btn-ghost">Annuler</button>
      </form>
      <button class="btn btn-primary">Ajouter l'article</button>
    </div>
  </div>
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
</dialog>

Ouverture via JS

Pour ouvrir ou fermer un modal depuis un controller Stimulus, un événement custom, ou un callback asynchrone.

// Ouvrir
document.getElementById('modal-id').showModal();

// Fermer
document.getElementById('modal-id').close();

Règles

Toujours nommer l'objet dans le titre ("Supprimer CMD-0241", pas "Confirmer")
Bouton destructif : btn-error, toujours à droite
Annuler : btn-ghost, toujours à gauche
Inclure modal-backdrop pour fermer au clic extérieur
Jamais window.confirm() ou alert() — toujours un modal <dialog>
Jamais "Oui / Non" comme libellés — toujours une action explicite