vectis-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE +27 -0
- package/README.md +354 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +8 -0
- package/dist/components/VAccordion/VAccordion.css +2 -0
- package/dist/components/VAccordion/VAccordion.d.ts +59 -0
- package/dist/components/VAccordion/VAccordion.js +9 -0
- package/dist/components/VAccordion/VAccordion.js.map +1 -0
- package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VAccordion/VAccordionItem.css +2 -0
- package/dist/components/VAccordion/VAccordionItem.d.ts +64 -0
- package/dist/components/VAccordion/VAccordionItem.js +9 -0
- package/dist/components/VAccordion/VAccordionItem.js.map +1 -0
- package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VAccordion/context.d.ts +18 -0
- package/dist/components/VAccordion/context.js +6 -0
- package/dist/components/VAccordion/context.js.map +1 -0
- package/dist/components/VAvatar/VAvatar.css +2 -0
- package/dist/components/VAvatar/VAvatar.d.ts +68 -0
- package/dist/components/VAvatar/VAvatar.js +9 -0
- package/dist/components/VAvatar/VAvatar.js.map +1 -0
- package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js +87 -0
- package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VAvatar/VAvatarGroup.css +2 -0
- package/dist/components/VAvatar/VAvatarGroup.d.ts +59 -0
- package/dist/components/VAvatar/VAvatarGroup.js +9 -0
- package/dist/components/VAvatar/VAvatarGroup.js.map +1 -0
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +43 -0
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VAvatar/context.d.ts +17 -0
- package/dist/components/VAvatar/context.js +6 -0
- package/dist/components/VAvatar/context.js.map +1 -0
- package/dist/components/VBadge/VBadge.css +2 -0
- package/dist/components/VBadge/VBadge.d.ts +74 -0
- package/dist/components/VBadge/VBadge.js +9 -0
- package/dist/components/VBadge/VBadge.js.map +1 -0
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +40 -0
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.css +2 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.d.ts +68 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.js +9 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VButton/VButton.css +2 -0
- package/dist/components/VButton/VButton.d.ts +88 -0
- package/dist/components/VButton/VButton.js +9 -0
- package/dist/components/VButton/VButton.js.map +1 -0
- package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js +86 -0
- package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VButton/VButtonGroup.css +2 -0
- package/dist/components/VButton/VButtonGroup.d.ts +32 -0
- package/dist/components/VButton/VButtonGroup.js +9 -0
- package/dist/components/VButton/VButtonGroup.js.map +1 -0
- package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js +17 -0
- package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/VCalendar.css +2 -0
- package/dist/components/VCalendar/VCalendar.d.ts +129 -0
- package/dist/components/VCalendar/VCalendar.js +9 -0
- package/dist/components/VCalendar/VCalendar.js.map +1 -0
- package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +374 -0
- package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/VCalendarEvent.css +2 -0
- package/dist/components/VCalendar/VCalendarEvent.d.ts +71 -0
- package/dist/components/VCalendar/VCalendarEvent.js +9 -0
- package/dist/components/VCalendar/VCalendarEvent.js.map +1 -0
- package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js +106 -0
- package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/VCalendarMonth.css +2 -0
- package/dist/components/VCalendar/VCalendarMonth.d.ts +60 -0
- package/dist/components/VCalendar/VCalendarMonth.js +9 -0
- package/dist/components/VCalendar/VCalendarMonth.js.map +1 -0
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +342 -0
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.css +2 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +85 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.js +9 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +621 -0
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/VCalendarYear.css +2 -0
- package/dist/components/VCalendar/VCalendarYear.d.ts +31 -0
- package/dist/components/VCalendar/VCalendarYear.js +9 -0
- package/dist/components/VCalendar/VCalendarYear.js.map +1 -0
- package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js +76 -0
- package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCalendar/color.d.ts +9 -0
- package/dist/components/VCalendar/color.js +9 -0
- package/dist/components/VCalendar/color.js.map +1 -0
- package/dist/components/VCalendar/edgeStep.d.ts +38 -0
- package/dist/components/VCalendar/edgeStep.js +28 -0
- package/dist/components/VCalendar/edgeStep.js.map +1 -0
- package/dist/components/VCalendar/keyboard.d.ts +78 -0
- package/dist/components/VCalendar/keyboard.js +86 -0
- package/dist/components/VCalendar/keyboard.js.map +1 -0
- package/dist/components/VCalendar/layout.d.ts +355 -0
- package/dist/components/VCalendar/layout.js +292 -0
- package/dist/components/VCalendar/layout.js.map +1 -0
- package/dist/components/VCalendar/types.d.ts +78 -0
- package/dist/components/VCarousel/VCarousel.css +2 -0
- package/dist/components/VCarousel/VCarousel.d.ts +241 -0
- package/dist/components/VCarousel/VCarousel.js +9 -0
- package/dist/components/VCarousel/VCarousel.js.map +1 -0
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +262 -0
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCarousel/VCarouselItem.d.ts +41 -0
- package/dist/components/VCarousel/VCarouselItem.js +7 -0
- package/dist/components/VCarousel/VCarouselItem.js.map +1 -0
- package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js +25 -0
- package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCarousel/context.d.ts +23 -0
- package/dist/components/VCarousel/context.js +6 -0
- package/dist/components/VCarousel/context.js.map +1 -0
- package/dist/components/VCheckbox/VCheckbox.css +2 -0
- package/dist/components/VCheckbox/VCheckbox.d.ts +63 -0
- package/dist/components/VCheckbox/VCheckbox.js +9 -0
- package/dist/components/VCheckbox/VCheckbox.js.map +1 -0
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VChip/VChip.css +2 -0
- package/dist/components/VChip/VChip.d.ts +120 -0
- package/dist/components/VChip/VChip.js +9 -0
- package/dist/components/VChip/VChip.js.map +1 -0
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +118 -0
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCombobox/VCombobox.css +2 -0
- package/dist/components/VCombobox/VCombobox.d.ts +183 -0
- package/dist/components/VCombobox/VCombobox.js +9 -0
- package/dist/components/VCombobox/VCombobox.js.map +1 -0
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +428 -0
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCombobox/VComboboxGroup.css +2 -0
- package/dist/components/VCombobox/VComboboxGroup.d.ts +26 -0
- package/dist/components/VCombobox/VComboboxGroup.js +9 -0
- package/dist/components/VCombobox/VComboboxGroup.js.map +1 -0
- package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
- package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCombobox/VComboboxOption.css +2 -0
- package/dist/components/VCombobox/VComboboxOption.d.ts +48 -0
- package/dist/components/VCombobox/VComboboxOption.js +9 -0
- package/dist/components/VCombobox/VComboboxOption.js.map +1 -0
- package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCombobox/VComboboxSeparator.css +2 -0
- package/dist/components/VCombobox/VComboboxSeparator.d.ts +3 -0
- package/dist/components/VCombobox/VComboboxSeparator.js +9 -0
- package/dist/components/VCombobox/VComboboxSeparator.js.map +1 -0
- package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCombobox/infiniteScroll.d.ts +22 -0
- package/dist/components/VCombobox/infiniteScroll.js +28 -0
- package/dist/components/VCombobox/infiniteScroll.js.map +1 -0
- package/dist/components/VDataTable/VDataTable.css +2 -0
- package/dist/components/VDataTable/VDataTable.d.ts +214 -0
- package/dist/components/VDataTable/VDataTable.js +9 -0
- package/dist/components/VDataTable/VDataTable.js.map +1 -0
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +396 -0
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VDateInput/VDateInput.css +2 -0
- package/dist/components/VDateInput/VDateInput.d.ts +152 -0
- package/dist/components/VDateInput/VDateInput.js +9 -0
- package/dist/components/VDateInput/VDateInput.js.map +1 -0
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +324 -0
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VDatePicker/VDatePicker.css +2 -0
- package/dist/components/VDatePicker/VDatePicker.d.ts +143 -0
- package/dist/components/VDatePicker/VDatePicker.js +9 -0
- package/dist/components/VDatePicker/VDatePicker.js.map +1 -0
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +454 -0
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VDatePicker/keyboard.d.ts +56 -0
- package/dist/components/VDatePicker/keyboard.js +26 -0
- package/dist/components/VDatePicker/keyboard.js.map +1 -0
- package/dist/components/VDialog/VDialog.css +2 -0
- package/dist/components/VDialog/VDialog.d.ts +96 -0
- package/dist/components/VDialog/VDialog.js +9 -0
- package/dist/components/VDialog/VDialog.js.map +1 -0
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +134 -0
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VDialog/VDialogAlert.d.ts +67 -0
- package/dist/components/VDialog/VDialogAlert.js +7 -0
- package/dist/components/VDialog/VDialogAlert.js.map +1 -0
- package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js +60 -0
- package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VFileInput/VFileInput.css +2 -0
- package/dist/components/VFileInput/VFileInput.d.ts +156 -0
- package/dist/components/VFileInput/VFileInput.js +9 -0
- package/dist/components/VFileInput/VFileInput.js.map +1 -0
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +244 -0
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VFileInput/truncate.d.ts +29 -0
- package/dist/components/VFileInput/truncate.js +10 -0
- package/dist/components/VFileInput/truncate.js.map +1 -0
- package/dist/components/VFilePicker/VFilePicker.css +2 -0
- package/dist/components/VFilePicker/VFilePicker.d.ts +203 -0
- package/dist/components/VFilePicker/VFilePicker.js +9 -0
- package/dist/components/VFilePicker/VFilePicker.js.map +1 -0
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +266 -0
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VFilePicker/fileKind.d.ts +29 -0
- package/dist/components/VFilePicker/fileKind.js +91 -0
- package/dist/components/VFilePicker/fileKind.js.map +1 -0
- package/dist/components/VHotkeys/VHotkeys.css +2 -0
- package/dist/components/VHotkeys/VHotkeys.d.ts +100 -0
- package/dist/components/VHotkeys/VHotkeys.js +9 -0
- package/dist/components/VHotkeys/VHotkeys.js.map +1 -0
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +76 -0
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VHotkeys/platform.d.ts +82 -0
- package/dist/components/VHotkeys/platform.js +115 -0
- package/dist/components/VHotkeys/platform.js.map +1 -0
- package/dist/components/VIcon/VIcon.css +2 -0
- package/dist/components/VIcon/VIcon.d.ts +57 -0
- package/dist/components/VIcon/VIcon.js +9 -0
- package/dist/components/VIcon/VIcon.js.map +1 -0
- package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js +99 -0
- package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VIcon/iconProps.d.ts +30 -0
- package/dist/components/VIcon/iconProps.js +6 -0
- package/dist/components/VIcon/iconProps.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_downward.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_downward.js +9 -0
- package/dist/components/VIcon/icons/arrow_downward.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_downward_alt.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_downward_alt.js +9 -0
- package/dist/components/VIcon/icons/arrow_downward_alt.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_drop_down.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_drop_down.js +9 -0
- package/dist/components/VIcon/icons/arrow_drop_down.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_drop_up.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_drop_up.js +9 -0
- package/dist/components/VIcon/icons/arrow_drop_up.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_left_alt.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_left_alt.js +9 -0
- package/dist/components/VIcon/icons/arrow_left_alt.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_right_alt.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_right_alt.js +9 -0
- package/dist/components/VIcon/icons/arrow_right_alt.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_upward.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_upward.js +9 -0
- package/dist/components/VIcon/icons/arrow_upward.js.map +1 -0
- package/dist/components/VIcon/icons/arrow_upward_alt.d.ts +5 -0
- package/dist/components/VIcon/icons/arrow_upward_alt.js +9 -0
- package/dist/components/VIcon/icons/arrow_upward_alt.js.map +1 -0
- package/dist/components/VIcon/icons/attach_file.d.ts +5 -0
- package/dist/components/VIcon/icons/attach_file.js +9 -0
- package/dist/components/VIcon/icons/attach_file.js.map +1 -0
- package/dist/components/VIcon/icons/audio_file.d.ts +5 -0
- package/dist/components/VIcon/icons/audio_file.js +9 -0
- package/dist/components/VIcon/icons/audio_file.js.map +1 -0
- package/dist/components/VIcon/icons/calendar_today.d.ts +5 -0
- package/dist/components/VIcon/icons/calendar_today.js +9 -0
- package/dist/components/VIcon/icons/calendar_today.js.map +1 -0
- package/dist/components/VIcon/icons/check.d.ts +5 -0
- package/dist/components/VIcon/icons/check.js +9 -0
- package/dist/components/VIcon/icons/check.js.map +1 -0
- package/dist/components/VIcon/icons/check_circle.d.ts +5 -0
- package/dist/components/VIcon/icons/check_circle.js +9 -0
- package/dist/components/VIcon/icons/check_circle.js.map +1 -0
- package/dist/components/VIcon/icons/chevron_left.d.ts +5 -0
- package/dist/components/VIcon/icons/chevron_left.js +9 -0
- package/dist/components/VIcon/icons/chevron_left.js.map +1 -0
- package/dist/components/VIcon/icons/chevron_right.d.ts +5 -0
- package/dist/components/VIcon/icons/chevron_right.js +9 -0
- package/dist/components/VIcon/icons/chevron_right.js.map +1 -0
- package/dist/components/VIcon/icons/close.d.ts +5 -0
- package/dist/components/VIcon/icons/close.js +9 -0
- package/dist/components/VIcon/icons/close.js.map +1 -0
- package/dist/components/VIcon/icons/cloud_upload.d.ts +5 -0
- package/dist/components/VIcon/icons/cloud_upload.js +9 -0
- package/dist/components/VIcon/icons/cloud_upload.js.map +1 -0
- package/dist/components/VIcon/icons/code.d.ts +5 -0
- package/dist/components/VIcon/icons/code.js +9 -0
- package/dist/components/VIcon/icons/code.js.map +1 -0
- package/dist/components/VIcon/icons/description.d.ts +5 -0
- package/dist/components/VIcon/icons/description.js +9 -0
- package/dist/components/VIcon/icons/description.js.map +1 -0
- package/dist/components/VIcon/icons/error.d.ts +5 -0
- package/dist/components/VIcon/icons/error.js +9 -0
- package/dist/components/VIcon/icons/error.js.map +1 -0
- package/dist/components/VIcon/icons/expand_less.d.ts +5 -0
- package/dist/components/VIcon/icons/expand_less.js +9 -0
- package/dist/components/VIcon/icons/expand_less.js.map +1 -0
- package/dist/components/VIcon/icons/expand_more.d.ts +5 -0
- package/dist/components/VIcon/icons/expand_more.js +9 -0
- package/dist/components/VIcon/icons/expand_more.js.map +1 -0
- package/dist/components/VIcon/icons/folder_zip.d.ts +5 -0
- package/dist/components/VIcon/icons/folder_zip.js +9 -0
- package/dist/components/VIcon/icons/folder_zip.js.map +1 -0
- package/dist/components/VIcon/icons/image.d.ts +5 -0
- package/dist/components/VIcon/icons/image.js +9 -0
- package/dist/components/VIcon/icons/image.js.map +1 -0
- package/dist/components/VIcon/icons/index.d.ts +183 -0
- package/dist/components/VIcon/icons/index.js +77 -0
- package/dist/components/VIcon/icons/index.js.map +1 -0
- package/dist/components/VIcon/icons/info.d.ts +5 -0
- package/dist/components/VIcon/icons/info.js +9 -0
- package/dist/components/VIcon/icons/info.js.map +1 -0
- package/dist/components/VIcon/icons/more_horiz.d.ts +5 -0
- package/dist/components/VIcon/icons/more_horiz.js +9 -0
- package/dist/components/VIcon/icons/more_horiz.js.map +1 -0
- package/dist/components/VIcon/icons/names.d.ts +11 -0
- package/dist/components/VIcon/icons/names.js +5 -0
- package/dist/components/VIcon/icons/names.js.map +1 -0
- package/dist/components/VIcon/icons/notifications.d.ts +5 -0
- package/dist/components/VIcon/icons/notifications.js +9 -0
- package/dist/components/VIcon/icons/notifications.js.map +1 -0
- package/dist/components/VIcon/icons/picture_as_pdf.d.ts +5 -0
- package/dist/components/VIcon/icons/picture_as_pdf.js +9 -0
- package/dist/components/VIcon/icons/picture_as_pdf.js.map +1 -0
- package/dist/components/VIcon/icons/schedule.d.ts +5 -0
- package/dist/components/VIcon/icons/schedule.js +9 -0
- package/dist/components/VIcon/icons/schedule.js.map +1 -0
- package/dist/components/VIcon/icons/search.d.ts +5 -0
- package/dist/components/VIcon/icons/search.js +9 -0
- package/dist/components/VIcon/icons/search.js.map +1 -0
- package/dist/components/VIcon/icons/swap_vert.d.ts +5 -0
- package/dist/components/VIcon/icons/swap_vert.js +9 -0
- package/dist/components/VIcon/icons/swap_vert.js.map +1 -0
- package/dist/components/VIcon/icons/table_chart.d.ts +5 -0
- package/dist/components/VIcon/icons/table_chart.js +9 -0
- package/dist/components/VIcon/icons/table_chart.js.map +1 -0
- package/dist/components/VIcon/icons/video_file.d.ts +5 -0
- package/dist/components/VIcon/icons/video_file.js +9 -0
- package/dist/components/VIcon/icons/video_file.js.map +1 -0
- package/dist/components/VIcon/icons/viewBox.d.ts +6 -0
- package/dist/components/VIcon/icons/viewBox.js +6 -0
- package/dist/components/VIcon/icons/viewBox.js.map +1 -0
- package/dist/components/VIcon/icons/warning.d.ts +5 -0
- package/dist/components/VIcon/icons/warning.js +9 -0
- package/dist/components/VIcon/icons/warning.js.map +1 -0
- package/dist/components/VIcon/resolver.d.ts +76 -0
- package/dist/components/VIcon/resolver.js +35 -0
- package/dist/components/VIcon/resolver.js.map +1 -0
- package/dist/components/VIcon/types.d.ts +77 -0
- package/dist/components/VIconButton/VIconButton.css +2 -0
- package/dist/components/VIconButton/VIconButton.d.ts +66 -0
- package/dist/components/VIconButton/VIconButton.js +9 -0
- package/dist/components/VIconButton/VIconButton.js.map +1 -0
- package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VInput/VInput.css +2 -0
- package/dist/components/VInput/VInput.d.ts +152 -0
- package/dist/components/VInput/VInput.js +9 -0
- package/dist/components/VInput/VInput.js.map +1 -0
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +185 -0
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VInputOTP/VInputOTP.css +2 -0
- package/dist/components/VInputOTP/VInputOTP.d.ts +76 -0
- package/dist/components/VInputOTP/VInputOTP.js +9 -0
- package/dist/components/VInputOTP/VInputOTP.js.map +1 -0
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +149 -0
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenu.d.ts +91 -0
- package/dist/components/VMenu/VMenu.js +7 -0
- package/dist/components/VMenu/VMenu.js.map +1 -0
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +73 -0
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenuGroup.css +2 -0
- package/dist/components/VMenu/VMenuGroup.d.ts +22 -0
- package/dist/components/VMenu/VMenuGroup.js +9 -0
- package/dist/components/VMenu/VMenuGroup.js.map +1 -0
- package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js +21 -0
- package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenuItem.css +2 -0
- package/dist/components/VMenu/VMenuItem.d.ts +85 -0
- package/dist/components/VMenu/VMenuItem.js +9 -0
- package/dist/components/VMenu/VMenuItem.js.map +1 -0
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +121 -0
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenuPanel.css +2 -0
- package/dist/components/VMenu/VMenuPanel.d.ts +91 -0
- package/dist/components/VMenu/VMenuPanel.js +9 -0
- package/dist/components/VMenu/VMenuPanel.js.map +1 -0
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +103 -0
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenuSeparator.css +2 -0
- package/dist/components/VMenu/VMenuSeparator.d.ts +3 -0
- package/dist/components/VMenu/VMenuSeparator.js +9 -0
- package/dist/components/VMenu/VMenuSeparator.js.map +1 -0
- package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/context.d.ts +33 -0
- package/dist/components/VMenu/context.js +9 -0
- package/dist/components/VMenu/context.js.map +1 -0
- package/dist/components/VPagination/VPagination.css +2 -0
- package/dist/components/VPagination/VPagination.d.ts +103 -0
- package/dist/components/VPagination/VPagination.js +9 -0
- package/dist/components/VPagination/VPagination.js.map +1 -0
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +270 -0
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VPopover/VPopover.css +2 -0
- package/dist/components/VPopover/VPopover.d.ts +82 -0
- package/dist/components/VPopover/VPopover.js +9 -0
- package/dist/components/VPopover/VPopover.js.map +1 -0
- package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VProgressCircular/VProgressCircular.css +2 -0
- package/dist/components/VProgressCircular/VProgressCircular.d.ts +60 -0
- package/dist/components/VProgressCircular/VProgressCircular.js +9 -0
- package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -0
- package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js +74 -0
- package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VProgressLinear/VProgressLinear.css +2 -0
- package/dist/components/VProgressLinear/VProgressLinear.d.ts +74 -0
- package/dist/components/VProgressLinear/VProgressLinear.js +9 -0
- package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -0
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +74 -0
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VRadio/VRadio.css +2 -0
- package/dist/components/VRadio/VRadio.d.ts +58 -0
- package/dist/components/VRadio/VRadio.js +9 -0
- package/dist/components/VRadio/VRadio.js.map +1 -0
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +60 -0
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSeparator/VSeparator.css +2 -0
- package/dist/components/VSeparator/VSeparator.d.ts +23 -0
- package/dist/components/VSeparator/VSeparator.js +9 -0
- package/dist/components/VSeparator/VSeparator.js.map +1 -0
- package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js +17 -0
- package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigation.css +2 -0
- package/dist/components/VSideNavigation/VSideNavigation.d.ts +64 -0
- package/dist/components/VSideNavigation/VSideNavigation.js +9 -0
- package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +67 -0
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.css +2 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.d.ts +33 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.js +9 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js +20 -0
- package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.css +2 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +103 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.js +9 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +154 -0
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSideNavigation/VSideNavigationSeparator.css +2 -0
- package/dist/components/VSideNavigation/VSideNavigationSeparator.d.ts +3 -0
- package/dist/components/VSideNavigation/VSideNavigationSeparator.js +17 -0
- package/dist/components/VSideNavigation/VSideNavigationSeparator.js.map +1 -0
- package/dist/components/VSideNavigation/context.d.ts +37 -0
- package/dist/components/VSideNavigation/context.js +6 -0
- package/dist/components/VSideNavigation/context.js.map +1 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.css +2 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +75 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.js +9 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js +61 -0
- package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSlider/VSlider.css +2 -0
- package/dist/components/VSlider/VSlider.d.ts +82 -0
- package/dist/components/VSlider/VSlider.js +9 -0
- package/dist/components/VSlider/VSlider.js.map +1 -0
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +220 -0
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSnackbar/VSnackbar.css +2 -0
- package/dist/components/VSnackbar/VSnackbar.d.ts +51 -0
- package/dist/components/VSnackbar/VSnackbar.js +9 -0
- package/dist/components/VSnackbar/VSnackbar.js.map +1 -0
- package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSnackbar/state.d.ts +92 -0
- package/dist/components/VSnackbar/state.js +18 -0
- package/dist/components/VSnackbar/state.js.map +1 -0
- package/dist/components/VSpinner/VSpinner.css +2 -0
- package/dist/components/VSpinner/VSpinner.d.ts +21 -0
- package/dist/components/VSpinner/VSpinner.js +9 -0
- package/dist/components/VSpinner/VSpinner.js.map +1 -0
- package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js +25 -0
- package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSwitch/VSwitch.css +2 -0
- package/dist/components/VSwitch/VSwitch.d.ts +46 -0
- package/dist/components/VSwitch/VSwitch.js +9 -0
- package/dist/components/VSwitch/VSwitch.js.map +1 -0
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +51 -0
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTabs/VTab.css +2 -0
- package/dist/components/VTabs/VTab.d.ts +42 -0
- package/dist/components/VTabs/VTab.js +9 -0
- package/dist/components/VTabs/VTab.js.map +1 -0
- package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js +66 -0
- package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTabs/VTabPanel.css +2 -0
- package/dist/components/VTabs/VTabPanel.d.ts +34 -0
- package/dist/components/VTabs/VTabPanel.js +9 -0
- package/dist/components/VTabs/VTabPanel.js.map +1 -0
- package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTabs/VTabs.css +2 -0
- package/dist/components/VTabs/VTabs.d.ts +107 -0
- package/dist/components/VTabs/VTabs.js +9 -0
- package/dist/components/VTabs/VTabs.js.map +1 -0
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +199 -0
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTabs/context.d.ts +43 -0
- package/dist/components/VTabs/context.js +6 -0
- package/dist/components/VTabs/context.js.map +1 -0
- package/dist/components/VTextarea/VTextarea.css +2 -0
- package/dist/components/VTextarea/VTextarea.d.ts +140 -0
- package/dist/components/VTextarea/VTextarea.js +9 -0
- package/dist/components/VTextarea/VTextarea.js.map +1 -0
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTimeInput/VTimeInput.css +2 -0
- package/dist/components/VTimeInput/VTimeInput.d.ts +112 -0
- package/dist/components/VTimeInput/VTimeInput.js +9 -0
- package/dist/components/VTimeInput/VTimeInput.js.map +1 -0
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +385 -0
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTimePicker/VTimePicker.css +2 -0
- package/dist/components/VTimePicker/VTimePicker.d.ts +89 -0
- package/dist/components/VTimePicker/VTimePicker.js +9 -0
- package/dist/components/VTimePicker/VTimePicker.js.map +1 -0
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +257 -0
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VToast/VToast.css +2 -0
- package/dist/components/VToast/VToast.d.ts +24 -0
- package/dist/components/VToast/VToast.js +9 -0
- package/dist/components/VToast/VToast.js.map +1 -0
- package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VToast/VToaster.css +2 -0
- package/dist/components/VToast/VToaster.d.ts +42 -0
- package/dist/components/VToast/VToaster.js +9 -0
- package/dist/components/VToast/VToaster.js.map +1 -0
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +112 -0
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VToast/state.d.ts +74 -0
- package/dist/components/VToast/state.js +25 -0
- package/dist/components/VToast/state.js.map +1 -0
- package/dist/components/VToggle/VToggle.css +2 -0
- package/dist/components/VToggle/VToggle.d.ts +84 -0
- package/dist/components/VToggle/VToggle.js +9 -0
- package/dist/components/VToggle/VToggle.js.map +1 -0
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +103 -0
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VToggle/VToggleItem.css +2 -0
- package/dist/components/VToggle/VToggleItem.d.ts +35 -0
- package/dist/components/VToggle/VToggleItem.js +9 -0
- package/dist/components/VToggle/VToggleItem.js.map +1 -0
- package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js +51 -0
- package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VToggle/context.d.ts +37 -0
- package/dist/components/VToggle/context.js +6 -0
- package/dist/components/VToggle/context.js.map +1 -0
- package/dist/components/VTooltip/VTooltip.css +2 -0
- package/dist/components/VTooltip/VTooltip.d.ts +76 -0
- package/dist/components/VTooltip/VTooltip.js +9 -0
- package/dist/components/VTooltip/VTooltip.js.map +1 -0
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +50 -0
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTypography/VTypography.css +2 -0
- package/dist/components/VTypography/VTypography.d.ts +46 -0
- package/dist/components/VTypography/VTypography.js +9 -0
- package/dist/components/VTypography/VTypography.js.map +1 -0
- package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js +49 -0
- package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/composables/useAriaLabel.d.ts +19 -0
- package/dist/composables/useAriaLabel.js +10 -0
- package/dist/composables/useAriaLabel.js.map +1 -0
- package/dist/composables/useFieldIds.d.ts +21 -0
- package/dist/composables/useFieldIds.js +14 -0
- package/dist/composables/useFieldIds.js.map +1 -0
- package/dist/composables/useFieldPanel.d.ts +61 -0
- package/dist/composables/useFieldPanel.js +39 -0
- package/dist/composables/useFieldPanel.js.map +1 -0
- package/dist/composables/useFileDrop.d.ts +30 -0
- package/dist/composables/useFileDrop.js +28 -0
- package/dist/composables/useFileDrop.js.map +1 -0
- package/dist/composables/useFileField.d.ts +36 -0
- package/dist/composables/useFileField.js +45 -0
- package/dist/composables/useFileField.js.map +1 -0
- package/dist/composables/useFocusoutDismiss.d.ts +17 -0
- package/dist/composables/useFocusoutDismiss.js +11 -0
- package/dist/composables/useFocusoutDismiss.js.map +1 -0
- package/dist/composables/useIconClickHandlers.d.ts +27 -0
- package/dist/composables/useIconClickHandlers.js +13 -0
- package/dist/composables/useIconClickHandlers.js.map +1 -0
- package/dist/composables/useMaskedField.d.ts +65 -0
- package/dist/composables/useMaskedField.js +54 -0
- package/dist/composables/useMaskedField.js.map +1 -0
- package/dist/composables/usePopover.d.ts +7 -0
- package/dist/composables/usePopover.js +24 -0
- package/dist/composables/usePopover.js.map +1 -0
- package/dist/composables/useProgressValue.d.ts +13 -0
- package/dist/composables/useProgressValue.js +14 -0
- package/dist/composables/useProgressValue.js.map +1 -0
- package/dist/composables/useRootAttrs.d.ts +34 -0
- package/dist/composables/useRootAttrs.js +15 -0
- package/dist/composables/useRootAttrs.js.map +1 -0
- package/dist/composables/useTextLimit.d.ts +31 -0
- package/dist/composables/useTextLimit.js +19 -0
- package/dist/composables/useTextLimit.js.map +1 -0
- package/dist/composables/useTimer.d.ts +18 -0
- package/dist/composables/useTimer.js +19 -0
- package/dist/composables/useTimer.js.map +1 -0
- package/dist/i18n/en.d.ts +10 -0
- package/dist/i18n/en.js +179 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/fr.d.ts +18 -0
- package/dist/i18n/fr.js +179 -0
- package/dist/i18n/fr.js.map +1 -0
- package/dist/i18n/state.d.ts +64 -0
- package/dist/i18n/state.js +40 -0
- package/dist/i18n/state.js.map +1 -0
- package/dist/i18n/types.d.ts +345 -0
- package/dist/icons.d.ts +16 -0
- package/dist/icons.js +38 -0
- package/dist/index.d.ts +90 -0
- package/dist/index.js +64 -0
- package/dist/styles.css +1 -0
- package/dist/tokens/css.d.ts +25 -0
- package/dist/tokens/css.js +29 -0
- package/dist/tokens/css.js.map +1 -0
- package/dist/tokens/index.d.ts +370 -0
- package/dist/tokens/index.js +15 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/primitives.d.ts +101 -0
- package/dist/tokens/primitives.js +166 -0
- package/dist/tokens/primitives.js.map +1 -0
- package/dist/tokens/semantic.d.ts +236 -0
- package/dist/tokens/semantic.js +219 -0
- package/dist/tokens/semantic.js.map +1 -0
- package/dist/tokens/themes/dark.d.ts +49 -0
- package/dist/tokens/themes/dark.js +53 -0
- package/dist/tokens/themes/dark.js.map +1 -0
- package/dist/tokens/types.d.ts +38 -0
- package/dist/tokens/types.js +16 -0
- package/dist/tokens/types.js.map +1 -0
- package/dist/tokens.json +1516 -0
- package/dist/utils/array.d.ts +10 -0
- package/dist/utils/array.js +8 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/arrowNav.d.ts +27 -0
- package/dist/utils/arrowNav.js +26 -0
- package/dist/utils/arrowNav.js.map +1 -0
- package/dist/utils/chip.d.ts +26 -0
- package/dist/utils/chip.js +13 -0
- package/dist/utils/chip.js.map +1 -0
- package/dist/utils/css.d.ts +19 -0
- package/dist/utils/css.js +13 -0
- package/dist/utils/css.js.map +1 -0
- package/dist/utils/date.d.ts +199 -0
- package/dist/utils/date.js +225 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/direction.d.ts +18 -0
- package/dist/utils/direction.js +8 -0
- package/dist/utils/direction.js.map +1 -0
- package/dist/utils/env.d.ts +10 -0
- package/dist/utils/file.d.ts +95 -0
- package/dist/utils/file.js +70 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/focus.d.ts +24 -0
- package/dist/utils/focus.js +13 -0
- package/dist/utils/focus.js.map +1 -0
- package/dist/utils/matcher.d.ts +13 -0
- package/dist/utils/matcher.js +11 -0
- package/dist/utils/matcher.js.map +1 -0
- package/dist/utils/number.d.ts +9 -0
- package/dist/utils/number.js +8 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/text.d.ts +19 -0
- package/dist/utils/text.js +12 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/utils/time.d.ts +138 -0
- package/dist/utils/time.js +123 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/vnode.d.ts +21 -0
- package/dist/utils/vnode.js +14 -0
- package/dist/utils/vnode.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { useLocale as e, useMessages as t } from "../../i18n/state.js";
|
|
2
|
+
import n from "../VPopover/VPopover.js";
|
|
3
|
+
import r from "../VButton/VButton.js";
|
|
4
|
+
import { arrowNavigate as i } from "../../utils/arrowNav.js";
|
|
5
|
+
import { clamp as ee } from "../../utils/number.js";
|
|
6
|
+
import { expand_more as a } from "../VIcon/icons/expand_more.js";
|
|
7
|
+
import { useRootAttrs as o } from "../../composables/useRootAttrs.js";
|
|
8
|
+
import s from "../VToggle/VToggle.js";
|
|
9
|
+
import c from "../VToggle/VToggleItem.js";
|
|
10
|
+
import te from "../VInput/VInput.js";
|
|
11
|
+
import { digitsOf as l } from "../../utils/text.js";
|
|
12
|
+
import { useFieldPanel as ne } from "../../composables/useFieldPanel.js";
|
|
13
|
+
import { useMaskedField as re } from "../../composables/useMaskedField.js";
|
|
14
|
+
import { formatDisplay as ie, formatTime as u, formatTimeMask as d, hourCycleFor as ae, isValidTime as oe, minutesOf as se, parseTime as f, parseTimeMask as ce, snapMinute as le, timeCaret as p, timeList as ue, timeToMask as m, to12h as h, to24h as g } from "../../utils/time.js";
|
|
15
|
+
import de from "../VTimePicker/VTimePicker.js";
|
|
16
|
+
import { schedule as _ } from "../VIcon/icons/schedule.js";
|
|
17
|
+
import { Fragment as fe, computed as v, createBlock as y, createCommentVNode as pe, createElementBlock as b, createElementVNode as me, createTextVNode as he, createVNode as x, defineComponent as ge, isRef as _e, mergeModels as S, mergeProps as ve, normalizeClass as ye, normalizeStyle as be, openBlock as C, ref as w, renderList as xe, toDisplayString as T, unref as E, useId as Se, useModel as Ce, withCtx as D } from "vue";
|
|
18
|
+
//#region src/components/VTimeInput/VTimeInput.vue?vue&type=script&setup=true&lang.ts
|
|
19
|
+
var we = ["data-open", "data-mode"], Te = { class: "v-time-input-row" }, Ee = [
|
|
20
|
+
"data-value",
|
|
21
|
+
"aria-selected",
|
|
22
|
+
"onClick"
|
|
23
|
+
], O = /*@__PURE__*/ ge({
|
|
24
|
+
inheritAttrs: !1,
|
|
25
|
+
__name: "VTimeInput",
|
|
26
|
+
props: /*@__PURE__*/ S({
|
|
27
|
+
format: { default: void 0 },
|
|
28
|
+
mode: { default: void 0 },
|
|
29
|
+
showPicker: {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: void 0
|
|
32
|
+
},
|
|
33
|
+
minuteStep: { default: 1 },
|
|
34
|
+
locale: { default: void 0 },
|
|
35
|
+
label: { default: void 0 },
|
|
36
|
+
hint: { default: void 0 },
|
|
37
|
+
placeholder: { default: void 0 },
|
|
38
|
+
size: { default: "md" },
|
|
39
|
+
compact: {
|
|
40
|
+
type: Boolean,
|
|
41
|
+
default: !1
|
|
42
|
+
},
|
|
43
|
+
disabled: {
|
|
44
|
+
type: Boolean,
|
|
45
|
+
default: !1
|
|
46
|
+
},
|
|
47
|
+
invalid: {
|
|
48
|
+
type: Boolean,
|
|
49
|
+
default: !1
|
|
50
|
+
},
|
|
51
|
+
clearable: {
|
|
52
|
+
type: Boolean,
|
|
53
|
+
default: !0
|
|
54
|
+
},
|
|
55
|
+
pickerIcon: { default: () => _ },
|
|
56
|
+
placement: { default: "bottom-start" }
|
|
57
|
+
}, {
|
|
58
|
+
modelValue: { default: null },
|
|
59
|
+
modelModifiers: {}
|
|
60
|
+
}),
|
|
61
|
+
emits: ["update:modelValue"],
|
|
62
|
+
setup(_) {
|
|
63
|
+
let ge = [
|
|
64
|
+
"readonly",
|
|
65
|
+
"input",
|
|
66
|
+
"list"
|
|
67
|
+
], S = _, O = Ce(_, "modelValue"), { rootClass: De, rootStyle: Oe, forwardedAttrs: ke } = o(), k = w(null), A = w(null), j = w(null), M = w(null), N = Se(), P = v(() => j.value?.el ?? null), F = v(() => {
|
|
68
|
+
let e = S.mode ?? "input";
|
|
69
|
+
return ge.includes(e) ? e : "input";
|
|
70
|
+
}), I = v(() => F.value === "input"), L = v(() => F.value === "list"), R = v(() => F.value === "readonly" || I.value && S.showPicker === !0), z = v(() => R.value || L.value), Ae = e(), B = v(() => S.locale ?? Ae.value), V = v(() => S.format ?? ae(B.value)), H = w(null), U = v(() => f(O.value)), je = w("AM"), W = v({
|
|
71
|
+
get: () => {
|
|
72
|
+
let e = G.value && R.value ? f(H.value) : U.value;
|
|
73
|
+
return e ? h(e.hour).meridiem : je.value;
|
|
74
|
+
},
|
|
75
|
+
set: (e) => {
|
|
76
|
+
let t = e === "PM" ? "PM" : "AM";
|
|
77
|
+
je.value = t;
|
|
78
|
+
let n = U.value;
|
|
79
|
+
n && (O.value = u(g(h(n.hour).hour, t), n.minute));
|
|
80
|
+
let r = G.value && R.value ? f(H.value) : null;
|
|
81
|
+
r && (H.value = u(g(h(r.hour).hour, t), r.minute));
|
|
82
|
+
}
|
|
83
|
+
}), Me = v(() => !!U.value), Ne = v(() => O.value ? ie(O.value, B.value, V.value) : "");
|
|
84
|
+
function Pe() {
|
|
85
|
+
if (!L.value) {
|
|
86
|
+
M.value?.focus();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let e = A.value?.el;
|
|
90
|
+
e && $e(e);
|
|
91
|
+
}
|
|
92
|
+
let { open: G, openPanel: Fe, closePanel: Ie, onControlClick: Le, onFocusout: Re, onKeydown: ze, onPanelMousedown: Be } = ne({
|
|
93
|
+
rootEl: k,
|
|
94
|
+
panelRef: A,
|
|
95
|
+
fieldEl: j,
|
|
96
|
+
disabled: () => S.disabled || !z.value,
|
|
97
|
+
focusInPanel: Pe,
|
|
98
|
+
focusOnOpen: () => !I.value,
|
|
99
|
+
onOpen: () => {
|
|
100
|
+
if (!R.value) return;
|
|
101
|
+
let e = U.value;
|
|
102
|
+
if (e) H.value = u(e.hour, e.minute);
|
|
103
|
+
else {
|
|
104
|
+
let e = /* @__PURE__ */ new Date();
|
|
105
|
+
H.value = u(e.getHours(), le(e.getMinutes(), S.minuteStep));
|
|
106
|
+
}
|
|
107
|
+
M.value?.reset();
|
|
108
|
+
},
|
|
109
|
+
onClose: () => {
|
|
110
|
+
M.value?.reset();
|
|
111
|
+
}
|
|
112
|
+
}), K = !1;
|
|
113
|
+
function q() {
|
|
114
|
+
K = !0, Ie(!0), K = !1;
|
|
115
|
+
}
|
|
116
|
+
function Ve() {
|
|
117
|
+
H.value && (O.value = H.value), q();
|
|
118
|
+
}
|
|
119
|
+
function He() {
|
|
120
|
+
q();
|
|
121
|
+
}
|
|
122
|
+
function Ue() {
|
|
123
|
+
O.value = null, I.value && X(""), K = !0, j.value?.focus(), K = !1;
|
|
124
|
+
}
|
|
125
|
+
let J = t(), We = () => W.value === "PM" ? "PM" : "AM", { draft: Ge, fieldModel: Y, writeField: X, commitLive: Ke, commitOrRevert: Z, onFieldInput: qe } = re({
|
|
126
|
+
fieldEl: P,
|
|
127
|
+
typing: () => I.value,
|
|
128
|
+
displayText: () => Ne.value,
|
|
129
|
+
readValue: () => O.value,
|
|
130
|
+
writeValue: (e) => {
|
|
131
|
+
O.value = e;
|
|
132
|
+
},
|
|
133
|
+
maxDigits: () => 4,
|
|
134
|
+
format: d,
|
|
135
|
+
caret: (e, t, n) => p(t, n),
|
|
136
|
+
parse: (e) => ce(e, V.value, We()),
|
|
137
|
+
toMask: (e) => m(e, V.value)
|
|
138
|
+
});
|
|
139
|
+
function Je(e) {
|
|
140
|
+
if (!I.value) return;
|
|
141
|
+
let t = P.value;
|
|
142
|
+
if (t) {
|
|
143
|
+
if (e.key === "Enter") {
|
|
144
|
+
e.preventDefault(), Z(), G.value && q();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (e.key === "ArrowDown" && G.value && R.value) {
|
|
148
|
+
e.preventDefault(), Pe();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (e.key === "Backspace") {
|
|
152
|
+
let n = t.selectionStart;
|
|
153
|
+
if (n !== null && n === t.selectionEnd && n > 0 && !/\d/.test(t.value[n - 1] ?? "")) {
|
|
154
|
+
e.preventDefault();
|
|
155
|
+
let r = l(t.value.slice(0, n)).length, i = l(t.value);
|
|
156
|
+
X(d(i.slice(0, r - 1) + i.slice(r)), p(r - 1)), Ke();
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && !/\d/.test(e.key)) {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
let n = l(t.value);
|
|
163
|
+
n.length === 1 && X(d(`0${n}`), 3);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function Ye(e) {
|
|
168
|
+
if (!I.value) return;
|
|
169
|
+
let t = P.value;
|
|
170
|
+
if (!t) return;
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
let n = (e.clipboardData?.getData("text") ?? "").trim();
|
|
173
|
+
if (oe(n)) {
|
|
174
|
+
let e = m(n, V.value);
|
|
175
|
+
X(e, e.length), n !== O.value && (O.value = n);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
let r = l(t.value), i = t.selectionStart ?? t.value.length, ee = t.selectionEnd ?? i, a = l(t.value.slice(0, i)).length, o = l(t.value.slice(0, ee)).length, s = l(n), c = (r.slice(0, a) + s + r.slice(o)).slice(0, 4);
|
|
179
|
+
X(d(c), p(Math.min(a + s.length, c.length), !0)), Ke();
|
|
180
|
+
}
|
|
181
|
+
function Xe() {
|
|
182
|
+
!I.value || K || Fe(!1);
|
|
183
|
+
}
|
|
184
|
+
function Ze(e) {
|
|
185
|
+
if (I.value && e.key === "Escape" && G.value) {
|
|
186
|
+
e.preventDefault(), q();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
ze(e);
|
|
190
|
+
}
|
|
191
|
+
let Qe = v(() => L.value ? ue(S.minuteStep, B.value, V.value) : []), Q = (e) => [...e.querySelectorAll("[role=\"option\"]")];
|
|
192
|
+
function $e(e) {
|
|
193
|
+
let t = Q(e);
|
|
194
|
+
if (!t.length) return;
|
|
195
|
+
let n = se(O.value), r = t[n === null ? 0 : ee(Math.round(n / S.minuteStep), 0, t.length - 1)];
|
|
196
|
+
r?.scrollIntoView?.({ block: "center" }), r?.focus({ preventScroll: !0 });
|
|
197
|
+
}
|
|
198
|
+
function $(e) {
|
|
199
|
+
O.value = e, q();
|
|
200
|
+
}
|
|
201
|
+
function et(e) {
|
|
202
|
+
if (!L.value) return;
|
|
203
|
+
let t = A.value?.el;
|
|
204
|
+
if (t) {
|
|
205
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
206
|
+
let t = document.activeElement?.closest("[role=\"option\"]")?.dataset.value;
|
|
207
|
+
if (!t) return;
|
|
208
|
+
e.preventDefault(), $(t);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
i(e, t, Q(t), { vertical: !0 });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
let tt = v(() => S.clearable && !S.disabled && (Me.value || I.value && !!Ge.value)), nt = v(() => L.value ? a : R.value ? S.pickerIcon : void 0), rt = v(() => L.value ? J.value.timeInput.openList : J.value.timeInput.openPicker);
|
|
215
|
+
function it() {
|
|
216
|
+
G.value ? q() : Fe(!0);
|
|
217
|
+
}
|
|
218
|
+
return (e, t) => (C(), b("div", {
|
|
219
|
+
ref_key: "rootEl",
|
|
220
|
+
ref: k,
|
|
221
|
+
class: ye(["v-time-input", E(De)]),
|
|
222
|
+
style: be(E(Oe)),
|
|
223
|
+
"data-open": E(G) ? "" : void 0,
|
|
224
|
+
"data-mode": F.value,
|
|
225
|
+
onFocusout: t[5] ||= (...e) => E(Re) && E(Re)(...e),
|
|
226
|
+
onKeydown: Ze
|
|
227
|
+
}, [me("div", Te, [me("div", {
|
|
228
|
+
class: "v-time-input-control",
|
|
229
|
+
onClick: t[1] ||= (...e) => E(Le) && E(Le)(...e)
|
|
230
|
+
}, [x(te, ve({
|
|
231
|
+
ref_key: "inputRef",
|
|
232
|
+
ref: j,
|
|
233
|
+
modelValue: E(Y),
|
|
234
|
+
"onUpdate:modelValue": t[0] ||= (e) => _e(Y) ? Y.value = e : null,
|
|
235
|
+
inputmode: I.value ? "numeric" : void 0,
|
|
236
|
+
autocomplete: I.value ? "off" : void 0
|
|
237
|
+
}, E(ke), {
|
|
238
|
+
readonly: !I.value,
|
|
239
|
+
label: _.label,
|
|
240
|
+
hint: _.hint,
|
|
241
|
+
placeholder: _.placeholder ?? (I.value ? E(J).timeInput.maskPlaceholder : void 0),
|
|
242
|
+
size: _.size,
|
|
243
|
+
compact: _.compact,
|
|
244
|
+
disabled: _.disabled,
|
|
245
|
+
invalid: _.invalid,
|
|
246
|
+
clearable: _.clearable,
|
|
247
|
+
"clear-visible": tt.value,
|
|
248
|
+
"clear-label": E(J).timeInput.clear,
|
|
249
|
+
"icon-end": nt.value,
|
|
250
|
+
"icon-end-label": rt.value,
|
|
251
|
+
role: z.value ? "combobox" : void 0,
|
|
252
|
+
"aria-haspopup": z.value ? L.value ? "listbox" : "dialog" : void 0,
|
|
253
|
+
"aria-expanded": z.value ? E(G) : void 0,
|
|
254
|
+
"aria-controls": z.value ? E(N) : void 0,
|
|
255
|
+
"onClick:iconEnd": it,
|
|
256
|
+
onClear: Ue,
|
|
257
|
+
onFocus: Xe,
|
|
258
|
+
onInput: E(qe),
|
|
259
|
+
onChange: E(Z),
|
|
260
|
+
onBlur: E(Z),
|
|
261
|
+
onKeydown: Je,
|
|
262
|
+
onPaste: Ye
|
|
263
|
+
}), null, 16, [
|
|
264
|
+
"modelValue",
|
|
265
|
+
"inputmode",
|
|
266
|
+
"autocomplete",
|
|
267
|
+
"readonly",
|
|
268
|
+
"label",
|
|
269
|
+
"hint",
|
|
270
|
+
"placeholder",
|
|
271
|
+
"size",
|
|
272
|
+
"compact",
|
|
273
|
+
"disabled",
|
|
274
|
+
"invalid",
|
|
275
|
+
"clearable",
|
|
276
|
+
"clear-visible",
|
|
277
|
+
"clear-label",
|
|
278
|
+
"icon-end",
|
|
279
|
+
"icon-end-label",
|
|
280
|
+
"role",
|
|
281
|
+
"aria-haspopup",
|
|
282
|
+
"aria-expanded",
|
|
283
|
+
"aria-controls",
|
|
284
|
+
"onInput",
|
|
285
|
+
"onChange",
|
|
286
|
+
"onBlur"
|
|
287
|
+
])]), V.value === "12h" && F.value !== "readonly" ? (C(), y(s, {
|
|
288
|
+
key: 0,
|
|
289
|
+
modelValue: W.value,
|
|
290
|
+
"onUpdate:modelValue": t[2] ||= (e) => W.value = e,
|
|
291
|
+
class: "v-time-input-meridiem",
|
|
292
|
+
mandatory: "",
|
|
293
|
+
variant: "outline",
|
|
294
|
+
size: _.size,
|
|
295
|
+
compact: _.compact,
|
|
296
|
+
label: E(J).timePicker.meridiem
|
|
297
|
+
}, {
|
|
298
|
+
default: D(() => [x(c, {
|
|
299
|
+
value: "AM",
|
|
300
|
+
label: E(J).timePicker.am
|
|
301
|
+
}, null, 8, ["label"]), x(c, {
|
|
302
|
+
value: "PM",
|
|
303
|
+
label: E(J).timePicker.pm
|
|
304
|
+
}, null, 8, ["label"])]),
|
|
305
|
+
_: 1
|
|
306
|
+
}, 8, [
|
|
307
|
+
"modelValue",
|
|
308
|
+
"size",
|
|
309
|
+
"compact",
|
|
310
|
+
"label"
|
|
311
|
+
])) : pe("", !0)]), z.value ? (C(), y(n, {
|
|
312
|
+
key: 0,
|
|
313
|
+
id: E(N),
|
|
314
|
+
ref_key: "panelRef",
|
|
315
|
+
ref: A,
|
|
316
|
+
open: E(G),
|
|
317
|
+
"onUpdate:open": t[4] ||= (e) => _e(G) ? G.value = e : null,
|
|
318
|
+
mode: "manual",
|
|
319
|
+
anchor: "--time-input-anchor",
|
|
320
|
+
placement: _.placement,
|
|
321
|
+
surface: "",
|
|
322
|
+
role: L.value ? "listbox" : "dialog",
|
|
323
|
+
class: ye(L.value ? "v-time-input-list v-control" : "v-time-input-panel"),
|
|
324
|
+
"data-size": L.value ? _.size : void 0,
|
|
325
|
+
"data-compact": L.value && _.compact ? "" : void 0,
|
|
326
|
+
"aria-label": _.label ?? (L.value ? E(J).timeInput.listLabel : E(J).timeInput.pickerLabel),
|
|
327
|
+
onMousedown: E(Be),
|
|
328
|
+
onKeydown: et
|
|
329
|
+
}, {
|
|
330
|
+
default: D(() => [L.value ? (C(!0), b(fe, { key: 0 }, xe(Qe.value, (e) => (C(), b("button", {
|
|
331
|
+
key: e.value,
|
|
332
|
+
type: "button",
|
|
333
|
+
role: "option",
|
|
334
|
+
tabindex: "-1",
|
|
335
|
+
class: "v-time-input-option",
|
|
336
|
+
"data-value": e.value,
|
|
337
|
+
"aria-selected": e.value === O.value ? "true" : "false",
|
|
338
|
+
onClick: (t) => $(e.value)
|
|
339
|
+
}, T(e.label), 9, Ee))), 128)) : (C(), y(de, {
|
|
340
|
+
key: 1,
|
|
341
|
+
ref_key: "pickerRef",
|
|
342
|
+
ref: M,
|
|
343
|
+
modelValue: H.value,
|
|
344
|
+
"onUpdate:modelValue": t[3] ||= (e) => H.value = e,
|
|
345
|
+
format: V.value,
|
|
346
|
+
locale: B.value,
|
|
347
|
+
"minute-step": _.minuteStep,
|
|
348
|
+
onConfirm: Ve
|
|
349
|
+
}, {
|
|
350
|
+
footer: D(() => [x(r, {
|
|
351
|
+
variant: "ghost",
|
|
352
|
+
tone: "neutral",
|
|
353
|
+
onClick: He
|
|
354
|
+
}, {
|
|
355
|
+
default: D(() => [he(T(E(J).common.cancel), 1)]),
|
|
356
|
+
_: 1
|
|
357
|
+
}), x(r, { onClick: Ve }, {
|
|
358
|
+
default: D(() => [he(T(E(J).common.confirm), 1)]),
|
|
359
|
+
_: 1
|
|
360
|
+
})]),
|
|
361
|
+
_: 1
|
|
362
|
+
}, 8, [
|
|
363
|
+
"modelValue",
|
|
364
|
+
"format",
|
|
365
|
+
"locale",
|
|
366
|
+
"minute-step"
|
|
367
|
+
]))]),
|
|
368
|
+
_: 1
|
|
369
|
+
}, 8, [
|
|
370
|
+
"id",
|
|
371
|
+
"open",
|
|
372
|
+
"placement",
|
|
373
|
+
"role",
|
|
374
|
+
"class",
|
|
375
|
+
"data-size",
|
|
376
|
+
"data-compact",
|
|
377
|
+
"aria-label",
|
|
378
|
+
"onMousedown"
|
|
379
|
+
])) : pe("", !0)], 46, we));
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
//#endregion
|
|
383
|
+
export { O as default };
|
|
384
|
+
|
|
385
|
+
//# sourceMappingURL=VTimeInput.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VTimeInput.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VTimeInput/VTimeInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, useId, watchEffect } from 'vue'\n\nimport VButton from '../VButton/VButton.vue'\nimport { expand_more as expandMoreIcon } from '../VIcon/icons/expand_more'\nimport { schedule as scheduleIcon } from '../VIcon/icons/schedule'\nimport type { IconSource } from '../VIcon/types'\nimport VInput from '../VInput/VInput.vue'\nimport VPopover from '../VPopover/VPopover.vue'\nimport VToggle from '../VToggle/VToggle.vue'\nimport type { ToggleModelValue } from '../VToggle/VToggle.vue'\nimport VToggleItem from '../VToggle/VToggleItem.vue'\nimport VTimePicker from '../VTimePicker/VTimePicker.vue'\nimport type { TimePickerFormat } from '../VTimePicker/VTimePicker.vue'\nimport {\n formatDisplay,\n formatTime,\n formatTimeMask,\n hourCycleFor,\n isValidTime,\n minutesOf,\n parseTime,\n parseTimeMask,\n snapMinute,\n timeCaret,\n timeList,\n timeToMask,\n to12h,\n to24h,\n} from '../../utils/time'\nimport type { Meridiem, TimeOption } from '../../utils/time'\nimport { arrowNavigate } from '../../utils/arrowNav'\nimport { clamp } from '../../utils/number'\nimport { isDev } from '../../utils/env'\nimport { digitsOf } from '../../utils/text'\n\nimport { useRootAttrs } from '../../composables/useRootAttrs'\n\nimport { useFieldPanel } from '../../composables/useFieldPanel'\nimport { useMaskedField } from '../../composables/useMaskedField'\nimport { useLocale, useMessages } from '../../i18n/state'\n\n// @a11y @core\n/**\n * A field for choosing a time, with an optional panel below it. The shell is the same one\n * VDateInput uses: the panel is opened from code, which is what lets the focus be moved\n * into it, and closed when the focus leaves the component or Escape is pressed.\n *\n * The field comes in three forms. It can be TYPED into, hours and minutes behind a mask,\n * optionally with a picker beside it. It can be read-only, the picker then being the only way\n * in. Or it can offer a LIST of times at a fixed interval, which suits booking a slot far\n * better than pointing at a clock face.\n *\n * The two panels commit differently, and deliberately so. The PICKER works on a draft that\n * only OK writes to the value — Cancel, Escape and the focus leaving all discard it —\n * because dragging a hand across a clock passes over dozens of times nobody meant. The\n * LIST writes immediately: choosing a row there is one deliberate gesture.\n *\n * Whatever is displayed, the value itself is always a 24-hour time.\n */\nexport type TimeInputMode = 'readonly' | 'input' | 'list'\n\nconst MODES: TimeInputMode[] = ['readonly', 'input', 'list']\n\ntype Placement = 'bottom' | 'bottom-start' | 'bottom-end' | 'top' | 'top-start' | 'top-end'\n\ninterface TimeInputProps {\n /**\n * Whether times are shown on a 12- or a 24-hour clock. Left out, the reader's language\n * decides, which is almost always what one wants.\n */\n format?: TimePickerFormat\n /**\n * Which form the field takes: one that can be TYPED into, a read-only one where the\n * picker is the only way in — so the picker is forced on there — or a LIST of times at a\n * fixed interval, where a picker would make no sense.\n */\n mode?: TimeInputMode\n /**\n * Offers the picker beside a field one can type into: an icon at the end of the field,\n * and a panel it opens.\n *\n * It is left undefined by default rather than set to off, which is what distinguishes\n * \"not given\" from an explicit refusal — and therefore what allows warning only the\n * consumer who really asked to remove the picker from a read-only field, where it is the\n * only way in.\n */\n showPicker?: boolean\n /**\n * The interval between two times that can be chosen. It applies to the picker, to the\n * arrow keys and to the rows of the list.\n */\n minuteStep?: number\n /**\n * A BCP 47 locale, which decides the clock and how a time is written out. It TAKES\n * PRECEDENCE over the design system's global locale and falls back to it — which is why\n * it has no literal default: `undefined` has to stay recognizable for the global locale\n * to have its chance.\n */\n locale?: string\n // From here on: the field.\n /** The label above the field. */\n label?: string\n /** A line of help under the field. */\n hint?: string\n /** What the field says while empty. */\n placeholder?: string\n /** The height of the field: 32, 40 or 48 pixels. */\n size?: 'sm' | 'md' | 'lg'\n /** Takes 4px off the height. */\n compact?: boolean\n /** Makes the field unusable, greyed out through the colour tokens. */\n disabled?: boolean\n /** Marks the field as invalid — for a rule of your own. */\n invalid?: boolean\n /** Offers a cross that empties the value, shown before the end icon. */\n clearable?: boolean\n /**\n * The icon that opens the PICKER, at the end of the field. It has no effect on the list\n * form, whose chevron follows the combobox convention. The clear cross appears to its\n * left rather than in its place.\n */\n pickerIcon?: IconSource\n /** Where the panel opens relative to the field. */\n placement?: Placement\n}\n\nconst props = withDefaults(defineProps<TimeInputProps>(), {\n format: undefined,\n // Deliberately left undefined rather than defaulted to the typed mode: that is what\n // distinguishes \"the prop was not given\" from \"the prop was given this value\", and\n // therefore what allows warning ONLY the consumer who explicitly asked for something\n // that cannot work.\n mode: undefined,\n showPicker: undefined,\n minuteStep: 1,\n locale: undefined,\n label: undefined,\n hint: undefined,\n placeholder: undefined,\n size: 'md',\n compact: false,\n disabled: false,\n invalid: false,\n clearable: true,\n pickerIcon: () => scheduleIcon,\n placement: 'bottom-start',\n})\n\n/**\n * The time, always as a 24-hour \"HH:mm\" string whatever clock is displayed. A consumer\n * therefore never has to know which clock the reader's language uses.\n */\nconst model = defineModel<string | null>({ default: null })\n\n// `class` and `style` stay on the wrapper; everything else goes down to the text field,\n// which is what a consumer's label points at and what assistive technology deals with.\ndefineOptions({ inheritAttrs: false })\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\n\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelRef = ref<InstanceType<typeof VPopover> | null>(null)\nconst inputRef = ref<InstanceType<typeof VInput> | null>(null)\nconst pickerRef = ref<InstanceType<typeof VTimePicker> | null>(null)\nconst panelId = useId()\n\n/** The real input inside the field, which the mask and the caret work on. */\nconst fieldEl = computed<HTMLInputElement | null>(() => inputRef.value?.el ?? null)\n\nconst resolvedMode = computed<TimeInputMode>(() => {\n // TRAP — the default is applied BEFORE the value is checked. A prop that was never\n // given is not an unknown value, and treating it as one would warn on a bare\n // `<VTimeInput />`.\n const mode = props.mode ?? 'input'\n return MODES.includes(mode) ? mode : 'input'\n})\nconst typing = computed(() => resolvedMode.value === 'input')\nconst isList = computed(() => resolvedMode.value === 'list')\n/**\n * Whether there is a picker. It is forced on a read-only field, where nothing else could\n * fill it; offered beside a field one types into; and meaningless in the list form, which\n * has a panel of its own.\n */\nconst hasPicker = computed(\n () => resolvedMode.value === 'readonly' || (typing.value && props.showPicker === true),\n)\nconst hasPanel = computed(() => hasPicker.value || isList.value)\n\nconst vectisLocale = useLocale()\n/* The prop wins, and the design system's global locale is what it falls back to. */\nconst resolvedLocale = computed(() => props.locale ?? vectisLocale.value)\n\nconst resolvedFormat = computed<TimePickerFormat>(\n () => props.format ?? hourCycleFor(resolvedLocale.value),\n)\n\n// @devwarn\nif (isDev) {\n watchEffect(() => {\n if (props.minuteStep < 1 || 60 % props.minuteStep !== 0)\n console.warn(`[VTimeInput] minuteStep ${props.minuteStep} — a divisor of 60 is expected.`)\n if (props.mode !== undefined && !MODES.includes(props.mode))\n console.warn(\n `[VTimeInput] unknown mode \"${props.mode}\": use \"input\" (the default), \"readonly\" or \"list\".`,\n )\n if (resolvedMode.value === 'readonly' && props.showPicker === false)\n console.warn(\n '[VTimeInput] showPicker is forced to true in \"readonly\" mode: with no picker, a read-only field would be impossible to fill.',\n )\n if (isList.value && props.showPicker === true)\n console.warn(\n '[VTimeInput] showPicker is ignored in \"list\" mode: the list of times is the only panel.',\n )\n if (isList.value && props.minuteStep < 5)\n console.warn(\n `[VTimeInput] minuteStep ${props.minuteStep} in \"list\" mode would render ${Math.ceil(1440 / props.minuteStep)} rows: a step of 15 or 30 minutes is expected.`,\n )\n })\n}\n\n/**\n * The time being built on the clock, in the same canonical form as the value itself.\n * Nothing here reaches the value until OK is pressed — which is the whole reason the\n * picker is bound to THIS rather than to the model.\n */\nconst draft = ref<string | null>(null)\n\nconst modelParts = computed(() => parseTime(model.value))\n\n/**\n * Which half of the day is chosen while NO time is set at all. The AM/PM control always\n * needs a value — it refuses to have none — and \"nothing\" is not one.\n *\n * It starts at AM rather than at whatever the current time happens to be, which keeps the\n * component's first render identical on a server and in a browser, and its tests free of\n * a clock.\n */\nconst pendingMeridiem = ref<Meridiem>('AM')\n\n/**\n * The AM/PM control beside the FIELD. It is what the mask needs — the half of the day has\n * to be known while the panel is shut, and in the list form there is no picker at all — so\n * it is rendered in every form but the read-only one, where the picker carries its own.\n */\nconst meridiemModel = computed<ToggleModelValue>({\n get: () => {\n // With the picker open it is the DRAFT that is on screen, and this control has to read\n // the same thing: two controls showing opposite halves of the day until OK is pressed\n // is the one state that must not happen.\n const parts = open.value && hasPicker.value ? parseTime(draft.value) : modelParts.value\n return parts ? to12h(parts.hour).meridiem : pendingMeridiem.value\n },\n set: (value) => {\n const meridiem: Meridiem = value === 'PM' ? 'PM' : 'AM'\n pendingMeridiem.value = meridiem\n const parts = modelParts.value\n // With no time set there is nothing to convert, so the choice is simply REMEMBERED\n // and applies to the first time typed or chosen.\n if (parts) model.value = formatTime(to24h(to12h(parts.hour).hour, meridiem), parts.minute)\n // With the picker open the draft has to follow as well, or OK would write back the\n // half of the day the reader has just changed.\n const pending = open.value && hasPicker.value ? parseTime(draft.value) : null\n if (pending) draft.value = formatTime(to24h(to12h(pending.hour).hour, meridiem), pending.minute)\n },\n})\n\nconst hasValue = computed(() => !!modelParts.value)\nconst displayText = computed(() =>\n model.value ? formatDisplay(model.value, resolvedLocale.value, resolvedFormat.value) : '',\n)\n\n// @a11y\n// Where the focus goes when the panel opens.\nfunction focusInPanel() {\n if (!isList.value) {\n // The picker publishes where its own focus goes, so nothing here has to know that the\n // target is a slider — the same arrangement VDateInput has with VDatePicker.\n pickerRef.value?.focus()\n return\n }\n const panel = panelRef.value?.el\n if (panel) focusListSelection(panel)\n}\n\n// The whole \"field plus panel\" shell, shared with VDateInput. What is specific to this\n// component is only what happens around it: preparing the draft as the panel opens, and\n// clearing the announcement as it closes.\nconst { open, openPanel, closePanel, onControlClick, onFocusout, onKeydown, onPanelMousedown } =\n useFieldPanel({\n rootEl,\n panelRef,\n fieldEl: inputRef,\n // With no panel there is nothing to open. This is the composable's SINGLE cut-off\n // point, and every way in passes through it — clicking the field, focusing it, the\n // down arrow, Enter, the icon.\n disabled: () => props.disabled || !hasPanel.value,\n focusInPanel,\n // Beside a field one types into, the panel opens WITHOUT taking the focus, so typing\n // carries on.\n focusOnOpen: () => !typing.value,\n onOpen: () => {\n // Only the picker works on a draft; the list writes its choice straight away.\n if (!hasPicker.value) return\n const parts = modelParts.value\n if (parts) draft.value = formatTime(parts.hour, parts.minute)\n else {\n // Opening on the current time when none is set. Reading the clock is safe here:\n // this runs from a handler, hence in a browser, never during a render — and it is\n // why the picker itself never reads it, so that it stays identical on both sides\n // of hydration. The instant is taken ONCE: two reads could straddle a minute.\n const now = new Date()\n draft.value = formatTime(now.getHours(), snapMinute(now.getMinutes(), props.minuteStep))\n }\n pickerRef.value?.reset()\n },\n onClose: () => {\n pickerRef.value?.reset()\n },\n })\n\n// @a11y\n/**\n * TRAP — closing the panel hands the focus back to the field, and beside a field one\n * types into the panel opens ON FOCUS: the two would chase each other and the panel would\n * never close.\n *\n * This lock covers the focus call, which is synchronous. EVERY close that returns the\n * focus must go through here; closing directly brings the loop straight back.\n */\nlet refocusing = false\nfunction closeAndFocus() {\n refocusing = true\n closePanel(true)\n refocusing = false\n}\n\n/** OK: the ONE route by which the picker's draft becomes the value. */\nfunction confirm() {\n if (draft.value) model.value = draft.value\n closeAndFocus()\n}\n\nfunction cancel() {\n closeAndFocus()\n}\n\n// @a11y\n/*\n * Emptying the value, called by the field as it emits its clear event.\n *\n * TRAP — the focus is taken here, under the lock, on purpose: the field focuses itself\n * immediately afterwards, and focusing an element that ALREADY has the focus emits no\n * event at all. That is what stops the panel reopening. Taking the lock away from this\n * function brings the reopening straight back.\n */\nfunction clearValue() {\n model.value = null\n // The typed text is emptied EXPLICITLY: when the value was already empty, nothing\n // changes, and the guard that keeps the field and the value from chasing each other\n // would leave the text where it was.\n if (typing.value) writeField('')\n refocusing = true\n inputRef.value?.focus()\n refocusing = false\n}\n\n// Escape and the focus leaving both close WITHOUT committing, which is the picker's Cancel\n// behaviour: closing never writes the value, and only OK does.\n\nconst m = useMessages()\n\n/* From here on: everything the typed field needs. */\n\nconst currentMeridiem = (): Meridiem => (meridiemModel.value === 'PM' ? 'PM' : 'AM')\n\n/*\n * The mask machinery — the text being typed, the bridge to the value, the reformatting\n * that preserves the caret, the commit and the silent revert — is shared with VDateInput\n * and lives in `useMaskedField`.\n *\n * The time vocabulary is the simpler of the two: four digits, and a separator that is the\n * SAME in every language. That is why the caret can be computed outright here, where a\n * date has to look for a separator it cannot predict; and why nothing distinguishes a\n * final commit from a live one, there being no equivalent of expanding a two-digit year.\n */\nconst {\n draft: maskDraft,\n fieldModel,\n writeField,\n commitLive,\n commitOrRevert,\n onFieldInput,\n} = useMaskedField({\n fieldEl,\n typing: () => typing.value,\n displayText: () => displayText.value,\n readValue: () => model.value,\n writeValue: (time) => {\n model.value = time\n },\n maxDigits: () => 4,\n format: formatTimeMask,\n caret: (_text, digitsBefore, inserting) => timeCaret(digitsBefore, inserting),\n parse: (text) => parseTimeMask(text, resolvedFormat.value, currentMeridiem()),\n toMask: (time) => timeToMask(time, resolvedFormat.value),\n})\n\n// @keyboard @core — the keys the mask itself needs, plus the down arrow, which is the one\n// explicit way from the field into the picker.\nfunction onFieldKeydown(event: KeyboardEvent) {\n if (!typing.value) return\n const el = fieldEl.value\n if (!el) return\n\n if (event.key === 'Enter') {\n // Cancelling the default does two things at once: it stops the surrounding form from\n // being submitted, and it stops the panel this keystroke has just closed from being\n // reopened as the event travels up to the root.\n event.preventDefault()\n commitOrRevert()\n if (open.value) closeAndFocus()\n return\n }\n if (event.key === 'ArrowDown' && open.value && hasPicker.value) {\n // The one explicit route from the field into the picker.\n event.preventDefault()\n focusInPanel()\n return\n }\n if (event.key === 'Backspace') {\n const start = el.selectionStart\n if (\n start !== null &&\n start === el.selectionEnd &&\n start > 0 &&\n !/\\d/.test(el.value[start - 1] ?? '')\n ) {\n // TRAP — the separator is PLACED by the mask and never typed, so erasing one has to\n // erase the DIGIT before it. Left alone, the mask would write it straight back and\n // the key would look dead.\n event.preventDefault()\n const n = digitsOf(el.value.slice(0, start)).length\n const digits = digitsOf(el.value)\n writeField(formatTimeMask(digits.slice(0, n - 1) + digits.slice(n)), timeCaret(n - 1))\n commitLive()\n }\n return\n }\n // Typing anything that is not a digit — the separator included, so that \"9:30\" can be\n // typed exactly as it reads — completes the hour with a leading zero and moves on to\n // the minutes.\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey &&\n !/\\d/.test(event.key)\n ) {\n event.preventDefault()\n const digits = digitsOf(el.value)\n if (digits.length === 1) writeField(formatTimeMask(`0${digits}`), 3)\n }\n}\n\n/**\n * Pasting. A time recognizable as a whole is adopted as it stands; anything else\n * contributes its digits alone.\n */\nfunction onFieldPaste(event: ClipboardEvent) {\n if (!typing.value) return\n const el = fieldEl.value\n if (!el) return\n event.preventDefault()\n const pasted = (event.clipboardData?.getData('text') ?? '').trim()\n // A pasted 24-hour time is read as one whatever clock is on display: \"19:05\" means\n // seven in the evening even in a field showing a 12-hour clock.\n if (isValidTime(pasted)) {\n const text = timeToMask(pasted, resolvedFormat.value)\n writeField(text, text.length)\n if (pasted !== model.value) model.value = pasted\n return\n }\n const digits = digitsOf(el.value)\n const start = el.selectionStart ?? el.value.length\n const end = el.selectionEnd ?? start\n const from = digitsOf(el.value.slice(0, start)).length\n const to = digitsOf(el.value.slice(0, end)).length\n const inserted = digitsOf(pasted)\n const next = (digits.slice(0, from) + inserted + digits.slice(to)).slice(0, 4)\n writeField(formatTimeMask(next), timeCaret(Math.min(from + inserted.length, next.length), true))\n commitLive()\n}\n\nfunction onFieldFocus() {\n if (!typing.value || refocusing) return\n openPanel(false)\n}\n\nfunction onRootKeydown(event: KeyboardEvent) {\n if (typing.value && event.key === 'Escape' && open.value) {\n event.preventDefault()\n closeAndFocus()\n return\n }\n onKeydown(event)\n}\n\n/* From here on: everything the list form needs. */\n\nconst options = computed<TimeOption[]>(() =>\n isList.value ? timeList(props.minuteStep, resolvedLocale.value, resolvedFormat.value) : [],\n)\n\n// @keyboard\n/**\n * The rows the arrows may move to, gathered by hand rather than through the shared\n * helper.\n *\n * That helper asks the browser for the computed style of EVERY element it considers, to\n * skip the hidden ones. Across dozens of rows — a list at a five-minute step holds nearly\n * three hundred — that is a real cost, and none of these rows is ever hidden.\n */\nconst optionEls = (panel: HTMLElement) => [\n ...panel.querySelectorAll<HTMLElement>('[role=\"option\"]'),\n]\n\n// @a11y\n/**\n * On opening, the list is both scrolled and focused onto the current time — or onto the\n * NEAREST row, since a value need not be one of them: \"09:07\" against a list stepping\n * every fifteen minutes matches nothing at all.\n */\nfunction focusListSelection(panel: HTMLElement) {\n const items = optionEls(panel)\n if (!items.length) return\n const minutes = minutesOf(model.value)\n const index =\n minutes === null ? 0 : clamp(Math.round(minutes / props.minuteStep), 0, items.length - 1)\n const el = items[index]\n // Called optionally, the unit-test environment implementing no scrolling. No scrolling\n // behaviour is requested either: leaving it out lets the stylesheet decide, which is\n // what makes the movement respect a reader who has asked for less motion.\n el?.scrollIntoView?.({ block: 'center' })\n el?.focus({ preventScroll: true })\n}\n\n/**\n * Choosing a row writes the value straight away and closes — no draft and no footer, the\n * same way choosing a single date closes the calendar.\n */\nfunction selectTime(value: string) {\n model.value = value\n closeAndFocus()\n}\n\n// @keyboard @a11y\nfunction onPanelKeydown(event: KeyboardEvent) {\n if (!isList.value) return\n const panel = panelRef.value?.el\n if (!panel) return\n if (event.key === 'Enter' || event.key === ' ') {\n // TRAP — cancelling the default here is MANDATORY, and the commit consequently has to\n // be explicit. Left alone, Enter would fire the row's own click — which closes the\n // panel — and then travel up to the root WITHOUT being marked as handled, so the\n // guard that stops a consumed key reopening the panel would not apply, and it would\n // reopen immediately.\n const value = (document.activeElement as HTMLElement | null)?.closest<HTMLElement>(\n '[role=\"option\"]',\n )?.dataset.value\n if (!value) return\n event.preventDefault()\n selectTime(value)\n return\n }\n arrowNavigate(event, panel, optionEls(panel), { vertical: true })\n}\n\n/*\n * The clear cross and the icon at the end of the field.\n *\n * The cross is the field's own, which renders it BEFORE the end icon rather than in its\n * place — the convention every field in the design system follows. In the list form that\n * gives exactly the cross-and-chevron pairing of a combobox, which is the right thing:\n * the two behave the same way.\n *\n * Whether the cross is shown has to be answered explicitly here: outside the typed mode\n * the field is read-only and would hide it, while the value comes from the panel.\n */\nconst canClear = computed(\n () =>\n props.clearable && !props.disabled && (hasValue.value || (typing.value && !!maskDraft.value)),\n)\nconst endIcon = computed<IconSource | undefined>(() =>\n isList.value ? expandMoreIcon : hasPicker.value ? props.pickerIcon : undefined,\n)\n// @a11y @devwarn\n/*\n * TRAP — the LABEL is defined at all times, even when no icon is rendered at all.\n *\n * The helper detecting a click handler on an icon warns AT SETUP if one is attached\n * without a label, and it has no way of knowing whether an icon exists. Since the\n * listener here is attached permanently and that detection is static, making the label\n * conditional would produce a false warning every time a typed field without a picker is\n * mounted.\n */\nconst endIconLabel = computed(() =>\n isList.value ? m.value.timeInput.openList : m.value.timeInput.openPicker,\n)\n\nfunction onEndIcon() {\n if (open.value) closeAndFocus()\n else openPanel(true)\n}\n</script>\n\n<template>\n <div\n ref=\"rootEl\"\n class=\"v-time-input\"\n :class=\"rootClass\"\n :style=\"rootStyle\"\n :data-open=\"open ? '' : undefined\"\n :data-mode=\"resolvedMode\"\n @focusout=\"onFocusout\"\n @keydown=\"onRootKeydown\"\n >\n <div class=\"v-time-input-row\">\n <div class=\"v-time-input-control\" @click=\"onControlClick\">\n <!-- The field is declared a combobox rather than left as the plain text box it\n implicitly is, because a text box may not carry the attribute saying whether\n something is expanded — the same reasoning as in VDateInput. Here it also\n agrees with the list form, where what the field opens really is a list. -->\n <VInput\n ref=\"inputRef\"\n v-model=\"fieldModel\"\n :inputmode=\"typing ? 'numeric' : undefined\"\n :autocomplete=\"typing ? 'off' : undefined\"\n v-bind=\"forwardedAttrs\"\n :readonly=\"!typing\"\n :label=\"label\"\n :hint=\"hint\"\n :placeholder=\"placeholder ?? (typing ? m.timeInput.maskPlaceholder : undefined)\"\n :size=\"size\"\n :compact=\"compact\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n :clearable=\"clearable\"\n :clear-visible=\"canClear\"\n :clear-label=\"m.timeInput.clear\"\n :icon-end=\"endIcon\"\n :icon-end-label=\"endIconLabel\"\n :role=\"hasPanel ? 'combobox' : undefined\"\n :aria-haspopup=\"hasPanel ? (isList ? 'listbox' : 'dialog') : undefined\"\n :aria-expanded=\"hasPanel ? open : undefined\"\n :aria-controls=\"hasPanel ? panelId : undefined\"\n @click:icon-end=\"onEndIcon\"\n @clear=\"clearValue\"\n @focus=\"onFieldFocus\"\n @input=\"onFieldInput\"\n @change=\"commitOrRevert\"\n @blur=\"commitOrRevert\"\n @keydown=\"onFieldKeydown\"\n @paste=\"onFieldPaste\"\n />\n </div>\n\n <!-- The AM/PM control beside the field, which the two typed forms cannot do without:\n the mask needs the half of the day while the panel is shut, and the list form\n has no picker at all. It is dropped in the READ-ONLY form alone, where the\n picker is the only way in and carries its own.\n\n It stays INSIDE the component's root: clicking it must not count as the focus\n leaving, which would close the panel under the reader's hand. -->\n <VToggle\n v-if=\"resolvedFormat === '12h' && resolvedMode !== 'readonly'\"\n v-model=\"meridiemModel\"\n class=\"v-time-input-meridiem\"\n mandatory\n variant=\"outline\"\n :size=\"size\"\n :compact=\"compact\"\n :label=\"m.timePicker.meridiem\"\n >\n <VToggleItem value=\"AM\" :label=\"m.timePicker.am\" />\n <VToggleItem value=\"PM\" :label=\"m.timePicker.pm\" />\n </VToggle>\n </div>\n\n <!-- With no panel rendered there is nothing to hold a reference to, and the open state\n — which is fed by the panel's own events — can no longer become true. The absence\n of a panel is therefore self-enforcing. -->\n <VPopover\n v-if=\"hasPanel\"\n :id=\"panelId\"\n ref=\"panelRef\"\n v-model:open=\"open\"\n mode=\"manual\"\n anchor=\"--time-input-anchor\"\n :placement=\"placement\"\n surface\n :role=\"isList ? 'listbox' : 'dialog'\"\n :class=\"isList ? 'v-time-input-list v-control' : 'v-time-input-panel'\"\n :data-size=\"isList ? size : undefined\"\n :data-compact=\"isList && compact ? '' : undefined\"\n :aria-label=\"label ?? (isList ? m.timeInput.listLabel : m.timeInput.pickerLabel)\"\n @mousedown=\"onPanelMousedown\"\n @keydown=\"onPanelKeydown\"\n >\n <!-- The list: rows the focus really moves between, as in a menu or a calendar —\n unlike VCombobox, where the focus stays in the field — and a choice written\n straight away on a click or on Enter. -->\n <template v-if=\"isList\">\n <button\n v-for=\"option in options\"\n :key=\"option.value\"\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"v-time-input-option\"\n :data-value=\"option.value\"\n :aria-selected=\"option.value === model ? 'true' : 'false'\"\n @click=\"selectTime(option.value)\"\n >\n {{ option.label }}\n </button>\n </template>\n\n <!-- The picker works on the DRAFT and not on the value, which is what makes OK the\n only way in: Cancel, Escape and the focus leaving simply drop it. The two\n actions are handed to its own footer slot, since they belong to this panel\n rather than to a clock shown on its own. -->\n <VTimePicker\n v-else\n ref=\"pickerRef\"\n v-model=\"draft\"\n :format=\"resolvedFormat\"\n :locale=\"resolvedLocale\"\n :minute-step=\"minuteStep\"\n @confirm=\"confirm\"\n >\n <template #footer>\n <VButton variant=\"ghost\" tone=\"neutral\" @click=\"cancel\">{{ m.common.cancel }}</VButton>\n <VButton @click=\"confirm\">{{ m.common.confirm }}</VButton>\n </template>\n </VTimePicker>\n </VPopover>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-time-input {\n /* Confines the anchor name to this instance. It is declared on the root because that\n is the common ancestor of the field and the panel. */\n anchor-scope: --time-input-anchor;\n display: block;\n width: 100%;\n font-family: var(--vectis-text-family);\n }\n\n /* The row holding the field: the field takes whatever room is left, and the AM/PM\n control keeps its natural width. */\n .v-time-input-row {\n display: flex;\n align-items: stretch;\n gap: var(--vectis-space-2);\n }\n\n .v-time-input-control {\n anchor-name: --time-input-anchor;\n flex: 1;\n /* Without this the field would refuse to shrink below its own content and would\n overflow the row. */\n min-inline-size: 0;\n cursor: pointer;\n }\n\n /* A field one types into shows the text cursor rather than the pointer a clickable\n control shows. Its figures are also given equal widths: with proportional ones the\n text shifts as digits are typed, and the caret appears to jitter. */\n .v-time-input[data-mode='input'] .v-time-input-control {\n cursor: text;\n }\n\n .v-time-input[data-mode='input'] .v-input-control {\n font-variant-numeric: tabular-nums;\n }\n\n /* The AM/PM control lines up with the FIELD and not with the whole block, which also\n stacks a label above and a hint below it. Those two are compensated with margins\n derived from their own type, so the control sits exactly beside the field whatever\n the field is given. */\n .v-time-input-meridiem {\n flex: none;\n align-self: center;\n }\n\n .v-time-input-row:has(.v-input-label) .v-time-input-meridiem {\n margin-block-start: calc(\n var(--vectis-text-label-size) * var(--vectis-text-label-leading) + var(--vectis-space-1)\n );\n }\n\n .v-time-input-row:has(.v-input-hint) .v-time-input-meridiem {\n margin-block-end: calc(\n var(--vectis-text-caption-size) * var(--vectis-text-caption-leading) + var(--vectis-space-1)\n );\n }\n\n /* The anchoring and the panel's surface both come from VPopover; what is left here is\n the padding around the picker. The picker brings its own layout — including the gap\n between its parts and the centring of the face — so nothing of that is declared here.\n\n TRAP — declaring a display here overrides the browser's own rule hiding a closed\n popover. What closes it back is the shared guard on the overlay class, which is more\n specific than anything a component can write.\n\n The selector compounds two classes VPopover puts on the same element, because the\n padding is also declared by the shared panel class: at equal specificity the winner\n would be whichever sheet the consumer's bundler put last. The size attribute cannot\n serve that purpose here — the picker's panel carries none. */\n .v-popover-panel.v-time-input-panel {\n display: flex;\n flex-direction: column;\n width: max-content;\n padding: var(--vectis-space-3);\n color: var(--vectis-color-text);\n }\n\n /* The list's surface comes from the shared panel class, and its rows read their\n dimensions from the size class set on the PANEL. What stays here are the panel's own\n dimensions, which the shared class deliberately declares none of. */\n .v-time-input-list {\n min-inline-size: anchor-size(width);\n max-block-size: var(--vectis-control-size-time-input-list-max-block);\n overflow: auto;\n }\n\n .v-time-input-option {\n display: flex;\n align-items: center;\n width: 100%;\n min-height: var(--control-height);\n padding: var(--vectis-space-1) var(--control-padding-inline);\n border: none;\n border-radius: var(--vectis-radius-sm);\n background: transparent;\n color: var(--vectis-color-text);\n font-family: inherit;\n font-size: var(--control-font-size);\n line-height: var(--vectis-text-body-md-leading);\n font-variant-numeric: tabular-nums;\n text-align: start;\n cursor: pointer;\n }\n\n .v-time-input-option:hover {\n background: var(--vectis-color-surface-muted);\n }\n\n /* The focus ring is drawn INSIDE the row: the panel scrolls, and a ring sitting outside\n it would be cropped on the first and last rows. */\n .v-time-input-option:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(-1 * var(--vectis-focus-ring-width));\n }\n\n .v-time-input-option[aria-selected='true'] {\n background: var(--vectis-color-accent-surface);\n color: var(--vectis-color-accent-text);\n }\n\n .v-time-input-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--vectis-space-2);\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DA,IAAM,KAAyB;GAAC;GAAY;GAAS;EAAM,GAiErD,IAAQ,GA0BR,IAAQ,GAA0B,GAAA,YAAkB,GAKpD,EAAE,eAAW,eAAW,uBAAmB,EAAa,GAExD,IAAS,EAAwB,IAAI,GACrC,IAAW,EAA0C,IAAI,GACzD,IAAW,EAAwC,IAAI,GACvD,IAAY,EAA6C,IAAI,GAC7D,IAAU,GAAM,GAGhB,IAAU,QAAwC,EAAS,OAAO,MAAM,IAAI,GAE5E,IAAe,QAA8B;GAIjD,IAAM,IAAO,EAAM,QAAQ;GAC3B,OAAO,GAAM,SAAS,CAAI,IAAI,IAAO;EACvC,CAAC,GACK,IAAS,QAAe,EAAa,UAAU,OAAO,GACtD,IAAS,QAAe,EAAa,UAAU,MAAM,GAMrD,IAAY,QACV,EAAa,UAAU,cAAe,EAAO,SAAS,EAAM,eAAe,EACnF,GACM,IAAW,QAAe,EAAU,SAAS,EAAO,KAAK,GAEzD,KAAe,EAAU,GAEzB,IAAiB,QAAe,EAAM,UAAU,GAAa,KAAK,GAElE,IAAiB,QACf,EAAM,UAAU,GAAa,EAAe,KAAK,CACzD,GA+BM,IAAQ,EAAmB,IAAI,GAE/B,IAAa,QAAe,EAAU,EAAM,KAAK,CAAC,GAUlD,KAAkB,EAAc,IAAI,GAOpC,IAAgB,EAA2B;GAC/C,WAAW;IAIT,IAAM,IAAQ,EAAK,SAAS,EAAU,QAAQ,EAAU,EAAM,KAAK,IAAI,EAAW;IAClF,OAAO,IAAQ,EAAM,EAAM,IAAI,CAAC,CAAC,WAAW,GAAgB;GAC9D;GACA,MAAM,MAAU;IACd,IAAM,IAAqB,MAAU,OAAO,OAAO;IACnD,GAAgB,QAAQ;IACxB,IAAM,IAAQ,EAAW;IAGzB,AAAI,MAAO,EAAM,QAAQ,EAAW,EAAM,EAAM,EAAM,IAAI,CAAC,CAAC,MAAM,CAAQ,GAAG,EAAM,MAAM;IAGzF,IAAM,IAAU,EAAK,SAAS,EAAU,QAAQ,EAAU,EAAM,KAAK,IAAI;IACzE,AAAI,MAAS,EAAM,QAAQ,EAAW,EAAM,EAAM,EAAQ,IAAI,CAAC,CAAC,MAAM,CAAQ,GAAG,EAAQ,MAAM;GACjG;EACF,CAAC,GAEK,KAAW,QAAe,CAAC,CAAC,EAAW,KAAK,GAC5C,KAAc,QAClB,EAAM,QAAQ,GAAc,EAAM,OAAO,EAAe,OAAO,EAAe,KAAK,IAAI,EACzF;EAIA,SAAS,KAAe;GACtB,IAAI,CAAC,EAAO,OAAO;IAGjB,EAAU,OAAO,MAAM;IACvB;GACF;GACA,IAAM,IAAQ,EAAS,OAAO;GAC9B,AAAI,KAAO,GAAmB,CAAK;EACrC;EAKA,IAAM,EAAE,SAAM,eAAW,gBAAY,oBAAgB,gBAAY,eAAW,yBAC1E,GAAc;GACZ;GACA;GACA,SAAS;GAIT,gBAAgB,EAAM,YAAY,CAAC,EAAS;GAC5C;GAGA,mBAAmB,CAAC,EAAO;GAC3B,cAAc;IAEZ,IAAI,CAAC,EAAU,OAAO;IACtB,IAAM,IAAQ,EAAW;IACzB,IAAI,GAAO,EAAM,QAAQ,EAAW,EAAM,MAAM,EAAM,MAAM;SACvD;KAKH,IAAM,oBAAM,IAAI,KAAK;KACrB,EAAM,QAAQ,EAAW,EAAI,SAAS,GAAG,GAAW,EAAI,WAAW,GAAG,EAAM,UAAU,CAAC;IACzF;IACA,EAAU,OAAO,MAAM;GACzB;GACA,eAAe;IACb,EAAU,OAAO,MAAM;GACzB;EACF,CAAC,GAWC,IAAa;EACjB,SAAS,IAAgB;GAGvB,AAFA,IAAa,IACb,GAAW,EAAI,GACf,IAAa;EACf;EAGA,SAAS,KAAU;GAEjB,AADI,EAAM,UAAO,EAAM,QAAQ,EAAM,QACrC,EAAc;EAChB;EAEA,SAAS,KAAS;GAChB,EAAc;EAChB;EAWA,SAAS,KAAa;GAQpB,AAPA,EAAM,QAAQ,MAIV,EAAO,SAAO,EAAW,EAAE,GAC/B,IAAa,IACb,EAAS,OAAO,MAAM,GACtB,IAAa;EACf;EAKA,IAAM,IAAI,EAAY,GAIhB,WAAmC,EAAc,UAAU,OAAO,OAAO,MAYzE,EACJ,OAAO,IACP,eACA,eACA,gBACA,mBACA,qBACE,GAAe;GACjB;GACA,cAAc,EAAO;GACrB,mBAAmB,GAAY;GAC/B,iBAAiB,EAAM;GACvB,aAAa,MAAS;IACpB,EAAM,QAAQ;GAChB;GACA,iBAAiB;GACjB,QAAQ;GACR,QAAQ,GAAO,GAAc,MAAc,EAAU,GAAc,CAAS;GAC5E,QAAQ,MAAS,GAAc,GAAM,EAAe,OAAO,GAAgB,CAAC;GAC5E,SAAS,MAAS,EAAW,GAAM,EAAe,KAAK;EACzD,CAAC;EAID,SAAS,GAAe,GAAsB;GAC5C,IAAI,CAAC,EAAO,OAAO;GACnB,IAAM,IAAK,EAAQ;GACd,OAEL;QAAI,EAAM,QAAQ,SAAS;KAMzB,AAFA,EAAM,eAAe,GACrB,EAAe,GACX,EAAK,SAAO,EAAc;KAC9B;IACF;IACA,IAAI,EAAM,QAAQ,eAAe,EAAK,SAAS,EAAU,OAAO;KAG9D,AADA,EAAM,eAAe,GACrB,GAAa;KACb;IACF;IACA,IAAI,EAAM,QAAQ,aAAa;KAC7B,IAAM,IAAQ,EAAG;KACjB,IACE,MAAU,QACV,MAAU,EAAG,gBACb,IAAQ,KACR,CAAC,KAAK,KAAK,EAAG,MAAM,IAAQ,MAAM,EAAE,GACpC;MAIA,EAAM,eAAe;MACrB,IAAM,IAAI,EAAS,EAAG,MAAM,MAAM,GAAG,CAAK,CAAC,CAAC,CAAC,QACvC,IAAS,EAAS,EAAG,KAAK;MAEhC,AADA,EAAW,EAAe,EAAO,MAAM,GAAG,IAAI,CAAC,IAAI,EAAO,MAAM,CAAC,CAAC,GAAG,EAAU,IAAI,CAAC,CAAC,GACrF,GAAW;KACb;KACA;IACF;IAIA,IACE,EAAM,IAAI,WAAW,KACrB,CAAC,EAAM,WACP,CAAC,EAAM,WACP,CAAC,EAAM,UACP,CAAC,KAAK,KAAK,EAAM,GAAG,GACpB;KACA,EAAM,eAAe;KACrB,IAAM,IAAS,EAAS,EAAG,KAAK;KAChC,AAAI,EAAO,WAAW,KAAG,EAAW,EAAe,IAAI,GAAQ,GAAG,CAAC;IACrE;GAvCA;EAwCF;EAMA,SAAS,GAAa,GAAuB;GAC3C,IAAI,CAAC,EAAO,OAAO;GACnB,IAAM,IAAK,EAAQ;GACnB,IAAI,CAAC,GAAI;GACT,EAAM,eAAe;GACrB,IAAM,KAAU,EAAM,eAAe,QAAQ,MAAM,KAAK,GAAA,CAAI,KAAK;GAGjE,IAAI,GAAY,CAAM,GAAG;IACvB,IAAM,IAAO,EAAW,GAAQ,EAAe,KAAK;IAEpD,AADA,EAAW,GAAM,EAAK,MAAM,GACxB,MAAW,EAAM,UAAO,EAAM,QAAQ;IAC1C;GACF;GACA,IAAM,IAAS,EAAS,EAAG,KAAK,GAC1B,IAAQ,EAAG,kBAAkB,EAAG,MAAM,QACtC,KAAM,EAAG,gBAAgB,GACzB,IAAO,EAAS,EAAG,MAAM,MAAM,GAAG,CAAK,CAAC,CAAC,CAAC,QAC1C,IAAK,EAAS,EAAG,MAAM,MAAM,GAAG,EAAG,CAAC,CAAC,CAAC,QACtC,IAAW,EAAS,CAAM,GAC1B,KAAQ,EAAO,MAAM,GAAG,CAAI,IAAI,IAAW,EAAO,MAAM,CAAE,EAAA,CAAG,MAAM,GAAG,CAAC;GAE7E,AADA,EAAW,EAAe,CAAI,GAAG,EAAU,KAAK,IAAI,IAAO,EAAS,QAAQ,EAAK,MAAM,GAAG,EAAI,CAAC,GAC/F,GAAW;EACb;EAEA,SAAS,KAAe;GAClB,CAAC,EAAO,SAAS,KACrB,GAAU,EAAK;EACjB;EAEA,SAAS,GAAc,GAAsB;GAC3C,IAAI,EAAO,SAAS,EAAM,QAAQ,YAAY,EAAK,OAAO;IAExD,AADA,EAAM,eAAe,GACrB,EAAc;IACd;GACF;GACA,GAAU,CAAK;EACjB;EAIA,IAAM,KAAU,QACd,EAAO,QAAQ,GAAS,EAAM,YAAY,EAAe,OAAO,EAAe,KAAK,IAAI,CAAC,CAC3F,GAWM,KAAa,MAAuB,CACxC,GAAG,EAAM,iBAA8B,mBAAiB,CAC1D;EAQA,SAAS,GAAmB,GAAoB;GAC9C,IAAM,IAAQ,EAAU,CAAK;GAC7B,IAAI,CAAC,EAAM,QAAQ;GACnB,IAAM,IAAU,GAAU,EAAM,KAAK,GAG/B,IAAK,EADT,MAAY,OAAO,IAAI,GAAM,KAAK,MAAM,IAAU,EAAM,UAAU,GAAG,GAAG,EAAM,SAAS,CAAC;GAM1F,AADA,GAAI,iBAAiB,EAAE,OAAO,SAAS,CAAC,GACxC,GAAI,MAAM,EAAE,eAAe,GAAK,CAAC;EACnC;EAMA,SAAS,EAAW,GAAe;GAEjC,AADA,EAAM,QAAQ,GACd,EAAc;EAChB;EAGA,SAAS,GAAe,GAAsB;GAC5C,IAAI,CAAC,EAAO,OAAO;GACnB,IAAM,IAAQ,EAAS,OAAO;GACzB,OACL;QAAI,EAAM,QAAQ,WAAW,EAAM,QAAQ,KAAK;KAM9C,IAAM,IAAS,SAAS,eAAsC,QAC5D,mBACF,CAAC,EAAE,QAAQ;KACX,IAAI,CAAC,GAAO;KAEZ,AADA,EAAM,eAAe,GACrB,EAAW,CAAK;KAChB;IACF;IACA,EAAc,GAAO,GAAO,EAAU,CAAK,GAAG,EAAE,UAAU,GAAK,CAAC;GADhE;EAEF;EAaA,IAAM,KAAW,QAEb,EAAM,aAAa,CAAC,EAAM,aAAa,GAAS,SAAU,EAAO,SAAS,CAAC,CAAC,GAAU,MAC1F,GACM,KAAU,QACd,EAAO,QAAQ,IAAiB,EAAU,QAAQ,EAAM,aAAa,KAAA,CACvE,GAWM,KAAe,QACnB,EAAO,QAAQ,EAAE,MAAM,UAAU,WAAW,EAAE,MAAM,UAAU,UAChE;EAEA,SAAS,KAAY;GACnB,AAAI,EAAK,QAAO,EAAc,IACzB,GAAU,EAAI;EACrB;yBAIE,EAkIM,OAAA;YAjIA;GAAJ,KAAI;GACJ,OAAK,GAAA,CAAC,gBACE,EAAA,EAAA,CAAS,CAAA;GAChB,OAAK,GAAE,EAAA,EAAA,CAAS;GAChB,aAAW,EAAA,CAAA,IAAI,KAAQ,KAAA;GACvB,aAAW,EAAA;GACX,YAAQ,AAAA,EAAA,QAAA,GAAA,MAAE,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,CAAA,GAAA,CAAA;GACV,WAAS;MAEV,GA4DM,OA5DN,IA4DM,CA3DJ,GAqCM,OAAA;GArCD,OAAM;GAAwB,SAAK,AAAA,EAAA,QAAA,GAAA,MAAE,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,CAAA,GAAA,CAAA;MAKxC,EA+BE,IA/BF,GA+BE;YA9BI;GAAJ,KAAI;eACK,EAAA,CAAA;oDAAU,QAAA,IAAA;GAClB,WAAW,EAAA,QAAM,YAAe,KAAA;GAChC,cAAc,EAAA,QAAM,QAAW,KAAA;KACxB,EAAA,EAAA,GAAc;GACrB,UAAQ,CAAG,EAAA;GACX,OAAO,EAAA;GACP,MAAM,EAAA;GACN,aAAa,EAAA,gBAAgB,EAAA,QAAS,EAAA,CAAA,CAAC,CAAC,UAAU,kBAAkB,KAAA;GACpE,MAAM,EAAA;GACN,SAAS,EAAA;GACT,UAAU,EAAA;GACV,SAAS,EAAA;GACT,WAAW,EAAA;GACX,iBAAe,GAAA;GACf,eAAa,EAAA,CAAA,CAAC,CAAC,UAAU;GACzB,YAAU,GAAA;GACV,kBAAgB,GAAA;GAChB,MAAM,EAAA,QAAQ,aAAgB,KAAA;GAC9B,iBAAe,EAAA,QAAY,EAAA,QAAM,YAAA,WAA2B,KAAA;GAC5D,iBAAe,EAAA,QAAW,EAAA,CAAA,IAAO,KAAA;GACjC,iBAAe,EAAA,QAAW,EAAA,CAAA,IAAU,KAAA;GACpC,mBAAgB;GAChB,SAAO;GACP,SAAO;GACP,SAAO,EAAA,EAAA;GACP,UAAQ,EAAA,CAAA;GACR,QAAM,EAAA,CAAA;GACN,WAAS;GACT,SAAO;;;;;;;;;;;;;;;;;;;;;;;;;QAYJ,EAAA,UAAc,SAAc,EAAA,UAAY,cAAA,EAAA,GADhD,EAYU,GAAA;;eAVC,EAAA;4CAAa,QAAA;GACtB,OAAM;GACN,WAAA;GACA,SAAQ;GACP,MAAM,EAAA;GACN,SAAS,EAAA;GACT,OAAO,EAAA,CAAA,CAAC,CAAC,WAAW;;oBAE8B,CAAnD,EAAmD,GAAA;IAAtC,OAAM;IAAM,OAAO,EAAA,CAAA,CAAC,CAAC,WAAW;2BAC7C,EAAmD,GAAA;IAAtC,OAAM;IAAM,OAAO,EAAA,CAAA,CAAC,CAAC,WAAW;;;;;;;;sBAQzC,EAAA,SAAA,EAAA,GADR,EAsDW,GAAA;;GApDR,IAAI,EAAA,CAAA;YACD;GAAJ,KAAI;GACI,MAAM,EAAA,CAAA;8CAAI,QAAA,IAAA;GAClB,MAAK;GACL,QAAO;GACN,WAAW,EAAA;GACZ,SAAA;GACC,MAAM,EAAA,QAAM,YAAA;GACZ,OAAK,GAAE,EAAA,QAAM,gCAAA,oBAAA;GACb,aAAW,EAAA,QAAS,EAAA,OAAO,KAAA;GAC3B,gBAAc,EAAA,SAAU,EAAA,UAAO,KAAQ,KAAA;GACvC,cAAY,EAAA,UAAU,EAAA,QAAS,EAAA,CAAA,CAAC,CAAC,UAAU,YAAY,EAAA,CAAA,CAAC,CAAC,UAAU;GACnE,aAAW,EAAA,EAAA;GACX,WAAS;;qBAKM,EAAA,SAAA,EAAA,EAAA,GACd,EAYS,IAAA,EAAA,KAAA,EAAA,GAAA,GAXU,GAAA,QAAV,YADT,EAYS,UAAA;IAVN,KAAK,EAAO;IACb,MAAK;IACL,MAAK;IACL,UAAS;IACT,OAAM;IACL,cAAY,EAAO;IACnB,iBAAe,EAAO,UAAU,EAAA,QAAK,SAAA;IACrC,UAAK,MAAE,EAAW,EAAO,KAAK;QAE5B,EAAO,KAAK,GAAA,GAAA,EAAA,mBAQnB,EAac,IAAA;;aAXR;IAAJ,KAAI;gBACK,EAAA;6CAAK,QAAA;IACb,QAAQ,EAAA;IACR,QAAQ,EAAA;IACR,eAAa,EAAA;IACb,WAAS;;IAEC,QAAM,QACwE,CAAvF,EAAuF,GAAA;KAA9E,SAAQ;KAAQ,MAAK;KAAW,SAAO;;sBAA6B,CAAA,GAAA,EAAlB,EAAA,CAAA,CAAC,CAAC,OAAO,MAAM,GAAA,CAAA,CAAA,CAAA;;QAC1E,EAA0D,GAAA,EAAhD,SAAO,GAAO,GAAA;sBAAwB,CAAA,GAAA,EAAnB,EAAA,CAAA,CAAC,CAAC,OAAO,OAAO,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
@layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
|
|
2
|
+
@layer vectis.components{.v-time-picker{gap:var(--vectis-space-4);width:max-content;font-family:var(--vectis-text-family);color:var(--vectis-color-text);flex-direction:column;display:flex}.v-time-picker-header{justify-content:center;align-items:center;gap:var(--vectis-space-3);display:flex}.v-time-picker-time{justify-content:center;align-items:center;gap:var(--vectis-space-2);direction:ltr;display:flex}.v-time-picker-cell[data-size]{width:var(--control-height);font-size:var(--vectis-text-heading-1-size);font-weight:var(--vectis-text-heading-2-weight);font-variant-numeric:tabular-nums}.v-time-picker-sep{font-size:var(--vectis-text-heading-2-size);color:var(--vectis-color-text);-webkit-user-select:none;user-select:none}.v-time-picker-meridiem{flex:none}.v-time-picker-face{inline-size:var(--vectis-control-size-time-picker-dial);block-size:var(--vectis-control-size-time-picker-dial);border-radius:var(--vectis-radius-pill);background:var(--vectis-color-surface-muted);touch-action:none;-webkit-user-select:none;user-select:none;cursor:pointer;--dial-radius:calc(var(--vectis-control-size-time-picker-dial) / 2 - var(--vectis-control-size-time-picker-number) / 2);align-self:center;position:relative}.v-time-picker-face:focus-visible{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-time-picker-number{left:calc(50% + var(--dial-radius) * sin(var(--dial-turn) * 1turn));top:calc(50% - var(--dial-radius) * cos(var(--dial-turn) * 1turn));inline-size:var(--vectis-control-size-time-picker-number);block-size:var(--vectis-control-size-time-picker-number);border-radius:var(--vectis-radius-pill);font-size:var(--vectis-text-body-lg-size);color:var(--vectis-color-text);z-index:1;pointer-events:none;place-items:center;display:grid;position:absolute;translate:-50% -50%}.v-time-picker-number[data-ring=inner],.v-time-picker-hand[data-ring=inner]{--dial-radius:calc(var(--vectis-control-size-time-picker-dial) / 2 - var(--vectis-control-size-time-picker-number) * 1.5)}.v-time-picker-number[data-ring=inner]{font-size:var(--vectis-text-body-md-size);color:var(--vectis-color-text-muted)}.v-time-picker-number[data-selected]{color:var(--vectis-color-text-on-accent)}.v-time-picker-hand{left:calc(50% - var(--vectis-control-size-time-picker-hand) / 2);inline-size:var(--vectis-control-size-time-picker-hand);block-size:var(--dial-radius);background:var(--vectis-color-accent);transform-origin:50% 100%;rotate:calc(var(--dial-turn) * 1turn);position:absolute;bottom:50%}.v-time-picker-hand:before{content:"";inline-size:var(--vectis-control-size-time-picker-number);block-size:var(--vectis-control-size-time-picker-number);border-radius:var(--vectis-radius-pill);background:var(--vectis-color-accent);transition:inline-size var(--vectis-duration-fast) var(--vectis-ease-default), block-size var(--vectis-duration-fast) var(--vectis-ease-default);position:absolute;top:0;left:50%;translate:-50% -50%}.v-time-picker-hand[data-minor]:before{inline-size:var(--vectis-control-size-time-picker-hand-minor);block-size:var(--vectis-control-size-time-picker-hand-minor)}.v-time-picker-center{inline-size:var(--vectis-control-size-time-picker-center);block-size:var(--vectis-control-size-time-picker-center);border-radius:var(--vectis-radius-pill);background:var(--vectis-color-accent);position:absolute;top:50%;left:50%;translate:-50% -50%}.v-time-picker-footer{justify-content:flex-end;align-items:center;gap:var(--vectis-space-2);display:flex}@media (prefers-reduced-motion:reduce){.v-time-picker-hand:before{transition:none}}}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { HourFormat } from '../../utils/time.js';
|
|
2
|
+
/**
|
|
3
|
+
* A clock shown directly in the page, for choosing a time. It is the hour-and-minute
|
|
4
|
+
* counterpart of VDatePicker: VTimeInput does no more than dress it in a text field and a
|
|
5
|
+
* popover, and it is perfectly usable on its own.
|
|
6
|
+
*
|
|
7
|
+
* It is read in three parts. Two large numerals at the top say what has been chosen so
|
|
8
|
+
* far, and switch between adjusting the hour and adjusting the minutes; on a 12-hour clock
|
|
9
|
+
* the choice between morning and afternoon sits beside them, since it is read as part of
|
|
10
|
+
* that same time. Below them is the face itself, where one points at a time rather than
|
|
11
|
+
* stepping through it.
|
|
12
|
+
*
|
|
13
|
+
* Nothing native covers choosing a value by pointing at an angle, so the JavaScript does
|
|
14
|
+
* two things: it turns a point on the face into a time — measuring the face once, then
|
|
15
|
+
* pure trigonometry that lives in `utils/time` — and it implements the keyboard of a
|
|
16
|
+
* slider, the arrows and the Home, End and Page keys.
|
|
17
|
+
*
|
|
18
|
+
* Everything one SEES is CSS: the numerals are placed around the circle, and the hand is
|
|
19
|
+
* turned, from a single unitless fraction of a turn written inline.
|
|
20
|
+
*
|
|
21
|
+
* There is exactly ONE focusable element on the face, and it is announced as a slider. The
|
|
22
|
+
* numerals are visual markers hidden from screen readers, reached by the pointer's angle
|
|
23
|
+
* rather than one cell at a time — which is why the whole spoken value has to be carried
|
|
24
|
+
* by that one element.
|
|
25
|
+
*/
|
|
26
|
+
export type TimePickerFormat = HourFormat;
|
|
27
|
+
/** Which of the two halves of a time is being adjusted. */
|
|
28
|
+
export type TimePickerStep = 'hour' | 'minute';
|
|
29
|
+
interface TimePickerProps {
|
|
30
|
+
/**
|
|
31
|
+
* Whether the face shows a 12- or a 24-hour clock. Left out, the reader's language
|
|
32
|
+
* decides, which is almost always what one wants.
|
|
33
|
+
*/
|
|
34
|
+
format?: TimePickerFormat;
|
|
35
|
+
/**
|
|
36
|
+
* A BCP 47 locale, which decides the clock. It TAKES PRECEDENCE over the design
|
|
37
|
+
* system's global locale and falls back to it — which is why it has no literal default:
|
|
38
|
+
* `undefined` has to stay recognizable for the global locale to have its chance.
|
|
39
|
+
*/
|
|
40
|
+
locale?: string;
|
|
41
|
+
/** The interval the minutes snap to, both when dragging and with the arrow keys. */
|
|
42
|
+
minuteStep?: number;
|
|
43
|
+
}
|
|
44
|
+
type __VLS_Props = TimePickerProps;
|
|
45
|
+
type __VLS_Slots = {
|
|
46
|
+
/** A strip at the foot of the clock — the place for actions such as Cancel and OK. */
|
|
47
|
+
footer?(): unknown;
|
|
48
|
+
};
|
|
49
|
+
type __VLS_ModelProps = {
|
|
50
|
+
/**
|
|
51
|
+
* The time, always as a 24-hour "HH:mm" string whatever clock is displayed. A consumer
|
|
52
|
+
* therefore never has to know which clock the reader's language uses.
|
|
53
|
+
*
|
|
54
|
+
* With no value at all the clock shows midnight. It is deliberately NOT the current time:
|
|
55
|
+
* reading the clock while rendering would make a page drawn on a server disagree with the
|
|
56
|
+
* same page in the browser. A component that wants to open on the current time sets it
|
|
57
|
+
* from a handler — which is exactly what VTimeInput does.
|
|
58
|
+
*/
|
|
59
|
+
modelValue?: string | null;
|
|
60
|
+
};
|
|
61
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
62
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
|
|
63
|
+
/** Moves the focus onto the clock face, which is what the arrow keys drive. */
|
|
64
|
+
focus: (options?: FocusOptions) => void | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Puts the clock back on the hour and clears the announcement, WITHOUT announcing
|
|
67
|
+
* anything itself. A component holding this one in a panel calls it as the panel opens
|
|
68
|
+
* and closes, so that every visit starts on the hour.
|
|
69
|
+
*/
|
|
70
|
+
reset: () => void;
|
|
71
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
72
|
+
confirm: () => any;
|
|
73
|
+
"update:modelValue": (value: string | null) => any;
|
|
74
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
75
|
+
onConfirm?: (() => any) | undefined;
|
|
76
|
+
"onUpdate:modelValue"?: ((value: string | null) => any) | undefined;
|
|
77
|
+
}>, {
|
|
78
|
+
minuteStep: number;
|
|
79
|
+
format: TimePickerFormat;
|
|
80
|
+
locale: string;
|
|
81
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
82
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
83
|
+
declare const _default: typeof __VLS_export;
|
|
84
|
+
export default _default;
|
|
85
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
86
|
+
new (): {
|
|
87
|
+
$slots: S;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import './VTimePicker.css';
|
|
2
|
+
import e from "./VTimePicker.vue_vue_type_script_setup_true_lang.js";
|
|
3
|
+
/* empty css */
|
|
4
|
+
//#region src/components/VTimePicker/VTimePicker.vue
|
|
5
|
+
var t = e;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { t as default };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=VTimePicker.js.map
|