vectis-ui 0.13.0 → 0.15.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/dist/components/VAccordion/VAccordion.js.map +1 -1
- package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAccordion/VAccordionItem.js.map +1 -1
- package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAccordion/context.js.map +1 -1
- package/dist/components/VAlert/VAlert.js.map +1 -1
- package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/VAvatar.js.map +1 -1
- package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/VAvatarGroup.js.map +1 -1
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/context.js.map +1 -1
- package/dist/components/VBadge/VBadge.js.map +1 -1
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -1
- package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/VButton.js.map +1 -1
- package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/VButtonGroup.js.map +1 -1
- package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/context.js.map +1 -1
- package/dist/components/VCalendar/VCalendar.js.map +1 -1
- package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarEvent.js.map +1 -1
- package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +5 -17
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +19 -31
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarYear.js.map +1 -1
- package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/color.js.map +1 -1
- package/dist/components/VCalendar/edgeStep.js +1 -5
- package/dist/components/VCalendar/edgeStep.js.map +1 -1
- package/dist/components/VCalendar/gesture.js +4 -12
- package/dist/components/VCalendar/gesture.js.map +1 -1
- package/dist/components/VCalendar/keyboard.js.map +1 -1
- package/dist/components/VCalendar/layout.js +8 -12
- package/dist/components/VCalendar/layout.js.map +1 -1
- package/dist/components/VCalendar/timeGrid.js +5 -5
- package/dist/components/VCalendar/timeGrid.js.map +1 -1
- package/dist/components/VCard/VCard.js.map +1 -1
- package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/VCarousel.js.map +1 -1
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/VCarouselItem.js.map +1 -1
- package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/context.js.map +1 -1
- package/dist/components/VCheckbox/VCheckMark.js.map +1 -1
- package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VChip/VChip.js.map +1 -1
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorInput/VColorInput.js.map +1 -1
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js +62 -62
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorPicker/VColorPicker.css +1 -1
- package/dist/components/VColorPicker/VColorPicker.js.map +1 -1
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorPicker/color.js.map +1 -1
- package/dist/components/VCombobox/VCombobox.js.map +1 -1
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +114 -122
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.css +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js +0 -1
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPaletteItem.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VContextMenu/VContextMenu.js.map +1 -1
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js +3 -5
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDataTable/VDataTable.js.map +1 -1
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +7 -10
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +35 -35
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDateInput/mask.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDatePicker/keyboard.js.map +1 -1
- package/dist/components/VDatePicker/names.js.map +1 -1
- package/dist/components/VDialog/VDialog.js.map +1 -1
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDialog/VDialogAlert.js.map +1 -1
- package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDrawer/VDrawer.js.map +1 -1
- package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VEmptyState/VEmptyState.js.map +1 -1
- package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VField.js.map +1 -1
- package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VFieldAnnouncer.js.map +1 -1
- package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VFieldMessage.js.map +1 -1
- package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFieldset/VFieldset.js.map +1 -1
- package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFileInput/VFileInput.js.map +1 -1
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +85 -85
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFileInput/truncate.js.map +1 -1
- package/dist/components/VFilePicker/VFilePicker.js.map +1 -1
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFilePicker/fileKind.js.map +1 -1
- package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VHotkeys/platform.js +1 -1
- package/dist/components/VHotkeys/platform.js.map +1 -1
- package/dist/components/VHoverCard/VHoverCard.js.map +1 -1
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js +2 -12
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VIcon/VIcon.js.map +1 -1
- package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VIcon/iconProps.js.map +1 -1
- package/dist/components/VIcon/icons/add.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_downward.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_downward_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_drop_down.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_drop_up.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_left_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_right_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_upward.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_upward_alt.js.map +1 -1
- package/dist/components/VIcon/icons/attach_file.js.map +1 -1
- package/dist/components/VIcon/icons/audio_file.js.map +1 -1
- package/dist/components/VIcon/icons/calendar_today.js.map +1 -1
- package/dist/components/VIcon/icons/check.js.map +1 -1
- package/dist/components/VIcon/icons/check_circle.js.map +1 -1
- package/dist/components/VIcon/icons/chevron_left.js.map +1 -1
- package/dist/components/VIcon/icons/chevron_right.js.map +1 -1
- package/dist/components/VIcon/icons/close.js.map +1 -1
- package/dist/components/VIcon/icons/cloud_upload.js.map +1 -1
- package/dist/components/VIcon/icons/code.js.map +1 -1
- package/dist/components/VIcon/icons/colorize.js.map +1 -1
- package/dist/components/VIcon/icons/description.js.map +1 -1
- package/dist/components/VIcon/icons/error.js.map +1 -1
- package/dist/components/VIcon/icons/expand_less.js.map +1 -1
- package/dist/components/VIcon/icons/expand_more.js.map +1 -1
- package/dist/components/VIcon/icons/first_page.js.map +1 -1
- package/dist/components/VIcon/icons/folder_zip.js.map +1 -1
- package/dist/components/VIcon/icons/image.js.map +1 -1
- package/dist/components/VIcon/icons/inbox.js.map +1 -1
- package/dist/components/VIcon/icons/index.js.map +1 -1
- package/dist/components/VIcon/icons/info.js.map +1 -1
- package/dist/components/VIcon/icons/last_page.js.map +1 -1
- package/dist/components/VIcon/icons/more_horiz.js.map +1 -1
- package/dist/components/VIcon/icons/names.js.map +1 -1
- package/dist/components/VIcon/icons/notifications.js.map +1 -1
- package/dist/components/VIcon/icons/open_in_new.js.map +1 -1
- package/dist/components/VIcon/icons/picture_as_pdf.js.map +1 -1
- package/dist/components/VIcon/icons/priority_high.js.map +1 -1
- package/dist/components/VIcon/icons/remove.js.map +1 -1
- package/dist/components/VIcon/icons/schedule.js.map +1 -1
- package/dist/components/VIcon/icons/search.js.map +1 -1
- package/dist/components/VIcon/icons/search_off.js.map +1 -1
- package/dist/components/VIcon/icons/star.js.map +1 -1
- package/dist/components/VIcon/icons/swap_vert.js.map +1 -1
- package/dist/components/VIcon/icons/table_chart.js.map +1 -1
- package/dist/components/VIcon/icons/video_file.js.map +1 -1
- package/dist/components/VIcon/icons/viewBox.js.map +1 -1
- package/dist/components/VIcon/icons/warning.js.map +1 -1
- package/dist/components/VIcon/resolver.js.map +1 -1
- package/dist/components/VIconButton/VIconButton.js.map +1 -1
- package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/VInput.js.map +1 -1
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +20 -20
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/VInputGroup.js.map +1 -1
- package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/context.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +2 -8
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VLink/VLink.js.map +1 -1
- package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxChevron.js.map +1 -1
- package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxGroup.js.map +1 -1
- package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxOption.js.map +1 -1
- package/dist/components/VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxPanel.js.map +1 -1
- package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxSeparator.js.map +1 -1
- package/dist/components/VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxValues.js.map +1 -1
- package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenu.js.map +1 -1
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuGroup.js.map +1 -1
- package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuItem.js.map +1 -1
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +6 -12
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuPanel.js.map +1 -1
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +9 -10
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuSeparator.js.map +1 -1
- package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/context.js.map +1 -1
- package/dist/components/VMeter/VMeter.js.map +1 -1
- package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VNumberInput/VNumberInput.js.map +1 -1
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js +86 -85
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VNumberInput/number.d.ts +2 -2
- package/dist/components/VNumberInput/number.js +1 -1
- package/dist/components/VNumberInput/number.js.map +1 -1
- package/dist/components/VPagination/VPagination.js.map +1 -1
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VPopover/VPopover.js.map +1 -1
- package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -1
- package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRadio/VRadio.js.map +1 -1
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRating/VRating.js.map +1 -1
- package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/VResizable.js.map +1 -1
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js +8 -6
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/VResizablePanel.js.map +1 -1
- package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/context.js.map +1 -1
- package/dist/components/VResizable/layout.js.map +1 -1
- package/dist/components/VSelect/VSelect.js.map +1 -1
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js +182 -189
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSeparator/VSeparator.js.map +1 -1
- package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationSeparator.js.map +1 -1
- package/dist/components/VSideNavigation/context.js.map +1 -1
- package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
- package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSlider/VSlider.js.map +1 -1
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +22 -22
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSnackbar/VSnackbar.js.map +1 -1
- package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSnackbar/state.js.map +1 -1
- package/dist/components/VSpinner/VSpinner.js.map +1 -1
- package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSplitButton/VSplitButton.js.map +1 -1
- package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VStepper/VStepper.js.map +1 -1
- package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSwitch/VSwitch.js.map +1 -1
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTab.js.map +1 -1
- package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTabPanel.js.map +1 -1
- package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTabs.js.map +1 -1
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/context.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +45 -45
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeInput/search.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +10 -10
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimePicker/limits.js.map +1 -1
- package/dist/components/VTimeline/VTimeline.js.map +1 -1
- package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeline/VTimelineItem.js.map +1 -1
- package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeline/context.js.map +1 -1
- package/dist/components/VTimeline/datetime.js.map +1 -1
- package/dist/components/VToast/VToast.js.map +1 -1
- package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToast/VToaster.js.map +1 -1
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToast/state.js.map +1 -1
- package/dist/components/VToggle/VToggle.js.map +1 -1
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +2 -8
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToggle/VToggleItem.js.map +1 -1
- package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToggle/context.js.map +1 -1
- package/dist/components/VTooltip/VTooltip.js.map +1 -1
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTreeView/VTreeView.js.map +1 -1
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js +127 -135
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTypography/VTypography.js.map +1 -1
- package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VVirtualList/VVirtualList.js.map +1 -1
- package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/composables/useAriaLabel.js.map +1 -1
- package/dist/composables/useChoice.js.map +1 -1
- package/dist/composables/useClearable.js.map +1 -1
- package/dist/composables/useControlShape.js.map +1 -1
- package/dist/composables/useDebouncedSearch.js.map +1 -1
- package/dist/composables/useDetailsOpen.js.map +1 -1
- package/dist/composables/useEscapeDismiss.js.map +1 -1
- package/dist/composables/useFieldIds.js.map +1 -1
- package/dist/composables/useFieldPanel.js +3 -7
- package/dist/composables/useFieldPanel.js.map +1 -1
- package/dist/composables/useFileDrop.js.map +1 -1
- package/dist/composables/useFileField.js +2 -2
- package/dist/composables/useFileField.js.map +1 -1
- package/dist/composables/useFocusoutDismiss.js.map +1 -1
- package/dist/composables/useHotkeyListener.js +5 -2
- package/dist/composables/useHotkeyListener.js.map +1 -1
- package/dist/composables/useIconClickHandlers.js.map +1 -1
- package/dist/composables/useInertLink.js.map +1 -1
- package/dist/composables/useInfiniteScroll.js +4 -4
- package/dist/composables/useInfiniteScroll.js.map +1 -1
- package/dist/composables/useListbox.js +3 -9
- package/dist/composables/useListbox.js.map +1 -1
- package/dist/composables/useLiveAnnouncer.js.map +1 -1
- package/dist/composables/useMaskedField.js +28 -48
- package/dist/composables/useMaskedField.js.map +1 -1
- package/dist/composables/useModalDialog.js +1 -1
- package/dist/composables/useModalDialog.js.map +1 -1
- package/dist/composables/usePopover.js +1 -1
- package/dist/composables/usePopover.js.map +1 -1
- package/dist/composables/useProgressValue.js.map +1 -1
- package/dist/composables/useRootAttrs.js.map +1 -1
- package/dist/composables/useSlotNodes.js.map +1 -1
- package/dist/composables/useTextLimit.js.map +1 -1
- package/dist/composables/useTimer.js.map +1 -1
- package/dist/composables/useTypeahead.d.ts +13 -0
- package/dist/composables/useTypeahead.js +23 -0
- package/dist/composables/useTypeahead.js.map +1 -0
- package/dist/composables/useVirtualList.js.map +1 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/state.d.ts +1 -1
- package/dist/i18n/state.js +17 -6
- package/dist/i18n/state.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tokens/css.js.map +1 -1
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/primitives.js.map +1 -1
- package/dist/tokens/semantic.js.map +1 -1
- package/dist/tokens/themes/dark.js.map +1 -1
- package/dist/tokens/types.js.map +1 -1
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/arrowNav.js.map +1 -1
- package/dist/utils/attrs.js.map +1 -1
- package/dist/utils/chip.js.map +1 -1
- package/dist/utils/clock.js +3 -1
- package/dist/utils/clock.js.map +1 -1
- package/dist/utils/css.js +1 -1
- package/dist/utils/css.js.map +1 -1
- package/dist/utils/date.js +4 -3
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/direction.js.map +1 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/file.js +13 -31
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/focus.js.map +1 -1
- package/dist/utils/hostWarns.js.map +1 -1
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/matcher.js.map +1 -1
- package/dist/utils/memo.js.map +1 -1
- package/dist/utils/number.js.map +1 -1
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/vnode.js.map +1 -1
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VTreeView.js","names":[],"sources":["../../../src/components/VTreeView/VTreeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @keyboard @a11y @core\n/**\n * A hierarchy following the ARIA tree pattern. The rows are rendered flat, in display order, their\n * depth carried by `aria-level`, `aria-setsize` and `aria-posinset`: no native element folds a tree\n * with a single tab stop, and a row that does not wrap its subtree keeps its accessible name free of\n * its descendants' text. JavaScript owns the focus, the keyboard, selection and lazy loading.\n */\nimport { computed, onMounted, ref, shallowReactive, watch } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\n\nimport VCheckMark from '../VCheckbox/VCheckMark.vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { chevron_right as chevronRightIcon } from '../VIcon/icons/chevron_right'\nimport { error as errorIcon } from '../VIcon/icons/error'\nimport type { IconSource } from '../VIcon/types'\nimport type { ItemValue } from '../../types'\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useLiveAnnouncer } from '../../composables/useLiveAnnouncer'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTimer } from '../../composables/useTimer'\nimport { useMessages } from '../../i18n/state'\nimport { isRtl } from '../../utils/direction'\nimport { normalizeText } from '../../utils/text'\n\n/** Whether nodes can be selected: not at all, one at a time, or several with checkboxes. */\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple'\n\n/** The height of the rows: 32 or 40 pixels. */\nexport type TreeViewSize = 'sm' | 'md'\n\n/**\n * What is selected, and its shape follows `selectionMode`: a single value (or `null`) in `single`\n * mode, an array in `multiple` mode.\n */\nexport type TreeViewModelValue = ItemValue | ItemValue[] | null\n\n/** One node of the tree. */\nexport interface TreeItem {\n /** What identifies the node, in the selection and expansion models. Unique across the tree. */\n value: ItemValue\n /** What the row says. It is also what typeahead matches. */\n label: string\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** The child nodes, which make this node a branch. */\n children?: TreeItem[]\n /**\n * Marks a branch whose children `loadChildren` fetches on its first expansion. Ignored when\n * `children` is set or when the tree has no `loadChildren`.\n */\n lazy?: boolean\n /** Where the node leads, which makes the row a link. */\n href?: string\n /** Marks the node as the page being viewed (`aria-current`). */\n current?: boolean\n /**\n * Keeps the node focusable, so it is still found, but it cannot be selected, activated, expanded\n * or collapsed.\n */\n disabled?: boolean\n}\n\n/** What the `#icon`, `#label` and `#end` slots receive. */\nexport interface TreeItemSlotProps {\n item: TreeItem\n /** The depth of the node, from 1. */\n level: number\n /** Whether the node's children are shown. */\n expanded: boolean\n}\n\ntype CheckState = 'true' | 'false' | 'mixed'\n\ninterface TreeNode {\n item: TreeItem\n level: number\n parent: TreeNode | null\n posinset: number\n setsize: number\n}\n\ninterface TreeViewProps {\n /** The first level of the tree. */\n items: TreeItem[]\n /**\n * Whether nodes can be selected. In `multiple` mode each row has a checkbox, and checking a\n * branch checks everything under it.\n */\n selectionMode?: TreeSelectionMode\n /**\n * Fetches the children of a `lazy` node, on its first expansion. The tree keeps them; a failure\n * collapses the node again, and the next expansion retries.\n */\n loadChildren?: (item: TreeItem) => Promise<TreeItem[]>\n /** The height of the rows, 32 or 40 pixels. */\n size?: TreeViewSize\n /** What screen readers announce for the tree. It falls back to the design system dictionary. */\n label?: string\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TreeViewProps>(), {\n selectionMode: 'none',\n loadChildren: undefined,\n size: 'md',\n label: undefined,\n})\n\n/**\n * What is selected. In `single` mode, a value or `null`; in `multiple` mode, the checked nodes in\n * tree order, a branch included when everything under it is checked. A value given for a branch\n * checks its whole subtree. A shape that does not match the mode reads as an empty selection.\n */\nconst model = defineModel<TreeViewModelValue>({ default: null })\n\n/** The values of the expanded nodes. Left unbound, the tree keeps that state itself. */\nconst expanded = defineModel<ItemValue[]>('expanded', { default: () => [] })\n\nconst emit = defineEmits<{\n /**\n * A node was clicked or Enter was pressed on it, after the tree applied its own effect: selecting\n * it, checking it, or folding a branch in `none` mode. For a link, calling `preventDefault()` on\n * the event stops the navigation, which hands it to a router.\n */\n activate: [item: TreeItem, event: MouseEvent | KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Replaces the icon of a node, for instance to show an open folder when it is expanded. */\n icon?(props: TreeItemSlotProps): unknown\n /** Replaces the label of a node. */\n label?(props: TreeItemSlotProps): unknown\n /**\n * Content at the end of a row: a count, a badge. It must not be focusable: a row is a single\n * control.\n */\n end?(props: TreeItemSlotProps): unknown\n}>()\n\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst ariaLabel = useAriaLabel(() => props.label ?? m.value.treeView.label)\nconst { polite: announcement, announce } = useLiveAnnouncer()\n\nconst loaded = shallowReactive(new Map<ItemValue, TreeItem[]>())\nconst loading = shallowReactive(new Set<ItemValue>())\nconst failed = shallowReactive(new Set<ItemValue>())\n\nfunction childrenOf(item: TreeItem): TreeItem[] | undefined {\n return item.children ?? loaded.get(item.value)\n}\n\nfunction isPending(item: TreeItem): boolean {\n return !!props.loadChildren && !!item.lazy && !item.children && !loaded.has(item.value)\n}\n\nfunction isBranch(item: TreeItem): boolean {\n return !!childrenOf(item)?.length || isPending(item)\n}\n\nconst expandedSet = computed(() => new Set(expanded.value))\n\n/** The rows on screen, in display order: every node whose ancestors are all expanded. */\nconst visible = computed(() => {\n const rows: TreeNode[] = []\n const walk = (items: TreeItem[], level: number, parent: TreeNode | null) => {\n items.forEach((item, index) => {\n const node = { item, level, parent, posinset: index + 1, setsize: items.length }\n rows.push(node)\n const children = childrenOf(item)\n if (children && expandedSet.value.has(item.value)) walk(children, level + 1, node)\n })\n }\n walk(props.items, 1, null)\n return rows\n})\n\nfunction setExpanded(item: TreeItem, open: boolean) {\n if (open === expandedSet.value.has(item.value)) return\n expanded.value = open\n ? [...expanded.value, item.value]\n : expanded.value.filter((value) => value !== item.value)\n}\n\n// @core\n/**\n * Derives what each checkbox shows. A value in the selection checks its node and the whole subtree\n * under it; a branch then shows checked when all its children are, unchecked when none are, and\n * mixed otherwise, so its own presence in the selection only matters through its children. The map\n * is filled in tree order, which is the order the model is written in.\n */\nfunction deriveCheckStates(chosen: Set<ItemValue>): Map<ItemValue, CheckState> {\n const states = new Map<ItemValue, CheckState>()\n const visit = (item: TreeItem, inherited: boolean): CheckState => {\n states.set(item.value, 'false')\n const own = inherited || chosen.has(item.value)\n const children = childrenOf(item)\n let state: CheckState = own ? 'true' : 'false'\n if (children?.length) {\n const childStates = children.map((child) => visit(child, own))\n state = childStates.every((s) => s === 'true')\n ? 'true'\n : childStates.every((s) => s === 'false')\n ? 'false'\n : 'mixed'\n }\n states.set(item.value, state)\n return state\n }\n props.items.forEach((item) => visit(item, false))\n return states\n}\n\nconst chosenValues = computed<ItemValue[]>(() => {\n const value = model.value\n if (props.selectionMode === 'multiple') return Array.isArray(value) ? value : []\n return value === null || Array.isArray(value) ? [] : [value]\n})\n\nconst checkStates = computed(() =>\n props.selectionMode === 'multiple'\n ? deriveCheckStates(new Set(chosenValues.value))\n : new Map<ItemValue, CheckState>(),\n)\n\n/** Calls `fn` on a node and on every node under it that is not disabled. */\nfunction eachEnabled(item: TreeItem, fn: (item: TreeItem) => void) {\n fn(item)\n childrenOf(item)?.forEach((child) => {\n if (!child.disabled) eachEnabled(child, fn)\n })\n}\n\n// @core\n/**\n * Checks a node and its subtree when any leaf of it is unchecked, and unchecks them otherwise.\n * Disabled nodes keep their state. Unchecking also drops the ancestors, which would otherwise check\n * the node again through their subtree. Values the tree does not know, such as the children of a\n * node not loaded yet, are kept at the end.\n */\nfunction toggleCheck(node: TreeNode) {\n const states = checkStates.value\n const chosen = new Set<ItemValue>()\n states.forEach((state, value) => {\n if (state === 'true') chosen.add(value)\n })\n const unknown = chosenValues.value.filter((value) => !states.has(value))\n\n let check = false\n eachEnabled(node.item, (item) => {\n if (!childrenOf(item)?.length && states.get(item.value) !== 'true') check = true\n })\n // Only the leaves are added: a branch in the selection would check its disabled children too.\n eachEnabled(node.item, (item) => {\n if (!check) chosen.delete(item.value)\n else if (!childrenOf(item)?.length) chosen.add(item.value)\n })\n if (!check) for (let p = node.parent; p; p = p.parent) chosen.delete(p.item.value)\n\n const next: ItemValue[] = []\n deriveCheckStates(chosen).forEach((state, value) => {\n if (state === 'true') next.push(value)\n })\n model.value = [...next, ...unknown]\n}\n\nfunction isSelected(item: TreeItem): boolean {\n return props.selectionMode === 'single' && chosenValues.value[0] === item.value\n}\n\n// @core\n/** What a click or Enter does besides the `activate` event, which follows it. */\nfunction applyDefault(node: TreeNode) {\n const { item } = node\n if (props.selectionMode === 'single') model.value = item.value\n else if (props.selectionMode === 'multiple') toggleCheck(node)\n else if (item.href === undefined && isBranch(item))\n setExpanded(item, !expandedSet.value.has(item.value))\n}\n\nfunction activate(node: TreeNode, event: MouseEvent | KeyboardEvent) {\n applyDefault(node)\n emit('activate', node.item, event)\n}\n\nasync function load(item: TreeItem) {\n const loader = props.loadChildren\n if (!loader) return\n loading.add(item.value)\n failed.delete(item.value)\n try {\n loaded.set(item.value, await loader(item))\n } catch {\n failed.add(item.value)\n setExpanded(item, false)\n announce(m.value.treeView.loadError(item.label), false)\n } finally {\n loading.delete(item.value)\n }\n}\n\n// @ssr\n// Loading waits for the client: an expanded lazy node renders busy on the server, then fetches.\nonMounted(() => {\n // The expanded set is watched too: a pending node shows no children, so its expansion alone\n // does not change the rows.\n watch(\n [visible, expandedSet],\n ([rows, open]) => {\n for (const { item } of rows)\n if (open.has(item.value) && isPending(item) && !loading.has(item.value)) void load(item)\n },\n { immediate: true },\n )\n})\n\nconst treeEl = ref<HTMLElement | null>(null)\nconst rowEls = new Map<ItemValue, HTMLElement>()\nconst rowValues = new WeakMap<Element, ItemValue>()\n\nfunction bindRow(value: ItemValue, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) {\n rowEls.set(value, el)\n rowValues.set(el, value)\n } else rowEls.delete(value)\n}\n\n// @keyboard @a11y\n/**\n * The single tab stop: the node last focused, or its closest ancestor still on screen once a\n * branch above it folds; before any focus, the first selected node on screen, then the current\n * one, then the first row.\n */\nconst active = ref<TreeNode | null>(null)\nconst tabStop = computed<ItemValue | undefined>(() => {\n const rows = visible.value\n const shown = new Set(rows.map((node) => node.item.value))\n for (let node = active.value; node; node = node.parent)\n if (shown.has(node.item.value)) return node.item.value\n const selected =\n props.selectionMode === 'multiple'\n ? rows.find((node) => checkStates.value.get(node.item.value) === 'true')\n : rows.find((node) => isSelected(node.item))\n return (selected ?? rows.find((node) => node.item.current) ?? rows[0])?.item.value\n})\n\nfunction onFocusin(event: FocusEvent) {\n const value = rowValues.get(event.target as Element)\n if (value === undefined) return\n active.value = visible.value.find((node) => node.item.value === value) ?? null\n}\n\nfunction focusRow(node: TreeNode | undefined) {\n if (node) rowEls.get(node.item.value)?.focus()\n}\n\nconst typeahead = useTimer()\nlet typed = ''\n\n// @keyboard\n/**\n * Moves to the next row whose label starts with what was typed in the last half-second. Repeating\n * one letter cycles through the rows starting with it.\n */\nfunction typeTo(char: string, index: number) {\n typed += normalizeText(char)\n typeahead.start(() => (typed = ''), 500)\n const rows = visible.value\n const needle = [...typed].every((c) => c === typed[0]) ? typed[0]! : typed\n const start = needle.length === 1 ? index + 1 : index\n for (let i = 0; i < rows.length; i++) {\n const node = rows[(start + i) % rows.length]!\n if (normalizeText(node.item.label).startsWith(needle)) return focusRow(node)\n }\n}\n\n// @keyboard @a11y\nfunction onKeydown(event: KeyboardEvent) {\n const tree = treeEl.value\n const value = rowValues.get(event.target as Element)\n if (!tree || value === undefined || event.altKey || event.ctrlKey || event.metaKey) return\n const rows = visible.value\n const index = rows.findIndex((node) => node.item.value === value)\n const node = rows[index]\n if (!node) return\n const { item } = node\n const isOpen = expandedSet.value.has(item.value)\n const forward = isRtl(tree) ? 'ArrowLeft' : 'ArrowRight'\n const back = isRtl(tree) ? 'ArrowRight' : 'ArrowLeft'\n\n switch (event.key) {\n case 'ArrowDown':\n focusRow(rows[index + 1])\n break\n case 'ArrowUp':\n focusRow(rows[index - 1])\n break\n case 'Home':\n focusRow(rows[0])\n break\n case 'End':\n focusRow(rows.at(-1))\n break\n case forward:\n if (!isBranch(item)) break\n if (!isOpen) {\n if (!item.disabled) setExpanded(item, true)\n } else if (rows[index + 1]?.parent?.item === item) focusRow(rows[index + 1])\n break\n case back:\n if (isBranch(item) && isOpen && !item.disabled) setExpanded(item, false)\n else focusRow(node.parent ?? undefined)\n break\n case 'Enter':\n // A link follows itself: the browser turns Enter into a click, which lands in onRowClick.\n if (item.href !== undefined) return\n if (!item.disabled) activate(node, event)\n break\n case ' ':\n // Space selects without following a link, as it does nothing on a link natively.\n if (item.disabled) break\n if (item.href !== undefined) applyDefault(node)\n else activate(node, event)\n break\n case '*': {\n const siblings = node.parent ? childrenOf(node.parent.item)! : props.items\n const closed = siblings\n .filter((sibling) => !sibling.disabled && isBranch(sibling))\n .map((sibling) => sibling.value)\n .filter((sibling) => !expandedSet.value.has(sibling))\n if (closed.length) expanded.value = [...expanded.value, ...closed]\n break\n }\n default:\n if (event.key.length !== 1 || event.key === ' ') return\n typeTo(event.key, index)\n }\n event.preventDefault()\n}\n\nfunction onRowClick(node: TreeNode, event: MouseEvent) {\n // An inert link has no address left to follow; this also covers a click on its children.\n if (node.item.disabled) {\n event.preventDefault()\n return\n }\n activate(node, event)\n}\n\n// The chevron folds without selecting, and without following the link it sits in.\nfunction onChevronClick(node: TreeNode, event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n if (!node.item.disabled && isBranch(node.item))\n setExpanded(node.item, !expandedSet.value.has(node.item.value))\n}\n\nfunction slotProps(node: TreeNode): TreeItemSlotProps {\n return {\n item: node.item,\n level: node.level,\n expanded: expandedSet.value.has(node.item.value) && !isPending(node.item),\n }\n}\n\nfunction ariaExpanded(item: TreeItem) {\n return isBranch(item) ? String(expandedSet.value.has(item.value)) : undefined\n}\n\nfunction ariaCurrent(item: TreeItem) {\n if (!item.current) return undefined\n return item.href !== undefined ? 'page' : 'true'\n}\n\n// The root is a wrapper holding the live region, which a tree may not contain: these two reach\n// the tree itself.\ndefineExpose({\n /** Moves the focus to the tree's tab stop: the last focused node, else the selected or current one. */\n focus: (options?: FocusOptions) =>\n tabStop.value !== undefined && rowEls.get(tabStop.value)?.focus(options),\n /** The `role=\"tree\"` element, which also receives the consumer's attributes. */\n el: treeEl,\n})\n</script>\n\n<template>\n <div class=\"v-tree-view\" :class=\"rootClass\" :style=\"rootStyle\">\n <ul\n ref=\"treeEl\"\n class=\"v-tree v-control\"\n role=\"tree\"\n :data-size=\"size\"\n :aria-multiselectable=\"selectionMode === 'multiple' || undefined\"\n v-bind=\"forwardedAttrs\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n @focusin=\"onFocusin\"\n >\n <li v-for=\"node in visible\" :key=\"node.item.value\" class=\"v-tree-node\" role=\"none\">\n <component\n :is=\"node.item.href !== undefined ? 'a' : 'div'\"\n :ref=\"(el: Element | ComponentPublicInstance | null) => bindRow(node.item.value, el)\"\n class=\"v-tree-row\"\n role=\"treeitem\"\n :style=\"{ '--tree-level': node.level - 1 }\"\n :href=\"node.item.disabled ? undefined : node.item.href\"\n :tabindex=\"tabStop === node.item.value ? 0 : -1\"\n :aria-level=\"node.level\"\n :aria-setsize=\"node.setsize\"\n :aria-posinset=\"node.posinset\"\n :aria-expanded=\"ariaExpanded(node.item)\"\n :aria-selected=\"selectionMode === 'single' ? String(isSelected(node.item)) : undefined\"\n :aria-checked=\"\n selectionMode === 'multiple' ? checkStates.get(node.item.value) : undefined\n \"\n :aria-current=\"ariaCurrent(node.item)\"\n :aria-disabled=\"node.item.disabled || undefined\"\n :aria-busy=\"loading.has(node.item.value) || undefined\"\n :data-current=\"node.item.current ? '' : undefined\"\n @click=\"onRowClick(node, $event)\"\n >\n <!-- Decorative: the row is the control, and the arrows fold it. -->\n <span class=\"v-tree-toggle\" aria-hidden=\"true\" @click=\"onChevronClick(node, $event)\">\n <VSpinner v-if=\"loading.has(node.item.value)\" />\n <VIcon\n v-else-if=\"isBranch(node.item)\"\n class=\"v-tree-chevron\"\n :name=\"chevronRightIcon\"\n mirrored\n />\n </span>\n <VCheckMark v-if=\"selectionMode === 'multiple'\" />\n <slot name=\"icon\" v-bind=\"slotProps(node)\">\n <VIcon v-if=\"node.item.icon\" class=\"v-tree-icon\" v-bind=\"iconProps(node.item.icon)\" />\n </slot>\n <span class=\"v-tree-label\"\n ><slot name=\"label\" v-bind=\"slotProps(node)\">{{ node.item.label }}</slot></span\n >\n <template v-if=\"failed.has(node.item.value)\">\n <VIcon class=\"v-tree-error\" :name=\"errorIcon\" />\n <span class=\"v-visually-hidden\">{{ m.treeView.loadFailed }}</span>\n </template>\n <span v-if=\"$slots.end\" class=\"v-tree-end\"\n ><slot name=\"end\" v-bind=\"slotProps(node)\"\n /></span>\n </component>\n </li>\n </ul>\n <div class=\"v-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-tree {\n /* One level of indentation puts a child's chevron under its parent's icon. */\n --tree-indent: calc(var(--vectis-icon-size) + var(--control-gap));\n\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--vectis-text-family);\n }\n\n .v-tree-row {\n /* See VSideNavigation: the radius cannot exceed half the height of a single row. */\n --tree-row-radius: min(var(--vectis-radius-interactive), calc(var(--control-height) / 2));\n\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n min-block-size: var(--control-height);\n padding-block: var(--vectis-space-1);\n padding-inline: calc(var(--vectis-space-2) + var(--tree-level, 0) * var(--tree-indent))\n var(--vectis-space-2);\n border-radius: var(--tree-row-radius);\n color: var(--vectis-color-text);\n font-size: var(--control-font-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n }\n\n .v-tree-row:hover:not([aria-disabled='true']) {\n background: var(--vectis-color-surface-muted);\n }\n\n /* Drawn inwards, so that neighbouring rows cannot cover it. */\n .v-tree-row:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(-1 * var(--vectis-focus-ring-width));\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) {\n background: var(--vectis-color-accent-surface);\n color: var(--vectis-color-accent-text);\n }\n\n /* The selected row is already tinted, so its hover deepens that tint; the VMenuItem idiom. */\n .v-tree-row:is([aria-selected='true'], [data-current]):hover:not([aria-disabled='true']) {\n background: color-mix(\n in oklab,\n var(--vectis-color-accent-surface),\n var(--vectis-color-accent-text) 8%\n );\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) :is(.v-tree-icon, .v-tree-toggle) {\n color: inherit;\n }\n\n .v-tree-row[data-current] .v-tree-label {\n font-weight: var(--vectis-text-label-weight);\n }\n\n .v-tree-toggle {\n display: inline-grid;\n flex: none;\n place-items: center;\n inline-size: var(--vectis-icon-size);\n block-size: var(--vectis-icon-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-chevron {\n transition: rotate var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n .v-tree-row[aria-expanded='true'] .v-tree-chevron {\n rotate: 90deg;\n }\n\n /* The mirrored chevron points left, and turns the other way to point down. */\n .v-tree-row[aria-expanded='true'] .v-tree-chevron:dir(rtl) {\n rotate: -90deg;\n }\n\n .v-tree-icon {\n flex: none;\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-label {\n flex: 1;\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .v-tree-end {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--vectis-space-1);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-error {\n flex: none;\n color: var(--vectis-color-danger-text);\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']) .v-check-mark {\n background: var(--vectis-color-accent);\n border-color: var(--vectis-color-accent);\n }\n\n .v-tree-row[aria-checked='true'] .v-check-mark-tick,\n .v-tree-row[aria-checked='mixed'] .v-check-mark-dash {\n opacity: 1;\n }\n\n /* Last of the colour rules, so that a disabled node reads as such whatever its state. */\n .v-tree-row[aria-disabled='true'] {\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n\n .v-tree-row[aria-disabled='true'] :is(.v-tree-icon, .v-tree-toggle, .v-tree-end) {\n color: inherit;\n }\n\n .v-tree-row[aria-disabled='true'] .v-check-mark {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-border);\n color: var(--vectis-color-text-subtle);\n }\n\n /*\n * Forced colours flatten the tint of the selected row: it takes the system selection pair,\n * repeated to (0,4,0) above its own hover.\n */\n @media (forced-colors: active) {\n .v-tree-row.v-tree-row:is([aria-selected='true'], [data-current]):not([aria-disabled='true']) {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']):not([aria-disabled='true'])\n .v-check-mark {\n forced-color-adjust: none;\n background: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-tree-chevron {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"VTreeView.js","names":["_sfc_main","VTreeView_vue_vue_type_script_setup_true_lang_default","VTreeView_default"],"sources":["../../../src/components/VTreeView/VTreeView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// @keyboard @a11y @core\n/**\n * A hierarchy following the ARIA tree pattern. The rows are rendered flat, in display order, their\n * depth carried by `aria-level`, `aria-setsize` and `aria-posinset`: no native element folds a tree\n * with a single tab stop, and a row that does not wrap its subtree keeps its accessible name free of\n * its descendants' text. JavaScript owns the focus, the keyboard, selection and lazy loading.\n */\nimport { computed, onMounted, ref, shallowReactive, watch } from 'vue'\nimport type { ComponentPublicInstance } from 'vue'\n\nimport VCheckMark from '../VCheckbox/VCheckMark.vue'\nimport VIcon from '../VIcon/VIcon.vue'\nimport VSpinner from '../VSpinner/VSpinner.vue'\nimport { iconProps } from '../VIcon/iconProps'\nimport { chevron_right as chevronRightIcon } from '../VIcon/icons/chevron_right'\nimport { error as errorIcon } from '../VIcon/icons/error'\nimport type { IconSource } from '../VIcon/types'\nimport type { ItemValue } from '../../types'\nimport { useAriaLabel } from '../../composables/useAriaLabel'\nimport { useLiveAnnouncer } from '../../composables/useLiveAnnouncer'\nimport { useRootAttrs } from '../../composables/useRootAttrs'\nimport { useTypeahead } from '../../composables/useTypeahead'\nimport { useMessages } from '../../i18n/state'\nimport { isRtl } from '../../utils/direction'\nimport { normalizeText } from '../../utils/text'\n\n/** Whether nodes can be selected: not at all, one at a time, or several with checkboxes. */\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple'\n\n/** The height of the rows: 32 or 40 pixels. */\nexport type TreeViewSize = 'sm' | 'md'\n\n/**\n * What is selected, and its shape follows `selectionMode`: a single value (or `null`) in `single`\n * mode, an array in `multiple` mode.\n */\nexport type TreeViewModelValue = ItemValue | ItemValue[] | null\n\n/** One node of the tree. */\nexport interface TreeItem {\n /** What identifies the node, in the selection and expansion models. Unique across the tree. */\n value: ItemValue\n /** What the row says. It is also what typeahead matches. */\n label: string\n /** An icon before the label: an icon name, or an explicit render. */\n icon?: IconSource\n /** The child nodes, which make this node a branch. */\n children?: TreeItem[]\n /**\n * Marks a branch whose children `loadChildren` fetches on its first expansion. Ignored when\n * `children` is set or when the tree has no `loadChildren`.\n */\n lazy?: boolean\n /** Where the node leads, which makes the row a link. */\n href?: string\n /** Marks the node as the page being viewed (`aria-current`). */\n current?: boolean\n /**\n * Keeps the node focusable, so it is still found, but it cannot be selected, activated, expanded\n * or collapsed.\n */\n disabled?: boolean\n}\n\n/** What the `#icon`, `#label` and `#end` slots receive. */\nexport interface TreeItemSlotProps {\n item: TreeItem\n /** The depth of the node, from 1. */\n level: number\n /** Whether the node's children are shown. */\n expanded: boolean\n}\n\ntype CheckState = 'true' | 'false' | 'mixed'\n\ninterface TreeNode {\n item: TreeItem\n level: number\n parent: TreeNode | null\n posinset: number\n setsize: number\n}\n\ninterface TreeViewProps {\n /** The first level of the tree. */\n items: TreeItem[]\n /**\n * Whether nodes can be selected. In `multiple` mode each row has a checkbox, and checking a\n * branch checks everything under it.\n */\n selectionMode?: TreeSelectionMode\n /**\n * Fetches the children of a `lazy` node, on its first expansion. The tree keeps them; a failure\n * collapses the node again, and the next expansion retries.\n */\n loadChildren?: (item: TreeItem) => Promise<TreeItem[]>\n /** The height of the rows, 32 or 40 pixels. */\n size?: TreeViewSize\n /** What screen readers announce for the tree. It falls back to the design system dictionary. */\n label?: string\n}\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TreeViewProps>(), {\n selectionMode: 'none',\n loadChildren: undefined,\n size: 'md',\n label: undefined,\n})\n\n/**\n * What is selected. In `single` mode, a value or `null`; in `multiple` mode, the checked nodes in\n * tree order, a branch included when everything under it is checked. A value given for a branch\n * checks its whole subtree. A shape that does not match the mode reads as an empty selection.\n */\nconst model = defineModel<TreeViewModelValue>({ default: null })\n\n/** The values of the expanded nodes. Left unbound, the tree keeps that state itself. */\nconst expanded = defineModel<ItemValue[]>('expanded', { default: () => [] })\n\nconst emit = defineEmits<{\n /**\n * A node was clicked or Enter was pressed on it, after the tree applied its own effect: selecting\n * it, checking it, or folding a branch in `none` mode. For a link, calling `preventDefault()` on\n * the event stops the navigation, which hands it to a router.\n */\n activate: [item: TreeItem, event: MouseEvent | KeyboardEvent]\n}>()\n\ndefineSlots<{\n /** Replaces the icon of a node, for instance to show an open folder when it is expanded. */\n icon?(props: TreeItemSlotProps): unknown\n /** Replaces the label of a node. */\n label?(props: TreeItemSlotProps): unknown\n /**\n * Content at the end of a row: a count, a badge. It must not be focusable: a row is a single\n * control.\n */\n end?(props: TreeItemSlotProps): unknown\n}>()\n\nconst { rootClass, rootStyle, forwardedAttrs } = useRootAttrs()\nconst m = useMessages()\nconst ariaLabel = useAriaLabel(() => props.label ?? m.value.treeView.label)\nconst { polite: announcement, announce } = useLiveAnnouncer()\n\nconst loaded = shallowReactive(new Map<ItemValue, TreeItem[]>())\nconst loading = shallowReactive(new Set<ItemValue>())\nconst failed = shallowReactive(new Set<ItemValue>())\n\nfunction childrenOf(item: TreeItem): TreeItem[] | undefined {\n return item.children ?? loaded.get(item.value)\n}\n\nfunction isPending(item: TreeItem): boolean {\n return !!props.loadChildren && !!item.lazy && !item.children && !loaded.has(item.value)\n}\n\nfunction isBranch(item: TreeItem): boolean {\n return !!childrenOf(item)?.length || isPending(item)\n}\n\nconst expandedSet = computed(() => new Set(expanded.value))\n\n/** The rows on screen, in display order: every node whose ancestors are all expanded. */\nconst visible = computed(() => {\n const rows: TreeNode[] = []\n const walk = (items: TreeItem[], level: number, parent: TreeNode | null) => {\n items.forEach((item, index) => {\n const node = { item, level, parent, posinset: index + 1, setsize: items.length }\n rows.push(node)\n const children = childrenOf(item)\n if (children && expandedSet.value.has(item.value)) walk(children, level + 1, node)\n })\n }\n walk(props.items, 1, null)\n return rows\n})\n\nfunction setExpanded(item: TreeItem, open: boolean) {\n if (open === expandedSet.value.has(item.value)) return\n expanded.value = open\n ? [...expanded.value, item.value]\n : expanded.value.filter((value) => value !== item.value)\n}\n\n// @core\n/**\n * Derives what each checkbox shows. A value in the selection checks its node and the whole subtree\n * under it; a branch then shows checked when all its children are, unchecked when none are, and\n * mixed otherwise, so its own presence in the selection only matters through its children. The map\n * is filled in tree order, which is the order the model is written in.\n */\nfunction deriveCheckStates(chosen: Set<ItemValue>): Map<ItemValue, CheckState> {\n const states = new Map<ItemValue, CheckState>()\n const visit = (item: TreeItem, inherited: boolean): CheckState => {\n states.set(item.value, 'false')\n const own = inherited || chosen.has(item.value)\n const children = childrenOf(item)\n let state: CheckState = own ? 'true' : 'false'\n if (children?.length) {\n const childStates = children.map((child) => visit(child, own))\n state = childStates.every((s) => s === 'true')\n ? 'true'\n : childStates.every((s) => s === 'false')\n ? 'false'\n : 'mixed'\n }\n states.set(item.value, state)\n return state\n }\n props.items.forEach((item) => visit(item, false))\n return states\n}\n\nconst chosenValues = computed<ItemValue[]>(() => {\n const value = model.value\n if (props.selectionMode === 'multiple') return Array.isArray(value) ? value : []\n return value === null || Array.isArray(value) ? [] : [value]\n})\n\nconst checkStates = computed(() =>\n props.selectionMode === 'multiple'\n ? deriveCheckStates(new Set(chosenValues.value))\n : new Map<ItemValue, CheckState>(),\n)\n\n/** Calls `fn` on a node and on every node under it that is not disabled. */\nfunction eachEnabled(item: TreeItem, fn: (item: TreeItem) => void) {\n fn(item)\n childrenOf(item)?.forEach((child) => {\n if (!child.disabled) eachEnabled(child, fn)\n })\n}\n\n// @core\n/**\n * Checks a node and its subtree when any leaf of it is unchecked, and unchecks them otherwise.\n * Disabled nodes keep their state. Unchecking also drops the ancestors, which would otherwise check\n * the node again through their subtree. Values the tree does not know, such as the children of a\n * node not loaded yet, are kept at the end.\n */\nfunction toggleCheck(node: TreeNode) {\n const states = checkStates.value\n const chosen = new Set<ItemValue>()\n states.forEach((state, value) => {\n if (state === 'true') chosen.add(value)\n })\n const unknown = chosenValues.value.filter((value) => !states.has(value))\n\n let check = false\n eachEnabled(node.item, (item) => {\n if (!childrenOf(item)?.length && states.get(item.value) !== 'true') check = true\n })\n // Only the leaves are added: a branch in the selection would check its disabled children too.\n eachEnabled(node.item, (item) => {\n if (!check) chosen.delete(item.value)\n else if (!childrenOf(item)?.length) chosen.add(item.value)\n })\n if (!check) for (let p = node.parent; p; p = p.parent) chosen.delete(p.item.value)\n\n const next: ItemValue[] = []\n deriveCheckStates(chosen).forEach((state, value) => {\n if (state === 'true') next.push(value)\n })\n model.value = [...next, ...unknown]\n}\n\nfunction isSelected(item: TreeItem): boolean {\n return props.selectionMode === 'single' && chosenValues.value[0] === item.value\n}\n\n// @core\n/** What a click or Enter does besides the `activate` event, which follows it. */\nfunction applyDefault(node: TreeNode) {\n const { item } = node\n if (props.selectionMode === 'single') model.value = item.value\n else if (props.selectionMode === 'multiple') toggleCheck(node)\n else if (item.href === undefined && isBranch(item))\n setExpanded(item, !expandedSet.value.has(item.value))\n}\n\nfunction activate(node: TreeNode, event: MouseEvent | KeyboardEvent) {\n applyDefault(node)\n emit('activate', node.item, event)\n}\n\nasync function load(item: TreeItem) {\n const loader = props.loadChildren\n if (!loader) return\n loading.add(item.value)\n failed.delete(item.value)\n try {\n loaded.set(item.value, await loader(item))\n } catch {\n failed.add(item.value)\n setExpanded(item, false)\n announce(m.value.treeView.loadError(item.label), false)\n } finally {\n loading.delete(item.value)\n }\n}\n\n// @ssr\n// Loading waits for the client: an expanded lazy node renders busy on the server, then fetches.\nonMounted(() => {\n // The expanded set is watched too: a pending node shows no children, so its expansion alone\n // does not change the rows.\n watch(\n [visible, expandedSet],\n ([rows, open]) => {\n for (const { item } of rows)\n if (open.has(item.value) && isPending(item) && !loading.has(item.value)) void load(item)\n },\n { immediate: true },\n )\n})\n\nconst treeEl = ref<HTMLElement | null>(null)\nconst rowEls = new Map<ItemValue, HTMLElement>()\nconst rowValues = new WeakMap<Element, ItemValue>()\n\nfunction bindRow(value: ItemValue, el: Element | ComponentPublicInstance | null) {\n if (el instanceof HTMLElement) {\n rowEls.set(value, el)\n rowValues.set(el, value)\n } else rowEls.delete(value)\n}\n\n// @keyboard @a11y\n/**\n * The single tab stop: the node last focused, or its closest ancestor still on screen once a\n * branch above it folds; before any focus, the first selected node on screen, then the current\n * one, then the first row.\n */\nconst active = ref<TreeNode | null>(null)\nconst tabStop = computed<ItemValue | undefined>(() => {\n const rows = visible.value\n const shown = new Set(rows.map((node) => node.item.value))\n for (let node = active.value; node; node = node.parent)\n if (shown.has(node.item.value)) return node.item.value\n const selected =\n props.selectionMode === 'multiple'\n ? rows.find((node) => checkStates.value.get(node.item.value) === 'true')\n : rows.find((node) => isSelected(node.item))\n return (selected ?? rows.find((node) => node.item.current) ?? rows[0])?.item.value\n})\n\nfunction onFocusin(event: FocusEvent) {\n const value = rowValues.get(event.target as Element)\n if (value === undefined) return\n active.value = visible.value.find((node) => node.item.value === value) ?? null\n}\n\nfunction focusRow(node: TreeNode | undefined) {\n if (node) rowEls.get(node.item.value)?.focus()\n}\n\nconst { find: findTyped } = useTypeahead()\n\n// @keyboard\n// Moves to the row whose label starts with what was typed. Disabled rows stay focusable in a\n// tree, so they are matched too.\nfunction typeTo(char: string, index: number) {\n const rows = visible.value\n focusRow(rows[findTyped(char, rows.length, index, (i) => normalizeText(rows[i]!.item.label))])\n}\n\n// @keyboard @a11y\nfunction onKeydown(event: KeyboardEvent) {\n const tree = treeEl.value\n const value = rowValues.get(event.target as Element)\n if (!tree || value === undefined || event.altKey || event.ctrlKey || event.metaKey) return\n const rows = visible.value\n const index = rows.findIndex((node) => node.item.value === value)\n const node = rows[index]\n if (!node) return\n const { item } = node\n const isOpen = expandedSet.value.has(item.value)\n const forward = isRtl(tree) ? 'ArrowLeft' : 'ArrowRight'\n const back = isRtl(tree) ? 'ArrowRight' : 'ArrowLeft'\n\n switch (event.key) {\n case 'ArrowDown':\n focusRow(rows[index + 1])\n break\n case 'ArrowUp':\n focusRow(rows[index - 1])\n break\n case 'Home':\n focusRow(rows[0])\n break\n case 'End':\n focusRow(rows.at(-1))\n break\n case forward:\n if (!isBranch(item)) break\n if (!isOpen) {\n if (!item.disabled) setExpanded(item, true)\n } else if (rows[index + 1]?.parent?.item === item) focusRow(rows[index + 1])\n break\n case back:\n if (isBranch(item) && isOpen && !item.disabled) setExpanded(item, false)\n else focusRow(node.parent ?? undefined)\n break\n case 'Enter':\n // A link follows itself: the browser turns Enter into a click, which lands in onRowClick.\n if (item.href !== undefined) return\n if (!item.disabled) activate(node, event)\n break\n case ' ':\n // Space selects without following a link, as it does nothing on a link natively.\n if (item.disabled) break\n if (item.href !== undefined) applyDefault(node)\n else activate(node, event)\n break\n case '*': {\n const siblings = node.parent ? childrenOf(node.parent.item)! : props.items\n const closed = siblings\n .filter((sibling) => !sibling.disabled && isBranch(sibling))\n .map((sibling) => sibling.value)\n .filter((sibling) => !expandedSet.value.has(sibling))\n if (closed.length) expanded.value = [...expanded.value, ...closed]\n break\n }\n default:\n if (event.key.length !== 1 || event.key === ' ') return\n typeTo(event.key, index)\n }\n event.preventDefault()\n}\n\nfunction onRowClick(node: TreeNode, event: MouseEvent) {\n // An inert link has no address left to follow; this also covers a click on its children.\n if (node.item.disabled) {\n event.preventDefault()\n return\n }\n activate(node, event)\n}\n\n// The chevron folds without selecting, and without following the link it sits in.\nfunction onChevronClick(node: TreeNode, event: MouseEvent) {\n event.preventDefault()\n event.stopPropagation()\n if (!node.item.disabled && isBranch(node.item))\n setExpanded(node.item, !expandedSet.value.has(node.item.value))\n}\n\nfunction slotProps(node: TreeNode): TreeItemSlotProps {\n return {\n item: node.item,\n level: node.level,\n expanded: expandedSet.value.has(node.item.value) && !isPending(node.item),\n }\n}\n\nfunction ariaExpanded(item: TreeItem) {\n return isBranch(item) ? String(expandedSet.value.has(item.value)) : undefined\n}\n\nfunction ariaCurrent(item: TreeItem) {\n if (!item.current) return undefined\n return item.href !== undefined ? 'page' : 'true'\n}\n\n// The root is a wrapper holding the live region, which a tree may not contain: these two reach\n// the tree itself.\ndefineExpose({\n /** Moves the focus to the tree's tab stop: the last focused node, else the selected or current one. */\n focus: (options?: FocusOptions) =>\n tabStop.value !== undefined && rowEls.get(tabStop.value)?.focus(options),\n /** The `role=\"tree\"` element, which also receives the consumer's attributes. */\n el: treeEl,\n})\n</script>\n\n<template>\n <div class=\"v-tree-view\" :class=\"rootClass\" :style=\"rootStyle\">\n <ul\n ref=\"treeEl\"\n class=\"v-tree v-control\"\n role=\"tree\"\n :data-size=\"size\"\n :aria-multiselectable=\"selectionMode === 'multiple' || undefined\"\n v-bind=\"forwardedAttrs\"\n :aria-label=\"ariaLabel\"\n @keydown=\"onKeydown\"\n @focusin=\"onFocusin\"\n >\n <li v-for=\"node in visible\" :key=\"node.item.value\" class=\"v-tree-node\" role=\"none\">\n <component\n :is=\"node.item.href !== undefined ? 'a' : 'div'\"\n :ref=\"(el: Element | ComponentPublicInstance | null) => bindRow(node.item.value, el)\"\n class=\"v-tree-row\"\n role=\"treeitem\"\n :style=\"{ '--tree-level': node.level - 1 }\"\n :href=\"node.item.disabled ? undefined : node.item.href\"\n :tabindex=\"tabStop === node.item.value ? 0 : -1\"\n :aria-level=\"node.level\"\n :aria-setsize=\"node.setsize\"\n :aria-posinset=\"node.posinset\"\n :aria-expanded=\"ariaExpanded(node.item)\"\n :aria-selected=\"selectionMode === 'single' ? String(isSelected(node.item)) : undefined\"\n :aria-checked=\"\n selectionMode === 'multiple' ? checkStates.get(node.item.value) : undefined\n \"\n :aria-current=\"ariaCurrent(node.item)\"\n :aria-disabled=\"node.item.disabled || undefined\"\n :aria-busy=\"loading.has(node.item.value) || undefined\"\n :data-current=\"node.item.current ? '' : undefined\"\n @click=\"onRowClick(node, $event)\"\n >\n <!-- Decorative: the row is the control, and the arrows fold it. -->\n <span class=\"v-tree-toggle\" aria-hidden=\"true\" @click=\"onChevronClick(node, $event)\">\n <VSpinner v-if=\"loading.has(node.item.value)\" />\n <VIcon\n v-else-if=\"isBranch(node.item)\"\n class=\"v-tree-chevron\"\n :name=\"chevronRightIcon\"\n mirrored\n />\n </span>\n <VCheckMark v-if=\"selectionMode === 'multiple'\" />\n <slot name=\"icon\" v-bind=\"slotProps(node)\">\n <VIcon v-if=\"node.item.icon\" class=\"v-tree-icon\" v-bind=\"iconProps(node.item.icon)\" />\n </slot>\n <span class=\"v-tree-label\"\n ><slot name=\"label\" v-bind=\"slotProps(node)\">{{ node.item.label }}</slot></span\n >\n <template v-if=\"failed.has(node.item.value)\">\n <VIcon class=\"v-tree-error\" :name=\"errorIcon\" />\n <span class=\"v-visually-hidden\">{{ m.treeView.loadFailed }}</span>\n </template>\n <span v-if=\"$slots.end\" class=\"v-tree-end\"\n ><slot name=\"end\" v-bind=\"slotProps(node)\"\n /></span>\n </component>\n </li>\n </ul>\n <div class=\"v-visually-hidden\" role=\"status\" aria-live=\"polite\">{{ announcement }}</div>\n </div>\n</template>\n\n<style>\n@layer vectis.components {\n .v-tree {\n /* One level of indentation puts a child's chevron under its parent's icon. */\n --tree-indent: calc(var(--vectis-icon-size) + var(--control-gap));\n\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--vectis-text-family);\n }\n\n .v-tree-row {\n /* See VSideNavigation: the radius cannot exceed half the height of a single row. */\n --tree-row-radius: min(var(--vectis-radius-interactive), calc(var(--control-height) / 2));\n\n display: flex;\n align-items: center;\n gap: var(--control-gap);\n min-block-size: var(--control-height);\n padding-block: var(--vectis-space-1);\n padding-inline: calc(var(--vectis-space-2) + var(--tree-level, 0) * var(--tree-indent))\n var(--vectis-space-2);\n border-radius: var(--tree-row-radius);\n color: var(--vectis-color-text);\n font-size: var(--control-font-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n }\n\n .v-tree-row:hover:not([aria-disabled='true']) {\n background: var(--vectis-color-surface-muted);\n }\n\n /* Drawn inwards, so that neighbouring rows cannot cover it. */\n .v-tree-row:focus-visible {\n outline: var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);\n outline-offset: calc(-1 * var(--vectis-focus-ring-width));\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) {\n background: var(--vectis-color-accent-surface);\n color: var(--vectis-color-accent-text);\n }\n\n /* The selected row is already tinted, so its hover deepens that tint; the VMenuItem idiom. */\n .v-tree-row:is([aria-selected='true'], [data-current]):hover:not([aria-disabled='true']) {\n background: color-mix(\n in oklab,\n var(--vectis-color-accent-surface),\n var(--vectis-color-accent-text) 8%\n );\n }\n\n .v-tree-row:is([aria-selected='true'], [data-current]) :is(.v-tree-icon, .v-tree-toggle) {\n color: inherit;\n }\n\n .v-tree-row[data-current] .v-tree-label {\n font-weight: var(--vectis-text-label-weight);\n }\n\n .v-tree-toggle {\n display: inline-grid;\n flex: none;\n place-items: center;\n inline-size: var(--vectis-icon-size);\n block-size: var(--vectis-icon-size);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-chevron {\n transition: rotate var(--vectis-duration-base) var(--vectis-ease-default);\n }\n\n .v-tree-row[aria-expanded='true'] .v-tree-chevron {\n rotate: 90deg;\n }\n\n /* The mirrored chevron points left, and turns the other way to point down. */\n .v-tree-row[aria-expanded='true'] .v-tree-chevron:dir(rtl) {\n rotate: -90deg;\n }\n\n .v-tree-icon {\n flex: none;\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-label {\n flex: 1;\n min-inline-size: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .v-tree-end {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--vectis-space-1);\n color: var(--vectis-color-text-muted);\n }\n\n .v-tree-error {\n flex: none;\n color: var(--vectis-color-danger-text);\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']) .v-check-mark {\n background: var(--vectis-color-accent);\n border-color: var(--vectis-color-accent);\n }\n\n .v-tree-row[aria-checked='true'] .v-check-mark-tick,\n .v-tree-row[aria-checked='mixed'] .v-check-mark-dash {\n opacity: 1;\n }\n\n /* Last of the colour rules, so that a disabled node reads as such whatever its state. */\n .v-tree-row[aria-disabled='true'] {\n color: var(--vectis-color-text-subtle);\n cursor: not-allowed;\n }\n\n .v-tree-row[aria-disabled='true'] :is(.v-tree-icon, .v-tree-toggle, .v-tree-end) {\n color: inherit;\n }\n\n .v-tree-row[aria-disabled='true'] .v-check-mark {\n background: var(--vectis-color-surface-muted);\n border-color: var(--vectis-color-border);\n color: var(--vectis-color-text-subtle);\n }\n\n /*\n * Forced colours flatten the tint of the selected row: it takes the system selection pair,\n * repeated to (0,4,0) above its own hover.\n */\n @media (forced-colors: active) {\n .v-tree-row.v-tree-row:is([aria-selected='true'], [data-current]):not([aria-disabled='true']) {\n forced-color-adjust: none;\n background: Highlight;\n color: HighlightText;\n }\n\n .v-tree-row:is([aria-checked='true'], [aria-checked='mixed']):not([aria-disabled='true'])\n .v-check-mark {\n forced-color-adjust: none;\n background: Highlight;\n border-color: Highlight;\n color: HighlightText;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .v-tree-chevron {\n transition: none;\n }\n }\n}\n</style>\n"],"mappings":""}
|
|
@@ -8,10 +8,10 @@ import { useRootAttrs as o } from "../../composables/useRootAttrs.js";
|
|
|
8
8
|
import { chevron_right as s } from "../VIcon/icons/chevron_right.js";
|
|
9
9
|
import c from "../VCheckbox/VCheckMark.js";
|
|
10
10
|
import { error as l } from "../VIcon/icons/error.js";
|
|
11
|
-
import { useLiveAnnouncer as
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as ne, createVNode as re, defineComponent as _, mergeModels as v, mergeProps as y, normalizeClass as ie, normalizeStyle as
|
|
11
|
+
import { useLiveAnnouncer as u } from "../../composables/useLiveAnnouncer.js";
|
|
12
|
+
import { normalizeText as ee } from "../../utils/text.js";
|
|
13
|
+
import { useTypeahead as te } from "../../composables/useTypeahead.js";
|
|
14
|
+
import { Fragment as d, computed as f, createBlock as p, createCommentVNode as m, createElementBlock as h, createElementVNode as g, createTextVNode as ne, createVNode as re, defineComponent as _, mergeModels as v, mergeProps as y, normalizeClass as ie, normalizeStyle as ae, onMounted as oe, openBlock as b, ref as x, renderList as se, renderSlot as S, resolveDynamicComponent as ce, shallowReactive as C, toDisplayString as w, unref as T, useModel as E, watch as le, withCtx as ue } from "vue";
|
|
15
15
|
//#region src/components/VTreeView/VTreeView.vue?vue&type=script&setup=true&lang.ts
|
|
16
16
|
var de = [
|
|
17
17
|
"data-size",
|
|
@@ -24,7 +24,7 @@ var de = [
|
|
|
24
24
|
class: "v-visually-hidden",
|
|
25
25
|
role: "status",
|
|
26
26
|
"aria-live": "polite"
|
|
27
|
-
},
|
|
27
|
+
}, D = /*@__PURE__*/ _({
|
|
28
28
|
inheritAttrs: !1,
|
|
29
29
|
__name: "VTreeView",
|
|
30
30
|
props: /*@__PURE__*/ v({
|
|
@@ -43,18 +43,18 @@ var de = [
|
|
|
43
43
|
expandedModifiers: {}
|
|
44
44
|
}),
|
|
45
45
|
emits: /*@__PURE__*/ v(["activate"], ["update:modelValue", "update:expanded"]),
|
|
46
|
-
setup(_, { expose: v, emit:
|
|
47
|
-
let
|
|
48
|
-
function P(e) {
|
|
49
|
-
return e.children ?? j.get(e.value);
|
|
50
|
-
}
|
|
46
|
+
setup(_, { expose: v, emit: D }) {
|
|
47
|
+
let O = _, k = E(_, "modelValue"), A = E(_, "expanded"), _e = D, { rootClass: ve, rootStyle: ye, forwardedAttrs: be } = o(), j = e(), xe = a(() => O.label ?? j.value.treeView.label), { polite: Se, announce: Ce } = u(), M = C(/* @__PURE__ */ new Map()), N = C(/* @__PURE__ */ new Set()), P = C(/* @__PURE__ */ new Set());
|
|
51
48
|
function F(e) {
|
|
52
|
-
return
|
|
49
|
+
return e.children ?? M.get(e.value);
|
|
53
50
|
}
|
|
54
51
|
function I(e) {
|
|
55
|
-
return !!
|
|
52
|
+
return !!O.loadChildren && !!e.lazy && !e.children && !M.has(e.value);
|
|
53
|
+
}
|
|
54
|
+
function L(e) {
|
|
55
|
+
return !!F(e)?.length || I(e);
|
|
56
56
|
}
|
|
57
|
-
let
|
|
57
|
+
let R = f(() => new Set(A.value)), z = f(() => {
|
|
58
58
|
let e = [], t = (n, r, i) => {
|
|
59
59
|
n.forEach((a, o) => {
|
|
60
60
|
let s = {
|
|
@@ -65,236 +65,228 @@ var de = [
|
|
|
65
65
|
setsize: n.length
|
|
66
66
|
};
|
|
67
67
|
e.push(s);
|
|
68
|
-
let c =
|
|
69
|
-
c &&
|
|
68
|
+
let c = F(a);
|
|
69
|
+
c && R.value.has(a.value) && t(c, r + 1, s);
|
|
70
70
|
});
|
|
71
71
|
};
|
|
72
|
-
return t(
|
|
72
|
+
return t(O.items, 1, null), e;
|
|
73
73
|
});
|
|
74
|
-
function
|
|
75
|
-
t !==
|
|
74
|
+
function B(e, t) {
|
|
75
|
+
t !== R.value.has(e.value) && (A.value = t ? [...A.value, e.value] : A.value.filter((t) => t !== e.value));
|
|
76
76
|
}
|
|
77
|
-
function
|
|
77
|
+
function V(e) {
|
|
78
78
|
let t = /* @__PURE__ */ new Map(), n = (r, i) => {
|
|
79
79
|
t.set(r.value, "false");
|
|
80
|
-
let a = i || e.has(r.value), o =
|
|
80
|
+
let a = i || e.has(r.value), o = F(r), s = a ? "true" : "false";
|
|
81
81
|
if (o?.length) {
|
|
82
82
|
let e = o.map((e) => n(e, a));
|
|
83
83
|
s = e.every((e) => e === "true") ? "true" : e.every((e) => e === "false") ? "false" : "mixed";
|
|
84
84
|
}
|
|
85
85
|
return t.set(r.value, s), s;
|
|
86
86
|
};
|
|
87
|
-
return
|
|
87
|
+
return O.items.forEach((e) => n(e, !1)), t;
|
|
88
88
|
}
|
|
89
|
-
let
|
|
90
|
-
let e =
|
|
91
|
-
return
|
|
92
|
-
}),
|
|
93
|
-
function
|
|
94
|
-
t(e),
|
|
95
|
-
e.disabled ||
|
|
89
|
+
let H = f(() => {
|
|
90
|
+
let e = k.value;
|
|
91
|
+
return O.selectionMode === "multiple" ? Array.isArray(e) ? e : [] : e === null || Array.isArray(e) ? [] : [e];
|
|
92
|
+
}), U = f(() => O.selectionMode === "multiple" ? V(new Set(H.value)) : /* @__PURE__ */ new Map());
|
|
93
|
+
function W(e, t) {
|
|
94
|
+
t(e), F(e)?.forEach((e) => {
|
|
95
|
+
e.disabled || W(e, t);
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
|
-
function
|
|
99
|
-
let t =
|
|
98
|
+
function we(e) {
|
|
99
|
+
let t = U.value, n = /* @__PURE__ */ new Set();
|
|
100
100
|
t.forEach((e, t) => {
|
|
101
101
|
e === "true" && n.add(t);
|
|
102
102
|
});
|
|
103
|
-
let r =
|
|
104
|
-
if (
|
|
105
|
-
!
|
|
106
|
-
}),
|
|
107
|
-
i ?
|
|
103
|
+
let r = H.value.filter((e) => !t.has(e)), i = !1;
|
|
104
|
+
if (W(e.item, (e) => {
|
|
105
|
+
!F(e)?.length && t.get(e.value) !== "true" && (i = !0);
|
|
106
|
+
}), W(e.item, (e) => {
|
|
107
|
+
i ? F(e)?.length || n.add(e.value) : n.delete(e.value);
|
|
108
108
|
}), !i) for (let t = e.parent; t; t = t.parent) n.delete(t.item.value);
|
|
109
109
|
let a = [];
|
|
110
|
-
|
|
110
|
+
V(n).forEach((e, t) => {
|
|
111
111
|
e === "true" && a.push(t);
|
|
112
|
-
}),
|
|
113
|
-
}
|
|
114
|
-
function W(e) {
|
|
115
|
-
return D.selectionMode === "single" && V.value[0] === e.value;
|
|
112
|
+
}), k.value = [...a, ...r];
|
|
116
113
|
}
|
|
117
114
|
function G(e) {
|
|
115
|
+
return O.selectionMode === "single" && H.value[0] === e.value;
|
|
116
|
+
}
|
|
117
|
+
function K(e) {
|
|
118
118
|
let { item: t } = e;
|
|
119
|
-
|
|
119
|
+
O.selectionMode === "single" ? k.value = t.value : O.selectionMode === "multiple" ? we(e) : t.href === void 0 && L(t) && B(t, !R.value.has(t.value));
|
|
120
120
|
}
|
|
121
|
-
function
|
|
122
|
-
|
|
121
|
+
function q(e, t) {
|
|
122
|
+
K(e), _e("activate", e.item, t);
|
|
123
123
|
}
|
|
124
|
-
async function
|
|
125
|
-
let t =
|
|
124
|
+
async function Te(e) {
|
|
125
|
+
let t = O.loadChildren;
|
|
126
126
|
if (t) {
|
|
127
|
-
|
|
127
|
+
N.add(e.value), P.delete(e.value);
|
|
128
128
|
try {
|
|
129
|
-
|
|
129
|
+
M.set(e.value, await t(e));
|
|
130
130
|
} catch {
|
|
131
|
-
|
|
131
|
+
P.add(e.value), B(e, !1), Ce(j.value.treeView.loadError(e.label), !1);
|
|
132
132
|
} finally {
|
|
133
|
-
|
|
133
|
+
N.delete(e.value);
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
|
|
138
|
-
le([
|
|
139
|
-
for (let { item: n } of e) t.has(n.value) &&
|
|
137
|
+
oe(() => {
|
|
138
|
+
le([z, R], ([e, t]) => {
|
|
139
|
+
for (let { item: n } of e) t.has(n.value) && I(n) && !N.has(n.value) && Te(n);
|
|
140
140
|
}, { immediate: !0 });
|
|
141
141
|
});
|
|
142
|
-
let
|
|
143
|
-
function
|
|
144
|
-
t instanceof HTMLElement ? (
|
|
142
|
+
let J = x(null), Y = /* @__PURE__ */ new Map(), X = /* @__PURE__ */ new WeakMap();
|
|
143
|
+
function Ee(e, t) {
|
|
144
|
+
t instanceof HTMLElement ? (Y.set(e, t), X.set(t, e)) : Y.delete(e);
|
|
145
145
|
}
|
|
146
|
-
let
|
|
147
|
-
let e =
|
|
148
|
-
for (let e =
|
|
149
|
-
return ((
|
|
146
|
+
let De = x(null), Z = f(() => {
|
|
147
|
+
let e = z.value, t = new Set(e.map((e) => e.item.value));
|
|
148
|
+
for (let e = De.value; e; e = e.parent) if (t.has(e.item.value)) return e.item.value;
|
|
149
|
+
return ((O.selectionMode === "multiple" ? e.find((e) => U.value.get(e.item.value) === "true") : e.find((e) => G(e.item))) ?? e.find((e) => e.item.current) ?? e[0])?.item.value;
|
|
150
150
|
});
|
|
151
|
-
function
|
|
152
|
-
let t =
|
|
153
|
-
t !== void 0 && (
|
|
151
|
+
function Oe(e) {
|
|
152
|
+
let t = X.get(e.target);
|
|
153
|
+
t !== void 0 && (De.value = z.value.find((e) => e.item.value === t) ?? null);
|
|
154
154
|
}
|
|
155
|
-
function
|
|
156
|
-
e &&
|
|
155
|
+
function Q(e) {
|
|
156
|
+
e && Y.get(e.item.value)?.focus();
|
|
157
157
|
}
|
|
158
|
-
let
|
|
159
|
-
function
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
for (let e = 0; e < n.length; e++) {
|
|
163
|
-
let t = n[(i + e) % n.length];
|
|
164
|
-
if (u(t.item.label).startsWith(r)) return Z(t);
|
|
165
|
-
}
|
|
158
|
+
let { find: ke } = te();
|
|
159
|
+
function Ae(e, t) {
|
|
160
|
+
let n = z.value;
|
|
161
|
+
Q(n[ke(e, n.length, t, (e) => ee(n[e].item.label))]);
|
|
166
162
|
}
|
|
167
|
-
function
|
|
168
|
-
let t =
|
|
163
|
+
function je(e) {
|
|
164
|
+
let t = J.value, n = X.get(e.target);
|
|
169
165
|
if (!t || n === void 0 || e.altKey || e.ctrlKey || e.metaKey) return;
|
|
170
|
-
let i =
|
|
166
|
+
let i = z.value, a = i.findIndex((e) => e.item.value === n), o = i[a];
|
|
171
167
|
if (!o) return;
|
|
172
|
-
let { item: s } = o, c =
|
|
168
|
+
let { item: s } = o, c = R.value.has(s.value), l = r(t) ? "ArrowLeft" : "ArrowRight", u = r(t) ? "ArrowRight" : "ArrowLeft";
|
|
173
169
|
switch (e.key) {
|
|
174
170
|
case "ArrowDown":
|
|
175
|
-
|
|
171
|
+
Q(i[a + 1]);
|
|
176
172
|
break;
|
|
177
173
|
case "ArrowUp":
|
|
178
|
-
|
|
174
|
+
Q(i[a - 1]);
|
|
179
175
|
break;
|
|
180
176
|
case "Home":
|
|
181
|
-
|
|
177
|
+
Q(i[0]);
|
|
182
178
|
break;
|
|
183
179
|
case "End":
|
|
184
|
-
|
|
180
|
+
Q(i.at(-1));
|
|
185
181
|
break;
|
|
186
182
|
case l:
|
|
187
|
-
if (!
|
|
188
|
-
c ? i[a + 1]?.parent?.item === s &&
|
|
183
|
+
if (!L(s)) break;
|
|
184
|
+
c ? i[a + 1]?.parent?.item === s && Q(i[a + 1]) : s.disabled || B(s, !0);
|
|
189
185
|
break;
|
|
190
|
-
case
|
|
191
|
-
|
|
186
|
+
case u:
|
|
187
|
+
L(s) && c && !s.disabled ? B(s, !1) : Q(o.parent ?? void 0);
|
|
192
188
|
break;
|
|
193
189
|
case "Enter":
|
|
194
190
|
if (s.href !== void 0) return;
|
|
195
|
-
s.disabled ||
|
|
191
|
+
s.disabled || q(o, e);
|
|
196
192
|
break;
|
|
197
193
|
case " ":
|
|
198
194
|
if (s.disabled) break;
|
|
199
|
-
s.href === void 0 ?
|
|
195
|
+
s.href === void 0 ? q(o, e) : K(o);
|
|
200
196
|
break;
|
|
201
197
|
case "*": {
|
|
202
|
-
let e = (o.parent ?
|
|
203
|
-
e.length && (
|
|
198
|
+
let e = (o.parent ? F(o.parent.item) : O.items).filter((e) => !e.disabled && L(e)).map((e) => e.value).filter((e) => !R.value.has(e));
|
|
199
|
+
e.length && (A.value = [...A.value, ...e]);
|
|
204
200
|
break;
|
|
205
201
|
}
|
|
206
202
|
default:
|
|
207
203
|
if (e.key.length !== 1 || e.key === " ") return;
|
|
208
|
-
|
|
204
|
+
Ae(e.key, a);
|
|
209
205
|
}
|
|
210
206
|
e.preventDefault();
|
|
211
207
|
}
|
|
212
|
-
function
|
|
213
|
-
|
|
214
|
-
t.preventDefault();
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
K(e, t);
|
|
208
|
+
function Me(e, t) {
|
|
209
|
+
e.item.disabled ? t.preventDefault() : q(e, t);
|
|
218
210
|
}
|
|
219
|
-
function
|
|
220
|
-
t.preventDefault(), t.stopPropagation(), !e.item.disabled &&
|
|
211
|
+
function Ne(e, t) {
|
|
212
|
+
t.preventDefault(), t.stopPropagation(), !e.item.disabled && L(e.item) && B(e.item, !R.value.has(e.item.value));
|
|
221
213
|
}
|
|
222
214
|
function $(e) {
|
|
223
215
|
return {
|
|
224
216
|
item: e.item,
|
|
225
217
|
level: e.level,
|
|
226
|
-
expanded:
|
|
218
|
+
expanded: R.value.has(e.item.value) && !I(e.item)
|
|
227
219
|
};
|
|
228
220
|
}
|
|
229
|
-
function
|
|
230
|
-
return
|
|
221
|
+
function Pe(e) {
|
|
222
|
+
return L(e) ? String(R.value.has(e.value)) : void 0;
|
|
231
223
|
}
|
|
232
|
-
function
|
|
224
|
+
function Fe(e) {
|
|
233
225
|
if (e.current) return e.href === void 0 ? "true" : "page";
|
|
234
226
|
}
|
|
235
227
|
return v({
|
|
236
|
-
focus: (e) =>
|
|
237
|
-
el:
|
|
238
|
-
}), (e, r) => (
|
|
239
|
-
class: ie(["v-tree-view",
|
|
240
|
-
style:
|
|
228
|
+
focus: (e) => Z.value !== void 0 && Y.get(Z.value)?.focus(e),
|
|
229
|
+
el: J
|
|
230
|
+
}), (e, r) => (b(), h("div", {
|
|
231
|
+
class: ie(["v-tree-view", T(ve)]),
|
|
232
|
+
style: ae(T(ye))
|
|
241
233
|
}, [g("ul", y({
|
|
242
234
|
ref_key: "treeEl",
|
|
243
|
-
ref:
|
|
235
|
+
ref: J,
|
|
244
236
|
class: "v-tree v-control",
|
|
245
237
|
role: "tree",
|
|
246
238
|
"data-size": _.size,
|
|
247
239
|
"aria-multiselectable": _.selectionMode === "multiple" || void 0
|
|
248
|
-
},
|
|
249
|
-
"aria-label":
|
|
250
|
-
onKeydown:
|
|
251
|
-
onFocusin:
|
|
252
|
-
}), [(
|
|
240
|
+
}, T(be), {
|
|
241
|
+
"aria-label": T(xe),
|
|
242
|
+
onKeydown: je,
|
|
243
|
+
onFocusin: Oe
|
|
244
|
+
}), [(b(!0), h(d, null, se(z.value, (r) => (b(), h("li", {
|
|
253
245
|
key: r.item.value,
|
|
254
246
|
class: "v-tree-node",
|
|
255
247
|
role: "none"
|
|
256
|
-
}, [(
|
|
248
|
+
}, [(b(), p(ce(r.item.href === void 0 ? "div" : "a"), {
|
|
257
249
|
ref_for: !0,
|
|
258
|
-
ref: (e) =>
|
|
250
|
+
ref: (e) => Ee(r.item.value, e),
|
|
259
251
|
class: "v-tree-row",
|
|
260
252
|
role: "treeitem",
|
|
261
|
-
style:
|
|
253
|
+
style: ae({ "--tree-level": r.level - 1 }),
|
|
262
254
|
href: r.item.disabled ? void 0 : r.item.href,
|
|
263
|
-
tabindex:
|
|
255
|
+
tabindex: Z.value === r.item.value ? 0 : -1,
|
|
264
256
|
"aria-level": r.level,
|
|
265
257
|
"aria-setsize": r.setsize,
|
|
266
258
|
"aria-posinset": r.posinset,
|
|
267
|
-
"aria-expanded":
|
|
268
|
-
"aria-selected": _.selectionMode === "single" ? String(
|
|
269
|
-
"aria-checked": _.selectionMode === "multiple" ?
|
|
270
|
-
"aria-current":
|
|
259
|
+
"aria-expanded": Pe(r.item),
|
|
260
|
+
"aria-selected": _.selectionMode === "single" ? String(G(r.item)) : void 0,
|
|
261
|
+
"aria-checked": _.selectionMode === "multiple" ? U.value.get(r.item.value) : void 0,
|
|
262
|
+
"aria-current": Fe(r.item),
|
|
271
263
|
"aria-disabled": r.item.disabled || void 0,
|
|
272
|
-
"aria-busy":
|
|
264
|
+
"aria-busy": T(N).has(r.item.value) || void 0,
|
|
273
265
|
"data-current": r.item.current ? "" : void 0,
|
|
274
|
-
onClick: (e) =>
|
|
266
|
+
onClick: (e) => Me(r, e)
|
|
275
267
|
}, {
|
|
276
268
|
default: ue(() => [
|
|
277
269
|
g("span", {
|
|
278
270
|
class: "v-tree-toggle",
|
|
279
271
|
"aria-hidden": "true",
|
|
280
|
-
onClick: (e) =>
|
|
281
|
-
}, [
|
|
272
|
+
onClick: (e) => Ne(r, e)
|
|
273
|
+
}, [T(N).has(r.item.value) ? (b(), p(i, { key: 0 })) : L(r.item) ? (b(), p(n, {
|
|
282
274
|
key: 1,
|
|
283
275
|
class: "v-tree-chevron",
|
|
284
|
-
name:
|
|
276
|
+
name: T(s),
|
|
285
277
|
mirrored: ""
|
|
286
278
|
}, null, 8, ["name"])) : m("", !0)], 8, fe),
|
|
287
|
-
_.selectionMode === "multiple" ? (
|
|
288
|
-
|
|
279
|
+
_.selectionMode === "multiple" ? (b(), p(c, { key: 0 })) : m("", !0),
|
|
280
|
+
S(e.$slots, "icon", y({ ref_for: !0 }, $(r)), () => [r.item.icon ? (b(), p(n, y({
|
|
289
281
|
key: 0,
|
|
290
282
|
class: "v-tree-icon"
|
|
291
|
-
}, { ref_for: !0 },
|
|
292
|
-
g("span", pe, [
|
|
293
|
-
|
|
283
|
+
}, { ref_for: !0 }, T(t)(r.item.icon)), null, 16)) : m("", !0)]),
|
|
284
|
+
g("span", pe, [S(e.$slots, "label", y({ ref_for: !0 }, $(r)), () => [ne(w(r.item.label), 1)])]),
|
|
285
|
+
T(P).has(r.item.value) ? (b(), h(d, { key: 1 }, [re(n, {
|
|
294
286
|
class: "v-tree-error",
|
|
295
|
-
name:
|
|
296
|
-
}, null, 8, ["name"]), g("span", me, T(
|
|
297
|
-
e.$slots.end ? (
|
|
287
|
+
name: T(l)
|
|
288
|
+
}, null, 8, ["name"]), g("span", me, w(T(j).treeView.loadFailed), 1)], 64)) : m("", !0),
|
|
289
|
+
e.$slots.end ? (b(), h("span", he, [S(e.$slots, "end", y({ ref_for: !0 }, $(r)))])) : m("", !0)
|
|
298
290
|
]),
|
|
299
291
|
_: 2
|
|
300
292
|
}, 1032, [
|
|
@@ -312,10 +304,10 @@ var de = [
|
|
|
312
304
|
"aria-busy",
|
|
313
305
|
"data-current",
|
|
314
306
|
"onClick"
|
|
315
|
-
]))]))), 128))], 16, de), g("div", ge, T(
|
|
307
|
+
]))]))), 128))], 16, de), g("div", ge, w(T(Se)), 1)], 6));
|
|
316
308
|
}
|
|
317
309
|
});
|
|
318
310
|
//#endregion
|
|
319
|
-
export {
|
|
311
|
+
export { D as default };
|
|
320
312
|
|
|
321
313
|
//# sourceMappingURL=VTreeView.vue_vue_type_script_setup_true_lang.js.map
|