@rotki/ui-library 2.23.5 → 2.25.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/README.md +1 -2
- 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.map +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.vue.d.ts +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
- package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +1 -1
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/use-avatar-group.d.ts +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +1 -1
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button/button-styles.d.ts +40 -2
- package/dist/components/buttons/button/button-styles.js +38 -0
- package/dist/components/buttons/button/button-styles.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +26 -14
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +7 -0
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue.d.ts +1 -1
- 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.d.ts +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +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.map +1 -1
- package/dist/components/chips/RuiChip.vue.d.ts +1 -1
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +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.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -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.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +18 -2
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +73 -28
- 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.d.ts +2 -2
- 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.d.ts +3 -3
- 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.d.ts +48 -3
- package/dist/components/date-time-picker/partial-time.d.ts +35 -0
- package/dist/components/date-time-picker/partial-time.js +82 -0
- package/dist/components/date-time-picker/partial-time.js.map +1 -0
- package/dist/components/date-time-picker/segment-config.d.ts +1 -1
- package/dist/components/date-time-picker/segment-utils.d.ts +2 -2
- package/dist/components/date-time-picker/segment-utils.js +17 -5
- 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/use-date-bounds.d.ts +28 -0
- package/dist/components/date-time-picker/use-date-bounds.js +60 -0
- package/dist/components/date-time-picker/use-date-bounds.js.map +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.d.ts +16 -12
- package/dist/components/date-time-picker/use-date-time-selection.js +126 -115
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-input-handler.d.ts +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.d.ts +2 -2
- package/dist/components/date-time-picker/use-keyboard-handler.js +52 -13
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
- package/dist/components/date-time-picker/utils.d.ts +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.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +2 -2
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +136 -158
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js +7 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue.d.ts +45 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +58 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js +7 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +70 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +140 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js +7 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +39 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +48 -3
- package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +2 -2
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +49 -5
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/category-picker/category-picker-styles.d.ts +69 -5
- package/dist/components/forms/category-picker/category-picker-styles.js +19 -0
- package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
- package/dist/components/forms/check-control-styles.d.ts +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.map +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
- 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.js.map +1 -1
- 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.d.ts +1 -1
- 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.d.ts +2 -2
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +10 -8
- 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.map +1 -1
- package/dist/components/forms/select/menu-select-styles.d.ts +48 -3
- package/dist/components/forms/slider/RuiSlider.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +22 -12
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/slider/RuiSliderTicks.js +7 -0
- package/dist/components/forms/slider/RuiSliderTicks.js.map +1 -0
- package/dist/components/forms/slider/RuiSliderTicks.vue.d.ts +15 -0
- package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js +59 -0
- package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/slider/slider-styles.d.ts +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.d.ts +1 -1
- 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.d.ts +3 -3
- package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +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.d.ts +37 -4
- package/dist/components/forms/text-field/text-field-styles.js +34 -1
- package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
- package/dist/components/forms/text-input-styles.d.ts +20 -5
- package/dist/components/forms/text-input-styles.js +16 -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.map +1 -1
- package/dist/components/icons/RuiIcon.js.map +1 -1
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +26 -0
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/index.d.ts +57 -53
- package/dist/components/index.js +5 -1
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +2 -2
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +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.d.ts +1 -1
- package/dist/components/logos/use-logo-sources.js +6 -1
- package/dist/components/logos/use-logo-sources.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue.d.ts +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +1 -0
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +2 -0
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +15 -1
- 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_vue_type_script_setup_true_lang.js +20 -0
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
- 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.map +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.d.ts +2 -2
- package/dist/components/progress/RuiProgress.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue.d.ts +3 -3
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue.d.ts +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepper.js.map +1 -1
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +8 -0
- 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.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiDataTable.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +5 -6
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +42 -22
- 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.map +1 -1
- package/dist/components/tables/RuiTable.js +7 -0
- package/dist/components/tables/RuiTable.js.map +1 -0
- package/dist/components/tables/RuiTable.vue.d.ts +40 -0
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +95 -0
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue.d.ts +5 -0
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +25 -10
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableErrorState.js +7 -0
- package/dist/components/tables/RuiTableErrorState.js.map +1 -0
- package/dist/components/tables/RuiTableErrorState.vue.d.ts +28 -0
- package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js +44 -0
- package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/RuiTableHead.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue.d.ts +5 -9
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableLoadingState.js +7 -0
- package/dist/components/tables/RuiTableLoadingState.js.map +1 -0
- package/dist/components/tables/RuiTableLoadingState.vue.d.ts +13 -0
- package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js +40 -0
- package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/RuiTablePagination.vue.d.ts +1 -1
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +6 -0
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js +6 -0
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js +5 -0
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js +2 -6
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +2 -2
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js +4 -0
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +25 -0
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/context.d.ts +2 -3
- package/dist/components/tables/data-table/context.js.map +1 -1
- package/dist/components/tables/data-table-styles.d.ts +2 -5
- package/dist/components/tables/data-table-styles.js +1 -2
- package/dist/components/tables/data-table-styles.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +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.d.ts +9 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +6 -1
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +12 -0
- 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.d.ts +1 -1
- 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.d.ts +2 -2
- package/dist/composables/colors/index.d.ts +3 -3
- package/dist/composables/dropdown-menu.d.ts +2 -2
- package/dist/composables/dropdown-menu.js +26 -23
- package/dist/composables/dropdown-menu.js.map +1 -1
- package/dist/composables/floating.d.ts +7 -8
- package/dist/composables/floating.js +19 -14
- package/dist/composables/floating.js.map +1 -1
- package/dist/composables/forms/auto-complete/focus.js +5 -0
- package/dist/composables/forms/auto-complete/focus.js.map +1 -1
- package/dist/composables/forms/auto-complete/keyboard-navigation.js +12 -5
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.d.ts +1 -1
- package/dist/composables/forms/auto-complete/search.js +5 -0
- 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 +1 -1
- package/dist/composables/forms/category-picker/use-category-picker.js +1 -0
- package/dist/composables/forms/category-picker/use-category-picker.js.map +1 -1
- package/dist/composables/forms/use-prepend-append-width.d.ts +18 -3
- package/dist/composables/forms/use-prepend-append-width.js +18 -3
- package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
- package/dist/composables/index.d.ts +4 -3
- package/dist/composables/index.js +2 -1
- package/dist/composables/overlay-stack.d.ts +52 -0
- package/dist/composables/overlay-stack.js +93 -0
- package/dist/composables/overlay-stack.js.map +1 -0
- package/dist/composables/sticky-header.js.map +1 -1
- package/dist/composables/tables/data-table/expansion.js +7 -0
- package/dist/composables/tables/data-table/expansion.js.map +1 -1
- package/dist/composables/tables/data-table/grouping.d.ts +1 -1
- package/dist/composables/tables/data-table/pagination.d.ts +2 -2
- package/dist/composables/tables/data-table/selection.d.ts +1 -1
- package/dist/composables/tables/data-table/selection.js +37 -34
- package/dist/composables/tables/data-table/selection.js.map +1 -1
- package/dist/composables/theme.d.ts +4 -2
- package/dist/composables/theme.js +18 -24
- package/dist/composables/theme.js.map +1 -1
- package/dist/i18n/keys.d.ts +1 -1
- package/dist/i18n/keys.js +1 -1
- package/dist/i18n/keys.js.map +1 -1
- package/dist/icons/icons_1.d.ts +8 -8
- package/dist/icons/icons_1.js +246 -223
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +26 -26
- package/dist/icons/icons_2.js +320 -400
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +46 -46
- package/dist/icons/icons_3.js +661 -706
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +63 -63
- package/dist/icons/icons_4.js +4347 -4480
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/icons_5.d.ts +60 -1
- package/dist/icons/icons_5.js +774 -31
- package/dist/icons/icons_5.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +84 -25
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/dist/style.css +83 -10
- package/dist/theme/index.js +1 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/types/theme.d.ts +1 -1
- package/dist/utils/assert.js +2 -2
- package/dist/utils/assert.js.map +1 -1
- package/dist/utils/blockie.d.ts +4 -0
- package/dist/utils/blockie.js +8 -0
- package/dist/utils/blockie.js.map +1 -1
- package/dist/utils/helpers.d.ts +24 -18
- package/dist/utils/helpers.js +28 -21
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/is-equal.d.ts +9 -0
- package/dist/utils/is-equal.js +22 -15
- package/dist/utils/is-equal.js.map +1 -1
- package/dist/utils/tv.d.ts +6 -2
- package/dist/utils/tv.js +30 -14
- package/dist/utils/tv.js.map +1 -1
- package/dist/vite-plugin/client.d.ts +1 -1
- package/dist/vite-plugin/index.js +29 -21
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/scanner.d.ts +5 -2
- package/dist/vite-plugin/scanner.js +5 -2
- package/dist/vite-plugin/scanner.js.map +1 -1
- package/dist/vite-plugin/types.d.ts +4 -8
- package/dist/web-types.json +872 -50
- package/package.json +32 -33
package/README.md
CHANGED
|
@@ -200,8 +200,7 @@ const i18n = createI18n({
|
|
|
200
200
|
locale: 'en',
|
|
201
201
|
messages: {
|
|
202
202
|
en: {
|
|
203
|
-
// Your app translations
|
|
204
|
-
// UI library translations (see below)
|
|
203
|
+
// Your app translations, then the UI library's own (see below)
|
|
205
204
|
rui: {
|
|
206
205
|
date_time_picker: {
|
|
207
206
|
date_after_max: 'Date cannot be after {date}',
|
package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAccordion.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n /** @deprecated Use `classNames.header` instead */\n headerClass?: string;\n /** @deprecated Use `classNames.content` instead */\n contentClass?: string;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n headerClass = '',\n contentClass = '',\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"flex gap-2 items-center cursor-pointer outline-none focus-visible:bg-rui-primary/10 rounded\"\n :class=\"[classNames?.header ?? headerClass, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"text-rui-text-secondary transition-transform\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n class=\"grow transition-all overflow-hidden w-full\"\n :class=\"classNames?.content ?? contentClass\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,OAAO;EASb,MAAM,QAAQ,eAA+B,OAAO;EAEpD,MAAM,YAAY,MAAM;EACxB,MAAM,YAAY,MAAM;EACxB,MAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;EAEpD,MAAM,gBAAgB,eAAwB,QAAA,OAAO,GAAG,MAAI,WAAW,EAAE,MAAM,KAAM;EAErF,SAAS,SAAe;GACtB,KAAK,OAAO;EACd;EAEA,SAAS,UAAU,OAA4B;GAC7C,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;IAC9C,MAAM,eAAe;IACrB,OAAO;GACT;EACF;EAEA,MAAM,YAAY,GAAG,EAAE,MAAM,4BAA4B,CAAC;;
|
|
1
|
+
{"version":3,"file":"RuiAccordion.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../../src/components/accordions/accordion/RuiAccordion.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { VueClassValue } from '@/types/class-value';\nimport Icon from '@/components/icons/RuiIcon.vue';\nimport { cn, tv } from '@/utils/tv';\n\nexport interface RuiAccordionClassNames {\n root?: VueClassValue;\n header?: VueClassValue;\n content?: VueClassValue;\n}\n\nexport interface AccordionProps {\n open?: boolean;\n eager?: boolean;\n headerGrow?: boolean;\n classNames?: RuiAccordionClassNames;\n /** @deprecated Use `classNames.header` instead */\n headerClass?: string;\n /** @deprecated Use `classNames.content` instead */\n contentClass?: string;\n}\n\ndefineOptions({\n name: 'RuiAccordion',\n inheritAttrs: false,\n});\n\nconst {\n open = false,\n eager = false,\n headerGrow = false,\n classNames,\n headerClass = '',\n contentClass = '',\n} = defineProps<AccordionProps>();\n\nconst emit = defineEmits<{\n click: [];\n}>();\n\ndefineSlots<{\n header?: (props: { open: boolean }) => any;\n default?: () => any;\n}>();\n\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst triggerId = useId();\nconst contentId = useId();\nconst { height: innerHeight } = useElementSize(inner);\n\nconst contentHeight = computed<string>(() => (open ? `${get(innerHeight)}px` : '0px'));\n\nfunction toggle(): void {\n emit('click');\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n}\n\nconst rootStyle = tv({ base: 'flex flex-col items-start' });\n</script>\n\n<template>\n <div\n :class=\"rootStyle({ class: cn(classNames?.root ?? $attrs.class) })\"\n :data-state=\"open ? 'open' : 'closed'\"\n data-accordion\n v-bind=\"{ ...$attrs, class: undefined }\"\n >\n <div\n v-if=\"$slots.header\"\n :id=\"triggerId\"\n class=\"flex gap-2 items-center cursor-pointer outline-none focus-visible:bg-rui-primary/10 rounded\"\n :class=\"[classNames?.header ?? headerClass, { 'w-full': headerGrow }]\"\n role=\"button\"\n tabindex=\"0\"\n :aria-expanded=\"open\"\n :aria-controls=\"contentId\"\n data-accordion-trigger\n @click=\"toggle()\"\n @keydown=\"onKeydown($event)\"\n >\n <div :class=\"{ grow: headerGrow }\">\n <slot\n name=\"header\"\n :open=\"open\"\n />\n </div>\n <Icon\n class=\"text-rui-text-secondary transition-transform\"\n :class=\"{ '-rotate-180': open }\"\n name=\"lu-chevron-down\"\n />\n </div>\n <div\n v-if=\"open || eager\"\n :id=\"contentId\"\n class=\"grow transition-all overflow-hidden w-full\"\n :class=\"classNames?.content ?? contentClass\"\n :style=\"{ height: contentHeight }\"\n role=\"region\"\n :aria-labelledby=\"triggerId\"\n data-accordion-content\n >\n <div ref=\"inner\">\n <slot name=\"default\" />\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,OAAO;EASb,MAAM,QAAQ,eAA+B,OAAO;EAEpD,MAAM,YAAY,MAAM;EACxB,MAAM,YAAY,MAAM;EACxB,MAAM,EAAE,QAAQ,gBAAgB,eAAe,KAAK;EAEpD,MAAM,gBAAgB,eAAwB,QAAA,OAAO,GAAG,MAAI,WAAW,EAAE,MAAM,KAAM;EAErF,SAAS,SAAe;GACtB,KAAK,OAAO;EACd;EAEA,SAAS,UAAU,OAA4B;GAC7C,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;IAC9C,MAAM,eAAe;IACrB,OAAO;GACT;EACF;EAEA,MAAM,YAAY,GAAG,EAAE,MAAM,4BAA4B,CAAC;;GAIxD,OAAA,UAAA,GAAA,mBA6CM,OA7CN,WA6CM;IA5CH,OAAO,MAAA,SAAA,CAAS,CAAA,EAAA,OAAU,MAAA,EAAA,CAAE,CAAC,QAAA,YAAY,QAAQA,KAAAA,OAAO,KAAK,EAAA,CAAA;IAC7D,cAAY,QAAA,OAAI,SAAA;IACjB,kBAAA;GACaA,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,CAAA,GAAA,CAG7BC,KAAAA,OAAO,UADf,UAAA,GAAA,mBAwBM,OAAA;;IAtBH,IAAI,MAAA,SAAA;IACL,OAAK,eAAA,CAAC,+FAA6F,CAC1F,QAAA,YAAY,UAAU,QAAA,aAAW,EAAA,UAAc,QAAA,WAAU,CAAA,CAAA,CAAA;IAClE,MAAK;IACL,UAAS;IACR,iBAAe,QAAA;IACf,iBAAe,MAAA,SAAA;IAChB,0BAAA;IACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAM;IACb,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,UAAU,MAAM;GAE1B,GAAA,CAAA,mBAKM,OAAA,EALA,OAAK,eAAA,EAAA,MAAU,QAAA,WAAU,CAAA,EAAA,GAAA,CAC7B,WAGE,KAAA,QAAA,UAAA,EADC,MAAM,QAAA,KAAI,CAAA,CAAA,GAAA,CAAA,GAGf,YAIE,iBAAA;IAHA,OAAK,eAAA,CAAC,gDAA8C,EAAA,eAC3B,QAAA,KAAI,CAAA,CAAA;IAC7B,MAAK;GAID,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,GAAA,QAAA,QAAQ,QAAA,SADhB,UAAA,GAAA,mBAaM,OAAA;;IAXH,IAAI,MAAA,SAAA;IACL,OAAK,eAAA,CAAC,8CACE,QAAA,YAAY,WAAW,QAAA,YAAY,CAAA;IAC1C,OAAK,eAAA,EAAA,QAAY,MAAA,aAAA,EAAa,CAAA;IAC/B,MAAK;IACJ,mBAAiB,MAAA,SAAA;IAClB,0BAAA;GAEA,GAAA,CAAA,mBAEM,OAAA;IAFG,SAAA;IAAJ,KAAI;GACP,GAAA,CAAA,WAAuB,KAAA,QAAA,SAAA,CAAA,GAAA,GAAA,CAAA,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,IAAA,UAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAccordions.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/accordions/accordions/RuiAccordions.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nexport interface Props {\n multiple?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAccordions',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<number[] | number>({ default: -1 });\n\nconst { multiple = false } = defineProps<Props>();\n\nconst internalValue = ref<number[] | number>();\n\nconst slots = useSlots();\nconst children = computed<VNode[]>(() => {\n const accordions = slots.default?.() ?? [];\n const currentValue = get(internalValue);\n\n return accordions.map((accordion, index) => {\n const open =\n multiple && Array.isArray(currentValue)\n ? currentValue.includes(index)\n : currentValue === index;\n\n return {\n ...accordion,\n props: {\n open,\n ...accordion.props,\n },\n };\n });\n});\n\nfunction updateValue(newModelValue: number): void {\n let newValue: number[] | number;\n const internal = get(internalValue);\n if (multiple && Array.isArray(internal)) {\n const temp = [...internal];\n const index = temp.indexOf(newModelValue);\n if (index === -1)\n temp.push(newModelValue);\n else temp.splice(index, 1);\n newValue = temp;\n }\n else {\n if (internal === newModelValue)\n newValue = -1;\n else newValue = newModelValue;\n }\n set(modelValue, newValue);\n set(internalValue, newValue);\n}\n\nwatch(\n [modelValue, () => multiple],\n ([value, isMultiple]) => {\n let internal: number | number[] = value;\n if (isMultiple && !Array.isArray(internal))\n internal = internal === -1 ? [] : [internal];\n else if (!isMultiple && Array.isArray(internal))\n internal = internal[0] ?? -1;\n\n set(internalValue, internal);\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <div v-bind=\"$attrs\">\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateValue(i)\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAUA,MAAM,aAAa,SAA8B,SAAA,YAAgB;EAIjE,MAAM,gBAAgB,IAAuB;EAE7C,MAAM,QAAQ,SAAS;EACvB,MAAM,WAAW,eAAwB;GACvC,MAAM,aAAa,MAAM,UAAU,KAAK,CAAC;GACzC,MAAM,eAAe,IAAI,aAAa;GAEtC,OAAO,WAAW,KAAK,WAAW,UAAU;IAC1C,MAAM,OACJ,QAAA,YAAY,MAAM,QAAQ,YAAY,IAClC,aAAa,SAAS,KAAK,IAC3B,iBAAiB;IAEvB,OAAO;KACL,GAAG;KACH,OAAO;MACL;MACA,GAAG,UAAU;KACf;IACF;GACF,CAAC;EACH,CAAC;EAED,SAAS,YAAY,eAA6B;GAChD,IAAI;GACJ,MAAM,WAAW,IAAI,aAAa;GAClC,IAAI,QAAA,YAAY,MAAM,QAAQ,QAAQ,GAAG;IACvC,MAAM,OAAO,CAAC,GAAG,QAAQ;IACzB,MAAM,QAAQ,KAAK,QAAQ,aAAa;IACxC,IAAI,UAAU,IACZ,KAAK,KAAK,aAAa;SACpB,KAAK,OAAO,OAAO,CAAC;IACzB,WAAW;GACb,OAEE,IAAI,aAAa,eACf,WAAW;QACR,WAAW;GAElB,IAAI,YAAY,QAAQ;GACxB,IAAI,eAAe,QAAQ;EAC7B;EAEA,MACE,CAAC,kBAAkB,QAAA,QAAQ,IAC1B,CAAC,OAAO,gBAAgB;GACvB,IAAI,WAA8B;GAClC,IAAI,cAAc,CAAC,MAAM,QAAQ,QAAQ,GACvC,WAAW,aAAa,KAAK,CAAC,IAAI,CAAC,QAAQ;QACxC,IAAI,CAAC,cAAc,MAAM,QAAQ,QAAQ,GAC5C,WAAW,SAAS,MAAM;GAE5B,IAAI,eAAe,QAAQ;EAC7B,GACA,EAAE,WAAW,KAAK,CACpB;;
|
|
1
|
+
{"version":3,"file":"RuiAccordions.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/accordions/accordions/RuiAccordions.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nexport interface Props {\n multiple?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAccordions',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<number[] | number>({ default: -1 });\n\nconst { multiple = false } = defineProps<Props>();\n\nconst internalValue = ref<number[] | number>();\n\nconst slots = useSlots();\nconst children = computed<VNode[]>(() => {\n const accordions = slots.default?.() ?? [];\n const currentValue = get(internalValue);\n\n return accordions.map((accordion, index) => {\n const open =\n multiple && Array.isArray(currentValue)\n ? currentValue.includes(index)\n : currentValue === index;\n\n return {\n ...accordion,\n props: {\n open,\n ...accordion.props,\n },\n };\n });\n});\n\nfunction updateValue(newModelValue: number): void {\n let newValue: number[] | number;\n const internal = get(internalValue);\n if (multiple && Array.isArray(internal)) {\n const temp = [...internal];\n const index = temp.indexOf(newModelValue);\n if (index === -1)\n temp.push(newModelValue);\n else temp.splice(index, 1);\n newValue = temp;\n }\n else {\n if (internal === newModelValue)\n newValue = -1;\n else newValue = newModelValue;\n }\n set(modelValue, newValue);\n set(internalValue, newValue);\n}\n\nwatch(\n [modelValue, () => multiple],\n ([value, isMultiple]) => {\n let internal: number | number[] = value;\n if (isMultiple && !Array.isArray(internal))\n internal = internal === -1 ? [] : [internal];\n else if (!isMultiple && Array.isArray(internal))\n internal = internal[0] ?? -1;\n\n set(internalValue, internal);\n },\n { immediate: true },\n);\n</script>\n\n<template>\n <div v-bind=\"$attrs\">\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateValue(i)\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;EAUA,MAAM,aAAa,SAA8B,SAAA,YAAgB;EAIjE,MAAM,gBAAgB,IAAuB;EAE7C,MAAM,QAAQ,SAAS;EACvB,MAAM,WAAW,eAAwB;GACvC,MAAM,aAAa,MAAM,UAAU,KAAK,CAAC;GACzC,MAAM,eAAe,IAAI,aAAa;GAEtC,OAAO,WAAW,KAAK,WAAW,UAAU;IAC1C,MAAM,OACJ,QAAA,YAAY,MAAM,QAAQ,YAAY,IAClC,aAAa,SAAS,KAAK,IAC3B,iBAAiB;IAEvB,OAAO;KACL,GAAG;KACH,OAAO;MACL;MACA,GAAG,UAAU;KACf;IACF;GACF,CAAC;EACH,CAAC;EAED,SAAS,YAAY,eAA6B;GAChD,IAAI;GACJ,MAAM,WAAW,IAAI,aAAa;GAClC,IAAI,QAAA,YAAY,MAAM,QAAQ,QAAQ,GAAG;IACvC,MAAM,OAAO,CAAC,GAAG,QAAQ;IACzB,MAAM,QAAQ,KAAK,QAAQ,aAAa;IACxC,IAAI,UAAU,IACZ,KAAK,KAAK,aAAa;SACpB,KAAK,OAAO,OAAO,CAAC;IACzB,WAAW;GACb,OAEE,IAAI,aAAa,eACf,WAAW;QACR,WAAW;GAElB,IAAI,YAAY,QAAQ;GACxB,IAAI,eAAe,QAAQ;EAC7B;EAEA,MACE,CAAC,kBAAkB,QAAA,QAAQ,IAC1B,CAAC,OAAO,gBAAgB;GACvB,IAAI,WAA8B;GAClC,IAAI,cAAc,CAAC,MAAM,QAAQ,QAAQ,GACvC,WAAW,aAAa,KAAK,CAAC,IAAI,CAAC,QAAQ;QACxC,IAAI,CAAC,cAAc,MAAM,QAAQ,QAAQ,GAC5C,WAAW,SAAS,MAAM;GAE5B,IAAI,eAAe,QAAQ;EAC7B,GACA,EAAE,WAAW,KAAK,CACpB;;GAIE,OAAA,UAAA,GAAA,mBAOM,OAAA,eAAA,mBAPOA,KAAAA,MAAM,CAAA,GAAA,EACjB,UAAA,IAAA,GAAA,mBAKE,UAAA,MAAA,WAHqB,MAAA,QAAA,IAAb,OAAO,MAAC;IAFlB,OAAA,UAAA,GAAA,YAKE,wBAJK,KAAK,GAAA;KAET,KAAK;KACL,UAAK,WAAE,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAlert.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../src/components/alerts/RuiAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n title?: string;\n description?: string;\n type?: ContextColorsType;\n icon?: RuiIcons;\n variant?: 'default' | 'filled' | 'outlined';\n actionText?: string;\n closeable?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAlert',\n inheritAttrs: false,\n});\n\nconst {\n title = '',\n description = '',\n type = 'primary',\n icon = undefined,\n variant = 'default',\n actionText = '',\n closeable = false,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n action: [];\n close: [];\n}>();\n\ndefineSlots<{\n title?: () => any;\n default?: () => any;\n}>();\n\nconst alertStyles = tv({\n slots: {\n root: 'px-4 py-2.5 rounded flex space-x-4',\n content: 'flex space-x-3 py-1 flex-grow',\n icon: '',\n texts: 'space-y-1 flex-grow',\n action: '',\n close: '',\n },\n variants: {\n variant: {\n default: {},\n filled: {\n icon: '!text-rui-dark-text',\n texts: '!text-rui-dark-text',\n action: '!text-rui-dark-text',\n close: '!text-rui-dark-text',\n },\n outlined: { root: 'border m-[-1px] bg-white dark:bg-black' },\n },\n type: {\n primary: {},\n secondary: {},\n error: {},\n warning: {},\n info: {},\n success: {},\n },\n },\n compoundVariants: [\n // Default variant backgrounds\n {\n variant: 'default',\n type: 'primary',\n class: { root: 'bg-rui-primary bg-tint-[.9] color-mix-supported:bg-rui-primary-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-primary-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'secondary',\n class: { root: 'bg-rui-secondary bg-tint-[.9] color-mix-supported:bg-rui-secondary-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-secondary-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'error',\n class: { root: 'bg-rui-error bg-tint-[.9] color-mix-supported:bg-rui-error-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-error-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'warning',\n class: { root: 'bg-rui-warning bg-tint-[.9] color-mix-supported:bg-rui-warning-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-warning-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'info',\n class: { root: 'bg-rui-info bg-tint-[.9] color-mix-supported:bg-rui-info-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-info-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'success',\n class: { root: 'bg-rui-success bg-tint-[.9] color-mix-supported:bg-rui-success-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-success-shade/[.9]' },\n },\n\n // Filled variant backgrounds\n { variant: 'filled', type: 'primary', class: { root: 'bg-rui-primary' } },\n { variant: 'filled', type: 'secondary', class: { root: 'bg-rui-secondary' } },\n { variant: 'filled', type: 'error', class: { root: 'bg-rui-error' } },\n { variant: 'filled', type: 'warning', class: { root: 'bg-rui-warning' } },\n { variant: 'filled', type: 'info', class: { root: 'bg-rui-info' } },\n { variant: 'filled', type: 'success', class: { root: 'bg-rui-success' } },\n\n // Filled dark text override for warning/success/info\n {\n variant: 'filled',\n type: ['warning', 'success', 'info'],\n class: { root: 'dark:!text-rui-light-text' },\n },\n\n // Outlined variant borders\n { variant: 'outlined', type: 'primary', class: { root: 'border-rui-primary' } },\n { variant: 'outlined', type: 'secondary', class: { root: 'border-rui-secondary' } },\n { variant: 'outlined', type: 'error', class: { root: 'border-rui-error' } },\n { variant: 'outlined', type: 'warning', class: { root: 'border-rui-warning' } },\n { variant: 'outlined', type: 'info', class: { root: 'border-rui-info' } },\n { variant: 'outlined', type: 'success', class: { root: 'border-rui-success' } },\n\n ],\n compoundSlots: [\n // Content text colors for default + outlined (shared across all content slots)\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'primary',\n class: 'text-rui-primary text-shade-[.6] color-mix-supported:text-rui-primary-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-primary-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'secondary',\n class: 'text-rui-secondary text-shade-[.6] color-mix-supported:text-rui-secondary-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-secondary-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'error',\n class: 'text-rui-error text-shade-[.6] color-mix-supported:text-rui-error-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-error-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'warning',\n class: 'text-rui-warning text-shade-[.6] color-mix-supported:text-rui-warning-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-warning-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'info',\n class: 'text-rui-info text-shade-[.6] color-mix-supported:text-rui-info-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-info-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'success',\n class: 'text-rui-success text-shade-[.6] color-mix-supported:text-rui-success-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-success-tint/[.6]',\n },\n\n // Icon-only dark mode base color\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'primary', class: 'dark:text-rui-primary' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'secondary', class: 'dark:text-rui-secondary' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'error', class: 'dark:text-rui-error' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'warning', class: 'dark:text-rui-warning' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'info', class: 'dark:text-rui-info' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'success', class: 'dark:text-rui-success' },\n ],\n});\n\nconst ui = computed<ReturnType<typeof alertStyles>>(() => alertStyles({ variant, type }));\n\nconst usedIcon = computed<RuiIcons | undefined>(() => {\n if (icon)\n return icon;\n\n const iconMap: Record<ContextColorsType, RuiIcons | undefined> = {\n primary: undefined,\n secondary: undefined,\n warning: 'lu-triangle-alert',\n info: 'lu-info',\n error: 'lu-circle-alert',\n success: 'lu-circle-check',\n };\n\n return iconMap[type];\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n v-bind=\"$attrs\"\n :data-variant=\"variant\"\n :data-type=\"type\"\n >\n <div :class=\"ui.content()\">\n <div\n v-if=\"usedIcon\"\n :class=\"ui.icon()\"\n >\n <RuiIcon\n :name=\"usedIcon\"\n size=\"22\"\n />\n </div>\n <div :class=\"ui.texts()\">\n <div\n v-if=\"$slots.title || title\"\n :class=\"{\n 'font-medium': !!title,\n }\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n\n <div\n v-if=\"$slots.default || description\"\n class=\"text-body-2\"\n >\n <slot>\n {{ description }}\n </slot>\n </div>\n </div>\n </div>\n <div v-if=\"actionText\">\n <RuiButton\n variant=\"text\"\n size=\"sm\"\n :color=\"variant === 'filled' ? undefined : type\"\n :class=\"ui.action()\"\n data-id=\"alert-action\"\n @click=\"emit('action')\"\n >\n {{ actionText }}\n </RuiButton>\n </div>\n <div v-if=\"closeable\">\n <RuiButton\n :color=\"variant === 'filled' ? undefined : type\"\n size=\"sm\"\n icon\n variant=\"text\"\n :class=\"ui.close()\"\n data-id=\"alert-close\"\n @click=\"emit('close')\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"20\"\n />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuiAlert.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../src/components/alerts/RuiAlert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n title?: string;\n description?: string;\n type?: ContextColorsType;\n icon?: RuiIcons;\n variant?: 'default' | 'filled' | 'outlined';\n actionText?: string;\n closeable?: boolean;\n}\n\ndefineOptions({\n name: 'RuiAlert',\n inheritAttrs: false,\n});\n\nconst {\n title = '',\n description = '',\n type = 'primary',\n icon = undefined,\n variant = 'default',\n actionText = '',\n closeable = false,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n action: [];\n close: [];\n}>();\n\ndefineSlots<{\n title?: () => any;\n default?: () => any;\n}>();\n\nconst alertStyles = tv({\n slots: {\n root: 'px-4 py-2.5 rounded flex space-x-4',\n content: 'flex space-x-3 py-1 flex-grow',\n icon: '',\n texts: 'space-y-1 flex-grow',\n action: '',\n close: '',\n },\n variants: {\n variant: {\n default: {},\n filled: {\n icon: '!text-rui-dark-text',\n texts: '!text-rui-dark-text',\n action: '!text-rui-dark-text',\n close: '!text-rui-dark-text',\n },\n outlined: { root: 'border m-[-1px] bg-white dark:bg-black' },\n },\n type: {\n primary: {},\n secondary: {},\n error: {},\n warning: {},\n info: {},\n success: {},\n },\n },\n compoundVariants: [\n // Default variant backgrounds\n {\n variant: 'default',\n type: 'primary',\n class: { root: 'bg-rui-primary bg-tint-[.9] color-mix-supported:bg-rui-primary-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-primary-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'secondary',\n class: { root: 'bg-rui-secondary bg-tint-[.9] color-mix-supported:bg-rui-secondary-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-secondary-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'error',\n class: { root: 'bg-rui-error bg-tint-[.9] color-mix-supported:bg-rui-error-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-error-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'warning',\n class: { root: 'bg-rui-warning bg-tint-[.9] color-mix-supported:bg-rui-warning-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-warning-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'info',\n class: { root: 'bg-rui-info bg-tint-[.9] color-mix-supported:bg-rui-info-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-info-shade/[.9]' },\n },\n {\n variant: 'default',\n type: 'success',\n class: { root: 'bg-rui-success bg-tint-[.9] color-mix-supported:bg-rui-success-tint/[.9] dark:bg-shade-[.9] dark:color-mix-supported:bg-rui-success-shade/[.9]' },\n },\n\n // Filled variant backgrounds\n { variant: 'filled', type: 'primary', class: { root: 'bg-rui-primary' } },\n { variant: 'filled', type: 'secondary', class: { root: 'bg-rui-secondary' } },\n { variant: 'filled', type: 'error', class: { root: 'bg-rui-error' } },\n { variant: 'filled', type: 'warning', class: { root: 'bg-rui-warning' } },\n { variant: 'filled', type: 'info', class: { root: 'bg-rui-info' } },\n { variant: 'filled', type: 'success', class: { root: 'bg-rui-success' } },\n\n // Filled dark text override for warning/success/info\n {\n variant: 'filled',\n type: ['warning', 'success', 'info'],\n class: { root: 'dark:!text-rui-light-text' },\n },\n\n // Outlined variant borders\n { variant: 'outlined', type: 'primary', class: { root: 'border-rui-primary' } },\n { variant: 'outlined', type: 'secondary', class: { root: 'border-rui-secondary' } },\n { variant: 'outlined', type: 'error', class: { root: 'border-rui-error' } },\n { variant: 'outlined', type: 'warning', class: { root: 'border-rui-warning' } },\n { variant: 'outlined', type: 'info', class: { root: 'border-rui-info' } },\n { variant: 'outlined', type: 'success', class: { root: 'border-rui-success' } },\n\n ],\n compoundSlots: [\n // Content text colors for default + outlined (shared across all content slots)\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'primary',\n class: 'text-rui-primary text-shade-[.6] color-mix-supported:text-rui-primary-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-primary-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'secondary',\n class: 'text-rui-secondary text-shade-[.6] color-mix-supported:text-rui-secondary-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-secondary-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'error',\n class: 'text-rui-error text-shade-[.6] color-mix-supported:text-rui-error-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-error-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'warning',\n class: 'text-rui-warning text-shade-[.6] color-mix-supported:text-rui-warning-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-warning-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'info',\n class: 'text-rui-info text-shade-[.6] color-mix-supported:text-rui-info-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-info-tint/[.6]',\n },\n {\n slots: ['icon', 'texts', 'action', 'close'],\n variant: ['default', 'outlined'],\n type: 'success',\n class: 'text-rui-success text-shade-[.6] color-mix-supported:text-rui-success-shade/[.6] color-mix-supported:animate-none dark:text-tint-[.6] dark:color-mix-supported:text-rui-success-tint/[.6]',\n },\n\n // Icon-only dark mode base color\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'primary', class: 'dark:text-rui-primary' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'secondary', class: 'dark:text-rui-secondary' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'error', class: 'dark:text-rui-error' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'warning', class: 'dark:text-rui-warning' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'info', class: 'dark:text-rui-info' },\n { slots: ['icon'], variant: ['default', 'outlined'], type: 'success', class: 'dark:text-rui-success' },\n ],\n});\n\nconst ui = computed<ReturnType<typeof alertStyles>>(() => alertStyles({ variant, type }));\n\nconst usedIcon = computed<RuiIcons | undefined>(() => {\n if (icon)\n return icon;\n\n const iconMap: Record<ContextColorsType, RuiIcons | undefined> = {\n primary: undefined,\n secondary: undefined,\n warning: 'lu-triangle-alert',\n info: 'lu-info',\n error: 'lu-circle-alert',\n success: 'lu-circle-check',\n };\n\n return iconMap[type];\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n v-bind=\"$attrs\"\n :data-variant=\"variant\"\n :data-type=\"type\"\n >\n <div :class=\"ui.content()\">\n <div\n v-if=\"usedIcon\"\n :class=\"ui.icon()\"\n >\n <RuiIcon\n :name=\"usedIcon\"\n size=\"22\"\n />\n </div>\n <div :class=\"ui.texts()\">\n <div\n v-if=\"$slots.title || title\"\n :class=\"{\n 'font-medium': !!title,\n }\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n\n <div\n v-if=\"$slots.default || description\"\n class=\"text-body-2\"\n >\n <slot>\n {{ description }}\n </slot>\n </div>\n </div>\n </div>\n <div v-if=\"actionText\">\n <RuiButton\n variant=\"text\"\n size=\"sm\"\n :color=\"variant === 'filled' ? undefined : type\"\n :class=\"ui.action()\"\n data-id=\"alert-action\"\n @click=\"emit('action')\"\n >\n {{ actionText }}\n </RuiButton>\n </div>\n <div v-if=\"closeable\">\n <RuiButton\n :color=\"variant === 'filled' ? undefined : type\"\n size=\"sm\"\n icon\n variant=\"text\"\n :class=\"ui.close()\"\n data-id=\"alert-close\"\n @click=\"emit('close')\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"20\"\n />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContextColorsType } from '../../consts/colors.js';
|
|
2
2
|
import type { RuiIcons } from '../../icons/index.js';
|
|
3
|
-
import { type AvatarSize, type AvatarVariant } from '
|
|
3
|
+
import { type AvatarSize, type AvatarVariant } from './avatar-props.js';
|
|
4
4
|
export interface Props {
|
|
5
5
|
src?: string | null;
|
|
6
6
|
alt?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAvatar.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../src/components/avatars/RuiAvatar.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport { get, set } from '@vueuse/shared';\nimport {\n type AvatarSize,\n type AvatarVariant,\n computeInitials,\n resolveAvatarIconPx,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport { useAvatarGroup } from '@/components/avatars/use-avatar-group';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n src?: string | null;\n alt?: string;\n text?: string | null;\n icon?: RuiIcons | null;\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n color?: 'default' | ContextColorsType;\n loading?: 'lazy' | 'eager';\n}\n\ndefineOptions({\n name: 'RuiAvatar',\n});\n\nconst {\n src = null,\n alt = '',\n text = null,\n icon = null,\n size,\n variant,\n color = 'default',\n loading = 'lazy',\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n load: [event: Event];\n error: [event: Event];\n}>();\n\nconst slots = defineSlots<{\n default?: () => any;\n}>();\n\nconst group = useAvatarGroup();\n\nconst resolvedSize = computed<AvatarSize | number>(() => {\n if (size !== undefined)\n return size;\n if (group)\n return get(group).size;\n return 'md';\n});\n\nconst resolvedVariant = computed<AvatarVariant>(() => {\n if (variant !== undefined)\n return variant;\n if (group)\n return get(group).variant;\n return 'circular';\n});\n\nconst sizeToken = computed<AvatarSize | undefined>(() => {\n const value = get(resolvedSize);\n return typeof value === 'string' ? value : undefined;\n});\n\nconst sizePx = computed<number>(() => resolveAvatarSizePx(get(resolvedSize)));\nconst iconPx = computed<number>(() => resolveAvatarIconPx(get(resolvedSize)));\n\nconst errored = ref<boolean>(false);\n\nwatch(() => src, () => {\n set(errored, false);\n});\n\nconst initials = computed<string>(() => {\n const explicit = computeInitials(text ?? undefined);\n if (explicit)\n return explicit;\n return computeInitials(alt);\n});\n\ntype DisplayMode = 'image' | 'slot' | 'initials' | 'icon' | 'empty';\n\nconst displayMode = computed<DisplayMode>(() => {\n if (src && !get(errored))\n return 'image';\n if (slots.default)\n return 'slot';\n if (icon)\n return 'icon';\n if (get(initials))\n return 'initials';\n return 'empty';\n});\n\nconst decorative = computed<boolean>(() => alt === '' && !text);\n\nconst ariaLabel = computed<string | undefined>(() => {\n if (get(displayMode) === 'image')\n return undefined;\n if (get(decorative))\n return undefined;\n return text ?? alt ?? undefined;\n});\n\nconst rootStyle = computed<Record<string, string>>(() => {\n const px = `${get(sizePx)}px`;\n return { width: px, height: px };\n});\n\nconst avatarStyles = tv({\n slots: {\n root: 'relative inline-flex items-center justify-center shrink-0 overflow-hidden select-none font-medium align-middle',\n image: 'w-full h-full object-cover',\n fallback: 'w-full h-full flex items-center justify-center',\n initials: 'uppercase leading-none',\n },\n variants: {\n variant: {\n circular: { root: 'rounded-full' },\n rounded: { root: 'rounded-md' },\n square: { root: 'rounded-none' },\n },\n color: {\n default: { root: 'bg-rui-grey-200 text-rui-text dark:bg-rui-grey-800' },\n primary: { root: 'bg-rui-primary text-white' },\n secondary: { root: 'bg-rui-secondary text-white' },\n error: { root: 'bg-rui-error text-white' },\n warning: { root: 'bg-rui-warning text-white' },\n info: { root: 'bg-rui-info text-white' },\n success: { root: 'bg-rui-success text-white' },\n },\n size: {\n 'xs': { initials: 'text-[0.625rem]' },\n 'sm': { initials: 'text-[0.6875rem]' },\n 'md': { initials: 'text-sm' },\n 'lg': { initials: 'text-base' },\n 'xl': { initials: 'text-lg' },\n '2xl': { initials: 'text-xl' },\n },\n },\n compoundSlots: [\n { slots: ['root'], color: ['warning', 'success', 'info'], class: 'dark:text-rui-light-text' },\n ],\n defaultVariants: {\n variant: 'circular',\n color: 'default',\n size: 'md',\n },\n});\n\nconst ui = computed<ReturnType<typeof avatarStyles>>(() => avatarStyles({\n variant: get(resolvedVariant),\n color,\n size: get(sizeToken),\n}));\n\nfunction onLoad(event: Event): void {\n set(errored, false);\n emit('load', event);\n}\n\nfunction onError(event: Event): void {\n set(errored, true);\n emit('error', event);\n}\n</script>\n\n<template>\n <span\n :class=\"ui.root()\"\n :style=\"rootStyle\"\n :role=\"displayMode === 'image' ? undefined : 'img'\"\n :aria-label=\"ariaLabel\"\n :data-id=\"$attrs['data-id'] ?? 'avatar-root'\"\n :data-size=\"typeof resolvedSize === 'string' ? resolvedSize : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-color=\"color\"\n >\n <img\n v-if=\"displayMode === 'image' && src\"\n :class=\"ui.image()\"\n :src=\"src\"\n :alt=\"alt\"\n :loading=\"loading\"\n :width=\"sizePx\"\n :height=\"sizePx\"\n data-id=\"avatar-image\"\n @load=\"onLoad($event)\"\n @error=\"onError($event)\"\n />\n <span\n v-else\n :class=\"ui.fallback()\"\n data-id=\"avatar-fallback\"\n aria-hidden=\"true\"\n >\n <slot v-if=\"displayMode === 'slot'\" />\n <span\n v-else-if=\"displayMode === 'initials'\"\n :class=\"ui.initials()\"\n data-id=\"avatar-initials\"\n >\n {{ initials }}\n </span>\n <RuiIcon\n v-else-if=\"displayMode === 'icon' && icon\"\n :name=\"icon\"\n :size=\"iconPx\"\n data-id=\"avatar-icon\"\n />\n <span v-else> </span>\n </span>\n </span>\n</template>\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"RuiAvatar.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../src/components/avatars/RuiAvatar.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport { get, set } from '@vueuse/shared';\nimport {\n type AvatarSize,\n type AvatarVariant,\n computeInitials,\n resolveAvatarIconPx,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport { useAvatarGroup } from '@/components/avatars/use-avatar-group';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n src?: string | null;\n alt?: string;\n text?: string | null;\n icon?: RuiIcons | null;\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n color?: 'default' | ContextColorsType;\n loading?: 'lazy' | 'eager';\n}\n\ndefineOptions({\n name: 'RuiAvatar',\n});\n\nconst {\n src = null,\n alt = '',\n text = null,\n icon = null,\n size,\n variant,\n color = 'default',\n loading = 'lazy',\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n load: [event: Event];\n error: [event: Event];\n}>();\n\nconst slots = defineSlots<{\n default?: () => any;\n}>();\n\nconst group = useAvatarGroup();\n\nconst resolvedSize = computed<AvatarSize | number>(() => {\n if (size !== undefined)\n return size;\n if (group)\n return get(group).size;\n return 'md';\n});\n\nconst resolvedVariant = computed<AvatarVariant>(() => {\n if (variant !== undefined)\n return variant;\n if (group)\n return get(group).variant;\n return 'circular';\n});\n\nconst sizeToken = computed<AvatarSize | undefined>(() => {\n const value = get(resolvedSize);\n return typeof value === 'string' ? value : undefined;\n});\n\nconst sizePx = computed<number>(() => resolveAvatarSizePx(get(resolvedSize)));\nconst iconPx = computed<number>(() => resolveAvatarIconPx(get(resolvedSize)));\n\nconst errored = ref<boolean>(false);\n\nwatch(() => src, () => {\n set(errored, false);\n});\n\nconst initials = computed<string>(() => {\n const explicit = computeInitials(text ?? undefined);\n if (explicit)\n return explicit;\n return computeInitials(alt);\n});\n\ntype DisplayMode = 'image' | 'slot' | 'initials' | 'icon' | 'empty';\n\nconst displayMode = computed<DisplayMode>(() => {\n if (src && !get(errored))\n return 'image';\n if (slots.default)\n return 'slot';\n if (icon)\n return 'icon';\n if (get(initials))\n return 'initials';\n return 'empty';\n});\n\nconst decorative = computed<boolean>(() => alt === '' && !text);\n\nconst ariaLabel = computed<string | undefined>(() => {\n if (get(displayMode) === 'image')\n return undefined;\n if (get(decorative))\n return undefined;\n return text ?? alt ?? undefined;\n});\n\nconst rootStyle = computed<Record<string, string>>(() => {\n const px = `${get(sizePx)}px`;\n return { width: px, height: px };\n});\n\nconst avatarStyles = tv({\n slots: {\n root: 'relative inline-flex items-center justify-center shrink-0 overflow-hidden select-none font-medium align-middle',\n image: 'w-full h-full object-cover',\n fallback: 'w-full h-full flex items-center justify-center',\n initials: 'uppercase leading-none',\n },\n variants: {\n variant: {\n circular: { root: 'rounded-full' },\n rounded: { root: 'rounded-md' },\n square: { root: 'rounded-none' },\n },\n color: {\n default: { root: 'bg-rui-grey-200 text-rui-text dark:bg-rui-grey-800' },\n primary: { root: 'bg-rui-primary text-white' },\n secondary: { root: 'bg-rui-secondary text-white' },\n error: { root: 'bg-rui-error text-white' },\n warning: { root: 'bg-rui-warning text-white' },\n info: { root: 'bg-rui-info text-white' },\n success: { root: 'bg-rui-success text-white' },\n },\n size: {\n 'xs': { initials: 'text-[0.625rem]' },\n 'sm': { initials: 'text-[0.6875rem]' },\n 'md': { initials: 'text-sm' },\n 'lg': { initials: 'text-base' },\n 'xl': { initials: 'text-lg' },\n '2xl': { initials: 'text-xl' },\n },\n },\n compoundSlots: [\n { slots: ['root'], color: ['warning', 'success', 'info'], class: 'dark:text-rui-light-text' },\n ],\n defaultVariants: {\n variant: 'circular',\n color: 'default',\n size: 'md',\n },\n});\n\nconst ui = computed<ReturnType<typeof avatarStyles>>(() => avatarStyles({\n variant: get(resolvedVariant),\n color,\n size: get(sizeToken),\n}));\n\nfunction onLoad(event: Event): void {\n set(errored, false);\n emit('load', event);\n}\n\nfunction onError(event: Event): void {\n set(errored, true);\n emit('error', event);\n}\n</script>\n\n<template>\n <span\n :class=\"ui.root()\"\n :style=\"rootStyle\"\n :role=\"displayMode === 'image' ? undefined : 'img'\"\n :aria-label=\"ariaLabel\"\n :data-id=\"$attrs['data-id'] ?? 'avatar-root'\"\n :data-size=\"typeof resolvedSize === 'string' ? resolvedSize : undefined\"\n :data-variant=\"resolvedVariant\"\n :data-color=\"color\"\n >\n <img\n v-if=\"displayMode === 'image' && src\"\n :class=\"ui.image()\"\n :src=\"src\"\n :alt=\"alt\"\n :loading=\"loading\"\n :width=\"sizePx\"\n :height=\"sizePx\"\n data-id=\"avatar-image\"\n @load=\"onLoad($event)\"\n @error=\"onError($event)\"\n />\n <span\n v-else\n :class=\"ui.fallback()\"\n data-id=\"avatar-fallback\"\n aria-hidden=\"true\"\n >\n <slot v-if=\"displayMode === 'slot'\" />\n <span\n v-else-if=\"displayMode === 'initials'\"\n :class=\"ui.initials()\"\n data-id=\"avatar-initials\"\n >\n {{ initials }}\n </span>\n <RuiIcon\n v-else-if=\"displayMode === 'icon' && icon\"\n :name=\"icon\"\n :size=\"iconPx\"\n data-id=\"avatar-icon\"\n />\n <span v-else> </span>\n </span>\n </span>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAvatarGroup.js","names":[],"sources":["../../../src/components/avatars/RuiAvatarGroup.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { get } from '@vueuse/shared';\nimport { Comment, defineComponent, Fragment, Text, type VNode } from 'vue';\nimport {\n AVATAR_GROUP_SPACING_PX,\n avatarGroupInjectionKey,\n AvatarGroupSpacing,\n type AvatarSize,\n type AvatarVariant,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport RuiAvatar from '@/components/avatars/RuiAvatar.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n max?: number;\n total?: number;\n spacing?: AvatarGroupSpacing | number;\n}\n\ndefineOptions({\n name: 'RuiAvatarGroup',\n});\n\nconst {\n size,\n variant = 'circular',\n max,\n total,\n spacing = AvatarGroupSpacing.md,\n} = defineProps<Props>();\n\nconst slots = defineSlots<{\n default?: () => VNode[];\n surplus?: (props: { count: number }) => any;\n}>();\n\nconst resolvedSize = computed<AvatarSize | number>(() => size ?? 'md');\n\nconst VNodeRenderer = defineComponent<{ vnode: VNode }>({\n props: ['vnode'],\n setup(props) {\n return (): VNode => props.vnode;\n },\n});\n\nprovide(avatarGroupInjectionKey, computed(() => ({ size: get(resolvedSize), variant })));\n\nconst groupStyles = tv({\n slots: {\n root: 'inline-flex items-center isolate',\n item: 'relative ring-2 ring-white dark:ring-rui-grey-900 rounded-full',\n },\n});\n\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes)\n return [];\n const out: VNode[] = [];\n for (const node of nodes) {\n if (node.type === Comment)\n continue;\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '')\n continue;\n if (node.type === Fragment && Array.isArray(node.children)) {\n const inner = node.children.filter((c): c is VNode => typeof c === 'object' && c !== null && 'type' in c);\n out.push(...flattenChildren(inner));\n continue;\n }\n out.push(node);\n }\n return out;\n}\n\nconst children = computed<VNode[]>(() => flattenChildren(slots.default?.()));\n\nconst visible = computed<VNode[]>(() => {\n if (max === undefined)\n return get(children);\n return get(children).slice(0, max);\n});\n\nconst surplusCount = computed<number>(() => {\n const totalCount = total ?? get(children).length;\n const shown = get(visible).length;\n return Math.max(0, totalCount - shown);\n});\n\nconst spacingPx = computed<number>(() => {\n if (typeof spacing === 'number')\n return spacing;\n return AVATAR_GROUP_SPACING_PX[spacing];\n});\n\
|
|
1
|
+
{"version":3,"file":"RuiAvatarGroup.js","names":[],"sources":["../../../src/components/avatars/RuiAvatarGroup.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { get } from '@vueuse/shared';\nimport { Comment, defineComponent, Fragment, Text, type VNode } from 'vue';\nimport {\n AVATAR_GROUP_SPACING_PX,\n avatarGroupInjectionKey,\n AvatarGroupSpacing,\n type AvatarSize,\n type AvatarVariant,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport RuiAvatar from '@/components/avatars/RuiAvatar.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n max?: number;\n total?: number;\n spacing?: AvatarGroupSpacing | number;\n}\n\ndefineOptions({\n name: 'RuiAvatarGroup',\n});\n\nconst {\n size,\n variant = 'circular',\n max,\n total,\n spacing = AvatarGroupSpacing.md,\n} = defineProps<Props>();\n\nconst slots = defineSlots<{\n default?: () => VNode[];\n surplus?: (props: { count: number }) => any;\n}>();\n\nconst resolvedSize = computed<AvatarSize | number>(() => size ?? 'md');\n\nconst VNodeRenderer = defineComponent<{ vnode: VNode }>({\n props: ['vnode'],\n setup(props) {\n return (): VNode => props.vnode;\n },\n});\n\nprovide(avatarGroupInjectionKey, computed(() => ({ size: get(resolvedSize), variant })));\n\nconst groupStyles = tv({\n slots: {\n root: 'inline-flex items-center isolate',\n item: 'relative ring-2 ring-white dark:ring-rui-grey-900 rounded-full',\n },\n});\n\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes)\n return [];\n const out: VNode[] = [];\n for (const node of nodes) {\n if (node.type === Comment)\n continue;\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '')\n continue;\n if (node.type === Fragment && Array.isArray(node.children)) {\n const inner = node.children.filter((c): c is VNode => typeof c === 'object' && c !== null && 'type' in c);\n out.push(...flattenChildren(inner));\n continue;\n }\n out.push(node);\n }\n return out;\n}\n\nconst children = computed<VNode[]>(() => flattenChildren(slots.default?.()));\n\nconst visible = computed<VNode[]>(() => {\n if (max === undefined)\n return get(children);\n return get(children).slice(0, max);\n});\n\nconst surplusCount = computed<number>(() => {\n const totalCount = total ?? get(children).length;\n const shown = get(visible).length;\n return Math.max(0, totalCount - shown);\n});\n\nconst spacingPx = computed<number>(() => {\n if (typeof spacing === 'number')\n return spacing;\n return AVATAR_GROUP_SPACING_PX[spacing];\n});\n\n// The configured spacing, which is already negative, so the items overlap\nconst ringOffsetPx = computed<number>(() => get(spacingPx));\n\nconst itemStyle = computed<Record<string, string>>(() => ({\n marginInlineStart: `${get(ringOffsetPx)}px`,\n}));\n\nconst firstItemStyle = computed<Record<string, string>>(() => ({\n marginInlineStart: '0',\n}));\n\nconst avatarPx = computed<number>(() => resolveAvatarSizePx(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof groupStyles>>(() => groupStyles());\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"avatar-group\"\n :data-size=\"typeof resolvedSize === 'string' ? resolvedSize : undefined\"\n :data-variant=\"variant\"\n >\n <span\n v-for=\"(child, index) in visible\"\n :key=\"child.key ?? index\"\n :class=\"ui.item()\"\n :style=\"index === 0 ? firstItemStyle : itemStyle\"\n >\n <VNodeRenderer :vnode=\"child\" />\n </span>\n <span\n v-if=\"surplusCount > 0\"\n :class=\"ui.item()\"\n :style=\"visible.length === 0 ? firstItemStyle : itemStyle\"\n data-id=\"avatar-group-surplus\"\n >\n <slot\n name=\"surplus\"\n :count=\"surplusCount\"\n >\n <RuiAvatar\n :size=\"resolvedSize\"\n :variant=\"variant\"\n :alt=\"`+${surplusCount} more`\"\n :style=\"{ width: `${avatarPx}px`, height: `${avatarPx}px` }\"\n >\n <span class=\"leading-none\">+{{ surplusCount }}</span>\n </RuiAvatar>\n </slot>\n </span>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type VNode } from 'vue';
|
|
2
|
-
import { AvatarGroupSpacing, type AvatarSize, type AvatarVariant } from '
|
|
2
|
+
import { AvatarGroupSpacing, type AvatarSize, type AvatarVariant } from './avatar-props.js';
|
|
3
3
|
export interface Props {
|
|
4
4
|
size?: AvatarSize | number;
|
|
5
5
|
variant?: AvatarVariant;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/avatars/RuiAvatarGroup.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { get } from '@vueuse/shared';\nimport { Comment, defineComponent, Fragment, Text, type VNode } from 'vue';\nimport {\n AVATAR_GROUP_SPACING_PX,\n avatarGroupInjectionKey,\n AvatarGroupSpacing,\n type AvatarSize,\n type AvatarVariant,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport RuiAvatar from '@/components/avatars/RuiAvatar.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n max?: number;\n total?: number;\n spacing?: AvatarGroupSpacing | number;\n}\n\ndefineOptions({\n name: 'RuiAvatarGroup',\n});\n\nconst {\n size,\n variant = 'circular',\n max,\n total,\n spacing = AvatarGroupSpacing.md,\n} = defineProps<Props>();\n\nconst slots = defineSlots<{\n default?: () => VNode[];\n surplus?: (props: { count: number }) => any;\n}>();\n\nconst resolvedSize = computed<AvatarSize | number>(() => size ?? 'md');\n\nconst VNodeRenderer = defineComponent<{ vnode: VNode }>({\n props: ['vnode'],\n setup(props) {\n return (): VNode => props.vnode;\n },\n});\n\nprovide(avatarGroupInjectionKey, computed(() => ({ size: get(resolvedSize), variant })));\n\nconst groupStyles = tv({\n slots: {\n root: 'inline-flex items-center isolate',\n item: 'relative ring-2 ring-white dark:ring-rui-grey-900 rounded-full',\n },\n});\n\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes)\n return [];\n const out: VNode[] = [];\n for (const node of nodes) {\n if (node.type === Comment)\n continue;\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '')\n continue;\n if (node.type === Fragment && Array.isArray(node.children)) {\n const inner = node.children.filter((c): c is VNode => typeof c === 'object' && c !== null && 'type' in c);\n out.push(...flattenChildren(inner));\n continue;\n }\n out.push(node);\n }\n return out;\n}\n\nconst children = computed<VNode[]>(() => flattenChildren(slots.default?.()));\n\nconst visible = computed<VNode[]>(() => {\n if (max === undefined)\n return get(children);\n return get(children).slice(0, max);\n});\n\nconst surplusCount = computed<number>(() => {\n const totalCount = total ?? get(children).length;\n const shown = get(visible).length;\n return Math.max(0, totalCount - shown);\n});\n\nconst spacingPx = computed<number>(() => {\n if (typeof spacing === 'number')\n return spacing;\n return AVATAR_GROUP_SPACING_PX[spacing];\n});\n\
|
|
1
|
+
{"version":3,"file":"RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/avatars/RuiAvatarGroup.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { get } from '@vueuse/shared';\nimport { Comment, defineComponent, Fragment, Text, type VNode } from 'vue';\nimport {\n AVATAR_GROUP_SPACING_PX,\n avatarGroupInjectionKey,\n AvatarGroupSpacing,\n type AvatarSize,\n type AvatarVariant,\n resolveAvatarSizePx,\n} from '@/components/avatars/avatar-props';\nimport RuiAvatar from '@/components/avatars/RuiAvatar.vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n size?: AvatarSize | number;\n variant?: AvatarVariant;\n max?: number;\n total?: number;\n spacing?: AvatarGroupSpacing | number;\n}\n\ndefineOptions({\n name: 'RuiAvatarGroup',\n});\n\nconst {\n size,\n variant = 'circular',\n max,\n total,\n spacing = AvatarGroupSpacing.md,\n} = defineProps<Props>();\n\nconst slots = defineSlots<{\n default?: () => VNode[];\n surplus?: (props: { count: number }) => any;\n}>();\n\nconst resolvedSize = computed<AvatarSize | number>(() => size ?? 'md');\n\nconst VNodeRenderer = defineComponent<{ vnode: VNode }>({\n props: ['vnode'],\n setup(props) {\n return (): VNode => props.vnode;\n },\n});\n\nprovide(avatarGroupInjectionKey, computed(() => ({ size: get(resolvedSize), variant })));\n\nconst groupStyles = tv({\n slots: {\n root: 'inline-flex items-center isolate',\n item: 'relative ring-2 ring-white dark:ring-rui-grey-900 rounded-full',\n },\n});\n\nfunction flattenChildren(nodes: VNode[] | undefined): VNode[] {\n if (!nodes)\n return [];\n const out: VNode[] = [];\n for (const node of nodes) {\n if (node.type === Comment)\n continue;\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '')\n continue;\n if (node.type === Fragment && Array.isArray(node.children)) {\n const inner = node.children.filter((c): c is VNode => typeof c === 'object' && c !== null && 'type' in c);\n out.push(...flattenChildren(inner));\n continue;\n }\n out.push(node);\n }\n return out;\n}\n\nconst children = computed<VNode[]>(() => flattenChildren(slots.default?.()));\n\nconst visible = computed<VNode[]>(() => {\n if (max === undefined)\n return get(children);\n return get(children).slice(0, max);\n});\n\nconst surplusCount = computed<number>(() => {\n const totalCount = total ?? get(children).length;\n const shown = get(visible).length;\n return Math.max(0, totalCount - shown);\n});\n\nconst spacingPx = computed<number>(() => {\n if (typeof spacing === 'number')\n return spacing;\n return AVATAR_GROUP_SPACING_PX[spacing];\n});\n\n// The configured spacing, which is already negative, so the items overlap\nconst ringOffsetPx = computed<number>(() => get(spacingPx));\n\nconst itemStyle = computed<Record<string, string>>(() => ({\n marginInlineStart: `${get(ringOffsetPx)}px`,\n}));\n\nconst firstItemStyle = computed<Record<string, string>>(() => ({\n marginInlineStart: '0',\n}));\n\nconst avatarPx = computed<number>(() => resolveAvatarSizePx(get(resolvedSize)));\n\nconst ui = computed<ReturnType<typeof groupStyles>>(() => groupStyles());\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"avatar-group\"\n :data-size=\"typeof resolvedSize === 'string' ? resolvedSize : undefined\"\n :data-variant=\"variant\"\n >\n <span\n v-for=\"(child, index) in visible\"\n :key=\"child.key ?? index\"\n :class=\"ui.item()\"\n :style=\"index === 0 ? firstItemStyle : itemStyle\"\n >\n <VNodeRenderer :vnode=\"child\" />\n </span>\n <span\n v-if=\"surplusCount > 0\"\n :class=\"ui.item()\"\n :style=\"visible.length === 0 ? firstItemStyle : itemStyle\"\n data-id=\"avatar-group-surplus\"\n >\n <slot\n name=\"surplus\"\n :count=\"surplusCount\"\n >\n <RuiAvatar\n :size=\"resolvedSize\"\n :variant=\"variant\"\n :alt=\"`+${surplusCount} more`\"\n :style=\"{ width: `${avatarPx}px`, height: `${avatarPx}px` }\"\n >\n <span class=\"leading-none\">+{{ surplusCount }}</span>\n </RuiAvatar>\n </slot>\n </span>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { ComputedRef } from 'vue';
|
|
2
|
-
import { type AvatarGroupContext } from '
|
|
2
|
+
import { type AvatarGroupContext } from './avatar-props.js';
|
|
3
3
|
export declare function useAvatarGroup(): ComputedRef<AvatarGroupContext> | undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ContextColorsType } from '../../../consts/colors.js';
|
|
2
|
-
import { type ButtonSize, ButtonVariant } from '
|
|
2
|
+
import { type ButtonSize, ButtonVariant } from './button-props.js';
|
|
3
3
|
export interface Props<T = undefined> {
|
|
4
4
|
disabled?: boolean;
|
|
5
5
|
loading?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiButton.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { type ButtonSize, ButtonVariant, FAB_DEFAULT_ELEVATION, getButtonSpinnerSize, NO_ELEVATION } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n elevation?: number | string | null;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n elevation = null,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst defaultElevation = computed<number>(() => variant === ButtonVariant.fab ? FAB_DEFAULT_ELEVATION : NO_ELEVATION);\nconst usedElevation = computed<number | string>(() => disabled ? NO_ELEVATION : elevation ?? get(defaultElevation));\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(size));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant,\n color: color ?? 'grey',\n size,\n rounded,\n icon,\n active,\n loading,\n hideFocusIndicator,\n}));\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"[\n ui.root({ class: cn($attrs.class) }),\n `shadow-${usedElevation}`,\n ]\"\n :disabled=\"disabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"variant\"\n :data-color=\"color\"\n :data-active=\"active || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"emit('update:model-value', btnValue)\"\n >\n <slot name=\"prepend\" />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n </Component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CA,MAAM,OAAO;EAIb,MAAM,QAAQ,SAAA;EAMd,MAAM,WAAW,eAA8B,QAAA,UAAU;EAEzD,MAAM,mBAAmB,eAAuB,QAAA,YAAY,cAAc,MAAA,IAAA,CAA0C;EACpH,MAAM,gBAAgB,eAAgC,QAAA,WAAA,IAA0B,QAAA,aAAa,IAAI,gBAAgB,CAAC;EAElH,MAAM,cAAc,eAAuB,qBAAqB,QAAA,IAAI,CAAC;EAErE,MAAM,KAAK,eAAgD,aAAa;GACtE,SAAM,QAAA;GACN,OAAO,QAAA,SAAS;GAChB,MAAG,QAAA;GACH,SAAM,QAAA;GACN,MAAG,QAAA;GACH,QAAK,QAAA;GACL,SAAM,QAAA;GACN,oBAAiB,QAAA;EACnB,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"RuiButton.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/buttons/button/RuiButton.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { type ButtonSize, ButtonVariant, FAB_DEFAULT_ELEVATION, getButtonSpinnerSize, NO_ELEVATION } from '@/components/buttons/button/button-props';\nimport { buttonStyles } from '@/components/buttons/button/button-styles';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { cn } from '@/utils/tv';\n\nexport interface Props<T = undefined> {\n disabled?: boolean;\n loading?: boolean;\n color?: ContextColorsType;\n rounded?: boolean;\n elevation?: number | string | null;\n variant?: ButtonVariant;\n icon?: boolean;\n active?: boolean;\n size?: ButtonSize;\n tag?: 'button' | 'a';\n type?: 'button' | 'submit';\n modelValue?: T;\n hideFocusIndicator?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButton',\n inheritAttrs: false,\n});\n\nconst {\n disabled = false,\n loading = false,\n color = undefined,\n rounded = false,\n elevation = null,\n variant = ButtonVariant.default,\n icon = false,\n active = false,\n size = undefined,\n tag = 'button',\n type = 'button',\n modelValue = undefined,\n hideFocusIndicator = false,\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'update:model-value': [value?: T];\n}>();\n\nconst slots = defineSlots<{\n prepend?: () => any;\n append?: () => any;\n default?: () => any;\n}>();\n\nconst btnValue = computed<T | undefined>(() => modelValue);\n\nconst defaultElevation = computed<number>(() => variant === ButtonVariant.fab ? FAB_DEFAULT_ELEVATION : NO_ELEVATION);\nconst usedElevation = computed<number | string>(() => disabled ? NO_ELEVATION : elevation ?? get(defaultElevation));\n\nconst spinnerSize = computed<number>(() => getButtonSpinnerSize(size));\n\nconst ui = computed<ReturnType<typeof buttonStyles>>(() => buttonStyles({\n variant,\n color: color ?? 'grey',\n size,\n rounded,\n icon,\n active,\n loading,\n hideFocusIndicator,\n}));\n</script>\n\n<template>\n <Component\n :is=\"tag\"\n :class=\"[\n ui.root({ class: cn($attrs.class) }),\n `shadow-${usedElevation}`,\n ]\"\n :disabled=\"disabled || loading\"\n :type=\"tag === 'button' ? type : undefined\"\n :data-variant=\"variant\"\n :data-color=\"color\"\n :data-active=\"active || undefined\"\n v-bind=\"{ ...$attrs, class: undefined }\"\n @click=\"emit('update:model-value', btnValue)\"\n >\n <slot name=\"prepend\" />\n <span\n v-if=\"slots.default\"\n :class=\"ui.label()\"\n data-id=\"btn-label\"\n >\n <slot />\n </span>\n <slot name=\"append\" />\n <RuiProgress\n v-if=\"loading\"\n circular\n data-spinner\n :class=\"ui.spinner()\"\n variant=\"indeterminate\"\n thickness=\"2\"\n :size=\"spinnerSize\"\n />\n </Component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CA,MAAM,OAAO;EAIb,MAAM,QAAQ,SAAA;EAMd,MAAM,WAAW,eAA8B,QAAA,UAAU;EAEzD,MAAM,mBAAmB,eAAuB,QAAA,YAAY,cAAc,MAAA,IAAA,CAA0C;EACpH,MAAM,gBAAgB,eAAgC,QAAA,WAAA,IAA0B,QAAA,aAAa,IAAI,gBAAgB,CAAC;EAElH,MAAM,cAAc,eAAuB,qBAAqB,QAAA,IAAI,CAAC;EAErE,MAAM,KAAK,eAAgD,aAAa;GACtE,SAAM,QAAA;GACN,OAAO,QAAA,SAAS;GAChB,MAAG,QAAA;GACH,SAAM,QAAA;GACN,MAAG,QAAA;GACH,QAAK,QAAA;GACL,SAAM,QAAA;GACN,oBAAiB,QAAA;EACnB,CAAC,CAAC;;GAIA,OAAA,UAAA,GAAA,YAgCY,wBA/BL,QAAA,GAAG,GADV,WAgCY;IA9BT,OAAK,CAAU,MAAA,EAAA,CAAE,CAAC,KAAI,EAAA,OAAU,MAAA,EAAA,CAAE,CAACA,KAAAA,OAAO,KAAK,EAAA,CAAA,GAAsB,UAAA,MAAA,aAAA,GAAA;IAIrE,UAAU,QAAA,YAAY,QAAA;IACtB,MAAM,QAAA,QAAG,WAAgB,QAAA,OAAO,KAAA;IAChC,gBAAc,QAAA;IACd,cAAY,QAAA;IACZ,eAAa,QAAA,UAAU,KAAA;GACXA,GAAAA;IAAAA,GAAAA,KAAAA;IAAM,OAAS,KAAA;GAAS,GAAA,EACpC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,sBAAuB,MAAA,QAAA,CAAQ,GAAA,CAAA,GAAA;IAE3C,SAAA,cAAuB;KAAvB,WAAuB,KAAA,QAAA,SAAA;KAEf,MAAM,WADd,UAAA,GAAA,mBAMO,QAAA;;MAJJ,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;MAChB,WAAQ;KAER,GAAA,CAAA,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAEV,WAAsB,KAAA,QAAA,QAAA;KAEd,QAAA,WADR,UAAA,GAAA,YAQE,qBAAA;;MANA,UAAA;MACA,gBAAA;MACC,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;MAClB,SAAQ;MACR,WAAU;MACT,MAAM,MAAA,WAAA"}
|
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The button's classes.
|
|
3
|
+
*
|
|
4
|
+
* Three decisions the class lists cannot state themselves:
|
|
5
|
+
*
|
|
6
|
+
* `position: relative` is not in the base root: it is only a positioning
|
|
7
|
+
* context for the loading spinner, so the `loading` variant applies it.
|
|
8
|
+
* Basing it here would collide with consumers pinning the button with
|
|
9
|
+
* `fixed`/`absolute`, since cascade order picks the later utility, usually
|
|
10
|
+
* `relative`, and turns their `right-*`/`bottom-*` into relative offsets,
|
|
11
|
+
* which misplaces FABs.
|
|
12
|
+
*
|
|
13
|
+
* Icon sizing flows through the `--rui-icon-size` custom property, seeded at
|
|
14
|
+
* the md value in the base root and redefined per size variant with `!` so a
|
|
15
|
+
* variant beats the baseline on the same element regardless of source order.
|
|
16
|
+
* RuiIcon's own `size` prop stamps an inline style on the svg, which beats the
|
|
17
|
+
* inherited value, so a consumer always wins. See rotki/ui-library#512.
|
|
18
|
+
*
|
|
19
|
+
* `disabled` on the element covers two states: actually disabled, and loading,
|
|
20
|
+
* since RuiButton sets `disabled = disabled || loading`. Only the cursor is
|
|
21
|
+
* shared between them; the grey disabled palette lives in the `loading: false`
|
|
22
|
+
* compounds, so a loading button keeps its variant color behind the spinner.
|
|
23
|
+
*
|
|
24
|
+
* An icon-only button matches the height of the text button of the same size,
|
|
25
|
+
* with a 60-70% glyph ratio, which is a larger glyph than the same size gives
|
|
26
|
+
* a prepend/append icon so it does not look lost in the square. xs pads by an
|
|
27
|
+
* arbitrary 0.1875rem because no Tailwind token holds the ratio at a 14px
|
|
28
|
+
* glyph:
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
* xs p-[0.1875rem] + 0.875rem icon = 1.25rem (20px) 70%
|
|
32
|
+
* sm p-1 + 1.25rem icon = 1.75rem (28px) 71%
|
|
33
|
+
* md (default) p-1.5 + 1.25rem icon = 2rem (32px) 63%
|
|
34
|
+
* lg p-1.5 + 1.5rem icon = 2.25rem (36px) 67%
|
|
35
|
+
* xl p-2 + 1.5rem icon = 2.5rem (40px) 60%
|
|
36
|
+
* 2xl p-2 + 1.75rem icon = 2.75rem (44px) 64%
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
1
39
|
export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
|
|
2
40
|
variant: {
|
|
3
41
|
default: {};
|
|
@@ -166,7 +204,7 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
|
|
|
166
204
|
root: string;
|
|
167
205
|
label: string;
|
|
168
206
|
spinner: string;
|
|
169
|
-
}, import("tailwind-variants").
|
|
207
|
+
}, import("tailwind-variants").TVReturnTypeLike<{
|
|
170
208
|
variant: {
|
|
171
209
|
default: {};
|
|
172
210
|
outlined: {};
|
|
@@ -250,4 +288,4 @@ export declare const buttonStyles: import("tailwind-variants").TVReturnType<{
|
|
|
250
288
|
root: string;
|
|
251
289
|
label: string;
|
|
252
290
|
spinner: string;
|
|
253
|
-
}
|
|
291
|
+
}>>;
|
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
import { tv } from "../../../utils/tv.js";
|
|
2
2
|
//#region src/components/buttons/button/button-styles.ts
|
|
3
|
+
/**
|
|
4
|
+
* The button's classes.
|
|
5
|
+
*
|
|
6
|
+
* Three decisions the class lists cannot state themselves:
|
|
7
|
+
*
|
|
8
|
+
* `position: relative` is not in the base root: it is only a positioning
|
|
9
|
+
* context for the loading spinner, so the `loading` variant applies it.
|
|
10
|
+
* Basing it here would collide with consumers pinning the button with
|
|
11
|
+
* `fixed`/`absolute`, since cascade order picks the later utility, usually
|
|
12
|
+
* `relative`, and turns their `right-*`/`bottom-*` into relative offsets,
|
|
13
|
+
* which misplaces FABs.
|
|
14
|
+
*
|
|
15
|
+
* Icon sizing flows through the `--rui-icon-size` custom property, seeded at
|
|
16
|
+
* the md value in the base root and redefined per size variant with `!` so a
|
|
17
|
+
* variant beats the baseline on the same element regardless of source order.
|
|
18
|
+
* RuiIcon's own `size` prop stamps an inline style on the svg, which beats the
|
|
19
|
+
* inherited value, so a consumer always wins. See rotki/ui-library#512.
|
|
20
|
+
*
|
|
21
|
+
* `disabled` on the element covers two states: actually disabled, and loading,
|
|
22
|
+
* since RuiButton sets `disabled = disabled || loading`. Only the cursor is
|
|
23
|
+
* shared between them; the grey disabled palette lives in the `loading: false`
|
|
24
|
+
* compounds, so a loading button keeps its variant color behind the spinner.
|
|
25
|
+
*
|
|
26
|
+
* An icon-only button matches the height of the text button of the same size,
|
|
27
|
+
* with a 60-70% glyph ratio, which is a larger glyph than the same size gives
|
|
28
|
+
* a prepend/append icon so it does not look lost in the square. xs pads by an
|
|
29
|
+
* arbitrary 0.1875rem because no Tailwind token holds the ratio at a 14px
|
|
30
|
+
* glyph:
|
|
31
|
+
*
|
|
32
|
+
* ```
|
|
33
|
+
* xs p-[0.1875rem] + 0.875rem icon = 1.25rem (20px) 70%
|
|
34
|
+
* sm p-1 + 1.25rem icon = 1.75rem (28px) 71%
|
|
35
|
+
* md (default) p-1.5 + 1.25rem icon = 2rem (32px) 63%
|
|
36
|
+
* lg p-1.5 + 1.5rem icon = 2.25rem (36px) 67%
|
|
37
|
+
* xl p-2 + 1.5rem icon = 2.5rem (40px) 60%
|
|
38
|
+
* 2xl p-2 + 1.75rem icon = 2.75rem (44px) 64%
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
3
41
|
var buttonStyles = tv({
|
|
4
42
|
slots: {
|
|
5
43
|
root: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button-styles.js","names":[],"sources":["../../../../src/components/buttons/button/button-styles.ts"],"sourcesContent":["import { tv } from '@/utils/tv';\n\nexport const buttonStyles = tv({\n slots: {\n root: [\n 'text-sm leading-5 font-medium outline outline-1 outline-transparent outline-offset-[-1px]',\n // `position: relative` is only needed as a positioning context for the\n // absolute-positioned loading spinner; applied via the `loading` variant\n // below. Putting it here would collide with consumers that need to pin\n // the button with `fixed`/`absolute` (cascade order picks the later\n // utility — usually `relative` — and the consumer's `right-*`/`bottom-*`\n // end up as relative offsets, which misplaces FABs).\n 'flex items-center justify-center gap-x-2',\n 'px-4 py-1.5 rounded transition-all',\n // Default (md) icon sizing is driven by a CSS custom property so that\n // RuiIcon's `size` prop (stamped as inline `style=\"--rui-icon-size\"` on\n // the svg) can override it cleanly. Size variants below redefine the\n // property with `!` so they beat this baseline on the same element;\n // inline style on the svg then beats the inherited value when a\n // consumer supplies their own size. See rotki/ui-library#512.\n '[--rui-icon-size:1.125rem]',\n // `disabled` on the element covers two states: actually disabled and\n // loading (RuiButton sets `disabled = disabled || loading`). The\n // color/bg/text overrides for the \"grey disabled\" look live in the\n // `loading: false` compounds below so they skip firing on loading\n // buttons — where we want the variant color to stay visible behind\n // the spinner. Cursor stays here since both states are non-clickable.\n 'disabled:cursor-not-allowed',\n 'focus-visible:!ring-2',\n ].join(' '),\n label: 'inline-block text-nowrap',\n spinner: 'absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n },\n variants: {\n variant: {\n default: {},\n outlined: {},\n text: { root: 'px-2' },\n fab: { root: 'rounded-full py-2' },\n // `leading-[1.125rem]` on the label collapses the 20px line-box (inherited\n // from the root's `leading-5`) down to 18px so it matches the md icon box\n // (`--rui-icon-size: 1.125rem`). Without it, `flex items-center` centers\n // the 20px line-box against the 18px icon box and the baseline-aligned\n // glyphs visually drift above the icon's optical center — most readable\n // in tight list rows. See rotki/ui-library#515.\n list: { root: 'p-3 px-3 rounded-none w-full justify-start text-left', label: 'w-full leading-[1.125rem]' },\n },\n size: {\n // Each size variant redefines `--rui-icon-size` on the button so the\n // value inherits into RuiIcons in button slots (prepend/append/default)\n // and drives their `width: var(--rui-icon-size, 1.5rem)` class. `!` on\n // the arbitrary property makes the variant beat the md baseline in the\n // base root regardless of CSS source order. A consumer passing `size`\n // on RuiIcon still wins: that path stamps an inline style on the svg\n // element itself, which beats the inherited value from the button.\n 'xs': { root: 'px-2 py-[0.125rem] text-[.75rem] leading-4 ![--rui-icon-size:0.75rem]' },\n 'sm': { root: 'px-2.5 py-1 text-[.8125rem] leading-5 ![--rui-icon-size:1rem]' },\n 'lg': { root: 'px-6 py-2 text-[1rem] leading-5 ![--rui-icon-size:1.25rem]' },\n // `xl` targets the 40px input height — the common toolbar case where a\n // RuiButton needs to line up with RuiTextField / RuiMenuSelect. For a\n // 44px jumbo-CTA button (auth screens, empty-state primaries), reach for\n // `2xl` instead.\n 'xl': { root: 'px-6 py-2 text-[1rem] leading-6 ![--rui-icon-size:1.375rem]' },\n '2xl': { root: 'px-6 py-2.5 text-[1rem] leading-6 ![--rui-icon-size:1.375rem]' },\n },\n color: {\n grey: { root: 'bg-rui-grey-200 hover:bg-rui-grey-100 active:bg-rui-grey-50 text-rui-text ring-rui-grey-400 dark:bg-rui-grey-300 dark:text-rui-light-text dark:ring-rui-grey-600' },\n primary: { root: 'bg-rui-primary hover:bg-rui-primary-darker active:bg-rui-primary-darker/90 text-rui-dark-text ring-rui-primary/40 dark:text-rui-text dark:ring-rui-primary/60' },\n secondary: { root: 'bg-rui-secondary hover:bg-rui-secondary-darker active:bg-rui-secondary-darker/90 text-rui-dark-text ring-rui-secondary/40 dark:text-rui-text dark:ring-rui-secondary/60' },\n error: { root: 'bg-rui-error hover:bg-rui-error-darker active:bg-rui-error-darker/90 text-rui-dark-text ring-rui-error/40 dark:text-rui-text dark:ring-rui-error/60' },\n warning: { root: 'bg-rui-warning hover:bg-rui-warning-darker active:bg-rui-warning-darker/90 text-rui-dark-text ring-rui-warning/40 dark:text-rui-text dark:ring-rui-warning/60' },\n info: { root: 'bg-rui-info hover:bg-rui-info-darker active:bg-rui-info-darker/90 text-rui-dark-text ring-rui-info/40 dark:text-rui-text dark:ring-rui-info/60' },\n success: { root: 'bg-rui-success hover:bg-rui-success-darker active:bg-rui-success-darker/90 text-rui-dark-text ring-rui-success/40 dark:text-rui-text dark:ring-rui-success/60' },\n },\n rounded: {\n true: { root: 'rounded-full' },\n },\n icon: {\n // Padding and icon sizing live in the `icon + size` compound variants\n // below so every size resolves to a height matching its text-button\n // counterpart; this base only contributes the round shape.\n true: { root: 'rounded-full' },\n },\n active: {\n true: {},\n false: {},\n },\n loading: {\n true: { root: 'relative !cursor-progress space-x-0 [&>*:not([data-spinner])]:opacity-0 [&>*:not([data-spinner])]:invisible' },\n false: {},\n },\n hideFocusIndicator: {\n true: { root: 'focus-visible:!ring-0' },\n },\n },\n compoundVariants: [\n // === Disabled (not loading) appearance ===\n // Applied only when `loading: false` so that loading buttons keep their\n // variant color/outline visible behind the spinner; pure disabled buttons\n // fade to the Material disabled palette.\n { loading: false, class: { root: 'disabled:!bg-black/[.12] dark:disabled:!bg-white/[.12] disabled:!text-rui-text-disabled disabled:active:!text-rui-text-disabled' } },\n { loading: false, variant: 'outlined', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent disabled:outline-rui-text-disabled' } },\n { loading: false, variant: 'text', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent' } },\n { loading: false, variant: 'list', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent' } },\n\n // === Grey color variants ===\n { color: 'grey', active: true, class: { root: 'bg-rui-grey-50' } },\n { color: 'grey', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-black/[.04] active:bg-black/10 dark:bg-transparent dark:active:bg-white/10 dark:hover:bg-white/[.04] dark:text-rui-text' } },\n { color: 'grey', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-black/10 dark:bg-white/30' } },\n // Material draws the colourless outlined button at 23% of the text colour, not at\n // full strength: an outline as dark as the label reads as an error state and shouts\n // next to the context colours, which are already at 50% (see below). The rest of the\n // library uses the same restraint for neutral edges (cards and tables sit at 12%).\n { color: 'grey', variant: 'outlined', class: { root: 'outline-black/[0.23] dark:outline-white/[0.23]' } },\n { color: 'grey', variant: 'text', class: { root: 'text-rui-text-secondary' } },\n\n // === Context colors — outlined/text variants ===\n // `dark:text-rui-<color>` is required to beat `dark:text-rui-text` set by\n // the base color variant (meant for filled buttons where text sits on a\n // colored bg). Without the override, outlined/text/list buttons in dark\n // mode render white text against a themed outline/underline.\n { color: 'primary', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-primary-lighter/[.04] active:bg-rui-primary-lighter/10 text-rui-primary dark:text-rui-primary' } },\n { color: 'secondary', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-secondary-lighter/[.04] active:bg-rui-secondary-lighter/10 text-rui-secondary dark:text-rui-secondary' } },\n { color: 'error', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-error-lighter/[.04] active:bg-rui-error-lighter/10 text-rui-error dark:text-rui-error' } },\n { color: 'warning', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-warning-lighter/[.04] active:bg-rui-warning-lighter/10 text-rui-warning dark:text-rui-warning' } },\n { color: 'info', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-info-lighter/[.04] active:bg-rui-info-lighter/10 text-rui-info dark:text-rui-info' } },\n { color: 'success', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-success-lighter/[.04] active:bg-rui-success-lighter/10 text-rui-success dark:text-rui-success' } },\n\n // === Context colors — active default ===\n { color: 'primary', active: true, class: { root: 'bg-rui-primary-darker' } },\n { color: 'secondary', active: true, class: { root: 'bg-rui-secondary-darker' } },\n { color: 'error', active: true, class: { root: 'bg-rui-error-darker' } },\n { color: 'warning', active: true, class: { root: 'bg-rui-warning-darker' } },\n { color: 'info', active: true, class: { root: 'bg-rui-info-darker' } },\n { color: 'success', active: true, class: { root: 'bg-rui-success-darker' } },\n\n // === Context colors — active outlined/text ===\n { color: 'primary', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-primary-lighter/30' } },\n { color: 'secondary', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-secondary-lighter/30' } },\n { color: 'error', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-error-lighter/30' } },\n { color: 'warning', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-warning-lighter/30' } },\n { color: 'info', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-info-lighter/30' } },\n { color: 'success', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-success-lighter/30' } },\n\n // === Context colors — outlined border ===\n { color: 'primary', variant: 'outlined', class: { root: 'outline-rui-primary/[0.5]' } },\n { color: 'secondary', variant: 'outlined', class: { root: 'outline-rui-secondary/[0.5]' } },\n { color: 'error', variant: 'outlined', class: { root: 'outline-rui-error/[0.5]' } },\n { color: 'warning', variant: 'outlined', class: { root: 'outline-rui-warning/[0.5]' } },\n { color: 'info', variant: 'outlined', class: { root: 'outline-rui-info/[0.5]' } },\n { color: 'success', variant: 'outlined', class: { root: 'outline-rui-success/[0.5]' } },\n\n // === Size overrides per variant ===\n { variant: 'text', size: 'xs', class: { root: 'px-1' } },\n { variant: 'text', size: 'sm', class: { root: 'px-1.5' } },\n { variant: 'text', size: 'lg', class: { root: 'px-2.5' } },\n { variant: 'text', size: 'xl', class: { root: 'px-2.5' } },\n { variant: 'text', size: '2xl', class: { root: 'px-2.5' } },\n { variant: 'fab', size: 'xs', class: { root: 'py-1 px-1' } },\n { variant: 'fab', size: 'sm', class: { root: 'py-1.5 px-2' } },\n { variant: 'fab', size: 'lg', class: { root: 'py-3' } },\n { variant: 'list', size: 'xs', class: { root: 'px-3 py-0.5' } },\n { variant: 'list', size: 'sm', class: { root: 'px-3 py-1' } },\n // Icon-only button sizing — every size lands at the same height as the\n // text button of the matching size, with a ~60–70% icon ratio (Material-3\n // style). The `size` rule sizes icons to 12/16/20/22px for text-button\n // prepend/append slots; here icon-only buttons get a larger glyph so they\n // don't look lost in the square. Values are rem-based throughout: p-1 =\n // 0.25rem, p-1.5 = 0.375rem, p-2 = 0.5rem; glyph sizes use rem literals.\n // xs uses an arbitrary 0.1875rem (3px) padding — no Tailwind token hits\n // it cleanly — to keep the 70% icon ratio with a 14px glyph.\n //\n // xs: p-[0.1875rem] + 0.875rem icon = 0.375 + 0.875 = 1.25rem (20px) — 70%\n // sm: p-1 + 1.25rem icon = 0.5 + 1.25 = 1.75rem (28px) — 71%\n // md (default): p-1.5 + 1.25rem icon = 0.75 + 1.25 = 2rem (32px) — 63%\n // lg: p-1.5 + 1.5rem icon = 0.75 + 1.5 = 2.25rem (36px) — 67%\n // xl: p-2 + 1.5rem icon = 1 + 1.5 = 2.5rem (40px) — 60%\n // 2xl: p-2 + 1.75rem icon = 1 + 1.75 = 2.75rem (44px) — 64%\n { icon: true, class: { root: 'p-1.5 ![--rui-icon-size:1.25rem]' } },\n { icon: true, size: 'xs', class: { root: 'p-[0.1875rem] ![--rui-icon-size:0.875rem]' } },\n { icon: true, size: 'sm', class: { root: 'p-1 ![--rui-icon-size:1.25rem]' } },\n { icon: true, size: 'lg', class: { root: 'p-1.5 ![--rui-icon-size:1.5rem]' } },\n { icon: true, size: 'xl', class: { root: 'p-2 ![--rui-icon-size:1.5rem]' } },\n { icon: true, size: '2xl', class: { root: 'p-2 ![--rui-icon-size:1.75rem]' } },\n { variant: 'fab', icon: true, size: 'sm', class: { root: 'px-2 py-2' } },\n ],\n compoundSlots: [\n // Dark mode default variant text override for warning/success/info\n { slots: ['root'], color: ['warning', 'success', 'info'], variant: 'default', class: 'dark:text-rui-light-text' },\n // Dark mode active outlined/text override for primary/secondary\n { slots: ['root'], color: 'primary', variant: ['outlined', 'text', 'list'], active: true, class: 'dark:bg-rui-primary-darker/60 dark:text-rui-primary-lighter' },\n { slots: ['root'], color: 'secondary', variant: ['outlined', 'text', 'list'], active: true, class: 'dark:bg-rui-secondary-darker/60 dark:text-rui-secondary-lighter' },\n ],\n defaultVariants: {\n variant: 'default',\n color: 'grey',\n active: false,\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"button-styles.js","names":[],"sources":["../../../../src/components/buttons/button/button-styles.ts"],"sourcesContent":["import { tv } from '@/utils/tv';\n\n/**\n * The button's classes.\n *\n * Three decisions the class lists cannot state themselves:\n *\n * `position: relative` is not in the base root: it is only a positioning\n * context for the loading spinner, so the `loading` variant applies it.\n * Basing it here would collide with consumers pinning the button with\n * `fixed`/`absolute`, since cascade order picks the later utility, usually\n * `relative`, and turns their `right-*`/`bottom-*` into relative offsets,\n * which misplaces FABs.\n *\n * Icon sizing flows through the `--rui-icon-size` custom property, seeded at\n * the md value in the base root and redefined per size variant with `!` so a\n * variant beats the baseline on the same element regardless of source order.\n * RuiIcon's own `size` prop stamps an inline style on the svg, which beats the\n * inherited value, so a consumer always wins. See rotki/ui-library#512.\n *\n * `disabled` on the element covers two states: actually disabled, and loading,\n * since RuiButton sets `disabled = disabled || loading`. Only the cursor is\n * shared between them; the grey disabled palette lives in the `loading: false`\n * compounds, so a loading button keeps its variant color behind the spinner.\n *\n * An icon-only button matches the height of the text button of the same size,\n * with a 60-70% glyph ratio, which is a larger glyph than the same size gives\n * a prepend/append icon so it does not look lost in the square. xs pads by an\n * arbitrary 0.1875rem because no Tailwind token holds the ratio at a 14px\n * glyph:\n *\n * ```\n * xs p-[0.1875rem] + 0.875rem icon = 1.25rem (20px) 70%\n * sm p-1 + 1.25rem icon = 1.75rem (28px) 71%\n * md (default) p-1.5 + 1.25rem icon = 2rem (32px) 63%\n * lg p-1.5 + 1.5rem icon = 2.25rem (36px) 67%\n * xl p-2 + 1.5rem icon = 2.5rem (40px) 60%\n * 2xl p-2 + 1.75rem icon = 2.75rem (44px) 64%\n * ```\n */\nexport const buttonStyles = tv({\n slots: {\n root: [\n 'text-sm leading-5 font-medium outline outline-1 outline-transparent outline-offset-[-1px]',\n 'flex items-center justify-center gap-x-2',\n 'px-4 py-1.5 rounded transition-all',\n '[--rui-icon-size:1.125rem]',\n 'disabled:cursor-not-allowed',\n 'focus-visible:!ring-2',\n ].join(' '),\n label: 'inline-block text-nowrap',\n spinner: 'absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n },\n variants: {\n variant: {\n default: {},\n outlined: {},\n text: { root: 'px-2' },\n fab: { root: 'rounded-full py-2' },\n // The label's 18px line-box matches the md icon box, so the two share an optical center (rotki/ui-library#515)\n list: { root: 'p-3 px-3 rounded-none w-full justify-start text-left', label: 'w-full leading-[1.125rem]' },\n },\n size: {\n 'xs': { root: 'px-2 py-[0.125rem] text-[.75rem] leading-4 ![--rui-icon-size:0.75rem]' },\n 'sm': { root: 'px-2.5 py-1 text-[.8125rem] leading-5 ![--rui-icon-size:1rem]' },\n 'lg': { root: 'px-6 py-2 text-[1rem] leading-5 ![--rui-icon-size:1.25rem]' },\n // 40px, to line up with RuiTextField / RuiMenuSelect in a toolbar; a 44px jumbo CTA is `2xl`\n 'xl': { root: 'px-6 py-2 text-[1rem] leading-6 ![--rui-icon-size:1.375rem]' },\n '2xl': { root: 'px-6 py-2.5 text-[1rem] leading-6 ![--rui-icon-size:1.375rem]' },\n },\n color: {\n grey: { root: 'bg-rui-grey-200 hover:bg-rui-grey-100 active:bg-rui-grey-50 text-rui-text ring-rui-grey-400 dark:bg-rui-grey-300 dark:text-rui-light-text dark:ring-rui-grey-600' },\n primary: { root: 'bg-rui-primary hover:bg-rui-primary-darker active:bg-rui-primary-darker/90 text-rui-dark-text ring-rui-primary/40 dark:text-rui-text dark:ring-rui-primary/60' },\n secondary: { root: 'bg-rui-secondary hover:bg-rui-secondary-darker active:bg-rui-secondary-darker/90 text-rui-dark-text ring-rui-secondary/40 dark:text-rui-text dark:ring-rui-secondary/60' },\n error: { root: 'bg-rui-error hover:bg-rui-error-darker active:bg-rui-error-darker/90 text-rui-dark-text ring-rui-error/40 dark:text-rui-text dark:ring-rui-error/60' },\n warning: { root: 'bg-rui-warning hover:bg-rui-warning-darker active:bg-rui-warning-darker/90 text-rui-dark-text ring-rui-warning/40 dark:text-rui-text dark:ring-rui-warning/60' },\n info: { root: 'bg-rui-info hover:bg-rui-info-darker active:bg-rui-info-darker/90 text-rui-dark-text ring-rui-info/40 dark:text-rui-text dark:ring-rui-info/60' },\n success: { root: 'bg-rui-success hover:bg-rui-success-darker active:bg-rui-success-darker/90 text-rui-dark-text ring-rui-success/40 dark:text-rui-text dark:ring-rui-success/60' },\n },\n rounded: {\n true: { root: 'rounded-full' },\n },\n icon: {\n // Only the round shape; the `icon + size` compounds below carry padding and icon sizing\n true: { root: 'rounded-full' },\n },\n active: {\n true: {},\n false: {},\n },\n loading: {\n true: { root: 'relative !cursor-progress space-x-0 [&>*:not([data-spinner])]:opacity-0 [&>*:not([data-spinner])]:invisible' },\n false: {},\n },\n hideFocusIndicator: {\n true: { root: 'focus-visible:!ring-0' },\n },\n },\n compoundVariants: [\n // Disabled appearance: the Material disabled palette, skipped while loading so the variant color shows behind the spinner\n { loading: false, class: { root: 'disabled:!bg-black/[.12] dark:disabled:!bg-white/[.12] disabled:!text-rui-text-disabled disabled:active:!text-rui-text-disabled' } },\n { loading: false, variant: 'outlined', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent disabled:outline-rui-text-disabled' } },\n { loading: false, variant: 'text', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent' } },\n { loading: false, variant: 'list', class: { root: 'disabled:!bg-transparent dark:disabled:!bg-transparent disabled:active:!bg-transparent' } },\n\n // === Grey color variants ===\n { color: 'grey', active: true, class: { root: 'bg-rui-grey-50' } },\n { color: 'grey', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-black/[.04] active:bg-black/10 dark:bg-transparent dark:active:bg-white/10 dark:hover:bg-white/[.04] dark:text-rui-text' } },\n { color: 'grey', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-black/10 dark:bg-white/30' } },\n // Material's 23% outline: at full strength a neutral edge reads as an error state next to the 50% context colours\n { color: 'grey', variant: 'outlined', class: { root: 'outline-black/[0.23] dark:outline-white/[0.23]' } },\n { color: 'grey', variant: 'text', class: { root: 'text-rui-text-secondary' } },\n\n // Context colors: `dark:text-rui-<color>` beats the base variant's `dark:text-rui-text`, which is meant for filled buttons\n { color: 'primary', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-primary-lighter/[.04] active:bg-rui-primary-lighter/10 text-rui-primary dark:text-rui-primary' } },\n { color: 'secondary', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-secondary-lighter/[.04] active:bg-rui-secondary-lighter/10 text-rui-secondary dark:text-rui-secondary' } },\n { color: 'error', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-error-lighter/[.04] active:bg-rui-error-lighter/10 text-rui-error dark:text-rui-error' } },\n { color: 'warning', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-warning-lighter/[.04] active:bg-rui-warning-lighter/10 text-rui-warning dark:text-rui-warning' } },\n { color: 'info', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-info-lighter/[.04] active:bg-rui-info-lighter/10 text-rui-info dark:text-rui-info' } },\n { color: 'success', variant: ['outlined', 'text', 'list'], class: { root: 'bg-transparent hover:bg-rui-success-lighter/[.04] active:bg-rui-success-lighter/10 text-rui-success dark:text-rui-success' } },\n\n // === Context colors — active default ===\n { color: 'primary', active: true, class: { root: 'bg-rui-primary-darker' } },\n { color: 'secondary', active: true, class: { root: 'bg-rui-secondary-darker' } },\n { color: 'error', active: true, class: { root: 'bg-rui-error-darker' } },\n { color: 'warning', active: true, class: { root: 'bg-rui-warning-darker' } },\n { color: 'info', active: true, class: { root: 'bg-rui-info-darker' } },\n { color: 'success', active: true, class: { root: 'bg-rui-success-darker' } },\n\n // === Context colors — active outlined/text ===\n { color: 'primary', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-primary-lighter/30' } },\n { color: 'secondary', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-secondary-lighter/30' } },\n { color: 'error', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-error-lighter/30' } },\n { color: 'warning', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-warning-lighter/30' } },\n { color: 'info', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-info-lighter/30' } },\n { color: 'success', variant: ['outlined', 'text', 'list'], active: true, class: { root: 'bg-rui-success-lighter/30' } },\n\n // === Context colors — outlined border ===\n { color: 'primary', variant: 'outlined', class: { root: 'outline-rui-primary/[0.5]' } },\n { color: 'secondary', variant: 'outlined', class: { root: 'outline-rui-secondary/[0.5]' } },\n { color: 'error', variant: 'outlined', class: { root: 'outline-rui-error/[0.5]' } },\n { color: 'warning', variant: 'outlined', class: { root: 'outline-rui-warning/[0.5]' } },\n { color: 'info', variant: 'outlined', class: { root: 'outline-rui-info/[0.5]' } },\n { color: 'success', variant: 'outlined', class: { root: 'outline-rui-success/[0.5]' } },\n\n // === Size overrides per variant ===\n { variant: 'text', size: 'xs', class: { root: 'px-1' } },\n { variant: 'text', size: 'sm', class: { root: 'px-1.5' } },\n { variant: 'text', size: 'lg', class: { root: 'px-2.5' } },\n { variant: 'text', size: 'xl', class: { root: 'px-2.5' } },\n { variant: 'text', size: '2xl', class: { root: 'px-2.5' } },\n { variant: 'fab', size: 'xs', class: { root: 'py-1 px-1' } },\n { variant: 'fab', size: 'sm', class: { root: 'py-1.5 px-2' } },\n { variant: 'fab', size: 'lg', class: { root: 'py-3' } },\n { variant: 'list', size: 'xs', class: { root: 'px-3 py-0.5' } },\n { variant: 'list', size: 'sm', class: { root: 'px-3 py-1' } },\n // Icon-only sizing, per the padding and glyph table on buttonStyles above\n { icon: true, class: { root: 'p-1.5 ![--rui-icon-size:1.25rem]' } },\n { icon: true, size: 'xs', class: { root: 'p-[0.1875rem] ![--rui-icon-size:0.875rem]' } },\n { icon: true, size: 'sm', class: { root: 'p-1 ![--rui-icon-size:1.25rem]' } },\n { icon: true, size: 'lg', class: { root: 'p-1.5 ![--rui-icon-size:1.5rem]' } },\n { icon: true, size: 'xl', class: { root: 'p-2 ![--rui-icon-size:1.5rem]' } },\n { icon: true, size: '2xl', class: { root: 'p-2 ![--rui-icon-size:1.75rem]' } },\n { variant: 'fab', icon: true, size: 'sm', class: { root: 'px-2 py-2' } },\n ],\n compoundSlots: [\n // Dark mode default variant text override for warning/success/info\n { slots: ['root'], color: ['warning', 'success', 'info'], variant: 'default', class: 'dark:text-rui-light-text' },\n // Dark mode active outlined/text override for primary/secondary\n { slots: ['root'], color: 'primary', variant: ['outlined', 'text', 'list'], active: true, class: 'dark:bg-rui-primary-darker/60 dark:text-rui-primary-lighter' },\n { slots: ['root'], color: 'secondary', variant: ['outlined', 'text', 'list'], active: true, class: 'dark:bg-rui-secondary-darker/60 dark:text-rui-secondary-lighter' },\n ],\n defaultVariants: {\n variant: 'default',\n color: 'grey',\n active: false,\n },\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiButtonGroup.js","names":[],"sources":["../../../../src/components/buttons/button-group/RuiButtonGroup.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ButtonSize } from '@/components/buttons/button/button-props';\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode } from 'vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n vertical?: boolean;\n color?: ContextColorsType;\n activeColor?: ContextColorsType;\n variant?: 'default' | 'outlined' | 'text';\n size?: ButtonSize;\n gap?: 'sm' | 'md' | 'lg';\n required?: boolean;\n disabled?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButtonGroup',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<T | T[]>();\n\nconst {\n vertical = false,\n color,\n activeColor,\n variant = 'default',\n size,\n gap,\n required = false,\n disabled = false,\n} = defineProps<Props>();\n\nconst slots = useSlots();\n\nconst buttonGroupStyles = tv({\n slots: {\n root: 'inline-flex rounded divide-x divide-rui-grey-400 outline outline-1 outline-transparent outline-offset-[-1px]',\n button: 'border-0 outline-0 focus:z-[1]',\n },\n variants: {\n vertical: {\n true: {\n root: 'flex-col items-start divide-x-0 divide-y',\n button: 'w-full',\n },\n false: {},\n },\n gap: {\n none: {\n button: '!rounded-none',\n },\n sm: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-2',\n button: 'outline-1',\n },\n md: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-4',\n button: 'outline-1',\n },\n lg: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-6',\n button: 'outline-1',\n },\n },\n variant: {\n default: {},\n outlined: {\n //
|
|
1
|
+
{"version":3,"file":"RuiButtonGroup.js","names":[],"sources":["../../../../src/components/buttons/button-group/RuiButtonGroup.vue"],"sourcesContent":["<script lang=\"ts\" generic=\"T = undefined\" setup>\nimport type { ButtonSize } from '@/components/buttons/button/button-props';\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode } from 'vue';\nimport { tv } from '@/utils/tv';\n\nexport interface Props {\n vertical?: boolean;\n color?: ContextColorsType;\n activeColor?: ContextColorsType;\n variant?: 'default' | 'outlined' | 'text';\n size?: ButtonSize;\n gap?: 'sm' | 'md' | 'lg';\n required?: boolean;\n disabled?: boolean;\n}\n\ndefineOptions({\n name: 'RuiButtonGroup',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<T | T[]>();\n\nconst {\n vertical = false,\n color,\n activeColor,\n variant = 'default',\n size,\n gap,\n required = false,\n disabled = false,\n} = defineProps<Props>();\n\nconst slots = useSlots();\n\nconst buttonGroupStyles = tv({\n slots: {\n root: 'inline-flex rounded divide-x divide-rui-grey-400 outline outline-1 outline-transparent outline-offset-[-1px]',\n button: 'border-0 outline-0 focus:z-[1]',\n },\n variants: {\n vertical: {\n true: {\n root: 'flex-col items-start divide-x-0 divide-y',\n button: 'w-full',\n },\n false: {},\n },\n gap: {\n none: {\n button: '!rounded-none',\n },\n sm: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-2',\n button: 'outline-1',\n },\n md: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-4',\n button: 'outline-1',\n },\n lg: {\n root: 'divide-x-0 divide-y-0 outline-0 gap-6',\n button: 'outline-1',\n },\n },\n variant: {\n default: {},\n outlined: {\n // Material's 23% neutral edge, matching RuiButton's colourless outlined treatment\n root: 'outline-black/[0.23] divide-black/[0.23] dark:outline-white/[0.23] dark:divide-white/[0.23]',\n },\n text: {},\n },\n color: {\n primary: {},\n secondary: {},\n error: {},\n warning: {},\n info: {},\n success: {},\n },\n },\n compoundVariants: [\n // First/last child rounding when not separated (! needed to override RuiButton's CSS module border-radius)\n { gap: 'none', vertical: false, class: { button: 'first:!rounded-l last:!rounded-r' } },\n { gap: 'none', vertical: true, class: { button: 'first:!rounded-t last:!rounded-b' } },\n\n // Color dividers (default variant)\n { color: 'primary', class: { root: 'divide-rui-primary-darker' } },\n { color: 'secondary', class: { root: 'divide-rui-secondary-darker' } },\n { color: 'error', class: { root: 'divide-rui-error-darker' } },\n { color: 'warning', class: { root: 'divide-rui-warning-darker' } },\n { color: 'info', class: { root: 'divide-rui-info-darker' } },\n { color: 'success', class: { root: 'divide-rui-success-darker' } },\n\n // Color dividers for outlined/text (overrides darker dividers above)\n { color: 'primary', variant: ['outlined', 'text'], class: { root: 'divide-rui-primary/[0.5]' } },\n { color: 'secondary', variant: ['outlined', 'text'], class: { root: 'divide-rui-secondary/[0.5]' } },\n { color: 'error', variant: ['outlined', 'text'], class: { root: 'divide-rui-error/[0.5]' } },\n { color: 'warning', variant: ['outlined', 'text'], class: { root: 'divide-rui-warning/[0.5]' } },\n { color: 'info', variant: ['outlined', 'text'], class: { root: 'divide-rui-info/[0.5]' } },\n { color: 'success', variant: ['outlined', 'text'], class: { root: 'divide-rui-success/[0.5]' } },\n\n // Color outline for outlined variant\n { color: 'primary', variant: 'outlined', class: { root: 'outline-rui-primary/[0.5]' } },\n { color: 'secondary', variant: 'outlined', class: { root: 'outline-rui-secondary/[0.5]' } },\n { color: 'error', variant: 'outlined', class: { root: 'outline-rui-error/[0.5]' } },\n { color: 'warning', variant: 'outlined', class: { root: 'outline-rui-warning/[0.5]' } },\n { color: 'info', variant: 'outlined', class: { root: 'outline-rui-info/[0.5]' } },\n { color: 'success', variant: 'outlined', class: { root: 'outline-rui-success/[0.5]' } },\n ],\n defaultVariants: {\n vertical: false,\n gap: 'none',\n variant: 'default',\n },\n});\n\nconst ui = computed<ReturnType<typeof buttonGroupStyles>>(() => buttonGroupStyles({\n vertical,\n gap: gap ?? 'none',\n variant,\n color,\n}));\n\n/**\n * Applies the group's state to one of its buttons: which button is active,\n * the group's disabled flag and colour, and the group's size, that last one\n * only when the button did not set a size of its own, so a consumer can still\n * size a single button.\n *\n * @param child - the button's vnode, whose props are keyed in kebab-case\n * @param index - its place in the group, which stands in for a missing value\n * @param selectedValue - what the group's model currently holds\n * @returns the same vnode, with the group's props written onto it\n */\nfunction applyGroupProps(child: VNode, index: number, selectedValue: T | T[] | undefined): VNode {\n const value = child.props?.['model-value'];\n const active = isActive(value ?? index, selectedValue);\n const resolvedColor = active && activeColor ? activeColor : color;\n const childSize = child.props?.size;\n\n child.props = {\n ...child.props,\n active,\n ...(disabled && { disabled: true }),\n ...(resolvedColor && { color: resolvedColor }),\n ...(!childSize && size && { size }),\n };\n\n return child;\n}\n\nconst children = computed<VNode[]>(() => {\n const selectedValue: T | T[] | undefined = get(modelValue);\n const slotContent = slots.default?.() ?? [];\n\n return flattenSlotContent(slotContent)\n .map((child, index) => applyGroupProps(child, index, selectedValue));\n});\n\n/**\n * Flattens slot content by unwrapping Fragments (created by v-for).\n * Returns only actual VNode children.\n */\nfunction flattenSlotContent(nodes: VNode[]): VNode[] {\n return nodes.flatMap((node) => {\n if (node.type === Fragment && Array.isArray(node.children) && node.children.length > 0)\n return flattenSlotContent(node.children.filter(isVNode));\n\n return [node];\n });\n}\n\nfunction isActive(id: T, selected?: T | T[]): boolean {\n if (Array.isArray(selected))\n return selected.includes(id);\n\n return selected === id;\n}\n\nfunction onClick(id: T): void {\n const selected = get(modelValue);\n\n if (Array.isArray(selected)) {\n const index = selected.indexOf(id);\n if (index >= 0) {\n if (required && selected.length === 1)\n return;\n\n set(modelValue, selected.filter((_, i) => i !== index));\n }\n else {\n set(modelValue, [...selected, id]);\n }\n }\n else if (required) {\n set(modelValue, id);\n }\n else {\n set(modelValue, isActive(id, selected) ? undefined : id);\n }\n}\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n v-bind=\"$attrs\"\n >\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n :class=\"ui.button()\"\n :variant=\"variant\"\n @update:model-value=\"onClick($event ?? i)\"\n />\n </div>\n</template>\n"],"mappings":""}
|