[#337] Création d'un composant Select (#3)

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|       #337           |           Création d'un composant Select      |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [ ] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [x] CHANGELOG modifié

Co-authored-by: tristan <tristan@yuno.malio.fr>
Reviewed-on: #3
Reviewed-by: Autin <tristan@yuno.malio.fr>
Co-authored-by: kevin <kevin@yuno.malio.fr>
Co-committed-by: kevin <kevin@yuno.malio.fr>
This commit was merged in pull request #3.
This commit is contained in:
2026-03-02 13:24:58 +00:00
committed by Autin
parent 82ecc9cfe2
commit 1ab7b2427a
25 changed files with 4208 additions and 188 deletions

View File

@@ -0,0 +1,148 @@
<template>
<Story
title="Select"
>
<MalioSelect
v-model="value"
:options="options"
/>
</Story>
</template>
<docs lang="md">
# MalioSelect
Composant select personnalisé avec label flottant, option vide,
états visuels selon la sélection et ouverture/fermeture contrôlée.
------------------------------------------------------------------------
## Props détaillées
### modelValue
- Type: string | number | null
- Description: Valeur actuellement sélectionnée.
- Comportement:
- Compatible avec `v-model`.
- Peut valoir `null` pour représenter loption vide.
### options
- Type: Array<{ label: string; value: string | number | null }>
- Description: Liste des options affichées dans le menu.
- Défaut: tableau vide.
### emptyOptionLabel
- Type: string
- Description: Texte de loption vide injectée automatiquement.
- Comportement:
- Cette option porte toujours la valeur `null`.
- Si la prop est vide, loption reste visuellement discrète.
### label
- Type: string
- Description: Texte affiché comme label flottant au-dessus du champ.
- Comportement: Si absent, aucun label nest rendu.
------------------------------------------------------------------------
## Apparence & Style
### textField
- Type: string
- Description: Classes CSS appliquées au bouton du select.
### textValue
- Type: string
- Description: Classes CSS appliquées à la valeur affichée.
### textLabel
- Type: string
- Description: Classes CSS appliquées au label flottant.
### rounded
- Type: string
- Description: Classe Tailwind pour le border-radius.
- Défaut: rounded-md
### minWidth / maxWidth
- Type: string
- Description: Classes utilitaires Tailwind pour contraindre la
largeur.
------------------------------------------------------------------------
## Interaction
### disabled
- Type: boolean
- Description: Désactive complètement le composant.
- Effet:
- Empêche louverture du menu.
- Applique un style visuel désactivé.
------------------------------------------------------------------------
## Comportement visuel
- Au repos sans sélection: bordure grise.
- Ouvert: bordure et label en couleur primaire.
- Fermé avec valeur sélectionnée: bordure et texte en noir.
- Loption vide dans la liste peut être stylée différemment pour être
distinguée des autres.
------------------------------------------------------------------------
## Accessibilité
- Le bouton porte `aria-expanded` et `aria-controls`.
- La liste utilise `role="listbox"`.
- Chaque option utilise `role="option"` et `aria-selected`.
------------------------------------------------------------------------
## Events
### update:modelValue
- Émis à chaque sélection dans la liste.
- Permet lutilisation avec v-model.
- Peut émettre `null` si loption vide est sélectionnée.
</docs>
<script setup lang="ts">
import { ref } from 'vue'
import MalioSelect from '../components/malio/Select.vue'
const value = ref<string | number | null>(null)
const options = [
{ label: 'France', value: 'fr' },
{ label: 'Belgique', value: 'be' },
{ label: 'Suisse', value: 'ch' },
{ label: 'Canada', value: 'ca' },
{ label: 'Allemagne', value: 'de' },
{ label: 'Espagne', value: 'es' },
{ label: 'Italie', value: 'it' },
{ label: 'Portugal', value: 'pt' },
{ label: 'Pays-Bas', value: 'nl' },
{ label: 'Suède', value: 'se' },
{ label: 'Norvège', value: 'no' },
{ label: 'Danemark', value: 'dk' },
{ label: 'Finlande', value: 'fi' },
{ label: 'Autriche', value: 'at' },
{ label: 'Irlande', value: 'ie' },
{ label: 'Grèce', value: 'gr' },
{ label: 'Pologne', value: 'pl' },
{ label: 'Hongrie', value: 'hu' },
{ label: 'République tchèque', value: 'cz' },
]
</script>

View File

@@ -0,0 +1,200 @@
<template>
<Story
title="Input/Text"
>
<MalioInputText/>
</Story>
</template>
<docs lang="md">
# MalioInputText
Composant input texte avec masque optionnel (maska), label flottant,
états visuels (erreur / succès) et icône configurable.
------------------------------------------------------------------------
## Props détaillées
### id
- Type: string
- Description: Identifiant HTML de linput.
- Comportement: Si non fourni, un id unique est généré
automatiquement.
### label
- Type: string
- Description: Texte affiché comme label flottant.
- Comportement: Si absent, aucun label nest rendu.
### name
- Type: string
- Description: Attribut name de linput (utile pour les formulaires).
### autocomplete
- Type: string
- Description: Active ou configure lautocomplétion navigateur.
- Défaut: vide
### modelValue
- Type: string | null | undefined
- Description: Valeur contrôlée du composant.
- Comportement:
- Si défini composant contrôlé (v-model).
- Sinon gestion interne de létat.
### mask
- Type: string | undefined
- Description: Masque appliqué via la directive maska.
- Comportement: Formate la saisie selon les tokens définis.
------------------------------------------------------------------------
## Apparence & Style
### textInput
- Type: string
- Description: Classes CSS appliquées à linput (taille de texte,
etc.).
### textLabel
- Type: string
- Description: Classes CSS appliquées au label.
### rounded
- Type: string
- Description: Classe Tailwind pour le border-radius.
- Défaut: rounded-md
### minWidth / maxWidth
- Type: string
- Description: Classes utilitaires Tailwind pour contraindre la
largeur.
------------------------------------------------------------------------
## Validation & Contraintes
### required
- Type: boolean
- Description: Ajoute lattribut HTML required.
### maxLength
- Type: number | string
- Description: Longueur maximale autorisée.
### minLength
- Type: number | string
- Description: Longueur minimale autorisée.
### disabled
- Type: boolean
- Description: Désactive complètement le champ.
### readonly
- Type: boolean
- Description: Rend le champ non modifiable mais focusable.
------------------------------------------------------------------------
## États & Messages
### hint
- Type: string
- Description: Message daide affiché sous le champ.
### error
- Type: string
- Description: Message derreur.
- Effet:
- Active létat visuel erreur.
- aria-invalid=true
- Prioritaire sur success et hint.
### success
- Type: string
- Description: Message de succès.
- Effet:
- Actif uniquement si error est absent.
------------------------------------------------------------------------
## Icône
### iconName
- Type: string
- Description: Nom de licône (ex: mdi:magnify).
### iconSize
- Type: string | number
- Description: Taille de licône.
### iconColor
- Type: string
- Description: Couleur de licône.
------------------------------------------------------------------------
## Comportement de validation
- Aucune validation interne.
- Les états sont pilotés uniquement par les props.
## Priorité visuelle
1. error
2. success
3. neutre
------------------------------------------------------------------------
## Tokens de masque
- \# : chiffre
- A : lettre majuscule
- a : lettre minuscule
- \* : chiffre ou lettre
------------------------------------------------------------------------
## Accessibilité
- aria-invalid est activé si error existe.
- aria-describedby référence dynamiquement le message affiché.
- Fonctionne avec ou sans v-model.
------------------------------------------------------------------------
## Events
### update:modelValue
- Émis à chaque modification de linput.
- Permet lutilisation avec v-model.
</docs>
<script setup lang="ts">
import MalioInputText from '../components/malio/InputText.vue'
</script>

View File

@@ -0,0 +1,192 @@
<template>
<Story
title="Input/TextArea"
>
<MalioInputTextArea/>
</Story>
</template>
<docs lang="md">
# MalioInputTextArea
Composant textarea avec label flottant, états visuels (erreur / succès),
gestion du redimensionnement et compteur optionnel.
------------------------------------------------------------------------
## Props détaillées
### id
- Type: string
- Description: Identifiant HTML du textarea.
- Comportement: Si non fourni, un id unique est généré
automatiquement.
### label
- Type: string
- Description: Texte affiché comme label flottant.
- Comportement: Si absent, aucun label nest rendu.
### name
- Type: string
- Description: Attribut name du textarea (utile pour les formulaires).
### autocomplete
- Type: string
- Description: Active ou configure lautocomplétion navigateur.
### modelValue
- Type: string | null | undefined
- Description: Valeur contrôlée du composant.
- Comportement:
- Si défini composant contrôlé (v-model).
- Sinon gestion interne de létat.
------------------------------------------------------------------------
## Apparence & Style
### textInput
- Type: string
- Description: Classes CSS appliquées au textarea (taille de texte,
etc.).
- Défaut: text-lg
### textLabel
- Type: string
- Description: Classes CSS appliquées au label.
- Défaut: text-sm
### rounded
- Type: string
- Description: Classe Tailwind pour le border-radius.
- Défaut: rounded-md
------------------------------------------------------------------------
## Dimensions
### size
- Type: number | string
- Description: Nombre de lignes initiales (rows).
- Défaut: 2
### minResizeWidth / maxResizeWidth
- Type: number | string
- Description: Largeur minimale / maximale autorisée lors du
redimensionnement.
### minResizeHeight / maxResizeHeight
- Type: number | string
- Description: Hauteur minimale / maximale autorisée lors du
redimensionnement.
### resize
- Type: 'none' | 'both' | 'horizontal' | 'vertical'
- Description: Définit le comportement de redimensionnement CSS.
- Défaut: both
------------------------------------------------------------------------
## Validation & États
### required
- Type: boolean
- Description: Ajoute lattribut HTML required.
### maxLength
- Type: number | string
- Description: Longueur maximale autorisée.
- Effet: Limite la saisie et alimente le compteur.
### disabled
- Type: boolean
- Description: Désactive complètement le champ.
### readonly
- Type: boolean
- Description: Rend le champ non modifiable mais focusable.
### hint
- Type: string
- Description: Message daide affiché sous le champ.
### error
- Type: string
- Description: Message derreur.
- Effet:
- Active létat visuel erreur.
- aria-invalid=true
- Prioritaire sur success et hint.
### success
- Type: string
- Description: Message de succès.
- Effet:
- Actif uniquement si error est absent.
------------------------------------------------------------------------
## Compteur
### showCounter
- Type: boolean
- Description: Affiche le compteur x / maxLength.
- Condition:
- showCounter = true
- maxLength défini et > 0
- Position: Bas gauche du textarea.
- Mise à jour: Dynamique à chaque saisie.
------------------------------------------------------------------------
## Priorité daffichage
### Messages
1. error
2. success
3. hint
------------------------------------------------------------------------
## Accessibilité
- aria-invalid est activé si error existe.
- aria-describedby référence le message affiché.
- Fonctionne avec ou sans v-model.
------------------------------------------------------------------------
## Events
### update:modelValue
- Émis à chaque modification du textarea.
- Permet lutilisation avec v-model.
</docs>
<script setup lang="ts">
import MalioInputTextArea from '../components/malio/InputTextArea.vue'
</script>