vectis-ui 0.14.0 → 0.16.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 +0 -6
- package/dist/components/VAccordion/VAccordion.js.map +1 -1
- package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js +3 -8
- package/dist/components/VAccordion/VAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAccordion/VAccordionItem.js.map +1 -1
- package/dist/components/VAccordion/VAccordionItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAccordion/context.js.map +1 -1
- package/dist/components/VAlert/VAlert.js.map +1 -1
- package/dist/components/VAlert/VAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/VAvatar.d.ts +0 -3
- package/dist/components/VAvatar/VAvatar.js.map +1 -1
- package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js +21 -27
- package/dist/components/VAvatar/VAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/VAvatarGroup.d.ts +0 -6
- package/dist/components/VAvatar/VAvatarGroup.js.map +1 -1
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js +5 -19
- package/dist/components/VAvatar/VAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VAvatar/context.d.ts +0 -1
- package/dist/components/VAvatar/context.js.map +1 -1
- package/dist/components/VBadge/VBadge.js.map +1 -1
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VBadge/VBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VBreadcrumb/VBreadcrumb.js.map +1 -1
- package/dist/components/VBreadcrumb/VBreadcrumb.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/VButton.d.ts +0 -6
- package/dist/components/VButton/VButton.js.map +1 -1
- package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js +11 -17
- package/dist/components/VButton/VButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/VButtonGroup.d.ts +0 -6
- package/dist/components/VButton/VButtonGroup.js.map +1 -1
- package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js +0 -7
- package/dist/components/VButton/VButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VButton/context.d.ts +0 -2
- package/dist/components/VButton/context.js.map +1 -1
- package/dist/components/VCalendar/VCalendar.js.map +1 -1
- package/dist/components/VCalendar/VCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarEvent.js.map +1 -1
- package/dist/components/VCalendar/VCalendarEvent.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarMonth.js.map +1 -1
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js +5 -17
- package/dist/components/VCalendar/VCalendarMonth.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.js.map +1 -1
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js +19 -31
- package/dist/components/VCalendar/VCalendarTimeGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/VCalendarYear.js.map +1 -1
- package/dist/components/VCalendar/VCalendarYear.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCalendar/color.js.map +1 -1
- package/dist/components/VCalendar/edgeStep.js +1 -5
- package/dist/components/VCalendar/edgeStep.js.map +1 -1
- package/dist/components/VCalendar/gesture.js +4 -12
- package/dist/components/VCalendar/gesture.js.map +1 -1
- package/dist/components/VCalendar/keyboard.js.map +1 -1
- package/dist/components/VCalendar/layout.js +8 -12
- package/dist/components/VCalendar/layout.js.map +1 -1
- package/dist/components/VCalendar/timeGrid.js +5 -5
- package/dist/components/VCalendar/timeGrid.js.map +1 -1
- package/dist/components/VCard/VCard.js.map +1 -1
- package/dist/components/VCard/VCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/VCarousel.js.map +1 -1
- package/dist/components/VCarousel/VCarousel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/VCarouselItem.js.map +1 -1
- package/dist/components/VCarousel/VCarouselItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCarousel/context.js.map +1 -1
- package/dist/components/VCheckbox/VCheckMark.js.map +1 -1
- package/dist/components/VCheckbox/VCheckMark.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCheckbox/VCheckbox.js.map +1 -1
- package/dist/components/VCheckbox/VCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VChip/VChip.d.ts +0 -3
- package/dist/components/VChip/VChip.js.map +1 -1
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VChip/VChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorInput/VColorInput.d.ts +0 -3
- package/dist/components/VColorInput/VColorInput.js.map +1 -1
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js +3 -9
- package/dist/components/VColorInput/VColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorPicker/VColorPicker.js.map +1 -1
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VColorPicker/VColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VColorPicker/color.js.map +1 -1
- package/dist/components/VCombobox/VCombobox.d.ts +0 -3
- package/dist/components/VCombobox/VCombobox.js.map +1 -1
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js +100 -119
- package/dist/components/VCombobox/VCombobox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js +0 -1
- package/dist/components/VCommandPalette/VCommandPalette.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPaletteItem.js.map +1 -1
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VCommandPalette/VCommandPaletteItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VContextMenu/VContextMenu.d.ts +0 -3
- package/dist/components/VContextMenu/VContextMenu.js.map +1 -1
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js +3 -11
- package/dist/components/VContextMenu/VContextMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDataTable/VDataTable.css +1 -1
- package/dist/components/VDataTable/VDataTable.d.ts +0 -2
- package/dist/components/VDataTable/VDataTable.js.map +1 -1
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js +69 -88
- package/dist/components/VDataTable/VDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.d.ts +0 -3
- package/dist/components/VDateInput/VDateInput.js.map +1 -1
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js +5 -10
- package/dist/components/VDateInput/VDateInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDateInput/mask.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.js.map +1 -1
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/VDatePicker/VDatePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDatePicker/keyboard.js.map +1 -1
- package/dist/components/VDatePicker/names.js.map +1 -1
- package/dist/components/VDialog/VDialog.js.map +1 -1
- package/dist/components/VDialog/VDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDialog/VDialogAlert.js.map +1 -1
- package/dist/components/VDialog/VDialogAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VDrawer/VDrawer.js.map +1 -1
- package/dist/components/VDrawer/VDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VEmptyState/VEmptyState.js.map +1 -1
- package/dist/components/VEmptyState/VEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VField.js.map +1 -1
- package/dist/components/VField/VField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VFieldAnnouncer.js.map +1 -1
- package/dist/components/VField/VFieldAnnouncer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VField/VFieldMessage.js.map +1 -1
- package/dist/components/VField/VFieldMessage.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFieldset/VFieldset.js.map +1 -1
- package/dist/components/VFieldset/VFieldset.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFileInput/VFileInput.d.ts +0 -5
- package/dist/components/VFileInput/VFileInput.js.map +1 -1
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js +54 -65
- package/dist/components/VFileInput/VFileInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFileInput/truncate.js.map +1 -1
- package/dist/components/VFilePicker/VFilePicker.js.map +1 -1
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VFilePicker/VFilePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VFilePicker/fileKind.js.map +1 -1
- package/dist/components/VHotkeys/VHotkeys.d.ts +0 -3
- package/dist/components/VHotkeys/VHotkeys.js.map +1 -1
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VHotkeys/VHotkeys.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VHotkeys/platform.js +1 -1
- package/dist/components/VHotkeys/platform.js.map +1 -1
- package/dist/components/VHoverCard/VHoverCard.js.map +1 -1
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js +2 -12
- package/dist/components/VHoverCard/VHoverCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VIcon/VIcon.js.map +1 -1
- package/dist/components/VIcon/VIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VIcon/iconProps.js.map +1 -1
- package/dist/components/VIcon/icons/add.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_downward.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_downward_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_drop_down.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_drop_up.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_left_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_right_alt.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_upward.js.map +1 -1
- package/dist/components/VIcon/icons/arrow_upward_alt.js.map +1 -1
- package/dist/components/VIcon/icons/attach_file.js.map +1 -1
- package/dist/components/VIcon/icons/audio_file.js.map +1 -1
- package/dist/components/VIcon/icons/calendar_today.js.map +1 -1
- package/dist/components/VIcon/icons/check.js.map +1 -1
- package/dist/components/VIcon/icons/check_circle.js.map +1 -1
- package/dist/components/VIcon/icons/chevron_left.js.map +1 -1
- package/dist/components/VIcon/icons/chevron_right.js.map +1 -1
- package/dist/components/VIcon/icons/close.js.map +1 -1
- package/dist/components/VIcon/icons/cloud_upload.js.map +1 -1
- package/dist/components/VIcon/icons/code.js.map +1 -1
- package/dist/components/VIcon/icons/colorize.js.map +1 -1
- package/dist/components/VIcon/icons/description.js.map +1 -1
- package/dist/components/VIcon/icons/error.js.map +1 -1
- package/dist/components/VIcon/icons/expand_less.js.map +1 -1
- package/dist/components/VIcon/icons/expand_more.js.map +1 -1
- package/dist/components/VIcon/icons/first_page.js.map +1 -1
- package/dist/components/VIcon/icons/folder_zip.js.map +1 -1
- package/dist/components/VIcon/icons/image.js.map +1 -1
- package/dist/components/VIcon/icons/inbox.js.map +1 -1
- package/dist/components/VIcon/icons/index.js.map +1 -1
- package/dist/components/VIcon/icons/info.js.map +1 -1
- package/dist/components/VIcon/icons/last_page.js.map +1 -1
- package/dist/components/VIcon/icons/more_horiz.js.map +1 -1
- package/dist/components/VIcon/icons/names.js.map +1 -1
- package/dist/components/VIcon/icons/notifications.js.map +1 -1
- package/dist/components/VIcon/icons/open_in_new.js.map +1 -1
- package/dist/components/VIcon/icons/picture_as_pdf.js.map +1 -1
- package/dist/components/VIcon/icons/priority_high.js.map +1 -1
- package/dist/components/VIcon/icons/remove.js.map +1 -1
- package/dist/components/VIcon/icons/schedule.js.map +1 -1
- package/dist/components/VIcon/icons/search.js.map +1 -1
- package/dist/components/VIcon/icons/search_off.js.map +1 -1
- package/dist/components/VIcon/icons/star.js.map +1 -1
- package/dist/components/VIcon/icons/swap_vert.js.map +1 -1
- package/dist/components/VIcon/icons/table_chart.js.map +1 -1
- package/dist/components/VIcon/icons/video_file.js.map +1 -1
- package/dist/components/VIcon/icons/viewBox.js.map +1 -1
- package/dist/components/VIcon/icons/warning.js.map +1 -1
- package/dist/components/VIcon/resolver.js.map +1 -1
- package/dist/components/VIconButton/VIconButton.d.ts +0 -3
- package/dist/components/VIconButton/VIconButton.js.map +1 -1
- package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VIconButton/VIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/VInput.css +1 -1
- package/dist/components/VInput/VInput.d.ts +0 -3
- package/dist/components/VInput/VInput.js.map +1 -1
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js +2 -8
- package/dist/components/VInput/VInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/VInputGroup.d.ts +0 -3
- package/dist/components/VInput/VInputGroup.js.map +1 -1
- package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js +0 -7
- package/dist/components/VInput/VInputGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VInput/context.d.ts +0 -2
- package/dist/components/VInput/context.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.d.ts +0 -3
- package/dist/components/VInputOTP/VInputOTP.js.map +1 -1
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js +2 -14
- package/dist/components/VInputOTP/VInputOTP.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VLink/VLink.js.map +1 -1
- package/dist/components/VLink/VLink.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxChevron.js.map +1 -1
- package/dist/components/VListbox/VListboxChevron.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxGroup.js.map +1 -1
- package/dist/components/VListbox/VListboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxOption.js.map +1 -1
- package/dist/components/VListbox/VListboxOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxPanel.d.ts +0 -3
- package/dist/components/VListbox/VListboxPanel.js.map +1 -1
- package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VListbox/VListboxPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxSeparator.js.map +1 -1
- package/dist/components/VListbox/VListboxSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VListbox/VListboxValues.js.map +1 -1
- package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js +4 -14
- package/dist/components/VListbox/VListboxValues.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenu.d.ts +0 -3
- package/dist/components/VMenu/VMenu.js.map +1 -1
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VMenu/VMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuGroup.js.map +1 -1
- package/dist/components/VMenu/VMenuGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuItem.js.map +1 -1
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js +6 -12
- package/dist/components/VMenu/VMenuItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuPanel.d.ts +0 -3
- package/dist/components/VMenu/VMenuPanel.js.map +1 -1
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js +9 -16
- package/dist/components/VMenu/VMenuPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/VMenuSeparator.js.map +1 -1
- package/dist/components/VMenu/VMenuSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VMenu/context.js.map +1 -1
- package/dist/components/VMeter/VMeter.js.map +1 -1
- package/dist/components/VMeter/VMeter.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VNumberInput/VNumberInput.d.ts +0 -3
- package/dist/components/VNumberInput/VNumberInput.js.map +1 -1
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js +85 -90
- package/dist/components/VNumberInput/VNumberInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VNumberInput/number.js.map +1 -1
- package/dist/components/VPagination/VPagination.d.ts +0 -3
- package/dist/components/VPagination/VPagination.js.map +1 -1
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VPagination/VPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VPopover/VPopover.js.map +1 -1
- package/dist/components/VPopover/VPopover.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VProgressCircular/VProgressCircular.js.map +1 -1
- package/dist/components/VProgressCircular/VProgressCircular.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/dist/components/VProgressLinear/VProgressLinear.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRadio/VRadio.js.map +1 -1
- package/dist/components/VRadio/VRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VRating/VRating.js.map +1 -1
- package/dist/components/VRating/VRating.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/VResizable.js.map +1 -1
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js +8 -6
- package/dist/components/VResizable/VResizable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/VResizablePanel.js.map +1 -1
- package/dist/components/VResizable/VResizablePanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VResizable/context.js.map +1 -1
- package/dist/components/VResizable/layout.js.map +1 -1
- package/dist/components/VSelect/VSelect.d.ts +0 -3
- package/dist/components/VSelect/VSelect.js.map +1 -1
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js +80 -90
- package/dist/components/VSelect/VSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSeparator/VSeparator.js.map +1 -1
- package/dist/components/VSeparator/VSeparator.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigation.d.ts +0 -6
- package/dist/components/VSideNavigation/VSideNavigation.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js +2 -11
- package/dist/components/VSideNavigation/VSideNavigation.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationGroup.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationItem.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VSideNavigation/VSideNavigationItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSideNavigation/VSideNavigationSeparator.js.map +1 -1
- package/dist/components/VSideNavigation/context.js.map +1 -1
- package/dist/components/VSkeletonLoader/VSkeletonLoader.d.ts +0 -3
- package/dist/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
- package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VSkeletonLoader/VSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSlider/VSlider.js.map +1 -1
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js +107 -112
- package/dist/components/VSlider/VSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSnackbar/VSnackbar.js.map +1 -1
- package/dist/components/VSnackbar/VSnackbar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSnackbar/state.js.map +1 -1
- package/dist/components/VSpinner/VSpinner.js.map +1 -1
- package/dist/components/VSpinner/VSpinner.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSplitButton/VSplitButton.d.ts +0 -3
- package/dist/components/VSplitButton/VSplitButton.js.map +1 -1
- package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VSplitButton/VSplitButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VStepper/VStepper.js.map +1 -1
- package/dist/components/VStepper/VStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VSwitch/VSwitch.js.map +1 -1
- package/dist/components/VSwitch/VSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTab.js.map +1 -1
- package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js +0 -2
- package/dist/components/VTabs/VTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTabPanel.js.map +1 -1
- package/dist/components/VTabs/VTabPanel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/VTabs.css +1 -1
- package/dist/components/VTabs/VTabs.d.ts +0 -3
- package/dist/components/VTabs/VTabs.js.map +1 -1
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js +2 -15
- package/dist/components/VTabs/VTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTabs/context.d.ts +0 -2
- package/dist/components/VTabs/context.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.d.ts +0 -6
- package/dist/components/VTextarea/VTextarea.js.map +1 -1
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js +0 -6
- package/dist/components/VTextarea/VTextarea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.d.ts +0 -3
- package/dist/components/VTimeInput/VTimeInput.js.map +1 -1
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js +197 -204
- package/dist/components/VTimeInput/VTimeInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeInput/search.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.js.map +1 -1
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/components/VTimePicker/VTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimePicker/limits.js.map +1 -1
- package/dist/components/VTimeline/VTimeline.js.map +1 -1
- package/dist/components/VTimeline/VTimeline.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeline/VTimelineItem.js.map +1 -1
- package/dist/components/VTimeline/VTimelineItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTimeline/context.js.map +1 -1
- package/dist/components/VTimeline/datetime.js.map +1 -1
- package/dist/components/VToast/VToast.js.map +1 -1
- package/dist/components/VToast/VToast.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToast/VToaster.js.map +1 -1
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/VToast/VToaster.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToast/state.js.map +1 -1
- package/dist/components/VToggle/VToggle.d.ts +0 -3
- package/dist/components/VToggle/VToggle.js.map +1 -1
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js +1 -13
- package/dist/components/VToggle/VToggle.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToggle/VToggleItem.js.map +1 -1
- package/dist/components/VToggle/VToggleItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VToggle/context.js.map +1 -1
- package/dist/components/VTooltip/VTooltip.js.map +1 -1
- package/dist/components/VTooltip/VTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTreeView/VTreeView.js.map +1 -1
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js +1 -5
- package/dist/components/VTreeView/VTreeView.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VTypography/VTypography.js.map +1 -1
- package/dist/components/VTypography/VTypography.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/VVirtualList/VVirtualList.js.map +1 -1
- package/dist/components/VVirtualList/VVirtualList.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/composables/useAriaLabel.js.map +1 -1
- package/dist/composables/useChoice.js.map +1 -1
- package/dist/composables/useClearable.js.map +1 -1
- package/dist/composables/useControlShape.d.ts +1 -5
- package/dist/composables/useControlShape.js +0 -1
- package/dist/composables/useControlShape.js.map +1 -1
- package/dist/composables/useDebouncedSearch.js.map +1 -1
- package/dist/composables/useDetailsOpen.js.map +1 -1
- package/dist/composables/useEscapeDismiss.js.map +1 -1
- package/dist/composables/useFieldIds.js.map +1 -1
- package/dist/composables/useFieldPanel.js +3 -7
- package/dist/composables/useFieldPanel.js.map +1 -1
- package/dist/composables/useFileDrop.js.map +1 -1
- package/dist/composables/useFileField.js +2 -2
- package/dist/composables/useFileField.js.map +1 -1
- package/dist/composables/useFocusoutDismiss.js.map +1 -1
- package/dist/composables/useHotkeyListener.js.map +1 -1
- package/dist/composables/useIconClickHandlers.js.map +1 -1
- package/dist/composables/useInertLink.js.map +1 -1
- package/dist/composables/useInfiniteScroll.js +2 -2
- package/dist/composables/useInfiniteScroll.js.map +1 -1
- package/dist/composables/useListbox.d.ts +0 -1
- package/dist/composables/useListbox.js +4 -10
- package/dist/composables/useListbox.js.map +1 -1
- package/dist/composables/useLiveAnnouncer.js.map +1 -1
- package/dist/composables/useMaskedField.js +28 -48
- package/dist/composables/useMaskedField.js.map +1 -1
- package/dist/composables/useModalDialog.js +1 -1
- package/dist/composables/useModalDialog.js.map +1 -1
- package/dist/composables/usePopover.js +1 -1
- package/dist/composables/usePopover.js.map +1 -1
- package/dist/composables/useProgressValue.js.map +1 -1
- package/dist/composables/useRootAttrs.js.map +1 -1
- package/dist/composables/useSlotNodes.js.map +1 -1
- package/dist/composables/useTextLimit.js.map +1 -1
- package/dist/composables/useTimer.js.map +1 -1
- package/dist/composables/useTypeahead.js.map +1 -1
- package/dist/composables/useVirtualList.js.map +1 -1
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/fr.js.map +1 -1
- package/dist/i18n/state.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tokens/css.js.map +1 -1
- package/dist/tokens/index.d.ts +3 -0
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/primitives.js.map +1 -1
- package/dist/tokens/semantic.d.ts +3 -0
- package/dist/tokens/semantic.js +6 -5
- package/dist/tokens/semantic.js.map +1 -1
- package/dist/tokens/themes/dark.js.map +1 -1
- package/dist/tokens/types.js.map +1 -1
- package/dist/tokens.json +12 -5
- package/dist/types.d.ts +0 -2
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/arrowNav.js.map +1 -1
- package/dist/utils/attrs.js.map +1 -1
- package/dist/utils/chip.d.ts +4 -6
- package/dist/utils/chip.js +8 -5
- package/dist/utils/chip.js.map +1 -1
- package/dist/utils/clock.js +3 -1
- package/dist/utils/clock.js.map +1 -1
- package/dist/utils/css.js +1 -1
- package/dist/utils/css.js.map +1 -1
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/direction.js.map +1 -1
- package/dist/utils/env.js.map +1 -1
- package/dist/utils/file.js +13 -31
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/focus.js.map +1 -1
- package/dist/utils/hostWarns.js.map +1 -1
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/matcher.js.map +1 -1
- package/dist/utils/memo.js.map +1 -1
- package/dist/utils/number.js.map +1 -1
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/vnode.js.map +1 -1
- package/package.json +19 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","names":[],"sources":["../../../src/components/VHotkeys/platform.ts"],"sourcesContent":["// @core\n// Shortcut parsing and platform glyphs are pure; read navigator only after mount to preserve\n// deterministic SSR output.\n/**\n * Detecting the platform must only ever be done once a component is mounted. There is nothing\n * to read it from on a server, and sniffing a request header is not this library's business.\n */\n\nimport { isDev } from '../../utils/env'\n\n/** The system a keyboard belongs to, which decides its symbols and some of its words. */\nexport type HotkeysPlatform = 'mac' | 'windows' | 'linux' | 'other'\n\n/**\n * The dictionary entries naming a key, and only those: the sentence framing the shortcut is not\n * one of them.\n */\nexport type HotkeysWord =\n | 'command'\n | 'ctrl'\n | 'alt'\n | 'shift'\n | 'windows'\n | 'super'\n | 'enter'\n | 'escape'\n | 'space'\n | 'backspace'\n | 'delete'\n | 'tab'\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n\n/** One key of a shortcut, once resolved for a given platform. */\nexport interface ResolvedKey {\n /** Its canonical name, which the matcher compares a key press against. */\n token: string\n /** The symbol engraved on that key, where the system engraves one. */\n glyph?: string\n /**\n * Which dictionary entry names it. Nothing here means the design system does not\n * know this key, and it is printed as it was written.\n */\n word?: HotkeysWord\n}\n\n// @ssr\n/** What a SERVER renders, and therefore what the browser's first render must be as well. */\nexport const DEFAULT_PLATFORM: HotkeysPlatform = 'other'\n\n// @ssr @fallback\n/** Works out which system the keyboard belongs to, from two sources in order. */\nexport function detectPlatform(): HotkeysPlatform {\n if (typeof navigator === 'undefined') return DEFAULT_PLATFORM\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } }\n const source = (nav.userAgentData?.platform || nav.platform || '').toLowerCase()\n /*\n * IPadOS reports itself as a Mac, which is fine here: an attached keyboard carries the same\n * modifier symbols either way.\n */\n if (/mac|iphone|ipad|ipod/.test(source)) return 'mac'\n if (source.includes('win')) return 'windows'\n /* ChromeOS spells itself two different ways depending on which of the two sources\n answered. Both have to be listed, or the branch is dead precisely where it\n matters. */\n if (/linux|android|cros|chrome os/.test(source)) return 'linux'\n return DEFAULT_PLATFORM\n}\n\n/*\n * Serving both is what guarantees the two can never disagree. The `+` key is canonically named\n * `plus`, since `+` is the separator and cannot name itself in the prop; but the browser does\n * report it as `'+'`, hence its presence here.\n */\nconst ALIASES: Record<string, string> = {\n cmd: 'meta',\n command: 'meta',\n win: 'meta',\n windows: 'meta',\n super: 'meta',\n os: 'meta',\n cmdorctrl: 'mod',\n commandorcontrol: 'mod',\n control: 'ctrl',\n option: 'alt',\n opt: 'alt',\n return: 'enter',\n escape: 'esc',\n spacebar: 'space',\n ' ': 'space',\n del: 'delete',\n arrowup: 'up',\n arrowdown: 'down',\n arrowleft: 'left',\n arrowright: 'right',\n '+': 'plus',\n}\n\n/* The symbols engraved on an Apple keyboard, and on no other. Escape and the space bar\n are deliberately absent: the Mac key really does read \"esc\", and the space bar\n carries no symbol at all. */\nconst MAC_GLYPHS: Record<string, string> = {\n mod: '⌘',\n meta: '⌘',\n ctrl: '⌃',\n alt: '⌥',\n shift: '⇧',\n enter: '↵',\n backspace: '⌫',\n delete: '⌦',\n tab: '⇥',\n}\n\n/* Symbols that are the same everywhere: an arrow key is engraved with an arrow on\n every keyboard ever made. */\nconst GLYPHS: Record<string, string> = {\n up: '↑',\n down: '↓',\n left: '←',\n right: '→',\n plus: '+',\n}\n\nconst WORDS: Record<string, HotkeysWord> = {\n ctrl: 'ctrl',\n alt: 'alt',\n shift: 'shift',\n enter: 'enter',\n esc: 'escape',\n space: 'space',\n backspace: 'backspace',\n delete: 'delete',\n tab: 'tab',\n up: 'up',\n down: 'down',\n left: 'left',\n right: 'right',\n}\n\nconst MODIFIERS = new Set(['mod', 'meta', 'ctrl', 'alt', 'shift'])\n\n/**\n * The kinds of field one cannot type prose into. A shortcut stays live over a\n * checkbox, a button or a colour picker: there is no sentence to interrupt there.\n */\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'file',\n 'range',\n 'color',\n 'image',\n])\n\n/**\n * Reads a combination as it was written and returns its keys in canonical form: `'mod+k'` and\n * `' Mod + K '` both give the same two.\n */\nexport function parseHotkeys(keys: string): string[] {\n const tokens = keys\n .split('+')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean)\n .map((token) => ALIASES[token] ?? token)\n if (isDev) {\n const pressed = tokens.filter((token) => !isModifier(token)).length\n if (tokens.length === 0) {\n console.warn(`[VHotkeys] \\`keys\\` is empty: \"${keys}\" declares no key.`)\n } else if (pressed === 0) {\n /* `ctrl++` reads as Ctrl and the + key, but the second + is a separator: the key\n itself is written `plus`. */\n console.warn(\n `[VHotkeys] \\`keys\\` holds only modifiers: \"${keys}\" never fires. The + key is written \\`plus\\`.`,\n )\n } else if (pressed > 1) {\n /* A shortcut is modifiers and ONE key: `g+h` is not a sequence, and only its first\n key would ever be matched. */\n console.warn(\n `[VHotkeys] \\`keys\\` names more than one key: \"${keys}\" is matched on the first alone.`,\n )\n }\n }\n return tokens\n}\n\n/** Whether this key is one that is held down rather than pressed. */\nfunction isModifier(token: string): boolean {\n return MODIFIERS.has(token)\n}\n\n/**\n * How a key nobody has a word or a symbol for is printed: as it was written, merely\n * capitalized: `k` becomes K, `f5` becomes F5, and a slash stays a slash.\n */\nexport function capLabel(token: string): string {\n return token.charAt(0).toUpperCase() + token.slice(1)\n}\n\nfunction wordOf(token: string, platform: HotkeysPlatform): HotkeysWord | undefined {\n /*\n * The two keys whose name depends on the system. `mod` is the modifier a consumer writes when\n * they mean \"the usual one here\"; Command on a Mac, Ctrl elsewhere; while `meta` names that\n * physical key literally, and it is called something different on each system.\n */\n if (token === 'mod') return platform === 'mac' ? 'command' : 'ctrl'\n if (token === 'meta') {\n if (platform === 'mac') return 'command'\n return platform === 'windows' ? 'windows' : 'super'\n }\n return WORDS[token]\n}\n\n/**\n * Resolves each key of a combination for a given system, attaching the symbol engraved\n * on it and the dictionary entry naming it, where either exists.\n */\nexport function resolveKeys(tokens: string[], platform: HotkeysPlatform): ResolvedKey[] {\n /* A modifier named twice is one key held down: `ctrl+ctrl+k`, or `mod+ctrl+k` away from a\n Mac, where `mod` IS Ctrl. Drawn twice it would read as a chord of two keys. */\n const held = new Set<string>()\n const once = tokens.filter((token) => {\n if (!isModifier(token)) return true\n const key = token === 'mod' ? (platform === 'mac' ? 'meta' : 'ctrl') : token\n if (held.has(key)) return false\n held.add(key)\n return true\n })\n return once.map((token) => ({\n token,\n glyph: (platform === 'mac' ? MAC_GLYPHS[token] : undefined) ?? GLYPHS[token],\n word: wordOf(token, platform),\n }))\n}\n\n/* The key names `aria-keyshortcuts` expects, which are those of `KeyboardEvent.key`. */\nconst ARIA_KEYS: Record<string, string> = {\n meta: 'Meta',\n ctrl: 'Control',\n alt: 'Alt',\n shift: 'Shift',\n enter: 'Enter',\n esc: 'Escape',\n space: 'Space',\n backspace: 'Backspace',\n delete: 'Delete',\n tab: 'Tab',\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n}\n\n// @a11y\n/** Spells a combination as the `aria-keyshortcuts` attribute does: `Control+K`, `Meta+K`. */\nexport function ariaKeyshortcuts(tokens: string[], platform: HotkeysPlatform): string {\n return resolveKeys(tokens, platform)\n .map(({ token }) =>\n token === 'mod'\n ? platform === 'mac'\n ? 'Meta'\n : 'Control'\n : (ARIA_KEYS[token] ?? capLabel(token)),\n )\n .join('+')\n}\n\nfunction normalizeEventKey(event: KeyboardEvent): string {\n const key = event.key.toLowerCase()\n return ALIASES[key] ?? key\n}\n\n/** Whether a key press IS this combination. */\nexport function matchesEvent(\n event: KeyboardEvent,\n tokens: string[],\n platform: HotkeysPlatform,\n): boolean {\n const wantCtrl = tokens.includes('ctrl') || (platform !== 'mac' && tokens.includes('mod'))\n const wantMeta = tokens.includes('meta') || (platform === 'mac' && tokens.includes('mod'))\n if (event.ctrlKey !== wantCtrl) return false\n if (event.metaKey !== wantMeta) return false\n if (event.altKey !== tokens.includes('alt')) return false\n if (event.shiftKey !== tokens.includes('shift')) return false\n const main = tokens.find((token) => !isModifier(token))\n /* A combination made of modifiers alone never fires: there is no key to press. */\n if (main === undefined) return false\n /*\n * Both sides go through the same normalization, which is also what makes a press reported as\n * \"K\"; because Shift was held; match a shortcut written `k`.\n */\n return normalizeEventKey(event) === main\n}\n\n// @keyboard\nexport function isEditableTarget(target: EventTarget | null | undefined): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n const tag = target.tagName\n if (tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (tag !== 'INPUT') return false\n return !NON_TEXT_INPUT_TYPES.has((target as HTMLInputElement).type)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform.js","names":["DEFAULT_PLATFORM","detectPlatform","nav","source","ALIASES","MAC_GLYPHS","GLYPHS","WORDS","MODIFIERS","NON_TEXT_INPUT_TYPES","parseHotkeys","tokens","keys","token","isDev","pressed","isModifier","capLabel","wordOf","platform","resolveKeys","held","key","ARIA_KEYS","ariaKeyshortcuts","normalizeEventKey","event","matchesEvent","wantCtrl","wantMeta","main","isEditableTarget","target","tag"],"sources":["../../../src/components/VHotkeys/platform.ts"],"sourcesContent":["// @core\n// Shortcut parsing and platform glyphs are pure; read navigator only after mount to preserve\n// deterministic SSR output.\n/**\n * Detecting the platform must only ever be done once a component is mounted. There is nothing\n * to read it from on a server, and sniffing a request header is not this library's business.\n */\n\nimport { isDev } from '../../utils/env'\n\n/** The system a keyboard belongs to, which decides its symbols and some of its words. */\nexport type HotkeysPlatform = 'mac' | 'windows' | 'linux' | 'other'\n\n/**\n * The dictionary entries naming a key, and only those: the sentence framing the shortcut is not\n * one of them.\n */\nexport type HotkeysWord =\n | 'command'\n | 'ctrl'\n | 'alt'\n | 'shift'\n | 'windows'\n | 'super'\n | 'enter'\n | 'escape'\n | 'space'\n | 'backspace'\n | 'delete'\n | 'tab'\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n\n/** One key of a shortcut, once resolved for a given platform. */\nexport interface ResolvedKey {\n /** Its canonical name, which the matcher compares a key press against. */\n token: string\n /** The symbol engraved on that key, where the system engraves one. */\n glyph?: string\n /**\n * Which dictionary entry names it. Nothing here means the design system does not\n * know this key, and it is printed as it was written.\n */\n word?: HotkeysWord\n}\n\n// @ssr\n/** What a SERVER renders, and therefore what the browser's first render must be as well. */\nexport const DEFAULT_PLATFORM: HotkeysPlatform = 'other'\n\n// @ssr @fallback\n/** Works out which system the keyboard belongs to, from two sources in order. */\nexport function detectPlatform(): HotkeysPlatform {\n if (typeof navigator === 'undefined') return DEFAULT_PLATFORM\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } }\n const source = (nav.userAgentData?.platform || nav.platform || '').toLowerCase()\n /*\n * IPadOS reports itself as a Mac, which is fine here: an attached keyboard carries the same\n * modifier symbols either way.\n */\n if (/mac|iphone|ipad|ipod/.test(source)) return 'mac'\n if (source.includes('win')) return 'windows'\n /* ChromeOS spells itself two different ways depending on which of the two sources\n answered. Both have to be listed, or the branch is dead precisely where it\n matters. */\n if (/linux|android|cros|chrome os/.test(source)) return 'linux'\n return DEFAULT_PLATFORM\n}\n\n/*\n * Serving both is what guarantees the two can never disagree. The `+` key is canonically named\n * `plus`, since `+` is the separator and cannot name itself in the prop; but the browser does\n * report it as `'+'`, hence its presence here.\n */\nconst ALIASES: Record<string, string> = {\n cmd: 'meta',\n command: 'meta',\n win: 'meta',\n windows: 'meta',\n super: 'meta',\n os: 'meta',\n cmdorctrl: 'mod',\n commandorcontrol: 'mod',\n control: 'ctrl',\n option: 'alt',\n opt: 'alt',\n return: 'enter',\n escape: 'esc',\n spacebar: 'space',\n ' ': 'space',\n del: 'delete',\n arrowup: 'up',\n arrowdown: 'down',\n arrowleft: 'left',\n arrowright: 'right',\n '+': 'plus',\n}\n\n/* The symbols engraved on an Apple keyboard, and on no other. Escape and the space bar\n are deliberately absent: the Mac key really does read \"esc\", and the space bar\n carries no symbol at all. */\nconst MAC_GLYPHS: Record<string, string> = {\n mod: '⌘',\n meta: '⌘',\n ctrl: '⌃',\n alt: '⌥',\n shift: '⇧',\n enter: '↵',\n backspace: '⌫',\n delete: '⌦',\n tab: '⇥',\n}\n\n/* Symbols that are the same everywhere: an arrow key is engraved with an arrow on\n every keyboard ever made. */\nconst GLYPHS: Record<string, string> = {\n up: '↑',\n down: '↓',\n left: '←',\n right: '→',\n plus: '+',\n}\n\nconst WORDS: Record<string, HotkeysWord> = {\n ctrl: 'ctrl',\n alt: 'alt',\n shift: 'shift',\n enter: 'enter',\n esc: 'escape',\n space: 'space',\n backspace: 'backspace',\n delete: 'delete',\n tab: 'tab',\n up: 'up',\n down: 'down',\n left: 'left',\n right: 'right',\n}\n\nconst MODIFIERS = new Set(['mod', 'meta', 'ctrl', 'alt', 'shift'])\n\n/**\n * The kinds of field one cannot type prose into. A shortcut stays live over a\n * checkbox, a button or a colour picker: there is no sentence to interrupt there.\n */\nconst NON_TEXT_INPUT_TYPES = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'file',\n 'range',\n 'color',\n 'image',\n])\n\n/**\n * Reads a combination as it was written and returns its keys in canonical form: `'mod+k'` and\n * `' Mod + K '` both give the same two.\n */\nexport function parseHotkeys(keys: string): string[] {\n const tokens = keys\n .split('+')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean)\n .map((token) => ALIASES[token] ?? token)\n if (isDev) {\n const pressed = tokens.filter((token) => !isModifier(token)).length\n if (tokens.length === 0) {\n console.warn(`[VHotkeys] \\`keys\\` is empty: \"${keys}\" declares no key.`)\n } else if (pressed === 0) {\n /* `ctrl++` reads as Ctrl and the + key, but the second + is a separator: the key\n itself is written `plus`. */\n console.warn(\n `[VHotkeys] \\`keys\\` holds only modifiers: \"${keys}\" never fires. The + key is written \\`plus\\`.`,\n )\n } else if (pressed > 1) {\n /* A shortcut is modifiers and ONE key: `g+h` is not a sequence, and only its first\n key would ever be matched. */\n console.warn(\n `[VHotkeys] \\`keys\\` names more than one key: \"${keys}\" is matched on the first alone.`,\n )\n }\n }\n return tokens\n}\n\n/** Whether this key is one that is held down rather than pressed. */\nfunction isModifier(token: string): boolean {\n return MODIFIERS.has(token)\n}\n\n/**\n * How a key nobody has a word or a symbol for is printed: as it was written, merely\n * capitalized: `k` becomes K, `f5` becomes F5, and a slash stays a slash.\n */\nexport function capLabel(token: string): string {\n return token.charAt(0).toUpperCase() + token.slice(1)\n}\n\nfunction wordOf(token: string, platform: HotkeysPlatform): HotkeysWord | undefined {\n /*\n * The two keys whose name depends on the system. `mod` is the modifier a consumer writes when\n * they mean \"the usual one here\"; Command on a Mac, Ctrl elsewhere; while `meta` names that\n * physical key literally, and it is called something different on each system.\n */\n if (token === 'mod') return platform === 'mac' ? 'command' : 'ctrl'\n if (token === 'meta') {\n if (platform === 'mac') return 'command'\n return platform === 'windows' ? 'windows' : 'super'\n }\n return WORDS[token]\n}\n\n/**\n * Resolves each key of a combination for a given system, attaching the symbol engraved\n * on it and the dictionary entry naming it, where either exists.\n */\nexport function resolveKeys(tokens: string[], platform: HotkeysPlatform): ResolvedKey[] {\n /* A modifier named twice is one key held down: `ctrl+ctrl+k`, or `mod+ctrl+k` away from a\n Mac, where `mod` IS Ctrl. Drawn twice it would read as a chord of two keys. */\n const held = new Set<string>()\n const once = tokens.filter((token) => {\n if (!isModifier(token)) return true\n const key = token === 'mod' ? (platform === 'mac' ? 'meta' : 'ctrl') : token\n if (held.has(key)) return false\n held.add(key)\n return true\n })\n return once.map((token) => ({\n token,\n glyph: (platform === 'mac' ? MAC_GLYPHS[token] : undefined) ?? GLYPHS[token],\n word: wordOf(token, platform),\n }))\n}\n\n/* The key names `aria-keyshortcuts` expects, which are those of `KeyboardEvent.key`. */\nconst ARIA_KEYS: Record<string, string> = {\n meta: 'Meta',\n ctrl: 'Control',\n alt: 'Alt',\n shift: 'Shift',\n enter: 'Enter',\n esc: 'Escape',\n space: 'Space',\n backspace: 'Backspace',\n delete: 'Delete',\n tab: 'Tab',\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n}\n\n// @a11y\n/** Spells a combination as the `aria-keyshortcuts` attribute does: `Control+K`, `Meta+K`. */\nexport function ariaKeyshortcuts(tokens: string[], platform: HotkeysPlatform): string {\n return resolveKeys(tokens, platform)\n .map(({ token }) =>\n token === 'mod'\n ? platform === 'mac'\n ? 'Meta'\n : 'Control'\n : (ARIA_KEYS[token] ?? capLabel(token)),\n )\n .join('+')\n}\n\nfunction normalizeEventKey(event: KeyboardEvent): string {\n const key = event.key.toLowerCase()\n return ALIASES[key] ?? key\n}\n\n/** Whether a key press IS this combination. */\nexport function matchesEvent(\n event: KeyboardEvent,\n tokens: string[],\n platform: HotkeysPlatform,\n): boolean {\n const wantCtrl = tokens.includes('ctrl') || (platform !== 'mac' && tokens.includes('mod'))\n const wantMeta = tokens.includes('meta') || (platform === 'mac' && tokens.includes('mod'))\n if (event.ctrlKey !== wantCtrl) return false\n if (event.metaKey !== wantMeta) return false\n if (event.altKey !== tokens.includes('alt')) return false\n if (event.shiftKey !== tokens.includes('shift')) return false\n const main = tokens.find((token) => !isModifier(token))\n /* A combination made of modifiers alone never fires: there is no key to press. */\n if (main === undefined) return false\n /*\n * Both sides go through the same normalization, which is also what makes a press reported as\n * \"K\"; because Shift was held; match a shortcut written `k`.\n */\n return normalizeEventKey(event) === main\n}\n\n// @keyboard\nexport function isEditableTarget(target: EventTarget | null | undefined): boolean {\n if (!(target instanceof HTMLElement)) return false\n if (target.isContentEditable) return true\n const tag = target.tagName\n if (tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (tag !== 'INPUT') return false\n return !NON_TEXT_INPUT_TYPES.has((target as HTMLInputElement).type)\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VHoverCard.js","names":[],"sources":["../../../src/components/VHoverCard/VHoverCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * A manual popover driven by hover and keyboard focus: no stable HTML primitive opens a panel\n * with a delay, as `popover=\"hint\"` and interest invokers are missing at the browser floor.\n * Manual mode also leaves any open menu or popover untouched.\n */\n\nimport { ref, useId } from 'vue'\n\nimport { useEscapeDismiss } from '../../composables/useEscapeDismiss'\nimport { usePopover, usePopoverModel } from '../../composables/usePopover'\nimport { useTimer } from '../../composables/useTimer'\nimport { isKeyboardFocus } from '../../utils/focus'\n\n/** Which side of the trigger the card appears on. */\nexport type HoverCardPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n\n/** What the trigger has to carry: the link to the card holding its details. */\nexport type HoverCardTriggerProps = {\n 'aria-details': string\n}\n\ninterface HoverCardProps {\n /**\n * Which side of the trigger the card appears on. The browser flips it to the opposite side by\n * itself when there is not enough room.\n */\n placement?: HoverCardPlacement\n /**\n * How long the pointer or the keyboard focus must rest on the trigger before the card opens,\n * in milliseconds.\n */\n openDelay?: number\n /**\n * How long the card stays once the pointer has left both the trigger and the card, in\n * milliseconds. It is the time to cross the gap between them.\n */\n closeDelay?: number\n}\n\nconst props = withDefaults(defineProps<HoverCardProps>(), {\n placement: 'bottom',\n openDelay: 500,\n closeDelay: 300,\n})\n\n/** Whether the card is showing. Setting it opens or closes the card without any delay. */\nconst open = defineModel<boolean>('open', { default: false })\n\ndefineSlots<{\n /** The trigger, usually a link. Bind the `triggerProps` it receives onto it. */\n default(props: { triggerProps: HoverCardTriggerProps }): unknown\n /** What the card contains. It may hold links and buttons, and is rendered on first opening. */\n content?(): unknown\n}>()\n\nconst cardId = useId()\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst { shown, syncShown, show: showPanel, hide: hidePanel } = usePopover(panelEl)\n\n// @ssr\n/*\n * The card is a `<span>` and its content mounts on first opening, so a trigger inside a\n * paragraph still produces valid server HTML: the parser closes a `<p>` at the first `<div>` or\n * `<p>` it meets, which would break hydration. The content then stays for the exit transition.\n */\nconst rendered = ref(false)\n\nconst timer = useTimer()\n\nlet hovered = false\nlet focused = false\n// Set while the card hands the focus back to its trigger, whose keyboard focus would reopen it.\nlet returningFocus = false\n\nconst inCard = (node: EventTarget | null) => !!panelEl.value?.contains(node as Node | null)\n\nfunction trigger() {\n return rootEl.value?.querySelector<HTMLElement>(`[aria-details=\"${cardId}\"]`) ?? null\n}\n\n// @core\nfunction show(immediate = false) {\n if (shown.value) {\n timer.cancel()\n return\n }\n // A delay of 0 runs the callback synchronously; the convention useTimer documents.\n timer.start(showPanel, immediate ? 0 : props.openDelay)\n}\n\n// @a11y\n/*\n * The trigger takes the focus back before the card hides. Left inside, the focus would follow\n * the browser's own restoration, which returns it to whatever held it when the card OPENED: for\n * a card opened by hover, an unrelated control elsewhere on the page.\n */\nfunction returnFocus() {\n if (!inCard(document.activeElement)) return\n returningFocus = true\n trigger()?.focus()\n returningFocus = false\n}\n\nfunction hide() {\n timer.cancel()\n returnFocus()\n hidePanel()\n}\n\n// @a11y\n// There is no hover on a touch screen: a tap keeps its usual meaning and opens nothing, so\n// whatever the card shows must also be reachable through the trigger's destination.\nfunction onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = true\n show()\n}\n\nfunction onPointerLeave(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = false\n if (!focused) timer.start(hide, props.closeDelay)\n}\n\n/*\n * Pressing the trigger closes the card so it cannot stand over a dialog or a page the trigger\n * opens. A press inside the card is a use of its content and keeps it.\n */\nfunction onPointerDown(event: PointerEvent) {\n if (inCard(event.target)) return\n hovered = false\n focused = false\n hide()\n}\n\n// @a11y\n/*\n * Only the KEYBOARD focus opens the card from the trigger, read from `:focus-visible` as VTooltip\n * does: a focus given by a click opens nothing. Any focus inside the card keeps it, since a\n * click on one of its controls is still a use of it.\n */\nfunction onFocusIn(event: FocusEvent) {\n if (returningFocus) return\n if (inCard(event.target)) {\n focused = true\n timer.cancel()\n return\n }\n if (!isKeyboardFocus(event.target)) return\n focused = true\n show()\n}\n\nfunction onFocusOut(event: FocusEvent) {\n if (rootEl.value?.contains(event.relatedTarget as Node | null)) return\n focused = false\n if (!hovered) hide()\n}\n\n// Escape closes the card, handing a focus inside it back to the trigger.\nconst listen = useEscapeDismiss(() => {\n hovered = false\n focused = false\n hide()\n})\n\nfunction onBeforeToggle(event: Event) {\n syncShown(event)\n if (shown.value) rendered.value = true\n}\n\n// The toggle event is synchronous, so Escape works from the moment the card shows.\nfunction onToggle(event: Event) {\n onBeforeToggle(event)\n open.value = shown.value\n listen(shown.value)\n}\n\n// A model closing the card goes through `hide`, which hands a focus inside it back as well.\nusePopoverModel(open, () => shown.value, showPanel, hide)\n\ndefineExpose({\n /** Opens the card at once, without the delay. */\n show: () => show(true),\n /** Closes the card, handing a focus inside it back to the trigger. */\n close: hide,\n /** The card element. */\n el: panelEl,\n})\n</script>\n\n<template>\n <span\n ref=\"rootEl\"\n class=\"v-hover-card\"\n @pointerenter=\"onPointerEnter\"\n @pointerleave=\"onPointerLeave\"\n @pointerdown=\"onPointerDown\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <slot :trigger-props=\"{ 'aria-details': cardId }\" />\n <!--\n The card follows the trigger in the DOM, so Tab moves from the trigger into the card's\n content while it shows.\n -->\n <span\n :id=\"cardId\"\n ref=\"panelEl\"\n popover=\"manual\"\n class=\"v-overlay v-floating v-panel v-hover-card-panel\"\n :data-placement=\"placement\"\n @beforetoggle=\"onBeforeToggle\"\n @toggle=\"onToggle\"\n >\n <slot v-if=\"rendered\" name=\"content\" />\n </span>\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-hover-card {\n display: inline-flex;\n align-items: center;\n anchor-name: --hover-card-anchor;\n /*\n * A visible card sits in the top layer, which anchor resolution treats as following the\n * whole document: without the scope, every card would attach to the last wrapper.\n */\n anchor-scope: --hover-card-anchor;\n }\n\n /*\n * Compound with `.v-panel` so the card's spacing outranks the shared panel chrome whatever\n * order the stylesheets load in.\n */\n .v-panel.v-hover-card-panel {\n position-anchor: --hover-card-anchor;\n gap: var(--vectis-space-2);\n padding: var(--vectis-space-4);\n inline-size: max-content;\n max-inline-size: min(\n var(--vectis-control-size-hover-card-max),\n calc(100dvi - var(--vectis-space-8))\n );\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n white-space: normal;\n }\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"VHoverCard.js","names":["_sfc_main","VHoverCard_vue_vue_type_script_setup_true_lang_default","VHoverCard_default"],"sources":["../../../src/components/VHoverCard/VHoverCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * A manual popover driven by hover and keyboard focus: no stable HTML primitive opens a panel\n * with a delay, as `popover=\"hint\"` and interest invokers are missing at the browser floor.\n * Manual mode also leaves any open menu or popover untouched.\n */\n\nimport { ref, useId } from 'vue'\n\nimport { useEscapeDismiss } from '../../composables/useEscapeDismiss'\nimport { usePopover, usePopoverModel } from '../../composables/usePopover'\nimport { useTimer } from '../../composables/useTimer'\nimport { isKeyboardFocus } from '../../utils/focus'\n\n/** Which side of the trigger the card appears on. */\nexport type HoverCardPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n\n/** What the trigger has to carry: the link to the card holding its details. */\nexport type HoverCardTriggerProps = {\n 'aria-details': string\n}\n\ninterface HoverCardProps {\n /**\n * Which side of the trigger the card appears on. The browser flips it to the opposite side by\n * itself when there is not enough room.\n */\n placement?: HoverCardPlacement\n /**\n * How long the pointer or the keyboard focus must rest on the trigger before the card opens,\n * in milliseconds.\n */\n openDelay?: number\n /**\n * How long the card stays once the pointer has left both the trigger and the card, in\n * milliseconds. It is the time to cross the gap between them.\n */\n closeDelay?: number\n}\n\nconst props = withDefaults(defineProps<HoverCardProps>(), {\n placement: 'bottom',\n openDelay: 500,\n closeDelay: 300,\n})\n\n/** Whether the card is showing. Setting it opens or closes the card without any delay. */\nconst open = defineModel<boolean>('open', { default: false })\n\ndefineSlots<{\n /** The trigger, usually a link. Bind the `triggerProps` it receives onto it. */\n default(props: { triggerProps: HoverCardTriggerProps }): unknown\n /** What the card contains. It may hold links and buttons, and is rendered on first opening. */\n content?(): unknown\n}>()\n\nconst cardId = useId()\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst { shown, syncShown, show: showPanel, hide: hidePanel } = usePopover(panelEl)\n\n// @ssr\n/*\n * The card is a `<span>` and its content mounts on first opening, so a trigger inside a\n * paragraph still produces valid server HTML: the parser closes a `<p>` at the first `<div>` or\n * `<p>` it meets, which would break hydration. The content then stays for the exit transition.\n */\nconst rendered = ref(false)\n\nconst timer = useTimer()\n\nlet hovered = false\nlet focused = false\n// Set while the card hands the focus back to its trigger, whose keyboard focus would reopen it.\nlet returningFocus = false\n\nconst inCard = (node: EventTarget | null) => !!panelEl.value?.contains(node as Node | null)\n\nfunction trigger() {\n return rootEl.value?.querySelector<HTMLElement>(`[aria-details=\"${cardId}\"]`) ?? null\n}\n\n// @core\nfunction show(immediate = false) {\n if (shown.value) {\n timer.cancel()\n return\n }\n // A delay of 0 runs the callback synchronously; the convention useTimer documents.\n timer.start(showPanel, immediate ? 0 : props.openDelay)\n}\n\n// @a11y\n/*\n * The trigger takes the focus back before the card hides. Left inside, the focus would follow\n * the browser's own restoration, which returns it to whatever held it when the card OPENED: for\n * a card opened by hover, an unrelated control elsewhere on the page.\n */\nfunction returnFocus() {\n if (!inCard(document.activeElement)) return\n returningFocus = true\n trigger()?.focus()\n returningFocus = false\n}\n\nfunction hide() {\n timer.cancel()\n returnFocus()\n hidePanel()\n}\n\n// @a11y\n// There is no hover on a touch screen: a tap keeps its usual meaning and opens nothing, so\n// whatever the card shows must also be reachable through the trigger's destination.\nfunction onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = true\n show()\n}\n\nfunction onPointerLeave(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = false\n if (!focused) timer.start(hide, props.closeDelay)\n}\n\n/*\n * Pressing the trigger closes the card so it cannot stand over a dialog or a page the trigger\n * opens. A press inside the card is a use of its content and keeps it.\n */\nfunction onPointerDown(event: PointerEvent) {\n if (inCard(event.target)) return\n hovered = false\n focused = false\n hide()\n}\n\n// @a11y\n/*\n * Only the KEYBOARD focus opens the card from the trigger, read from `:focus-visible` as VTooltip\n * does: a focus given by a click opens nothing. Any focus inside the card keeps it, since a\n * click on one of its controls is still a use of it.\n */\nfunction onFocusIn(event: FocusEvent) {\n if (returningFocus) return\n if (inCard(event.target)) {\n focused = true\n timer.cancel()\n return\n }\n if (!isKeyboardFocus(event.target)) return\n focused = true\n show()\n}\n\nfunction onFocusOut(event: FocusEvent) {\n if (rootEl.value?.contains(event.relatedTarget as Node | null)) return\n focused = false\n if (!hovered) hide()\n}\n\n// Escape closes the card, handing a focus inside it back to the trigger.\nconst listen = useEscapeDismiss(() => {\n hovered = false\n focused = false\n hide()\n})\n\nfunction onBeforeToggle(event: Event) {\n syncShown(event)\n if (shown.value) rendered.value = true\n}\n\n// The toggle event is synchronous, so Escape works from the moment the card shows.\nfunction onToggle(event: Event) {\n onBeforeToggle(event)\n open.value = shown.value\n listen(shown.value)\n}\n\n// A model closing the card goes through `hide`, which hands a focus inside it back as well.\nusePopoverModel(open, () => shown.value, showPanel, hide)\n\ndefineExpose({\n /** Opens the card at once, without the delay. */\n show: () => show(true),\n /** Closes the card, handing a focus inside it back to the trigger. */\n close: hide,\n /** The card element. */\n el: panelEl,\n})\n</script>\n\n<template>\n <span\n ref=\"rootEl\"\n class=\"v-hover-card\"\n @pointerenter=\"onPointerEnter\"\n @pointerleave=\"onPointerLeave\"\n @pointerdown=\"onPointerDown\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <slot :trigger-props=\"{ 'aria-details': cardId }\" />\n <!--\n The card follows the trigger in the DOM, so Tab moves from the trigger into the card's\n content while it shows.\n -->\n <span\n :id=\"cardId\"\n ref=\"panelEl\"\n popover=\"manual\"\n class=\"v-overlay v-floating v-panel v-hover-card-panel\"\n :data-placement=\"placement\"\n @beforetoggle=\"onBeforeToggle\"\n @toggle=\"onToggle\"\n >\n <slot v-if=\"rendered\" name=\"content\" />\n </span>\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-hover-card {\n display: inline-flex;\n align-items: center;\n anchor-name: --hover-card-anchor;\n /*\n * A visible card sits in the top layer, which anchor resolution treats as following the\n * whole document: without the scope, every card would attach to the last wrapper.\n */\n anchor-scope: --hover-card-anchor;\n }\n\n /*\n * Compound with `.v-panel` so the card's spacing outranks the shared panel chrome whatever\n * order the stylesheets load in.\n */\n .v-panel.v-hover-card-panel {\n position-anchor: --hover-card-anchor;\n gap: var(--vectis-space-2);\n padding: var(--vectis-space-4);\n inline-size: max-content;\n max-inline-size: min(\n var(--vectis-control-size-hover-card-max),\n calc(100dvi - var(--vectis-space-8))\n );\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n white-space: normal;\n }\n}\n</style>\n"],"mappings":""}
|
|
@@ -24,11 +24,7 @@ var g = ["id", "data-placement"], _ = /*@__PURE__*/ c({
|
|
|
24
24
|
return b.value?.querySelector(`[aria-details="${y}"]`) ?? null;
|
|
25
25
|
}
|
|
26
26
|
function N(e = !1) {
|
|
27
|
-
|
|
28
|
-
D.cancel();
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
D.start(w, e ? 0 : _.openDelay);
|
|
27
|
+
S.value ? D.cancel() : D.start(w, e ? 0 : _.openDelay);
|
|
32
28
|
}
|
|
33
29
|
function P() {
|
|
34
30
|
j(document.activeElement) && (A = !0, M()?.focus(), A = !1);
|
|
@@ -46,13 +42,7 @@ var g = ["id", "data-placement"], _ = /*@__PURE__*/ c({
|
|
|
46
42
|
j(e.target) || (O = !1, k = !1, F());
|
|
47
43
|
}
|
|
48
44
|
function z(e) {
|
|
49
|
-
|
|
50
|
-
if (j(e.target)) {
|
|
51
|
-
k = !0, D.cancel();
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
n(e.target) && (k = !0, N());
|
|
55
|
-
}
|
|
45
|
+
A || (j(e.target) ? (k = !0, D.cancel()) : n(e.target) && (k = !0, N()));
|
|
56
46
|
}
|
|
57
47
|
function B(e) {
|
|
58
48
|
b.value?.contains(e.relatedTarget) || (k = !1, O || F());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VHoverCard.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VHoverCard/VHoverCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * A manual popover driven by hover and keyboard focus: no stable HTML primitive opens a panel\n * with a delay, as `popover=\"hint\"` and interest invokers are missing at the browser floor.\n * Manual mode also leaves any open menu or popover untouched.\n */\n\nimport { ref, useId } from 'vue'\n\nimport { useEscapeDismiss } from '../../composables/useEscapeDismiss'\nimport { usePopover, usePopoverModel } from '../../composables/usePopover'\nimport { useTimer } from '../../composables/useTimer'\nimport { isKeyboardFocus } from '../../utils/focus'\n\n/** Which side of the trigger the card appears on. */\nexport type HoverCardPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n\n/** What the trigger has to carry: the link to the card holding its details. */\nexport type HoverCardTriggerProps = {\n 'aria-details': string\n}\n\ninterface HoverCardProps {\n /**\n * Which side of the trigger the card appears on. The browser flips it to the opposite side by\n * itself when there is not enough room.\n */\n placement?: HoverCardPlacement\n /**\n * How long the pointer or the keyboard focus must rest on the trigger before the card opens,\n * in milliseconds.\n */\n openDelay?: number\n /**\n * How long the card stays once the pointer has left both the trigger and the card, in\n * milliseconds. It is the time to cross the gap between them.\n */\n closeDelay?: number\n}\n\nconst props = withDefaults(defineProps<HoverCardProps>(), {\n placement: 'bottom',\n openDelay: 500,\n closeDelay: 300,\n})\n\n/** Whether the card is showing. Setting it opens or closes the card without any delay. */\nconst open = defineModel<boolean>('open', { default: false })\n\ndefineSlots<{\n /** The trigger, usually a link. Bind the `triggerProps` it receives onto it. */\n default(props: { triggerProps: HoverCardTriggerProps }): unknown\n /** What the card contains. It may hold links and buttons, and is rendered on first opening. */\n content?(): unknown\n}>()\n\nconst cardId = useId()\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst { shown, syncShown, show: showPanel, hide: hidePanel } = usePopover(panelEl)\n\n// @ssr\n/*\n * The card is a `<span>` and its content mounts on first opening, so a trigger inside a\n * paragraph still produces valid server HTML: the parser closes a `<p>` at the first `<div>` or\n * `<p>` it meets, which would break hydration. The content then stays for the exit transition.\n */\nconst rendered = ref(false)\n\nconst timer = useTimer()\n\nlet hovered = false\nlet focused = false\n// Set while the card hands the focus back to its trigger, whose keyboard focus would reopen it.\nlet returningFocus = false\n\nconst inCard = (node: EventTarget | null) => !!panelEl.value?.contains(node as Node | null)\n\nfunction trigger() {\n return rootEl.value?.querySelector<HTMLElement>(`[aria-details=\"${cardId}\"]`) ?? null\n}\n\n// @core\nfunction show(immediate = false) {\n if (shown.value) {\n timer.cancel()\n return\n }\n // A delay of 0 runs the callback synchronously; the convention useTimer documents.\n timer.start(showPanel, immediate ? 0 : props.openDelay)\n}\n\n// @a11y\n/*\n * The trigger takes the focus back before the card hides. Left inside, the focus would follow\n * the browser's own restoration, which returns it to whatever held it when the card OPENED: for\n * a card opened by hover, an unrelated control elsewhere on the page.\n */\nfunction returnFocus() {\n if (!inCard(document.activeElement)) return\n returningFocus = true\n trigger()?.focus()\n returningFocus = false\n}\n\nfunction hide() {\n timer.cancel()\n returnFocus()\n hidePanel()\n}\n\n// @a11y\n// There is no hover on a touch screen: a tap keeps its usual meaning and opens nothing, so\n// whatever the card shows must also be reachable through the trigger's destination.\nfunction onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = true\n show()\n}\n\nfunction onPointerLeave(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = false\n if (!focused) timer.start(hide, props.closeDelay)\n}\n\n/*\n * Pressing the trigger closes the card so it cannot stand over a dialog or a page the trigger\n * opens. A press inside the card is a use of its content and keeps it.\n */\nfunction onPointerDown(event: PointerEvent) {\n if (inCard(event.target)) return\n hovered = false\n focused = false\n hide()\n}\n\n// @a11y\n/*\n * Only the KEYBOARD focus opens the card from the trigger, read from `:focus-visible` as VTooltip\n * does: a focus given by a click opens nothing. Any focus inside the card keeps it, since a\n * click on one of its controls is still a use of it.\n */\nfunction onFocusIn(event: FocusEvent) {\n if (returningFocus) return\n if (inCard(event.target)) {\n focused = true\n timer.cancel()\n return\n }\n if (!isKeyboardFocus(event.target)) return\n focused = true\n show()\n}\n\nfunction onFocusOut(event: FocusEvent) {\n if (rootEl.value?.contains(event.relatedTarget as Node | null)) return\n focused = false\n if (!hovered) hide()\n}\n\n// Escape closes the card, handing a focus inside it back to the trigger.\nconst listen = useEscapeDismiss(() => {\n hovered = false\n focused = false\n hide()\n})\n\nfunction onBeforeToggle(event: Event) {\n syncShown(event)\n if (shown.value) rendered.value = true\n}\n\n// The toggle event is synchronous, so Escape works from the moment the card shows.\nfunction onToggle(event: Event) {\n onBeforeToggle(event)\n open.value = shown.value\n listen(shown.value)\n}\n\n// A model closing the card goes through `hide`, which hands a focus inside it back as well.\nusePopoverModel(open, () => shown.value, showPanel, hide)\n\ndefineExpose({\n /** Opens the card at once, without the delay. */\n show: () => show(true),\n /** Closes the card, handing a focus inside it back to the trigger. */\n close: hide,\n /** The card element. */\n el: panelEl,\n})\n</script>\n\n<template>\n <span\n ref=\"rootEl\"\n class=\"v-hover-card\"\n @pointerenter=\"onPointerEnter\"\n @pointerleave=\"onPointerLeave\"\n @pointerdown=\"onPointerDown\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <slot :trigger-props=\"{ 'aria-details': cardId }\" />\n <!--\n The card follows the trigger in the DOM, so Tab moves from the trigger into the card's\n content while it shows.\n -->\n <span\n :id=\"cardId\"\n ref=\"panelEl\"\n popover=\"manual\"\n class=\"v-overlay v-floating v-panel v-hover-card-panel\"\n :data-placement=\"placement\"\n @beforetoggle=\"onBeforeToggle\"\n @toggle=\"onToggle\"\n >\n <slot v-if=\"rendered\" name=\"content\" />\n </span>\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-hover-card {\n display: inline-flex;\n align-items: center;\n anchor-name: --hover-card-anchor;\n /*\n * A visible card sits in the top layer, which anchor resolution treats as following the\n * whole document: without the scope, every card would attach to the last wrapper.\n */\n anchor-scope: --hover-card-anchor;\n }\n\n /*\n * Compound with `.v-panel` so the card's spacing outranks the shared panel chrome whatever\n * order the stylesheets load in.\n */\n .v-panel.v-hover-card-panel {\n position-anchor: --hover-card-anchor;\n gap: var(--vectis-space-2);\n padding: var(--vectis-space-4);\n inline-size: max-content;\n max-inline-size: min(\n var(--vectis-control-size-hover-card-max),\n calc(100dvi - var(--vectis-space-8))\n );\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n white-space: normal;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAoDA,IAAM,IAAQ,GAOR,IAAO,EAAoB,GAAC,MAA0B,GAStD,IAAS,EAAM,GACf,IAAS,EAAwB,IAAI,GACrC,IAAU,EAAwB,IAAI,GACtC,EAAE,UAAO,cAAW,MAAM,GAAW,MAAM,MAAc,EAAW,CAAO,GAQ3E,IAAW,EAAI,EAAK,GAEpB,IAAQ,EAAS,GAEnB,IAAU,IACV,IAAU,IAEV,IAAiB,IAEf,KAAU,MAA6B,CAAC,CAAC,EAAQ,OAAO,SAAS,CAAmB;EAE1F,SAAS,IAAU;GACjB,OAAO,EAAO,OAAO,cAA2B,kBAAkB,EAAO,GAAG,KAAK;EACnF;EAGA,SAAS,EAAK,IAAY,IAAO;GAC/B,IAAI,EAAM,OAAO;IACf,EAAM,OAAO;IACb;GACF;GAEA,EAAM,MAAM,GAAW,IAAY,IAAI,EAAM,SAAS;EACxD;EAQA,SAAS,IAAc;GAChB,EAAO,SAAS,aAAa,MAClC,IAAiB,IACjB,EAAQ,CAAC,EAAE,MAAM,GACjB,IAAiB;EACnB;EAEA,SAAS,IAAO;GAGd,AAFA,EAAM,OAAO,GACb,EAAY,GACZ,EAAU;EACZ;EAKA,SAAS,EAAe,GAAqB;GACvC,EAAM,gBAAgB,YAC1B,IAAU,IACV,EAAK;EACP;EAEA,SAAS,EAAe,GAAqB;GACvC,EAAM,gBAAgB,YAC1B,IAAU,IACL,KAAS,EAAM,MAAM,GAAM,EAAM,UAAU;EAClD;EAMA,SAAS,EAAc,GAAqB;GACtC,EAAO,EAAM,MAAM,MACvB,IAAU,IACV,IAAU,IACV,EAAK;EACP;EAQA,SAAS,EAAU,GAAmB;GAChC,QACJ;QAAI,EAAO,EAAM,MAAM,GAAG;KAExB,AADA,IAAU,IACV,EAAM,OAAO;KACb;IACF;IACK,EAAgB,EAAM,MAAM,MACjC,IAAU,IACV,EAAK;GAHL;EAIF;EAEA,SAAS,EAAW,GAAmB;GACjC,EAAO,OAAO,SAAS,EAAM,aAA4B,MAC7D,IAAU,IACL,KAAS,EAAK;EACrB;EAGA,IAAM,IAAS,QAAuB;GAGpC,AAFA,IAAU,IACV,IAAU,IACV,EAAK;EACP,CAAC;EAED,SAAS,EAAe,GAAc;GAEpC,AADA,EAAU,CAAK,GACX,EAAM,UAAO,EAAS,QAAQ;EACpC;EAGA,SAAS,EAAS,GAAc;GAG9B,AAFA,EAAe,CAAK,GACpB,EAAK,QAAQ,EAAM,OACnB,EAAO,EAAM,KAAK;EACpB;SAGA,EAAgB,SAAY,EAAM,OAAO,GAAW,CAAI,GAExD,EAAa;GAEX,YAAY,EAAK,EAAI;GAErB,OAAO;GAEP,IAAI;EACN,CAAC,mBAIC,EAyBO,QAAA;YAxBD;GAAJ,KAAI;GACJ,OAAM;GACL,gBAAc;GACd,gBAAc;GACd,eAAa;GACb,WAAS;GACT,YAAU;MAEX,EAAoD,EAAA,QAAA,WAAA,EAA7C,cAAa,EAAA,gBAAoB,EAAA,CAAA,EAAM,EAAA,CAAA,GAK9C,EAUO,QAAA;GATJ,IAAI,EAAA,CAAA;YACD;GAAJ,KAAI;GACJ,SAAQ;GACR,OAAM;GACL,kBAAgB,EAAA;GAChB,gBAAc;GACN;MAEG,EAAA,QAAZ,EAAuC,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,EAAA,IAAA,EAAA,CAAA,GAAA,IAAA,CAAA,CAAA,GAAA,GAAA"}
|
|
1
|
+
{"version":3,"file":"VHoverCard.vue_vue_type_script_setup_true_lang.js","names":["_useModel","_openBlock","_createElementBlock","_renderSlot","_unref","_createElementVNode","_createCommentVNode","_hoisted_1","VHoverCard_vue_vue_type_script_setup_true_lang_default","\"open\"","\"openModifiers\"","__expose","props","__props","open","useModel","cardId","useId","rootEl","ref","panelEl","showPanel","hidePanel","usePopover","rendered","timer","useTimer","hovered","focused","returningFocus","inCard","node","trigger","show","shown","immediate","returnFocus","hide","onPointerEnter","event","onPointerLeave","onPointerDown","onFocusIn","isKeyboardFocus","onFocusOut","listen","useEscapeDismiss","onBeforeToggle","syncShown","onToggle","usePopoverModel","openBlock","createElementBlock","renderSlot","_ctx","unref","createElementVNode","createCommentVNode"],"sources":["../../../src/components/VHoverCard/VHoverCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * A manual popover driven by hover and keyboard focus: no stable HTML primitive opens a panel\n * with a delay, as `popover=\"hint\"` and interest invokers are missing at the browser floor.\n * Manual mode also leaves any open menu or popover untouched.\n */\n\nimport { ref, useId } from 'vue'\n\nimport { useEscapeDismiss } from '../../composables/useEscapeDismiss'\nimport { usePopover, usePopoverModel } from '../../composables/usePopover'\nimport { useTimer } from '../../composables/useTimer'\nimport { isKeyboardFocus } from '../../utils/focus'\n\n/** Which side of the trigger the card appears on. */\nexport type HoverCardPlacement =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n\n/** What the trigger has to carry: the link to the card holding its details. */\nexport type HoverCardTriggerProps = {\n 'aria-details': string\n}\n\ninterface HoverCardProps {\n /**\n * Which side of the trigger the card appears on. The browser flips it to the opposite side by\n * itself when there is not enough room.\n */\n placement?: HoverCardPlacement\n /**\n * How long the pointer or the keyboard focus must rest on the trigger before the card opens,\n * in milliseconds.\n */\n openDelay?: number\n /**\n * How long the card stays once the pointer has left both the trigger and the card, in\n * milliseconds. It is the time to cross the gap between them.\n */\n closeDelay?: number\n}\n\nconst props = withDefaults(defineProps<HoverCardProps>(), {\n placement: 'bottom',\n openDelay: 500,\n closeDelay: 300,\n})\n\n/** Whether the card is showing. Setting it opens or closes the card without any delay. */\nconst open = defineModel<boolean>('open', { default: false })\n\ndefineSlots<{\n /** The trigger, usually a link. Bind the `triggerProps` it receives onto it. */\n default(props: { triggerProps: HoverCardTriggerProps }): unknown\n /** What the card contains. It may hold links and buttons, and is rendered on first opening. */\n content?(): unknown\n}>()\n\nconst cardId = useId()\nconst rootEl = ref<HTMLElement | null>(null)\nconst panelEl = ref<HTMLElement | null>(null)\nconst { shown, syncShown, show: showPanel, hide: hidePanel } = usePopover(panelEl)\n\n// @ssr\n/*\n * The card is a `<span>` and its content mounts on first opening, so a trigger inside a\n * paragraph still produces valid server HTML: the parser closes a `<p>` at the first `<div>` or\n * `<p>` it meets, which would break hydration. The content then stays for the exit transition.\n */\nconst rendered = ref(false)\n\nconst timer = useTimer()\n\nlet hovered = false\nlet focused = false\n// Set while the card hands the focus back to its trigger, whose keyboard focus would reopen it.\nlet returningFocus = false\n\nconst inCard = (node: EventTarget | null) => !!panelEl.value?.contains(node as Node | null)\n\nfunction trigger() {\n return rootEl.value?.querySelector<HTMLElement>(`[aria-details=\"${cardId}\"]`) ?? null\n}\n\n// @core\nfunction show(immediate = false) {\n if (shown.value) {\n timer.cancel()\n return\n }\n // A delay of 0 runs the callback synchronously; the convention useTimer documents.\n timer.start(showPanel, immediate ? 0 : props.openDelay)\n}\n\n// @a11y\n/*\n * The trigger takes the focus back before the card hides. Left inside, the focus would follow\n * the browser's own restoration, which returns it to whatever held it when the card OPENED: for\n * a card opened by hover, an unrelated control elsewhere on the page.\n */\nfunction returnFocus() {\n if (!inCard(document.activeElement)) return\n returningFocus = true\n trigger()?.focus()\n returningFocus = false\n}\n\nfunction hide() {\n timer.cancel()\n returnFocus()\n hidePanel()\n}\n\n// @a11y\n// There is no hover on a touch screen: a tap keeps its usual meaning and opens nothing, so\n// whatever the card shows must also be reachable through the trigger's destination.\nfunction onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = true\n show()\n}\n\nfunction onPointerLeave(event: PointerEvent) {\n if (event.pointerType === 'touch') return\n hovered = false\n if (!focused) timer.start(hide, props.closeDelay)\n}\n\n/*\n * Pressing the trigger closes the card so it cannot stand over a dialog or a page the trigger\n * opens. A press inside the card is a use of its content and keeps it.\n */\nfunction onPointerDown(event: PointerEvent) {\n if (inCard(event.target)) return\n hovered = false\n focused = false\n hide()\n}\n\n// @a11y\n/*\n * Only the KEYBOARD focus opens the card from the trigger, read from `:focus-visible` as VTooltip\n * does: a focus given by a click opens nothing. Any focus inside the card keeps it, since a\n * click on one of its controls is still a use of it.\n */\nfunction onFocusIn(event: FocusEvent) {\n if (returningFocus) return\n if (inCard(event.target)) {\n focused = true\n timer.cancel()\n return\n }\n if (!isKeyboardFocus(event.target)) return\n focused = true\n show()\n}\n\nfunction onFocusOut(event: FocusEvent) {\n if (rootEl.value?.contains(event.relatedTarget as Node | null)) return\n focused = false\n if (!hovered) hide()\n}\n\n// Escape closes the card, handing a focus inside it back to the trigger.\nconst listen = useEscapeDismiss(() => {\n hovered = false\n focused = false\n hide()\n})\n\nfunction onBeforeToggle(event: Event) {\n syncShown(event)\n if (shown.value) rendered.value = true\n}\n\n// The toggle event is synchronous, so Escape works from the moment the card shows.\nfunction onToggle(event: Event) {\n onBeforeToggle(event)\n open.value = shown.value\n listen(shown.value)\n}\n\n// A model closing the card goes through `hide`, which hands a focus inside it back as well.\nusePopoverModel(open, () => shown.value, showPanel, hide)\n\ndefineExpose({\n /** Opens the card at once, without the delay. */\n show: () => show(true),\n /** Closes the card, handing a focus inside it back to the trigger. */\n close: hide,\n /** The card element. */\n el: panelEl,\n})\n</script>\n\n<template>\n <span\n ref=\"rootEl\"\n class=\"v-hover-card\"\n @pointerenter=\"onPointerEnter\"\n @pointerleave=\"onPointerLeave\"\n @pointerdown=\"onPointerDown\"\n @focusin=\"onFocusIn\"\n @focusout=\"onFocusOut\"\n >\n <slot :trigger-props=\"{ 'aria-details': cardId }\" />\n <!--\n The card follows the trigger in the DOM, so Tab moves from the trigger into the card's\n content while it shows.\n -->\n <span\n :id=\"cardId\"\n ref=\"panelEl\"\n popover=\"manual\"\n class=\"v-overlay v-floating v-panel v-hover-card-panel\"\n :data-placement=\"placement\"\n @beforetoggle=\"onBeforeToggle\"\n @toggle=\"onToggle\"\n >\n <slot v-if=\"rendered\" name=\"content\" />\n </span>\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-hover-card {\n display: inline-flex;\n align-items: center;\n anchor-name: --hover-card-anchor;\n /*\n * A visible card sits in the top layer, which anchor resolution treats as following the\n * whole document: without the scope, every card would attach to the last wrapper.\n */\n anchor-scope: --hover-card-anchor;\n }\n\n /*\n * Compound with `.v-panel` so the card's spacing outranks the shared panel chrome whatever\n * order the stylesheets load in.\n */\n .v-panel.v-hover-card-panel {\n position-anchor: --hover-card-anchor;\n gap: var(--vectis-space-2);\n padding: var(--vectis-space-4);\n inline-size: max-content;\n max-inline-size: min(\n var(--vectis-control-size-hover-card-max),\n calc(100dvi - var(--vectis-space-8))\n );\n font-size: var(--vectis-text-body-md-size);\n font-weight: var(--vectis-text-body-md-weight);\n line-height: var(--vectis-text-body-md-leading);\n text-align: start;\n white-space: normal;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAoDA,IAAMY,IAAQC,GAORC,IAAOd,EAAoBa,GAAC,MAA0B,GAStDG,IAASC,EAAM,GACfC,IAASC,EAAwB,IAAI,GACrCC,IAAUD,EAAwB,IAAI,GACtC,EAAE,UAAO,cAAW,MAAME,GAAW,MAAMC,MAAcC,EAAWH,CAAO,GAQ3EI,IAAWL,EAAI,EAAK,GAEpBM,IAAQC,EAAS,GAEnBC,IAAU,IACVC,IAAU,IAEVC,IAAiB,IAEfC,KAAU,MAA6B,CAAC,CAACV,EAAQ,OAAO,SAASW,CAAmB;EAE1F,SAASC,IAAU;GACjB,OAAOd,EAAO,OAAO,cAA2B,kBAAkBF,EAAO,GAAG,KAAK;EACnF;EAGA,SAASiB,EAAK,IAAY,IAAO;GAC/B,AAAIC,EAAM,QACRT,EAAM,OAAO,IAIfA,EAAM,MAAMJ,GAAWc,IAAY,IAAIvB,EAAM,SAAS;EACxD;EAQA,SAASwB,IAAc;GACrB,AAAKN,EAAO,SAAS,aAAa,MAClC,IAAiB,IACjBE,EAAQ,CAAC,EAAE,MAAM,GACjB,IAAiB;EACnB;EAEA,SAASK,IAAO;GAGd,AAFAZ,EAAM,OAAO,GACbW,EAAY,GACZd,EAAU;EACZ;EAKA,SAASgB,EAAe,GAAqB;GAC3C,AAAIC,EAAM,gBAAgB,YAC1B,IAAU,IACVN,EAAK;EACP;EAEA,SAASO,EAAe,GAAqB;GAC3C,AAAID,EAAM,gBAAgB,YAC1B,IAAU,IACLX,KAASH,EAAM,MAAMY,GAAMzB,EAAM,UAAU;EAClD;EAMA,SAAS6B,EAAc,GAAqB;GAC1C,AAAIX,EAAOS,EAAM,MAAM,MACvB,IAAU,IACV,IAAU,IACVF,EAAK;EACP;EAQA,SAASK,EAAU,GAAmB;GACpC,AAAIb,MACAC,EAAOS,EAAM,MAAM,KACrB,IAAU,IACVd,EAAM,OAAO,KAGVkB,EAAgBJ,EAAM,MAAM,MACjC,IAAU,IACVN,EAAK;EACP;EAEA,SAASW,EAAW,GAAmB;GACrC,AAAI1B,EAAO,OAAO,SAASqB,EAAM,aAA4B,MAC7D,IAAU,IACLZ,KAASU,EAAK;EACrB;EAGA,IAAMQ,IAASC,QAAuB;GAGpC,AAFA,IAAU,IACV,IAAU,IACVT,EAAK;EACP,CAAC;EAED,SAASU,EAAe,GAAc;GAEpC,AADAC,EAAUT,CAAK,GACXL,EAAM,UAAO,EAAS,QAAQ;EACpC;EAGA,SAASe,EAAS,GAAc;GAG9B,AAFAF,EAAeR,CAAK,GACpB,EAAK,QAAQL,EAAM,OACnBW,EAAOX,EAAM,KAAK;EACpB;SAGAgB,EAAgBpC,SAAYoB,EAAM,OAAOb,GAAWgB,CAAI,GAExD1B,EAAa;GAEX,YAAYsB,EAAK,EAAI;GAErB,OAAOI;GAEP,IAAIjB;EACN,CAAC,cAICnB,EAAA,GAAAC,EAyBO,QAAA;GAxBD,SAAA;GAAJ,KAAIgB;GACJ,OAAM;GACL,gBAAcoB;GACd,gBAAcE;GACd,eAAaC;GACb,WAASC;GACT,YAAUE;EAEXzC,GAAAA,CAAAA,EAAoDmD,EAAA,QAAA,WAAA,EAA7C,cAAa,EAAA,gBAAoBlD,EAAAY,CAAA,EAAM,EAAA,CAAA,GAK9CX,EAUO,QAAA;GATJ,IAAID,EAAAY,CAAA;GACD,SAAA;GAAJ,KAAII;GACJ,SAAQ;GACR,OAAM;GACL,kBAAgBP,EAAA;GAChB,gBAAckC;GACN;EAEG,GAAA,CAAAvB,EAAA,QAAZrB,EAAuCmD,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAAG,EAAA,IAAA,EAAA,CAAA,GAAA,IAAAlD,CAAA,CAAA,GAAA,GAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VIcon.js","names":[],"sources":["../../../src/components/VIcon/VIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Resolve icon render, src and name in priority order. Named icons consult the consumer\n * resolver, embedded drawing and ligature fallback; explicit drawing needs no font.\n */\nimport { computed, type Component } from 'vue'\n\nimport { iconName as nameOf } from './iconProps'\nimport { ICON_VIEW_BOX } from './icons/viewBox'\nimport { resolveIcon } from './resolver'\nimport type { BuiltinIcon, IconRender } from './types'\n\nimport { px } from '../../utils/css'\n\ninterface IconProps {\n /** Which icon to draw. */\n name?: string | BuiltinIcon\n /**\n * An explicit description of what to draw (an image, a component, a path, a class), which\n * wins over everything else.\n */\n render?: IconRender\n /** The address of an image to use as the icon. It wins over `name`. */\n src?: string\n /**\n * A size in pixels, as a number or a numeric string. Left out, or given something that\n * is not a number, the icon takes the size its context imposes (a button sets one for\n * the icons inside it), and failing that 1em, which makes it follow the surrounding\n * text.\n */\n size?: number | string\n /**\n * What the icon means, for screen readers. Leaving it out marks the icon as\n * decorative and hides it from them, which is the right thing whenever the\n * surrounding text already says what it says.\n */\n label?: string\n /** Draws the filled version of the icon. */\n filled?: boolean\n /**\n * Flips the icon horizontally in a right-to-left context, for a glyph that points at a\n * physical direction: a \"previous\" chevron points left in English and right in Arabic. Off by\n * default, since most icons mean the same thing in both directions.\n */\n mirrored?: boolean\n}\n\nconst props = withDefaults(defineProps<IconProps>(), {\n name: undefined,\n render: undefined,\n src: undefined,\n size: undefined,\n label: undefined,\n filled: false,\n mirrored: false,\n})\n\ndefineSlots<{\n /** An inline SVG, used when none of `render`, `src` and `name` was given. */\n default?(): unknown\n}>()\n\n/**\n * The chosen source, labelled with its kind. The public `IconRender` union carries no such\n * label; the consumer writes it by hand and has nothing to tag it with; but the template needs\n * one thing it can branch on reliably, and applying the tag is also where the documented\n * precedence between the shapes gets decided.\n */\ntype Resolved =\n | { kind: 'path'; path: string; viewBox: string }\n | { kind: 'component'; component: Component; props?: Record<string, unknown> }\n | { kind: 'src'; src: string }\n | { kind: 'text'; text: string; class?: string }\n | { kind: 'class'; class: string }\n\nfunction tag(render: IconRender): Resolved {\n if ('path' in render)\n return { kind: 'path', path: render.path, viewBox: render.viewBox ?? ICON_VIEW_BOX }\n if ('component' in render)\n return { kind: 'component', component: render.component, props: render.props }\n if ('src' in render) return { kind: 'src', src: render.src }\n if ('text' in render) return { kind: 'text', text: render.text, class: render.class }\n return { kind: 'class', class: render.class }\n}\n\n/**\n * The icon's identity: the name the resolver is asked for, and the one `data-icon`\n * records whatever the drawing turned out to come from.\n */\nconst iconName = computed(() => nameOf(props.name))\n\n// @fallback\n// Ligature is the last resort, reached when neither the resolver nor the registry recognized\n// the name.\n/**\n * Works out what to draw: an explicit `render` if there is one, then the consumer's resolver,\n * then the icons built into the library. Answering `undefined` here is not a failure; it means\n * the template falls through to the image, the ligature or the slot.\n */\nconst resolved = computed<Resolved | undefined>(() => {\n if (props.render) return tag(props.render)\n // TRUTHINESS on `src`, the test the template renders the image with: an empty `src=\"\"`\n // renders no image, so it must not stop the name from being drawn either.\n if (props.src || props.name === undefined) return undefined\n\n const custom = resolveIcon(iconName.value!, { filled: props.filled })\n if (custom) return tag(custom)\n\n // A bare name has no drawing of its own, so it falls through to the ligature; only\n // one of the library's own icons brings its paths along.\n if (typeof props.name === 'string') return undefined\n\n const { paths } = props.name\n // A second path is only stored when filling actually changes the drawing, so most\n // icons have one path and fall back to it (see the `BuiltinIcon` type).\n const path = (props.filled ? paths[1] : undefined) ?? paths[0]\n return { kind: 'path', path, viewBox: ICON_VIEW_BOX }\n})\n</script>\n\n<template>\n <span\n class=\"v-icon\"\n :style=\"px(size) !== undefined ? { '--vectis-icon-size': px(size) } : undefined\"\n :data-icon=\"iconName\"\n :data-filled=\"filled || undefined\"\n :data-mirror=\"mirrored || undefined\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <template v-if=\"resolved\">\n <svg\n v-if=\"resolved.kind === 'path'\"\n class=\"v-icon-svg\"\n :viewBox=\"resolved.viewBox\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"resolved.path\" />\n </svg>\n <component\n :is=\"resolved.component\"\n v-else-if=\"resolved.kind === 'component'\"\n v-bind=\"resolved.props\"\n />\n <img v-else-if=\"resolved.kind === 'src'\" class=\"v-icon-img\" :src=\"resolved.src\" alt=\"\" />\n <!-- The interpolation is written flush against the tags: a ligature is matched\n on the exact text, and any surrounding whitespace would break it -->\n <span v-else-if=\"resolved.kind === 'text'\" class=\"v-icon-symbol\" :class=\"resolved.class\">{{\n resolved.text\n }}</span>\n <span v-else class=\"v-icon-glyph\" :class=\"resolved.class\" />\n </template>\n <img v-else-if=\"src\" class=\"v-icon-img\" :src=\"src\" alt=\"\" />\n <span v-else-if=\"name\" class=\"v-icon-symbol\">{{ iconName }}</span>\n <slot v-else />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-icon {\n /*\n * How the size is settled, in order of priority: 1. the `size` prop, written inline on the\n * element as --vectis-icon-size; a declaration made on the element itself beats both\n * inheritance and the layer, so it always wins; 2. the variables inherited from an\n * ancestor, which is the context API: a VButton sets them from its own size, and the icons\n * inside follow; 3. 1em, which makes the icon follow the size of the text around it.\n */\n --icon-size: var(--vectis-icon-size, 1em);\n --icon-opsz: var(--vectis-icon-opsz, 24);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /*\n * The box must not read `--icon-size` again: an `em` there resolves against this element's\n * own font-size, already enlarged by the line below, so a context size of 1.5em drew a box\n * of 2.25em around a glyph of 1.5em.\n */\n font-size: var(--icon-size);\n inline-size: 1em;\n block-size: 1em;\n }\n\n /*\n * When the icon font has not loaded, a ligature shows as its own name in plain text. Clipping\n * keeps that text inside the square instead of letting it push the layout apart.\n */\n .v-icon:has(> .v-icon-symbol) {\n overflow: hidden;\n }\n\n .v-icon-symbol {\n /* Declared here and not only under `[data-filled]`: a custom property inherits, so a\n host application setting `--icon-fill` on an ancestor would otherwise fill every\n icon below it. */\n --icon-fill: 0;\n font-family: var(--vectis-font-family-icon);\n font-weight: var(--vectis-font-weight-regular);\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n direction: ltr;\n /*\n * The variable axes of the Material Symbols font. These numbers are the font's own\n * technical contract and not design decisions, which is why they are written literally here\n * rather than taken from tokens; the same tolerance as the opacities.\n */\n font-variation-settings:\n 'FILL' var(--icon-fill),\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' var(--icon-opsz);\n }\n\n .v-icon[data-filled] .v-icon-symbol {\n --icon-fill: 1;\n }\n\n /* `:dir()` reads the direction the browser computed rather than an attribute spelled on\n an ancestor, and `scale` is the individual property, so it composes with a rotation\n a consumer applies (a disclosure chevron) instead of replacing its transform. */\n .v-icon[data-mirror]:dir(rtl) {\n scale: -1 1;\n }\n\n .v-icon-img,\n .v-icon > svg {\n inline-size: 100%;\n block-size: 100%;\n object-fit: contain;\n }\n\n /*\n * Because the design system renders this element itself rather than accepting the usual\n * `<i>`, one rule normalizes it for every such library; `font-style` undoes the italics those\n * conventions carry, and `line-height` stops the inherited line box from pushing the glyph\n * off centre.\n */\n .v-icon-glyph {\n display: block;\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n }\n\n /*\n * The fill is set on OUR class and never on `.v-icon > svg`, so that a multicoloured SVG\n * handed in through the slot keeps its own colours instead of being flattened to the text\n * colour. `display: block` removes the gap an inline element leaves under its baseline.\n */\n .v-icon-svg {\n display: block;\n fill: currentcolor;\n }\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"VIcon.js","names":["_sfc_main","VIcon_vue_vue_type_script_setup_true_lang_default","VIcon_default"],"sources":["../../../src/components/VIcon/VIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Resolve icon render, src and name in priority order. Named icons consult the consumer\n * resolver, embedded drawing and ligature fallback; explicit drawing needs no font.\n */\nimport { computed, type Component } from 'vue'\n\nimport { iconName as nameOf } from './iconProps'\nimport { ICON_VIEW_BOX } from './icons/viewBox'\nimport { resolveIcon } from './resolver'\nimport type { BuiltinIcon, IconRender } from './types'\n\nimport { px } from '../../utils/css'\n\ninterface IconProps {\n /** Which icon to draw. */\n name?: string | BuiltinIcon\n /**\n * An explicit description of what to draw (an image, a component, a path, a class), which\n * wins over everything else.\n */\n render?: IconRender\n /** The address of an image to use as the icon. It wins over `name`. */\n src?: string\n /**\n * A size in pixels, as a number or a numeric string. Left out, or given something that\n * is not a number, the icon takes the size its context imposes (a button sets one for\n * the icons inside it), and failing that 1em, which makes it follow the surrounding\n * text.\n */\n size?: number | string\n /**\n * What the icon means, for screen readers. Leaving it out marks the icon as\n * decorative and hides it from them, which is the right thing whenever the\n * surrounding text already says what it says.\n */\n label?: string\n /** Draws the filled version of the icon. */\n filled?: boolean\n /**\n * Flips the icon horizontally in a right-to-left context, for a glyph that points at a\n * physical direction: a \"previous\" chevron points left in English and right in Arabic. Off by\n * default, since most icons mean the same thing in both directions.\n */\n mirrored?: boolean\n}\n\nconst props = withDefaults(defineProps<IconProps>(), {\n name: undefined,\n render: undefined,\n src: undefined,\n size: undefined,\n label: undefined,\n filled: false,\n mirrored: false,\n})\n\ndefineSlots<{\n /** An inline SVG, used when none of `render`, `src` and `name` was given. */\n default?(): unknown\n}>()\n\n/**\n * The chosen source, labelled with its kind. The public `IconRender` union carries no such\n * label; the consumer writes it by hand and has nothing to tag it with; but the template needs\n * one thing it can branch on reliably, and applying the tag is also where the documented\n * precedence between the shapes gets decided.\n */\ntype Resolved =\n | { kind: 'path'; path: string; viewBox: string }\n | { kind: 'component'; component: Component; props?: Record<string, unknown> }\n | { kind: 'src'; src: string }\n | { kind: 'text'; text: string; class?: string }\n | { kind: 'class'; class: string }\n\nfunction tag(render: IconRender): Resolved {\n if ('path' in render)\n return { kind: 'path', path: render.path, viewBox: render.viewBox ?? ICON_VIEW_BOX }\n if ('component' in render)\n return { kind: 'component', component: render.component, props: render.props }\n if ('src' in render) return { kind: 'src', src: render.src }\n if ('text' in render) return { kind: 'text', text: render.text, class: render.class }\n return { kind: 'class', class: render.class }\n}\n\n/**\n * The icon's identity: the name the resolver is asked for, and the one `data-icon`\n * records whatever the drawing turned out to come from.\n */\nconst iconName = computed(() => nameOf(props.name))\n\n// @fallback\n// Ligature is the last resort, reached when neither the resolver nor the registry recognized\n// the name.\n/**\n * Works out what to draw: an explicit `render` if there is one, then the consumer's resolver,\n * then the icons built into the library. Answering `undefined` here is not a failure; it means\n * the template falls through to the image, the ligature or the slot.\n */\nconst resolved = computed<Resolved | undefined>(() => {\n if (props.render) return tag(props.render)\n // TRUTHINESS on `src`, the test the template renders the image with: an empty `src=\"\"`\n // renders no image, so it must not stop the name from being drawn either.\n if (props.src || props.name === undefined) return undefined\n\n const custom = resolveIcon(iconName.value!, { filled: props.filled })\n if (custom) return tag(custom)\n\n // A bare name has no drawing of its own, so it falls through to the ligature; only\n // one of the library's own icons brings its paths along.\n if (typeof props.name === 'string') return undefined\n\n const { paths } = props.name\n // A second path is only stored when filling actually changes the drawing, so most\n // icons have one path and fall back to it (see the `BuiltinIcon` type).\n const path = (props.filled ? paths[1] : undefined) ?? paths[0]\n return { kind: 'path', path, viewBox: ICON_VIEW_BOX }\n})\n</script>\n\n<template>\n <span\n class=\"v-icon\"\n :style=\"px(size) !== undefined ? { '--vectis-icon-size': px(size) } : undefined\"\n :data-icon=\"iconName\"\n :data-filled=\"filled || undefined\"\n :data-mirror=\"mirrored || undefined\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <template v-if=\"resolved\">\n <svg\n v-if=\"resolved.kind === 'path'\"\n class=\"v-icon-svg\"\n :viewBox=\"resolved.viewBox\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"resolved.path\" />\n </svg>\n <component\n :is=\"resolved.component\"\n v-else-if=\"resolved.kind === 'component'\"\n v-bind=\"resolved.props\"\n />\n <img v-else-if=\"resolved.kind === 'src'\" class=\"v-icon-img\" :src=\"resolved.src\" alt=\"\" />\n <!-- The interpolation is written flush against the tags: a ligature is matched\n on the exact text, and any surrounding whitespace would break it -->\n <span v-else-if=\"resolved.kind === 'text'\" class=\"v-icon-symbol\" :class=\"resolved.class\">{{\n resolved.text\n }}</span>\n <span v-else class=\"v-icon-glyph\" :class=\"resolved.class\" />\n </template>\n <img v-else-if=\"src\" class=\"v-icon-img\" :src=\"src\" alt=\"\" />\n <span v-else-if=\"name\" class=\"v-icon-symbol\">{{ iconName }}</span>\n <slot v-else />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-icon {\n /*\n * How the size is settled, in order of priority: 1. the `size` prop, written inline on the\n * element as --vectis-icon-size; a declaration made on the element itself beats both\n * inheritance and the layer, so it always wins; 2. the variables inherited from an\n * ancestor, which is the context API: a VButton sets them from its own size, and the icons\n * inside follow; 3. 1em, which makes the icon follow the size of the text around it.\n */\n --icon-size: var(--vectis-icon-size, 1em);\n --icon-opsz: var(--vectis-icon-opsz, 24);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /*\n * The box must not read `--icon-size` again: an `em` there resolves against this element's\n * own font-size, already enlarged by the line below, so a context size of 1.5em drew a box\n * of 2.25em around a glyph of 1.5em.\n */\n font-size: var(--icon-size);\n inline-size: 1em;\n block-size: 1em;\n }\n\n /*\n * When the icon font has not loaded, a ligature shows as its own name in plain text. Clipping\n * keeps that text inside the square instead of letting it push the layout apart.\n */\n .v-icon:has(> .v-icon-symbol) {\n overflow: hidden;\n }\n\n .v-icon-symbol {\n /* Declared here and not only under `[data-filled]`: a custom property inherits, so a\n host application setting `--icon-fill` on an ancestor would otherwise fill every\n icon below it. */\n --icon-fill: 0;\n font-family: var(--vectis-font-family-icon);\n font-weight: var(--vectis-font-weight-regular);\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n direction: ltr;\n /*\n * The variable axes of the Material Symbols font. These numbers are the font's own\n * technical contract and not design decisions, which is why they are written literally here\n * rather than taken from tokens; the same tolerance as the opacities.\n */\n font-variation-settings:\n 'FILL' var(--icon-fill),\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' var(--icon-opsz);\n }\n\n .v-icon[data-filled] .v-icon-symbol {\n --icon-fill: 1;\n }\n\n /* `:dir()` reads the direction the browser computed rather than an attribute spelled on\n an ancestor, and `scale` is the individual property, so it composes with a rotation\n a consumer applies (a disclosure chevron) instead of replacing its transform. */\n .v-icon[data-mirror]:dir(rtl) {\n scale: -1 1;\n }\n\n .v-icon-img,\n .v-icon > svg {\n inline-size: 100%;\n block-size: 100%;\n object-fit: contain;\n }\n\n /*\n * Because the design system renders this element itself rather than accepting the usual\n * `<i>`, one rule normalizes it for every such library; `font-style` undoes the italics those\n * conventions carry, and `line-height` stops the inherited line box from pushing the glyph\n * off centre.\n */\n .v-icon-glyph {\n display: block;\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n }\n\n /*\n * The fill is set on OUR class and never on `.v-icon > svg`, so that a multicoloured SVG\n * handed in through the slot keeps its own colours instead of being flattened to the text\n * colour. `display: block` removes the gap an inline element leaves under its baseline.\n */\n .v-icon-svg {\n display: block;\n fill: currentcolor;\n }\n}\n</style>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VIcon.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/VIcon/VIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Resolve icon render, src and name in priority order. Named icons consult the consumer\n * resolver, embedded drawing and ligature fallback; explicit drawing needs no font.\n */\nimport { computed, type Component } from 'vue'\n\nimport { iconName as nameOf } from './iconProps'\nimport { ICON_VIEW_BOX } from './icons/viewBox'\nimport { resolveIcon } from './resolver'\nimport type { BuiltinIcon, IconRender } from './types'\n\nimport { px } from '../../utils/css'\n\ninterface IconProps {\n /** Which icon to draw. */\n name?: string | BuiltinIcon\n /**\n * An explicit description of what to draw (an image, a component, a path, a class), which\n * wins over everything else.\n */\n render?: IconRender\n /** The address of an image to use as the icon. It wins over `name`. */\n src?: string\n /**\n * A size in pixels, as a number or a numeric string. Left out, or given something that\n * is not a number, the icon takes the size its context imposes (a button sets one for\n * the icons inside it), and failing that 1em, which makes it follow the surrounding\n * text.\n */\n size?: number | string\n /**\n * What the icon means, for screen readers. Leaving it out marks the icon as\n * decorative and hides it from them, which is the right thing whenever the\n * surrounding text already says what it says.\n */\n label?: string\n /** Draws the filled version of the icon. */\n filled?: boolean\n /**\n * Flips the icon horizontally in a right-to-left context, for a glyph that points at a\n * physical direction: a \"previous\" chevron points left in English and right in Arabic. Off by\n * default, since most icons mean the same thing in both directions.\n */\n mirrored?: boolean\n}\n\nconst props = withDefaults(defineProps<IconProps>(), {\n name: undefined,\n render: undefined,\n src: undefined,\n size: undefined,\n label: undefined,\n filled: false,\n mirrored: false,\n})\n\ndefineSlots<{\n /** An inline SVG, used when none of `render`, `src` and `name` was given. */\n default?(): unknown\n}>()\n\n/**\n * The chosen source, labelled with its kind. The public `IconRender` union carries no such\n * label; the consumer writes it by hand and has nothing to tag it with; but the template needs\n * one thing it can branch on reliably, and applying the tag is also where the documented\n * precedence between the shapes gets decided.\n */\ntype Resolved =\n | { kind: 'path'; path: string; viewBox: string }\n | { kind: 'component'; component: Component; props?: Record<string, unknown> }\n | { kind: 'src'; src: string }\n | { kind: 'text'; text: string; class?: string }\n | { kind: 'class'; class: string }\n\nfunction tag(render: IconRender): Resolved {\n if ('path' in render)\n return { kind: 'path', path: render.path, viewBox: render.viewBox ?? ICON_VIEW_BOX }\n if ('component' in render)\n return { kind: 'component', component: render.component, props: render.props }\n if ('src' in render) return { kind: 'src', src: render.src }\n if ('text' in render) return { kind: 'text', text: render.text, class: render.class }\n return { kind: 'class', class: render.class }\n}\n\n/**\n * The icon's identity: the name the resolver is asked for, and the one `data-icon`\n * records whatever the drawing turned out to come from.\n */\nconst iconName = computed(() => nameOf(props.name))\n\n// @fallback\n// Ligature is the last resort, reached when neither the resolver nor the registry recognized\n// the name.\n/**\n * Works out what to draw: an explicit `render` if there is one, then the consumer's resolver,\n * then the icons built into the library. Answering `undefined` here is not a failure; it means\n * the template falls through to the image, the ligature or the slot.\n */\nconst resolved = computed<Resolved | undefined>(() => {\n if (props.render) return tag(props.render)\n // TRUTHINESS on `src`, the test the template renders the image with: an empty `src=\"\"`\n // renders no image, so it must not stop the name from being drawn either.\n if (props.src || props.name === undefined) return undefined\n\n const custom = resolveIcon(iconName.value!, { filled: props.filled })\n if (custom) return tag(custom)\n\n // A bare name has no drawing of its own, so it falls through to the ligature; only\n // one of the library's own icons brings its paths along.\n if (typeof props.name === 'string') return undefined\n\n const { paths } = props.name\n // A second path is only stored when filling actually changes the drawing, so most\n // icons have one path and fall back to it (see the `BuiltinIcon` type).\n const path = (props.filled ? paths[1] : undefined) ?? paths[0]\n return { kind: 'path', path, viewBox: ICON_VIEW_BOX }\n})\n</script>\n\n<template>\n <span\n class=\"v-icon\"\n :style=\"px(size) !== undefined ? { '--vectis-icon-size': px(size) } : undefined\"\n :data-icon=\"iconName\"\n :data-filled=\"filled || undefined\"\n :data-mirror=\"mirrored || undefined\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <template v-if=\"resolved\">\n <svg\n v-if=\"resolved.kind === 'path'\"\n class=\"v-icon-svg\"\n :viewBox=\"resolved.viewBox\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"resolved.path\" />\n </svg>\n <component\n :is=\"resolved.component\"\n v-else-if=\"resolved.kind === 'component'\"\n v-bind=\"resolved.props\"\n />\n <img v-else-if=\"resolved.kind === 'src'\" class=\"v-icon-img\" :src=\"resolved.src\" alt=\"\" />\n <!-- The interpolation is written flush against the tags: a ligature is matched\n on the exact text, and any surrounding whitespace would break it -->\n <span v-else-if=\"resolved.kind === 'text'\" class=\"v-icon-symbol\" :class=\"resolved.class\">{{\n resolved.text\n }}</span>\n <span v-else class=\"v-icon-glyph\" :class=\"resolved.class\" />\n </template>\n <img v-else-if=\"src\" class=\"v-icon-img\" :src=\"src\" alt=\"\" />\n <span v-else-if=\"name\" class=\"v-icon-symbol\">{{ iconName }}</span>\n <slot v-else />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-icon {\n /*\n * How the size is settled, in order of priority: 1. the `size` prop, written inline on the\n * element as --vectis-icon-size; a declaration made on the element itself beats both\n * inheritance and the layer, so it always wins; 2. the variables inherited from an\n * ancestor, which is the context API: a VButton sets them from its own size, and the icons\n * inside follow; 3. 1em, which makes the icon follow the size of the text around it.\n */\n --icon-size: var(--vectis-icon-size, 1em);\n --icon-opsz: var(--vectis-icon-opsz, 24);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /*\n * The box must not read `--icon-size` again: an `em` there resolves against this element's\n * own font-size, already enlarged by the line below, so a context size of 1.5em drew a box\n * of 2.25em around a glyph of 1.5em.\n */\n font-size: var(--icon-size);\n inline-size: 1em;\n block-size: 1em;\n }\n\n /*\n * When the icon font has not loaded, a ligature shows as its own name in plain text. Clipping\n * keeps that text inside the square instead of letting it push the layout apart.\n */\n .v-icon:has(> .v-icon-symbol) {\n overflow: hidden;\n }\n\n .v-icon-symbol {\n /* Declared here and not only under `[data-filled]`: a custom property inherits, so a\n host application setting `--icon-fill` on an ancestor would otherwise fill every\n icon below it. */\n --icon-fill: 0;\n font-family: var(--vectis-font-family-icon);\n font-weight: var(--vectis-font-weight-regular);\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n direction: ltr;\n /*\n * The variable axes of the Material Symbols font. These numbers are the font's own\n * technical contract and not design decisions, which is why they are written literally here\n * rather than taken from tokens; the same tolerance as the opacities.\n */\n font-variation-settings:\n 'FILL' var(--icon-fill),\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' var(--icon-opsz);\n }\n\n .v-icon[data-filled] .v-icon-symbol {\n --icon-fill: 1;\n }\n\n /* `:dir()` reads the direction the browser computed rather than an attribute spelled on\n an ancestor, and `scale` is the individual property, so it composes with a rotation\n a consumer applies (a disclosure chevron) instead of replacing its transform. */\n .v-icon[data-mirror]:dir(rtl) {\n scale: -1 1;\n }\n\n .v-icon-img,\n .v-icon > svg {\n inline-size: 100%;\n block-size: 100%;\n object-fit: contain;\n }\n\n /*\n * Because the design system renders this element itself rather than accepting the usual\n * `<i>`, one rule normalizes it for every such library; `font-style` undoes the italics those\n * conventions carry, and `line-height` stops the inherited line box from pushing the glyph\n * off centre.\n */\n .v-icon-glyph {\n display: block;\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n }\n\n /*\n * The fill is set on OUR class and never on `.v-icon > svg`, so that a multicoloured SVG\n * handed in through the slot keeps its own colours instead of being flattened to the text\n * colour. `display: block` removes the gap an inline element leaves under its baseline.\n */\n .v-icon-svg {\n display: block;\n fill: currentcolor;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,IAAM,IAAQ;EA4Bd,SAAS,EAAI,GAA8B;GAOzC,OANI,UAAU,IACL;IAAE,MAAM;IAAQ,MAAM,EAAO;IAAM,SAAS,EAAO,WAAA;GAAyB,IACjF,eAAe,IACV;IAAE,MAAM;IAAa,WAAW,EAAO;IAAW,OAAO,EAAO;GAAM,IAC3E,SAAS,IAAe;IAAE,MAAM;IAAO,KAAK,EAAO;GAAI,IACvD,UAAU,IAAe;IAAE,MAAM;IAAQ,MAAM,EAAO;IAAM,OAAO,EAAO;GAAM,IAC7E;IAAE,MAAM;IAAS,OAAO,EAAO;GAAM;EAC9C;EAMA,IAAM,IAAW,QAAe,EAAO,EAAM,IAAI,CAAC,GAU5C,IAAW,QAAqC;GACpD,IAAI,EAAM,QAAQ,OAAO,EAAI,EAAM,MAAM;GAGzC,IAAI,EAAM,OAAO,EAAM,SAAS,KAAA,GAAW;GAE3C,IAAM,IAAS,EAAY,EAAS,OAAQ,EAAE,QAAQ,EAAM,OAAO,CAAC;GACpE,IAAI,GAAQ,OAAO,EAAI,CAAM;GAI7B,IAAI,OAAO,EAAM,QAAS,UAAU;GAEpC,IAAM,EAAE,aAAU,EAAM;GAIxB,OAAO;IAAE,MAAM;IAAQ,OADT,EAAM,SAAS,EAAM,KAAK,KAAA,MAAc,EAAM;IAC/B,SAAS;GAAc;EACtD,CAAC;yBAIC,EAoCO,QAAA;GAnCL,OAAM;GACL,OAAK,EAAE,EAAA,CAAA,CAAE,CAAC,EAAA,IAAI,MAAM,KAAA,IAAiD,KAAA,IAAxC,EAAA,sBAA2B,EAAA,CAAA,CAAE,CAAC,EAAA,IAAI,EAAA,CAAe;GAC9E,aAAW,EAAA;GACX,eAAa,EAAA,UAAU,KAAA;GACvB,eAAa,EAAA,YAAY,KAAA;GACzB,MAAM,EAAA,QAAK,QAAW,KAAA;GACtB,cAAY,EAAA;GACZ,eAAa,EAAA,QAAQ,KAAA,IAAS;MAEf,EAAA,SAAA,EAAA,GAAhB,EAsBW,GAAA,EAAA,KAAA,EAAA,GAAA,CApBD,EAAA,MAAS,SAAI,UAAA,EAAA,GADrB,EAQM,OAAA;;GANJ,OAAM;GACL,SAAS,EAAA,MAAS;GACnB,eAAY;GACZ,WAAU;MAEV,EAA2B,QAAA,EAApB,GAAG,EAAA,MAAS,KAAA,GAAA,MAAA,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA,KAIR,EAAA,MAAS,SAAI,eAAA,EAAA,GAF1B,EAIE,EAHK,EAAA,MAAS,SAAS,GAAA,EAAA,EAAA,EAAA,KAAA,EAAA,GAEf,EAAA,MAAS,KAAK,CAAA,GAAA,MAAA,EAAA,KAER,EAAA,MAAS,SAAI,SAAA,EAAA,GAA7B,EAAyF,OAAA;;GAAhD,OAAM;GAAc,KAAK,EAAA,MAAS;GAAK,KAAI;oBAGnE,EAAA,MAAS,SAAI,UAAA,EAAA,GAA9B,EAES,QAAA;;GAFkC,OAAK,EAAA,CAAC,iBAAwB,EAAA,MAAS,KAAK,CAAA;OACrF,EAAA,MAAS,IAAI,GAAA,CAAA,MAAA,EAAA,GAEf,EAA4D,QAAA;;GAA/C,OAAK,EAAA,CAAC,gBAAuB,EAAA,MAAS,KAAK,CAAA;wBAE1C,EAAA,OAAA,EAAA,GAAhB,EAA4D,OAAA;;GAAvC,OAAM;GAAc,KAAK,EAAA;GAAK,KAAI;oBACtC,EAAA,QAAA,EAAA,GAAjB,EAAkE,QAAlE,GAAkE,EAAlB,EAAA,KAAQ,GAAA,CAAA,KACxD,EAAe,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,GAAA,IAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"VIcon.vue_vue_type_script_setup_true_lang.js","names":["iconName","nameOf","_openBlock","_createElementBlock","_normalizeStyle","_unref","_Fragment","_createElementVNode","_createBlock","_resolveDynamicComponent","_normalizeProps","_mergeProps","_normalizeClass","_toDisplayString","_renderSlot","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","VIcon_vue_vue_type_script_setup_true_lang_default","props","__props","tag","render","iconName$1","computed","iconName","resolved","custom","resolveIcon","paths","ICON_VIEW_BOX","openBlock","createElementBlock","normalizeStyle","unref","px","Fragment","createElementVNode","createBlock","resolveDynamicComponent","normalizeProps","mergeProps","normalizeClass","toDisplayString","renderSlot","_ctx"],"sources":["../../../src/components/VIcon/VIcon.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Resolve icon render, src and name in priority order. Named icons consult the consumer\n * resolver, embedded drawing and ligature fallback; explicit drawing needs no font.\n */\nimport { computed, type Component } from 'vue'\n\nimport { iconName as nameOf } from './iconProps'\nimport { ICON_VIEW_BOX } from './icons/viewBox'\nimport { resolveIcon } from './resolver'\nimport type { BuiltinIcon, IconRender } from './types'\n\nimport { px } from '../../utils/css'\n\ninterface IconProps {\n /** Which icon to draw. */\n name?: string | BuiltinIcon\n /**\n * An explicit description of what to draw (an image, a component, a path, a class), which\n * wins over everything else.\n */\n render?: IconRender\n /** The address of an image to use as the icon. It wins over `name`. */\n src?: string\n /**\n * A size in pixels, as a number or a numeric string. Left out, or given something that\n * is not a number, the icon takes the size its context imposes (a button sets one for\n * the icons inside it), and failing that 1em, which makes it follow the surrounding\n * text.\n */\n size?: number | string\n /**\n * What the icon means, for screen readers. Leaving it out marks the icon as\n * decorative and hides it from them, which is the right thing whenever the\n * surrounding text already says what it says.\n */\n label?: string\n /** Draws the filled version of the icon. */\n filled?: boolean\n /**\n * Flips the icon horizontally in a right-to-left context, for a glyph that points at a\n * physical direction: a \"previous\" chevron points left in English and right in Arabic. Off by\n * default, since most icons mean the same thing in both directions.\n */\n mirrored?: boolean\n}\n\nconst props = withDefaults(defineProps<IconProps>(), {\n name: undefined,\n render: undefined,\n src: undefined,\n size: undefined,\n label: undefined,\n filled: false,\n mirrored: false,\n})\n\ndefineSlots<{\n /** An inline SVG, used when none of `render`, `src` and `name` was given. */\n default?(): unknown\n}>()\n\n/**\n * The chosen source, labelled with its kind. The public `IconRender` union carries no such\n * label; the consumer writes it by hand and has nothing to tag it with; but the template needs\n * one thing it can branch on reliably, and applying the tag is also where the documented\n * precedence between the shapes gets decided.\n */\ntype Resolved =\n | { kind: 'path'; path: string; viewBox: string }\n | { kind: 'component'; component: Component; props?: Record<string, unknown> }\n | { kind: 'src'; src: string }\n | { kind: 'text'; text: string; class?: string }\n | { kind: 'class'; class: string }\n\nfunction tag(render: IconRender): Resolved {\n if ('path' in render)\n return { kind: 'path', path: render.path, viewBox: render.viewBox ?? ICON_VIEW_BOX }\n if ('component' in render)\n return { kind: 'component', component: render.component, props: render.props }\n if ('src' in render) return { kind: 'src', src: render.src }\n if ('text' in render) return { kind: 'text', text: render.text, class: render.class }\n return { kind: 'class', class: render.class }\n}\n\n/**\n * The icon's identity: the name the resolver is asked for, and the one `data-icon`\n * records whatever the drawing turned out to come from.\n */\nconst iconName = computed(() => nameOf(props.name))\n\n// @fallback\n// Ligature is the last resort, reached when neither the resolver nor the registry recognized\n// the name.\n/**\n * Works out what to draw: an explicit `render` if there is one, then the consumer's resolver,\n * then the icons built into the library. Answering `undefined` here is not a failure; it means\n * the template falls through to the image, the ligature or the slot.\n */\nconst resolved = computed<Resolved | undefined>(() => {\n if (props.render) return tag(props.render)\n // TRUTHINESS on `src`, the test the template renders the image with: an empty `src=\"\"`\n // renders no image, so it must not stop the name from being drawn either.\n if (props.src || props.name === undefined) return undefined\n\n const custom = resolveIcon(iconName.value!, { filled: props.filled })\n if (custom) return tag(custom)\n\n // A bare name has no drawing of its own, so it falls through to the ligature; only\n // one of the library's own icons brings its paths along.\n if (typeof props.name === 'string') return undefined\n\n const { paths } = props.name\n // A second path is only stored when filling actually changes the drawing, so most\n // icons have one path and fall back to it (see the `BuiltinIcon` type).\n const path = (props.filled ? paths[1] : undefined) ?? paths[0]\n return { kind: 'path', path, viewBox: ICON_VIEW_BOX }\n})\n</script>\n\n<template>\n <span\n class=\"v-icon\"\n :style=\"px(size) !== undefined ? { '--vectis-icon-size': px(size) } : undefined\"\n :data-icon=\"iconName\"\n :data-filled=\"filled || undefined\"\n :data-mirror=\"mirrored || undefined\"\n :role=\"label ? 'img' : undefined\"\n :aria-label=\"label\"\n :aria-hidden=\"label ? undefined : 'true'\"\n >\n <template v-if=\"resolved\">\n <svg\n v-if=\"resolved.kind === 'path'\"\n class=\"v-icon-svg\"\n :viewBox=\"resolved.viewBox\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path :d=\"resolved.path\" />\n </svg>\n <component\n :is=\"resolved.component\"\n v-else-if=\"resolved.kind === 'component'\"\n v-bind=\"resolved.props\"\n />\n <img v-else-if=\"resolved.kind === 'src'\" class=\"v-icon-img\" :src=\"resolved.src\" alt=\"\" />\n <!-- The interpolation is written flush against the tags: a ligature is matched\n on the exact text, and any surrounding whitespace would break it -->\n <span v-else-if=\"resolved.kind === 'text'\" class=\"v-icon-symbol\" :class=\"resolved.class\">{{\n resolved.text\n }}</span>\n <span v-else class=\"v-icon-glyph\" :class=\"resolved.class\" />\n </template>\n <img v-else-if=\"src\" class=\"v-icon-img\" :src=\"src\" alt=\"\" />\n <span v-else-if=\"name\" class=\"v-icon-symbol\">{{ iconName }}</span>\n <slot v-else />\n </span>\n</template>\n\n<style>\n@layer vectis.components {\n .v-icon {\n /*\n * How the size is settled, in order of priority: 1. the `size` prop, written inline on the\n * element as --vectis-icon-size; a declaration made on the element itself beats both\n * inheritance and the layer, so it always wins; 2. the variables inherited from an\n * ancestor, which is the context API: a VButton sets them from its own size, and the icons\n * inside follow; 3. 1em, which makes the icon follow the size of the text around it.\n */\n --icon-size: var(--vectis-icon-size, 1em);\n --icon-opsz: var(--vectis-icon-opsz, 24);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /*\n * The box must not read `--icon-size` again: an `em` there resolves against this element's\n * own font-size, already enlarged by the line below, so a context size of 1.5em drew a box\n * of 2.25em around a glyph of 1.5em.\n */\n font-size: var(--icon-size);\n inline-size: 1em;\n block-size: 1em;\n }\n\n /*\n * When the icon font has not loaded, a ligature shows as its own name in plain text. Clipping\n * keeps that text inside the square instead of letting it push the layout apart.\n */\n .v-icon:has(> .v-icon-symbol) {\n overflow: hidden;\n }\n\n .v-icon-symbol {\n /* Declared here and not only under `[data-filled]`: a custom property inherits, so a\n host application setting `--icon-fill` on an ancestor would otherwise fill every\n icon below it. */\n --icon-fill: 0;\n font-family: var(--vectis-font-family-icon);\n font-weight: var(--vectis-font-weight-regular);\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n letter-spacing: normal;\n text-transform: none;\n white-space: nowrap;\n direction: ltr;\n /*\n * The variable axes of the Material Symbols font. These numbers are the font's own\n * technical contract and not design decisions, which is why they are written literally here\n * rather than taken from tokens; the same tolerance as the opacities.\n */\n font-variation-settings:\n 'FILL' var(--icon-fill),\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' var(--icon-opsz);\n }\n\n .v-icon[data-filled] .v-icon-symbol {\n --icon-fill: 1;\n }\n\n /* `:dir()` reads the direction the browser computed rather than an attribute spelled on\n an ancestor, and `scale` is the individual property, so it composes with a rotation\n a consumer applies (a disclosure chevron) instead of replacing its transform. */\n .v-icon[data-mirror]:dir(rtl) {\n scale: -1 1;\n }\n\n .v-icon-img,\n .v-icon > svg {\n inline-size: 100%;\n block-size: 100%;\n object-fit: contain;\n }\n\n /*\n * Because the design system renders this element itself rather than accepting the usual\n * `<i>`, one rule normalizes it for every such library; `font-style` undoes the italics those\n * conventions carry, and `line-height` stops the inherited line box from pushing the glyph\n * off centre.\n */\n .v-icon-glyph {\n display: block;\n font-style: normal;\n line-height: var(--vectis-font-leading-none);\n }\n\n /*\n * The fill is set on OUR class and never on `.v-icon > svg`, so that a multicoloured SVG\n * handed in through the slot keeps its own colours instead of being flattened to the text\n * colour. `display: block` removes the gap an inline element leaves under its baseline.\n */\n .v-icon-svg {\n display: block;\n fill: currentcolor;\n }\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,IAAMsB,IAAQC;EA4Bd,SAASC,EAAI,GAA8B;GAOzC,OANI,UAAUC,IACL;IAAE,MAAM;IAAQ,MAAMA,EAAO;IAAM,SAASA,EAAO,WAAA;GAAyB,IACjF,eAAeA,IACV;IAAE,MAAM;IAAa,WAAWA,EAAO;IAAW,OAAOA,EAAO;GAAM,IAC3E,SAASA,IAAe;IAAE,MAAM;IAAO,KAAKA,EAAO;GAAI,IACvD,UAAUA,IAAe;IAAE,MAAM;IAAQ,MAAMA,EAAO;IAAM,OAAOA,EAAO;GAAM,IAC7E;IAAE,MAAM;IAAS,OAAOA,EAAO;GAAM;EAC9C;EAMA,IAAMzB,IAAW2B,QAAe1B,EAAOqB,EAAM,IAAI,CAAC,GAU5CO,IAAWF,QAAqC;GACpD,IAAIL,EAAM,QAAQ,OAAOE,EAAIF,EAAM,MAAM;GAGzC,IAAIA,EAAM,OAAOA,EAAM,SAAS,KAAA,GAAW;GAE3C,IAAMQ,IAASC,EAAY/B,EAAS,OAAQ,EAAE,QAAQsB,EAAM,OAAO,CAAC;GACpE,IAAIQ,GAAQ,OAAON,EAAIM,CAAM;GAI7B,IAAI,OAAOR,EAAM,QAAS,UAAU;GAEpC,IAAM,EAAE,aAAUA,EAAM;GAIxB,OAAO;IAAE,MAAM;IAAQ,OADTA,EAAM,SAASU,EAAM,KAAK,KAAA,MAAcA,EAAM;IAC/B,SAASC;GAAc;EACtD,CAAC;oBAIC/B,EAAA,GAAAC,EAoCO,QAAA;GAnCL,OAAM;GACL,OAAKC,EAAEC,EAAAiC,CAAA,CAAE,CAACf,EAAA,IAAI,MAAM,KAAA,IAAiD,KAAA,IAAxC,EAAA,sBAA2BlB,EAAAiC,CAAA,CAAE,CAACf,EAAA,IAAI,EAAA,CAAe;GAC9E,aAAWvB,EAAA;GACX,eAAauB,EAAA,UAAU,KAAA;GACvB,eAAaA,EAAA,YAAY,KAAA;GACzB,MAAMA,EAAA,QAAK,QAAW,KAAA;GACtB,cAAYA,EAAA;GACZ,eAAaA,EAAA,QAAQ,KAAA,IAAS;EAEf,GAAA,CAAAM,EAAA,SAAhB3B,EAAA,GAAAC,EAsBWG,GAAA,EAAA,KAAA,EAAA,GAAA,CApBDuB,EAAA,MAAS,SAAI,UADrB3B,EAAA,GAAAC,EAQM,OAAA;;GANJ,OAAM;GACL,SAAS0B,EAAA,MAAS;GACnB,eAAY;GACZ,WAAU;EAEVtB,GAAAA,CAAAA,EAA2B,QAAA,EAApB,GAAGsB,EAAA,MAAS,KAAA,GAAA,MAAA,GAAAZ,CAAA,CAAA,GAAA,GAAAD,CAAA,KAIRa,EAAA,MAAS,SAAI,eAF1B3B,EAAA,GAAAM,EAIEC,EAHKoB,EAAA,MAAS,SAAS,GAAAnB,EAAAC,EAAA,EAAA,KAAA,EAAA,GAEfkB,EAAA,MAAS,KAAK,CAAA,GAAA,MAAA,EAAA,KAERA,EAAA,MAAS,SAAI,SAA7B3B,EAAA,GAAAC,EAAyF,OAAA;;GAAhD,OAAM;GAAc,KAAK0B,EAAA,MAAS;GAAK,KAAI;EAGnE,GAAA,MAAA,GAAAX,CAAA,KAAAW,EAAA,MAAS,SAAI,UAA9B3B,EAAA,GAAAC,EAES,QAAA;;GAFkC,OAAKS,EAAA,CAAC,iBAAwBiB,EAAA,MAAS,KAAK,CAAA;EACrF,GAAAhB,EAAAgB,EAAA,MAAS,IAAI,GAAA,CAAA,MAEf3B,EAAA,GAAAC,EAA4D,QAAA;;GAA/C,OAAKS,EAAA,CAAC,gBAAuBiB,EAAA,MAAS,KAAK,CAAA;EAE1C,GAAA,MAAA,CAAA,EAAA,GAAA,EAAA,KAAAN,EAAA,OAAhBrB,EAAA,GAAAC,EAA4D,OAAA;;GAAvC,OAAM;GAAc,KAAKoB,EAAA;GAAK,KAAI;EACtC,GAAA,MAAA,GAAAJ,CAAA,KAAAI,EAAA,QAAjBrB,EAAA,GAAAC,EAAkE,QAAlEiB,GAAkEP,EAAlBb,EAAA,KAAQ,GAAA,CAAA,KACxDc,EAAekC,EAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,GAAA,IAAAjC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iconProps.js","names":[],"sources":["../../../src/components/VIcon/iconProps.ts"],"sourcesContent":["import type { BuiltinIcon, IconRender, IconSource } from './types'\n\n/**\n * Tells one of the library's own icons from something the consumer described by\n * hand. Only a `BuiltinIcon` carries `paths`, and the distinction matters: it is\n * what routes a built-in default to `name`, where the resolver still gets first\n * refusal, instead of to `render`, which wins outright and would silence it.\n */\nconst isBuiltinIcon = (icon: BuiltinIcon | IconRender): icon is BuiltinIcon => 'paths' in icon\n\n/** Turns what a consumer wrote in an icon prop into the props VIcon expects. */\nexport const iconProps = (icon: IconSource) =>\n typeof icon === 'string' || isBuiltinIcon(icon) ? { name: icon } : { render: icon }\n\n/**\n * A readable name for an icon, used as a last-resort accessible label when the consumer\n * supplied none. It answers `undefined` as soon as the icon was DESCRIBED rather than named (an\n * image, a component, a class), because such a description has no name to give and an\n * `[object Object]` read out by a screen reader would be worse than silence.\n */\nexport const iconName = (icon: IconSource | undefined) =>\n typeof icon === 'string' ? icon : icon && isBuiltinIcon(icon) ? icon.name : undefined\n"],"mappings":";AAQA,
|
|
1
|
+
{"version":3,"file":"iconProps.js","names":["isBuiltinIcon","icon","iconProps","iconName"],"sources":["../../../src/components/VIcon/iconProps.ts"],"sourcesContent":["import type { BuiltinIcon, IconRender, IconSource } from './types'\n\n/**\n * Tells one of the library's own icons from something the consumer described by\n * hand. Only a `BuiltinIcon` carries `paths`, and the distinction matters: it is\n * what routes a built-in default to `name`, where the resolver still gets first\n * refusal, instead of to `render`, which wins outright and would silence it.\n */\nconst isBuiltinIcon = (icon: BuiltinIcon | IconRender): icon is BuiltinIcon => 'paths' in icon\n\n/** Turns what a consumer wrote in an icon prop into the props VIcon expects. */\nexport const iconProps = (icon: IconSource) =>\n typeof icon === 'string' || isBuiltinIcon(icon) ? { name: icon } : { render: icon }\n\n/**\n * A readable name for an icon, used as a last-resort accessible label when the consumer\n * supplied none. It answers `undefined` as soon as the icon was DESCRIBED rather than named (an\n * image, a component, a class), because such a description has no name to give and an\n * `[object Object]` read out by a screen reader would be worse than silence.\n */\nexport const iconName = (icon: IconSource | undefined) =>\n typeof icon === 'string' ? icon : icon && isBuiltinIcon(icon) ? icon.name : undefined\n"],"mappings":";AAQA,IAAMA,KAAiB,MAAwD,WAAWC,GAG7EC,KAAa,MACxB,OAAOD,KAAS,YAAYD,EAAcC,CAAI,IAAI,EAAE,MAAMA,EAAK,IAAI,EAAE,QAAQA,EAAK,GAQvEE,KAAY,MACvB,OAAOF,KAAS,WAAWA,IAAOA,KAAQD,EAAcC,CAAI,IAAIA,EAAK,OAAO,KAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","names":[],"sources":["../../../../src/components/VIcon/icons/add.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `add`. */\nexport const add = {\n name: 'add',\n paths: [\n 'M440-440H240q-17 0-28.5-11.5T200-480q0-17 11.5-28.5T240-520h200v-200q0-17 11.5-28.5T480-760q17 0 28.5 11.5T520-720v200h200q17 0 28.5 11.5T760-480q0 17-11.5 28.5T720-440H520v200q0 17-11.5 28.5T480-200q-17 0-28.5-11.5T440-240v-200Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"add.js","names":["add"],"sources":["../../../../src/components/VIcon/icons/add.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `add`. */\nexport const add = {\n name: 'add',\n paths: [\n 'M440-440H240q-17 0-28.5-11.5T200-480q0-17 11.5-28.5T240-520h200v-200q0-17 11.5-28.5T480-760q17 0 28.5 11.5T520-720v200h200q17 0 28.5 11.5T760-480q0 17-11.5 28.5T720-440H520v200q0 17-11.5 28.5T480-200q-17 0-28.5-11.5T440-240v-200Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAM;CACjB,MAAM;CACN,OAAO,CACL,uOACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_downward.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_downward.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_downward`. */\nexport const arrow_downward = {\n name: 'arrow_downward',\n paths: [\n 'M440-313v-447q0-17 11.5-28.5T480-800q17 0 28.5 11.5T520-760v447l196-196q12-12 28-11.5t28 12.5q11 12 11.5 28T772-452L508-188q-6 6-13 8.5t-15 2.5q-8 0-15-2.5t-13-8.5L188-452q-11-11-11-27.5t11-28.5q12-12 28.5-12t28.5 12l195 195Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_downward.js","names":["arrow_downward"],"sources":["../../../../src/components/VIcon/icons/arrow_downward.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_downward`. */\nexport const arrow_downward = {\n name: 'arrow_downward',\n paths: [\n 'M440-313v-447q0-17 11.5-28.5T480-800q17 0 28.5 11.5T520-760v447l196-196q12-12 28-11.5t28 12.5q11 12 11.5 28T772-452L508-188q-6 6-13 8.5t-15 2.5q-8 0-15-2.5t-13-8.5L188-452q-11-11-11-27.5t11-28.5q12-12 28.5-12t28.5 12l195 195Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAiB;CAC5B,MAAM;CACN,OAAO,CACL,mOACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_downward_alt.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_downward_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_downward_alt`. */\nexport const arrow_downward_alt = {\n name: 'arrow_downward_alt',\n paths: [\n 'M440-392v-328q0-17 11.5-28.5T480-760q17 0 28.5 11.5T520-720v328l116-116q11-11 28-11t28 11q11 11 11 28t-11 28L508-268q-12 12-28 12t-28-12L268-452q-11-11-11-28t11-28q11-11 28-11t28 11l116 116Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_downward_alt.js","names":["arrow_downward_alt"],"sources":["../../../../src/components/VIcon/icons/arrow_downward_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_downward_alt`. */\nexport const arrow_downward_alt = {\n name: 'arrow_downward_alt',\n paths: [\n 'M440-392v-328q0-17 11.5-28.5T480-760q17 0 28.5 11.5T520-720v328l116-116q11-11 28-11t28 11q11 11 11 28t-11 28L508-268q-12 12-28 12t-28-12L268-452q-11-11-11-28t11-28q11-11 28-11t28 11l116 116Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAqB;CAChC,MAAM;CACN,OAAO,CACL,gMACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_drop_down.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_drop_down.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_drop_down`. */\nexport const arrow_drop_down = {\n name: 'arrow_drop_down',\n paths: [\n 'M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_drop_down.js","names":["arrow_drop_down"],"sources":["../../../../src/components/VIcon/icons/arrow_drop_down.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_drop_down`. */\nexport const arrow_drop_down = {\n name: 'arrow_drop_down',\n paths: [\n 'M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAkB;CAC7B,MAAM;CACN,OAAO,CACL,iIACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_drop_up.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_drop_up.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_drop_up`. */\nexport const arrow_drop_up = {\n name: 'arrow_drop_up',\n paths: [\n 'M328-400q-9 0-14.5-6t-5.5-14q0-2 6-14l145-145q5-5 10-7t11-2q6 0 11 2t10 7l145 145q3 3 4.5 6.5t1.5 7.5q0 8-5.5 14t-14.5 6H328Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_drop_up.js","names":["arrow_drop_up"],"sources":["../../../../src/components/VIcon/icons/arrow_drop_up.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_drop_up`. */\nexport const arrow_drop_up = {\n name: 'arrow_drop_up',\n paths: [\n 'M328-400q-9 0-14.5-6t-5.5-14q0-2 6-14l145-145q5-5 10-7t11-2q6 0 11 2t10 7l145 145q3 3 4.5 6.5t1.5 7.5q0 8-5.5 14t-14.5 6H328Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAgB;CAC3B,MAAM;CACN,OAAO,CACL,+HACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_left_alt.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_left_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_left_alt`. */\nexport const arrow_left_alt = {\n name: 'arrow_left_alt',\n paths: [\n 'm314-440 114 114q12 12 11.5 28T428-270q-12 12-28.5 12.5T371-269L188-452q-12-12-12-28t12-28l183-183q12-12 28.5-11.5T428-690q11 12 11.5 28T428-634L314-520h446q17 0 28.5 11.5T800-480q0 17-11.5 28.5T760-440H314Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_left_alt.js","names":["arrow_left_alt"],"sources":["../../../../src/components/VIcon/icons/arrow_left_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_left_alt`. */\nexport const arrow_left_alt = {\n name: 'arrow_left_alt',\n paths: [\n 'm314-440 114 114q12 12 11.5 28T428-270q-12 12-28.5 12.5T371-269L188-452q-12-12-12-28t12-28l183-183q12-12 28.5-11.5T428-690q11 12 11.5 28T428-634L314-520h446q17 0 28.5 11.5T800-480q0 17-11.5 28.5T760-440H314Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAiB;CAC5B,MAAM;CACN,OAAO,CACL,iNACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_right_alt.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_right_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_right_alt`. */\nexport const arrow_right_alt = {\n name: 'arrow_right_alt',\n paths: [\n 'M646-440H200q-17 0-28.5-11.5T160-480q0-17 11.5-28.5T200-520h446L532-634q-12-12-11.5-28t11.5-28q12-12 28.5-12.5T589-691l183 183q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L589-269q-12 12-28.5 11.5T532-270q-11-12-11.5-28t11.5-28l114-114Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_right_alt.js","names":["arrow_right_alt"],"sources":["../../../../src/components/VIcon/icons/arrow_right_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_right_alt`. */\nexport const arrow_right_alt = {\n name: 'arrow_right_alt',\n paths: [\n 'M646-440H200q-17 0-28.5-11.5T160-480q0-17 11.5-28.5T200-520h446L532-634q-12-12-11.5-28t11.5-28q12-12 28.5-12.5T589-691l183 183q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L589-269q-12 12-28.5 11.5T532-270q-11-12-11.5-28t11.5-28l114-114Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAkB;CAC7B,MAAM;CACN,OAAO,CACL,sOACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_upward.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_upward.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_upward`. */\nexport const arrow_upward = {\n name: 'arrow_upward',\n paths: [\n 'M440-647 244-451q-12 12-28 11.5T188-452q-11-12-11.5-28t11.5-28l264-264q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l264 264q11 11 11 27.5T772-452q-12 12-28.5 12T715-452L520-647v447q0 17-11.5 28.5T480-160q-17 0-28.5-11.5T440-200v-447Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_upward.js","names":["arrow_upward"],"sources":["../../../../src/components/VIcon/icons/arrow_upward.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_upward`. */\nexport const arrow_upward = {\n name: 'arrow_upward',\n paths: [\n 'M440-647 244-451q-12 12-28 11.5T188-452q-11-12-11.5-28t11.5-28l264-264q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l264 264q11 11 11 27.5T772-452q-12 12-28.5 12T715-452L520-647v447q0 17-11.5 28.5T480-160q-17 0-28.5-11.5T440-200v-447Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAe;CAC1B,MAAM;CACN,OAAO,CACL,kOACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow_upward_alt.js","names":[],"sources":["../../../../src/components/VIcon/icons/arrow_upward_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_upward_alt`. */\nexport const arrow_upward_alt = {\n name: 'arrow_upward_alt',\n paths: [\n 'M440-608 324-492q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q12-12 28-12t28 12l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L520-608v328q0 17-11.5 28.5T480-240q-17 0-28.5-11.5T440-280v-328Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"arrow_upward_alt.js","names":["arrow_upward_alt"],"sources":["../../../../src/components/VIcon/icons/arrow_upward_alt.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `arrow_upward_alt`. */\nexport const arrow_upward_alt = {\n name: 'arrow_upward_alt',\n paths: [\n 'M440-608 324-492q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q12-12 28-12t28 12l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L520-608v328q0 17-11.5 28.5T480-240q-17 0-28.5-11.5T440-280v-328Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAmB;CAC9B,MAAM;CACN,OAAO,CACL,mMACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach_file.js","names":[],"sources":["../../../../src/components/VIcon/icons/attach_file.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `attach_file`. */\nexport const attach_file = {\n name: 'attach_file',\n paths: [\n 'M720-330q0 104-73 177T470-80q-104 0-177-73t-73-177v-370q0-75 52.5-127.5T400-880q75 0 127.5 52.5T580-700v350q0 46-32 78t-78 32q-46 0-78-32t-32-78v-330q0-17 11.5-28.5T400-720q17 0 28.5 11.5T440-680v330q0 13 8.5 21.5T470-320q13 0 21.5-8.5T500-350v-350q-1-42-29.5-71T400-800q-42 0-71 29t-29 71v370q-1 71 49 120.5T470-160q70 0 119-49.5T640-330v-350q0-17 11.5-28.5T680-720q17 0 28.5 11.5T720-680v350Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"attach_file.js","names":["attach_file"],"sources":["../../../../src/components/VIcon/icons/attach_file.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `attach_file`. */\nexport const attach_file = {\n name: 'attach_file',\n paths: [\n 'M720-330q0 104-73 177T470-80q-104 0-177-73t-73-177v-370q0-75 52.5-127.5T400-880q75 0 127.5 52.5T580-700v350q0 46-32 78t-78 32q-46 0-78-32t-32-78v-330q0-17 11.5-28.5T400-720q17 0 28.5 11.5T440-680v330q0 13 8.5 21.5T470-320q13 0 21.5-8.5T500-350v-350q-1-42-29.5-71T400-800q-42 0-71 29t-29 71v370q-1 71 49 120.5T470-160q70 0 119-49.5T640-330v-350q0-17 11.5-28.5T680-720q17 0 28.5 11.5T720-680v350Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAc;CACzB,MAAM;CACN,OAAO,CACL,4YACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio_file.js","names":[],"sources":["../../../../src/components/VIcon/icons/audio_file.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `audio_file`, outline then filled. */\nexport const audio_file = {\n name: 'audio_file',\n paths: [\n 'M430-200q38 0 64-26t26-64v-150h80q17 0 28.5-11.5T640-480q0-17-11.5-28.5T600-520h-80q-17 0-28.5 11.5T480-480v115q-11-8-23.5-11.5T430-380q-38 0-64 26t-26 64q0 38 26 64t64 26ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560v-160H240v640h480v-440H560q-17 0-28.5-11.5T520-640ZM240-800v200-200 640-640Z',\n 'M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560q0 17 11.5 28.5T560-600h160L520-800v160Zm-90 440q38 0 64-26t26-64v-150h80q17 0 28.5-11.5T640-480q0-17-11.5-28.5T600-520h-80q-17 0-28.5 11.5T480-480v115q-11-8-23.5-11.5T430-380q-38 0-64 26t-26 64q0 38 26 64t64 26Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"audio_file.js","names":["audio_file"],"sources":["../../../../src/components/VIcon/icons/audio_file.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `audio_file`, outline then filled. */\nexport const audio_file = {\n name: 'audio_file',\n paths: [\n 'M430-200q38 0 64-26t26-64v-150h80q17 0 28.5-11.5T640-480q0-17-11.5-28.5T600-520h-80q-17 0-28.5 11.5T480-480v115q-11-8-23.5-11.5T430-380q-38 0-64 26t-26 64q0 38 26 64t64 26ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560v-160H240v640h480v-440H560q-17 0-28.5-11.5T520-640ZM240-800v200-200 640-640Z',\n 'M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560q0 17 11.5 28.5T560-600h160L520-800v160Zm-90 440q38 0 64-26t26-64v-150h80q17 0 28.5-11.5T640-480q0-17-11.5-28.5T600-520h-80q-17 0-28.5 11.5T480-480v115q-11-8-23.5-11.5T430-380q-38 0-64 26t-26 64q0 38 26 64t64 26Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAa;CACxB,MAAM;CACN,OAAO,CACL,mZACA,6WACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar_today.js","names":[],"sources":["../../../../src/components/VIcon/icons/calendar_today.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `calendar_today`, outline then filled. */\nexport const calendar_today = {\n name: 'calendar_today',\n paths: [\n 'M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-40q0-17 11.5-28.5T280-880q17 0 28.5 11.5T320-840v40h320v-40q0-17 11.5-28.5T680-880q17 0 28.5 11.5T720-840v40h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Z',\n 'M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-40q0-17 11.5-28.5T280-880q17 0 28.5 11.5T320-840v40h320v-40q0-17 11.5-28.5T680-880q17 0 28.5 11.5T720-840v40h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"calendar_today.js","names":["calendar_today"],"sources":["../../../../src/components/VIcon/icons/calendar_today.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `calendar_today`, outline then filled. */\nexport const calendar_today = {\n name: 'calendar_today',\n paths: [\n 'M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-40q0-17 11.5-28.5T280-880q17 0 28.5 11.5T320-840v40h320v-40q0-17 11.5-28.5T680-880q17 0 28.5 11.5T720-840v40h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Zm0-480h560v-80H200v80Zm0 0v-80 80Z',\n 'M200-80q-33 0-56.5-23.5T120-160v-560q0-33 23.5-56.5T200-800h40v-40q0-17 11.5-28.5T280-880q17 0 28.5 11.5T320-840v40h320v-40q0-17 11.5-28.5T680-880q17 0 28.5 11.5T720-840v40h40q33 0 56.5 23.5T840-720v560q0 33-23.5 56.5T760-80H200Zm0-80h560v-400H200v400Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAiB;CAC5B,MAAM;CACN,OAAO,CACL,kSACA,8PACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","names":[],"sources":["../../../../src/components/VIcon/icons/check.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `check`. */\nexport const check = {\n name: 'check',\n paths: [\n 'm382-354 339-339q12-12 28-12t28 12q12 12 12 28.5T777-636L410-268q-12 12-28 12t-28-12L182-440q-12-12-11.5-28.5T183-497q12-12 28.5-12t28.5 12l142 143Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"check.js","names":["check"],"sources":["../../../../src/components/VIcon/icons/check.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `check`. */\nexport const check = {\n name: 'check',\n paths: [\n 'm382-354 339-339q12-12 28-12t28 12q12 12 12 28.5T777-636L410-268q-12 12-28 12t-28-12L182-440q-12-12-11.5-28.5T183-497q12-12 28.5-12t28.5 12l142 143Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAQ;CACnB,MAAM;CACN,OAAO,CACL,sJACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check_circle.js","names":[],"sources":["../../../../src/components/VIcon/icons/check_circle.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `check_circle`, outline then filled. */\nexport const check_circle = {\n name: 'check_circle',\n paths: [\n 'm424-408-86-86q-11-11-28-11t-28 11q-11 11-11 28t11 28l114 114q12 12 28 12t28-12l226-226q11-11 11-28t-11-28q-11-11-28-11t-28 11L424-408Zm56 328q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z',\n 'm424-408-86-86q-11-11-28-11t-28 11q-11 11-11 28t11 28l114 114q12 12 28 12t28-12l226-226q11-11 11-28t-11-28q-11-11-28-11t-28 11L424-408Zm56 328q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"check_circle.js","names":["check_circle"],"sources":["../../../../src/components/VIcon/icons/check_circle.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `check_circle`, outline then filled. */\nexport const check_circle = {\n name: 'check_circle',\n paths: [\n 'm424-408-86-86q-11-11-28-11t-28 11q-11 11-11 28t11 28l114 114q12 12 28 12t28-12l226-226q11-11 11-28t-11-28q-11-11-28-11t-28 11L424-408Zm56 328q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z',\n 'm424-408-86-86q-11-11-28-11t-28 11q-11 11-11 28t11 28l114 114q12 12 28 12t28-12l226-226q11-11 11-28t-11-28q-11-11-28-11t-28 11L424-408Zm56 328q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAe;CAC1B,MAAM;CACN,OAAO,CACL,waACA,sUACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chevron_left.js","names":[],"sources":["../../../../src/components/VIcon/icons/chevron_left.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `chevron_left`. */\nexport const chevron_left = {\n name: 'chevron_left',\n paths: [\n 'm432-480 156 156q11 11 11 28t-11 28q-11 11-28 11t-28-11L348-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l184-184q11-11 28-11t28 11q11 11 11 28t-11 28L432-480Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"chevron_left.js","names":["chevron_left"],"sources":["../../../../src/components/VIcon/icons/chevron_left.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `chevron_left`. */\nexport const chevron_left = {\n name: 'chevron_left',\n paths: [\n 'm432-480 156 156q11 11 11 28t-11 28q-11 11-28 11t-28-11L348-452q-6-6-8.5-13t-2.5-15q0-8 2.5-15t8.5-13l184-184q11-11 28-11t28 11q11 11 11 28t-11 28L432-480Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAe;CAC1B,MAAM;CACN,OAAO,CACL,6JACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chevron_right.js","names":[],"sources":["../../../../src/components/VIcon/icons/chevron_right.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `chevron_right`. */\nexport const chevron_right = {\n name: 'chevron_right',\n paths: [\n 'M504-480 348-636q-11-11-11-28t11-28q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L404-268q-11 11-28 11t-28-11q-11-11-11-28t11-28l156-156Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"chevron_right.js","names":["chevron_right"],"sources":["../../../../src/components/VIcon/icons/chevron_right.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `chevron_right`. */\nexport const chevron_right = {\n name: 'chevron_right',\n paths: [\n 'M504-480 348-636q-11-11-11-28t11-28q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L404-268q-11 11-28 11t-28-11q-11-11-11-28t11-28l156-156Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAgB;CAC3B,MAAM;CACN,OAAO,CACL,4JACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close.js","names":[],"sources":["../../../../src/components/VIcon/icons/close.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `close`. */\nexport const close = {\n name: 'close',\n paths: [\n 'M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"close.js","names":["close"],"sources":["../../../../src/components/VIcon/icons/close.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `close`. */\nexport const close = {\n name: 'close',\n paths: [\n 'M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAQ;CACnB,MAAM;CACN,OAAO,CACL,mOACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud_upload.js","names":[],"sources":["../../../../src/components/VIcon/icons/cloud_upload.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `cloud_upload`, outline then filled. */\nexport const cloud_upload = {\n name: 'cloud_upload',\n paths: [\n 'm440-446-36 35q-11 11-27.5 11T348-412q-11-11-11-28t11-28l104-104q12-12 28-12t28 12l104 104q11 11 11.5 27.5T612-412q-11 11-27.5 11.5T556-411l-36-35v206h220q42 0 71-29t29-71q0-42-29-71t-71-29h-60v-80q0-83-58.5-141.5T480-720q-83 0-141.5 58.5T280-520h-20q-58 0-99 41t-41 99q0 58 41 99t99 41h60q17 0 28.5 11.5T360-200q0 17-11.5 28.5T320-160h-60q-91 0-155.5-63T40-377q0-78 47-139t123-78q25-92 100-149t170-57q117 0 198.5 81.5T760-520q69 8 114.5 59.5T920-340q0 75-52.5 127.5T740-160H520q-33 0-56.5-23.5T440-240v-206Zm40 6Z',\n 'M260-160q-91 0-155.5-63T40-377q0-78 47-139t123-78q25-92 100-149t170-57q117 0 198.5 81.5T760-520q69 8 114.5 59.5T920-340q0 75-52.5 127.5T740-160H520v-286l36 35q11 11 27.5 11t28.5-12q11-11 11-28t-11-28L508-572q-12-12-28-12t-28 12L348-468q-11 11-11.5 27.5T348-412q11 11 27.5 11.5T404-411l36-35v286H260Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"cloud_upload.js","names":["cloud_upload"],"sources":["../../../../src/components/VIcon/icons/cloud_upload.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `cloud_upload`, outline then filled. */\nexport const cloud_upload = {\n name: 'cloud_upload',\n paths: [\n 'm440-446-36 35q-11 11-27.5 11T348-412q-11-11-11-28t11-28l104-104q12-12 28-12t28 12l104 104q11 11 11.5 27.5T612-412q-11 11-27.5 11.5T556-411l-36-35v206h220q42 0 71-29t29-71q0-42-29-71t-71-29h-60v-80q0-83-58.5-141.5T480-720q-83 0-141.5 58.5T280-520h-20q-58 0-99 41t-41 99q0 58 41 99t99 41h60q17 0 28.5 11.5T360-200q0 17-11.5 28.5T320-160h-60q-91 0-155.5-63T40-377q0-78 47-139t123-78q25-92 100-149t170-57q117 0 198.5 81.5T760-520q69 8 114.5 59.5T920-340q0 75-52.5 127.5T740-160H520q-33 0-56.5-23.5T440-240v-206Zm40 6Z',\n 'M260-160q-91 0-155.5-63T40-377q0-78 47-139t123-78q25-92 100-149t170-57q117 0 198.5 81.5T760-520q69 8 114.5 59.5T920-340q0 75-52.5 127.5T740-160H520v-286l36 35q11 11 27.5 11t28.5-12q11-11 11-28t-11-28L508-572q-12-12-28-12t-28 12L348-468q-11 11-11.5 27.5T348-412q11 11 27.5 11.5T404-411l36-35v286H260Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAe;CAC1B,MAAM;CACN,OAAO,CACL,sgBACA,6SACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.js","names":[],"sources":["../../../../src/components/VIcon/icons/code.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `code`. */\nexport const code = {\n name: 'code',\n paths: [\n 'm193-479 155 155q11 11 11 28t-11 28q-11 11-28 11t-28-11L108-452q-6-6-8.5-13T97-480q0-8 2.5-15t8.5-13l184-184q12-12 28.5-12t28.5 12q12 12 12 28.5T349-635L193-479Zm574-2L612-636q-11-11-11-28t11-28q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L668-268q-12 12-28 11.5T612-269q-12-12-12-28.5t12-28.5l155-155Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"code.js","names":["code"],"sources":["../../../../src/components/VIcon/icons/code.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `code`. */\nexport const code = {\n name: 'code',\n paths: [\n 'm193-479 155 155q11 11 11 28t-11 28q-11 11-28 11t-28-11L108-452q-6-6-8.5-13T97-480q0-8 2.5-15t8.5-13l184-184q12-12 28.5-12t28.5 12q12 12 12 28.5T349-635L193-479Zm574-2L612-636q-11-11-11-28t11-28q11-11 28-11t28 11l184 184q6 6 8.5 13t2.5 15q0 8-2.5 15t-8.5 13L668-268q-12 12-28 11.5T612-269q-12-12-12-28.5t12-28.5l155-155Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAO;CAClB,MAAM;CACN,OAAO,CACL,kUACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colorize.js","names":[],"sources":["../../../../src/components/VIcon/icons/colorize.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `colorize`, outline then filled. */\nexport const colorize = {\n name: 'colorize',\n paths: [\n 'M120-160v-117q0-16 6-30.5t17-25.5l335-335-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-335 335q-11 11-25.5 17t-30.5 6H160q-17 0-28.5-11.5T120-160Zm80-40h78l332-334-76-76-334 332v78Zm447-410 96-96-37-37-96 96 37 37Zm0 0-37-37 37 37Z',\n 'M120-160v-117q0-16 6-30.5t17-25.5l335-335-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-335 335q-11 11-25.5 17t-30.5 6H160q-17 0-28.5-11.5T120-160Zm80-40h78l332-334-76-76-334 332v78Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"colorize.js","names":["colorize"],"sources":["../../../../src/components/VIcon/icons/colorize.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `colorize`, outline then filled. */\nexport const colorize = {\n name: 'colorize',\n paths: [\n 'M120-160v-117q0-16 6-30.5t17-25.5l335-335-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-335 335q-11 11-25.5 17t-30.5 6H160q-17 0-28.5-11.5T120-160Zm80-40h78l332-334-76-76-334 332v78Zm447-410 96-96-37-37-96 96 37 37Zm0 0-37-37 37 37Z',\n 'M120-160v-117q0-16 6-30.5t17-25.5l335-335-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-335 335q-11 11-25.5 17t-30.5 6H160q-17 0-28.5-11.5T120-160Zm80-40h78l332-334-76-76-334 332v78Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAW;CACtB,MAAM;CACN,OAAO,CACL,yTACA,qQACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"description.js","names":[],"sources":["../../../../src/components/VIcon/icons/description.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `description`, outline then filled. */\nexport const description = {\n name: 'description',\n paths: [\n 'M360-240h240q17 0 28.5-11.5T640-280q0-17-11.5-28.5T600-320H360q-17 0-28.5 11.5T320-280q0 17 11.5 28.5T360-240Zm0-160h240q17 0 28.5-11.5T640-440q0-17-11.5-28.5T600-480H360q-17 0-28.5 11.5T320-440q0 17 11.5 28.5T360-400ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560v-160H240v640h480v-440H560q-17 0-28.5-11.5T520-640ZM240-800v200-200 640-640Z',\n 'M360-240h240q17 0 28.5-11.5T640-280q0-17-11.5-28.5T600-320H360q-17 0-28.5 11.5T320-280q0 17 11.5 28.5T360-240Zm0-160h240q17 0 28.5-11.5T640-440q0-17-11.5-28.5T600-480H360q-17 0-28.5 11.5T320-440q0 17 11.5 28.5T360-400ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560q0 17 11.5 28.5T560-600h160L520-800v160Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"description.js","names":["description"],"sources":["../../../../src/components/VIcon/icons/description.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `description`, outline then filled. */\nexport const description = {\n name: 'description',\n paths: [\n 'M360-240h240q17 0 28.5-11.5T640-280q0-17-11.5-28.5T600-320H360q-17 0-28.5 11.5T320-280q0 17 11.5 28.5T360-240Zm0-160h240q17 0 28.5-11.5T640-440q0-17-11.5-28.5T600-480H360q-17 0-28.5 11.5T320-440q0 17 11.5 28.5T360-400ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560v-160H240v640h480v-440H560q-17 0-28.5-11.5T520-640ZM240-800v200-200 640-640Z',\n 'M360-240h240q17 0 28.5-11.5T640-280q0-17-11.5-28.5T600-320H360q-17 0-28.5 11.5T320-280q0 17 11.5 28.5T360-240Zm0-160h240q17 0 28.5-11.5T640-440q0-17-11.5-28.5T600-480H360q-17 0-28.5 11.5T320-440q0 17 11.5 28.5T360-400ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560q0 17 11.5 28.5T560-600h160L520-800v160Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAc;CACzB,MAAM;CACN,OAAO,CACL,icACA,2ZACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","names":[],"sources":["../../../../src/components/VIcon/icons/error.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `error`, outline then filled. */\nexport const error = {\n name: 'error',\n paths: [\n 'M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z',\n 'M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"error.js","names":["error"],"sources":["../../../../src/components/VIcon/icons/error.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `error`, outline then filled. */\nexport const error = {\n name: 'error',\n paths: [\n 'M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z',\n 'M480-280q17 0 28.5-11.5T520-320q0-17-11.5-28.5T480-360q-17 0-28.5 11.5T440-320q0 17 11.5 28.5T480-280Zm0-160q17 0 28.5-11.5T520-480v-160q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640v160q0 17 11.5 28.5T480-440Zm0 360q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAQ;CACnB,MAAM;CACN,OAAO,CACL,mfACA,iZACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand_less.js","names":[],"sources":["../../../../src/components/VIcon/icons/expand_less.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `expand_less`. */\nexport const expand_less = {\n name: 'expand_less',\n paths: [\n 'M480-529 324-373q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-529Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"expand_less.js","names":["expand_less"],"sources":["../../../../src/components/VIcon/icons/expand_less.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `expand_less`. */\nexport const expand_less = {\n name: 'expand_less',\n paths: [\n 'M480-529 324-373q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-529Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAc;CACzB,MAAM;CACN,OAAO,CACL,6JACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand_more.js","names":[],"sources":["../../../../src/components/VIcon/icons/expand_more.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `expand_more`. */\nexport const expand_more = {\n name: 'expand_more',\n paths: [\n 'M480-362q-8 0-15-2.5t-13-8.5L268-557q-11-11-11-28t11-28q11-11 28-11t28 11l156 156 156-156q11-11 28-11t28 11q11 11 11 28t-11 28L508-373q-6 6-13 8.5t-15 2.5Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,
|
|
1
|
+
{"version":3,"file":"expand_more.js","names":["expand_more"],"sources":["../../../../src/components/VIcon/icons/expand_more.ts"],"sourcesContent":["/*\n * GENERATED FILE — do not edit by hand.\n * Regenerate: pnpm icons · Source: scripts/build-icons.ts\n *\n * Material Symbols Rounded (wght 400 · GRAD 0 · opsz 24)\n * google/material-design-icons @ 528cb964c01fb2b09bc3b9208f82b6d8f8c1c1e2\n * Apache-2.0 licence © Google.\n */\nimport type { BuiltinIcon } from '../types'\n\n/** Material Symbols Rounded `expand_more`. */\nexport const expand_more = {\n name: 'expand_more',\n paths: [\n 'M480-362q-8 0-15-2.5t-13-8.5L268-557q-11-11-11-28t11-28q11-11 28-11t28 11l156 156 156-156q11-11 28-11t28 11q11 11 11 28t-11 28L508-373q-6 6-13 8.5t-15 2.5Z',\n ],\n} as const satisfies BuiltinIcon\n"],"mappings":";AAWA,IAAaA,IAAc;CACzB,MAAM;CACN,OAAO,CACL,6JACF;AACF"}
|