887ebdebd7
## Résumé (MUI-41) Harmonise l'état « obligatoire » des composants de formulaire et normalise le champ email. ### `required` + astérisque - Nouveau composant partagé `MalioRequiredMark` : astérisque rouge (`text-m-danger`, **16px**), `aria-hidden`. - Prop `required` désormais cohérente sur toute la famille formulaire ; quand vraie, l'astérisque s'affiche **dans le label**. - Prop ajoutée à `Select`, `SelectCheckbox`, `InputUpload`, `InputRichText` (les autres l'avaient déjà). - Accessibilité : `required` natif là où l'élément le supporte, sinon `aria-required` (Select/SelectCheckbox sur le `<button>`, RichText sur le wrapper éditeur, Upload sur le champ visible). - `MalioSiteSelector` **exclu** volontairement (segmented control, pas de label de champ). ### Sanitisation email (`MalioInputEmail`) - Suppression de **tous les espaces** à la saisie (pas de masque). - Nouvelle prop opt-in `lowercase` (défaut `false`) : normalise en minuscules à la frappe (cohérent RG-1.21 Starseed). - Garde défensive curseur : l'API de sélection est interdite sur `type="email"` → repositionnement best-effort sans jamais lever. - La validation de format reste à la couche `error`. ### Docs & playground - `COMPONENTS.md` (doc `required` cohérente + note famille + `lowercase`) et `CHANGELOG.md` mis à jour. - Exemples playground `required` et email `lowercase` ajoutés. ## Test plan - [x] Suite complète : 42 fichiers / 771 tests verts - [x] Lint : 0 erreur - [x] Tests `aria-required` sur Select/SelectCheckbox/RichText - [ ] Vérif visuelle playground : astérisque 16px dans le label, email qui retire les espaces / minuscule Spec & plan : `docs/superpowers/specs/` et `docs/superpowers/plans/`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: #60 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
import type {SidebarSection} from '../app/components/malio/sidebar/Sidebar.vue'
|
|
|
|
export const navSections: SidebarSection[] = [
|
|
{
|
|
label: 'BOUTONS',
|
|
icon: 'mdi:gesture-tap-button',
|
|
items: [
|
|
{label: 'Button', to: '/composant/button/button'},
|
|
{label: 'Button Icon', to: '/composant/button/buttonIcon'},
|
|
],
|
|
},
|
|
{
|
|
label: 'CHAMPS',
|
|
icon: 'mdi:form-textbox',
|
|
items: [
|
|
{label: 'Texte', to: '/composant/input/inputText'},
|
|
{label: 'Nombre', to: '/composant/input/inputNumber'},
|
|
{label: 'Montant', to: '/composant/input/inputAmount'},
|
|
{label: 'Email', to: '/composant/input/inputEmail'},
|
|
{label: 'Mot de passe', to: '/composant/input/inputPassword'},
|
|
{label: 'Téléphone', to: '/composant/input/inputPhone'},
|
|
{label: 'Zone de texte', to: '/composant/input/inputTextArea'},
|
|
{label: 'Saisie assistée', to: '/composant/input/inputAutocomplete'},
|
|
{label: 'Upload', to: '/composant/input/inputUpload'},
|
|
{label: 'Éditeur riche', to: '/composant/input/inputRichText'},
|
|
],
|
|
},
|
|
{
|
|
label: 'DATES & HEURES',
|
|
icon: 'mdi:calendar-clock',
|
|
items: [
|
|
{label: 'Date', to: '/composant/date/date'},
|
|
{label: 'Plage de dates', to: '/composant/date/dateRange'},
|
|
{label: 'Semaine', to: '/composant/date/dateWeek'},
|
|
{label: 'Date & heure', to: '/composant/date/datetime'},
|
|
{label: 'Heure', to: '/composant/time/time'},
|
|
{label: 'Sélecteur d\'heure', to: '/composant/time/timePicker'},
|
|
],
|
|
},
|
|
{
|
|
label: 'SÉLECTIONS',
|
|
icon: 'mdi:form-dropdown',
|
|
items: [
|
|
{label: 'Select', to: '/composant/select/select'},
|
|
{label: 'Select Checkbox', to: '/composant/select/selectCheckbox'},
|
|
{label: 'Checkbox', to: '/composant/checkbox/checkbox'},
|
|
{label: 'Radio', to: '/composant/radio/radioButton'},
|
|
],
|
|
},
|
|
{
|
|
label: 'NAVIGATION',
|
|
icon: 'mdi:navigation-variant',
|
|
items: [
|
|
{label: 'Sidebar', to: '/composant/sidebar/sidebar'},
|
|
{label: 'Drawer', to: '/composant/drawer/drawer'},
|
|
{label: 'Modal', to: '/composant/modal/modal'},
|
|
{label: 'Onglets', to: '/composant/tab/tabList'},
|
|
{label: 'Accordéon', to: '/composant/accordion/accordion'},
|
|
],
|
|
},
|
|
{
|
|
label: 'DONNÉES',
|
|
icon: 'mdi:table',
|
|
items: [
|
|
{label: 'DataTable', to: '/composant/datatable/datatable'},
|
|
],
|
|
},
|
|
{
|
|
label: 'DIVERS',
|
|
icon: 'mdi:dots-horizontal',
|
|
items: [
|
|
{label: 'Champs readonly', to: '/composant/divers/readonly'},
|
|
{label: 'Heure', to: '/composant/time/time'},
|
|
{label: 'Sélecteur de site', to: '/composant/site/siteSelector'},
|
|
{label: 'Formulaire client', to: '/composant/form/client'},
|
|
{label: 'Filtres', to: '/composant/filtre/filtres'},
|
|
],
|
|
},
|
|
]
|