@rotki/ui-library 2.27.0 → 3.0.0-beta.2
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 +36 -15
- package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
- package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +0 -4
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +9 -10
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js +16 -3
- package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/alerts/RuiAlert.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +43 -212
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +22 -32
- 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 +6 -0
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +17 -13
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/avatar-props.d.ts +16 -3
- package/dist/components/avatars/avatar-props.js +42 -5
- package/dist/components/avatars/avatar-props.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +0 -1
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +39 -26
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button/button-props.d.ts +0 -2
- package/dist/components/buttons/button/button-props.js +5 -5
- package/dist/components/buttons/button/button-props.js.map +1 -1
- package/dist/components/buttons/button/button-styles.d.ts +4 -1
- package/dist/components/buttons/button/button-styles.js +136 -55
- 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 +8 -2
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js +66 -97
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button-group/button-group-context.d.ts +28 -0
- package/dist/components/buttons/button-group/button-group-context.js +22 -0
- package/dist/components/buttons/button-group/button-group-context.js.map +1 -0
- package/dist/components/calendar/RuiCalendar.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +6 -3
- 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 +12 -8
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js +21 -22
- package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +17 -21
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/RuiCard.js.map +1 -1
- package/dist/components/cards/RuiCard.vue.d.ts +0 -3
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +31 -19
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js +13 -25
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/RuiChip.js.map +1 -1
- package/dist/components/chips/RuiChip.vue.d.ts +5 -2
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +127 -78
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/chip-props.d.ts +2 -0
- package/dist/components/chips/chip-props.js +5 -3
- package/dist/components/chips/chip-props.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/color-picker/RuiColorHue.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js +46 -36
- package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +4 -5
- 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 +3 -2
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +81 -80
- 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.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +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.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +4 -3
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +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 +128 -219
- package/dist/components/date-time-picker/date-time-picker-styles.js +1 -2
- package/dist/components/date-time-picker/date-time-picker-styles.js.map +1 -1
- package/dist/components/date-time-picker/use-date-bounds.js +1 -1
- package/dist/components/date-time-picker/use-date-time-selection.js +65 -66
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-input-handler.js +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.js +29 -30
- package/dist/components/date-time-picker/use-keyboard-handler.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 +1 -68
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +203 -198
- 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.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +2 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js +8 -3
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue.d.ts +4 -0
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js +24 -10
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/auto-complete-props.d.ts +66 -0
- package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +128 -218
- package/dist/components/forms/auto-complete/auto-complete-styles.js +4 -2
- package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +3 -6
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +154 -154
- 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 +83 -232
- package/dist/components/forms/category-picker/category-picker-styles.js +20 -26
- package/dist/components/forms/category-picker/category-picker-styles.js.map +1 -1
- package/dist/components/forms/check-control-styles.d.ts +61 -2
- package/dist/components/forms/check-control-styles.js +53 -46
- package/dist/components/forms/check-control-styles.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +32 -19
- 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.js.map +1 -1
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/field-defaults/RuiFieldDefaults.js +7 -0
- package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -0
- package/dist/components/forms/field-defaults/RuiFieldDefaults.vue.d.ts +16 -0
- package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js +18 -0
- package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/forms/field-label/RuiFieldLabel.js +7 -0
- package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -0
- package/dist/components/forms/field-label/RuiFieldLabel.vue.d.ts +17 -0
- package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js +57 -0
- package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- 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 +56 -35
- 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.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js +14 -15
- 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 +3 -3
- 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.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js +6 -6
- 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 +3 -12
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +61 -56
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +0 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +13 -20
- 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 +99 -221
- package/dist/components/forms/select/menu-select-styles.js +1 -4
- package/dist/components/forms/select/menu-select-styles.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue.d.ts +0 -4
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js +129 -106
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/slider/slider-styles.d.ts +40 -40
- package/dist/components/forms/slider/slider-styles.js +67 -109
- package/dist/components/forms/slider/slider-styles.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +33 -45
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +3 -2
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +138 -117
- 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 +41 -115
- package/dist/components/forms/text-area/text-area-styles.js +34 -194
- package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +5 -2
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +112 -105
- 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 -145
- package/dist/components/forms/text-field/text-field-styles.js +24 -267
- package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
- package/dist/components/forms/text-input-styles.d.ts +98 -229
- package/dist/components/forms/text-input-styles.js +63 -193
- package/dist/components/forms/text-input-styles.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +11 -1
- package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +5 -5
- 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 +7 -4
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/index.d.ts +5 -3
- package/dist/components/index.js +4 -3
- package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +6 -5
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/logos/RuiLogo.js.map +1 -1
- package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +76 -48
- package/dist/components/overlays/badge/RuiBadge.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 +3 -2
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +17 -13
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -7
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +33 -29
- 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.d.ts +6 -2
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +49 -25
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +7 -8
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +0 -5
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +17 -11
- 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 +5 -12
- package/dist/components/overlays/tooltip/tooltip-styles.js +11 -18
- package/dist/components/overlays/tooltip/tooltip-styles.js.map +1 -1
- package/dist/components/progress/RuiProgress.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue.d.ts +4 -0
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js +73 -47
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +28 -29
- 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.d.ts +0 -4
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js +36 -29
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue.d.ts +2 -0
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js +47 -47
- 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 +3 -6
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +85 -67
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTable.js.map +1 -1
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +8 -5
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableHead.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +89 -67
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js +9 -12
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js +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 +3 -3
- 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 +8 -4
- package/dist/components/tables/data-table/RuiDataTableGroupRow.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_vue_type_script_setup_true_lang.js +2 -2
- 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_vue_type_script_setup_true_lang.js +47 -8
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table-styles.d.ts +24 -0
- package/dist/components/tables/data-table-styles.js +35 -20
- package/dist/components/tables/data-table-styles.js.map +1 -1
- package/dist/components/tables/table_no_data_placeholder.js +1 -1
- package/dist/components/tables/table_no_data_placeholder.js.map +1 -1
- package/dist/components/tables/table_no_data_placeholder_dark.js +1 -1
- package/dist/components/tables/table_no_data_placeholder_dark.js.map +1 -1
- package/dist/components/tables/use-pagination-navigation.js +1 -1
- package/dist/components/tabs/tab/RuiTab.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +2 -5
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +95 -69
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab/use-tab-link.js +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +0 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js +5 -11
- package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +8 -13
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-props.d.ts +7 -1
- package/dist/components/tabs/tab-props.js +7 -1
- package/dist/components/tabs/tab-props.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +2 -1
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +188 -43
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs/use-tab-indicator.d.ts +27 -0
- package/dist/components/tabs/tabs/use-tab-indicator.js +67 -0
- package/dist/components/tabs/tabs/use-tab-indicator.js.map +1 -0
- package/dist/components/tabs/tabs/use-tab-keyboard.d.ts +17 -0
- package/dist/components/tabs/tabs/use-tab-keyboard.js +57 -0
- package/dist/components/tabs/tabs/use-tab-keyboard.js.map +1 -0
- package/dist/components/tabs/tabs/use-tab-routing.js +1 -2
- package/dist/components/tabs/tabs/use-tab-routing.js.map +1 -1
- package/dist/components/tabs/tabs/use-tab-scroll.js +15 -15
- package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +95 -93
- 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 +18 -0
- package/dist/components/time-picker/time-picker-styles.js +16 -10
- package/dist/components/time-picker/time-picker-styles.js.map +1 -1
- package/dist/composables/breakpoint.js +3 -3
- package/dist/composables/breakpoint.js.map +1 -1
- package/dist/composables/defaults/field.d.ts +22 -0
- package/dist/composables/defaults/field.js +29 -0
- package/dist/composables/defaults/field.js.map +1 -0
- package/dist/composables/dropdown-menu.d.ts +23 -11
- package/dist/composables/dropdown-menu.js +44 -34
- package/dist/composables/dropdown-menu.js.map +1 -1
- package/dist/composables/floating.d.ts +1 -3
- package/dist/composables/floating.js +16 -13
- package/dist/composables/floating.js.map +1 -1
- package/dist/composables/forms/auto-complete/chips.d.ts +22 -0
- package/dist/composables/forms/auto-complete/chips.js +42 -0
- package/dist/composables/forms/auto-complete/chips.js.map +1 -0
- package/dist/composables/forms/auto-complete/combobox.d.ts +25 -0
- package/dist/composables/forms/auto-complete/combobox.js +35 -0
- package/dist/composables/forms/auto-complete/combobox.js.map +1 -0
- package/dist/composables/forms/auto-complete/focus.d.ts +5 -2
- package/dist/composables/forms/auto-complete/focus.js +44 -19
- package/dist/composables/forms/auto-complete/focus.js.map +1 -1
- package/dist/composables/forms/auto-complete/index.d.ts +3 -0
- package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -1
- package/dist/composables/forms/auto-complete/keyboard-navigation.js +49 -21
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.js +6 -7
- package/dist/composables/forms/auto-complete/search.js.map +1 -1
- package/dist/composables/forms/auto-complete/selection.d.ts +37 -0
- package/dist/composables/forms/auto-complete/selection.js +60 -0
- package/dist/composables/forms/auto-complete/selection.js.map +1 -0
- package/dist/composables/forms/auto-complete/value.js +20 -1
- package/dist/composables/forms/auto-complete/value.js.map +1 -1
- package/dist/composables/forms/category-picker/use-category-picker.js +1 -1
- package/dist/composables/forms/use-prepend-append-width.js +6 -6
- package/dist/composables/forms/use-prepend-append-width.js.map +1 -1
- package/dist/composables/keyboard-scroll.d.ts +17 -0
- package/dist/composables/keyboard-scroll.js +58 -0
- package/dist/composables/keyboard-scroll.js.map +1 -0
- package/dist/composables/overlay-stack.js +1 -1
- package/dist/composables/sticky-header.d.ts +8 -0
- package/dist/composables/sticky-header.js +21 -10
- package/dist/composables/sticky-header.js.map +1 -1
- package/dist/composables/tables/data-table/columns.js +1 -1
- package/dist/composables/tables/data-table/expansion.js +1 -1
- package/dist/composables/tables/data-table/grouping.js +27 -28
- package/dist/composables/tables/data-table/grouping.js.map +1 -1
- package/dist/composables/tables/data-table/page-scroll.d.ts +32 -0
- package/dist/composables/tables/data-table/page-scroll.js +144 -0
- package/dist/composables/tables/data-table/page-scroll.js.map +1 -0
- package/dist/composables/tables/data-table/pagination.js +1 -1
- package/dist/composables/tables/data-table/selection.js +37 -38
- package/dist/composables/tables/data-table/selection.js.map +1 -1
- package/dist/composables/tables/data-table/sort.js +1 -1
- package/dist/composables/theme.js +12 -12
- package/dist/composables/theme.js.map +1 -1
- package/dist/composables/timeout-manager.js +1 -1
- package/dist/consts/colors.d.ts +4 -0
- package/dist/consts/colors.js +1 -37
- package/dist/consts/colors.js.map +1 -1
- package/dist/consts/tokens.d.ts +56 -0
- package/dist/consts/tokens.js +46 -0
- package/dist/consts/tokens.js.map +1 -0
- package/dist/consts/typography.d.ts +51 -18
- package/dist/index.d.ts +7 -2
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/library-icons.json +0 -10
- package/dist/style.css +5629 -4678
- package/dist/styles/colors.css +315 -0
- package/dist/styles/tokens.css +50 -0
- package/dist/tailwind.css +145 -0
- package/dist/theme/theme.css +403 -0
- package/dist/theme.css +403 -0
- package/dist/types/dom.d.ts +9 -0
- package/dist/types/theme.d.ts +2 -3
- package/dist/types/theme.js.map +1 -1
- package/dist/utils/form-text-detail.js +1 -1
- package/dist/utils/helpers.d.ts +0 -8
- package/dist/utils/helpers.js +1 -2
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/tv.js +13 -21
- package/dist/utils/tv.js.map +1 -1
- package/dist/vendor/@vueuse/core/dist/index.js +1577 -0
- package/dist/vendor/@vueuse/core/dist/index.js.map +1 -0
- package/dist/vendor/@vueuse/shared/dist/index.js +563 -0
- package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -0
- package/dist/vite-plugin/index.js +5 -6
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/web-types.json +278 -403
- package/package.json +17 -19
- package/dist/components/icons/LazyIcon.vue.d.ts +0 -8
- package/dist/components/steppers/RuiStepperCustomIcon.js +0 -7
- package/dist/components/steppers/RuiStepperCustomIcon.js.map +0 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +0 -8
- package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js +0 -43
- package/dist/components/steppers/RuiStepperCustomIcon.vue_vue_type_script_setup_true_lang.js.map +0 -1
- package/dist/composables/colors/common.d.ts +0 -20
- package/dist/composables/colors/index.d.ts +0 -3
- package/dist/composables/colors/text-input.d.ts +0 -27
- package/dist/composables/forms/use-label-with-quote.d.ts +0 -2
- package/dist/composables/popper.d.ts +0 -16
- package/dist/composables/popper.js +0 -23
- package/dist/composables/popper.js.map +0 -1
- package/dist/consts/forms/auto-complete/index.d.ts +0 -4
- package/dist/theme/index.d.ts +0 -5
- package/dist/theme/index.js +0 -162
- package/dist/theme/index.js.map +0 -1
- package/dist/utils/forms/auto-complete/index.d.ts +0 -2
|
@@ -1,14 +1,18 @@
|
|
|
1
|
+
import { get, set, watchImmediate } from "../../../vendor/@vueuse/shared/dist/index.js";
|
|
1
2
|
import { tv } from "../../../utils/tv.js";
|
|
2
3
|
import RuiIcon_default from "../../icons/RuiIcon.js";
|
|
3
4
|
import RuiButton_default from "../../buttons/button/RuiButton.js";
|
|
4
|
-
import {
|
|
5
|
+
import { useKeyboardScroll } from "../../../composables/keyboard-scroll.js";
|
|
6
|
+
import { TabLayout, TabVariant } from "../tab-props.js";
|
|
7
|
+
import { useTabIndicator } from "./use-tab-indicator.js";
|
|
8
|
+
import { useTabKeyboard } from "./use-tab-keyboard.js";
|
|
5
9
|
import { useTabRouting } from "./use-tab-routing.js";
|
|
6
10
|
import { useTabScroll } from "./use-tab-scroll.js";
|
|
7
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isVNode, mergeModels, normalizeClass, onMounted, openBlock, ref, renderList, resolveDynamicComponent, unref, useModel, useSlots, useTemplateRef, watch, withCtx } from "vue";
|
|
8
|
-
import { watchImmediate } from "@vueuse/core";
|
|
9
|
-
import { get as get$1, set as set$1 } from "@vueuse/shared";
|
|
11
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isVNode, mergeModels, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, resolveDynamicComponent, unref, useModel, useSlots, useTemplateRef, watch, withCtx } from "vue";
|
|
10
12
|
//#region src/components/tabs/tabs/RuiTabs.vue?vue&type=script&setup=true&lang.ts
|
|
11
13
|
var _hoisted_1 = ["data-vertical"];
|
|
14
|
+
var _hoisted_2 = ["tabindex"];
|
|
15
|
+
var _hoisted_3 = ["aria-orientation"];
|
|
12
16
|
var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
13
17
|
name: "RuiTabs",
|
|
14
18
|
__name: "RuiTabs",
|
|
@@ -27,7 +31,8 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
27
31
|
default: false
|
|
28
32
|
},
|
|
29
33
|
align: { default: "center" },
|
|
30
|
-
indicatorPosition: { default: "end" }
|
|
34
|
+
indicatorPosition: { default: "end" },
|
|
35
|
+
variant: { default: () => TabVariant.underline }
|
|
31
36
|
}, {
|
|
32
37
|
"modelValue": { default: 0 },
|
|
33
38
|
"modelModifiers": {}
|
|
@@ -43,34 +48,141 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
43
48
|
const internalModelValue = ref();
|
|
44
49
|
const bar = useTemplateRef("bar");
|
|
45
50
|
const wrapper = useTemplateRef("wrapper");
|
|
51
|
+
const barTabindex = useKeyboardScroll(bar);
|
|
52
|
+
/**
|
|
53
|
+
* The bar. The underline variant draws its 1px track as a `before` line along
|
|
54
|
+
* the whole root, so the arrows sit on it too, and the 2px indicator, a layer
|
|
55
|
+
* above, covers it under the active tab.
|
|
56
|
+
*/
|
|
46
57
|
const tabs = tv({
|
|
47
58
|
slots: {
|
|
48
59
|
root: "",
|
|
49
|
-
arrow: "",
|
|
50
|
-
bar: "no-scrollbar max-h-full overflow-auto",
|
|
51
|
-
wrapper: "
|
|
60
|
+
arrow: "flex shrink-0 items-center justify-center",
|
|
61
|
+
bar: "no-scrollbar relative max-h-full overflow-auto outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2",
|
|
62
|
+
wrapper: "inline-flex max-w-none",
|
|
63
|
+
indicator: "pointer-events-none absolute"
|
|
52
64
|
},
|
|
53
65
|
variants: {
|
|
66
|
+
variant: {
|
|
67
|
+
[TabVariant.underline]: {
|
|
68
|
+
root: `relative before:pointer-events-none before:absolute before:bg-rui-divider before:content-['']`,
|
|
69
|
+
indicator: "z-1 bg-rui-primary"
|
|
70
|
+
},
|
|
71
|
+
[TabVariant.segmented]: {
|
|
72
|
+
root: "rounded-rui-panel bg-rui-neutral-200 p-0.5 dark:bg-rui-neutral-800",
|
|
73
|
+
wrapper: "gap-0.5",
|
|
74
|
+
indicator: "rounded-rui-control bg-rui-surface shadow-rui-control dark:bg-rui-neutral-700"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
54
77
|
layout: {
|
|
55
78
|
[TabLayout.horizontal]: {
|
|
56
79
|
root: "flex h-fit",
|
|
57
|
-
arrow: "
|
|
58
|
-
bar: "h-[3rem]",
|
|
59
|
-
wrapper: ""
|
|
80
|
+
arrow: "w-8"
|
|
60
81
|
},
|
|
61
82
|
[TabLayout.vertical]: {
|
|
62
83
|
root: "inline-flex flex-col",
|
|
63
|
-
arrow: "
|
|
64
|
-
|
|
65
|
-
wrapper: "flex-col h-auto"
|
|
84
|
+
arrow: "h-8 w-full",
|
|
85
|
+
wrapper: "flex-col w-full"
|
|
66
86
|
}
|
|
67
87
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
88
|
+
indicatorPosition: {
|
|
89
|
+
start: {},
|
|
90
|
+
end: {}
|
|
91
|
+
},
|
|
92
|
+
color: {
|
|
93
|
+
primary: {},
|
|
94
|
+
secondary: {},
|
|
95
|
+
error: {},
|
|
96
|
+
warning: {},
|
|
97
|
+
info: {},
|
|
98
|
+
success: {}
|
|
99
|
+
},
|
|
100
|
+
wide: {
|
|
101
|
+
true: {
|
|
102
|
+
bar: "w-full",
|
|
103
|
+
wrapper: "min-w-full"
|
|
104
|
+
},
|
|
105
|
+
false: {}
|
|
106
|
+
},
|
|
107
|
+
animated: {
|
|
108
|
+
true: { indicator: "transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none" },
|
|
109
|
+
false: {}
|
|
110
|
+
}
|
|
72
111
|
},
|
|
73
|
-
|
|
112
|
+
compoundVariants: [
|
|
113
|
+
{
|
|
114
|
+
variant: TabVariant.underline,
|
|
115
|
+
layout: TabLayout.horizontal,
|
|
116
|
+
indicatorPosition: "end",
|
|
117
|
+
class: {
|
|
118
|
+
root: "before:inset-x-0 before:bottom-0 before:h-px",
|
|
119
|
+
indicator: "bottom-0 h-0.5 rounded-t-full"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
variant: TabVariant.underline,
|
|
124
|
+
layout: TabLayout.horizontal,
|
|
125
|
+
indicatorPosition: "start",
|
|
126
|
+
class: {
|
|
127
|
+
root: "before:inset-x-0 before:top-0 before:h-px",
|
|
128
|
+
indicator: "top-0 h-0.5 rounded-b-full"
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
variant: TabVariant.underline,
|
|
133
|
+
layout: TabLayout.vertical,
|
|
134
|
+
indicatorPosition: "end",
|
|
135
|
+
class: {
|
|
136
|
+
root: "before:inset-y-0 before:right-0 before:w-px",
|
|
137
|
+
indicator: "right-0 w-0.5 rounded-l-full"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
variant: TabVariant.underline,
|
|
142
|
+
layout: TabLayout.vertical,
|
|
143
|
+
indicatorPosition: "start",
|
|
144
|
+
class: {
|
|
145
|
+
root: "before:inset-y-0 before:left-0 before:w-px",
|
|
146
|
+
indicator: "left-0 w-0.5 rounded-r-full"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
variant: TabVariant.segmented,
|
|
151
|
+
layout: TabLayout.horizontal,
|
|
152
|
+
wide: false,
|
|
153
|
+
class: { root: "w-fit max-w-full" }
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
variant: TabVariant.underline,
|
|
157
|
+
color: "secondary",
|
|
158
|
+
class: { indicator: "bg-rui-secondary" }
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
variant: TabVariant.underline,
|
|
162
|
+
color: "error",
|
|
163
|
+
class: { indicator: "bg-rui-error" }
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
variant: TabVariant.underline,
|
|
167
|
+
color: "warning",
|
|
168
|
+
class: { indicator: "bg-rui-warning" }
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
variant: TabVariant.underline,
|
|
172
|
+
color: "info",
|
|
173
|
+
class: { indicator: "bg-rui-info" }
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
variant: TabVariant.underline,
|
|
177
|
+
color: "success",
|
|
178
|
+
class: { indicator: "bg-rui-success" }
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
defaultVariants: {
|
|
182
|
+
variant: TabVariant.underline,
|
|
183
|
+
layout: TabLayout.horizontal,
|
|
184
|
+
indicatorPosition: "end"
|
|
185
|
+
}
|
|
74
186
|
});
|
|
75
187
|
const slots = useSlots();
|
|
76
188
|
const { showArrows, prevArrowDisabled, nextArrowDisabled, onPrevSliderClick, onNextSliderClick, keepActiveTabVisible } = useTabScroll({
|
|
@@ -79,21 +191,36 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
79
191
|
vertical: () => __props.vertical
|
|
80
192
|
});
|
|
81
193
|
const { resolveRoute, isPathMatch } = useTabRouting({ onRouteChange: () => applyNewValue(true) });
|
|
194
|
+
const { onKeydown } = useTabKeyboard({
|
|
195
|
+
wrapper,
|
|
196
|
+
vertical: () => __props.vertical
|
|
197
|
+
});
|
|
198
|
+
const { style: indicatorStyle, animated, update: updateIndicator } = useTabIndicator({
|
|
199
|
+
bar,
|
|
200
|
+
wrapper,
|
|
201
|
+
vertical: () => __props.vertical,
|
|
202
|
+
variant: () => __props.variant
|
|
203
|
+
});
|
|
82
204
|
const layout = computed(() => __props.vertical ? TabLayout.vertical : TabLayout.horizontal);
|
|
83
205
|
const ui = computed(() => tabs({
|
|
84
|
-
|
|
85
|
-
|
|
206
|
+
variant: __props.variant,
|
|
207
|
+
layout: get(layout),
|
|
208
|
+
indicatorPosition: __props.indicatorPosition,
|
|
209
|
+
color: __props.color,
|
|
210
|
+
wide: __props.vertical || __props.grow,
|
|
211
|
+
animated: get(animated)
|
|
86
212
|
}));
|
|
87
213
|
const children = computed(() => {
|
|
88
214
|
const tabs = getChildrenTabs(slots.default?.() ?? []);
|
|
89
|
-
const currentModelValue = get
|
|
215
|
+
const currentModelValue = get(internalModelValue);
|
|
90
216
|
const inheritedProps = {
|
|
91
217
|
color: __props.color,
|
|
92
218
|
grow: __props.grow,
|
|
93
219
|
disabled: __props.disabled,
|
|
94
220
|
vertical: __props.vertical,
|
|
95
221
|
align: __props.align,
|
|
96
|
-
indicatorPosition: __props.indicatorPosition
|
|
222
|
+
indicatorPosition: __props.indicatorPosition,
|
|
223
|
+
variant: __props.variant
|
|
97
224
|
};
|
|
98
225
|
return tabs.map((tab, index) => {
|
|
99
226
|
let tabValue = tab.props?.value ?? index;
|
|
@@ -124,22 +251,21 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
124
251
|
}).flat();
|
|
125
252
|
}
|
|
126
253
|
function updateModelValue(newModelValue) {
|
|
127
|
-
set
|
|
128
|
-
set
|
|
254
|
+
set(modelValue, newModelValue);
|
|
255
|
+
set(internalModelValue, newModelValue);
|
|
129
256
|
}
|
|
130
257
|
function getTabRouteProps(props) {
|
|
131
258
|
return {
|
|
132
259
|
value: typeof props.value === "string" || typeof props.value === "number" ? props.value : void 0,
|
|
133
260
|
to: props.to ?? void 0,
|
|
134
261
|
link: typeof props.link === "boolean" ? props.link : void 0,
|
|
135
|
-
exact: typeof props.exact === "boolean" ? props.exact : void 0
|
|
136
|
-
exactPath: typeof props.exactPath === "boolean" ? props.exactPath : void 0
|
|
262
|
+
exact: typeof props.exact === "boolean" ? props.exact : void 0
|
|
137
263
|
};
|
|
138
264
|
}
|
|
139
265
|
function resolveActiveValue(onlyLink) {
|
|
140
|
-
const enabledChildren = get
|
|
266
|
+
const enabledChildren = get(children).filter((child) => !child.props?.disabled);
|
|
141
267
|
if (enabledChildren.length === 0) return void 0;
|
|
142
|
-
let result = get
|
|
268
|
+
let result = get(modelValue) || 0;
|
|
143
269
|
enabledChildren.forEach((child, index) => {
|
|
144
270
|
const tabProps = getTabRouteProps(child.props);
|
|
145
271
|
if (!onlyLink && index === 0 && tabProps.value) result = tabProps.value;
|
|
@@ -153,14 +279,20 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
153
279
|
if (value !== void 0) updateModelValue(value);
|
|
154
280
|
keepActiveTabVisible();
|
|
155
281
|
}
|
|
156
|
-
watchImmediate(() => get
|
|
157
|
-
set
|
|
282
|
+
watchImmediate(() => get(modelValue), (modelValue) => {
|
|
283
|
+
set(internalModelValue, modelValue);
|
|
158
284
|
});
|
|
159
285
|
watch(internalModelValue, () => {
|
|
160
286
|
keepActiveTabVisible();
|
|
161
287
|
});
|
|
288
|
+
watch(() => [
|
|
289
|
+
__props.vertical,
|
|
290
|
+
__props.variant,
|
|
291
|
+
__props.grow,
|
|
292
|
+
__props.align
|
|
293
|
+
], () => nextTick(updateIndicator), { flush: "post" });
|
|
162
294
|
onMounted(() => {
|
|
163
|
-
if (get
|
|
295
|
+
if (get(modelValue) !== void 0) return;
|
|
164
296
|
applyNewValue();
|
|
165
297
|
});
|
|
166
298
|
return (_ctx, _cache) => {
|
|
@@ -172,44 +304,57 @@ var RuiTabs_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
|
|
|
172
304
|
key: 0,
|
|
173
305
|
class: normalizeClass(unref(ui).arrow())
|
|
174
306
|
}, [createVNode(RuiButton_default, {
|
|
175
|
-
class: "w-full h-full !rounded-none",
|
|
176
307
|
variant: "text",
|
|
177
|
-
|
|
308
|
+
icon: "",
|
|
309
|
+
size: "sm",
|
|
310
|
+
tabindex: "-1",
|
|
311
|
+
"aria-label": "Scroll tabs back",
|
|
178
312
|
disabled: unref(prevArrowDisabled),
|
|
179
313
|
onClick: _cache[0] || (_cache[0] = ($event) => unref(onPrevSliderClick)())
|
|
180
314
|
}, {
|
|
181
315
|
default: withCtx(() => [createVNode(RuiIcon_default, { name: __props.vertical ? "lu-chevron-up" : "lu-chevron-left" }, null, 8, ["name"])]),
|
|
182
316
|
_: 1
|
|
183
|
-
}, 8, ["
|
|
317
|
+
}, 8, ["disabled"])], 2)) : createCommentVNode("", true),
|
|
184
318
|
createElementVNode("div", {
|
|
185
319
|
ref_key: "bar",
|
|
186
320
|
ref: bar,
|
|
187
|
-
class: normalizeClass(unref(ui).bar())
|
|
188
|
-
|
|
321
|
+
class: normalizeClass(unref(ui).bar()),
|
|
322
|
+
tabindex: unref(barTabindex)
|
|
323
|
+
}, [unref(indicatorStyle) ? (openBlock(), createElementBlock("span", {
|
|
324
|
+
key: 0,
|
|
325
|
+
"aria-hidden": "true",
|
|
326
|
+
"data-id": "tabs-indicator",
|
|
327
|
+
class: normalizeClass(unref(ui).indicator()),
|
|
328
|
+
style: normalizeStyle(unref(indicatorStyle))
|
|
329
|
+
}, null, 6)) : createCommentVNode("", true), createElementVNode("div", {
|
|
189
330
|
ref_key: "wrapper",
|
|
190
331
|
ref: wrapper,
|
|
191
332
|
role: "tablist",
|
|
192
333
|
"data-id": "tabs-wrapper",
|
|
193
|
-
|
|
334
|
+
"aria-orientation": __props.vertical ? "vertical" : void 0,
|
|
335
|
+
class: normalizeClass(unref(ui).wrapper()),
|
|
336
|
+
onKeydown: _cache[2] || (_cache[2] = ($event) => unref(onKeydown)($event))
|
|
194
337
|
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(children), (child, i) => {
|
|
195
338
|
return openBlock(), createBlock(resolveDynamicComponent(child), {
|
|
196
339
|
key: i,
|
|
197
340
|
onClick: _cache[1] || (_cache[1] = ($event) => updateModelValue($event))
|
|
198
341
|
});
|
|
199
|
-
}), 128))],
|
|
342
|
+
}), 128))], 42, _hoisted_3)], 10, _hoisted_2),
|
|
200
343
|
unref(showArrows) ? (openBlock(), createElementBlock("div", {
|
|
201
344
|
key: 1,
|
|
202
345
|
class: normalizeClass(unref(ui).arrow())
|
|
203
346
|
}, [createVNode(RuiButton_default, {
|
|
204
|
-
class: "w-full h-full !rounded-none",
|
|
205
347
|
variant: "text",
|
|
206
|
-
|
|
348
|
+
icon: "",
|
|
349
|
+
size: "sm",
|
|
350
|
+
tabindex: "-1",
|
|
351
|
+
"aria-label": "Scroll tabs forward",
|
|
207
352
|
disabled: unref(nextArrowDisabled),
|
|
208
|
-
onClick: _cache[
|
|
353
|
+
onClick: _cache[3] || (_cache[3] = ($event) => unref(onNextSliderClick)())
|
|
209
354
|
}, {
|
|
210
355
|
default: withCtx(() => [createVNode(RuiIcon_default, { name: __props.vertical ? "lu-chevron-down" : "lu-chevron-right" }, null, 8, ["name"])]),
|
|
211
356
|
_: 1
|
|
212
|
-
}, 8, ["
|
|
357
|
+
}, 8, ["disabled"])], 2)) : createCommentVNode("", true)
|
|
213
358
|
], 10, _hoisted_1);
|
|
214
359
|
};
|
|
215
360
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode, type VNode } from 'vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TabAlignment, type TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabRouting } from '@/components/tabs/tabs/use-tab-routing';\nimport { useTabScroll } from '@/components/tabs/tabs/use-tab-scroll';\nimport { tv } from '@/utils/tv';\n\ntype ChildNode = VNode & { props: Record<string, any> };\n\ninterface ResolvedTabProps {\n value?: string | number;\n to?: unknown;\n link?: boolean;\n exact?: boolean;\n exactPath?: boolean;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\n/**\n * The selected tab, defaulting to the first one. The default also narrows the\n * `update:modelValue` payload to `number | string`, so a consumer's handler\n * needs no undefined in its signature.\n */\nconst modelValue = defineModel<number | string>({ default: 0 });\n\nconst {\n color,\n vertical = false,\n disabled = false,\n grow = false,\n align = 'center',\n indicatorPosition = 'end',\n} = defineProps<Props>();\n\nconst internalModelValue = ref<string | number>();\nconst bar = useTemplateRef<HTMLDivElement>('bar');\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\n\nconst tabs = tv({\n slots: {\n root: '',\n arrow: '',\n bar: 'no-scrollbar max-h-full overflow-auto',\n wrapper: 'h-full inline-flex max-w-none',\n },\n variants: {\n layout: {\n [TabLayout.horizontal]: {\n root: 'flex h-fit',\n arrow: 'h-[3rem] w-10',\n bar: 'h-[3rem]',\n wrapper: '',\n },\n [TabLayout.vertical]: {\n root: 'inline-flex flex-col',\n arrow: 'min-h-[3rem] w-full',\n bar: '',\n wrapper: 'flex-col h-auto',\n },\n },\n wide: {\n true: {\n bar: 'w-full',\n wrapper: 'min-w-full',\n },\n },\n },\n defaultVariants: { layout: TabLayout.horizontal },\n});\n\nconst slots = useSlots();\n\nconst {\n showArrows,\n prevArrowDisabled,\n nextArrowDisabled,\n onPrevSliderClick,\n onNextSliderClick,\n keepActiveTabVisible,\n} = useTabScroll({ bar, wrapper, vertical: () => vertical });\n\nconst { resolveRoute, isPathMatch } = useTabRouting({\n onRouteChange: () => applyNewValue(true),\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst ui = computed<ReturnType<typeof tabs>>(() => tabs({ layout: get(layout), wide: vertical || grow }));\n\nconst children = computed<ChildNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n const currentModelValue = get(internalModelValue);\n const inheritedProps = {\n color,\n grow,\n disabled,\n vertical,\n align,\n indicatorPosition,\n };\n\n return tabs.map((tab, index) => {\n let tabValue = tab.props?.value ?? index;\n if (tab.props?.link !== false && tab.props?.to)\n tabValue = tab.props.to;\n\n const active = currentModelValue === tabValue;\n return {\n ...tab,\n props: {\n value: tabValue,\n active,\n ...inheritedProps,\n ...tab.props,\n },\n };\n });\n});\n\n/**\n * Unwraps the fragments a `v-for` in the slot produces, so only tabs come\n * back.\n *\n * @param children - the slot's vnodes\n * @returns the tabs among them\n */\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children.flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n }).flat();\n}\n\nfunction updateModelValue(newModelValue: string | number): void {\n set(modelValue, newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nfunction getTabRouteProps(props: Record<string, unknown>): ResolvedTabProps {\n return {\n value: typeof props.value === 'string' || typeof props.value === 'number' ? props.value : undefined,\n to: props.to ?? undefined,\n link: typeof props.link === 'boolean' ? props.link : undefined,\n exact: typeof props.exact === 'boolean' ? props.exact : undefined,\n exactPath: typeof props.exactPath === 'boolean' ? props.exactPath : undefined,\n };\n}\n\nfunction resolveActiveValue(onlyLink: boolean): string | number | undefined {\n const enabledChildren = get(children).filter(child => !child.props?.disabled);\n if (enabledChildren.length === 0)\n return undefined;\n\n let result: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const tabProps = getTabRouteProps(child.props);\n if (!onlyLink && index === 0 && tabProps.value)\n result = tabProps.value;\n\n const fullPath = resolveRoute(tabProps.to);\n\n if (tabProps.link !== false && fullPath && isPathMatch(fullPath, tabProps))\n result = fullPath;\n });\n return result;\n}\n\nfunction applyNewValue(onlyLink = false): void {\n const value = resolveActiveValue(onlyLink);\n if (value !== undefined)\n updateModelValue(value);\n\n keepActiveTabVisible();\n}\n\nwatchImmediate(() => get(modelValue), (modelValue) => {\n set(internalModelValue, modelValue);\n});\n\nwatch(internalModelValue, () => {\n keepActiveTabVisible();\n});\n\nonMounted(() => {\n if (get(modelValue) !== undefined)\n return;\n\n applyNewValue();\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n :data-vertical=\"vertical || undefined\"\n >\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n class=\"w-full h-full !rounded-none\"\n variant=\"text\"\n :color=\"color\"\n :disabled=\"prevArrowDisabled\"\n @click=\"onPrevSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-up' : 'lu-chevron-left'\" />\n </RuiButton>\n </div>\n <div\n ref=\"bar\"\n :class=\"ui.bar()\"\n >\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n data-id=\"tabs-wrapper\"\n :class=\"ui.wrapper()\"\n >\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateModelValue($event)\"\n />\n </div>\n </div>\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n class=\"w-full h-full !rounded-none\"\n variant=\"text\"\n :color=\"color\"\n :disabled=\"nextArrowDisabled\"\n @click=\"onNextSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-down' : 'lu-chevron-right'\" />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuiTabs.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport { Fragment, isVNode, type VNode } from 'vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TabAlignment, type TabIndicatorPosition, TabLayout, TabVariant } from '@/components/tabs/tab-props';\nimport { useTabIndicator } from '@/components/tabs/tabs/use-tab-indicator';\nimport { useTabKeyboard } from '@/components/tabs/tabs/use-tab-keyboard';\nimport { useTabRouting } from '@/components/tabs/tabs/use-tab-routing';\nimport { useTabScroll } from '@/components/tabs/tabs/use-tab-scroll';\nimport { useKeyboardScroll } from '@/composables/keyboard-scroll';\nimport { tv } from '@/utils/tv';\n\ntype ChildNode = VNode & { props: Record<string, any> };\n\ninterface ResolvedTabProps {\n value?: string | number;\n to?: unknown;\n link?: boolean;\n exact?: boolean;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n variant?: TabVariant;\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\n/**\n * The selected tab, defaulting to the first one. The default also narrows the\n * `update:modelValue` payload to `number | string`, so a consumer's handler\n * needs no undefined in its signature.\n */\nconst modelValue = defineModel<number | string>({ default: 0 });\n\nconst {\n color,\n vertical = false,\n disabled = false,\n grow = false,\n align = 'center',\n indicatorPosition = 'end',\n variant = TabVariant.underline,\n} = defineProps<Props>();\n\nconst internalModelValue = ref<string | number>();\nconst bar = useTemplateRef<HTMLDivElement>('bar');\nconst wrapper = useTemplateRef<HTMLDivElement>('wrapper');\nconst barTabindex = useKeyboardScroll(bar);\n\n/**\n * The bar. The underline variant draws its 1px track as a `before` line along\n * the whole root, so the arrows sit on it too, and the 2px indicator, a layer\n * above, covers it under the active tab.\n */\nconst tabs = tv({\n slots: {\n root: '',\n arrow: 'flex shrink-0 items-center justify-center',\n // a tab stop only when it scrolls with every tab disabled (useKeyboardScroll)\n bar: 'no-scrollbar relative max-h-full overflow-auto outline-hidden focus-visible:focus-ring focus-visible:-outline-offset-2',\n wrapper: 'inline-flex max-w-none',\n indicator: 'pointer-events-none absolute',\n },\n variants: {\n variant: {\n [TabVariant.underline]: {\n root: `relative before:pointer-events-none before:absolute before:bg-rui-divider before:content-['']`,\n indicator: 'z-1 bg-rui-primary',\n },\n [TabVariant.segmented]: {\n // neutral-200, not 100: on a near-white page (`#fafafa`) the lighter track all but disappeared\n root: 'rounded-rui-panel bg-rui-neutral-200 p-0.5 dark:bg-rui-neutral-800',\n wrapper: 'gap-0.5',\n indicator: 'rounded-rui-control bg-rui-surface shadow-rui-control dark:bg-rui-neutral-700',\n },\n },\n layout: {\n [TabLayout.horizontal]: { root: 'flex h-fit', arrow: 'w-8' },\n [TabLayout.vertical]: { root: 'inline-flex flex-col', arrow: 'h-8 w-full', wrapper: 'flex-col w-full' },\n },\n indicatorPosition: {\n start: {},\n end: {},\n },\n color: {\n primary: {},\n secondary: {},\n error: {},\n warning: {},\n info: {},\n success: {},\n },\n wide: {\n true: { bar: 'w-full', wrapper: 'min-w-full' },\n false: {},\n },\n animated: {\n true: { indicator: 'transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none' },\n false: {},\n },\n },\n compoundVariants: [\n { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'end', class: { root: 'before:inset-x-0 before:bottom-0 before:h-px', indicator: 'bottom-0 h-0.5 rounded-t-full' } },\n { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'start', class: { root: 'before:inset-x-0 before:top-0 before:h-px', indicator: 'top-0 h-0.5 rounded-b-full' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, indicatorPosition: 'end', class: { root: 'before:inset-y-0 before:right-0 before:w-px', indicator: 'right-0 w-0.5 rounded-l-full' } },\n { variant: TabVariant.underline, layout: TabLayout.vertical, indicatorPosition: 'start', class: { root: 'before:inset-y-0 before:left-0 before:w-px', indicator: 'left-0 w-0.5 rounded-r-full' } },\n // the underline track spans its row, while a segmented control hugs its options unless it grows\n { variant: TabVariant.segmented, layout: TabLayout.horizontal, wide: false, class: { root: 'w-fit max-w-full' } },\n // `color` picks the underline's color; the segmented pill stays a neutral surface\n { variant: TabVariant.underline, color: 'secondary', class: { indicator: 'bg-rui-secondary' } },\n { variant: TabVariant.underline, color: 'error', class: { indicator: 'bg-rui-error' } },\n { variant: TabVariant.underline, color: 'warning', class: { indicator: 'bg-rui-warning' } },\n { variant: TabVariant.underline, color: 'info', class: { indicator: 'bg-rui-info' } },\n { variant: TabVariant.underline, color: 'success', class: { indicator: 'bg-rui-success' } },\n ],\n defaultVariants: { variant: TabVariant.underline, layout: TabLayout.horizontal, indicatorPosition: 'end' },\n});\n\nconst slots = useSlots();\n\nconst {\n showArrows,\n prevArrowDisabled,\n nextArrowDisabled,\n onPrevSliderClick,\n onNextSliderClick,\n keepActiveTabVisible,\n} = useTabScroll({ bar, wrapper, vertical: () => vertical });\n\nconst { resolveRoute, isPathMatch } = useTabRouting({\n onRouteChange: () => applyNewValue(true),\n});\n\nconst { onKeydown } = useTabKeyboard({ wrapper, vertical: () => vertical });\n\nconst { style: indicatorStyle, animated, update: updateIndicator } = useTabIndicator({\n bar,\n wrapper,\n vertical: () => vertical,\n variant: () => variant,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst ui = computed<ReturnType<typeof tabs>>(() => tabs({\n variant,\n layout: get(layout),\n indicatorPosition,\n color,\n wide: vertical || grow,\n animated: get(animated),\n}));\n\nconst children = computed<ChildNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n const currentModelValue = get(internalModelValue);\n const inheritedProps = {\n color,\n grow,\n disabled,\n vertical,\n align,\n indicatorPosition,\n variant,\n };\n\n return tabs.map((tab, index) => {\n let tabValue = tab.props?.value ?? index;\n if (tab.props?.link !== false && tab.props?.to)\n tabValue = tab.props.to;\n\n const active = currentModelValue === tabValue;\n return {\n ...tab,\n props: {\n value: tabValue,\n active,\n ...inheritedProps,\n ...tab.props,\n },\n };\n });\n});\n\n/**\n * Unwraps the fragments a `v-for` in the slot produces, so only tabs come\n * back.\n *\n * @param children - the slot's vnodes\n * @returns the tabs among them\n */\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children.flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n }).flat();\n}\n\nfunction updateModelValue(newModelValue: string | number): void {\n set(modelValue, newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nfunction getTabRouteProps(props: Record<string, unknown>): ResolvedTabProps {\n return {\n value: typeof props.value === 'string' || typeof props.value === 'number' ? props.value : undefined,\n to: props.to ?? undefined,\n link: typeof props.link === 'boolean' ? props.link : undefined,\n exact: typeof props.exact === 'boolean' ? props.exact : undefined,\n };\n}\n\nfunction resolveActiveValue(onlyLink: boolean): string | number | undefined {\n const enabledChildren = get(children).filter(child => !child.props?.disabled);\n if (enabledChildren.length === 0)\n return undefined;\n\n let result: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const tabProps = getTabRouteProps(child.props);\n if (!onlyLink && index === 0 && tabProps.value)\n result = tabProps.value;\n\n const fullPath = resolveRoute(tabProps.to);\n\n if (tabProps.link !== false && fullPath && isPathMatch(fullPath, tabProps))\n result = fullPath;\n });\n return result;\n}\n\nfunction applyNewValue(onlyLink = false): void {\n const value = resolveActiveValue(onlyLink);\n if (value !== undefined)\n updateModelValue(value);\n\n keepActiveTabVisible();\n}\n\nwatchImmediate(() => get(modelValue), (modelValue) => {\n set(internalModelValue, modelValue);\n});\n\nwatch(internalModelValue, () => {\n keepActiveTabVisible();\n});\n\nwatch(() => [vertical, variant, grow, align], () => nextTick(updateIndicator), { flush: 'post' });\n\nonMounted(() => {\n if (get(modelValue) !== undefined)\n return;\n\n applyNewValue();\n});\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n :data-vertical=\"vertical || undefined\"\n >\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n aria-label=\"Scroll tabs back\"\n :disabled=\"prevArrowDisabled\"\n @click=\"onPrevSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-up' : 'lu-chevron-left'\" />\n </RuiButton>\n </div>\n <div\n ref=\"bar\"\n :class=\"ui.bar()\"\n :tabindex=\"barTabindex\"\n >\n <span\n v-if=\"indicatorStyle\"\n aria-hidden=\"true\"\n data-id=\"tabs-indicator\"\n :class=\"ui.indicator()\"\n :style=\"indicatorStyle\"\n />\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n data-id=\"tabs-wrapper\"\n :aria-orientation=\"vertical ? 'vertical' : undefined\"\n :class=\"ui.wrapper()\"\n @keydown=\"onKeydown($event)\"\n >\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n @click=\"updateModelValue($event)\"\n />\n </div>\n </div>\n <div\n v-if=\"showArrows\"\n :class=\"ui.arrow()\"\n >\n <RuiButton\n variant=\"text\"\n icon\n size=\"sm\"\n tabindex=\"-1\"\n aria-label=\"Scroll tabs forward\"\n :disabled=\"nextArrowDisabled\"\n @click=\"onNextSliderClick()\"\n >\n <RuiIcon :name=\"vertical ? 'lu-chevron-down' : 'lu-chevron-right'\" />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCA,MAAM,aAAa,SAA4B,SAAA,YAAe;EAY9D,MAAM,qBAAqB,IAAqB;EAChD,MAAM,MAAM,eAA+B,KAAK;EAChD,MAAM,UAAU,eAA+B,SAAS;EACxD,MAAM,cAAc,kBAAkB,GAAG;;;;;;EAOzC,MAAM,OAAO,GAAG;GACd,OAAO;IACL,MAAM;IACN,OAAO;IAEP,KAAK;IACL,SAAS;IACT,WAAW;GACb;GACA,UAAU;IACR,SAAS;MACN,WAAW,YAAY;MACtB,MAAM;MACN,WAAW;KACb;MACC,WAAW,YAAY;MAEtB,MAAM;MACN,SAAS;MACT,WAAW;KACb;IACF;IACA,QAAQ;MACL,UAAU,aAAa;MAAE,MAAM;MAAc,OAAO;KAAM;MAC1D,UAAU,WAAW;MAAE,MAAM;MAAwB,OAAO;MAAc,SAAS;KAAkB;IACxG;IACA,mBAAmB;KACjB,OAAO,CAAC;KACR,KAAK,CAAC;IACR;IACA,OAAO;KACL,SAAS,CAAC;KACV,WAAW,CAAC;KACZ,OAAO,CAAC;KACR,SAAS,CAAC;KACV,MAAM,CAAC;KACP,SAAS,CAAC;IACZ;IACA,MAAM;KACJ,MAAM;MAAE,KAAK;MAAU,SAAS;KAAa;KAC7C,OAAO,CAAC;IACV;IACA,UAAU;KACR,MAAM,EAAE,WAAW,yFAAyF;KAC5G,OAAO,CAAC;IACV;GACF;GACA,kBAAkB;IAChB;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAY,mBAAmB;KAAO,OAAO;MAAE,MAAM;MAAgD,WAAW;KAAgC;IAAE;IACrM;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAY,mBAAmB;KAAS,OAAO;MAAE,MAAM;MAA6C,WAAW;KAA6B;IAAE;IACjM;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAU,mBAAmB;KAAO,OAAO;MAAE,MAAM;MAA+C,WAAW;KAA+B;IAAE;IACjM;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAU,mBAAmB;KAAS,OAAO;MAAE,MAAM;MAA8C,WAAW;KAA8B;IAAE;IAEjM;KAAE,SAAS,WAAW;KAAW,QAAQ,UAAU;KAAY,MAAM;KAAO,OAAO,EAAE,MAAM,mBAAmB;IAAE;IAEhH;KAAE,SAAS,WAAW;KAAW,OAAO;KAAa,OAAO,EAAE,WAAW,mBAAmB;IAAE;IAC9F;KAAE,SAAS,WAAW;KAAW,OAAO;KAAS,OAAO,EAAE,WAAW,eAAe;IAAE;IACtF;KAAE,SAAS,WAAW;KAAW,OAAO;KAAW,OAAO,EAAE,WAAW,iBAAiB;IAAE;IAC1F;KAAE,SAAS,WAAW;KAAW,OAAO;KAAQ,OAAO,EAAE,WAAW,cAAc;IAAE;IACpF;KAAE,SAAS,WAAW;KAAW,OAAO;KAAW,OAAO,EAAE,WAAW,iBAAiB;IAAE;GAC5F;GACA,iBAAiB;IAAE,SAAS,WAAW;IAAW,QAAQ,UAAU;IAAY,mBAAmB;GAAM;EAC3G,CAAC;EAED,MAAM,QAAQ,SAAS;EAEvB,MAAM,EACJ,YACA,mBACA,mBACA,mBACA,mBACA,yBACE,aAAa;GAAE;GAAK;GAAS,gBAAgB,QAAA;EAAS,CAAC;EAE3D,MAAM,EAAE,cAAc,gBAAgB,cAAc,EAClD,qBAAqB,cAAc,IAAI,EACzC,CAAC;EAED,MAAM,EAAE,cAAc,eAAe;GAAE;GAAS,gBAAgB,QAAA;EAAS,CAAC;EAE1E,MAAM,EAAE,OAAO,gBAAgB,UAAU,QAAQ,oBAAoB,gBAAgB;GACnF;GACA;GACA,gBAAgB,QAAA;GAChB,eAAe,QAAA;EACjB,CAAC;EAED,MAAM,SAAS,eAA0B,QAAA,WAAW,UAAU,WAAW,UAAU,UAAU;EAC7F,MAAM,KAAK,eAAwC,KAAK;GACtD,SAAM,QAAA;GACN,QAAQ,IAAI,MAAM;GAClB,mBAAgB,QAAA;GAChB,OAAI,QAAA;GACJ,MAAM,QAAA,YAAY,QAAA;GAClB,UAAU,IAAI,QAAQ;EACxB,CAAC,CAAC;EAEF,MAAM,WAAW,eAA4B;GAG3C,MAAM,OAAO,gBAFO,MAAM,UAAU,KAAK,CAAC,CAEF;GAExC,MAAM,oBAAoB,IAAI,kBAAkB;GAChD,MAAM,iBAAiB;IACrB,OAAI,QAAA;IACJ,MAAG,QAAA;IACH,UAAO,QAAA;IACP,UAAO,QAAA;IACP,OAAI,QAAA;IACJ,mBAAgB,QAAA;IAChB,SAAM,QAAA;GACR;GAEA,OAAO,KAAK,KAAK,KAAK,UAAU;IAC9B,IAAI,WAAW,IAAI,OAAO,SAAS;IACnC,IAAI,IAAI,OAAO,SAAS,SAAS,IAAI,OAAO,IAC1C,WAAW,IAAI,MAAM;IAEvB,MAAM,SAAS,sBAAsB;IACrC,OAAO;KACL,GAAG;KACH,OAAO;MACL,OAAO;MACP;MACA,GAAG;MACH,GAAG,IAAI;KACT;IACF;GACF,CAAC;EACH,CAAC;;;;;;;;EASD,SAAS,gBAAgB,UAA4B;GACnD,OAAO,SAAS,SAAS,SAAS;IAChC,IAAI,KAAK,SAAS,YAAY,MAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS,GACnF,OAAO,gBAAgB,KAAK,SAAS,OAAO,OAAO,CAAC;IAEtD,OAAO,CAAC,IAAI;GACd,CAAC,CAAC,CAAC,KAAK;EACV;EAEA,SAAS,iBAAiB,eAAsC;GAC9D,IAAI,YAAY,aAAa;GAC7B,IAAI,oBAAoB,aAAa;EACvC;EAEA,SAAS,iBAAiB,OAAkD;GAC1E,OAAO;IACL,OAAO,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,KAAA;IAC1F,IAAI,MAAM,MAAM,KAAA;IAChB,MAAM,OAAO,MAAM,SAAS,YAAY,MAAM,OAAO,KAAA;IACrD,OAAO,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ,KAAA;GAC1D;EACF;EAEA,SAAS,mBAAmB,UAAgD;GAC1E,MAAM,kBAAkB,IAAI,QAAQ,CAAC,CAAC,QAAO,UAAS,CAAC,MAAM,OAAO,QAAQ;GAC5E,IAAI,gBAAgB,WAAW,GAC7B,OAAO,KAAA;GAET,IAAI,SAA0B,IAAI,UAAU,KAAK;GACjD,gBAAgB,SAAS,OAAO,UAAU;IACxC,MAAM,WAAW,iBAAiB,MAAM,KAAK;IAC7C,IAAI,CAAC,YAAY,UAAU,KAAK,SAAS,OACvC,SAAS,SAAS;IAEpB,MAAM,WAAW,aAAa,SAAS,EAAE;IAEzC,IAAI,SAAS,SAAS,SAAS,YAAY,YAAY,UAAU,QAAQ,GACvE,SAAS;GACb,CAAC;GACD,OAAO;EACT;EAEA,SAAS,cAAc,WAAW,OAAa;GAC7C,MAAM,QAAQ,mBAAmB,QAAQ;GACzC,IAAI,UAAU,KAAA,GACZ,iBAAiB,KAAK;GAExB,qBAAqB;EACvB;EAEA,qBAAqB,IAAI,UAAU,IAAI,eAAe;GACpD,IAAI,oBAAoB,UAAU;EACpC,CAAC;EAED,MAAM,0BAA0B;GAC9B,qBAAqB;EACvB,CAAC;EAED,YAAY;GAAC,QAAA;GAAU,QAAA;GAAS,QAAA;GAAM,QAAA;EAAK,SAAS,SAAS,eAAe,GAAG,EAAE,OAAO,OAAO,CAAC;EAEhG,gBAAgB;GACd,IAAI,IAAI,UAAU,MAAM,KAAA,GACtB;GAEF,cAAc;EAChB,CAAC;;GAIC,OAAA,UAAA,GAAA,mBAgEM,OAAA;IA/DH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,KAAI,CAAA;IACd,iBAAe,QAAA,YAAY,KAAA;;IAGpB,MAAA,UAAA,KADR,UAAA,GAAA,mBAeM,OAAA;;KAbH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;IAEhB,GAAA,CAAA,YAUY,mBAAA;KATV,SAAQ;KACR,MAAA;KACA,MAAK;KACL,UAAS;KACT,cAAW;KACV,UAAU,MAAA,iBAAA;KACV,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,iBAAA,CAAiB,CAAA;;KAEzB,SAAA,cAAkE,CAAlE,YAAkE,iBAAA,EAAxD,MAAM,QAAA,WAAQ,kBAAA,kBAAA,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA;;;IAG5B,mBA2BM,OAAA;KA1BA,SAAA;KAAJ,KAAI;KACH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,IAAG,CAAA;KACb,UAAU,MAAA,WAAA;IAGH,GAAA,CAAA,MAAA,cAAA,KADR,UAAA,GAAA,mBAME,QAAA;;KAJA,eAAY;KACZ,WAAQ;KACP,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,UAAS,CAAA;KACnB,OAAK,eAAE,MAAA,cAAA,CAAc;IAExB,GAAA,MAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAAA,mBAcM,OAAA;KAbA,SAAA;KAAJ,KAAI;KACJ,MAAK;KACL,WAAQ;KACP,oBAAkB,QAAA,WAAQ,aAAgB,KAAA;KAC1C,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,QAAO,CAAA;KACjB,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,SAAA,CAAS,CAAC,MAAM;IAE1B,GAAA,EAAA,UAAA,IAAA,GAAA,mBAKE,UAAA,MAAA,WAHqB,MAAA,QAAA,IAAb,OAAO,MAAC;KAFlB,OAAA,UAAA,GAAA,YAKE,wBAJK,KAAK,GAAA;MAET,KAAK;MACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,iBAAiB,MAAM;;;IAK7B,MAAA,UAAA,KADR,UAAA,GAAA,mBAeM,OAAA;;KAbH,OAAK,eAAE,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;IAEhB,GAAA,CAAA,YAUY,mBAAA;KATV,SAAQ;KACR,MAAA;KACA,MAAK;KACL,UAAS;KACT,cAAW;KACV,UAAU,MAAA,iBAAA;KACV,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,iBAAA,CAAiB,CAAA;;KAEzB,SAAA,cAAqE,CAArE,YAAqE,iBAAA,EAA3D,MAAM,QAAA,WAAQ,oBAAA,mBAAA,GAAA,MAAA,GAAA,CAAA,MAAA,CAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ComputedRef, CSSProperties, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';
|
|
2
|
+
import { TabVariant } from '../tab-props.js';
|
|
3
|
+
interface UseTabIndicatorOptions {
|
|
4
|
+
/** The scrolling bar, the indicator's positioning context */
|
|
5
|
+
bar: Readonly<ShallowRef<HTMLDivElement | null>>;
|
|
6
|
+
/** The tablist inside the bar */
|
|
7
|
+
wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;
|
|
8
|
+
/** Whether the tabs run top to bottom, so the underline follows their height */
|
|
9
|
+
vertical: MaybeRefOrGetter<boolean>;
|
|
10
|
+
/** The bar's look, which decides whether the indicator is a line or a pill */
|
|
11
|
+
variant: MaybeRefOrGetter<TabVariant>;
|
|
12
|
+
}
|
|
13
|
+
interface UseTabIndicatorReturn {
|
|
14
|
+
/** The indicator's box, or undefined while no tab is active */
|
|
15
|
+
style: ComputedRef<CSSProperties | undefined>;
|
|
16
|
+
/** False until the first placement, so the indicator appears in place rather than sliding in */
|
|
17
|
+
animated: Readonly<Ref<boolean>>;
|
|
18
|
+
update: () => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Tracks the active tab's box so one indicator can slide between tabs. It lives
|
|
22
|
+
* in the bar, next to the tablist, so it scrolls with the tabs while the
|
|
23
|
+
* tablist holds only tabs. The underline takes the tab's span along the bar;
|
|
24
|
+
* the segmented pill takes its whole box.
|
|
25
|
+
*/
|
|
26
|
+
export declare function useTabIndicator({ bar, wrapper, vertical, variant }: UseTabIndicatorOptions): UseTabIndicatorReturn;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { get, set } from "../../../vendor/@vueuse/shared/dist/index.js";
|
|
2
|
+
import { useMutationObserver, useResizeObserver } from "../../../vendor/@vueuse/core/dist/index.js";
|
|
3
|
+
import { TabVariant } from "../tab-props.js";
|
|
4
|
+
import { computed, onMounted, readonly, shallowRef, toValue } from "vue";
|
|
5
|
+
//#region src/components/tabs/tabs/use-tab-indicator.ts
|
|
6
|
+
/**
|
|
7
|
+
* Tracks the active tab's box so one indicator can slide between tabs. It lives
|
|
8
|
+
* in the bar, next to the tablist, so it scrolls with the tabs while the
|
|
9
|
+
* tablist holds only tabs. The underline takes the tab's span along the bar;
|
|
10
|
+
* the segmented pill takes its whole box.
|
|
11
|
+
*/
|
|
12
|
+
function useTabIndicator({ bar, wrapper, vertical, variant }) {
|
|
13
|
+
const rect = shallowRef();
|
|
14
|
+
const animated = shallowRef(false);
|
|
15
|
+
function update() {
|
|
16
|
+
const tab = get(bar)?.querySelector("[role=tab][data-active-tab]");
|
|
17
|
+
if (!tab) {
|
|
18
|
+
set(rect, void 0);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
set(rect, {
|
|
22
|
+
left: tab.offsetLeft,
|
|
23
|
+
top: tab.offsetTop,
|
|
24
|
+
width: tab.offsetWidth,
|
|
25
|
+
height: tab.offsetHeight
|
|
26
|
+
});
|
|
27
|
+
if (!get(animated)) requestAnimationFrame(() => set(animated, true));
|
|
28
|
+
}
|
|
29
|
+
const style = computed(() => {
|
|
30
|
+
const box = get(rect);
|
|
31
|
+
if (!box) return void 0;
|
|
32
|
+
const px = (value) => `${value}px`;
|
|
33
|
+
if (toValue(variant) === TabVariant.segmented) return {
|
|
34
|
+
left: px(box.left),
|
|
35
|
+
top: px(box.top),
|
|
36
|
+
width: px(box.width),
|
|
37
|
+
height: px(box.height)
|
|
38
|
+
};
|
|
39
|
+
return toValue(vertical) ? {
|
|
40
|
+
top: px(box.top),
|
|
41
|
+
height: px(box.height)
|
|
42
|
+
} : {
|
|
43
|
+
left: px(box.left),
|
|
44
|
+
width: px(box.width)
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
useResizeObserver(wrapper, update);
|
|
48
|
+
useMutationObserver(wrapper, update, {
|
|
49
|
+
subtree: true,
|
|
50
|
+
attributes: true,
|
|
51
|
+
attributeFilter: ["data-active-tab"],
|
|
52
|
+
childList: true
|
|
53
|
+
});
|
|
54
|
+
onMounted(() => {
|
|
55
|
+
update();
|
|
56
|
+
document.fonts?.ready.then(update).catch(() => {});
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
style,
|
|
60
|
+
animated: readonly(animated),
|
|
61
|
+
update
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { useTabIndicator };
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=use-tab-indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tab-indicator.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-indicator.ts"],"sourcesContent":["import type { ComputedRef, CSSProperties, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';\nimport { TabVariant } from '@/components/tabs/tab-props';\n\ninterface UseTabIndicatorOptions {\n /** The scrolling bar, the indicator's positioning context */\n bar: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** The tablist inside the bar */\n wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** Whether the tabs run top to bottom, so the underline follows their height */\n vertical: MaybeRefOrGetter<boolean>;\n /** The bar's look, which decides whether the indicator is a line or a pill */\n variant: MaybeRefOrGetter<TabVariant>;\n}\n\ninterface UseTabIndicatorReturn {\n /** The indicator's box, or undefined while no tab is active */\n style: ComputedRef<CSSProperties | undefined>;\n /** False until the first placement, so the indicator appears in place rather than sliding in */\n animated: Readonly<Ref<boolean>>;\n update: () => void;\n}\n\ninterface TabRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Tracks the active tab's box so one indicator can slide between tabs. It lives\n * in the bar, next to the tablist, so it scrolls with the tabs while the\n * tablist holds only tabs. The underline takes the tab's span along the bar;\n * the segmented pill takes its whole box.\n */\nexport function useTabIndicator({ bar, wrapper, vertical, variant }: UseTabIndicatorOptions): UseTabIndicatorReturn {\n const rect = shallowRef<TabRect>();\n const animated = shallowRef<boolean>(false);\n\n function update(): void {\n const tab = get(bar)?.querySelector<HTMLElement>('[role=tab][data-active-tab]');\n if (!tab) {\n set(rect, undefined);\n return;\n }\n\n set(rect, { left: tab.offsetLeft, top: tab.offsetTop, width: tab.offsetWidth, height: tab.offsetHeight });\n\n if (!get(animated))\n requestAnimationFrame(() => set(animated, true));\n }\n\n const style = computed<CSSProperties | undefined>(() => {\n const box = get(rect);\n if (!box)\n return undefined;\n\n const px = (value: number): string => `${value}px`;\n if (toValue(variant) === TabVariant.segmented)\n return { left: px(box.left), top: px(box.top), width: px(box.width), height: px(box.height) };\n\n return toValue(vertical)\n ? { top: px(box.top), height: px(box.height) }\n : { left: px(box.left), width: px(box.width) };\n });\n\n useResizeObserver(wrapper, update);\n useMutationObserver(wrapper, update, { subtree: true, attributes: true, attributeFilter: ['data-active-tab'], childList: true });\n\n onMounted(() => {\n update();\n // a web font that loads later changes every label's width\n document.fonts?.ready.then(update).catch(() => {});\n });\n\n return { style, animated: readonly(animated), update };\n}\n"],"mappings":";;;;;;;;;;;AAmCA,SAAgB,gBAAgB,EAAE,KAAK,SAAS,UAAU,WAA0D;CAClH,MAAM,OAAO,WAAoB;CACjC,MAAM,WAAW,WAAoB,KAAK;CAE1C,SAAS,SAAe;EACtB,MAAM,MAAM,IAAI,GAAG,CAAC,EAAE,cAA2B,6BAA6B;EAC9E,IAAI,CAAC,KAAK;GACR,IAAI,MAAM,KAAA,CAAS;GACnB;EACF;EAEA,IAAI,MAAM;GAAE,MAAM,IAAI;GAAY,KAAK,IAAI;GAAW,OAAO,IAAI;GAAa,QAAQ,IAAI;EAAa,CAAC;EAExG,IAAI,CAAC,IAAI,QAAQ,GACf,4BAA4B,IAAI,UAAU,IAAI,CAAC;CACnD;CAEA,MAAM,QAAQ,eAA0C;EACtD,MAAM,MAAM,IAAI,IAAI;EACpB,IAAI,CAAC,KACH,OAAO,KAAA;EAET,MAAM,MAAM,UAA0B,GAAG,MAAM;EAC/C,IAAI,QAAQ,OAAO,MAAM,WAAW,WAClC,OAAO;GAAE,MAAM,GAAG,IAAI,IAAI;GAAG,KAAK,GAAG,IAAI,GAAG;GAAG,OAAO,GAAG,IAAI,KAAK;GAAG,QAAQ,GAAG,IAAI,MAAM;EAAE;EAE9F,OAAO,QAAQ,QAAQ,IACnB;GAAE,KAAK,GAAG,IAAI,GAAG;GAAG,QAAQ,GAAG,IAAI,MAAM;EAAE,IAC3C;GAAE,MAAM,GAAG,IAAI,IAAI;GAAG,OAAO,GAAG,IAAI,KAAK;EAAE;CACjD,CAAC;CAED,kBAAkB,SAAS,MAAM;CACjC,oBAAoB,SAAS,QAAQ;EAAE,SAAS;EAAM,YAAY;EAAM,iBAAiB,CAAC,iBAAiB;EAAG,WAAW;CAAK,CAAC;CAE/H,gBAAgB;EACd,OAAO;EAEP,SAAS,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;CACnD,CAAC;CAED,OAAO;EAAE;EAAO,UAAU,SAAS,QAAQ;EAAG;CAAO;AACvD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MaybeRefOrGetter, ShallowRef } from 'vue';
|
|
2
|
+
interface UseTabKeyboardOptions {
|
|
3
|
+
/** The tablist element */
|
|
4
|
+
wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;
|
|
5
|
+
/** Whether the tabs run top to bottom, which moves with the up and down arrows */
|
|
6
|
+
vertical: MaybeRefOrGetter<boolean>;
|
|
7
|
+
}
|
|
8
|
+
interface UseTabKeyboardReturn {
|
|
9
|
+
onKeydown: (event: KeyboardEvent) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The WAI-ARIA tabs keys: the arrows along the bar move to the next or
|
|
13
|
+
* previous enabled tab and select it, Home and End jump to the ends. Selecting
|
|
14
|
+
* goes through a click, so a link tab navigates as it would with the mouse.
|
|
15
|
+
*/
|
|
16
|
+
export declare function useTabKeyboard({ wrapper, vertical }: UseTabKeyboardOptions): UseTabKeyboardReturn;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { get } from "../../../vendor/@vueuse/shared/dist/index.js";
|
|
2
|
+
import { toValue } from "vue";
|
|
3
|
+
//#region src/components/tabs/tabs/use-tab-keyboard.ts
|
|
4
|
+
/**
|
|
5
|
+
* The index a key moves to among `count` tabs, wrapping at both ends.
|
|
6
|
+
*
|
|
7
|
+
* @param step - -1 or 1 for the arrows, or `first` and `last` for Home and End
|
|
8
|
+
* @param current - the focused tab's index
|
|
9
|
+
* @param count - the number of enabled tabs
|
|
10
|
+
* @returns the index to move to
|
|
11
|
+
*/
|
|
12
|
+
function targetIndex(step, current, count) {
|
|
13
|
+
if (step === "first") return 0;
|
|
14
|
+
if (step === "last") return count - 1;
|
|
15
|
+
return (current + step + count) % count;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The WAI-ARIA tabs keys: the arrows along the bar move to the next or
|
|
19
|
+
* previous enabled tab and select it, Home and End jump to the ends. Selecting
|
|
20
|
+
* goes through a click, so a link tab navigates as it would with the mouse.
|
|
21
|
+
*/
|
|
22
|
+
function useTabKeyboard({ wrapper, vertical }) {
|
|
23
|
+
function steps(list) {
|
|
24
|
+
if (toValue(vertical)) return {
|
|
25
|
+
ArrowUp: -1,
|
|
26
|
+
ArrowDown: 1,
|
|
27
|
+
Home: "first",
|
|
28
|
+
End: "last"
|
|
29
|
+
};
|
|
30
|
+
const rtl = getComputedStyle(list).direction === "rtl";
|
|
31
|
+
return {
|
|
32
|
+
ArrowLeft: rtl ? 1 : -1,
|
|
33
|
+
ArrowRight: rtl ? -1 : 1,
|
|
34
|
+
Home: "first",
|
|
35
|
+
End: "last"
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function onKeydown(event) {
|
|
39
|
+
const list = get(wrapper);
|
|
40
|
+
const step = list ? steps(list)[event.key] : void 0;
|
|
41
|
+
if (!list || step === void 0) return;
|
|
42
|
+
const enabled = [...list.querySelectorAll("[role=tab]:not([disabled]):not([aria-disabled=true])")];
|
|
43
|
+
const focused = event.target;
|
|
44
|
+
const current = focused instanceof HTMLElement ? enabled.indexOf(focused) : -1;
|
|
45
|
+
if (current === -1) return;
|
|
46
|
+
const tab = enabled[targetIndex(step, current, enabled.length)];
|
|
47
|
+
if (!tab) return;
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
tab.focus();
|
|
50
|
+
tab.click();
|
|
51
|
+
}
|
|
52
|
+
return { onKeydown };
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { useTabKeyboard };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=use-tab-keyboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tab-keyboard.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-keyboard.ts"],"sourcesContent":["import type { MaybeRefOrGetter, ShallowRef } from 'vue';\n\ninterface UseTabKeyboardOptions {\n /** The tablist element */\n wrapper: Readonly<ShallowRef<HTMLDivElement | null>>;\n /** Whether the tabs run top to bottom, which moves with the up and down arrows */\n vertical: MaybeRefOrGetter<boolean>;\n}\n\ninterface UseTabKeyboardReturn {\n onKeydown: (event: KeyboardEvent) => void;\n}\n\n/**\n * The index a key moves to among `count` tabs, wrapping at both ends.\n *\n * @param step - -1 or 1 for the arrows, or `first` and `last` for Home and End\n * @param current - the focused tab's index\n * @param count - the number of enabled tabs\n * @returns the index to move to\n */\nfunction targetIndex(step: -1 | 1 | 'first' | 'last', current: number, count: number): number {\n if (step === 'first')\n return 0;\n if (step === 'last')\n return count - 1;\n return (current + step + count) % count;\n}\n\n/**\n * The WAI-ARIA tabs keys: the arrows along the bar move to the next or\n * previous enabled tab and select it, Home and End jump to the ends. Selecting\n * goes through a click, so a link tab navigates as it would with the mouse.\n */\nexport function useTabKeyboard({ wrapper, vertical }: UseTabKeyboardOptions): UseTabKeyboardReturn {\n function steps(list: HTMLElement): Record<string, -1 | 1 | 'first' | 'last'> {\n if (toValue(vertical))\n return { ArrowUp: -1, ArrowDown: 1, Home: 'first', End: 'last' };\n\n const rtl = getComputedStyle(list).direction === 'rtl';\n return { ArrowLeft: rtl ? 1 : -1, ArrowRight: rtl ? -1 : 1, Home: 'first', End: 'last' };\n }\n\n function onKeydown(event: KeyboardEvent): void {\n const list = get(wrapper);\n const step = list ? steps(list)[event.key] : undefined;\n if (!list || step === undefined)\n return;\n\n const enabled = [...list.querySelectorAll<HTMLElement>('[role=tab]:not([disabled]):not([aria-disabled=true])')];\n // the key lands on the focused tab\n const focused = event.target;\n const current = focused instanceof HTMLElement ? enabled.indexOf(focused) : -1;\n if (current === -1)\n return;\n\n const tab = enabled[targetIndex(step, current, enabled.length)];\n if (!tab)\n return;\n\n event.preventDefault();\n tab.focus();\n tab.click();\n }\n\n return { onKeydown };\n}\n"],"mappings":";;;;;;;;;;;AAqBA,SAAS,YAAY,MAAiC,SAAiB,OAAuB;CAC5F,IAAI,SAAS,SACX,OAAO;CACT,IAAI,SAAS,QACX,OAAO,QAAQ;CACjB,QAAQ,UAAU,OAAO,SAAS;AACpC;;;;;;AAOA,SAAgB,eAAe,EAAE,SAAS,YAAyD;CACjG,SAAS,MAAM,MAA8D;EAC3E,IAAI,QAAQ,QAAQ,GAClB,OAAO;GAAE,SAAS;GAAI,WAAW;GAAG,MAAM;GAAS,KAAK;EAAO;EAEjE,MAAM,MAAM,iBAAiB,IAAI,CAAC,CAAC,cAAc;EACjD,OAAO;GAAE,WAAW,MAAM,IAAI;GAAI,YAAY,MAAM,KAAK;GAAG,MAAM;GAAS,KAAK;EAAO;CACzF;CAEA,SAAS,UAAU,OAA4B;EAC7C,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,KAAA;EAC7C,IAAI,CAAC,QAAQ,SAAS,KAAA,GACpB;EAEF,MAAM,UAAU,CAAC,GAAG,KAAK,iBAA8B,sDAAsD,CAAC;EAE9G,MAAM,UAAU,MAAM;EACtB,MAAM,UAAU,mBAAmB,cAAc,QAAQ,QAAQ,OAAO,IAAI;EAC5E,IAAI,YAAY,IACd;EAEF,MAAM,MAAM,QAAQ,YAAY,MAAM,SAAS,QAAQ,MAAM;EAC7D,IAAI,CAAC,KACH;EAEF,MAAM,eAAe;EACrB,IAAI,MAAM;EACV,IAAI,MAAM;CACZ;CAEA,OAAO,EAAE,UAAU;AACrB"}
|
|
@@ -22,9 +22,8 @@ function useTabRouting({ onRouteChange }) {
|
|
|
22
22
|
if (!isRouteLocation(to)) return void 0;
|
|
23
23
|
return router.resolve(to).fullPath;
|
|
24
24
|
}
|
|
25
|
-
function isPathMatch(path, {
|
|
25
|
+
function isPathMatch(path, { exact }) {
|
|
26
26
|
const currentRoute = route.fullPath;
|
|
27
|
-
if (exactPath) return currentRoute === path;
|
|
28
27
|
const base = typeof window !== "undefined" ? window.location.origin : "http://localhost";
|
|
29
28
|
const routeWithoutQueryParams = new URL(path, base).pathname;
|
|
30
29
|
if (exact) return currentRoute === routeWithoutQueryParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tab-routing.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-routing.ts"],"sourcesContent":["import type { RouteMatchOptions } from '@/components/tabs/tab-props';\nimport { type RouteLocationRaw, useRoute, useRouter } from 'vue-router';\n\ninterface UseTabRoutingOptions {\n /** Callback invoked when the route changes, to re-sync the active tab */\n onRouteChange: () => void;\n}\n\ninterface UseTabRoutingReturn {\n /** Whether vue-router is available in the app context */\n hasRouter: boolean;\n /**\n * Resolves a route location and returns its full path, or undefined\n * if the router is not available or the value is not a valid route location.\n */\n resolveRoute: (to: unknown) => string | undefined;\n /**\n * Checks whether a given path matches the current route.\n * Supports exact path, exact route, and prefix matching.\n */\n isPathMatch: (path: string, options: RouteMatchOptions) => boolean;\n}\n\nexport function isRouteLocation(value: unknown): value is RouteLocationRaw {\n return typeof value === 'string' || (typeof value === 'object' && value !== null);\n}\n\n/**\n * Composable that manages vue-router integration for the RuiTabs component.\n * Provides route resolution and path matching utilities, and watches for\n * route changes to notify the parent component.\n */\nexport function useTabRouting({ onRouteChange }: UseTabRoutingOptions): UseTabRoutingReturn {\n const hasRouter = getCurrentInstance()?.appContext.config.globalProperties.$router !== undefined;\n\n if (!hasRouter) {\n return {\n hasRouter,\n resolveRoute: () => undefined,\n isPathMatch: () => false,\n };\n }\n\n const route = useRoute();\n const router = useRouter();\n\n function resolveRoute(to: unknown): string | undefined {\n if (!isRouteLocation(to))\n return undefined;\n\n return router.resolve(to).fullPath;\n }\n\n function isPathMatch(\n path: string,\n {
|
|
1
|
+
{"version":3,"file":"use-tab-routing.js","names":[],"sources":["../../../../src/components/tabs/tabs/use-tab-routing.ts"],"sourcesContent":["import type { RouteMatchOptions } from '@/components/tabs/tab-props';\nimport { type RouteLocationRaw, useRoute, useRouter } from 'vue-router';\n\ninterface UseTabRoutingOptions {\n /** Callback invoked when the route changes, to re-sync the active tab */\n onRouteChange: () => void;\n}\n\ninterface UseTabRoutingReturn {\n /** Whether vue-router is available in the app context */\n hasRouter: boolean;\n /**\n * Resolves a route location and returns its full path, or undefined\n * if the router is not available or the value is not a valid route location.\n */\n resolveRoute: (to: unknown) => string | undefined;\n /**\n * Checks whether a given path matches the current route.\n * Supports exact path, exact route, and prefix matching.\n */\n isPathMatch: (path: string, options: RouteMatchOptions) => boolean;\n}\n\nexport function isRouteLocation(value: unknown): value is RouteLocationRaw {\n return typeof value === 'string' || (typeof value === 'object' && value !== null);\n}\n\n/**\n * Composable that manages vue-router integration for the RuiTabs component.\n * Provides route resolution and path matching utilities, and watches for\n * route changes to notify the parent component.\n */\nexport function useTabRouting({ onRouteChange }: UseTabRoutingOptions): UseTabRoutingReturn {\n const hasRouter = getCurrentInstance()?.appContext.config.globalProperties.$router !== undefined;\n\n if (!hasRouter) {\n return {\n hasRouter,\n resolveRoute: () => undefined,\n isPathMatch: () => false,\n };\n }\n\n const route = useRoute();\n const router = useRouter();\n\n function resolveRoute(to: unknown): string | undefined {\n if (!isRouteLocation(to))\n return undefined;\n\n return router.resolve(to).fullPath;\n }\n\n function isPathMatch(\n path: string,\n { exact }: RouteMatchOptions,\n ): boolean {\n const currentRoute = route.fullPath;\n const base = typeof window !== 'undefined' ? window.location.origin : 'http://localhost';\n const routeWithoutQueryParams = new URL(path, base).pathname;\n\n if (exact)\n return currentRoute === routeWithoutQueryParams;\n\n return currentRoute.startsWith(routeWithoutQueryParams);\n }\n\n watch(route, onRouteChange);\n\n return {\n hasRouter,\n resolveRoute,\n isPathMatch,\n };\n}\n"],"mappings":";;;AAuBA,SAAgB,gBAAgB,OAA2C;CACzE,OAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,UAAU;AAC9E;;;;;;AAOA,SAAgB,cAAc,EAAE,iBAA4D;CAC1F,MAAM,YAAY,mBAAmB,CAAC,EAAE,WAAW,OAAO,iBAAiB,YAAY,KAAA;CAEvF,IAAI,CAAC,WACH,OAAO;EACL;EACA,oBAAoB,KAAA;EACpB,mBAAmB;CACrB;CAGF,MAAM,QAAQ,SAAS;CACvB,MAAM,SAAS,UAAU;CAEzB,SAAS,aAAa,IAAiC;EACrD,IAAI,CAAC,gBAAgB,EAAE,GACrB,OAAO,KAAA;EAET,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC;CAC5B;CAEA,SAAS,YACP,MACA,EAAE,SACO;EACT,MAAM,eAAe,MAAM;EAC3B,MAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;EACtE,MAAM,0BAA0B,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC;EAEpD,IAAI,OACF,OAAO,iBAAiB;EAE1B,OAAO,aAAa,WAAW,uBAAuB;CACxD;CAEA,MAAM,OAAO,aAAa;CAE1B,OAAO;EACL;EACA;EACA;CACF;AACF"}
|