From 28267909ff318408ef1984a921dde6b72fbae830 Mon Sep 17 00:00:00 2001 From: tristan Date: Tue, 26 May 2026 08:49:51 +0200 Subject: [PATCH] docs : story Histoire Modal (#MUI-36) Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 1 + COMPONENTS.md | 52 ++++++++++++++++++++++++ app/story/modal/modal.story.vue | 70 +++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 app/story/modal/modal.story.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index 50620d0..a5e9180 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ Liste des évolutions de la librairie Malio layer UI * [#MUI-34] Revoir le système de playground * [#MUI-33] Développer le composant Datepicker * [#MUI-33] Création du composant DateTime (date + heure, sélecteur d'heure natif intérimaire) +* [#MUI-36] Création d'un composant modal (dialogue centré, focus-trap, scroll-lock, footer fixe) ### Changed * [#MUI-35] Refonte du composant drawer : slots `#header`/`#footer`, prop `side` (droite/gauche), `dismissable`, `closeOnEscape`, classes d'override, focus-trap, scroll-lock et fermeture au clavier. **Breaking** : la prop `title` est remplacée par le slot `#header`. diff --git a/COMPONENTS.md b/COMPONENTS.md index 5a03fbb..15bf628 100644 --- a/COMPONENTS.md +++ b/COMPONENTS.md @@ -779,6 +779,58 @@ Panneau latéral (drawer) qui s'ouvre depuis la droite ou la gauche avec backdro --- +## MalioModal + +Boîte de dialogue modale centrée avec backdrop semi-transparent. Gère l'accessibilité (focus-trap, restitution du focus, `Échap`), le verrouillage du scroll de la page et un empilement correct de plusieurs modals. Structure : header fixe, body scrollable (`max-h-[85vh]`), footer fixe. + +| Prop | Type | Défaut | Description | +|------|------|--------|-------------| +| `id` | `string` | auto | Identifiant HTML | +| `modelValue` | `boolean` | `undefined` | État ouvert/fermé (v-model) | +| `showClose` | `boolean` | `true` | Afficher le bouton de fermeture (croix) | +| `dismissable` | `boolean` | `true` | Fermer au clic sur le backdrop | +| `closeOnEscape` | `boolean` | `true` | Fermer avec la touche `Échap` | +| `ariaLabel` | `string` | `''` | Nom accessible de secours quand le slot `#header` est absent | +| `modalClass` | `string` | `''` | Classes CSS panneau, ex. largeur `max-w-lg` (twMerge) | +| `overlayClass` | `string` | `''` | Classes CSS backdrop (twMerge) | +| `headerClass` | `string` | `''` | Classes CSS barre header (twMerge) | +| `bodyClass` | `string` | `''` | Classes CSS zone scrollable (twMerge) | +| `footerClass` | `string` | `''` | Classes CSS footer fixe (twMerge) | + +**Events :** `update:modelValue(value: boolean)`, `close()` + +**Slots :** +- `header` — en-tête (titre, etc.). S'il est absent et que `showClose` est `true`, seule la croix est affichée. +- `default` — contenu (zone scrollable). +- `footer` — actions (boutons). Rendu en bas, fixe, séparé par une bordure. N'apparaît que si le slot est fourni. + +```vue + + +

Contenu de la modal

+
+ + + + + + + + + + + +

Fermeture via la croix uniquement

+
+``` + +--- + ## MalioDataTable Tableau de données presentational avec pagination, filtres par slots et lignes cliquables. diff --git a/app/story/modal/modal.story.vue b/app/story/modal/modal.story.vue new file mode 100644 index 0000000..c79f0df --- /dev/null +++ b/app/story/modal/modal.story.vue @@ -0,0 +1,70 @@ + + +