vectis-ui 0.12.0 → 0.14.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.css +1 -1
- package/dist/components/VAccordion/VAccordion.d.ts +6 -5
- 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.css +1 -1
- package/dist/components/VAccordion/VAccordionItem.d.ts +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/VAlert/VAlert.css +2 -0
- package/dist/components/VAlert/VAlert.d.ts +73 -0
- package/dist/components/VAlert/VAlert.js +9 -0
- package/dist/components/VAlert/VAlert.js.map +1 -0
- package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js +96 -0
- package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VAvatar/VAvatar.d.ts +2 -2
- package/dist/components/VAvatar/VAvatarGroup.d.ts +1 -1
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/VBadge/VBadge.d.ts +3 -3
- package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/components/VButton/VButton.d.ts +4 -4
- package/dist/components/VButton/VButtonGroup.css +1 -1
- package/dist/components/VButton/VButtonGroup.d.ts +2 -2
- 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/VCalendar/VCalendar.css +1 -1
- package/dist/components/VCalendar/VCalendar.d.ts +7 -1
- package/dist/components/VCalendar/VCalendar.js.map +1 -1
- package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js +20 -18
- 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.css +1 -1
- package/dist/components/VCalendar/VCalendarMonth.d.ts +2 -2
- package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.css +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.d.ts +3 -3
- package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarYear.css +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/gesture.d.ts +1 -16
- package/dist/components/VCalendar/gesture.js +1 -1
- package/dist/components/VCalendar/gesture.js.map +1 -1
- package/dist/components/VCalendar/types.d.ts +2 -0
- package/dist/components/VCard/VCard.css +2 -0
- package/dist/components/VCard/VCard.d.ts +87 -0
- package/dist/components/VCard/VCard.js +9 -0
- package/dist/components/VCard/VCard.js.map +1 -0
- package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js +103 -0
- package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCarousel/VCarousel.d.ts +1 -1
- package/dist/components/VCarousel/VCarousel.js.map +1 -1
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCheckbox/VCheckMark.css +2 -0
- package/dist/components/VCheckbox/VCheckMark.js +9 -0
- package/dist/components/VCheckbox/VCheckMark.js.map +1 -0
- package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js +33 -0
- package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCheckbox/VCheckbox.css +1 -1
- package/dist/components/VCheckbox/VCheckbox.d.ts +8 -3
- package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js +54 -69
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VChip/VChip.d.ts +6 -6
- package/dist/components/VChip/VChip.js.map +1 -1
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +26 -26
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorInput/VColorInput.css +2 -0
- package/dist/components/VColorInput/VColorInput.d.ts +113 -0
- package/dist/components/VColorInput/VColorInput.js +9 -0
- package/dist/components/VColorInput/VColorInput.js.map +1 -0
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js +230 -0
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VColorPicker/VColorPicker.css +2 -0
- package/dist/components/VColorPicker/VColorPicker.d.ts +67 -0
- package/dist/components/VColorPicker/VColorPicker.js +9 -0
- package/dist/components/VColorPicker/VColorPicker.js.map +1 -0
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js +390 -0
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VColorPicker/color.d.ts +42 -0
- package/dist/components/VColorPicker/color.js +158 -0
- package/dist/components/VColorPicker/color.js.map +1 -0
- package/dist/components/VCombobox/VCombobox.css +1 -1
- package/dist/components/VCombobox/VCombobox.d.ts +46 -60
- package/dist/components/VCombobox/VCombobox.js.map +1 -1
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +271 -372
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.css +2 -0
- package/dist/components/VCommandPalette/VCommandPalette.d.ts +163 -0
- package/dist/components/VCommandPalette/VCommandPalette.js +9 -0
- package/dist/components/VCommandPalette/VCommandPalette.js.map +1 -0
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js +321 -0
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.css +2 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.d.ts +38 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.js +9 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.js.map +1 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js +69 -0
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VContextMenu/VContextMenu.css +2 -0
- package/dist/components/VContextMenu/VContextMenu.d.ts +66 -0
- package/dist/components/VContextMenu/VContextMenu.js +9 -0
- package/dist/components/VContextMenu/VContextMenu.js.map +1 -0
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js +148 -0
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VDataTable/VDataTable.css +1 -1
- package/dist/components/VDataTable/VDataTable.d.ts +41 -16
- package/dist/components/VDataTable/VDataTable.js.map +1 -1
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +307 -194
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.d.ts +27 -7
- package/dist/components/VDateInput/VDateInput.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +170 -162
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.d.ts +3 -3
- package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +228 -227
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDatePicker/keyboard.d.ts +7 -7
- package/dist/components/VDatePicker/keyboard.js +8 -6
- package/dist/components/VDatePicker/keyboard.js.map +1 -1
- package/dist/components/VDatePicker/names.js +16 -20
- package/dist/components/VDatePicker/names.js.map +1 -1
- package/dist/components/VDialog/VDialog.d.ts +2 -4
- package/dist/components/VDialog/VDialog.js.map +1 -1
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js +46 -77
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDrawer/VDrawer.css +2 -0
- package/dist/components/VDrawer/VDrawer.d.ts +102 -0
- package/dist/components/VDrawer/VDrawer.js +9 -0
- package/dist/components/VDrawer/VDrawer.js.map +1 -0
- package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js +128 -0
- package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VEmptyState/VEmptyState.css +2 -0
- package/dist/components/VEmptyState/VEmptyState.d.ts +43 -0
- package/dist/components/VEmptyState/VEmptyState.js +9 -0
- package/dist/components/VEmptyState/VEmptyState.js.map +1 -0
- package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js +48 -0
- package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VField/VField.css +2 -0
- package/dist/components/VField/VField.d.ts +84 -0
- package/dist/components/VField/VField.js +9 -0
- package/dist/components/VField/VField.js.map +1 -0
- package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js +99 -0
- package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VField/VFieldAnnouncer.d.ts +7 -0
- package/dist/components/VField/VFieldAnnouncer.js +7 -0
- package/dist/components/VField/VFieldAnnouncer.js.map +1 -0
- package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VField/VFieldMessage.d.ts +11 -0
- package/dist/components/VField/VFieldMessage.js +7 -0
- package/dist/components/VField/VFieldMessage.js.map +1 -0
- package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js +32 -0
- package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VFieldset/VFieldset.css +2 -0
- package/dist/components/VFieldset/VFieldset.d.ts +52 -0
- package/dist/components/VFieldset/VFieldset.js +9 -0
- package/dist/components/VFieldset/VFieldset.js.map +1 -0
- package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js +63 -0
- package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VFileInput/VFileInput.css +1 -1
- package/dist/components/VFileInput/VFileInput.d.ts +31 -7
- package/dist/components/VFileInput/VFileInput.js.map +1 -1
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +168 -161
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFilePicker/VFilePicker.d.ts +4 -4
- package/dist/components/VHotkeys/VHotkeys.css +1 -1
- package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +27 -30
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VHotkeys/platform.d.ts +2 -0
- package/dist/components/VHotkeys/platform.js +24 -5
- package/dist/components/VHotkeys/platform.js.map +1 -1
- package/dist/components/VHoverCard/VHoverCard.css +2 -0
- package/dist/components/VHoverCard/VHoverCard.d.ts +62 -0
- package/dist/components/VHoverCard/VHoverCard.js +9 -0
- package/dist/components/VHoverCard/VHoverCard.js.map +1 -0
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js +97 -0
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VIcon/icons/add.d.ts +5 -0
- package/dist/components/VIcon/icons/add.js +9 -0
- package/dist/components/VIcon/icons/add.js.map +1 -0
- package/dist/components/VIcon/icons/colorize.d.ts +5 -0
- package/dist/components/VIcon/icons/colorize.js +9 -0
- package/dist/components/VIcon/icons/colorize.js.map +1 -0
- package/dist/components/VIcon/icons/inbox.d.ts +5 -0
- package/dist/components/VIcon/icons/inbox.js +9 -0
- package/dist/components/VIcon/icons/inbox.js.map +1 -0
- package/dist/components/VIcon/icons/index.d.ts +42 -2
- package/dist/components/VIcon/icons/index.js +88 -72
- package/dist/components/VIcon/icons/index.js.map +1 -1
- package/dist/components/VIcon/icons/names.d.ts +2 -2
- package/dist/components/VIcon/icons/names.js +1 -1
- package/dist/components/VIcon/icons/names.js.map +1 -1
- package/dist/components/VIcon/icons/open_in_new.d.ts +5 -0
- package/dist/components/VIcon/icons/open_in_new.js +9 -0
- package/dist/components/VIcon/icons/open_in_new.js.map +1 -0
- package/dist/components/VIcon/icons/priority_high.d.ts +5 -0
- package/dist/components/VIcon/icons/priority_high.js +9 -0
- package/dist/components/VIcon/icons/priority_high.js.map +1 -0
- package/dist/components/VIcon/icons/remove.d.ts +5 -0
- package/dist/components/VIcon/icons/remove.js +9 -0
- package/dist/components/VIcon/icons/remove.js.map +1 -0
- package/dist/components/VIcon/icons/search_off.d.ts +5 -0
- package/dist/components/VIcon/icons/search_off.js +9 -0
- package/dist/components/VIcon/icons/search_off.js.map +1 -0
- package/dist/components/VIcon/icons/star.d.ts +5 -0
- package/dist/components/VIcon/icons/star.js +9 -0
- package/dist/components/VIcon/icons/star.js.map +1 -0
- package/dist/components/VIconButton/VIconButton.d.ts +4 -4
- package/dist/components/VInput/VInput.css +1 -1
- package/dist/components/VInput/VInput.d.ts +51 -2
- package/dist/components/VInput/VInput.js.map +1 -1
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +129 -106
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/VInputGroup.css +1 -1
- package/dist/components/VInput/VInputGroup.d.ts +20 -0
- package/dist/components/VInput/VInputGroup.js.map +1 -1
- package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js +50 -51
- package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.css +1 -1
- package/dist/components/VInputOTP/VInputOTP.d.ts +27 -4
- package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +131 -113
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VLink/VLink.css +2 -0
- package/dist/components/VLink/VLink.d.ts +53 -0
- package/dist/components/VLink/VLink.js +9 -0
- package/dist/components/VLink/VLink.js.map +1 -0
- package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js +58 -0
- package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxChevron.css +2 -0
- package/dist/components/VListbox/VListboxChevron.d.ts +12 -0
- package/dist/components/VListbox/VListboxChevron.js +9 -0
- package/dist/components/VListbox/VListboxChevron.js.map +1 -0
- package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js +25 -0
- package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxGroup.css +2 -0
- package/dist/components/VListbox/VListboxGroup.d.ts +27 -0
- package/dist/components/VListbox/VListboxGroup.js +9 -0
- package/dist/components/VListbox/VListboxGroup.js.map +1 -0
- package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js +21 -0
- package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxOption.css +2 -0
- package/dist/components/{VCombobox/VComboboxOption.d.ts → VListbox/VListboxOption.d.ts} +4 -4
- package/dist/components/VListbox/VListboxOption.js +9 -0
- package/dist/components/VListbox/VListboxOption.js.map +1 -0
- package/dist/components/{VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js} +6 -6
- package/dist/components/VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxPanel.css +2 -0
- package/dist/components/VListbox/VListboxPanel.d.ts +59 -0
- package/dist/components/VListbox/VListboxPanel.js +9 -0
- package/dist/components/VListbox/VListboxPanel.js.map +1 -0
- package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js +123 -0
- package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxSeparator.css +2 -0
- package/dist/components/VListbox/VListboxSeparator.d.ts +3 -0
- package/dist/components/VListbox/VListboxSeparator.js +9 -0
- package/dist/components/VListbox/VListboxSeparator.js.map +1 -0
- package/dist/components/{VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js → VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js} +4 -4
- package/dist/components/VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VListbox/VListboxValues.css +2 -0
- package/dist/components/VListbox/VListboxValues.d.ts +52 -0
- package/dist/components/VListbox/VListboxValues.js +9 -0
- package/dist/components/VListbox/VListboxValues.js.map +1 -0
- package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js +103 -0
- package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VMenu/VMenu.d.ts +1 -1
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/components/VMenu/VMenuItem.d.ts +1 -1
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/components/VMenu/VMenuPanel.d.ts +2 -2
- package/dist/components/VMenu/VMenuPanel.js.map +1 -1
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMeter/VMeter.css +2 -0
- package/dist/components/VMeter/VMeter.d.ts +77 -0
- package/dist/components/VMeter/VMeter.js +9 -0
- package/dist/components/VMeter/VMeter.js.map +1 -0
- package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js +113 -0
- package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VNumberInput/VNumberInput.css +2 -0
- package/dist/components/VNumberInput/VNumberInput.d.ts +114 -0
- package/dist/components/VNumberInput/VNumberInput.js +9 -0
- package/dist/components/VNumberInput/VNumberInput.js.map +1 -0
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js +251 -0
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VNumberInput/number.d.ts +30 -0
- package/dist/components/VNumberInput/number.js +38 -0
- package/dist/components/VNumberInput/number.js.map +1 -0
- package/dist/components/VPagination/VPagination.d.ts +1 -1
- package/dist/components/VPagination/VPagination.js.map +1 -1
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +77 -77
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VProgressCircular/VProgressCircular.d.ts +2 -2
- package/dist/components/VProgressLinear/VProgressLinear.css +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.d.ts +10 -7
- package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js +52 -34
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRadio/VRadio.d.ts +8 -3
- package/dist/components/VRadio/VRadio.js.map +1 -1
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js +52 -46
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRating/VRating.css +2 -0
- package/dist/components/VRating/VRating.d.ts +92 -0
- package/dist/components/VRating/VRating.js +9 -0
- package/dist/components/VRating/VRating.js.map +1 -0
- package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js +158 -0
- package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VResizable/VResizable.css +2 -0
- package/dist/components/VResizable/VResizable.d.ts +50 -0
- package/dist/components/VResizable/VResizable.js +9 -0
- package/dist/components/VResizable/VResizable.js.map +1 -0
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js +225 -0
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VResizable/VResizablePanel.css +2 -0
- package/dist/components/VResizable/VResizablePanel.d.ts +60 -0
- package/dist/components/VResizable/VResizablePanel.js +9 -0
- package/dist/components/VResizable/VResizablePanel.js.map +1 -0
- package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VResizable/context.d.ts +24 -0
- package/dist/components/VResizable/context.js +6 -0
- package/dist/components/VResizable/context.js.map +1 -0
- package/dist/components/VResizable/layout.d.ts +28 -0
- package/dist/components/VResizable/layout.js +41 -0
- package/dist/components/VResizable/layout.js.map +1 -0
- package/dist/components/VSelect/VSelect.css +2 -0
- package/dist/components/VSelect/VSelect.d.ts +193 -0
- package/dist/components/VSelect/VSelect.js +9 -0
- package/dist/components/VSelect/VSelect.js.map +1 -0
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js +418 -0
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js.map +1 -0
- 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.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/VSideNavigation/VSideNavigationItem.d.ts +2 -2
- package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +3 -3
- package/dist/components/VSlider/VSlider.css +1 -1
- package/dist/components/VSlider/VSlider.d.ts +34 -8
- package/dist/components/VSlider/VSlider.js.map +1 -1
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +236 -215
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/components/VSnackbar/state.js.map +1 -1
- package/dist/components/VSplitButton/VSplitButton.css +2 -0
- package/dist/components/VSplitButton/VSplitButton.d.ts +114 -0
- package/dist/components/VSplitButton/VSplitButton.js +9 -0
- package/dist/components/VSplitButton/VSplitButton.js.map +1 -0
- package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js +148 -0
- package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VStepper/VStepper.css +2 -0
- package/dist/components/VStepper/VStepper.d.ts +73 -0
- package/dist/components/VStepper/VStepper.js +9 -0
- package/dist/components/VStepper/VStepper.js.map +1 -0
- package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js +96 -0
- package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VSwitch/VSwitch.d.ts +8 -3
- package/dist/components/VSwitch/VSwitch.js.map +1 -1
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js +53 -47
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTab.css +1 -1
- package/dist/components/VTabs/VTab.d.ts +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/VTabs.css +1 -1
- package/dist/components/VTabs/VTabs.d.ts +13 -5
- package/dist/components/VTabs/VTabs.js.map +1 -1
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +20 -20
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.css +1 -1
- package/dist/components/VTextarea/VTextarea.d.ts +22 -2
- package/dist/components/VTextarea/VTextarea.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +108 -100
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.d.ts +27 -7
- package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +187 -171
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.d.ts +2 -2
- package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +16 -16
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeline/VTimeline.css +2 -0
- package/dist/components/VTimeline/VTimeline.d.ts +59 -0
- package/dist/components/VTimeline/VTimeline.js +9 -0
- package/dist/components/VTimeline/VTimeline.js.map +1 -0
- package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js +53 -0
- package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTimeline/VTimelineItem.css +2 -0
- package/dist/components/VTimeline/VTimelineItem.d.ts +48 -0
- package/dist/components/VTimeline/VTimelineItem.js +9 -0
- package/dist/components/VTimeline/VTimelineItem.js.map +1 -0
- package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTimeline/context.d.ts +11 -0
- package/dist/components/VTimeline/context.js +6 -0
- package/dist/components/VTimeline/context.js.map +1 -0
- package/dist/components/VTimeline/datetime.d.ts +8 -0
- package/dist/components/VTimeline/datetime.js +36 -0
- package/dist/components/VTimeline/datetime.js.map +1 -0
- package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +12 -12
- package/dist/components/VToggle/VToggle.d.ts +4 -4
- package/dist/components/VToggle/VToggle.js.map +1 -1
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToggle/VToggleItem.d.ts +1 -1
- package/dist/components/VTooltip/VTooltip.d.ts +8 -2
- package/dist/components/VTooltip/VTooltip.js.map +1 -1
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js +45 -43
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTreeView/VTreeView.css +2 -0
- package/dist/components/VTreeView/VTreeView.d.ts +112 -0
- package/dist/components/VTreeView/VTreeView.js +9 -0
- package/dist/components/VTreeView/VTreeView.js.map +1 -0
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js +317 -0
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/VTypography/VTypography.d.ts +1 -1
- package/dist/components/VVirtualList/VVirtualList.css +2 -0
- package/dist/components/VVirtualList/VVirtualList.d.ts +78 -0
- package/dist/components/VVirtualList/VVirtualList.js +9 -0
- package/dist/components/VVirtualList/VVirtualList.js.map +1 -0
- package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js +114 -0
- package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/composables/useChoice.d.ts +28 -0
- package/dist/composables/useChoice.js +28 -0
- package/dist/composables/useChoice.js.map +1 -0
- package/dist/composables/useDebouncedSearch.d.ts +17 -0
- package/dist/composables/useDebouncedSearch.js +18 -0
- package/dist/composables/useDebouncedSearch.js.map +1 -0
- package/dist/composables/useEscapeDismiss.d.ts +8 -0
- package/dist/composables/useEscapeDismiss.js +16 -0
- package/dist/composables/useEscapeDismiss.js.map +1 -0
- package/dist/composables/useFieldIds.d.ts +2 -1
- package/dist/composables/useFieldIds.js +7 -6
- package/dist/composables/useFieldIds.js.map +1 -1
- package/dist/composables/useFieldPanel.d.ts +1 -0
- package/dist/composables/useFieldPanel.js +52 -42
- package/dist/composables/useFieldPanel.js.map +1 -1
- package/dist/composables/useFileField.d.ts +1 -3
- package/dist/composables/useFileField.js +48 -50
- package/dist/composables/useFileField.js.map +1 -1
- package/dist/composables/useHotkeyListener.d.ts +17 -0
- package/dist/composables/useHotkeyListener.js +29 -0
- package/dist/composables/useHotkeyListener.js.map +1 -0
- package/dist/composables/useIconClickHandlers.d.ts +2 -10
- package/dist/composables/useIconClickHandlers.js +1 -1
- package/dist/composables/useIconClickHandlers.js.map +1 -1
- package/dist/{components/VCombobox/infiniteScroll.d.ts → composables/useInfiniteScroll.d.ts} +6 -0
- package/dist/{components/VCombobox/infiniteScroll.js → composables/useInfiniteScroll.js} +9 -9
- package/dist/composables/useInfiniteScroll.js.map +1 -0
- package/dist/composables/useListbox.d.ts +132 -0
- package/dist/composables/useListbox.js +227 -0
- package/dist/composables/useListbox.js.map +1 -0
- package/dist/composables/useModalDialog.d.ts +28 -0
- package/dist/composables/useModalDialog.js +60 -0
- package/dist/composables/useModalDialog.js.map +1 -0
- package/dist/composables/useRootAttrs.d.ts +2 -3
- package/dist/composables/useRootAttrs.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.d.ts +46 -0
- package/dist/composables/useVirtualList.js +145 -0
- package/dist/composables/useVirtualList.js.map +1 -0
- package/dist/i18n/en.js +50 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.js +50 -0
- 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/i18n/types.d.ts +103 -2
- package/dist/icons.js +45 -37
- package/dist/index.d.ts +49 -3
- package/dist/index.js +80 -56
- package/dist/styles.css +1 -1
- package/dist/tokens/index.d.ts +43 -0
- package/dist/tokens/semantic.d.ts +42 -0
- package/dist/tokens/semantic.js +43 -1
- package/dist/tokens/semantic.js.map +1 -1
- package/dist/tokens/themes/dark.d.ts +1 -0
- package/dist/tokens/themes/dark.js +1 -0
- package/dist/tokens/themes/dark.js.map +1 -1
- package/dist/tokens.json +215 -1
- package/dist/types.d.ts +57 -4
- package/dist/utils/arrowNav.js.map +1 -1
- package/dist/utils/attrs.d.ts +9 -0
- package/dist/utils/attrs.js +14 -0
- package/dist/utils/attrs.js.map +1 -0
- package/dist/utils/date.d.ts +1 -0
- package/dist/utils/date.js +5 -4
- package/dist/utils/date.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/VCombobox/VComboboxGroup.css +0 -2
- package/dist/components/VCombobox/VComboboxGroup.d.ts +0 -17
- package/dist/components/VCombobox/VComboboxGroup.js +0 -9
- package/dist/components/VCombobox/VComboboxGroup.js.map +0 -1
- package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js +0 -21
- package/dist/components/VCombobox/VComboboxGroup.vue_vue_type_script_setup_true_lang.js.map +0 -1
- package/dist/components/VCombobox/VComboboxOption.css +0 -2
- package/dist/components/VCombobox/VComboboxOption.js +0 -9
- package/dist/components/VCombobox/VComboboxOption.js.map +0 -1
- package/dist/components/VCombobox/VComboboxOption.vue_vue_type_script_setup_true_lang.js.map +0 -1
- package/dist/components/VCombobox/VComboboxSeparator.css +0 -2
- package/dist/components/VCombobox/VComboboxSeparator.js +0 -9
- package/dist/components/VCombobox/VComboboxSeparator.js.map +0 -1
- package/dist/components/VCombobox/VComboboxSeparator.vue_vue_type_script_setup_true_lang.js.map +0 -1
- package/dist/components/VCombobox/infiniteScroll.js.map +0 -1
- /package/dist/components/{VCombobox/VComboboxSeparator.d.ts → VCheckbox/VCheckMark.d.ts} +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { IconSource } from '../VIcon/types.js';
|
|
2
|
+
import { ItemValue } from '../../types.js';
|
|
3
|
+
/** Whether nodes can be selected: not at all, one at a time, or several with checkboxes. */
|
|
4
|
+
export type TreeSelectionMode = 'none' | 'single' | 'multiple';
|
|
5
|
+
/** The height of the rows: 32 or 40 pixels. */
|
|
6
|
+
export type TreeViewSize = 'sm' | 'md';
|
|
7
|
+
/**
|
|
8
|
+
* What is selected, and its shape follows `selectionMode`: a single value (or `null`) in `single`
|
|
9
|
+
* mode, an array in `multiple` mode.
|
|
10
|
+
*/
|
|
11
|
+
export type TreeViewModelValue = ItemValue | ItemValue[] | null;
|
|
12
|
+
/** One node of the tree. */
|
|
13
|
+
export interface TreeItem {
|
|
14
|
+
/** What identifies the node, in the selection and expansion models. Unique across the tree. */
|
|
15
|
+
value: ItemValue;
|
|
16
|
+
/** What the row says. It is also what typeahead matches. */
|
|
17
|
+
label: string;
|
|
18
|
+
/** An icon before the label: an icon name, or an explicit render. */
|
|
19
|
+
icon?: IconSource;
|
|
20
|
+
/** The child nodes, which make this node a branch. */
|
|
21
|
+
children?: TreeItem[];
|
|
22
|
+
/**
|
|
23
|
+
* Marks a branch whose children `loadChildren` fetches on its first expansion. Ignored when
|
|
24
|
+
* `children` is set or when the tree has no `loadChildren`.
|
|
25
|
+
*/
|
|
26
|
+
lazy?: boolean;
|
|
27
|
+
/** Where the node leads, which makes the row a link. */
|
|
28
|
+
href?: string;
|
|
29
|
+
/** Marks the node as the page being viewed (`aria-current`). */
|
|
30
|
+
current?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Keeps the node focusable, so it is still found, but it cannot be selected, activated, expanded
|
|
33
|
+
* or collapsed.
|
|
34
|
+
*/
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** What the `#icon`, `#label` and `#end` slots receive. */
|
|
38
|
+
export interface TreeItemSlotProps {
|
|
39
|
+
item: TreeItem;
|
|
40
|
+
/** The depth of the node, from 1. */
|
|
41
|
+
level: number;
|
|
42
|
+
/** Whether the node's children are shown. */
|
|
43
|
+
expanded: boolean;
|
|
44
|
+
}
|
|
45
|
+
interface TreeViewProps {
|
|
46
|
+
/** The first level of the tree. */
|
|
47
|
+
items: TreeItem[];
|
|
48
|
+
/**
|
|
49
|
+
* Whether nodes can be selected. In `multiple` mode each row has a checkbox, and checking a
|
|
50
|
+
* branch checks everything under it.
|
|
51
|
+
*/
|
|
52
|
+
selectionMode?: TreeSelectionMode;
|
|
53
|
+
/**
|
|
54
|
+
* Fetches the children of a `lazy` node, on its first expansion. The tree keeps them; a failure
|
|
55
|
+
* collapses the node again, and the next expansion retries.
|
|
56
|
+
*/
|
|
57
|
+
loadChildren?: (item: TreeItem) => Promise<TreeItem[]>;
|
|
58
|
+
/** The height of the rows, 32 or 40 pixels. */
|
|
59
|
+
size?: TreeViewSize;
|
|
60
|
+
/** What screen readers announce for the tree. It falls back to the design system dictionary. */
|
|
61
|
+
label?: string;
|
|
62
|
+
}
|
|
63
|
+
type __VLS_Props = TreeViewProps;
|
|
64
|
+
type __VLS_Slots = {
|
|
65
|
+
/** Replaces the icon of a node, for instance to show an open folder when it is expanded. */
|
|
66
|
+
icon?(props: TreeItemSlotProps): unknown;
|
|
67
|
+
/** Replaces the label of a node. */
|
|
68
|
+
label?(props: TreeItemSlotProps): unknown;
|
|
69
|
+
/**
|
|
70
|
+
* Content at the end of a row: a count, a badge. It must not be focusable: a row is a single
|
|
71
|
+
* control.
|
|
72
|
+
*/
|
|
73
|
+
end?(props: TreeItemSlotProps): unknown;
|
|
74
|
+
};
|
|
75
|
+
type __VLS_ModelProps = {
|
|
76
|
+
/**
|
|
77
|
+
* What is selected. In `single` mode, a value or `null`; in `multiple` mode, the checked nodes in
|
|
78
|
+
* tree order, a branch included when everything under it is checked. A value given for a branch
|
|
79
|
+
* checks its whole subtree. A shape that does not match the mode reads as an empty selection.
|
|
80
|
+
*/
|
|
81
|
+
modelValue?: TreeViewModelValue;
|
|
82
|
+
/** The values of the expanded nodes. Left unbound, the tree keeps that state itself. */
|
|
83
|
+
'expanded'?: ItemValue[];
|
|
84
|
+
};
|
|
85
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
86
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
|
|
87
|
+
/** Moves the focus to the tree's tab stop: the last focused node, else the selected or current one. */
|
|
88
|
+
focus: (options?: FocusOptions) => false | void | undefined;
|
|
89
|
+
/** The `role="tree"` element, which also receives the consumer's attributes. */
|
|
90
|
+
el: import('vue').Ref<HTMLElement | null, HTMLElement | null>;
|
|
91
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
92
|
+
"update:modelValue": (value: TreeViewModelValue) => any;
|
|
93
|
+
activate: (item: TreeItem, event: MouseEvent | KeyboardEvent) => any;
|
|
94
|
+
"update:expanded": (value: ItemValue[]) => any;
|
|
95
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
96
|
+
"onUpdate:modelValue"?: ((value: TreeViewModelValue) => any) | undefined;
|
|
97
|
+
onActivate?: ((item: TreeItem, event: MouseEvent | KeyboardEvent) => any) | undefined;
|
|
98
|
+
"onUpdate:expanded"?: ((value: ItemValue[]) => any) | undefined;
|
|
99
|
+
}>, {
|
|
100
|
+
label: string;
|
|
101
|
+
size: TreeViewSize;
|
|
102
|
+
selectionMode: TreeSelectionMode;
|
|
103
|
+
loadChildren: (item: TreeItem) => Promise<TreeItem[]>;
|
|
104
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
105
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
106
|
+
declare const _default: typeof __VLS_export;
|
|
107
|
+
export default _default;
|
|
108
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
109
|
+
new (): {
|
|
110
|
+
$slots: S;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
@@ -0,0 +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 { 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":""}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { useMessages as e } from "../../i18n/state.js";
|
|
2
|
+
import { iconProps as t } from "../VIcon/iconProps.js";
|
|
3
|
+
import n from "../VIcon/VIcon.js";
|
|
4
|
+
import { isRtl as r } from "../../utils/direction.js";
|
|
5
|
+
import i from "../VSpinner/VSpinner.js";
|
|
6
|
+
import { useAriaLabel as a } from "../../composables/useAriaLabel.js";
|
|
7
|
+
import { useRootAttrs as o } from "../../composables/useRootAttrs.js";
|
|
8
|
+
import { chevron_right as s } from "../VIcon/icons/chevron_right.js";
|
|
9
|
+
import c from "../VCheckbox/VCheckMark.js";
|
|
10
|
+
import { error as l } from "../VIcon/icons/error.js";
|
|
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
|
+
//#region src/components/VTreeView/VTreeView.vue?vue&type=script&setup=true&lang.ts
|
|
16
|
+
var de = [
|
|
17
|
+
"data-size",
|
|
18
|
+
"aria-multiselectable",
|
|
19
|
+
"aria-label"
|
|
20
|
+
], fe = ["onClick"], pe = { class: "v-tree-label" }, me = { class: "v-visually-hidden" }, he = {
|
|
21
|
+
key: 2,
|
|
22
|
+
class: "v-tree-end"
|
|
23
|
+
}, ge = {
|
|
24
|
+
class: "v-visually-hidden",
|
|
25
|
+
role: "status",
|
|
26
|
+
"aria-live": "polite"
|
|
27
|
+
}, D = /*@__PURE__*/ _({
|
|
28
|
+
inheritAttrs: !1,
|
|
29
|
+
__name: "VTreeView",
|
|
30
|
+
props: /*@__PURE__*/ v({
|
|
31
|
+
items: {},
|
|
32
|
+
selectionMode: { default: "none" },
|
|
33
|
+
loadChildren: {
|
|
34
|
+
type: Function,
|
|
35
|
+
default: void 0
|
|
36
|
+
},
|
|
37
|
+
size: { default: "md" },
|
|
38
|
+
label: { default: void 0 }
|
|
39
|
+
}, {
|
|
40
|
+
modelValue: { default: null },
|
|
41
|
+
modelModifiers: {},
|
|
42
|
+
expanded: { default: () => [] },
|
|
43
|
+
expandedModifiers: {}
|
|
44
|
+
}),
|
|
45
|
+
emits: /*@__PURE__*/ v(["activate"], ["update:modelValue", "update:expanded"]),
|
|
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());
|
|
48
|
+
function F(e) {
|
|
49
|
+
return e.children ?? M.get(e.value);
|
|
50
|
+
}
|
|
51
|
+
function I(e) {
|
|
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
|
+
}
|
|
57
|
+
let R = f(() => new Set(A.value)), z = f(() => {
|
|
58
|
+
let e = [], t = (n, r, i) => {
|
|
59
|
+
n.forEach((a, o) => {
|
|
60
|
+
let s = {
|
|
61
|
+
item: a,
|
|
62
|
+
level: r,
|
|
63
|
+
parent: i,
|
|
64
|
+
posinset: o + 1,
|
|
65
|
+
setsize: n.length
|
|
66
|
+
};
|
|
67
|
+
e.push(s);
|
|
68
|
+
let c = F(a);
|
|
69
|
+
c && R.value.has(a.value) && t(c, r + 1, s);
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
return t(O.items, 1, null), e;
|
|
73
|
+
});
|
|
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
|
+
}
|
|
77
|
+
function V(e) {
|
|
78
|
+
let t = /* @__PURE__ */ new Map(), n = (r, i) => {
|
|
79
|
+
t.set(r.value, "false");
|
|
80
|
+
let a = i || e.has(r.value), o = F(r), s = a ? "true" : "false";
|
|
81
|
+
if (o?.length) {
|
|
82
|
+
let e = o.map((e) => n(e, a));
|
|
83
|
+
s = e.every((e) => e === "true") ? "true" : e.every((e) => e === "false") ? "false" : "mixed";
|
|
84
|
+
}
|
|
85
|
+
return t.set(r.value, s), s;
|
|
86
|
+
};
|
|
87
|
+
return O.items.forEach((e) => n(e, !1)), t;
|
|
88
|
+
}
|
|
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
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function we(e) {
|
|
99
|
+
let t = U.value, n = /* @__PURE__ */ new Set();
|
|
100
|
+
t.forEach((e, t) => {
|
|
101
|
+
e === "true" && n.add(t);
|
|
102
|
+
});
|
|
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
|
+
}), !i) for (let t = e.parent; t; t = t.parent) n.delete(t.item.value);
|
|
109
|
+
let a = [];
|
|
110
|
+
V(n).forEach((e, t) => {
|
|
111
|
+
e === "true" && a.push(t);
|
|
112
|
+
}), k.value = [...a, ...r];
|
|
113
|
+
}
|
|
114
|
+
function G(e) {
|
|
115
|
+
return O.selectionMode === "single" && H.value[0] === e.value;
|
|
116
|
+
}
|
|
117
|
+
function K(e) {
|
|
118
|
+
let { item: t } = e;
|
|
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
|
+
}
|
|
121
|
+
function q(e, t) {
|
|
122
|
+
K(e), _e("activate", e.item, t);
|
|
123
|
+
}
|
|
124
|
+
async function Te(e) {
|
|
125
|
+
let t = O.loadChildren;
|
|
126
|
+
if (t) {
|
|
127
|
+
N.add(e.value), P.delete(e.value);
|
|
128
|
+
try {
|
|
129
|
+
M.set(e.value, await t(e));
|
|
130
|
+
} catch {
|
|
131
|
+
P.add(e.value), B(e, !1), Ce(j.value.treeView.loadError(e.label), !1);
|
|
132
|
+
} finally {
|
|
133
|
+
N.delete(e.value);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
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
|
+
}, { immediate: !0 });
|
|
141
|
+
});
|
|
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
|
+
}
|
|
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
|
+
});
|
|
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
|
+
}
|
|
155
|
+
function Q(e) {
|
|
156
|
+
e && Y.get(e.item.value)?.focus();
|
|
157
|
+
}
|
|
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))]);
|
|
162
|
+
}
|
|
163
|
+
function je(e) {
|
|
164
|
+
let t = J.value, n = X.get(e.target);
|
|
165
|
+
if (!t || n === void 0 || e.altKey || e.ctrlKey || e.metaKey) return;
|
|
166
|
+
let i = z.value, a = i.findIndex((e) => e.item.value === n), o = i[a];
|
|
167
|
+
if (!o) return;
|
|
168
|
+
let { item: s } = o, c = R.value.has(s.value), l = r(t) ? "ArrowLeft" : "ArrowRight", u = r(t) ? "ArrowRight" : "ArrowLeft";
|
|
169
|
+
switch (e.key) {
|
|
170
|
+
case "ArrowDown":
|
|
171
|
+
Q(i[a + 1]);
|
|
172
|
+
break;
|
|
173
|
+
case "ArrowUp":
|
|
174
|
+
Q(i[a - 1]);
|
|
175
|
+
break;
|
|
176
|
+
case "Home":
|
|
177
|
+
Q(i[0]);
|
|
178
|
+
break;
|
|
179
|
+
case "End":
|
|
180
|
+
Q(i.at(-1));
|
|
181
|
+
break;
|
|
182
|
+
case l:
|
|
183
|
+
if (!L(s)) break;
|
|
184
|
+
c ? i[a + 1]?.parent?.item === s && Q(i[a + 1]) : s.disabled || B(s, !0);
|
|
185
|
+
break;
|
|
186
|
+
case u:
|
|
187
|
+
L(s) && c && !s.disabled ? B(s, !1) : Q(o.parent ?? void 0);
|
|
188
|
+
break;
|
|
189
|
+
case "Enter":
|
|
190
|
+
if (s.href !== void 0) return;
|
|
191
|
+
s.disabled || q(o, e);
|
|
192
|
+
break;
|
|
193
|
+
case " ":
|
|
194
|
+
if (s.disabled) break;
|
|
195
|
+
s.href === void 0 ? q(o, e) : K(o);
|
|
196
|
+
break;
|
|
197
|
+
case "*": {
|
|
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]);
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
default:
|
|
203
|
+
if (e.key.length !== 1 || e.key === " ") return;
|
|
204
|
+
Ae(e.key, a);
|
|
205
|
+
}
|
|
206
|
+
e.preventDefault();
|
|
207
|
+
}
|
|
208
|
+
function Me(e, t) {
|
|
209
|
+
if (e.item.disabled) {
|
|
210
|
+
t.preventDefault();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
q(e, t);
|
|
214
|
+
}
|
|
215
|
+
function Ne(e, t) {
|
|
216
|
+
t.preventDefault(), t.stopPropagation(), !e.item.disabled && L(e.item) && B(e.item, !R.value.has(e.item.value));
|
|
217
|
+
}
|
|
218
|
+
function $(e) {
|
|
219
|
+
return {
|
|
220
|
+
item: e.item,
|
|
221
|
+
level: e.level,
|
|
222
|
+
expanded: R.value.has(e.item.value) && !I(e.item)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function Pe(e) {
|
|
226
|
+
return L(e) ? String(R.value.has(e.value)) : void 0;
|
|
227
|
+
}
|
|
228
|
+
function Fe(e) {
|
|
229
|
+
if (e.current) return e.href === void 0 ? "true" : "page";
|
|
230
|
+
}
|
|
231
|
+
return v({
|
|
232
|
+
focus: (e) => Z.value !== void 0 && Y.get(Z.value)?.focus(e),
|
|
233
|
+
el: J
|
|
234
|
+
}), (e, r) => (b(), h("div", {
|
|
235
|
+
class: ie(["v-tree-view", T(ve)]),
|
|
236
|
+
style: ae(T(ye))
|
|
237
|
+
}, [g("ul", y({
|
|
238
|
+
ref_key: "treeEl",
|
|
239
|
+
ref: J,
|
|
240
|
+
class: "v-tree v-control",
|
|
241
|
+
role: "tree",
|
|
242
|
+
"data-size": _.size,
|
|
243
|
+
"aria-multiselectable": _.selectionMode === "multiple" || void 0
|
|
244
|
+
}, T(be), {
|
|
245
|
+
"aria-label": T(xe),
|
|
246
|
+
onKeydown: je,
|
|
247
|
+
onFocusin: Oe
|
|
248
|
+
}), [(b(!0), h(d, null, se(z.value, (r) => (b(), h("li", {
|
|
249
|
+
key: r.item.value,
|
|
250
|
+
class: "v-tree-node",
|
|
251
|
+
role: "none"
|
|
252
|
+
}, [(b(), p(ce(r.item.href === void 0 ? "div" : "a"), {
|
|
253
|
+
ref_for: !0,
|
|
254
|
+
ref: (e) => Ee(r.item.value, e),
|
|
255
|
+
class: "v-tree-row",
|
|
256
|
+
role: "treeitem",
|
|
257
|
+
style: ae({ "--tree-level": r.level - 1 }),
|
|
258
|
+
href: r.item.disabled ? void 0 : r.item.href,
|
|
259
|
+
tabindex: Z.value === r.item.value ? 0 : -1,
|
|
260
|
+
"aria-level": r.level,
|
|
261
|
+
"aria-setsize": r.setsize,
|
|
262
|
+
"aria-posinset": r.posinset,
|
|
263
|
+
"aria-expanded": Pe(r.item),
|
|
264
|
+
"aria-selected": _.selectionMode === "single" ? String(G(r.item)) : void 0,
|
|
265
|
+
"aria-checked": _.selectionMode === "multiple" ? U.value.get(r.item.value) : void 0,
|
|
266
|
+
"aria-current": Fe(r.item),
|
|
267
|
+
"aria-disabled": r.item.disabled || void 0,
|
|
268
|
+
"aria-busy": T(N).has(r.item.value) || void 0,
|
|
269
|
+
"data-current": r.item.current ? "" : void 0,
|
|
270
|
+
onClick: (e) => Me(r, e)
|
|
271
|
+
}, {
|
|
272
|
+
default: ue(() => [
|
|
273
|
+
g("span", {
|
|
274
|
+
class: "v-tree-toggle",
|
|
275
|
+
"aria-hidden": "true",
|
|
276
|
+
onClick: (e) => Ne(r, e)
|
|
277
|
+
}, [T(N).has(r.item.value) ? (b(), p(i, { key: 0 })) : L(r.item) ? (b(), p(n, {
|
|
278
|
+
key: 1,
|
|
279
|
+
class: "v-tree-chevron",
|
|
280
|
+
name: T(s),
|
|
281
|
+
mirrored: ""
|
|
282
|
+
}, null, 8, ["name"])) : m("", !0)], 8, fe),
|
|
283
|
+
_.selectionMode === "multiple" ? (b(), p(c, { key: 0 })) : m("", !0),
|
|
284
|
+
S(e.$slots, "icon", y({ ref_for: !0 }, $(r)), () => [r.item.icon ? (b(), p(n, y({
|
|
285
|
+
key: 0,
|
|
286
|
+
class: "v-tree-icon"
|
|
287
|
+
}, { ref_for: !0 }, T(t)(r.item.icon)), null, 16)) : m("", !0)]),
|
|
288
|
+
g("span", pe, [S(e.$slots, "label", y({ ref_for: !0 }, $(r)), () => [ne(w(r.item.label), 1)])]),
|
|
289
|
+
T(P).has(r.item.value) ? (b(), h(d, { key: 1 }, [re(n, {
|
|
290
|
+
class: "v-tree-error",
|
|
291
|
+
name: T(l)
|
|
292
|
+
}, null, 8, ["name"]), g("span", me, w(T(j).treeView.loadFailed), 1)], 64)) : m("", !0),
|
|
293
|
+
e.$slots.end ? (b(), h("span", he, [S(e.$slots, "end", y({ ref_for: !0 }, $(r)))])) : m("", !0)
|
|
294
|
+
]),
|
|
295
|
+
_: 2
|
|
296
|
+
}, 1032, [
|
|
297
|
+
"style",
|
|
298
|
+
"href",
|
|
299
|
+
"tabindex",
|
|
300
|
+
"aria-level",
|
|
301
|
+
"aria-setsize",
|
|
302
|
+
"aria-posinset",
|
|
303
|
+
"aria-expanded",
|
|
304
|
+
"aria-selected",
|
|
305
|
+
"aria-checked",
|
|
306
|
+
"aria-current",
|
|
307
|
+
"aria-disabled",
|
|
308
|
+
"aria-busy",
|
|
309
|
+
"data-current",
|
|
310
|
+
"onClick"
|
|
311
|
+
]))]))), 128))], 16, de), g("div", ge, w(T(Se)), 1)], 6));
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
//#endregion
|
|
315
|
+
export { D as default };
|
|
316
|
+
|
|
317
|
+
//# sourceMappingURL=VTreeView.vue_vue_type_script_setup_true_lang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VTreeView.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyGA,IAAM,IAAQ,GAYR,IAAQ,EAA+B,GAAA,YAAkB,GAGzD,IAAW,EAAwB,GAAC,UAAiC,GAErE,KAAO,GAqBP,EAAE,eAAW,eAAW,uBAAmB,EAAa,GACxD,IAAI,EAAY,GAChB,KAAY,QAAmB,EAAM,SAAS,EAAE,MAAM,SAAS,KAAK,GACpE,EAAE,QAAQ,IAAc,iBAAa,EAAiB,GAEtD,IAAS,kBAAgB,IAAI,IAA2B,CAAC,GACzD,IAAU,kBAAgB,IAAI,IAAe,CAAC,GAC9C,IAAS,kBAAgB,IAAI,IAAe,CAAC;EAEnD,SAAS,EAAW,GAAwC;GAC1D,OAAO,EAAK,YAAY,EAAO,IAAI,EAAK,KAAK;EAC/C;EAEA,SAAS,EAAU,GAAyB;GAC1C,OAAO,CAAC,CAAC,EAAM,gBAAgB,CAAC,CAAC,EAAK,QAAQ,CAAC,EAAK,YAAY,CAAC,EAAO,IAAI,EAAK,KAAK;EACxF;EAEA,SAAS,EAAS,GAAyB;GACzC,OAAO,CAAC,CAAC,EAAW,CAAI,CAAC,EAAE,UAAU,EAAU,CAAI;EACrD;EAEA,IAAM,IAAc,QAAe,IAAI,IAAI,EAAS,KAAK,CAAC,GAGpD,IAAU,QAAe;GAC7B,IAAM,IAAmB,CAAC,GACpB,KAAQ,GAAmB,GAAe,MAA4B;IAC1E,EAAM,SAAS,GAAM,MAAU;KAC7B,IAAM,IAAO;MAAE;MAAM;MAAO;MAAQ,UAAU,IAAQ;MAAG,SAAS,EAAM;KAAO;KAC/E,EAAK,KAAK,CAAI;KACd,IAAM,IAAW,EAAW,CAAI;KAChC,AAAI,KAAY,EAAY,MAAM,IAAI,EAAK,KAAK,KAAG,EAAK,GAAU,IAAQ,GAAG,CAAI;IACnF,CAAC;GACH;GAEA,OADA,EAAK,EAAM,OAAO,GAAG,IAAI,GAClB;EACT,CAAC;EAED,SAAS,EAAY,GAAgB,GAAe;GAC9C,MAAS,EAAY,MAAM,IAAI,EAAK,KAAK,MAC7C,EAAS,QAAQ,IACb,CAAC,GAAG,EAAS,OAAO,EAAK,KAAK,IAC9B,EAAS,MAAM,QAAQ,MAAU,MAAU,EAAK,KAAK;EAC3D;EASA,SAAS,EAAkB,GAAoD;GAC7E,IAAM,oBAAS,IAAI,IAA2B,GACxC,KAAS,GAAgB,MAAmC;IAChE,EAAO,IAAI,EAAK,OAAO,OAAO;IAC9B,IAAM,IAAM,KAAa,EAAO,IAAI,EAAK,KAAK,GACxC,IAAW,EAAW,CAAI,GAC5B,IAAoB,IAAM,SAAS;IACvC,IAAI,GAAU,QAAQ;KACpB,IAAM,IAAc,EAAS,KAAK,MAAU,EAAM,GAAO,CAAG,CAAC;KAC7D,IAAQ,EAAY,OAAO,MAAM,MAAM,MAAM,IACzC,SACA,EAAY,OAAO,MAAM,MAAM,OAAO,IACpC,UACA;IACR;IAEA,OADA,EAAO,IAAI,EAAK,OAAO,CAAK,GACrB;GACT;GAEA,OADA,EAAM,MAAM,SAAS,MAAS,EAAM,GAAM,EAAK,CAAC,GACzC;EACT;EAEA,IAAM,IAAe,QAA4B;GAC/C,IAAM,IAAQ,EAAM;GAEpB,OADI,EAAM,kBAAkB,aAAmB,MAAM,QAAQ,CAAK,IAAI,IAAQ,CAAC,IACxE,MAAU,QAAQ,MAAM,QAAQ,CAAK,IAAI,CAAC,IAAI,CAAC,CAAK;EAC7D,CAAC,GAEK,IAAc,QAClB,EAAM,kBAAkB,aACpB,EAAkB,IAAI,IAAI,EAAa,KAAK,CAAC,oBAC7C,IAAI,IAA2B,CACrC;EAGA,SAAS,EAAY,GAAgB,GAA8B;GAEjE,AADA,EAAG,CAAI,GACP,EAAW,CAAI,CAAC,EAAE,SAAS,MAAU;IACnC,AAAK,EAAM,YAAU,EAAY,GAAO,CAAE;GAC5C,CAAC;EACH;EASA,SAAS,GAAY,GAAgB;GACnC,IAAM,IAAS,EAAY,OACrB,oBAAS,IAAI,IAAe;GAClC,EAAO,SAAS,GAAO,MAAU;IAC/B,AAAI,MAAU,UAAQ,EAAO,IAAI,CAAK;GACxC,CAAC;GACD,IAAM,IAAU,EAAa,MAAM,QAAQ,MAAU,CAAC,EAAO,IAAI,CAAK,CAAC,GAEnE,IAAQ;GASZ,IARA,EAAY,EAAK,OAAO,MAAS;IAC/B,AAAI,CAAC,EAAW,CAAI,CAAC,EAAE,UAAU,EAAO,IAAI,EAAK,KAAK,MAAM,WAAQ,IAAQ;GAC9E,CAAC,GAED,EAAY,EAAK,OAAO,MAAS;IAC/B,AAAK,IACK,EAAW,CAAI,CAAC,EAAE,UAAQ,EAAO,IAAI,EAAK,KAAK,IAD7C,EAAO,OAAO,EAAK,KAAK;GAEtC,CAAC,GACG,CAAC,GAAO,KAAK,IAAI,IAAI,EAAK,QAAQ,GAAG,IAAI,EAAE,QAAQ,EAAO,OAAO,EAAE,KAAK,KAAK;GAEjF,IAAM,IAAoB,CAAC;GAI3B,AAHA,EAAkB,CAAM,CAAC,CAAC,SAAS,GAAO,MAAU;IAClD,AAAI,MAAU,UAAQ,EAAK,KAAK,CAAK;GACvC,CAAC,GACD,EAAM,QAAQ,CAAC,GAAG,GAAM,GAAG,CAAO;EACpC;EAEA,SAAS,EAAW,GAAyB;GAC3C,OAAO,EAAM,kBAAkB,YAAY,EAAa,MAAM,OAAO,EAAK;EAC5E;EAIA,SAAS,EAAa,GAAgB;GACpC,IAAM,EAAE,YAAS;GACjB,AAAI,EAAM,kBAAkB,WAAU,EAAM,QAAQ,EAAK,QAChD,EAAM,kBAAkB,aAAY,GAAY,CAAI,IACpD,EAAK,SAAS,KAAA,KAAa,EAAS,CAAI,KAC/C,EAAY,GAAM,CAAC,EAAY,MAAM,IAAI,EAAK,KAAK,CAAC;EACxD;EAEA,SAAS,EAAS,GAAgB,GAAmC;GAEnE,AADA,EAAa,CAAI,GACjB,GAAK,YAAY,EAAK,MAAM,CAAK;EACnC;EAEA,eAAe,GAAK,GAAgB;GAClC,IAAM,IAAS,EAAM;GAChB,OAEL;IADA,EAAQ,IAAI,EAAK,KAAK,GACtB,EAAO,OAAO,EAAK,KAAK;IACxB,IAAI;KACF,EAAO,IAAI,EAAK,OAAO,MAAM,EAAO,CAAI,CAAC;IAC3C,QAAQ;KAGN,AAFA,EAAO,IAAI,EAAK,KAAK,GACrB,EAAY,GAAM,EAAK,GACvB,GAAS,EAAE,MAAM,SAAS,UAAU,EAAK,KAAK,GAAG,EAAK;IACxD,UAAU;KACR,EAAQ,OAAO,EAAK,KAAK;IAC3B;GATwB;EAU1B;EAIA,SAAgB;GAGd,GACE,CAAC,GAAS,CAAW,IACpB,CAAC,GAAM,OAAU;IAChB,KAAK,IAAM,EAAE,aAAU,GACrB,AAAI,EAAK,IAAI,EAAK,KAAK,KAAK,EAAU,CAAI,KAAK,CAAC,EAAQ,IAAI,EAAK,KAAK,KAAG,GAAU,CAAI;GAC3F,GACA,EAAE,WAAW,GAAK,CACpB;EACF,CAAC;EAED,IAAM,IAAS,EAAwB,IAAI,GACrC,oBAAS,IAAI,IAA4B,GACzC,oBAAY,IAAI,QAA4B;EAElD,SAAS,GAAQ,GAAkB,GAA8C;GAC/E,AAAI,aAAc,eAChB,EAAO,IAAI,GAAO,CAAE,GACpB,EAAU,IAAI,GAAI,CAAK,KAClB,EAAO,OAAO,CAAK;EAC5B;EAQA,IAAM,KAAS,EAAqB,IAAI,GAClC,IAAU,QAAsC;GACpD,IAAM,IAAO,EAAQ,OACf,IAAQ,IAAI,IAAI,EAAK,KAAK,MAAS,EAAK,KAAK,KAAK,CAAC;GACzD,KAAK,IAAI,IAAO,GAAO,OAAO,GAAM,IAAO,EAAK,QAC9C,IAAI,EAAM,IAAI,EAAK,KAAK,KAAK,GAAG,OAAO,EAAK,KAAK;GAKnD,SAHE,EAAM,kBAAkB,aACpB,EAAK,MAAM,MAAS,EAAY,MAAM,IAAI,EAAK,KAAK,KAAK,MAAM,MAAM,IACrE,EAAK,MAAM,MAAS,EAAW,EAAK,IAAI,CAAC,MAC3B,EAAK,MAAM,MAAS,EAAK,KAAK,OAAO,KAAK,EAAK,GAAA,EAAK,KAAK;EAC/E,CAAC;EAED,SAAS,GAAU,GAAmB;GACpC,IAAM,IAAQ,EAAU,IAAI,EAAM,MAAiB;GAC/C,MAAU,KAAA,MACd,GAAO,QAAQ,EAAQ,MAAM,MAAM,MAAS,EAAK,KAAK,UAAU,CAAK,KAAK;EAC5E;EAEA,SAAS,EAAS,GAA4B;GAC5C,AAAI,KAAM,EAAO,IAAI,EAAK,KAAK,KAAK,CAAC,EAAE,MAAM;EAC/C;EAEA,IAAM,EAAE,MAAM,OAAc,GAAa;EAKzC,SAAS,GAAO,GAAc,GAAe;GAC3C,IAAM,IAAO,EAAQ;GACrB,EAAS,EAAK,GAAU,GAAM,EAAK,QAAQ,IAAQ,MAAM,GAAc,EAAK,EAAE,CAAE,KAAK,KAAK,CAAC,EAAE;EAC/F;EAGA,SAAS,GAAU,GAAsB;GACvC,IAAM,IAAO,EAAO,OACd,IAAQ,EAAU,IAAI,EAAM,MAAiB;GACnD,IAAI,CAAC,KAAQ,MAAU,KAAA,KAAa,EAAM,UAAU,EAAM,WAAW,EAAM,SAAS;GACpF,IAAM,IAAO,EAAQ,OACf,IAAQ,EAAK,WAAW,MAAS,EAAK,KAAK,UAAU,CAAK,GAC1D,IAAO,EAAK;GAClB,IAAI,CAAC,GAAM;GACX,IAAM,EAAE,YAAS,GACX,IAAS,EAAY,MAAM,IAAI,EAAK,KAAK,GACzC,IAAU,EAAM,CAAI,IAAI,cAAc,cACtC,IAAO,EAAM,CAAI,IAAI,eAAe;GAE1C,QAAQ,EAAM,KAAd;IACE,KAAK;KACH,EAAS,EAAK,IAAQ,EAAE;KACxB;IACF,KAAK;KACH,EAAS,EAAK,IAAQ,EAAE;KACxB;IACF,KAAK;KACH,EAAS,EAAK,EAAE;KAChB;IACF,KAAK;KACH,EAAS,EAAK,GAAG,EAAE,CAAC;KACpB;IACF,KAAK;KACH,IAAI,CAAC,EAAS,CAAI,GAAG;KACrB,AAAK,IAEM,EAAK,IAAQ,EAAE,EAAE,QAAQ,SAAS,KAAM,EAAS,EAAK,IAAQ,EAAE,IADpE,EAAK,YAAU,EAAY,GAAM,EAAI;KAE5C;IACF,KAAK;KACH,AAAI,EAAS,CAAI,KAAK,KAAU,CAAC,EAAK,WAAU,EAAY,GAAM,EAAK,IAClE,EAAS,EAAK,UAAU,KAAA,CAAS;KACtC;IACF,KAAK;KAEH,IAAI,EAAK,SAAS,KAAA,GAAW;KAC7B,AAAK,EAAK,YAAU,EAAS,GAAM,CAAK;KACxC;IACF,KAAK;KAEH,IAAI,EAAK,UAAU;KACnB,AAAI,EAAK,SAAS,KAAA,IACb,EAAS,GAAM,CAAK,IADI,EAAa,CAAI;KAE9C;IACF,KAAK,KAAK;KAER,IAAM,KADW,EAAK,SAAS,EAAW,EAAK,OAAO,IAAI,IAAK,EAAM,MAAA,CAElE,QAAQ,MAAY,CAAC,EAAQ,YAAY,EAAS,CAAO,CAAC,CAAA,CAC1D,KAAK,MAAY,EAAQ,KAAK,CAAA,CAC9B,QAAQ,MAAY,CAAC,EAAY,MAAM,IAAI,CAAO,CAAC;KACtD,AAAI,EAAO,WAAQ,EAAS,QAAQ,CAAC,GAAG,EAAS,OAAO,GAAG,CAAM;KACjE;IACF;IACA;KACE,IAAI,EAAM,IAAI,WAAW,KAAK,EAAM,QAAQ,KAAK;KACjD,GAAO,EAAM,KAAK,CAAK;GAC3B;GACA,EAAM,eAAe;EACvB;EAEA,SAAS,GAAW,GAAgB,GAAmB;GAErD,IAAI,EAAK,KAAK,UAAU;IACtB,EAAM,eAAe;IACrB;GACF;GACA,EAAS,GAAM,CAAK;EACtB;EAGA,SAAS,GAAe,GAAgB,GAAmB;GAGzD,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GAClB,CAAC,EAAK,KAAK,YAAY,EAAS,EAAK,IAAI,KAC3C,EAAY,EAAK,MAAM,CAAC,EAAY,MAAM,IAAI,EAAK,KAAK,KAAK,CAAC;EAClE;EAEA,SAAS,EAAU,GAAmC;GACpD,OAAO;IACL,MAAM,EAAK;IACX,OAAO,EAAK;IACZ,UAAU,EAAY,MAAM,IAAI,EAAK,KAAK,KAAK,KAAK,CAAC,EAAU,EAAK,IAAI;GAC1E;EACF;EAEA,SAAS,GAAa,GAAgB;GACpC,OAAO,EAAS,CAAI,IAAI,OAAO,EAAY,MAAM,IAAI,EAAK,KAAK,CAAC,IAAI,KAAA;EACtE;EAEA,SAAS,GAAY,GAAgB;GAC9B,MAAK,SACV,OAAO,EAAK,SAAS,KAAA,IAAqB,SAAT;EACnC;SAIA,EAAa;GAEX,QAAQ,MACN,EAAQ,UAAU,KAAA,KAAa,EAAO,IAAI,EAAQ,KAAK,CAAC,EAAE,MAAM,CAAO;GAEzE,IAAI;EACN,CAAC,mBAIC,EA+DM,OAAA;GA/DD,OAAK,GAAA,CAAC,eAAsB,EAAA,EAAA,CAAS,CAAA;GAAG,OAAK,GAAE,EAAA,EAAA,CAAS;MAC3D,EA4DK,MA5DL,EA4DK;YA3DC;GAAJ,KAAI;GACJ,OAAM;GACN,MAAK;GACJ,aAAW,EAAA;GACX,wBAAsB,EAAA,kBAAa,cAAmB,KAAA;KAC/C,EAAA,EAAA,GAAc;GACrB,cAAY,EAAA,EAAA;GACH;GACA;eAEV,EAgDK,GAAA,MAAA,GAhDc,EAAA,QAAR,YAAX,EAgDK,MAAA;GAhDwB,KAAK,EAAK,KAAK;GAAO,OAAM;GAAc,MAAK;YAC1E,EA8CY,GA7CL,EAAK,KAAK,SAAS,KAAA,IAAS,QAAA,GAAA,GAAA;;GAChC,MAAM,MAAiD,GAAQ,EAAK,KAAK,OAAO,CAAE;GACnF,OAAM;GACN,MAAK;GACJ,OAAK,GAAA,EAAA,gBAAoB,EAAK,QAAK,EAAA,CAAA;GACnC,MAAM,EAAK,KAAK,WAAW,KAAA,IAAY,EAAK,KAAK;GACjD,UAAU,EAAA,UAAY,EAAK,KAAK,QAAK,IAAA;GACrC,cAAY,EAAK;GACjB,gBAAc,EAAK;GACnB,iBAAe,EAAK;GACpB,iBAAe,GAAa,EAAK,IAAI;GACrC,iBAAe,EAAA,kBAAa,WAAgB,OAAO,EAAW,EAAK,IAAI,CAAA,IAAK,KAAA;GAC5E,gBAA2B,EAAA,kBAAa,aAAkB,EAAA,MAAY,IAAI,EAAK,KAAK,KAAK,IAAI,KAAA;GAG7F,gBAAc,GAAY,EAAK,IAAI;GACnC,iBAAe,EAAK,KAAK,YAAY,KAAA;GACrC,aAAW,EAAA,CAAA,CAAO,CAAC,IAAI,EAAK,KAAK,KAAK,KAAK,KAAA;GAC3C,gBAAc,EAAK,KAAK,UAAO,KAAQ,KAAA;GACvC,UAAK,MAAE,GAAW,GAAM,CAAM;;qBAWxB;IARP,EAQO,QAAA;KARD,OAAM;KAAgB,eAAY;KAAQ,UAAK,MAAE,GAAe,GAAM,CAAM;QAChE,EAAA,CAAA,CAAO,CAAC,IAAI,EAAK,KAAK,KAAK,KAAA,EAAA,GAA3C,EAAgD,GAAA,EAAA,KAAA,EAAA,CAAA,KAEnC,EAAS,EAAK,IAAI,KAAA,EAAA,GAD/B,EAKE,GAAA;;KAHA,OAAM;KACL,MAAM,EAAA,CAAA;KACP,UAAA;;IAGc,EAAA,kBAAa,cAAA,EAAA,GAA/B,EAAkD,GAAA,EAAA,KAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA;IAClD,EAEO,EAAA,QAAA,QAFP,EAEO,EAAA,SAAA,GAAA,GAFmB,EAAU,CAAI,CAAA,SAEjC,CADQ,EAAK,KAAK,QAAA,EAAA,GAAvB,EAAsF,GAAtF,EAAsF;;KAAzD,OAAM;wBAAsB,EAAA,CAAA,CAAS,CAAC,EAAK,KAAK,IAAI,CAAA,GAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA;IAEnF,EAEC,QAFD,IAEC,CADE,EAAwE,EAAA,QAAA,SAAxE,EAAwE,EAAA,SAAA,GAAA,GAA7C,EAAU,CAAI,CAAA,SAA+B,CAAA,GAAA,EAAzB,EAAK,KAAK,KAAK,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA;IAEjD,EAAA,CAAA,CAAM,CAAC,IAAI,EAAK,KAAK,KAAK,KAAA,EAAA,GAA1C,EAGW,GAAA,EAAA,KAAA,EAAA,GAAA,CAFT,GAAgD,GAAA;KAAzC,OAAM;KAAgB,MAAM,EAAA,CAAA;2BACnC,EAAkE,QAAlE,IAAkE,EAA/B,EAAA,CAAA,CAAC,CAAC,SAAS,UAAU,GAAA,CAAA,CAAA,GAAA,EAAA,KAAA,EAAA,IAAA,EAAA;IAE9CA,EAAAA,OAAO,OAAA,EAAA,GAAnB,EAES,QAFT,IAES,CADN,EACD,EAAA,QAAA,OADC,EACD,EAAA,SAAA,GAAA,GAD0B,EAAU,CAAI,CAAA,CAAA,CAAA,CAAA,KAAA,EAAA,IAAA,EAAA;;;;;;;;;;;;;;;;;;4BAKhD,EAAwF,OAAxF,IAAwF,EAArB,EAAA,EAAA,CAAY,GAAA,CAAA,CAAA,GAAA,CAAA"}
|
|
@@ -30,8 +30,8 @@ type __VLS_Slots = {
|
|
|
30
30
|
};
|
|
31
31
|
declare const __VLS_base: import('vue').DefineComponent<TypographyProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<TypographyProps> & Readonly<{}>, {
|
|
32
32
|
variant: TypographyVariant;
|
|
33
|
-
as: string;
|
|
34
33
|
tone: TypographyTone;
|
|
34
|
+
as: string;
|
|
35
35
|
truncate: boolean;
|
|
36
36
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
37
37
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
@layer vectis.reset, vectis.tokens, vectis.components, vectis.utilities;
|
|
2
|
+
@layer vectis.components{.v-virtual-list{overflow-anchor:none;border-radius:var(--vectis-radius-xs);display:block;position:relative;overflow-y:auto}.v-virtual-list:focus-visible{outline:var(--vectis-focus-ring-width) solid var(--vectis-focus-ring-color);outline-offset:var(--vectis-focus-ring-offset)}.v-virtual-list-item{display:flow-root}.v-virtual-list-more{justify-content:center;align-items:center;gap:var(--vectis-space-2);min-block-size:var(--vectis-control-height-md);padding:var(--vectis-space-2);font-size:var(--vectis-text-body-sm-size);font-weight:var(--vectis-text-body-sm-weight);line-height:var(--vectis-text-body-sm-leading);color:var(--vectis-color-text-muted);display:flex}}
|