Date unique avec format français. Le hint par défaut affiche un exemple de date.
Voir le code
<ar-datepicker
label="Date de naissance"
format="dd/MM/yyyy"
lang="fr-FR"
></ar-datepicker>Affiche un champ de saisie de date synchronisé avec un calendrier popover, pour combiner saisie libre au clavier et sélection visuelle.
Le calendrier suit le pattern APG Date Picker Dialog.
error est relié à l’input par aria-describedby : le message est lu quand le champ reçoit le focus (WCAG 1.3.1 (ouvre dans un nouvel onglet)aria-invalid="true" sur l’input quand le slot error est rempli ou quand le champ est invalide après une interaction, comme un champ natifaria-disabled="true" sur les jours hors plage et les jours désactivés (WCAG 4.1.2 (ouvre dans un nouvel onglet)min ou max, la plage sélectionnable (WCAG 3.3.2 (ouvre dans un nouvel onglet)| Touche | Action |
|---|---|
| ↑↓←→ | Naviguer de jour en jour / semaine |
Home / End | Premier / dernier jour de la semaine |
Page Up / Page Down | Mois précédent / suivant |
Shift + Page Up / Page Down | Année précédente / suivante |
Entrée / Espace | Sélectionner le jour focalisé |
| Escape | Fermer sans sélectionner |
label ou le slot label.hint (jamais placeholder, qui disparaît à la saisie). Il remplace le hint par défaut, exemple de date et plage min/max compris : à répéter si nécessaire.--ar-datepicker-day-focus-ring-color/-width/-offset. --ar-datepicker-day-focus-border-color est cosmétique : le redéfinir n’affecte pas la garantie WCAG 2.4.7.--ar-datepicker-input-max-width est calculé par défaut d’après la longueur de format, indépendamment de la largeur du hint. Si vous le surchargez, restez proche du contenu attendu dans le champ.
ar-datepicker se comporte comme un champ de formulaire natif : soumission, validation, états et réinitialisation sont décrits dans la page Formulaires. Propre au datepicker, form.reset() ramène aussi le texte de saisie à son état initial, et un panneau ouvert se ferme avec ses événements habituels (ar-datepicker-hide, ar-datepicker-hidden).
Le getter inputElement expose l’<input> interne pour y brancher une bibliothèque de masque comme IMask :
import IMask from 'imask';
const picker = document.querySelector('ar-datepicker');
IMask(picker.inputElement, { mask: Date });
Ces textes suivent l’attribut lang (cf. Traductions). Les slots today-label / close-label les remplacent par un contenu plus riche ; le texte traduit reste la source de l’aria-label du <button>, même si le slot ne contient qu’une icône :
<ar-datepicker lang="en">
<span slot="close-label" aria-hidden="true">✕</span>
</ar-datepicker>
Les exemples de cette page sont affichés avec le thème neutre du starter-kit.
Date unique avec format français. Le hint par défaut affiche un exemple de date.
<ar-datepicker
label="Date de naissance"
format="dd/MM/yyyy"
lang="fr-FR"
></ar-datepicker>Lorsque le slot "error" est rempli, le composant expose `:state(has-error)`.
<ar-datepicker label="Date de naissance">
<span slot="error">Date invalide ou hors plage autorisée</span>
</ar-datepicker>Valeur affichée non modifiable, soumise au formulaire.
<ar-datepicker value="2026-06-12" readonly label="Date"></ar-datepicker>Composant désactivé, valeur exclue du formulaire.
<ar-datepicker value="2026-06-12" disabled label="Date"></ar-datepicker>`min` et `max` restreignent les jours sélectionnables. Le hint par défaut annonce la plage.
<ar-datepicker
label="Date de rendez-vous"
min="2026-01-01"
max="2026-12-31"
lang="fr-FR"
></ar-datepicker>`isDateDisabled` désactive des jours selon une règle libre, ici les week-ends, et rend le champ invalide si l'un d'eux est saisi à la main. Le hint par défaut ne les décrit pas.
<ar-datepicker id="demo-disabled-dates" label="Date de rendez-vous" lang="fr-FR"></ar-datepicker>
<script>
document.getElementById('demo-disabled-dates').isDateDisabled = function (date) {
return date.getDay() === 0 || date.getDay() === 6;
};
</script>L'attribut `lang` pilote les textes et les formats, sauf le label de l'input.
<ar-datepicker
label="Date of birth"
format="MM/dd/yyyy"
lang="en-US"
></ar-datepicker>Manipulez les attributs pour voir le code et la preview se mettre à jour.
<ar-datepicker
label="Date de naissance"
format="dd/MM/yyyy"
lang="fr-FR"
></ar-datepicker>Si vous utilisez l'autoloader, les composants détectés dans la pages sont chargés automatiquement, donc pas besoin de les importer individuellement.
Pour un import manuel, voici comment vous y prendre.
Importez ce composant depuis le CDN.
<script type="module" src="https://unpkg.com/@ariane-ui/core/dist/components/datepicker/index.js"></script>Après avoir installé le paquet via npm, vous pouvez importer le composant ainsi :
import '@ariane-ui/core/dist/components/datepicker/index.js';Valeur ISO `yyyy-MM-dd` de la date sélectionnée.
Format de saisie/affichage (tokens `dd`, `MM`, `yyyy`). Défaut : `dd/MM/yyyy`.
Date minimale sélectionnable (ISO `yyyy-MM-dd`).
Date maximale sélectionnable (ISO `yyyy-MM-dd`).
Texte placeholder de l'input.
Valeur `autocomplete` de l'input natif.
Label du champ (alternative au slot `label`).
Bloque la saisie tout en soumettant la valeur au formulaire.
Ouvre ou ferme le popover calendrier.
Attente d'une réponse, pilotée par l'application (par exemple les jours désactivés du mois affiché, à charger après `ar-datepicker-view-change`). Le composant ne le pose ni ne le retire jamais. Non bloquant : le calendrier reste utilisable. Pose `aria-busy="true"` sur le panneau, l'état `:state(pending)` et annonce l'attente au passage `false → true`.
Identifie le champ dans `FormData`.
Désactive le champ et exclut sa valeur du formulaire.
Active la contrainte de validation native `required`.
Prédicat fourni par l'application : retourne `true` quand un jour doit être désactivé. S'ajoute aux règles `min` et `max`. Une date refusée par le prédicat, même saisie à la main, rend le champ invalide (`stepMismatch`). Propriété JavaScript uniquement, à poser comme propriété et non comme attribut ; réassignez-la pour que le calendrier en tienne compte.
Contenu riche du label (remplace le prop `label`).
Éléments après le label (bouton d'aide, tooltip…).
Texte d'aide persistant (format attendu, plage min/max si définie). Lié via aria-describedby. Un contenu personnalisé remplace entièrement le texte par défaut, y compris la mention de la plage — à répéter manuellement si nécessaire.
Message d'erreur de l'application. Déclenche l'état has-error, et est lié à l'input par aria-describedby.
Contenu riche du bouton « Aujourd'hui » (icône + texte, remplace le texte traduit par défaut).
Contenu riche du bouton « Fermer » (icône + texte, remplace le texte traduit par défaut).
Natif, sur l'hôte, une fois `value` mise à jour par l'utilisateur (sélection calendrier ou validation de la saisie).
Natif, juste après `input`.
detail : { id: string | undefined, value: string | null, valueAsDate: Date | null, valid: boolean }Valeur commitée (blur ou sélection calendrier).
detail : { id: string | undefined, value: string | null, valueAsDate: Date | null, valid: boolean }Saisie complète au format attendu. `detail.valid` indique s'il s'agit d'une date plausible (pas le 32/01/2026).
detail : { id: string | undefined }Avant ouverture du popover.
detail : { id: string | undefined }Après ouverture.
detail : { id: string | undefined }Avant fermeture.
detail : { id: string | undefined }Après fermeture.
detail : { id: string | undefined, year: number, month: number }Le mois affiché change (navigation) ou le calendrier s'ouvre ; `month` va de 1 à 12.
retour : booleanRenvoie `true` si le champ est valide ; émet `invalid` sinon.
retour : booleanComme `checkValidity()`, et affiche le message de validation du navigateur.
message: stringretour : voidPose une erreur de validation personnalisée (par exemple une erreur de serveur). Elle persiste, comme sur un `<input>` natif, jusqu'à `setCustomValidity('')`, y compris après `form.reset()` et après une nouvelle saisie.
Utilisez ::part(name) pour styler ces éléments depuis l'extérieur.
Certaines parts indiquent un rôle transverse, partagé avec d'autres composants — voir Personnalisation avancée.
Racine du composant.
Le champ texte.
Porté par `input` : élément qui reçoit une saisie. Sous-rôle standard de `field` (avec `select`, cf. ar-pagination), réutilisable par tout futur composant avec un champ texte.
Le bouton d'ouverture du calendrier.
Le popover flottant.
En-tête du calendrier (navigation).
Tous les boutons de navigation (ciblage groupé).
Bouton année précédente.
Bouton mois précédent.
Bouton mois suivant.
Bouton année suivante.
La grille calendrier.
Les cellules d'en-tête de colonne (abréviations de jours).
L'élément label.
Le texte d'aide sous l'input.
Le message d'erreur sous l'input.
Les boutons jours.
Porté par `day` : élément interactif générique.
Pied du calendrier.
Tous les boutons du footer (ciblage groupé).
Bouton « Aujourd'hui ».
Bouton « Fermer ».
Porté par les 4 boutons de navigation (`nav-button`) et les 2 boutons du footer (`footer-button`) : bouton qui déclenche une action ponctuelle.
Utilisez le sélecteur :state(name) sur le tag pour styler ce composant en fonction de son état.
Composable avec ::part() pour cibler un élément interne (ar-datepicker:state(name)::part(x)).
Sous Chrome et Edge 125, l'état est exposé avec le préfixe -- (:--name) : voir Compatibilité.
Le calendrier est ouvert.
Le composant est désactivé.
Le composant est en lecture seule.
Le slot `error` est rempli : l'application affiche une erreur. Indépendant de la validité du champ (voir `user-invalid`).
L'application a posé l'attribut `pending` : une réponse est attendue.
Le champ est obligatoire (`required`).
Le champ n'est pas obligatoire.
Le champ est invalide après une saisie validée par l'utilisateur (sélection dans le calendrier, saisie puis perte de focus), une tentative de soumission ou `reportValidity()`. Jamais posé par une valeur venant de l'application ; retiré par `form.reset()`.
Le champ est valide après la même interaction.
Ce composant utilise un panel flottant, partagé avec d'autres composants, qui expose des custom properties.
Les thèmes peuvent redéfinir ces tokens globalement via :root, ou par composant comme dans cet exemple :
ar-datepicker {
--ar-panel-radius: 1rem;
}Fond du panel partagé. Repli système `Canvas` si aucun thème n'est chargé.
Couleur du texte du panel partagé. Repli système `CanvasText` si aucun thème n'est chargé.
Couleur de bordure du panel partagé. Repli système `ButtonBorder` si aucun thème n'est chargé.
Rayon de bordure du panel partagé.
Ombre portée du panel partagé.
Espacement interne du panel partagé.
Largeur minimale du panel partagé.
Largeur maximale du panel partagé.
Durée de l'animation d'ouverture du panel partagé (respecte `prefers-reduced-motion`).
Il expose également des custom properties propres, personnalisables directement via :root.
Largeur maximale du champ de saisie. Par défaut, une valeur calculée à partir de la longueur de `format`.
Largeur maximale du popover (valeur propre, non cascadée depuis --ar-panel-max-width ; repli `25rem` si aucun thème n'est chargé, évite que la grille de ~35 jours s'étale sur toute la largeur de la page).
Espacement entre le trigger et le panel.
Décalage latéral du panel.
Couleur de bordure des boutons nav.
Couleur de bordure des boutons footer.
Taille des cellules jour (repli `2.5rem` si aucun thème n'est chargé — cible tactile WCAG 2.5.8 Target Size Minimum, la grille utilisant border-collapse: collapse qui supprime l'espacement natif du <table>).
Couleur de bordure par défaut des cellules jour. Repli `transparent` si aucun thème n'est chargé (aucune bordure par défaut).
Couleur du texte des cellules jour (cascade vers --ar-color-text).
Fond des cellules jour.
Couleur des jours hors du mois affiché. Repli `GrayText` si aucun thème n'est chargé.
Fond du jour actuel.
Couleur texte du jour actuel.
Couleur de bordure du jour actuel. Repli `GrayText` si aucun thème n'est chargé (garde une distinction visible du reste de la grille).
Fond au survol d'un jour. Repli `ButtonFace` si aucun thème n'est chargé.
Couleur texte au survol d'un jour. Repli `ButtonText` si aucun thème n'est chargé.
Couleur du focus ring des jours. Repli `ButtonText` si aucun thème n'est chargé (WCAG 2.4.7).
Épaisseur du focus ring des jours.
Décalage du focus ring des jours.
Couleur de bordure de la cellule jour en focus (roving tabindex). Purement cosmétique : l'indicateur de focus WCAG 2.4.7 est garanti indépendamment par --ar-datepicker-day-focus-ring-color/-width/-offset. Repli transparent si aucun thème n'est chargé.
Fond du jour sélectionné. Repli `Highlight` si aucun thème n'est chargé (sinon indiscernable des jours non sélectionnés).
Couleur texte du jour sélectionné. Repli `HighlightText` si aucun thème n'est chargé.
Couleur de l'anneau de focus des boutons de navigation (cascade vers --ar-focus-ring-color). Repli `ButtonText` si aucun thème n'est chargé (WCAG 2.4.7).
Couleur de l'anneau de focus des boutons du footer (cascade vers --ar-focus-ring-color). Repli `ButtonText` si aucun thème n'est chargé (WCAG 2.4.7).
La langue de ce composant suit l'attribut lang de la page (<html lang>).
Vous pouvez appliquer une langue différente à une instance donnée en posant l'attribut lang directement dessus.
Voir la page Traductions pour le détail du mécanisme et la liste des traductions disponibles.
lang étant un attribut HTML natif, il n'apparaît pas dans le tableau « Attributs & Propriétés ».