# Calendrier
Vue calendaire. Trois modes de sélection : date unique, période et sélection multiple ; range contraint les bornes des dates sélectionnables. Le mode panel affiche un panneau permanent, tandis que le mode input se replie en champ de saisie déployé au clic (panneau monté dans le body).
Calendrier
<template>
<div class="demo-col" style="max-width: none">
<div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap">
<LhCalendar v-model="single" selection="single" />
<LhCalendar v-model="span" selection="range" mode="input" placeholder="Choisir une période" />
</div>
<p class="demo-note">Sélection unique : {{ fmt(single) }} | Période : {{ fmtArr(span) }}</p>
<div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap; margin-top: 16px">
<LhCalendar v-model="multi" selection="multiple" :panels="2" :close-on-select="false" />
<LhCalendar v-model="strict" selection="range" mode="panel" />
</div>
<p class="demo-note">Multiple (panels=2 double panneau, closeOnSelect=false ne se referme pas automatiquement) : {{ fmtArr(multi) }}</p>
<p class="demo-note">Mode panneau range (mode="panel") : {{ fmtArr(strict) }}</p>
<div class="demo-row" style="align-items: flex-start; flex-wrap: nowrap; margin-top: 16px">
<LhCalendar v-model="clamped" selection="single" :range="bounds" />
</div>
<p class="demo-note">range limite l'intervalle sélectionnable (uniquement 2026-10-01 ~ 2026-10-15) : {{ fmt(clamped) }}</p>
</div>
</template>
<script>
export default {
data: () => ({
single: new Date(2026, 9, 3),
span: [],
multi: [],
strict: [],
clamped: new Date(2026, 9, 5),
bounds: [new Date(2026, 9, 1), new Date(2026, 9, 15)],
}),
methods: {
fmt(v) {
return v instanceof Date ? v.toLocaleDateString('fr-FR') : '(non sélectionné)'
},
fmtArr(v) {
if (!Array.isArray(v) || v.length === 0) return '(non sélectionné)'
return v.map((d) => d.toLocaleDateString('fr-FR')).join(' ~ ')
},
},
}
</script>
# Props
| Prop | Description | Type | Valeur par défaut |
|---|---|---|---|
| v-model | Sélection courante ; Date en sélection unique, Date[] en période et en sélection multiple | Date \| Date[] | — |
| selection | Mode de sélection | 'single' \| 'range' \| 'multiple' | 'single' |
| range | Plage de dates sélectionnables [start, end] ; hors plage, désactivé | [Date, Date] | — |
| mode | Forme d'affichage : panel panneau permanent / input champ replié | 'panel' \| 'input' | 'panel' |
| panels | Nombre de panneaux mensuels affichés simultanément (disposés en flex avec retour à la ligne) | number | 1 |
| placeholder | Texte de substitution en mode input | string | Pack de langue |
| closeOnSelect | En mode input, refermer automatiquement après sélection ou non | boolean | true |
| sx | Raccourci de mise en page sx | — | — |
# Events
input (v-model), change (value), select (date)
# Slots
| Slot | Description |
|---|---|
| header | En-tête du panneau mensuel, paramètre de scope { year, month } (rendu par défaut au format « MMMM YYYY ») |
| cell | Cellule de date, paramètre de scope { date } (rendu par défaut : le numéro du jour) |
# Accessibilité
Le panneau est role="grid", la ligne des jours de la semaine role="row" et la cellule de date role="gridcell" ; les dates désactivées portent aria-disabled, et le déclencheur en mode input permet le déploiement au clavier et la navigation par flèches.
Copyright © 2024-2026 FengMo WenXue