Champ de date
Un champ de texte saisissable, avec un VDatePicker dans un panneau à côté. Le masque suit la langue : l'ordre des champs, le séparateur et le gabarit sont tous dérivés de la locale.
Utilisation
Exemples
Libellé, aide et icône
label et hint se comportent comme sur n'importe quel champ. pickerIcon change le glyphe qui ouvre le calendrier, iconStart pose une icône au début du champ, et loading affiche un indicateur à la place de l'icône de calendrier. pickerIconLabel, clearLabel, loadingText et iconStartLabel renomment ce que chacun annonce.
Type it or pick it from the calendar
The calendar is the only way in
An icon at the start, a spinner at the end while something loads
Tailles
size définit la hauteur du champ à 32, 40 ou 48 pixels, et compact lui retire 4px. Le panneau garde ses propres mesures.
Modes
mode choisit la façon de renseigner la valeur : input masque le champ pour n'y saisir que des chiffres, le calendrier devenant alors optionnel via showPicker ; picker fait du calendrier la seule entrée. La saisie est réservée à une date unique.
No icon, no panel: the field is the whole control
showPicker adds the icon and opens the panel on focus
Nothing can be typed, so the calendar is the only way in
Période
selection à range fait de la valeur un début et une fin, le calendrier prenant le premier clic pour l'un et le second pour l'autre.
Pick the first day, then the last. Typing falls back to read-only here.
Dates multiples
selection à multiple fait de la valeur une liste, un jour déjà présent en étant retiré par un nouveau clic.
Click a day to add it, click it again to take it back
Raccourcis
Le slot #footer est une bande au pied du panneau, pour des actions ou pour les dates les plus demandées. Il reçoit close, de sorte qu'un bouton peut poser la valeur et fermer le panneau d'un coup.
Bornes et jours fermés
min et max bornent à la fois le choix et la navigation. disabledDates ferme des jours isolés, sous forme de liste ou de fonction répondant pour une date à la fois.
Between 5 and 24 June 2026: the arrows stop at the bounds
Weekends are struck through: still reachable, never choosable
Pastilles
events dessine jusqu'à trois points sous un jour. Chacun accepte n'importe quelle couleur CSS et un label, qui est ce que lisent les technologies d'assistance.
Open the calendar: June has four marked days
Cellules de jour personnalisées
Le slot #day remplace le nombre à l'intérieur d'un jour et reçoit la date ISO ainsi que ce que la cellule sait d'elle-même : si elle appartient au mois affiché, si elle peut être choisie, si elle est sélectionnée, aujourd'hui, ou dans une période en cours de tracé.
The slot replaces the day number, so what it draws follows the selection
Effacement
clearable ajoute une croix qui vide la valeur, à gauche de l'icône de calendrier et non à sa place.
The cross sits to the left of the calendar icon, never in its place
Emptying the field is then the reader's own business
Jours adjacents
showAdjacentDays remplit les coins de la grille avec les mois voisins, grisés et inertes. selectAdjacentDays rend ces jours choisissables, et en choisir un déplace le calendrier vers son mois.
The grid starts and ends on the month itself
The corners are filled with the neighbouring months, greyed and inert
Choosing one moves the calendar to its month
États
invalid marque le champ en erreur. disabled le grise et empêche l'ouverture du panneau. readonly montre la valeur figée : rien ne se saisit et aucun calendrier n'est rendu, mais le champ garde son contraste et prend le focus.
For a rule the browser cannot check by itself
Greyed through the colour tokens, and the panel can no longer be opened
No typing, no calendar, no clear cross
Localisation
locale décide de l'ordre de saisie, du séparateur, des noms de mois et de jours et du premier jour de la semaine, et l'emporte sur la locale globale. displayFormat est un jeu d'options Intl pour écrire la date, et s'applique partout où rien n'est saisi.
displayFormat is an Intl option bag, and it only applies where nothing is typed
Placement
placement nomme la direction d'ouverture préférée du panneau, au-dessus ou en dessous du champ.
API
Props
| Prop | Type | Défaut |
|---|---|---|
selection | DatePickerSelection'single' | 'range' | 'multiple' | 'single' |
| Ce qui est choisi : une date, une période entre deux, ou plusieurs dates séparées. | ||
locale | string | aucune |
| Une locale BCP 47, qui décide des noms de mois et de jours, du premier jour de la semaine et de l'ordre dans lequel le champ se saisit. Elle l'emporte sur la locale globale du design system et retombe dessus. | ||
firstDayOfWeek | number | aucune |
| Force le jour où commencent les semaines, de 0 pour dimanche à 6 pour samedi. | ||
min | string | aucune |
| La première date qui peut être choisie, en chaîne ISO. | ||
max | string | aucune |
| La dernière date qui peut être choisie, en chaîne ISO. | ||
disabledDates | DatePickerMatcher | aucune |
| Les dates qui ne peuvent pas être choisies, en liste ou en fonction. | ||
showAdjacentDays | boolean | false |
| Remplit les coins de la grille avec les jours grisés des mois voisins. | ||
selectAdjacentDays | boolean | false |
| Permet de cliquer ces jours voisins, ce qui implique de les afficher. | ||
events | DatePickerEvent[] | aucune |
| Les événements à marquer sous les jours concernés. | ||
mode | DateInputMode'picker' | 'input' | 'input' |
Si le champ peut être SAISI, dans la forme numérique de la langue du lecteur, ou s'il se remplit depuis le seul calendrier, ce qui est picker. La saisie est réservée au choix d'une date UNIQUE : une période ou une liste retombe sur picker, faute de façon sensée de saisir l'une ou l'autre. C'est une autre question que readonly, qui gèle le champ par toutes les voies à la fois. | ||
showPicker | boolean | false |
Propose le sélecteur de date à côté d'un champ saisissable : une icône en fin de champ, et un panneau qui s'ouvre au focus. Cela ne signifie rien en mode picker, où le calendrier est déjà la seule façon de choisir. | ||
label | string | aucune |
| Le libellé au-dessus du champ. | ||
hint | string | aucune |
| Une ligne d'aide sous le champ. | ||
placeholder | string | aucune |
| Ce que dit le champ quand il est vide. | ||
size | DateInputSize'sm' | 'md' | 'lg' | 'md' |
| La hauteur du champ : 32, 40 ou 48 pixels. | ||
compact | boolean | false |
| Retire 4px à la hauteur. | ||
disabled | boolean | false |
| Rend le champ inutilisable, grisé par les tokens de couleur. | ||
readonly | boolean | false |
Montre la date sans permettre de la changer : rien ne se tape, il n'y a ni calendrier ni croix de vidage, et les attributs qui annonçaient un panneau disparaissent avec eux. Le champ garde le focus et reste copiable, ce qui le distingue de disabled. | ||
invalid | boolean | false |
| Marque le champ comme invalide, pour une règle à vous. | ||
iconStart | IconSource | aucune |
Une icône dans le champ, au début. Décorative jusqu'à ce qu'un écouteur @click:icon-start en fasse un bouton. | ||
iconStartLabel | string | aucune |
| Ce que fait l'icône de début, en mots, une fois cliquable. | ||
pickerIconLabel | string | aucune |
| Ce que fait l'icône de fin, en mots. Elle nomme le bouton qui ouvre le calendrier, et sa valeur par défaut vient du dictionnaire du design system. | ||
loading | boolean | false |
| Affiche une roue à la place de l'icône du calendrier. Elle dit que quelque chose se charge et ne change rien d'autre : le champ reste saisissable et le panneau s'ouvre toujours. | ||
loadingText | string | aucune |
| Ce que les lecteurs d'écran annoncent pendant que la roue tourne. Sa valeur par défaut vient du dictionnaire du design system. | ||
clearable | boolean | false |
| Propose une croix qui vide la valeur, affichée avant l'icône de fin. | ||
clearLabel | string | aucune |
| Ce que fait cette croix, en mots. Sa valeur par défaut vient du dictionnaire du design system. | ||
pickerIcon | IconSource | calendar_today |
| L'icône qui ouvre le sélecteur de date, en fin de champ. La croix d'effacement apparaît à sa gauche plutôt qu'à sa place, et aucune icône n'est rendue du tout quand il n'y a pas de panneau à ouvrir. | ||
displayFormat | Intl.DateTimeFormatOptions | { day: 'numeric', month: 'short', year: 'numeric' } |
Comment la date est ÉCRITE dans le champ. Sans effet sur un champ en cours de saisie, qui montre nécessairement la forme numérique que l'on tape : cette prop concerne donc le mode picker, ainsi que les sélections de période et de liste. | ||
placement | DateInputPlacement'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end' | 'bottom-start' |
| Où le panneau s'ouvre par rapport au champ. | ||
v-model | DatePickerValue | null |
La ou les dates choisies, dans la forme que selection réclame. Pendant la saisie, la valeur n'est écrite qu'une fois que ce qui a été entré est une date complète et acceptable ; une entrée inachevée ou refusée la laisse intacte et est annulée quand le lecteur quitte le champ. | ||
Événements
| Événement | Type |
|---|---|
click:icon-start | [event: MouseEvent] |
L'icône de début a été cliquée. Attacher cet écouteur est ce qui en fait un vrai bouton, qui demande alors iconStartLabel. | |
clear | [] |
| La croix de vidage a vidé le champ. La valeur est déjà remise à zéro. | |
Slots
| Slot | Type |
|---|---|
start | {} |
Du contenu au début du champ, rendu après iconStart plutôt qu'à sa place. | |
value-end | {} |
Des contrôles à vous à l'intérieur du champ, placés avant ceux que le champ possède : la croix d'effacement et l'icône qui ouvre le panneau. Ces deux-là sont l'affordance propre du composant, ce qui explique l'absence de slot end ici. | |
day | DatePickerDaySlotProps |
| Ce que montre une cellule de jour, transmis tel quel au calendrier. | |
footer | DateInputFooterSlotProps |
La bande au pied du panneau : des actions, ou des dates prédéfinies comme aujourd'hui. Elle reçoit close, ce qui permet à l'un de ces boutons de refermer le panneau. | |
Types
Les types que les tables ci-dessus nomment, écrits comme la librairie les déclare. Ceux qui portent export s'importent depuis vectis-ui pour typer votre propre code ; les autres décrivent la forme de ce qu'un slot fournit.
export interface BuiltinIcon {
name: string
paths: readonly [string] | readonly [string, string]
}export interface DatePickerDaySlotProps {
iso: string
day: number
inMonth: boolean
disabled: boolean
selected: boolean
today: boolean
inRange: boolean
events: DatePickerEvent[]
}export interface DatePickerEvent {
date: string
color?: string
label?: string
}export type DatePickerMatcher = string[] | ((iso: string) => boolean)
export interface DatePickerRange {
start: string | null
end: string | null
}export type DatePickerValue = string | null | DatePickerRange | string[]
export type IconRender =
| { path: string; viewBox?: string }
| { component: Component; props?: Record<string, unknown> }
| { src: string }
| { text: string; class?: string }
| { class: string }export type IconSource = string | BuiltinIcon | IconRender