@rotki/ui-library 2.20.2 → 2.22.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/__test__/options.d.ts +7 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/avatar-props.js +1 -1
- package/dist/components/avatars/avatar-props.js.map +1 -1
- package/dist/components/avatars/use-avatar-group.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +2 -2
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button/button-props.js.map +1 -1
- package/dist/components/buttons/button/button-styles.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +6 -4
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/state.js.map +1 -1
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/chip-props.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/utils.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +5 -3
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
- package/dist/components/date-time-picker/dayjs-setup.js.map +1 -1
- package/dist/components/date-time-picker/segment-config.js.map +1 -1
- package/dist/components/date-time-picker/segment-utils.js.map +1 -1
- package/dist/components/date-time-picker/timezones.js.map +1 -1
- package/dist/components/date-time-picker/types.js +1 -1
- package/dist/components/date-time-picker/types.js.map +1 -1
- package/dist/components/date-time-picker/use-date-time-selection.js +2 -2
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-input-handler.js.map +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
- package/dist/components/date-time-picker/utils.js.map +1 -1
- package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +26 -2
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +150 -54
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.js +7 -0
- package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -0
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +134 -0
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +561 -0
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/category-picker/category-picker-styles.d.ts +432 -0
- package/dist/components/forms/category-picker/category-picker-styles.js +59 -0
- package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -0
- package/dist/components/forms/check-control-styles.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/checkbox/checkbox-group/context.js.map +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.js +7 -0
- package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -0
- package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +61 -0
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +269 -0
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +9 -3
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/menu-select-styles.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/slider/slider-styles.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
- package/dist/components/forms/text-input-styles.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/components/index.js +4 -2
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/skeleton-type.js.map +1 -1
- package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/logos/use-logo-sources.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/badge/badge-props.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +6 -0
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/progress/progress-props.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/footer-stepper-variant.js.map +1 -1
- package/dist/components/tables/RuiDataTable.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +23 -2
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +186 -217
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableHead.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue.d.ts +11 -1
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.vue.d.ts +5 -0
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +24 -8
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableBody.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +55 -0
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableCell.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +30 -0
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +54 -0
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue.d.ts +19 -0
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js +43 -0
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue.d.ts +26 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue.d.ts +32 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +85 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue.d.ts +3 -0
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js +26 -0
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +33 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +101 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +31 -0
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +142 -0
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/context.d.ts +73 -0
- package/dist/components/tables/data-table/context.js +100 -0
- package/dist/components/tables/data-table/context.js.map +1 -0
- package/dist/components/tables/data-table-styles.d.ts +30 -1
- package/dist/components/tables/data-table-styles.js +9 -2
- package/dist/components/tables/data-table-styles.js.map +1 -1
- package/dist/components/tables/table-props.d.ts +5 -0
- package/dist/components/tables/table-props.js +5 -1
- package/dist/components/tables/table-props.js.map +1 -1
- package/dist/components/tables/use-pagination-navigation.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab/use-tab-link.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-props.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs/use-tab-routing.js +1 -1
- package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
- package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/time-picker/time-picker-styles.js.map +1 -1
- package/dist/composables/breakpoint.js.map +1 -1
- package/dist/composables/defaults/table.d.ts +12 -0
- package/dist/composables/defaults/table.js.map +1 -1
- package/dist/composables/dropdown-menu.d.ts +12 -1
- package/dist/composables/dropdown-menu.js +46 -7
- package/dist/composables/dropdown-menu.js.map +1 -1
- package/dist/composables/floating.js +1 -1
- package/dist/composables/floating.js.map +1 -1
- package/dist/composables/forms/auto-complete/focus.js.map +1 -1
- package/dist/composables/forms/auto-complete/index.js +5 -4
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.d.ts +6 -1
- package/dist/composables/forms/auto-complete/search.js +12 -1
- package/dist/composables/forms/auto-complete/search.js.map +1 -1
- package/dist/composables/forms/auto-complete/value.js.map +1 -1
- package/dist/composables/forms/category-picker/use-category-picker.d.ts +76 -0
- package/dist/composables/forms/category-picker/use-category-picker.js +141 -0
- package/dist/composables/forms/category-picker/use-category-picker.js.map +1 -0
- package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
- package/dist/composables/icons.js.map +1 -1
- package/dist/composables/popper.js.map +1 -1
- package/dist/composables/sticky-header.js.map +1 -1
- package/dist/composables/tables/data-table/columns.d.ts +7 -1
- package/dist/composables/tables/data-table/columns.js +18 -10
- package/dist/composables/tables/data-table/columns.js.map +1 -1
- package/dist/composables/tables/data-table/expansion.js.map +1 -1
- package/dist/composables/tables/data-table/grouping.d.ts +4 -6
- package/dist/composables/tables/data-table/grouping.js +38 -24
- package/dist/composables/tables/data-table/grouping.js.map +1 -1
- package/dist/composables/tables/data-table/pagination.d.ts +4 -4
- package/dist/composables/tables/data-table/pagination.js +63 -21
- package/dist/composables/tables/data-table/pagination.js.map +1 -1
- package/dist/composables/tables/data-table/selection.js +16 -6
- package/dist/composables/tables/data-table/selection.js.map +1 -1
- package/dist/composables/tables/data-table/sort.d.ts +4 -3
- package/dist/composables/tables/data-table/sort.js +78 -40
- package/dist/composables/tables/data-table/sort.js.map +1 -1
- package/dist/composables/tables/data-table/types.d.ts +3 -1
- package/dist/composables/tables/data-table/types.js +6 -2
- package/dist/composables/tables/data-table/types.js.map +1 -1
- package/dist/composables/theme.js.map +1 -1
- package/dist/composables/timeout-manager.js.map +1 -1
- package/dist/composables/use-rui-i18n.js.map +1 -1
- package/dist/consts/colors.js.map +1 -1
- package/dist/consts/time-accuracy.js.map +1 -1
- package/dist/i18n/keys.js.map +1 -1
- package/dist/icons/icons_1.d.ts +12 -12
- package/dist/icons/icons_1.js +140 -157
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +13 -13
- package/dist/icons/icons_2.js +128 -149
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +18 -18
- package/dist/icons/icons_3.js +244 -282
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +251 -6
- package/dist/icons/icons_4.js +3016 -75
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/icons_5.d.ts +20 -0
- package/dist/icons/icons_5.js +221 -0
- package/dist/icons/icons_5.js.map +1 -0
- package/dist/icons/index.d.ts +2 -1
- package/dist/icons/index.js +297 -32
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/library-icons.json +3 -0
- package/dist/style.css +200 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/types/stepper.js.map +1 -1
- package/dist/types/theme.js.map +1 -1
- package/dist/utils/assert.js.map +1 -1
- package/dist/utils/blockie.js.map +1 -1
- package/dist/utils/form-text-detail.js.map +1 -1
- package/dist/utils/helpers.d.ts +4 -0
- package/dist/utils/helpers.js +21 -1
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/is-equal.js.map +1 -1
- package/dist/utils/tv.js.map +1 -1
- package/dist/vite-plugin/index.js +6 -5
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/scanner.d.ts +1 -1
- package/dist/vite-plugin/scanner.js +10 -7
- package/dist/vite-plugin/scanner.js.map +1 -1
- package/dist/vite-plugin/types.d.ts +9 -0
- package/dist/web-types.json +2283 -1088
- package/package.json +35 -35
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Format number value without fraction\n * @param {number} amount\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * Generates and returns the array of root allowed attributes\n * @param {SetupContextAttrs} data\n * @returns {SetupContextAttrsKeys}\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks only required attributes for root element\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} include\n * @returns {Pick<SetupContextAttrs, any>}\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Omits root attributes from component's attributes\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} exclude\n * @returns {Omit<SetupContextAttrs, any>}\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Transforms the keys of an object to either camelCase or snake_case\n * @param {T} item\n * @param {\"camelCase\" | \"snake_case\"} to\n * @returns {Record<string, any>}\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n *\n * @param {string} string - String to convert\n * @return {string} - String converted to text token, mostly used to matching keyword\n * @example\n * getTextToken('this is a sentence'); // thisisasentence\n */\n\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;
|
|
1
|
+
{"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Format number value without fraction\n * @param {number} amount\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * Generates and returns the array of root allowed attributes\n * @param {SetupContextAttrs} data\n * @returns {SetupContextAttrsKeys}\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks only required attributes for root element\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} include\n * @returns {Pick<SetupContextAttrs, any>}\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Omits root attributes from component's attributes\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} exclude\n * @returns {Omit<SetupContextAttrs, any>}\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Transforms the keys of an object to either camelCase or snake_case\n * @param {T} item\n * @param {\"camelCase\" | \"snake_case\"} to\n * @returns {Record<string, any>}\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n *\n * @param {string} string - String to convert\n * @return {string} - String converted to text token, mostly used to matching keyword\n * @example\n * getTextToken('this is a sentence'); // thisisasentence\n */\n\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n\n/**\n * Formats a byte count into a human-readable string (e.g. \"1.2 MB\").\n */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0)\n return '0 B';\n if (bytes < 1024)\n return `${bytes} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;CACR,OAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,uBAAuB;EACvB,uBAAuB;CACzB,CAAC,CAAC,CAAC,OAAO,OAAO,MAAM,CAAC;AAC1B;;;;;AAMA,SAAgB,cAAc,QAAiC;CAC7D,OAAO,aAAa,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AACnD;;;;;;AAOA,SAAS,YAAY,MAAgD;CACnE,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QAAO,QAAO,IAAI,WAAW,OAAO,CAAC;AAChE;;;;;;;AAQA,SAAgB,aAAa,MAAyB,UAAiC,CAAC,OAAO,GAAG;CAChG,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;AAQA,SAAgB,gBACd,MACA,UAAiC,CAAC,OAAO,GACzC;CACA,OAAO,WAAW,MAAM,CAAC,GAAG,YAAY,IAAI,GAAG,GAAG,OAAO,CAAC;AAC5D;;;;;;;AAQA,SAAgB,cACd,MACA,IAC4B;CAC5B,IAAI,CAAC,MACH,OAAO;CAET,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,QACtB,KAAK,SAAS;EACb,IAAI,OAAO,aACT,IAAI,UAAU,IAAI,KAAK,KAAK;OACzB,IAAI,UAAU,IAAI,KAAK,KAAK;EAEjC,OAAO;CACT,GACA,CAAC,CACH;AACF;;;;;;;;AAUA,SAAgB,aAAa,QAAyB;CACpD,IAAI,CAAC,QACH,OAAO;CAET,OAAO,OACJ,SAAS,CAAC,CACV,YAAY,CAAC,CACb,QAAQ,cAAc,EAAE;AAC7B;AAEA,SAAgB,mBAAmB,OAA6C;CAC9E,IAAI,UAAU,KAAA,KAAc,OAAO,UAAU,YAAY,MAAM,OAAO,KAAK,CAAC,GAC1E,OAAO;CACT,OAAO,GAAG,MAAM;AAClB;;;;AAKA,SAAgB,eAAe,OAAuB;CACpD,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACrC,OAAO;CACT,IAAI,QAAQ,MACV,OAAO,GAAG,MAAM;CAClB,MAAM,QAAQ;EAAC;EAAM;EAAM;EAAM;CAAI;CACrC,IAAI,QAAQ,QAAQ;CACpB,IAAI,YAAY;CAChB,OAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;EACpD,SAAS;EACT;CACF;CACA,OAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC,EAAE,GAAG,MAAM;AACxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-equal.js","names":[],"sources":["../../src/utils/is-equal.ts"],"sourcesContent":["export function isEqual(value: unknown, other: unknown): boolean {\n // Check if the values are identical (covers primitives and functions)\n if (value === other)\n return true;\n\n // Check if the values are null or undefined\n if (value == null || other == null)\n return value === other;\n\n // Check if the values are of different types\n if (typeof value !== typeof other)\n return false;\n\n // Compare arrays\n if (Array.isArray(value)) {\n if (!Array.isArray(other) || value.length !== other.length)\n return false;\n\n for (const [i, element] of value.entries()) {\n if (!isEqual(element, other[i]))\n return false;\n }\n return true;\n }\n\n // Compare objects\n if (typeof value === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const otherRecord = other as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const otherKeys = Object.keys(otherRecord);\n\n if (valueKeys.length !== otherKeys.length)\n return false;\n\n for (const key of valueKeys) {\n if (!isEqual(valueRecord[key], otherRecord[key]))\n return false;\n }\n return true;\n }\n\n // If the values are neither primitives, arrays, nor objects, return false\n return false;\n}\n"],"mappings":";AAAA,SAAgB,QAAQ,OAAgB,OAAyB;
|
|
1
|
+
{"version":3,"file":"is-equal.js","names":[],"sources":["../../src/utils/is-equal.ts"],"sourcesContent":["export function isEqual(value: unknown, other: unknown): boolean {\n // Check if the values are identical (covers primitives and functions)\n if (value === other)\n return true;\n\n // Check if the values are null or undefined\n if (value == null || other == null)\n return value === other;\n\n // Check if the values are of different types\n if (typeof value !== typeof other)\n return false;\n\n // Compare arrays\n if (Array.isArray(value)) {\n if (!Array.isArray(other) || value.length !== other.length)\n return false;\n\n for (const [i, element] of value.entries()) {\n if (!isEqual(element, other[i]))\n return false;\n }\n return true;\n }\n\n // Compare objects\n if (typeof value === 'object') {\n const valueRecord = value as Record<string, unknown>;\n const otherRecord = other as Record<string, unknown>;\n const valueKeys = Object.keys(valueRecord);\n const otherKeys = Object.keys(otherRecord);\n\n if (valueKeys.length !== otherKeys.length)\n return false;\n\n for (const key of valueKeys) {\n if (!isEqual(valueRecord[key], otherRecord[key]))\n return false;\n }\n return true;\n }\n\n // If the values are neither primitives, arrays, nor objects, return false\n return false;\n}\n"],"mappings":";AAAA,SAAgB,QAAQ,OAAgB,OAAyB;CAE/D,IAAI,UAAU,OACZ,OAAO;CAGT,IAAI,SAAS,QAAQ,SAAS,MAC5B,OAAO,UAAU;CAGnB,IAAI,OAAO,UAAU,OAAO,OAC1B,OAAO;CAGT,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,MAAM,QAClD,OAAO;EAET,KAAK,MAAM,CAAC,GAAG,YAAY,MAAM,QAAQ,GACvC,IAAI,CAAC,QAAQ,SAAS,MAAM,EAAE,GAC5B,OAAO;EAEX,OAAO;CACT;CAGA,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,cAAc;EACpB,MAAM,cAAc;EACpB,MAAM,YAAY,OAAO,KAAK,WAAW;EACzC,MAAM,YAAY,OAAO,KAAK,WAAW;EAEzC,IAAI,UAAU,WAAW,UAAU,QACjC,OAAO;EAET,KAAK,MAAM,OAAO,WAChB,IAAI,CAAC,QAAQ,YAAY,MAAM,YAAY,IAAI,GAC7C,OAAO;EAEX,OAAO;CACT;CAGA,OAAO;AACT"}
|
package/dist/utils/tv.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tv.js","names":[],"sources":["../../src/utils/tv.ts"],"sourcesContent":["/**\n * Tailwind Variants wrapper.\n *\n * Re-exports `tv` from `tailwind-variants` with project-level configuration.\n * Uses `createTV()` so we can extend twMerge config for custom theme classes\n * (e.g., `text-rui-primary`) in the future.\n *\n * @see https://www.tailwind-variants.org/docs/introduction\n */\n\nimport type { VueClassValue } from '@/types/class-value';\nimport { createTV } from 'tailwind-variants';\nimport { type ClassValue, normalizeClass } from 'vue';\n\nconst isAny: (v: string) => boolean = () => true;\n\nexport const tv = /* @__PURE__ */ createTV({\n twMergeConfig: {\n classGroups: {\n 'bg-tint': [{ 'bg-tint': [isAny] }],\n 'bg-shade': [{ 'bg-shade': [isAny] }],\n 'text-tint': [{ 'text-tint': [isAny] }],\n 'text-shade': [{ 'text-shade': [isAny] }],\n // Custom theme colors (text-rui-*) belong to the text-color group so\n // they don't conflict with the custom typography utilities below, which\n // tw-merge would otherwise both classify as font-size.\n 'text-color': [{ 'text-rui': [isAny] }],\n 'font-size': [\n { 'text-body': [isAny] },\n 'text-caption',\n 'text-overline',\n { 'text-h': [isAny] },\n { 'text-subtitle': [isAny] },\n ],\n },\n },\n});\n\n/**\n * Normalizes any Vue `:class` binding value (string, object, array, nullish\n * or `false`) to a plain string compatible with tailwind-variants' `class`\n * parameter. Accepts Vue's runtime `ClassValue` so call sites can pass\n * `$attrs.class` directly without casting.\n */\nexport function cn(value: ClassValue | VueClassValue | undefined): string | undefined {\n if (value == null || value === false)\n return undefined;\n if (typeof value === 'string')\n return value || undefined;\n const result = normalizeClass(value);\n return result || undefined;\n}\n"],"mappings":";;;AAcA,IAAM,cAAsC;AAE5C,IAAa,KAAqB,yBAAS,EACzC,eAAe,EACb,aAAa;CACX,WAAW,CAAC,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"tv.js","names":[],"sources":["../../src/utils/tv.ts"],"sourcesContent":["/**\n * Tailwind Variants wrapper.\n *\n * Re-exports `tv` from `tailwind-variants` with project-level configuration.\n * Uses `createTV()` so we can extend twMerge config for custom theme classes\n * (e.g., `text-rui-primary`) in the future.\n *\n * @see https://www.tailwind-variants.org/docs/introduction\n */\n\nimport type { VueClassValue } from '@/types/class-value';\nimport { createTV } from 'tailwind-variants';\nimport { type ClassValue, normalizeClass } from 'vue';\n\nconst isAny: (v: string) => boolean = () => true;\n\nexport const tv = /* @__PURE__ */ createTV({\n twMergeConfig: {\n classGroups: {\n 'bg-tint': [{ 'bg-tint': [isAny] }],\n 'bg-shade': [{ 'bg-shade': [isAny] }],\n 'text-tint': [{ 'text-tint': [isAny] }],\n 'text-shade': [{ 'text-shade': [isAny] }],\n // Custom theme colors (text-rui-*) belong to the text-color group so\n // they don't conflict with the custom typography utilities below, which\n // tw-merge would otherwise both classify as font-size.\n 'text-color': [{ 'text-rui': [isAny] }],\n 'font-size': [\n { 'text-body': [isAny] },\n 'text-caption',\n 'text-overline',\n { 'text-h': [isAny] },\n { 'text-subtitle': [isAny] },\n ],\n },\n },\n});\n\n/**\n * Normalizes any Vue `:class` binding value (string, object, array, nullish\n * or `false`) to a plain string compatible with tailwind-variants' `class`\n * parameter. Accepts Vue's runtime `ClassValue` so call sites can pass\n * `$attrs.class` directly without casting.\n */\nexport function cn(value: ClassValue | VueClassValue | undefined): string | undefined {\n if (value == null || value === false)\n return undefined;\n if (typeof value === 'string')\n return value || undefined;\n const result = normalizeClass(value);\n return result || undefined;\n}\n"],"mappings":";;;AAcA,IAAM,cAAsC;AAE5C,IAAa,KAAqB,yBAAS,EACzC,eAAe,EACb,aAAa;CACX,WAAW,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC;CAClC,YAAY,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;CACpC,aAAa,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;CACtC,cAAc,CAAC,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC;CAIxC,cAAc,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;CACtC,aAAa;EACX,EAAE,aAAa,CAAC,KAAK,EAAE;EACvB;EACA;EACA,EAAE,UAAU,CAAC,KAAK,EAAE;EACpB,EAAE,iBAAiB,CAAC,KAAK,EAAE;CAC7B;AACF,EACF,EACF,CAAC;;;;;;;AAQD,SAAgB,GAAG,OAAmE;CACpF,IAAI,SAAS,QAAQ,UAAU,OAC7B,OAAO,KAAA;CACT,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAA;CAElB,OADe,eAAe,KACvB,KAAU,KAAA;AACnB"}
|
|
@@ -57,7 +57,8 @@ function loadLibraryBaselineIcons() {
|
|
|
57
57
|
* Vite plugin for automatic icon detection and registration
|
|
58
58
|
*/
|
|
59
59
|
function ruiIconsPlugin(options = {}) {
|
|
60
|
-
const { include = [], scanPatterns = DEFAULT_SCAN_PATTERNS, strict = false, debug = false } = options;
|
|
60
|
+
const { include = [], customIcons = [], scanPatterns = DEFAULT_SCAN_PATTERNS, strict = false, debug = false } = options;
|
|
61
|
+
const customIconSet = new Set(customIcons);
|
|
61
62
|
let validIcons;
|
|
62
63
|
let libraryBaseline;
|
|
63
64
|
let scanResult;
|
|
@@ -76,7 +77,7 @@ function ruiIconsPlugin(options = {}) {
|
|
|
76
77
|
const fg = await import("fast-glob");
|
|
77
78
|
const glob = fg.default || fg;
|
|
78
79
|
scanResult = {
|
|
79
|
-
icons: new Set([...libraryBaseline, ...include]),
|
|
80
|
+
icons: /* @__PURE__ */ new Set([...libraryBaseline, ...include]),
|
|
80
81
|
invalidIcons: /* @__PURE__ */ new Map()
|
|
81
82
|
};
|
|
82
83
|
const files = glob.sync(scanPatterns, {
|
|
@@ -89,7 +90,7 @@ function ruiIconsPlugin(options = {}) {
|
|
|
89
90
|
const detectedIcons = extractIconsFromSource(readFileSync(filePath, "utf-8"));
|
|
90
91
|
if (detectedIcons.size > 0) {
|
|
91
92
|
log(`Found ${detectedIcons.size} potential icons in ${filePath}`);
|
|
92
|
-
validateIcons(detectedIcons, validIcons, filePath, scanResult);
|
|
93
|
+
validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);
|
|
93
94
|
}
|
|
94
95
|
} catch {
|
|
95
96
|
warn(`Failed to read file: ${filePath}`);
|
|
@@ -98,7 +99,7 @@ function ruiIconsPlugin(options = {}) {
|
|
|
98
99
|
else warn(`Included icon "${icon}" is not a valid RuiIcon`);
|
|
99
100
|
log(`Detected ${scanResult.icons.size} valid icons`);
|
|
100
101
|
if (scanResult.invalidIcons.size > 0) {
|
|
101
|
-
const invalidList =
|
|
102
|
+
const invalidList = Array.from(scanResult.invalidIcons.entries(), ([icon, files]) => ` - "${icon}" in: ${files.join(", ")}`).join("\n");
|
|
102
103
|
const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\n${invalidList}`;
|
|
103
104
|
if (strict) throw new Error(message);
|
|
104
105
|
else warn(message);
|
|
@@ -115,7 +116,7 @@ function ruiIconsPlugin(options = {}) {
|
|
|
115
116
|
try {
|
|
116
117
|
const detectedIcons = extractIconsFromSource(readFileSync(filePath, "utf-8"));
|
|
117
118
|
const previousSize = scanResult.icons.size;
|
|
118
|
-
validateIcons(detectedIcons, validIcons, filePath, scanResult);
|
|
119
|
+
validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);
|
|
119
120
|
if (scanResult.icons.size > previousSize) {
|
|
120
121
|
log(`New icons detected in ${filePath}, invalidating virtual module...`);
|
|
121
122
|
const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Loads the valid RuiIcons array from the library\n */\nfunction loadValidIcons(): Set<string> {\n // Import the RuiIcons array from the icons module\n // This will be resolved at build time\n try {\n // Try to load from the built dist first (for consumers)\n const distPath = resolve(__dirname, '../icons/index.js');\n if (existsSync(distPath)) {\n // Read and parse the file to extract the RuiIcons array\n const content = readFileSync(distPath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n }\n catch {\n // Fallback: parse the icons source file directly\n }\n\n // Fallback: read and parse the source file\n const sourcePath = resolve(__dirname, '../icons/index.ts');\n if (existsSync(sourcePath)) {\n const content = readFileSync(sourcePath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/export const RuiIcons = \\[(.*?)] as const/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Loads the baseline icons used by library components, emitted at library\n * build time. Consumers always need these regardless of their own source.\n */\nfunction loadLibraryBaselineIcons(): string[] {\n const distPath = resolve(__dirname, '../library-icons.json');\n if (existsSync(distPath)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(distPath, 'utf-8'));\n if (Array.isArray(parsed))\n return parsed.filter((v): v is string => typeof v === 'string');\n }\n catch {\n // fall through\n }\n }\n return [];\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n let validIcons: Set<string>;\n let libraryBaseline: string[];\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set([...libraryBaseline, ...include]),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = [...scanResult.invalidIcons.entries()]\n .map(([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles file changes in dev mode\n */\n function handleFileChange(filePath: string): void {\n // Check if the changed file matches our scan patterns\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n libraryBaseline = loadLibraryBaselineIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export\nexport default ruiIconsPlugin;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Loads the valid RuiIcons array from the library\n */\nfunction loadValidIcons(): Set<string> {\n // Import the RuiIcons array from the icons module\n // This will be resolved at build time\n try {\n // Try to load from the built dist first (for consumers)\n const distPath = resolve(__dirname, '../icons/index.js');\n if (existsSync(distPath)) {\n // Read and parse the file to extract the RuiIcons array\n const content = readFileSync(distPath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n }\n catch {\n // Fallback: parse the icons source file directly\n }\n\n // Fallback: read and parse the source file\n const sourcePath = resolve(__dirname, '../icons/index.ts');\n if (existsSync(sourcePath)) {\n const content = readFileSync(sourcePath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/export const RuiIcons = \\[(.*?)] as const/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Loads the baseline icons used by library components, emitted at library\n * build time. Consumers always need these regardless of their own source.\n */\nfunction loadLibraryBaselineIcons(): string[] {\n const distPath = resolve(__dirname, '../library-icons.json');\n if (existsSync(distPath)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(distPath, 'utf-8'));\n if (Array.isArray(parsed))\n return parsed.filter((v): v is string => typeof v === 'string');\n }\n catch {\n // fall through\n }\n }\n return [];\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n customIcons = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n const customIconSet = new Set(customIcons);\n\n let validIcons: Set<string>;\n let libraryBaseline: string[];\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set([...libraryBaseline, ...include]),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = Array.from(scanResult.invalidIcons.entries(), ([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles file changes in dev mode\n */\n function handleFileChange(filePath: string): void {\n // Check if the changed file matches our scan patterns\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult, customIconSet);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n libraryBaseline = loadLibraryBaselineIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export\nexport default ruiIconsPlugin;\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export declare function extractIconsFromSource(source: string): Set<string>;
|
|
|
6
6
|
/**
|
|
7
7
|
* Validates detected icons against known valid icons
|
|
8
8
|
*/
|
|
9
|
-
export declare function validateIcons(detectedIcons: Set<string>, validIcons: Set<string>, filePath: string, result: ScanResult): void;
|
|
9
|
+
export declare function validateIcons(detectedIcons: Set<string>, validIcons: Set<string>, filePath: string, result: ScanResult, ignore?: Set<string>): void;
|
|
10
10
|
/**
|
|
11
11
|
* Converts icon name to export constant name
|
|
12
12
|
* e.g., 'lu-arrow-down' -> 'LuArrowDown'
|
|
@@ -26,12 +26,15 @@ function extractIconsFromSource(source) {
|
|
|
26
26
|
/**
|
|
27
27
|
* Validates detected icons against known valid icons
|
|
28
28
|
*/
|
|
29
|
-
function validateIcons(detectedIcons, validIcons, filePath, result) {
|
|
30
|
-
for (const icon of detectedIcons)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
function validateIcons(detectedIcons, validIcons, filePath, result, ignore) {
|
|
30
|
+
for (const icon of detectedIcons) {
|
|
31
|
+
if (ignore?.has(icon)) continue;
|
|
32
|
+
if (validIcons.has(icon)) result.icons.add(icon);
|
|
33
|
+
else {
|
|
34
|
+
const files = result.invalidIcons.get(icon) || [];
|
|
35
|
+
files.push(filePath);
|
|
36
|
+
result.invalidIcons.set(icon, files);
|
|
37
|
+
}
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
/**
|
|
@@ -52,6 +55,6 @@ export default [];
|
|
|
52
55
|
return `import {\n ${exports.join(",\n ")},\n} from '@rotki/ui-library';\n\nexport default [\n ${exports.join(",\n ")},\n];\n`;
|
|
53
56
|
}
|
|
54
57
|
//#endregion
|
|
55
|
-
export { extractIconsFromSource, generateVirtualModule, validateIcons };
|
|
58
|
+
export { extractIconsFromSource, generateVirtualModule, iconNameToExportName, validateIcons };
|
|
56
59
|
|
|
57
60
|
//# sourceMappingURL=scanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","names":[],"sources":["../../src/vite-plugin/scanner.ts"],"sourcesContent":["import type { ScanResult } from './types';\n\n/**\n * Regex patterns to detect icon usage in source files\n */\nconst ICON_PATTERNS: RegExp[] = [\n // Static name attribute: <RuiIcon name=\"lu-star\" /> or name='lu-star'\n /\\bname=[\"'](lu-[\\da-z-]+)[\"']/gi,\n\n // Dynamic bound name with string literal: :name=\"'lu-star'\" or :name=\"`lu-star`\"\n /:name=[\"']['`](lu-[\\da-z-]+)['`]?[\"']/gi,\n\n // String literals that look like icon names: 'lu-star' or \"lu-star\"\n /[\"'`](lu-[\\da-z-]+)[\"'`]/gi,\n];\n\n/**\n * Extracts all potential icon names from source code\n */\nexport function extractIconsFromSource(source: string): Set<string> {\n const icons = new Set<string>();\n\n for (const pattern of ICON_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null = pattern.exec(source);\n while (match !== null) {\n const iconName = match[1];\n if (iconName) {\n icons.add(iconName);\n }\n match = pattern.exec(source);\n }\n }\n\n return icons;\n}\n\n/**\n * Validates detected icons against known valid icons\n */\nexport function validateIcons(\n detectedIcons: Set<string>,\n validIcons: Set<string>,\n filePath: string,\n result: ScanResult,\n): void {\n for (const icon of detectedIcons) {\n if (validIcons.has(icon)) {\n result.icons.add(icon);\n }\n else {\n // Track invalid icons\n const files = result.invalidIcons.get(icon) || [];\n files.push(filePath);\n result.invalidIcons.set(icon, files);\n }\n }\n}\n\n/**\n * Converts icon name to export constant name\n * e.g., 'lu-arrow-down' -> 'LuArrowDown'\n */\nexport function iconNameToExportName(iconName: string): string {\n return iconName\n .split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n/**\n * Generates the virtual module content with detected icons\n */\nexport function generateVirtualModule(icons: Set<string>): string {\n if (icons.size === 0) {\n return `// No icons detected\nexport default [];\n`;\n }\n\n const sortedIcons = [...icons].sort();\n const exports = sortedIcons.map(iconNameToExportName);\n\n const importStatement = `import {\\n ${exports.join(',\\n ')},\\n} from '@rotki/ui-library';\\n`;\n const exportStatement = `\\nexport default [\\n ${exports.join(',\\n ')},\\n];\\n`;\n\n return importStatement + exportStatement;\n}\n"],"mappings":";;;;AAKA,IAAM,gBAA0B;CAE9B;CAGA;CAGA;
|
|
1
|
+
{"version":3,"file":"scanner.js","names":[],"sources":["../../src/vite-plugin/scanner.ts"],"sourcesContent":["import type { ScanResult } from './types';\n\n/**\n * Regex patterns to detect icon usage in source files\n */\nconst ICON_PATTERNS: RegExp[] = [\n // Static name attribute: <RuiIcon name=\"lu-star\" /> or name='lu-star'\n /\\bname=[\"'](lu-[\\da-z-]+)[\"']/gi,\n\n // Dynamic bound name with string literal: :name=\"'lu-star'\" or :name=\"`lu-star`\"\n /:name=[\"']['`](lu-[\\da-z-]+)['`]?[\"']/gi,\n\n // String literals that look like icon names: 'lu-star' or \"lu-star\"\n /[\"'`](lu-[\\da-z-]+)[\"'`]/gi,\n];\n\n/**\n * Extracts all potential icon names from source code\n */\nexport function extractIconsFromSource(source: string): Set<string> {\n const icons = new Set<string>();\n\n for (const pattern of ICON_PATTERNS) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n\n let match: RegExpExecArray | null = pattern.exec(source);\n while (match !== null) {\n const iconName = match[1];\n if (iconName) {\n icons.add(iconName);\n }\n match = pattern.exec(source);\n }\n }\n\n return icons;\n}\n\n/**\n * Validates detected icons against known valid icons\n */\nexport function validateIcons(\n detectedIcons: Set<string>,\n validIcons: Set<string>,\n filePath: string,\n result: ScanResult,\n ignore?: Set<string>,\n): void {\n for (const icon of detectedIcons) {\n if (ignore?.has(icon)) {\n // App-provided custom icon: registered by the consumer, not shipped by\n // the library — neither imported nor reported invalid.\n continue;\n }\n if (validIcons.has(icon)) {\n result.icons.add(icon);\n }\n else {\n // Track invalid icons\n const files = result.invalidIcons.get(icon) || [];\n files.push(filePath);\n result.invalidIcons.set(icon, files);\n }\n }\n}\n\n/**\n * Converts icon name to export constant name\n * e.g., 'lu-arrow-down' -> 'LuArrowDown'\n */\nexport function iconNameToExportName(iconName: string): string {\n return iconName\n .split('-')\n .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n\n/**\n * Generates the virtual module content with detected icons\n */\nexport function generateVirtualModule(icons: Set<string>): string {\n if (icons.size === 0) {\n return `// No icons detected\nexport default [];\n`;\n }\n\n const sortedIcons = [...icons].sort();\n const exports = sortedIcons.map(iconNameToExportName);\n\n const importStatement = `import {\\n ${exports.join(',\\n ')},\\n} from '@rotki/ui-library';\\n`;\n const exportStatement = `\\nexport default [\\n ${exports.join(',\\n ')},\\n];\\n`;\n\n return importStatement + exportStatement;\n}\n"],"mappings":";;;;AAKA,IAAM,gBAA0B;CAE9B;CAGA;CAGA;AACF;;;;AAKA,SAAgB,uBAAuB,QAA6B;CAClE,MAAM,wBAAQ,IAAI,IAAY;CAE9B,KAAK,MAAM,WAAW,eAAe;EAEnC,QAAQ,YAAY;EAEpB,IAAI,QAAgC,QAAQ,KAAK,MAAM;EACvD,OAAO,UAAU,MAAM;GACrB,MAAM,WAAW,MAAM;GACvB,IAAI,UACF,MAAM,IAAI,QAAQ;GAEpB,QAAQ,QAAQ,KAAK,MAAM;EAC7B;CACF;CAEA,OAAO;AACT;;;;AAKA,SAAgB,cACd,eACA,YACA,UACA,QACA,QACM;CACN,KAAK,MAAM,QAAQ,eAAe;EAChC,IAAI,QAAQ,IAAI,IAAI,GAGlB;EAEF,IAAI,WAAW,IAAI,IAAI,GACrB,OAAO,MAAM,IAAI,IAAI;OAElB;GAEH,MAAM,QAAQ,OAAO,aAAa,IAAI,IAAI,KAAK,CAAC;GAChD,MAAM,KAAK,QAAQ;GACnB,OAAO,aAAa,IAAI,MAAM,KAAK;EACrC;CACF;AACF;;;;;AAMA,SAAgB,qBAAqB,UAA0B;CAC7D,OAAO,SACJ,MAAM,GAAG,CAAC,CACV,KAAI,SAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CACzD,KAAK,EAAE;AACZ;;;;AAKA,SAAgB,sBAAsB,OAA4B;CAChE,IAAI,MAAM,SAAS,GACjB,OAAO;;;CAMT,MAAM,UADc,CAAC,GAAG,KAAK,CAAC,CAAC,KACf,CAAA,CAAY,IAAI,oBAAoB;CAKpD,OAAO,eAHgC,QAAQ,KAAK,OAAO,EAAE,wDACZ,QAAQ,KAAK,OAAO,EAAE;AAGzE"}
|
|
@@ -4,6 +4,15 @@ export interface RuiIconsPluginOptions {
|
|
|
4
4
|
* @example ['lu-custom-icon', 'lu-dynamic-icon']
|
|
5
5
|
*/
|
|
6
6
|
include?: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Icon names the app registers itself (via `createRui({ theme: { icons } })`)
|
|
9
|
+
* that are NOT part of the library's generated set, e.g. brand logos the
|
|
10
|
+
* library no longer ships. These are treated as valid — they are neither
|
|
11
|
+
* reported as invalid nor imported from `@rotki/ui-library` (the app supplies
|
|
12
|
+
* the data). Use this for icons like `lu-github` sourced from simple-icons.
|
|
13
|
+
* @example ['lu-github']
|
|
14
|
+
*/
|
|
15
|
+
customIcons?: string[];
|
|
7
16
|
/**
|
|
8
17
|
* Glob patterns for files to scan
|
|
9
18
|
* @default ['** /*.vue', '** /*.ts', '** /*.tsx'] (without spaces)
|