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 @@
|
|
|
1
|
+
{"version":3,"file":"useFieldPanel.js","names":[],"sources":["../../src/composables/useFieldPanel.ts"],"sourcesContent":["import { ref } from 'vue'\nimport type { Ref } from 'vue'\n\nimport { useFocusoutDismiss } from './useFocusoutDismiss'\n\n/** The least this needs of the field: something it can put the focus back on. */\ninterface FocusableField {\n focus: () => void\n}\n\n/** The least this needs of the panel: something it can open and close. */\ninterface PanelControl {\n show: () => void\n hide: () => void\n}\n\nexport interface UseFieldPanelOptions {\n /** The component's root, against which \"the focus has left\" is judged. */\n rootEl: Ref<HTMLElement | null>\n /** The panel to open and close. */\n panelRef: Ref<PanelControl | null>\n /** The field the focus returns to. */\n fieldEl: Ref<FocusableField | null>\n /**\n * Whether opening is refused. It is the SINGLE cut-off point: every route in passes\n * through it, so a component never has to repeat the condition per handler.\n */\n disabled: () => boolean\n /** Moves the focus INTO the open panel — where in it is the component's business. */\n focusInPanel: () => void\n /** What the component needs to do as the panel opens: prepare a draft, reset a step. */\n onOpen?: () => void\n /** What it needs to do as the panel closes: clear an announcement, for instance. */\n onClose?: () => void\n /**\n * Whether the focus should enter the panel when it opens. It does by default.\n *\n * A field one TYPES into says no: its panel opens without taking the caret, so typing\n * carries on and the down arrow remains the one explicit way in.\n */\n focusOnOpen?: () => boolean\n}\n\n// @a11y @keyboard @core\n/**\n * The shell shared by the date and the time picker: a field, and a panel below it that\n * nothing dismisses by itself. Neither component owns this — it belongs to both.\n *\n * A panel of that kind does NOTHING on its own: it does not close on a click outside, does\n * not take the focus, and does not hand it back. What follows is exactly that minimum,\n * and nothing more; whatever is particular to one component arrives through the three\n * callbacks above.\n *\n * TRAP — the panel is WRITTEN to directly and READ back through a model. The state here is\n * meant to be bound to the panel, which feeds it from its own events, but the opening\n * itself must stay synchronous: the frame scheduled to move the focus assumes the panel is\n * already open by the time it runs, and going through the model would put a tick in\n * between.\n */\nexport function useFieldPanel(options: UseFieldPanelOptions) {\n const open = ref(false)\n\n function openPanel(moveFocus = options.focusOnOpen?.() ?? true) {\n if (options.disabled() || open.value) return\n options.onOpen?.()\n options.panelRef.value?.show()\n // @a11y\n // The focus has to be moved by hand — the platform moves it into no panel of this\n // kind. It waits a frame because the panel has not been painted by the time it is\n // asked to open, and nothing invisible can take the focus.\n if (moveFocus) requestAnimationFrame(() => options.focusInPanel())\n }\n\n function closePanel(refocus = false) {\n if (!open.value) return\n options.panelRef.value?.hide()\n options.onClose?.()\n if (refocus) options.fieldEl.value?.focus()\n }\n\n function onControlClick(event: MouseEvent) {\n // A click on one of the field's own buttons — the clear cross, an icon — is left to\n // that button's handler: reacting here as well would open the panel the cross has\n // just given a reason to close.\n if ((event.target as HTMLElement).closest('.v-input-action')) return\n if (options.disabled()) return\n openPanel()\n }\n\n // @a11y\n /**\n * Closes as soon as the focus leaves the component — the panel included, which is a\n * descendant of it even while floating above the page.\n */\n const onFocusout = useFocusoutDismiss(options.rootEl, () => closePanel(false))\n\n // @a11y\n /*\n * TRAP — clicking a part of the panel that cannot take focus (its padding, the gutter\n * between two cells, the empty space in a navigation bar) makes the browser take the\n * focus off whatever had it and hand it back to the page body. The handler above then\n * sees the focus leave with nowhere to go, reads it as an exit — rightly — and closes a\n * panel the reader has just clicked on.\n *\n * So the focus is held in place, but ONLY outside things that can take it. An\n * unconditional cancellation, as VCombobox uses — where the focus never leaves the field\n * anyway — would here rob the days and the navigation arrows of the focus, and leave the\n * calendar's keyboard pointing at nothing.\n *\n * None of this is visible in the unit tests, where clicking moves no focus; browser tests\n * cover it.\n */\n function onPanelMousedown(event: MouseEvent) {\n const target = event.target as HTMLElement | null\n if (!target?.closest('button, a, input, select, textarea, [tabindex]')) event.preventDefault()\n }\n\n // @keyboard @a11y\n function onKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n if (open.value) {\n event.preventDefault()\n closePanel(true)\n }\n return\n }\n // TRAP — a key already consumed INSIDE the panel is ignored here. An Enter that\n // selected a day or confirmed the dial has just CLOSED the panel, and without this\n // guard it would reopen it immediately as it travels up to the root.\n if (\n (event.key === 'ArrowDown' || event.key === 'Enter') &&\n !open.value &&\n !event.defaultPrevented\n ) {\n event.preventDefault()\n // Opened from the KEYBOARD, the panel always takes the focus, whatever the component\n // asked for: otherwise the down arrow would open a panel the keyboard could not\n // reach.\n openPanel(true)\n }\n }\n\n return {\n open,\n openPanel,\n closePanel,\n onControlClick,\n onFocusout,\n onKeydown,\n onPanelMousedown,\n }\n}\n"],"mappings":";;;AA2DA,SAAgB,EAAc,GAA+B;CAC3D,IAAM,IAAO,EAAI,EAAK;CAEtB,SAAS,EAAU,IAAY,EAAQ,cAAc,KAAK,IAAM;EAC1D,EAAQ,SAAS,KAAK,EAAK,UAC/B,EAAQ,SAAS,GACjB,EAAQ,SAAS,OAAO,KAAK,GAKzB,KAAW,4BAA4B,EAAQ,aAAa,CAAC;CACnE;CAEA,SAAS,EAAW,IAAU,IAAO;EAC9B,EAAK,UACV,EAAQ,SAAS,OAAO,KAAK,GAC7B,EAAQ,UAAU,GACd,KAAS,EAAQ,QAAQ,OAAO,MAAM;CAC5C;CAEA,SAAS,EAAe,GAAmB;EAIpC,EAAM,OAAuB,QAAQ,iBAAiB,KACvD,EAAQ,SAAS,KACrB,EAAU;CACZ;CAOA,IAAM,IAAa,EAAmB,EAAQ,cAAc,EAAW,EAAK,CAAC;CAkB7E,SAAS,EAAiB,GAAmB;EAE3C,AADe,EAAM,QACR,QAAQ,gDAAgD,KAAG,EAAM,eAAe;CAC/F;CAGA,SAAS,EAAU,GAAsB;EACvC,IAAI,EAAM,QAAQ,UAAU;GAC1B,AAAI,EAAK,UACP,EAAM,eAAe,GACrB,EAAW,EAAI;GAEjB;EACF;EAIA,CACG,EAAM,QAAQ,eAAe,EAAM,QAAQ,YAC5C,CAAC,EAAK,SACN,CAAC,EAAM,qBAEP,EAAM,eAAe,GAIrB,EAAU,EAAI;CAElB;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* Everything an area needs in order to accept files dropped onto it, and to show that it
|
|
4
|
+
* is ready to receive them. Both the file field and the drop zone are built on it.
|
|
5
|
+
*
|
|
6
|
+
* Two traps live here, which is the whole reason this exists once rather than twice.
|
|
7
|
+
*
|
|
8
|
+
* The browser must be told explicitly, while the file is being dragged over the area,
|
|
9
|
+
* that a drop is welcome. Left unsaid, it refuses the drop and then NAVIGATES to the
|
|
10
|
+
* file, replacing the page the reader was on.
|
|
11
|
+
*
|
|
12
|
+
* And what is counted is a DEPTH, not a yes-or-no. The browser reports the pointer
|
|
13
|
+
* LEAVING every time it crosses into a child element — a field, a chip, a button inside
|
|
14
|
+
* the area — so a simple flag would switch off under the cursor and the highlight would
|
|
15
|
+
* flicker. A drop forces the count back to zero, because a drag that leaves the window
|
|
16
|
+
* altogether never reports the departure that would have balanced it; asking instead
|
|
17
|
+
* whether the pointer went to a descendant, the other well-known fix, is no use since
|
|
18
|
+
* there is precisely nothing to ask about in that case.
|
|
19
|
+
*
|
|
20
|
+
* Whether the area accepts anything is read at the moment of the event rather than
|
|
21
|
+
* captured once, so a component turned off in the middle of a drag stops accepting
|
|
22
|
+
* without anything being re-attached.
|
|
23
|
+
*/
|
|
24
|
+
export declare function useFileDrop(enabled: () => boolean, onFiles: (files: File[]) => void): {
|
|
25
|
+
dragging: ComputedRef<boolean>;
|
|
26
|
+
onDragEnter: (event: DragEvent) => void;
|
|
27
|
+
onDragOver: (event: DragEvent) => void;
|
|
28
|
+
onDragLeave: () => void;
|
|
29
|
+
onDrop: (event: DragEvent) => void;
|
|
30
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { computed as e, ref as t } from "vue";
|
|
2
|
+
//#region src/composables/useFileDrop.ts
|
|
3
|
+
function n(n, r) {
|
|
4
|
+
let i = t(0);
|
|
5
|
+
function a(e) {
|
|
6
|
+
n() && (e.preventDefault(), i.value += 1);
|
|
7
|
+
}
|
|
8
|
+
function o(e) {
|
|
9
|
+
n() && (e.preventDefault(), e.dataTransfer && (e.dataTransfer.dropEffect = "copy"));
|
|
10
|
+
}
|
|
11
|
+
function s() {
|
|
12
|
+
n() && (i.value = Math.max(0, i.value - 1));
|
|
13
|
+
}
|
|
14
|
+
function c(e) {
|
|
15
|
+
n() && (e.preventDefault(), i.value = 0, r([...e.dataTransfer?.files ?? []]));
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
dragging: e(() => i.value > 0),
|
|
19
|
+
onDragEnter: a,
|
|
20
|
+
onDragOver: o,
|
|
21
|
+
onDragLeave: s,
|
|
22
|
+
onDrop: c
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { n as useFileDrop };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=useFileDrop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileDrop.js","names":[],"sources":["../../src/composables/useFileDrop.ts"],"sourcesContent":["import { computed, ref, type ComputedRef } from 'vue'\n\n// @core\n/**\n * Everything an area needs in order to accept files dropped onto it, and to show that it\n * is ready to receive them. Both the file field and the drop zone are built on it.\n *\n * Two traps live here, which is the whole reason this exists once rather than twice.\n *\n * The browser must be told explicitly, while the file is being dragged over the area,\n * that a drop is welcome. Left unsaid, it refuses the drop and then NAVIGATES to the\n * file, replacing the page the reader was on.\n *\n * And what is counted is a DEPTH, not a yes-or-no. The browser reports the pointer\n * LEAVING every time it crosses into a child element — a field, a chip, a button inside\n * the area — so a simple flag would switch off under the cursor and the highlight would\n * flicker. A drop forces the count back to zero, because a drag that leaves the window\n * altogether never reports the departure that would have balanced it; asking instead\n * whether the pointer went to a descendant, the other well-known fix, is no use since\n * there is precisely nothing to ask about in that case.\n *\n * Whether the area accepts anything is read at the moment of the event rather than\n * captured once, so a component turned off in the middle of a drag stops accepting\n * without anything being re-attached.\n */\nexport function useFileDrop(\n enabled: () => boolean,\n onFiles: (files: File[]) => void,\n): {\n dragging: ComputedRef<boolean>\n onDragEnter: (event: DragEvent) => void\n onDragOver: (event: DragEvent) => void\n onDragLeave: () => void\n onDrop: (event: DragEvent) => void\n} {\n const depth = ref(0)\n\n function onDragEnter(event: DragEvent) {\n if (!enabled()) return\n event.preventDefault()\n depth.value += 1\n }\n\n function onDragOver(event: DragEvent) {\n if (!enabled()) return\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy'\n }\n\n function onDragLeave() {\n if (!enabled()) return\n depth.value = Math.max(0, depth.value - 1)\n }\n\n function onDrop(event: DragEvent) {\n if (!enabled()) return\n event.preventDefault()\n depth.value = 0\n onFiles([...(event.dataTransfer?.files ?? [])])\n }\n\n return {\n dragging: computed(() => depth.value > 0),\n onDragEnter,\n onDragOver,\n onDragLeave,\n onDrop,\n }\n}\n"],"mappings":";;AAyBA,SAAgB,EACd,GACA,GAOA;CACA,IAAM,IAAQ,EAAI,CAAC;CAEnB,SAAS,EAAY,GAAkB;EAChC,EAAQ,MACb,EAAM,eAAe,GACrB,EAAM,SAAS;CACjB;CAEA,SAAS,EAAW,GAAkB;EAC/B,EAAQ,MACb,EAAM,eAAe,GACjB,EAAM,iBAAc,EAAM,aAAa,aAAa;CAC1D;CAEA,SAAS,IAAc;EAChB,EAAQ,MACb,EAAM,QAAQ,KAAK,IAAI,GAAG,EAAM,QAAQ,CAAC;CAC3C;CAEA,SAAS,EAAO,GAAkB;EAC3B,EAAQ,MACb,EAAM,eAAe,GACrB,EAAM,QAAQ,GACd,EAAQ,CAAC,GAAI,EAAM,cAAc,SAAS,CAAC,CAAE,CAAC;CAChD;CAEA,OAAO;EACL,UAAU,QAAe,EAAM,QAAQ,CAAC;EACxC;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import { FileLimits, FileRejection } from '../utils/file.js';
|
|
3
|
+
export interface FileFieldOptions {
|
|
4
|
+
/** The component's value — always a list of files, whether one or several are allowed. */
|
|
5
|
+
model: Ref<File[]>;
|
|
6
|
+
/** The attributes the consumer wrote, minus styling, still to be split in two. */
|
|
7
|
+
forwardedAttrs: ComputedRef<Record<string, unknown>>;
|
|
8
|
+
/** Read at the moment of the event, so a component turned off mid-way stops accepting. */
|
|
9
|
+
enabled: () => boolean;
|
|
10
|
+
multiple: () => boolean;
|
|
11
|
+
/** The limits as the consumer set them: capping a single-file field at one happens here. */
|
|
12
|
+
limits: () => FileLimits;
|
|
13
|
+
onReject: (rejection: FileRejection) => void;
|
|
14
|
+
onChange: (files: File[]) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Attributes to withhold from the visible control as well.
|
|
17
|
+
*
|
|
18
|
+
* The file field withholds the link to its descriptive text because it puts that list
|
|
19
|
+
* together itself, and a binding written after the spread would silently replace the
|
|
20
|
+
* consumer's rather than being merged with it.
|
|
21
|
+
*/
|
|
22
|
+
excludeFromControl?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function useFileField(options: FileFieldOptions): {
|
|
25
|
+
fileEl: Ref<HTMLInputElement | null, HTMLInputElement | null>;
|
|
26
|
+
nativeAttrs: ComputedRef<{
|
|
27
|
+
[k: string]: unknown;
|
|
28
|
+
}>;
|
|
29
|
+
controlAttrs: ComputedRef<{
|
|
30
|
+
[k: string]: unknown;
|
|
31
|
+
}>;
|
|
32
|
+
acceptFiles: (incoming: File[]) => void;
|
|
33
|
+
onNativeChange: (event: Event) => void;
|
|
34
|
+
openPicker: () => void;
|
|
35
|
+
resetNative: () => void;
|
|
36
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { screenFiles as e } from "../utils/file.js";
|
|
2
|
+
import { computed as t, ref as n } from "vue";
|
|
3
|
+
//#region src/composables/useFileField.ts
|
|
4
|
+
var r = [
|
|
5
|
+
"name",
|
|
6
|
+
"required",
|
|
7
|
+
"form",
|
|
8
|
+
"capture"
|
|
9
|
+
];
|
|
10
|
+
function i(i) {
|
|
11
|
+
let a = n(null), o = t(() => Object.fromEntries(Object.entries(i.forwardedAttrs.value).filter(([e]) => r.includes(e)))), s = t(() => {
|
|
12
|
+
let e = i.excludeFromControl ?? [];
|
|
13
|
+
return Object.fromEntries(Object.entries(i.forwardedAttrs.value).filter(([t]) => !r.includes(t) && !e.includes(t)));
|
|
14
|
+
});
|
|
15
|
+
function c() {
|
|
16
|
+
a.value && (a.value.value = "");
|
|
17
|
+
}
|
|
18
|
+
function l(t) {
|
|
19
|
+
let n = i.multiple(), r = n ? i.model.value : [], a = i.limits(), { accepted: o, rejected: s } = e(t, r, {
|
|
20
|
+
...a,
|
|
21
|
+
maxFiles: n ? a.maxFiles : 1
|
|
22
|
+
});
|
|
23
|
+
for (let e of s) i.onReject(e);
|
|
24
|
+
c(), o.length !== 0 && (i.model.value = [...r, ...o], i.onChange(i.model.value));
|
|
25
|
+
}
|
|
26
|
+
function u(e) {
|
|
27
|
+
l([...e.target.files ?? []]);
|
|
28
|
+
}
|
|
29
|
+
function d() {
|
|
30
|
+
i.enabled() && a.value?.click();
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
fileEl: a,
|
|
34
|
+
nativeAttrs: o,
|
|
35
|
+
controlAttrs: s,
|
|
36
|
+
acceptFiles: l,
|
|
37
|
+
onNativeChange: u,
|
|
38
|
+
openPicker: d,
|
|
39
|
+
resetNative: c
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { i as useFileField };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=useFileField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFileField.js","names":[],"sources":["../../src/composables/useFileField.ts"],"sourcesContent":["// @core\n/**\n * The hidden file control both file components are built around — the one that actually\n * opens the operating system's file dialog.\n *\n * The code here is imposed by the browser rather than chosen. A file dialog opens ONLY\n * from a genuine click on a file control, and the list of chosen files cannot be handed\n * to that control from a template the way any other value would be. So the thing the\n * reader sees and clicks can never BE the file control, and the file control can only\n * ever be a SOURCE of files. That is exactly the shape of what follows.\n *\n * The rules deciding which files are acceptable live apart from this, on their own; what\n * was left duplicated between the two components was the wiring around them.\n */\nimport { computed, ref, type ComputedRef, type Ref } from 'vue'\n\nimport { screenFiles, type FileLimits, type FileRejection } from '../utils/file'\n\n// @a11y\n/**\n * The attributes that belong on the hidden file control rather than on the visible one.\n *\n * The usual split assumes a single element that does the work, and there are two here, so\n * the attributes go into three piles instead of two: styling stays on the outermost\n * element, these four go to the hidden control because they are what the FORM reads —\n * the field's name, whether it is mandatory, which form it belongs to, and whether the\n * camera should open — and everything else goes to the element the READER focuses.\n *\n * The three piles never overlap, and that matters: an identifier applied twice would\n * break a label the consumer wrote for the field, and a name applied twice would have it\n * announced twice.\n */\nconst NATIVE_ONLY = ['name', 'required', 'form', 'capture']\n\nexport interface FileFieldOptions {\n /** The component's value — always a list of files, whether one or several are allowed. */\n model: Ref<File[]>\n /** The attributes the consumer wrote, minus styling, still to be split in two. */\n forwardedAttrs: ComputedRef<Record<string, unknown>>\n /** Read at the moment of the event, so a component turned off mid-way stops accepting. */\n enabled: () => boolean\n multiple: () => boolean\n /** The limits as the consumer set them: capping a single-file field at one happens here. */\n limits: () => FileLimits\n onReject: (rejection: FileRejection) => void\n onChange: (files: File[]) => void\n /**\n * Attributes to withhold from the visible control as well.\n *\n * The file field withholds the link to its descriptive text because it puts that list\n * together itself, and a binding written after the spread would silently replace the\n * consumer's rather than being merged with it.\n */\n excludeFromControl?: readonly string[]\n}\n\nexport function useFileField(options: FileFieldOptions) {\n const fileEl = ref<HTMLInputElement | null>(null)\n\n const nativeAttrs = computed(() =>\n Object.fromEntries(\n Object.entries(options.forwardedAttrs.value).filter(([key]) => NATIVE_ONLY.includes(key)),\n ),\n )\n\n const controlAttrs = computed(() => {\n const excluded = options.excludeFromControl ?? []\n return Object.fromEntries(\n Object.entries(options.forwardedAttrs.value).filter(\n ([key]) => !NATIVE_ONLY.includes(key) && !excluded.includes(key),\n ),\n )\n })\n\n /**\n * TRAP — choosing the SAME file again, after clearing the field or removing that file\n * from the list, reports nothing at all: as far as the hidden control is concerned its\n * value never changed. The file then becomes impossible to pick, with nothing to show\n * for it. Emptying the control on every path out is what keeps it selectable.\n */\n function resetNative() {\n if (fileEl.value) fileEl.value.value = ''\n }\n\n /**\n * The one way files get into the value: the operating system's dialog and a drop onto\n * the component both arrive here.\n *\n * A file the limits refuse is REFUSED outright — it never enters the value at all — and\n * every refusal is reported so the component can say why. The screening itself is a\n * plain function elsewhere, which is what makes the ORDER of the reasons testable\n * without putting a component on screen.\n */\n function acceptFiles(incoming: File[]) {\n const multiple = options.multiple()\n const current = multiple ? options.model.value : []\n const limits = options.limits()\n const { accepted, rejected } = screenFiles(incoming, current, {\n ...limits,\n // A single-file field is a list capped at one, so extra files are refused for the\n // same reason as anywhere else: too many.\n maxFiles: multiple ? limits.maxFiles : 1,\n })\n\n for (const rejection of rejected) options.onReject(rejection)\n\n resetNative()\n if (accepted.length === 0) return\n\n options.model.value = [...current, ...accepted]\n options.onChange(options.model.value)\n }\n\n function onNativeChange(event: Event) {\n acceptFiles([...((event.target as HTMLInputElement).files ?? [])])\n }\n\n // @fallback\n /**\n * The one call to the browser neither component can do without: opening the dialog.\n *\n * It clicks the hidden control rather than using the newer, more explicit request to\n * open a picker. Both require the reader to have just done something, but the explicit\n * one THROWS when they have not — and in an embedded page from another site — where a\n * click simply does nothing. On a file control there is nothing to gain in exchange.\n */\n function openPicker() {\n if (!options.enabled()) return\n fileEl.value?.click()\n }\n\n return { fileEl, nativeAttrs, controlAttrs, acceptFiles, onNativeChange, openPicker, resetNative }\n}\n"],"mappings":";;;AAgCA,IAAM,IAAc;CAAC;CAAQ;CAAY;CAAQ;AAAS;AAwB1D,SAAgB,EAAa,GAA2B;CACtD,IAAM,IAAS,EAA6B,IAAI,GAE1C,IAAc,QAClB,OAAO,YACL,OAAO,QAAQ,EAAQ,eAAe,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAS,EAAY,SAAS,CAAG,CAAC,CAC1F,CACF,GAEM,IAAe,QAAe;EAClC,IAAM,IAAW,EAAQ,sBAAsB,CAAC;EAChD,OAAO,OAAO,YACZ,OAAO,QAAQ,EAAQ,eAAe,KAAK,CAAC,CAAC,QAC1C,CAAC,OAAS,CAAC,EAAY,SAAS,CAAG,KAAK,CAAC,EAAS,SAAS,CAAG,CACjE,CACF;CACF,CAAC;CAQD,SAAS,IAAc;EACrB,AAAI,EAAO,UAAO,EAAO,MAAM,QAAQ;CACzC;CAWA,SAAS,EAAY,GAAkB;EACrC,IAAM,IAAW,EAAQ,SAAS,GAC5B,IAAU,IAAW,EAAQ,MAAM,QAAQ,CAAC,GAC5C,IAAS,EAAQ,OAAO,GACxB,EAAE,aAAU,gBAAa,EAAY,GAAU,GAAS;GAC5D,GAAG;GAGH,UAAU,IAAW,EAAO,WAAW;EACzC,CAAC;EAED,KAAK,IAAM,KAAa,GAAU,EAAQ,SAAS,CAAS;EAE5D,EAAY,GACR,EAAS,WAAW,MAExB,EAAQ,MAAM,QAAQ,CAAC,GAAG,GAAS,GAAG,CAAQ,GAC9C,EAAQ,SAAS,EAAQ,MAAM,KAAK;CACtC;CAEA,SAAS,EAAe,GAAc;EACpC,EAAY,CAAC,GAAK,EAAM,OAA4B,SAAS,CAAC,CAAE,CAAC;CACnE;CAWA,SAAS,IAAa;EACf,EAAQ,QAAQ,KACrB,EAAO,OAAO,MAAM;CACtB;CAEA,OAAO;EAAE;EAAQ;EAAa;EAAc;EAAa;EAAgB;EAAY;CAAY;AACnG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* Closes something as soon as the focus leaves the component — its floating panel
|
|
4
|
+
* included.
|
|
5
|
+
*
|
|
6
|
+
* That last part is what makes this so short. A panel painted above the whole page is
|
|
7
|
+
* still, in the document, a descendant of the component that owns it, so asking whether
|
|
8
|
+
* the focus went somewhere inside the component is enough; nothing has to be watched at
|
|
9
|
+
* the level of the page.
|
|
10
|
+
*
|
|
11
|
+
* The focus going nowhere in particular — out of the window, or back to the page body —
|
|
12
|
+
* counts as leaving too, and closes.
|
|
13
|
+
*
|
|
14
|
+
* This exists because a panel the browser does not dismiss on its own has to be closed
|
|
15
|
+
* by hand. The self-dismissing kind, the menu's, needs none of it.
|
|
16
|
+
*/
|
|
17
|
+
export declare function useFocusoutDismiss(root: Ref<HTMLElement | null>, close: () => void): (event: FocusEvent) => void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/composables/useFocusoutDismiss.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
return (n) => {
|
|
4
|
+
let r = n.relatedTarget;
|
|
5
|
+
(!r || !e.value?.contains(r)) && t();
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { e as useFocusoutDismiss };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=useFocusoutDismiss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusoutDismiss.js","names":[],"sources":["../../src/composables/useFocusoutDismiss.ts"],"sourcesContent":["import type { Ref } from 'vue'\n\n// @a11y\n/**\n * Closes something as soon as the focus leaves the component — its floating panel\n * included.\n *\n * That last part is what makes this so short. A panel painted above the whole page is\n * still, in the document, a descendant of the component that owns it, so asking whether\n * the focus went somewhere inside the component is enough; nothing has to be watched at\n * the level of the page.\n *\n * The focus going nowhere in particular — out of the window, or back to the page body —\n * counts as leaving too, and closes.\n *\n * This exists because a panel the browser does not dismiss on its own has to be closed\n * by hand. The self-dismissing kind, the menu's, needs none of it.\n */\nexport function useFocusoutDismiss(\n root: Ref<HTMLElement | null>,\n close: () => void,\n): (event: FocusEvent) => void {\n return (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null\n if (!next || !root.value?.contains(next)) close()\n }\n}\n"],"mappings":";AAkBA,SAAgB,EACd,GACA,GAC6B;CAC7B,QAAQ,MAAsB;EAC5B,IAAM,IAAO,EAAM;EACnB,CAAI,CAAC,KAAQ,CAAC,EAAK,OAAO,SAAS,CAAI,MAAG,EAAM;CAClD;AACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tells a field whether the consumer wants its icons to be CLICKABLE.
|
|
3
|
+
*
|
|
4
|
+
* An icon inside a field is decoration until someone listens for a click on it, at which
|
|
5
|
+
* point it becomes a real button — one that can be reached with the keyboard and has a
|
|
6
|
+
* name of its own. This is what answers the question.
|
|
7
|
+
*
|
|
8
|
+
* Because those two events are declared by the component, Vue takes them out of the
|
|
9
|
+
* attributes it hands down, so the only place left to look is the element description
|
|
10
|
+
* Vue was given — and in BOTH spellings, since a template writes them with dashes and a
|
|
11
|
+
* render function in camel case.
|
|
12
|
+
*
|
|
13
|
+
* The answer is read ONCE and never revised: a listener attached later is not picked up.
|
|
14
|
+
* That case is marginal and the cost is accepted.
|
|
15
|
+
*
|
|
16
|
+
* The warning about a missing name belongs here rather than in each field. A button
|
|
17
|
+
* nothing can announce is a flaw of the arrangement itself, not of the component that
|
|
18
|
+
* happens to use it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useIconClickHandlers(options: {
|
|
21
|
+
name: string;
|
|
22
|
+
iconStartLabel?: string;
|
|
23
|
+
iconEndLabel?: string;
|
|
24
|
+
}): {
|
|
25
|
+
hasIconStartHandler: boolean;
|
|
26
|
+
hasIconEndHandler: boolean;
|
|
27
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getCurrentInstance as e } from "vue";
|
|
2
|
+
//#region src/composables/useIconClickHandlers.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
let n = e()?.vnode.props ?? {};
|
|
5
|
+
return {
|
|
6
|
+
hasIconStartHandler: "onClick:iconStart" in n || "onClick:icon-start" in n,
|
|
7
|
+
hasIconEndHandler: "onClick:iconEnd" in n || "onClick:icon-end" in n
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { t as useIconClickHandlers };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=useIconClickHandlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIconClickHandlers.js","names":[],"sources":["../../src/composables/useIconClickHandlers.ts"],"sourcesContent":["import { getCurrentInstance } from 'vue'\n\nimport { isDev } from '../utils/env'\n\n// @core\n/**\n * Tells a field whether the consumer wants its icons to be CLICKABLE.\n *\n * An icon inside a field is decoration until someone listens for a click on it, at which\n * point it becomes a real button — one that can be reached with the keyboard and has a\n * name of its own. This is what answers the question.\n *\n * Because those two events are declared by the component, Vue takes them out of the\n * attributes it hands down, so the only place left to look is the element description\n * Vue was given — and in BOTH spellings, since a template writes them with dashes and a\n * render function in camel case.\n *\n * The answer is read ONCE and never revised: a listener attached later is not picked up.\n * That case is marginal and the cost is accepted.\n *\n * The warning about a missing name belongs here rather than in each field. A button\n * nothing can announce is a flaw of the arrangement itself, not of the component that\n * happens to use it.\n */\nexport function useIconClickHandlers(options: {\n name: string\n iconStartLabel?: string\n iconEndLabel?: string\n}): { hasIconStartHandler: boolean; hasIconEndHandler: boolean } {\n const vnodeProps = getCurrentInstance()?.vnode.props ?? {}\n const hasIconStartHandler =\n 'onClick:iconStart' in vnodeProps || 'onClick:icon-start' in vnodeProps\n const hasIconEndHandler = 'onClick:iconEnd' in vnodeProps || 'onClick:icon-end' in vnodeProps\n\n // @a11y @devwarn\n if (isDev) {\n if (hasIconStartHandler && !options.iconStartLabel)\n console.warn(\n `[${options.name}] clickable start icon without iconStartLabel — provide an accessible label.`,\n )\n if (hasIconEndHandler && !options.iconEndLabel)\n console.warn(\n `[${options.name}] clickable end icon without iconEndLabel — provide an accessible label.`,\n )\n }\n\n return { hasIconStartHandler, hasIconEndHandler }\n}\n"],"mappings":";;AAwBA,SAAgB,EAAqB,GAI4B;CAC/D,IAAM,IAAa,EAAmB,CAAC,EAAE,MAAM,SAAS,CAAC;CAiBzD,OAAO;EAAE,qBAfP,uBAAuB,KAAc,wBAAwB;EAejC,mBAdJ,qBAAqB,KAAc,sBAAsB;CAcnC;AAClD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Ref, WritableComputedRef } from 'vue';
|
|
2
|
+
export interface MaskedFieldOptions<T extends string> {
|
|
3
|
+
/** The real input, which is written to directly — see below. */
|
|
4
|
+
fieldEl: Ref<HTMLInputElement | null>;
|
|
5
|
+
/** Whether the field can be typed into at all. Everything here is inert when it cannot. */
|
|
6
|
+
typing: () => boolean;
|
|
7
|
+
/** What the field shows when it is NOT being typed into: the value, written out in full. */
|
|
8
|
+
displayText: () => string;
|
|
9
|
+
/** The current value, or nothing. */
|
|
10
|
+
readValue: () => T | null;
|
|
11
|
+
/** Writes a new value. */
|
|
12
|
+
writeValue: (value: T | null) => void;
|
|
13
|
+
/** How many digits the mask holds: eight for a date, four for a time. */
|
|
14
|
+
maxDigits: () => number;
|
|
15
|
+
/** Lays a run of digits out as masked text. */
|
|
16
|
+
format: (digits: string) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Where the caret goes so as to sit after a given number of digits.
|
|
19
|
+
*
|
|
20
|
+
* The flag says whether something was INSERTED rather than deleted, and it matters: on
|
|
21
|
+
* a deletion the caret must stay IN FRONT of the separator, or the next press of the key
|
|
22
|
+
* would step over it instead of erasing, and the key would appear to do nothing.
|
|
23
|
+
*/
|
|
24
|
+
caret: (text: string, digitsBefore: number, inserting: boolean) => number;
|
|
25
|
+
/**
|
|
26
|
+
* Reads masked text back into a value, or nothing when it is not one yet.
|
|
27
|
+
*
|
|
28
|
+
* The flag marks the FINAL reading, when the reader leaves the field. A date expands a
|
|
29
|
+
* two-digit year only there: "26" must not be committed as 2026 while it may still be on
|
|
30
|
+
* its way to becoming it.
|
|
31
|
+
*/
|
|
32
|
+
parse: (text: string, final: boolean) => T | null;
|
|
33
|
+
/** Writes a value as masked text, and nothing at all for no value. */
|
|
34
|
+
toMask: (value: T | null) => string;
|
|
35
|
+
/**
|
|
36
|
+
* Whether a value the reader has finished typing may be taken — within the bounds, not
|
|
37
|
+
* one of the excluded days. Everything is acceptable by default.
|
|
38
|
+
*/
|
|
39
|
+
acceptable?: (value: T) => boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface MaskedField {
|
|
42
|
+
/** The text currently in the field while it is being typed into. */
|
|
43
|
+
draft: Ref<string>;
|
|
44
|
+
/**
|
|
45
|
+
* TRAP — bind this with `v-model` on the field and NEVER as a one-way value. Without a
|
|
46
|
+
* listener for its updates, the field keeps an internal copy of the RAW text typed and
|
|
47
|
+
* writes it back on the next patch — which erases the mask precisely when the masked
|
|
48
|
+
* text did NOT change: a rejected character, or a digit past the last. Both components
|
|
49
|
+
* have a test locking it.
|
|
50
|
+
*/
|
|
51
|
+
fieldModel: WritableComputedRef<string | number>;
|
|
52
|
+
/**
|
|
53
|
+
* Writes the text into both the draft and the input itself. Both are needed: Vue does
|
|
54
|
+
* not patch an element whose text it believes is unchanged, and after a reformat it
|
|
55
|
+
* often is.
|
|
56
|
+
*/
|
|
57
|
+
writeField: (text: string, caret?: number) => void;
|
|
58
|
+
/** Takes the value as soon as what has been typed is complete and acceptable. */
|
|
59
|
+
commitLive: () => void;
|
|
60
|
+
/** Called as the reader leaves the field. It is safe to call twice. */
|
|
61
|
+
commitOrRevert: () => void;
|
|
62
|
+
/** The handler to bind to the field's input event. */
|
|
63
|
+
onFieldInput: (event: Event) => void;
|
|
64
|
+
}
|
|
65
|
+
export declare function useMaskedField<T extends string>(options: MaskedFieldOptions<T>): MaskedField;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { digitsOf as e } from "../utils/text.js";
|
|
2
|
+
import { computed as t, ref as n, watch as r } from "vue";
|
|
3
|
+
//#region src/composables/useMaskedField.ts
|
|
4
|
+
function i(i) {
|
|
5
|
+
let a = n(""), o = i.acceptable ?? (() => !0);
|
|
6
|
+
r(t(() => i.toMask(i.readValue())), (e) => {
|
|
7
|
+
e !== a.value && (a.value = e);
|
|
8
|
+
}, { immediate: !0 });
|
|
9
|
+
let s = t({
|
|
10
|
+
get: () => i.typing() ? a.value : i.displayText(),
|
|
11
|
+
set: (e) => {
|
|
12
|
+
i.typing() && (a.value = String(e ?? ""));
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
function c(e, t) {
|
|
16
|
+
a.value = e;
|
|
17
|
+
let n = i.fieldEl.value;
|
|
18
|
+
n && (n.value !== e && (n.value = e), t !== void 0 && n.setSelectionRange(t, t));
|
|
19
|
+
}
|
|
20
|
+
function l() {
|
|
21
|
+
let e = i.parse(a.value, !1);
|
|
22
|
+
e && o(e) && e !== i.readValue() && i.writeValue(e);
|
|
23
|
+
}
|
|
24
|
+
function u() {
|
|
25
|
+
if (!i.typing()) return;
|
|
26
|
+
if (!e(a.value)) {
|
|
27
|
+
i.readValue() !== null && i.writeValue(null), c("");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let t = i.parse(a.value, !0);
|
|
31
|
+
if (t && o(t)) {
|
|
32
|
+
t !== i.readValue() && i.writeValue(t), c(i.toMask(t));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
c(i.toMask(i.readValue()));
|
|
36
|
+
}
|
|
37
|
+
function d(t) {
|
|
38
|
+
if (!i.typing()) return;
|
|
39
|
+
let n = t.target, r = n.value, a = n.selectionStart ?? r.length, o = e(r.slice(0, a)).length, s = e(r).slice(0, i.maxDigits()), u = !String(t.inputType ?? "").startsWith("delete"), d = i.format(s);
|
|
40
|
+
c(d, i.caret(d, Math.min(o, s.length), u)), l();
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
draft: a,
|
|
44
|
+
fieldModel: s,
|
|
45
|
+
writeField: c,
|
|
46
|
+
commitLive: l,
|
|
47
|
+
commitOrRevert: u,
|
|
48
|
+
onFieldInput: d
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//#endregion
|
|
52
|
+
export { i as useMaskedField };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=useMaskedField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMaskedField.js","names":[],"sources":["../../src/composables/useMaskedField.ts"],"sourcesContent":["// @core — module-wide: mask, caret and commit are the field's own behaviour.\n/**\n * A field one types a date or a time into: the reader enters digits, and the separators\n * appear as they go.\n *\n * It is the FIELD half of the date and time pickers, the panel half being shared already.\n * What is injected here is only the vocabulary of the mask itself: how many digits it\n * holds, how those digits become text, where the caret should land, and how the text\n * becomes a value.\n *\n * The two differ in one respect worth knowing: a date's separator depends on the reader's\n * language while a time's is the same everywhere, so they work out the caret differently.\n * Nothing here cares — it only tells them whether the edit was an INSERTION, which is what\n * decides whether the caret steps over a separator.\n */\nimport { computed, ref, watch, type Ref, type WritableComputedRef } from 'vue'\n\nimport { digitsOf } from '../utils/text'\n\nexport interface MaskedFieldOptions<T extends string> {\n /** The real input, which is written to directly — see below. */\n fieldEl: Ref<HTMLInputElement | null>\n /** Whether the field can be typed into at all. Everything here is inert when it cannot. */\n typing: () => boolean\n /** What the field shows when it is NOT being typed into: the value, written out in full. */\n displayText: () => string\n /** The current value, or nothing. */\n readValue: () => T | null\n /** Writes a new value. */\n writeValue: (value: T | null) => void\n /** How many digits the mask holds: eight for a date, four for a time. */\n maxDigits: () => number\n /** Lays a run of digits out as masked text. */\n format: (digits: string) => string\n /**\n * Where the caret goes so as to sit after a given number of digits.\n *\n * The flag says whether something was INSERTED rather than deleted, and it matters: on\n * a deletion the caret must stay IN FRONT of the separator, or the next press of the key\n * would step over it instead of erasing, and the key would appear to do nothing.\n */\n caret: (text: string, digitsBefore: number, inserting: boolean) => number\n /**\n * Reads masked text back into a value, or nothing when it is not one yet.\n *\n * The flag marks the FINAL reading, when the reader leaves the field. A date expands a\n * two-digit year only there: \"26\" must not be committed as 2026 while it may still be on\n * its way to becoming it.\n */\n parse: (text: string, final: boolean) => T | null\n /** Writes a value as masked text, and nothing at all for no value. */\n toMask: (value: T | null) => string\n /**\n * Whether a value the reader has finished typing may be taken — within the bounds, not\n * one of the excluded days. Everything is acceptable by default.\n */\n acceptable?: (value: T) => boolean\n}\n\nexport interface MaskedField {\n /** The text currently in the field while it is being typed into. */\n draft: Ref<string>\n /**\n * TRAP — bind this with `v-model` on the field and NEVER as a one-way value. Without a\n * listener for its updates, the field keeps an internal copy of the RAW text typed and\n * writes it back on the next patch — which erases the mask precisely when the masked\n * text did NOT change: a rejected character, or a digit past the last. Both components\n * have a test locking it.\n */\n fieldModel: WritableComputedRef<string | number>\n /**\n * Writes the text into both the draft and the input itself. Both are needed: Vue does\n * not patch an element whose text it believes is unchanged, and after a reformat it\n * often is.\n */\n writeField: (text: string, caret?: number) => void\n /** Takes the value as soon as what has been typed is complete and acceptable. */\n commitLive: () => void\n /** Called as the reader leaves the field. It is safe to call twice. */\n commitOrRevert: () => void\n /** The handler to bind to the field's input event. */\n onFieldInput: (event: Event) => void\n}\n\nexport function useMaskedField<T extends string>(options: MaskedFieldOptions<T>): MaskedField {\n const draft = ref('')\n const acceptable = options.acceptable ?? (() => true)\n\n /*\n * The current value, written as masked text. Being derived, it also tracks whatever the\n * conversion reads — the language's own mask, the choice of clock — so neither component\n * has to list those dependencies itself.\n */\n const maskedValue = computed(() => options.toMask(options.readValue()))\n\n watch(\n maskedValue,\n (next) => {\n // TRAP — this guard is what stops the field and the value chasing each other. A\n // commit made while typing writes the value, which comes straight back here; without\n // the test, the text being typed and the caret with it would be overwritten by text\n // identical to what is already there.\n if (next !== draft.value) draft.value = next\n },\n { immediate: true },\n )\n\n const fieldModel = computed<string | number>({\n get: () => (options.typing() ? draft.value : options.displayText()),\n set: (value) => {\n if (options.typing()) draft.value = String(value ?? '')\n },\n })\n\n function writeField(text: string, caret?: number) {\n draft.value = text\n const el = options.fieldEl.value\n if (!el) return\n if (el.value !== text) el.value = text\n if (caret !== undefined) el.setSelectionRange(caret, caret)\n }\n\n function commitLive() {\n const value = options.parse(draft.value, false)\n if (value && acceptable(value) && value !== options.readValue()) options.writeValue(value)\n }\n\n /**\n * Tidies up what was typed, or SILENTLY puts back what was there before.\n *\n * An entry that is incomplete, impossible — the 31st of February — outside the allowed\n * bounds or excluded simply disappears in favour of the current value. There is\n * deliberately no error state of our own competing with the `invalid` prop a consumer\n * controls.\n */\n function commitOrRevert() {\n if (!options.typing()) return\n if (!digitsOf(draft.value)) {\n if (options.readValue() !== null) options.writeValue(null)\n writeField('')\n return\n }\n const value = options.parse(draft.value, true)\n if (value && acceptable(value)) {\n if (value !== options.readValue()) options.writeValue(value)\n // Rewritten in full: \"5/6/26\" becomes \"05/06/2026\".\n writeField(options.toMask(value))\n return\n }\n writeField(options.toMask(options.readValue()))\n }\n\n /**\n * Reformats the field on every keystroke.\n *\n * The invariant to keep is that the number of digits to the LEFT of the caret survives\n * the reformatting. Restoring an absolute position instead would misplace the caret on\n * exactly the keystrokes that matter: a position jumps by one the moment a separator\n * appears or disappears.\n */\n function onFieldInput(event: Event) {\n if (!options.typing()) return\n const el = event.target as HTMLInputElement\n const raw = el.value\n const caret = el.selectionStart ?? raw.length\n const before = digitsOf(raw.slice(0, caret)).length\n const digits = digitsOf(raw).slice(0, options.maxDigits())\n const inserting = !String((event as InputEvent).inputType ?? '').startsWith('delete')\n const text = options.format(digits)\n writeField(text, options.caret(text, Math.min(before, digits.length), inserting))\n commitLive()\n }\n\n return { draft, fieldModel, writeField, commitLive, commitOrRevert, onFieldInput }\n}\n"],"mappings":";;;AAoFA,SAAgB,EAAiC,GAA6C;CAC5F,IAAM,IAAQ,EAAI,EAAE,GACd,IAAa,EAAQ,qBAAqB;CAShD,EAFoB,QAAe,EAAQ,OAAO,EAAQ,UAAU,CAAC,CAGnE,IACC,MAAS;EAKR,AAAI,MAAS,EAAM,UAAO,EAAM,QAAQ;CAC1C,GACA,EAAE,WAAW,GAAK,CACpB;CAEA,IAAM,IAAa,EAA0B;EAC3C,WAAY,EAAQ,OAAO,IAAI,EAAM,QAAQ,EAAQ,YAAY;EACjE,MAAM,MAAU;GACd,AAAI,EAAQ,OAAO,MAAG,EAAM,QAAQ,OAAO,KAAS,EAAE;EACxD;CACF,CAAC;CAED,SAAS,EAAW,GAAc,GAAgB;EAChD,EAAM,QAAQ;EACd,IAAM,IAAK,EAAQ,QAAQ;EACtB,MACD,EAAG,UAAU,MAAM,EAAG,QAAQ,IAC9B,MAAU,KAAA,KAAW,EAAG,kBAAkB,GAAO,CAAK;CAC5D;CAEA,SAAS,IAAa;EACpB,IAAM,IAAQ,EAAQ,MAAM,EAAM,OAAO,EAAK;EAC9C,AAAI,KAAS,EAAW,CAAK,KAAK,MAAU,EAAQ,UAAU,KAAG,EAAQ,WAAW,CAAK;CAC3F;CAUA,SAAS,IAAiB;EACxB,IAAI,CAAC,EAAQ,OAAO,GAAG;EACvB,IAAI,CAAC,EAAS,EAAM,KAAK,GAAG;GAE1B,AADI,EAAQ,UAAU,MAAM,QAAM,EAAQ,WAAW,IAAI,GACzD,EAAW,EAAE;GACb;EACF;EACA,IAAM,IAAQ,EAAQ,MAAM,EAAM,OAAO,EAAI;EAC7C,IAAI,KAAS,EAAW,CAAK,GAAG;GAG9B,AAFI,MAAU,EAAQ,UAAU,KAAG,EAAQ,WAAW,CAAK,GAE3D,EAAW,EAAQ,OAAO,CAAK,CAAC;GAChC;EACF;EACA,EAAW,EAAQ,OAAO,EAAQ,UAAU,CAAC,CAAC;CAChD;CAUA,SAAS,EAAa,GAAc;EAClC,IAAI,CAAC,EAAQ,OAAO,GAAG;EACvB,IAAM,IAAK,EAAM,QACX,IAAM,EAAG,OACT,IAAQ,EAAG,kBAAkB,EAAI,QACjC,IAAS,EAAS,EAAI,MAAM,GAAG,CAAK,CAAC,CAAC,CAAC,QACvC,IAAS,EAAS,CAAG,CAAC,CAAC,MAAM,GAAG,EAAQ,UAAU,CAAC,GACnD,IAAY,CAAC,OAAQ,EAAqB,aAAa,EAAE,CAAC,CAAC,WAAW,QAAQ,GAC9E,IAAO,EAAQ,OAAO,CAAM;EAElC,AADA,EAAW,GAAM,EAAQ,MAAM,GAAM,KAAK,IAAI,GAAQ,EAAO,MAAM,GAAG,CAAS,CAAC,GAChF,EAAW;CACb;CAEA,OAAO;EAAE;EAAO;EAAY;EAAY;EAAY;EAAgB;CAAa;AACnF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ref as e } from "vue";
|
|
2
|
+
//#region src/composables/usePopover.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
let n = e(!1);
|
|
5
|
+
function r(e) {
|
|
6
|
+
n.value = e.newState === "open";
|
|
7
|
+
}
|
|
8
|
+
function i(e) {
|
|
9
|
+
n.value || t.value?.showPopover(e ? { source: e } : void 0);
|
|
10
|
+
}
|
|
11
|
+
function a() {
|
|
12
|
+
n.value && t.value?.hidePopover();
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
shown: n,
|
|
16
|
+
syncShown: r,
|
|
17
|
+
show: i,
|
|
18
|
+
hide: a
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { t as usePopover };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=usePopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePopover.js","names":[],"sources":["../../src/composables/usePopover.ts"],"sourcesContent":["import { ref, type Ref } from 'vue'\n\n// @core\n/**\n * Everything needed to know whether a floating panel is open, and to open or close it.\n * It is the code half of a subject whose other half is `styles/floating.css`, which\n * handles where such a panel is placed.\n *\n * The browser's own support for these panels is imperative, where the rest of the design\n * system is declarative, and it sets two traps a plain local boolean would fall into.\n *\n * Asking to close a panel that is already closed — or to open one already open — throws.\n * Hence the guards, which make both calls safe to repeat.\n *\n * And a panel of the self-dismissing kind closes WITHOUT anyone asking, on a click outside\n * or on Escape. So the state is READ from the panel rather than guessed: it reports both\n * synchronously as it changes and again afterwards, and both have to be listened to — the\n * first is the only one that catches a dismissal in time, the second the only one the unit\n * tests' stub emits at all.\n *\n * TRAP — never assign that state by hand, tempting though it is inside the opening\n * function. A panel dismissed by the browser would then leave the state saying it is open,\n * and the next request to close it would be swallowed by the guard.\n */\n\n// @fallback\n// The option below is newer than the type definitions shipped with TypeScript, so the\n// element is described locally rather than being cast about at each call site.\ntype PopoverWithSource = HTMLElement & { showPopover(options?: { source?: HTMLElement }): void }\n\nexport function usePopover(el: Ref<HTMLElement | null>) {\n const shown = ref(false)\n\n /**\n * Reads the state from the panel itself. It must be wired to BOTH events the panel\n * emits, and on the panel element: these events do not travel up the tree.\n */\n function syncShown(event: Event) {\n shown.value = (event as ToggleEvent).newState === 'open'\n }\n\n /**\n * Opens the panel.\n *\n * TRAP — when the panel is opened from code rather than by a click, the element it\n * belongs to must be named as the SOURCE of that opening. That is what re-establishes\n * the relationship a click would have created: the panel's implicit anchor, and its\n * place in the stack of open panels. Without it the panel has nothing to position itself\n * against.\n */\n function show(source?: HTMLElement) {\n if (!shown.value)\n (el.value as PopoverWithSource | null)?.showPopover(source ? { source } : undefined)\n }\n\n /** Closes the panel. */\n function hide() {\n if (shown.value) el.value?.hidePopover()\n }\n\n return { shown, syncShown, show, hide }\n}\n"],"mappings":";;AA8BA,SAAgB,EAAW,GAA6B;CACtD,IAAM,IAAQ,EAAI,EAAK;CAMvB,SAAS,EAAU,GAAc;EAC/B,EAAM,QAAS,EAAsB,aAAa;CACpD;CAWA,SAAS,EAAK,GAAsB;EAClC,AAAK,EAAM,SACT,EAAI,OAAoC,YAAY,IAAS,EAAE,UAAO,IAAI,KAAA,CAAS;CACvF;CAGA,SAAS,IAAO;EACd,AAAI,EAAM,SAAO,EAAG,OAAO,YAAY;CACzC;CAEA,OAAO;EAAE;EAAO;EAAW;EAAM;CAAK;AACxC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* Brings a progress value into line, for the bar and the ring alike.
|
|
4
|
+
*
|
|
5
|
+
* It returns two things: the value itself, held inside the range it is allowed to take,
|
|
6
|
+
* and how far along that range it sits, as a number between nothing and one. Everything
|
|
7
|
+
* both components draw comes from those two — how much of the bar is filled, how much of
|
|
8
|
+
* the ring is drawn, the percentage written out, and what a screen reader announces.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useProgressValue(value: () => number, max: () => number): {
|
|
11
|
+
clamped: ComputedRef<number>;
|
|
12
|
+
fraction: ComputedRef<number>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { clamp as e } from "../utils/number.js";
|
|
2
|
+
import { computed as t } from "vue";
|
|
3
|
+
//#region src/composables/useProgressValue.ts
|
|
4
|
+
function n(n, r) {
|
|
5
|
+
let i = t(() => e(n(), 0, Math.max(r(), 0)));
|
|
6
|
+
return {
|
|
7
|
+
clamped: i,
|
|
8
|
+
fraction: t(() => i.value / (r() || 1))
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { n as useProgressValue };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=useProgressValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useProgressValue.js","names":[],"sources":["../../src/composables/useProgressValue.ts"],"sourcesContent":["import { computed, type ComputedRef } from 'vue'\nimport { clamp } from '../utils/number'\n\n// @core\n/**\n * Brings a progress value into line, for the bar and the ring alike.\n *\n * It returns two things: the value itself, held inside the range it is allowed to take,\n * and how far along that range it sits, as a number between nothing and one. Everything\n * both components draw comes from those two — how much of the bar is filled, how much of\n * the ring is drawn, the percentage written out, and what a screen reader announces.\n */\nexport function useProgressValue(\n value: () => number,\n max: () => number,\n): { clamped: ComputedRef<number>; fraction: ComputedRef<number> } {\n const clamped = computed(() => clamp(value(), 0, Math.max(max(), 0)))\n\n /**\n * How far along, from 0 to 1 — the number every part of the rendering is driven by.\n * The fallback denominator is what keeps a maximum of zero from dividing by nothing.\n */\n const fraction = computed(() => clamped.value / (max() || 1))\n\n return { clamped, fraction }\n}\n"],"mappings":";;;AAYA,SAAgB,EACd,GACA,GACiE;CACjE,IAAM,IAAU,QAAe,EAAM,EAAM,GAAG,GAAG,KAAK,IAAI,EAAI,GAAG,CAAC,CAAC,CAAC;CAQpE,OAAO;EAAE;EAAS,UAFD,QAAe,EAAQ,SAAS,EAAI,KAAK,EAExC;CAAS;AAC7B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ComputedRef, StyleValue } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* The shape of a class binding. It is written out here rather than imported because the
|
|
4
|
+
* type exists in Vue's DOM runtime under another name and the `vue` package does not
|
|
5
|
+
* pass it on. Without it the class stays untyped, and a template refuses to bind it.
|
|
6
|
+
*/
|
|
7
|
+
type ClassBinding = false | null | undefined | string | Record<string, unknown> | ClassBinding[];
|
|
8
|
+
/**
|
|
9
|
+
* Splits the attributes a consumer wrote on a component in two, for the components whose
|
|
10
|
+
* outermost element is only a container: the two text fields, the search field, the
|
|
11
|
+
* table, the two pickers, the row of tabs.
|
|
12
|
+
*
|
|
13
|
+
* Everything a consumer writes on a component lands, by default, on that outermost
|
|
14
|
+
* element. Here that is the wrong place for most of it. Styling belongs on the container,
|
|
15
|
+
* since that is the box the consumer sees and positions; everything else belongs on the
|
|
16
|
+
* element that actually DOES something — the real input, the real control. Left
|
|
17
|
+
* unsplit, the field's name, the fact that it is required and everything describing it
|
|
18
|
+
* for a screen reader all end up on a decorative box, where a form ignores them and a
|
|
19
|
+
* screen reader never finds them.
|
|
20
|
+
*
|
|
21
|
+
* Turning the default placement off stays the component's own business: that is a
|
|
22
|
+
* compilation option of the file, not something that can be arranged from here.
|
|
23
|
+
*
|
|
24
|
+
* The whole set is handed back as well, for the few components that need to look
|
|
25
|
+
* something up in it — an identifier the consumer supplied, which must win over the
|
|
26
|
+
* generated one, or a description that has to be merged rather than replaced.
|
|
27
|
+
*/
|
|
28
|
+
export declare function useRootAttrs(): {
|
|
29
|
+
attrs: Record<string, unknown>;
|
|
30
|
+
rootClass: ComputedRef<ClassBinding>;
|
|
31
|
+
rootStyle: ComputedRef<StyleValue>;
|
|
32
|
+
forwardedAttrs: ComputedRef<Record<string, unknown>>;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { computed as e, useAttrs as t } from "vue";
|
|
2
|
+
//#region src/composables/useRootAttrs.ts
|
|
3
|
+
function n() {
|
|
4
|
+
let n = t();
|
|
5
|
+
return {
|
|
6
|
+
attrs: n,
|
|
7
|
+
rootClass: e(() => n.class),
|
|
8
|
+
rootStyle: e(() => n.style),
|
|
9
|
+
forwardedAttrs: e(() => Object.fromEntries(Object.entries(n).filter(([e]) => e !== "class" && e !== "style")))
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { n as useRootAttrs };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=useRootAttrs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRootAttrs.js","names":[],"sources":["../../src/composables/useRootAttrs.ts"],"sourcesContent":["import { computed, useAttrs, type ComputedRef, type StyleValue } from 'vue'\n\n/**\n * The shape of a class binding. It is written out here rather than imported because the\n * type exists in Vue's DOM runtime under another name and the `vue` package does not\n * pass it on. Without it the class stays untyped, and a template refuses to bind it.\n */\ntype ClassBinding = false | null | undefined | string | Record<string, unknown> | ClassBinding[]\n\n// @a11y\n/**\n * Splits the attributes a consumer wrote on a component in two, for the components whose\n * outermost element is only a container: the two text fields, the search field, the\n * table, the two pickers, the row of tabs.\n *\n * Everything a consumer writes on a component lands, by default, on that outermost\n * element. Here that is the wrong place for most of it. Styling belongs on the container,\n * since that is the box the consumer sees and positions; everything else belongs on the\n * element that actually DOES something — the real input, the real control. Left\n * unsplit, the field's name, the fact that it is required and everything describing it\n * for a screen reader all end up on a decorative box, where a form ignores them and a\n * screen reader never finds them.\n *\n * Turning the default placement off stays the component's own business: that is a\n * compilation option of the file, not something that can be arranged from here.\n *\n * The whole set is handed back as well, for the few components that need to look\n * something up in it — an identifier the consumer supplied, which must win over the\n * generated one, or a description that has to be merged rather than replaced.\n */\nexport function useRootAttrs(): {\n attrs: Record<string, unknown>\n rootClass: ComputedRef<ClassBinding>\n rootStyle: ComputedRef<StyleValue>\n forwardedAttrs: ComputedRef<Record<string, unknown>>\n} {\n const attrs = useAttrs()\n\n return {\n attrs,\n rootClass: computed(() => attrs.class as ClassBinding),\n rootStyle: computed(() => attrs.style as StyleValue),\n forwardedAttrs: computed(() =>\n Object.fromEntries(\n Object.entries(attrs).filter(([key]) => key !== 'class' && key !== 'style'),\n ),\n ),\n }\n}\n"],"mappings":";;AA8BA,SAAgB,IAKd;CACA,IAAM,IAAQ,EAAS;CAEvB,OAAO;EACL;EACA,WAAW,QAAe,EAAM,KAAqB;EACrD,WAAW,QAAe,EAAM,KAAmB;EACnD,gBAAgB,QACd,OAAO,YACL,OAAO,QAAQ,CAAK,CAAC,CAAC,QAAQ,CAAC,OAAS,MAAQ,WAAW,MAAQ,OAAO,CAC5E,CACF;CACF;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
/** The least this needs of the real control — the two kinds of field both offer it. */
|
|
3
|
+
interface ValidatableControl {
|
|
4
|
+
setCustomValidity: (message: string) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* How much has been typed against how much is allowed: the "12/80" counter under a
|
|
8
|
+
* field, whether the allowance has been passed, and the SOFT limit.
|
|
9
|
+
*
|
|
10
|
+
* A soft limit lets the reader keep typing past the allowance and puts the field in
|
|
11
|
+
* error instead of cutting them off mid-word. That error is declared to the BROWSER
|
|
12
|
+
* rather than invented here, and three things follow from it for free: the field only
|
|
13
|
+
* turns red once the reader has actually interacted with it, exactly as a native error
|
|
14
|
+
* does; the form refuses to submit; and anyone inspecting the field finds the error where
|
|
15
|
+
* they would look for any other. The price is that the component then owns that error
|
|
16
|
+
* outright for as long as the soft limit is on.
|
|
17
|
+
*
|
|
18
|
+
* The effect runs AFTER the render rather than before it, because the reference to the
|
|
19
|
+
* real element is not filled in yet at the earlier point. It does nothing at all during a
|
|
20
|
+
* server render, where there is no element to speak to.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useTextLimit(options: {
|
|
23
|
+
el: Ref<ValidatableControl | null>;
|
|
24
|
+
text: () => string;
|
|
25
|
+
maxlength: () => number | undefined;
|
|
26
|
+
softLimit: () => boolean;
|
|
27
|
+
}): {
|
|
28
|
+
counterText: ComputedRef<string>;
|
|
29
|
+
over: ComputedRef<boolean>;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useMessages as e } from "../i18n/state.js";
|
|
2
|
+
import { computed as t, watchEffect as n } from "vue";
|
|
3
|
+
//#region src/composables/useTextLimit.ts
|
|
4
|
+
function r(r) {
|
|
5
|
+
let i = t(() => r.text().length), a = t(() => r.maxlength()), o = e();
|
|
6
|
+
return n(() => {
|
|
7
|
+
let e = r.el.value;
|
|
8
|
+
if (!e) return;
|
|
9
|
+
let t = a.value;
|
|
10
|
+
r.softLimit() && t != null && i.value > t ? e.setCustomValidity(o.value.field.limitExceeded(t)) : e.setCustomValidity("");
|
|
11
|
+
}, { flush: "post" }), {
|
|
12
|
+
counterText: t(() => a.value == null ? `${i.value}` : `${i.value}/${a.value}`),
|
|
13
|
+
over: t(() => a.value != null && i.value > a.value)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { r as useTextLimit };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=useTextLimit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTextLimit.js","names":[],"sources":["../../src/composables/useTextLimit.ts"],"sourcesContent":["import { computed, watchEffect, type ComputedRef, type Ref } from 'vue'\n\nimport { useMessages } from '../i18n/state'\n\n/** The least this needs of the real control — the two kinds of field both offer it. */\ninterface ValidatableControl {\n setCustomValidity: (message: string) => void\n}\n\n// @core\n/**\n * How much has been typed against how much is allowed: the \"12/80\" counter under a\n * field, whether the allowance has been passed, and the SOFT limit.\n *\n * A soft limit lets the reader keep typing past the allowance and puts the field in\n * error instead of cutting them off mid-word. That error is declared to the BROWSER\n * rather than invented here, and three things follow from it for free: the field only\n * turns red once the reader has actually interacted with it, exactly as a native error\n * does; the form refuses to submit; and anyone inspecting the field finds the error where\n * they would look for any other. The price is that the component then owns that error\n * outright for as long as the soft limit is on.\n *\n * The effect runs AFTER the render rather than before it, because the reference to the\n * real element is not filled in yet at the earlier point. It does nothing at all during a\n * server render, where there is no element to speak to.\n */\nexport function useTextLimit(options: {\n el: Ref<ValidatableControl | null>\n text: () => string\n maxlength: () => number | undefined\n softLimit: () => boolean\n}): { counterText: ComputedRef<string>; over: ComputedRef<boolean> } {\n const length = computed(() => options.text().length)\n const max = computed(() => options.maxlength())\n const m = useMessages()\n\n // The dictionary is read INSIDE the effect, which is what makes the error message\n // rewrite itself when the language is changed after the component is on screen. The\n // branches are spelled out rather than written as a ternary so that TypeScript can\n // narrow the limit to a number.\n watchEffect(\n () => {\n const el = options.el.value\n if (!el) return\n const limit = max.value\n if (options.softLimit() && limit != null && length.value > limit) {\n el.setCustomValidity(m.value.field.limitExceeded(limit))\n } else {\n el.setCustomValidity('')\n }\n },\n { flush: 'post' },\n )\n\n return {\n counterText: computed(() =>\n max.value != null ? `${length.value}/${max.value}` : `${length.value}`,\n ),\n over: computed(() => max.value != null && length.value > max.value),\n }\n}\n"],"mappings":";;;AA0BA,SAAgB,EAAa,GAKwC;CACnE,IAAM,IAAS,QAAe,EAAQ,KAAK,CAAC,CAAC,MAAM,GAC7C,IAAM,QAAe,EAAQ,UAAU,CAAC,GACxC,IAAI,EAAY;CAoBtB,OAdA,QACQ;EACJ,IAAM,IAAK,EAAQ,GAAG;EACtB,IAAI,CAAC,GAAI;EACT,IAAM,IAAQ,EAAI;EAClB,AAAI,EAAQ,UAAU,KAAK,KAAS,QAAQ,EAAO,QAAQ,IACzD,EAAG,kBAAkB,EAAE,MAAM,MAAM,cAAc,CAAK,CAAC,IAEvD,EAAG,kBAAkB,EAAE;CAE3B,GACA,EAAE,OAAO,OAAO,CAClB,GAEO;EACL,aAAa,QACX,EAAI,SAAS,OAAwC,GAAG,EAAO,UAA3C,GAAG,EAAO,MAAM,GAAG,EAAI,OAC7C;EACA,MAAM,QAAe,EAAI,SAAS,QAAQ,EAAO,QAAQ,EAAI,KAAK;CACpE;AACF"}
|