Skip to content
API 风格:

Calendrier ​

Calendrier en vue mensuelle. Réutilise l'algorithme de grille mensuelle du core de DatePicker, et prend en charge les contraint de plage ainsi que la navigation par touches directionnelles dans la grille.

Utilisation de base ​

Utilisation de base
oct. 2026
dim.lun.mar.mer.jeu.ven.sam.
vue
<script setup>
import { ref } from 'vue'
const date = ref(new Date())
</script>

<template>
  <LhCalendar v-model="date" />
</template>
vue
<script>
export default {
  data() {
    return { date: new Date() }
  },
}
</script>

<template>
  <LhCalendar v-model="date" />
</template>

Plage de dates et sélection multiple ​

selection prend en charge trois modes : 'single' (par défaut) / 'range' (deux clics définissent le début et la fin) / 'multiple' (les clics basculent plusieurs dates).

Plage de dates
oct. 2026
dim.lun.mar.mer.jeu.ven.sam.
nov. 2026
dim.lun.mar.mer.jeu.ven.sam.
vue
<script setup>
import { ref } from 'vue'
const span = ref([new Date(2026, 8, 5), new Date(2026, 8, 20)])
</script>

<template>
  <LhCalendar v-model="span" selection="range" :panels="2" />
</template>
vue
<script>
export default {
  data() {
    return { span: [new Date(2026, 8, 5), new Date(2026, 8, 20)] }
  },
}
</script>

<template>
  <LhCalendar v-model="span" selection="range" :panels="2" />
</template>
Sélection multiple
oct. 2026
dim.lun.mar.mer.jeu.ven.sam.
vue
<script setup>
import { ref } from 'vue'
const dates = ref([new Date(2026, 8, 10)])
</script>

<template>
  <LhCalendar v-model="dates" selection="multiple" />
</template>
vue
<script>
export default {
  data() {
    return { dates: [new Date(2026, 8, 10)] }
  },
}
</script>

<template>
  <LhCalendar v-model="dates" selection="multiple" />
</template>

Contrainte de plage sélectionnable ​

Contrainte de plage
oct. 2026
dim.lun.mar.mer.jeu.ven.sam.
vue
<script setup>
import { ref } from 'vue'

// Attention : en JS, les mois commencent à 0, new Date(2026, 8, 1) correspond au 1er septembre
const range = [new Date(2026, 8, 1), new Date(2026, 8, 28)]
const rangeDate = ref(new Date())
</script>

<template>
  <LhCalendar v-model="rangeDate" :range="range" />
</template>
vue
<script>
export default {
  data() {
    return {
      // Attention : en JS, les mois commencent à 0, new Date(2026, 8, 1) correspond au 1er septembre
      range: [new Date(2026, 8, 1), new Date(2026, 8, 28)],
      rangeDate: new Date(),
    }
  },
}
</script>

<template>
  <LhCalendar v-model="rangeDate" :range="range" />
</template>

Forme repliée en input ​

mode="input" replie le panneau persistant dans un champ de saisie, dépliable au clic, afin d'économiser de l'espace vertical. panels contrôle le nombre de panneaux mensuels affichés après déploiement, placeholder personnalise le texte indicatif et close-on-select décide du repli automatique après sélection.

Forme input + double panneau
vue
<script setup>
import { ref } from 'vue'
const inputDate = ref(new Date())
</script>

<template>
  <LhCalendar
    v-model="inputDate"
    mode="input"
    :panels="2"
    placeholder="Sélectionner une date"
  />
</template>
vue
<script>
export default {
  data() {
    return { inputDate: new Date() }
  },
}
</script>

<template>
  <LhCalendar
    v-model="inputDate"
    mode="input"
    :panels="2"
    placeholder="Sélectionner une date"
  />
</template>
Pas de repli automatique après sélection
vue
<script setup>
import { ref } from 'vue'
const inputDate2 = ref(new Date())
</script>

<template>
  <LhCalendar
    v-model="inputDate2"
    mode="input"
    :close-on-select="false"
    placeholder="Garder le panneau ouvert après sélection"
  />
</template>
vue
<script>
export default {
  data() {
    return { inputDate2: new Date() }
  },
}
</script>

<template>
  <LhCalendar
    v-model="inputDate2"
    mode="input"
    :close-on-select="false"
    placeholder="Garder le panneau ouvert après sélection"
  />
</template>

API ​

LhCalendar Props ​

PropriétéDescriptionTypeValeur par défaut
modelValueDate sélectionnée (v-model contrôlé)Date | Date[]—
selectionMode de sélection : sélection unique (par défaut) / plage de dates (début et fin) / sélection multiple"single" | "range" | "multiple"'single'
rangeContrainte de plage de dates sélectionnables[Date, Date]—
modeForme d'affichage"panel" | "input"'panel'
panelsNombre de panneaux mensuels affichés simultanément (disposés en flex avec retour à la ligne)number1
placeholderTexte indicatif en mode inputstring—
closeOnSelectReplier automatiquement le panneau après sélection en mode inputbooleantrue
sxPropriétés de mise en page rapide sxLhSxProps—

Events ​

ÉvénementDescriptionParamètre de rappel
update:modelValueDéclenché lorsque la sélection change (v-model)(value: Date | Date[])
changeDéclenché lorsque la sélection change(value: Date | Date[])
selectDéclenché lors de la sélection d'une date (clic ou navigation clavier)(value: Date)

Slots : cell (cellule personnalisée), header (en-tête).

Accessibilité ​

  • Sémantique de grille role="grid" (lignes row, cellules gridcell), aria-current="date" sur le jour courant
  • Les touches directionnelles déplacent le focus entre les dates (±1 jour / ±7 jours), Home/End vont en début/fin de ligne, PageUp/Down changent de mois — conformément au pattern grid des APG
  • Les dates hors plage sont disabled en natif et exclues des interactions

Définitions de types ​

Les structures de types TypeScript exportées par ce composant sont présentées ci-dessous (extraction automatique à partir des sources packages/components/calendar/src/types.ts et @lh-ui/share/core/* ; cliquez sur chaque entrée pour afficher la définition complète ; la description des propriétés se trouve dans le tableau Props ci-dessus) :

LhCalendarMode
ts
/** Forme d'affichage : panel, panneau persistant (par défaut) / input, panneau replié déployé au clic sur le champ */
export type LhCalendarMode = 'panel' | 'input'
LhCalendarValue
ts
/** La forme de la valeur contrôlée dépend de selection : unique, Date / plage de dates, Date[] (début et fin, longueur 2) / sélection multiple, Date[].
 *  Pas de tuple [Date, Date] : le compilateur SFC ne peut pas déduire le type d'exécution à partir d'un tuple, ce qui produirait un avertissement de validation de prop */
export type LhCalendarValue = Date | Date[]
LhCalendarProps
ts
export interface LhCalendarProps {
  /** Sélection courante (v-model contrôlé ; à défaut, l'état de sélection est géré en interne au composant) */
  modelValue?: LhCalendarValue
  /** Mode de sélection : sélection unique (par défaut) / plage de dates (début et fin) / sélection multiple */
  selection?: LhCalendarSelection
  /** Contrainte de plage de dates sélectionnables */
  range?: LhCalendarRange
  /** Forme d'affichage : panel, panneau persistant (par défaut) / input, panneau replié déployé au clic sur le champ */
  mode?: LhCalendarMode
  /** Nombre de panneaux mensuels affichés simultanément (disposés en flex avec retour à la ligne) */
  panels?: number
  /** Texte indicatif en mode input */
  placeholder?: string
  /** Replier automatiquement le panneau après sélection en mode input */
  closeOnSelect?: boolean
  /** Propriétés de mise en page rapide sx */
  sx?: LhSxProps
}
LhCalendarSelection (provient de @lh-ui/share/core/calendar)
ts
/** Mode de sélection : sélection unique / plage de dates (début et fin) / sélection multiple */
export type LhCalendarSelection = 'single' | 'range' | 'multiple'
LhCalendarRange (provient de @lh-ui/share/core/calendar)
ts
/** Contrainte de plage de dates sélectionnables */
export type LhCalendarRange = [Date, Date]

La beauté de la tradition, la fondation du code