CDateInput
CDateInput — поле выбора даты: CTextField с CDatePicker в выпадающем меню. Оно наследует поведение обычного поля (label, details, clearable, disabled, readonly, rules, validate-on, preset) и добавляет календарь, форматирование, локаль, ручной ввод и ограничения дат.
Базовое использование
v-model держит Date | null. Меню открывается по фокусу или ArrowDown, закрывается по Escape, Tab, клику вне меню или выбору даты. Если значение пустое, календарь открывается на текущем месяце, но сегодняшняя дата не считается выбранной.
Показать код
<template>
<c-date-input
v-model="date"
label="Delivery date"
details="Pick a date from the calendar"
preset="input.dateBooking"
clearable
/>
</template>
<script setup lang="ts">
import { shallowRef } from 'vue'
const date = shallowRef<Date | null>(null)
</script>Формат и локаль
format управляет строкой в поле, locale управляет языком календаря и текстовых частей формата. Контракт локали такой же, как у CDatePicker: BCP-47 тег или частичное переопределение словаря.
Показать код
<template>
<c-date-input v-model="date" label="ISO" format="yyyy-MM-dd" />
<c-date-input v-model="date" label="Русский" format="d MMMM yyyy" locale="ru" />
</template>Ручной ввод
По умолчанию поле не редактируется: дату выбирают из меню. С typeable пользователь может набрать дату вручную:
- модель обновляется только когда строка целиком совпала с
formatи дата существует; - частичный ввод не портит текущее
v-model; - ручной ввод проходит те же
disabled-dates,min-dateиmax-date, что и календарь; - при
typeableстрелки остаются редактированию текста, а выбор в календаре работает мышью.
Парсер поддерживает числовые токены dd, d, MM, M, yyyy, yy.
Показать код
<template>
<c-date-input
v-model="date"
label="Departure"
format="dd.MM.yyyy"
details="Use dd.MM.yyyy, weekdays only"
typeable
clearable
:min-date="minDate"
:max-date="maxDate"
:disabled-dates="{ days: [0, 6] }"
/>
</template>Валидация и ограничения
rules получают Date | null из модели, а не отформатированную строку. Ограничения min-date, max-date, disabled-dates и highlighted-dates прокидываются в пикер внутри меню.
Показать код
<template>
<c-date-input
v-model="date"
label="Shipping date"
:rules="rules"
validate-on="input"
:min-date="minDate"
:max-date="maxDate"
:disabled-dates="disabledDates"
clearable
/>
</template>
<script setup lang="ts">
import { shallowRef } from 'vue'
const date = shallowRef<Date | null>(null)
const minDate = new Date()
const maxDate = new Date(2026, 7, 15)
const disabledDates = { days: [5] }
const rules = [(value?: Date | null) => ({ valid: !!value, message: 'Pick a shipping date' })]
</script>Слоты и пресеты
prepend, append и details принадлежат полю. Слоты date, week, dates, before-header, before-body, footer форвардятся в CDatePicker, поэтому меню можно дополнить легендами, маркерами и футером. Пресет инпута может содержать вложенный datePicker, чтобы поле и календарь выглядели как один компонент.
Показать код
<template>
<c-date-input
v-model="launch"
label="Launch date"
format="d MMM yyyy"
preset="input.dateCampaign"
:highlighted-dates="highlightedDates"
clearable
>
<template #prepend>
<c-icon name="fas:bell" source="fa" />
</template>
<template #before-body>
<div>Editorial milestones</div>
</template>
<template #date="{ date, isHighlighted }">
<span>{{ date }} <c-icon v-if="isHighlighted" name="fas:star" source="fa" /></span>
</template>
</c-date-input>
</template>const dateInputCampaign: CInputPreset = {
base: {
field: campaignField,
datePicker: campaignDatePicker,
},
}Клавиатура
ArrowDownEscape / TabHome, EndEnter / SpaceФокус остаётся в поле: клавиши доезжают до календаря через клавиатурный контур. В typeable режиме навигационные клавиши остаются текстовому вводу.
API
Пропы CDateInput
modelValueDate | nulltypeablebooleanfalseformatformatstring'dd.MM.yyyy'localestring | Partial<DateLocale>'en'monday-firstbooleanfalsedisabled-datesDisabledDateshighlighted-dates(Date | string)[]min-dateDate | stringmax-dateDate | stringТакже доступны пропсы внутреннего поля: label, placeholder, details, no-details, clearable, disabled, readonly, rules, validate-on, preset и остальные пропсы CInput / CTextField.
Events
update:modelValueDate | nullSlots
prependappenddetails{ errorMessage?: string, details?: string }dateDatePickerDate & { isSelected, isToday }week{ days: DatePickerWeekDay[] }dates{ dates: DatePickerEnrichedDate[], onSelect }before-headerDatePickerSlotApibefore-bodyDatePickerSlotApifooterDatePickerSlotApiПресеты
preset передаётся во внутренний CInput. Если в base-снимке лежит datePicker, календарь внутри меню получит его через контекст.
const booking: CInputPreset = {
base: {
field: bookingField,
menu: bookingMenu,
datePicker: bookingDatePicker,
},
error: {
details: ['text-red'],
},
}CSS-классы
c-date-inputCInputc-date-input--typeabletypeable