feat(ui) : required cohérent + astérisque label + sanitisation email (MUI-41) #60

Merged
tristan merged 51 commits from feature/MUI-41-props-required-asterisque-dans-le-label-sur-les-co into develop 2026-06-04 06:42:20 +00:00

51 Commits

Author SHA1 Message Date
tristan e6d99d02c3 docs : COMPONENTS.md — reserveMessageSpace, readonly Select/SelectCheckbox/Upload, props TabList
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:39:43 +02:00
tristan 003fe54ee0 fix(ui) : TabList — flèches reprennent les couleurs du bouton primary (hover/disabled)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:28:29 +02:00
tristan 1a52582eda feat(ui) : TabList — prop maxWidth (défaut 1100) pour le bloc d'onglets fenêtré
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:26:34 +02:00
tristan 912a370444 docs(playground) : TabList — exemple 3 onglets + maxVisibleTabs (fenêtrage inactif)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:20:47 +02:00
tristan cb60b2c79d fix(ui) : TabList — bordure continue pleine largeur (hors bloc 1200)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:18:12 +02:00
tristan f23ae7261b fix(ui) : TabList — container onglets max-w 1200
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:16:09 +02:00
tristan 8695d8daa0 fix(ui) : TabList — container onglets max-w 1020, flèches à 36px de ce bloc
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 08:12:38 +02:00
tristan 9ba9497305 fix(ui) : TabList — flèches fixes à 54px des bords (px-54)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 18:07:25 +02:00
tristan b6297fbe56 fix(ui) : TabList — flèches fixes à 36px des bords (px-36)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 18:03:00 +02:00
tristan 28d5ae1dec fix(ui) : TabList — flèches fixes aux extrémités (justify-between)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 18:01:07 +02:00
tristan f97cb44870 fix(ui) : TabList — gap 36px flèches/onglets + centrage vertical
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:57:47 +02:00
tristan 80132375b7 fix(ui) : TabList — flèches intégrées dans la barre (bordure englobante, 36px des onglets)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:55:25 +02:00
tristan 4687006fa3 docs(playground) : exemple TabList fenêtré (7 onglets, maxVisibleTabs=5)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:35:22 +02:00
tristan 884cad9c98 fix(ui) : TabList — roving tabindex + aria panels + layout non-fenêtré (review)
- focusedKey assure exactement un tab focalisable quand l'actif est hors fenêtre
- aria-labelledby conditionnel + fallback aria-label pour panneaux dont le bouton n'est pas rendu
- DOM non-fenêtré identique à l'origine (plus de wrapper flex parasite)
- reset de la fenêtre (startIndex) au remplacement des tabs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:34:06 +02:00
tristan df2b8badc8 feat(ui) : TabList — fenêtrage maxVisibleTabs + flèches navigation
Ajout d'une prop maxVisibleTabs activant un fenêtrage carousel (sans
animation) avec flèches gauche/droite. Les flèches sont désactivées aux
bornes, les panneaux hors fenêtre restent montés, et startIndex est
clampé si tabs/maxVisibleTabs changent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:30:13 +02:00
tristan 41a3df7481 fix(ui) : checkbox internes de SelectCheckbox sans espace message réservé
Les options du dropdown (et le « tout sélectionner ») passaient reserveMessageSpace
par défaut → chaque ligne réservait un min-h-[1rem] inutile, d'où le gros espacement.
On force :reserve-message-space=false sur ces Checkbox internes.
Retire aussi la carte de démo playground hors-sujet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:07:42 +02:00
tristan bf4d62a23f docs(playground) : exemple reserveMessageSpace sur SelectCheckbox
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 17:03:57 +02:00
tristan 1b5a4c9920 feat(ui) : prop reserveMessageSpace (défaut true) sur Select/SelectCheckbox/Checkbox/date/time
Ajoute reserveMessageSpace (défaut true) pour permettre de ne pas réserver
la ligne de message d'aide quand aucun message n'est présent. Comportement
inchangé par défaut. La famille date hérite via $attrs → CalendarField.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:53:22 +02:00
tristan cda0f994ca feat(ui) : prop reserveMessageSpace (défaut true) sur la famille input
Ajoute une prop booléenne reserveMessageSpace (défaut true) aux 10 composants
de la famille input. Par défaut, comportement inchangé (ligne message toujours
rendue avec min-h-[1rem]). À false, la ligne ne prend aucun espace en l'absence
de message, et s'affiche sans min-h quand un message est présent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:43:31 +02:00
tristan 5f1dc834cd fix(ui) : pt-1 sur InputTextArea pour aligner son haut avec les inputs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:31:50 +02:00
tristan de504d8ba0 docs(playground) : retire empty-option-label du SelectCheckbox readonly vide
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:28:44 +02:00
tristan 59004c9635 docs(playground) : badges (display-tag) sur SelectCheckbox readonly
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:26:10 +02:00
tristan 801925c443 fix(ui) : SelectCheckbox tolère modelValue absent (défaut []) — corrige crash SSR readonly
Le composant accédait à props.modelValue.length sans garde alors que modelValue
était requis ; un usage non bindé (ex. page playground readonly) plantait le rendu SSR.
modelValue devient optionnel avec défaut [].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:24:19 +02:00
tristan cec528eac6 docs(playground) : exemples readonly Select/SelectCheckbox (+ page DIVERS)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:18:04 +02:00
tristan 358ba246d7 fix(ui) : aria-readonly suit isReadonly sur Select/SelectCheckbox (disabled prime)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:15:38 +02:00
tristan 621077f555 feat(ui) : état readonly visuel sur Select et SelectCheckbox
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 16:11:13 +02:00
tristan f5163f10f1 fix(playground) : retire prop icon-name fantôme sur InputTextArea (pas d'icône)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:57:36 +02:00
tristan 734c7aba2f docs(playground) : page DIVERS regroupant tous les champs readonly
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:56:08 +02:00
tristan bdca9490ee test(ui) : couvre icône/label readonly vide sur la famille champs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:49:56 +02:00
tristan 5b9b771174 docs(playground) : exemples readonly
Ajout de deux blocs readonly (vide + rempli) sur chaque page playground
concernée : InputText, InputEmail, InputAmount, InputAutocomplete,
InputPassword, InputTextArea, InputPhone, InputUpload, Date, TimePicker.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:39:30 +02:00
tristan 993364062d fix(ui) : garde readonly défensive isOpen + test readonly TimePicker
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:35:41 +02:00
tristan 12a165c1c1 feat(ui) : état readonly visuel sur pickers date/heure
Bordure noire forcée (même vide), suppression du bleu focus/primary, label
et icône en text-black si rempli sinon text-m-muted, float piloté par isFilled
uniquement en readonly. Bouton clear et astérisque inchangés.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:30:45 +02:00
tristan f8c0bf13d5 feat(ui) : InputPhone readonly suit les règles readonly (plus de look disabled)
Découple readonly de disabled : le champ affiche border-black + curseur default,
l'icône suit text-black/text-m-muted selon isFilled, et le bouton "add" conserve
son guard onAdd sans porter l'apparence désactivée (opacity-40/cursor-not-allowed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:26:50 +02:00
tristan 26c0a8b533 fix(ui) : cursor-default readonly TextArea + test chevron readonly Autocomplete
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:24:28 +02:00
tristan e622380916 feat(ui) : état readonly visuel sur les inputs floating-label
Applique le traitement readonly canonique (isReadonly, shouldFloatLabel,
mergedInputClass sans grow-height, bordure noire fixe, sans focus:border-m-primary,
mergedLabelClass sans peer-focus, iconStateClass sans isFocused) sur les 6 composants
InputText, InputEmail, InputAmount, InputAutocomplete, InputPassword et InputTextArea.
L'œil de InputPassword reste cliquable en readonly. Tests TDD ajoutés (3 cas par fichier).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:18:20 +02:00
tristan 289ff036d2 fix(ui) : readonly InputUpload — drop peer-focus float + idiome grow-height/cursor
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:12:15 +02:00
tristan fd3e3a7922 feat(ui) : état readonly visuel sur InputUpload (+ prop readonly)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:05:48 +02:00
tristan c934019260 docs : plan état readonly cohérent
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 15:03:26 +02:00
tristan cc03559dcf feat(ui) : astérisque required à 16px
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 14:37:15 +02:00
tristan 6b1e11bd6f test(ui) : vérifie aria-required sur Select/SelectCheckbox/RichText
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:12:09 +02:00
tristan 4f5eaaacb9 docs : documentation required cohérente sur toute la famille formulaire
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:11:06 +02:00
tristan 2d8639a913 docs(playground) : exemples required + email lowercase
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:03:15 +02:00
tristan 3e09f4278e docs : required/astérisque + lowercase email (COMPONENTS + CHANGELOG)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:00:38 +02:00
tristan 4e2303c471 test(inputs) : tests mode contrôlé email + commentaire caret jsdom
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:58:06 +02:00
tristan 6081f0c90c feat(inputs) : sanitisation email (suppression des espaces + option lowercase)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:54:13 +02:00
tristan 120020b210 feat(ui): astérisque required dans le label de la famille formulaire
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:45:48 +02:00
tristan 61cb90a9c6 fix(ui): aria-required sur champ visible InputUpload + ordre import RichText
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:38:25 +02:00
tristan 167cc43870 feat(ui) : prop required + aria-required + astérisque sur Select/SelectCheckbox/Upload/RichText
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:32:10 +02:00
tristan 03fe458248 feat(ui) : composant partagé MalioRequiredMark (astérisque champ obligatoire)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:26:04 +02:00
tristan df289aa829 docs: plan d'implémentation MUI-41 + précisions spec (caret email, exclusion SiteSelector)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:23:31 +02:00
tristan 05949b727e docs: spec required asterisk + email sanitization (MUI-41)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 11:16:07 +02:00