@rotki/ui-library 2.12.2 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +6 -14
- package/dist/components/accordions/accordion/RuiAccordion.vue.js +3 -4
- package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +10 -9
- package/dist/components/accordions/accordions/RuiAccordions.vue.js +27 -26
- package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue.d.ts +5 -15
- package/dist/components/alerts/RuiAlert.vue2.js +8 -16
- package/dist/components/alerts/RuiAlert.vue2.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +5 -7
- package/dist/components/buttons/button/RuiButton.vue2.js +19 -20
- package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +42 -41
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue.d.ts +1 -6
- package/dist/components/calendar/RuiCalendar.vue.js +6 -7
- package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue2.js +19 -17
- package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue2.js +2 -3
- package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue2.js +47 -39
- package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
- package/dist/components/cards/RuiCard.vue.d.ts +9 -24
- package/dist/components/cards/RuiCard.vue2.js +7 -7
- package/dist/components/cards/RuiCard.vue2.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.vue.d.ts +5 -10
- package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -1
- package/dist/components/chips/RuiChip.vue.d.ts +7 -21
- package/dist/components/chips/RuiChip.vue2.js +16 -21
- package/dist/components/chips/RuiChip.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue2.js +14 -18
- package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue.js +3 -5
- package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue2.js +10 -13
- package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue.js +8 -6
- package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue.d.ts +7 -9
- package/dist/components/color-picker/RuiColorPicker.vue.js +18 -13
- package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -1
- package/dist/components/color-picker/utils.js +22 -5
- package/dist/components/color-picker/utils.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +2 -44
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +73 -77
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
- package/dist/components/date-time-picker/dayjs-setup.d.ts +1 -0
- package/dist/components/date-time-picker/dayjs-setup.js +8 -0
- package/dist/components/date-time-picker/dayjs-setup.js.map +1 -0
- package/dist/components/date-time-picker/segment-config.d.ts +14 -0
- package/dist/components/date-time-picker/segment-config.js +23 -0
- package/dist/components/date-time-picker/segment-config.js.map +1 -0
- package/dist/components/date-time-picker/segment-utils.d.ts +5 -0
- package/dist/components/date-time-picker/segment-utils.js +36 -0
- package/dist/components/date-time-picker/segment-utils.js.map +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.d.ts +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.js +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.d.ts +4 -8
- package/dist/components/date-time-picker/use-keyboard-handler.js +9 -54
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
- package/dist/components/date-time-picker/utils.d.ts +1 -0
- package/dist/components/date-time-picker/utils.js +1 -0
- package/dist/components/date-time-picker/utils.js.map +1 -1
- package/dist/components/divider/RuiDivider.vue.d.ts +1 -3
- package/dist/components/divider/RuiDivider.vue.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +9 -1120
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +144 -160
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +15 -24
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +31 -31
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +18 -21
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +3 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +12 -15
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +5 -11
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +6 -7
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +9 -784
- package/dist/components/forms/select/RuiMenuSelect.vue2.js +48 -51
- package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +10 -11
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js +15 -24
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue.d.ts +10 -26
- package/dist/components/forms/slider/RuiSlider.vue2.js +41 -46
- package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue.d.ts +12 -20
- package/dist/components/forms/switch/RuiSwitch.vue2.js +21 -20
- package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +5 -30
- package/dist/components/forms/text-area/RuiTextArea.vue2.js +43 -79
- package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +7 -27
- package/dist/components/forms/text-field/RuiTextField.vue2.js +35 -66
- package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +1 -5
- package/dist/components/helpers/RuiFormTextDetail.vue.js +5 -9
- package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -1
- package/dist/components/icons/LazyIcon.vue.d.ts +1 -3
- package/dist/components/icons/RuiIcon.vue.d.ts +1 -4
- package/dist/components/icons/RuiIcon.vue2.js +8 -8
- package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
- package/dist/components/index.d.ts +3 -3
- package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
- package/dist/components/loaders/RuiSkeletonBase.vue2.js +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -4
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -1
- package/dist/components/logos/RuiLogo.vue.d.ts +1 -7
- package/dist/components/logos/RuiLogo.vue.js +11 -13
- package/dist/components/logos/RuiLogo.vue.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -20
- package/dist/components/overlays/badge/RuiBadge.vue2.js +11 -13
- package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +10 -5
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +18 -7
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +21 -27
- package/dist/components/overlays/dialog/RuiDialog.vue2.js +80 -63
- package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +24 -35
- package/dist/components/overlays/menu/RuiMenu.vue2.js +67 -76
- package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +22 -30
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +71 -47
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue.d.ts +12 -12
- package/dist/components/overlays/notification/RuiNotification.vue.js +25 -22
- package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +7 -18
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +11 -8
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue.d.ts +8 -10
- package/dist/components/progress/RuiProgress.vue2.js +18 -24
- package/dist/components/progress/RuiProgress.vue2.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue.d.ts +10 -11
- package/dist/components/steppers/RuiFooterStepper.vue2.js +21 -21
- package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepper.vue.d.ts +6 -15
- package/dist/components/steppers/RuiStepper.vue2.js +31 -33
- package/dist/components/steppers/RuiStepper.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -3
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -3
- package/dist/components/steppers/RuiStepperIcon.vue2.js +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +29 -81
- package/dist/components/tables/RuiDataTable.vue2.js +173 -582
- package/dist/components/tables/RuiDataTable.vue2.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue3.js +24 -27
- package/dist/components/tables/RuiDataTable.vue3.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -6
- package/dist/components/tables/RuiExpandButton.vue2.js +1 -0
- package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue.d.ts +4 -7
- package/dist/components/tables/RuiTableHead.vue2.js +19 -19
- package/dist/components/tables/RuiTableHead.vue2.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.vue.d.ts +10 -10
- package/dist/components/tables/RuiTablePagination.vue2.js +17 -16
- package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +3 -18
- package/dist/components/tabs/tab/RuiTab.vue2.js +80 -51
- package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -11
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +1 -4
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +18 -18
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +10 -14
- package/dist/components/tabs/tabs/RuiTabs.vue2.js +101 -94
- package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -4
- package/dist/components/time-picker/RuiTimePicker.vue2.js +68 -35
- package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
- package/dist/composables/breakpoint.js +8 -13
- package/dist/composables/breakpoint.js.map +1 -1
- package/dist/composables/dropdown-menu.d.ts +7 -4
- package/dist/composables/dropdown-menu.js +73 -50
- package/dist/composables/dropdown-menu.js.map +1 -1
- package/dist/composables/forms/auto-complete/focus.d.ts +7 -5
- package/dist/composables/forms/auto-complete/focus.js +28 -17
- package/dist/composables/forms/auto-complete/focus.js.map +1 -1
- package/dist/composables/forms/auto-complete/index.d.ts +0 -9
- package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -3
- package/dist/composables/forms/auto-complete/keyboard-navigation.js +11 -5
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.d.ts +7 -0
- package/dist/composables/forms/auto-complete/search.js +10 -8
- package/dist/composables/forms/auto-complete/search.js.map +1 -1
- package/dist/composables/forms/auto-complete/value.d.ts +4 -0
- package/dist/composables/forms/auto-complete/value.js +24 -42
- package/dist/composables/forms/auto-complete/value.js.map +1 -1
- package/dist/composables/forms/use-label-with-quote.d.ts +2 -0
- package/dist/composables/forms/use-label-with-quote.js +14 -0
- package/dist/composables/forms/use-label-with-quote.js.map +1 -0
- package/dist/composables/forms/use-prepend-append-width.d.ts +6 -0
- package/dist/composables/forms/use-prepend-append-width.js +25 -0
- package/dist/composables/forms/use-prepend-append-width.js.map +1 -0
- package/dist/composables/popper.js +60 -46
- package/dist/composables/popper.js.map +1 -1
- package/dist/composables/sticky-header.d.ts +7 -5
- package/dist/composables/sticky-header.js +51 -41
- package/dist/composables/sticky-header.js.map +1 -1
- package/dist/composables/tables/data-table/columns.d.ts +25 -0
- package/dist/composables/tables/data-table/columns.js +54 -0
- package/dist/composables/tables/data-table/columns.js.map +1 -0
- package/dist/composables/tables/data-table/expansion.d.ts +17 -0
- package/dist/composables/tables/data-table/expansion.js +38 -0
- package/dist/composables/tables/data-table/expansion.js.map +1 -0
- package/dist/composables/tables/data-table/grouping.d.ts +29 -0
- package/dist/composables/tables/data-table/grouping.js +136 -0
- package/dist/composables/tables/data-table/grouping.js.map +1 -0
- package/dist/composables/tables/data-table/pagination.d.ts +33 -0
- package/dist/composables/tables/data-table/pagination.js +119 -0
- package/dist/composables/tables/data-table/pagination.js.map +1 -0
- package/dist/composables/tables/data-table/selection.d.ts +29 -0
- package/dist/composables/tables/data-table/selection.js +164 -0
- package/dist/composables/tables/data-table/selection.js.map +1 -0
- package/dist/composables/tables/data-table/sort.d.ts +32 -0
- package/dist/composables/tables/data-table/sort.js +136 -0
- package/dist/composables/tables/data-table/sort.js.map +1 -0
- package/dist/composables/tables/data-table/types.d.ts +14 -0
- package/dist/composables/tables/data-table/types.js +11 -0
- package/dist/composables/tables/data-table/types.js.map +1 -0
- package/dist/composables/theme.js +1 -20
- package/dist/composables/theme.js.map +1 -1
- package/dist/composables/timeout-manager.d.ts +4 -2
- package/dist/composables/timeout-manager.js +2 -1
- package/dist/composables/timeout-manager.js.map +1 -1
- package/dist/icons/icons_1.js +28 -28
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +8 -8
- package/dist/icons/icons_2.js +52 -52
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +18 -18
- package/dist/icons/icons_3.js +108 -108
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +35 -0
- package/dist/icons/icons_4.js +176 -1
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +1 -1
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +43 -15
- package/dist/index.js.map +1 -1
- package/dist/style.css +189 -162
- package/dist/theme/index.js +15 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/utils/assert.d.ts +1 -1
- package/dist/utils/assert.js.map +1 -1
- package/dist/utils/form-text-detail.d.ts +9 -8
- package/dist/utils/form-text-detail.js +1 -2
- package/dist/utils/form-text-detail.js.map +1 -1
- package/dist/utils/helpers.d.ts +4 -32
- package/dist/utils/helpers.js +8 -9
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/is-equal.d.ts +1 -1
- package/dist/utils/is-equal.js +5 -3
- package/dist/utils/is-equal.js.map +1 -1
- package/dist/web-types.json +359 -359
- package/package.json +44 -35
- package/dist/utils/generate-id.d.ts +0 -5
- package/dist/utils/generate-id.js +0 -21
- package/dist/utils/generate-id.js.map +0 -1
|
@@ -1,51 +1,54 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, useModel, ref, useTemplateRef, useSlots, getCurrentInstance, toRefs, computed, Fragment, isVNode, nextTick, watch, onMounted, openBlock, createElementBlock, normalizeClass, unref, createVNode, withCtx, createCommentVNode, createElementVNode, renderList, createBlock, resolveDynamicComponent, mergeModels } from "vue";
|
|
2
2
|
import { get, set, throttleFilter } from "@vueuse/shared";
|
|
3
3
|
import { useRoute, useRouter } from "vue-router";
|
|
4
4
|
import RuiButton from "../../buttons/button/RuiButton.vue.js";
|
|
5
5
|
import RuiIcon from "../../icons/RuiIcon.vue.js";
|
|
6
|
-
import { useElementSize, useScroll, watchTriggerable, watchImmediate
|
|
6
|
+
import { useElementSize, useScroll, useResizeObserver, watchTriggerable, watchImmediate } from "@vueuse/core";
|
|
7
7
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
8
8
|
...{
|
|
9
9
|
name: "RuiTabs"
|
|
10
10
|
},
|
|
11
11
|
__name: "RuiTabs",
|
|
12
|
-
props: {
|
|
13
|
-
color: {
|
|
12
|
+
props: /* @__PURE__ */ mergeModels({
|
|
13
|
+
color: {},
|
|
14
14
|
vertical: { type: Boolean, default: false },
|
|
15
15
|
disabled: { type: Boolean, default: false },
|
|
16
16
|
grow: { type: Boolean, default: false },
|
|
17
|
-
modelValue: { default: void 0 },
|
|
18
17
|
align: { default: "center" },
|
|
19
18
|
indicatorPosition: { default: "end" }
|
|
20
|
-
},
|
|
19
|
+
}, {
|
|
20
|
+
"modelValue": {},
|
|
21
|
+
"modelModifiers": {}
|
|
22
|
+
}),
|
|
21
23
|
emits: ["update:modelValue"],
|
|
22
|
-
setup(__props
|
|
23
|
-
const
|
|
24
|
-
const emit = __emit;
|
|
25
|
-
const { color, grow, modelValue, disabled, vertical, align, indicatorPosition } = toRefs(props);
|
|
24
|
+
setup(__props) {
|
|
25
|
+
const modelValue = useModel(__props, "modelValue");
|
|
26
26
|
const internalModelValue = ref();
|
|
27
|
-
const bar =
|
|
28
|
-
const wrapper =
|
|
27
|
+
const bar = useTemplateRef("bar");
|
|
28
|
+
const wrapper = useTemplateRef("wrapper");
|
|
29
29
|
const showArrows = ref(false);
|
|
30
|
-
function getChildrenTabs(children2) {
|
|
31
|
-
return children2.flatMap((item) => {
|
|
32
|
-
if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)
|
|
33
|
-
return getChildrenTabs(item.children.filter(isVNode));
|
|
34
|
-
return [item];
|
|
35
|
-
}).flat();
|
|
36
|
-
}
|
|
37
30
|
const slots = useSlots();
|
|
31
|
+
const hasRouter = !!getCurrentInstance()?.appContext.config.globalProperties.$router;
|
|
32
|
+
const route = hasRouter ? useRoute() : void 0;
|
|
33
|
+
const router = hasRouter ? useRouter() : void 0;
|
|
34
|
+
const { width, height } = useElementSize(bar);
|
|
35
|
+
const { width: wrapperWidth, height: wrapperHeight } = useElementSize(wrapper);
|
|
36
|
+
const { arrivedState, x, y } = useScroll(bar, { behavior: "smooth" });
|
|
37
|
+
const { top, bottom, left, right } = toRefs(arrivedState);
|
|
38
|
+
useResizeObserver(bar, () => {
|
|
39
|
+
keepActiveTabVisible();
|
|
40
|
+
});
|
|
38
41
|
const children = computed(() => {
|
|
39
42
|
const slotContent = slots.default?.() ?? [];
|
|
40
43
|
const tabs = getChildrenTabs(slotContent);
|
|
41
44
|
const currentModelValue = get(internalModelValue);
|
|
42
45
|
const inheritedProps = {
|
|
43
|
-
color:
|
|
44
|
-
grow:
|
|
45
|
-
disabled:
|
|
46
|
-
vertical:
|
|
47
|
-
align:
|
|
48
|
-
indicatorPosition:
|
|
46
|
+
color: __props.color,
|
|
47
|
+
grow: __props.grow,
|
|
48
|
+
disabled: __props.disabled,
|
|
49
|
+
vertical: __props.vertical,
|
|
50
|
+
align: __props.align,
|
|
51
|
+
indicatorPosition: __props.indicatorPosition
|
|
49
52
|
};
|
|
50
53
|
return tabs.map((tab, index) => {
|
|
51
54
|
let tabValue = tab.props?.value ?? index;
|
|
@@ -63,12 +66,30 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
63
66
|
};
|
|
64
67
|
});
|
|
65
68
|
});
|
|
69
|
+
const prevArrowDisabled = computed(() => {
|
|
70
|
+
if (!__props.vertical)
|
|
71
|
+
return get(left);
|
|
72
|
+
return get(top);
|
|
73
|
+
});
|
|
74
|
+
const nextArrowDisabled = computed(() => {
|
|
75
|
+
if (!__props.vertical)
|
|
76
|
+
return get(right);
|
|
77
|
+
return get(bottom);
|
|
78
|
+
});
|
|
79
|
+
function getChildrenTabs(children2) {
|
|
80
|
+
return children2.flatMap((item) => {
|
|
81
|
+
if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)
|
|
82
|
+
return getChildrenTabs(item.children.filter(isVNode));
|
|
83
|
+
return [item];
|
|
84
|
+
}).flat();
|
|
85
|
+
}
|
|
66
86
|
function updateModelValue(newModelValue) {
|
|
67
|
-
|
|
87
|
+
set(modelValue, newModelValue);
|
|
68
88
|
set(internalModelValue, newModelValue);
|
|
69
89
|
}
|
|
70
|
-
const route = useRoute();
|
|
71
90
|
function isPathMatch(path, { exactPath, exact }) {
|
|
91
|
+
if (!route)
|
|
92
|
+
return false;
|
|
72
93
|
const currentRoute = route.fullPath;
|
|
73
94
|
if (exactPath)
|
|
74
95
|
return currentRoute === path;
|
|
@@ -111,37 +132,32 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
111
132
|
}
|
|
112
133
|
});
|
|
113
134
|
}
|
|
114
|
-
const router = useRouter();
|
|
115
135
|
function applyNewValue(onlyLink = false) {
|
|
116
|
-
const enabledChildren = get(children).filter(
|
|
117
|
-
(child) => !child.props.disabled
|
|
118
|
-
);
|
|
136
|
+
const enabledChildren = get(children).filter((child) => !child.props?.disabled);
|
|
119
137
|
if (enabledChildren.length > 0) {
|
|
120
138
|
let newModelValue = get(modelValue) || 0;
|
|
121
139
|
enabledChildren.forEach((child, index) => {
|
|
122
|
-
const
|
|
123
|
-
if (!onlyLink && index === 0 &&
|
|
124
|
-
newModelValue =
|
|
125
|
-
const to =
|
|
126
|
-
if (
|
|
140
|
+
const props = child.props;
|
|
141
|
+
if (!onlyLink && index === 0 && props.value)
|
|
142
|
+
newModelValue = props.value;
|
|
143
|
+
const to = props.to && router ? router.resolve(props.to) : void 0;
|
|
144
|
+
if (props.link !== false && to && isPathMatch(to.fullPath, props))
|
|
127
145
|
newModelValue = to.fullPath;
|
|
128
146
|
});
|
|
129
147
|
updateModelValue(newModelValue);
|
|
130
148
|
}
|
|
131
149
|
keepActiveTabVisible();
|
|
132
150
|
}
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const { arrivedState, x, y } = useScroll(bar, { behavior: "smooth" });
|
|
144
|
-
const { top, bottom, left, right } = toRefs(arrivedState);
|
|
151
|
+
function onPrevSliderClick() {
|
|
152
|
+
if (!__props.vertical)
|
|
153
|
+
set(x, get(x) - get(width));
|
|
154
|
+
else set(y, get(y) - get(height));
|
|
155
|
+
}
|
|
156
|
+
function onNextSliderClick() {
|
|
157
|
+
if (!__props.vertical)
|
|
158
|
+
set(x, get(x) + get(width));
|
|
159
|
+
else set(y, get(y) + get(height));
|
|
160
|
+
}
|
|
145
161
|
const { trigger: triggerHorizontal, stop: stopHorizontal } = watchTriggerable(
|
|
146
162
|
[wrapperWidth, width],
|
|
147
163
|
([ww, w]) => {
|
|
@@ -162,64 +178,55 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
162
178
|
eventFilter: throttleFilter(500)
|
|
163
179
|
}
|
|
164
180
|
);
|
|
165
|
-
watchImmediate(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
181
|
+
watchImmediate(
|
|
182
|
+
() => __props.vertical,
|
|
183
|
+
(vertical) => {
|
|
184
|
+
if (vertical) {
|
|
185
|
+
triggerVertical();
|
|
186
|
+
stopHorizontal();
|
|
187
|
+
} else {
|
|
188
|
+
triggerHorizontal();
|
|
189
|
+
stopVertical();
|
|
190
|
+
}
|
|
172
191
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
});
|
|
179
|
-
const nextArrowDisabled = computed(() => {
|
|
180
|
-
if (!get(vertical))
|
|
181
|
-
return get(right);
|
|
182
|
-
return get(bottom);
|
|
183
|
-
});
|
|
184
|
-
function onPrevSliderClick() {
|
|
185
|
-
if (!get(vertical))
|
|
186
|
-
set(x, get(x) - get(width));
|
|
187
|
-
else
|
|
188
|
-
set(y, get(y) - get(height));
|
|
189
|
-
}
|
|
190
|
-
function onNextSliderClick() {
|
|
191
|
-
if (!get(vertical))
|
|
192
|
-
set(x, get(x) + get(width));
|
|
193
|
-
else
|
|
194
|
-
set(y, get(y) + get(height));
|
|
192
|
+
);
|
|
193
|
+
if (route) {
|
|
194
|
+
watch(route, () => {
|
|
195
|
+
applyNewValue(true);
|
|
196
|
+
});
|
|
195
197
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
198
|
+
watchImmediate(
|
|
199
|
+
() => get(modelValue),
|
|
200
|
+
(modelValue2) => {
|
|
201
|
+
set(internalModelValue, modelValue2);
|
|
202
|
+
}
|
|
203
|
+
);
|
|
202
204
|
watch(internalModelValue, () => {
|
|
203
205
|
keepActiveTabVisible();
|
|
204
206
|
});
|
|
207
|
+
onMounted(() => {
|
|
208
|
+
if (get(modelValue) !== void 0)
|
|
209
|
+
return;
|
|
210
|
+
applyNewValue();
|
|
211
|
+
});
|
|
205
212
|
return (_ctx, _cache) => {
|
|
206
213
|
return openBlock(), createElementBlock("div", {
|
|
207
|
-
class: normalizeClass([_ctx.$style.tabs, { [_ctx.$style["tabs--vertical"] ?? ""]:
|
|
214
|
+
class: normalizeClass([_ctx.$style.tabs, { [_ctx.$style["tabs--vertical"] ?? ""]: __props.vertical }])
|
|
208
215
|
}, [
|
|
209
216
|
unref(showArrows) ? (openBlock(), createElementBlock("div", {
|
|
210
217
|
key: 0,
|
|
211
|
-
class: normalizeClass([_ctx.$style.arrow, { [_ctx.$style["arrow--vertical"] ?? ""]:
|
|
218
|
+
class: normalizeClass([_ctx.$style.arrow, { [_ctx.$style["arrow--vertical"] ?? ""]: __props.vertical }])
|
|
212
219
|
}, [
|
|
213
220
|
createVNode(RuiButton, {
|
|
214
221
|
class: "w-full h-full !rounded-none",
|
|
215
222
|
variant: "text",
|
|
216
|
-
color:
|
|
223
|
+
color: __props.color,
|
|
217
224
|
disabled: unref(prevArrowDisabled),
|
|
218
225
|
onClick: _cache[0] || (_cache[0] = ($event) => onPrevSliderClick())
|
|
219
226
|
}, {
|
|
220
227
|
default: withCtx(() => [
|
|
221
228
|
createVNode(RuiIcon, {
|
|
222
|
-
name:
|
|
229
|
+
name: __props.vertical ? "lu-chevron-up" : "lu-chevron-left"
|
|
223
230
|
}, null, 8, ["name"])
|
|
224
231
|
]),
|
|
225
232
|
_: 1
|
|
@@ -230,8 +237,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
230
237
|
ref: bar,
|
|
231
238
|
class: normalizeClass(["no-scrollbar", [
|
|
232
239
|
_ctx.$style["tabs-bar"],
|
|
233
|
-
{ [_ctx.$style["tabs-bar--vertical"] ?? ""]:
|
|
234
|
-
{ [_ctx.$style["tabs-bar--grow"] ?? ""]:
|
|
240
|
+
{ [_ctx.$style["tabs-bar--vertical"] ?? ""]: __props.vertical },
|
|
241
|
+
{ [_ctx.$style["tabs-bar--grow"] ?? ""]: __props.grow }
|
|
235
242
|
]])
|
|
236
243
|
}, [
|
|
237
244
|
createElementVNode("div", {
|
|
@@ -240,8 +247,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
240
247
|
role: "tablist",
|
|
241
248
|
class: normalizeClass([
|
|
242
249
|
_ctx.$style["tabs-wrapper"],
|
|
243
|
-
{ [_ctx.$style["tabs-wrapper--vertical"] ?? ""]:
|
|
244
|
-
{ [_ctx.$style["tabs-wrapper--grow"] ?? ""]:
|
|
250
|
+
{ [_ctx.$style["tabs-wrapper--vertical"] ?? ""]: __props.vertical },
|
|
251
|
+
{ [_ctx.$style["tabs-wrapper--grow"] ?? ""]: __props.grow }
|
|
245
252
|
])
|
|
246
253
|
}, [
|
|
247
254
|
(openBlock(true), createElementBlock(Fragment, null, renderList(unref(children), (child, i) => {
|
|
@@ -254,18 +261,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
254
261
|
], 2),
|
|
255
262
|
unref(showArrows) ? (openBlock(), createElementBlock("div", {
|
|
256
263
|
key: 1,
|
|
257
|
-
class: normalizeClass([_ctx.$style.arrow, { [_ctx.$style["arrow--vertical"] ?? ""]:
|
|
264
|
+
class: normalizeClass([_ctx.$style.arrow, { [_ctx.$style["arrow--vertical"] ?? ""]: __props.vertical }])
|
|
258
265
|
}, [
|
|
259
266
|
createVNode(RuiButton, {
|
|
260
267
|
class: "w-full h-full !rounded-none",
|
|
261
268
|
variant: "text",
|
|
262
|
-
color:
|
|
269
|
+
color: __props.color,
|
|
263
270
|
disabled: unref(nextArrowDisabled),
|
|
264
271
|
onClick: _cache[2] || (_cache[2] = ($event) => onNextSliderClick())
|
|
265
272
|
}, {
|
|
266
273
|
default: withCtx(() => [
|
|
267
274
|
createVNode(RuiIcon, {
|
|
268
|
-
name:
|
|
275
|
+
name: __props.vertical ? "lu-chevron-down" : "lu-chevron-right"
|
|
269
276
|
}, null, 8, ["name"])
|
|
270
277
|
]),
|
|
271
278
|
_: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTabs.vue2.js","sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { Props as TabProps } from '@/components/tabs/tab/RuiTab.vue';\nimport type { ContextColorsType } from '@/consts/colors';\nimport { throttleFilter } from '@vueuse/shared';\nimport { Fragment, isVNode, type VNode } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n modelValue?: number | string;\n align?: 'start' | 'center' | 'end';\n indicatorPosition?: 'start' | 'end';\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n color: undefined,\n vertical: false,\n disabled: false,\n grow: false,\n modelValue: undefined,\n align: 'center',\n indicatorPosition: 'end',\n});\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', modelValue: number | string): void;\n}>();\n\nconst { color, grow, modelValue, disabled, vertical, align, indicatorPosition } = toRefs(props);\n\nconst internalModelValue = ref();\nconst bar = ref<HTMLDivElement>();\nconst wrapper = ref<HTMLDivElement>();\nconst showArrows: Ref<boolean> = ref(false);\n\n// When using dynamic content with v-for the slot content can contain fragment,\n// Go through the fragment and always return RuiTab only\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\nconst slots = useSlots();\nconst children = computed(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n const currentModelValue = get(internalModelValue);\n const inheritedProps = {\n color: get(color),\n grow: get(grow),\n disabled: get(disabled),\n vertical: get(vertical),\n align: get(align),\n indicatorPosition: get(indicatorPosition),\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\nfunction updateModelValue(newModelValue: string | number) {\n emit('update:modelValue', newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nconst route = useRoute();\n\nfunction isPathMatch(path: string, { exactPath, exact }: { exactPath?: boolean; exact?: boolean }) {\n const currentRoute = route.fullPath;\n\n if (exactPath)\n return currentRoute === path;\n\n const routeWithoutQueryParams = new URL(path, window.location.origin)\n .pathname;\n\n if (exact)\n return currentRoute === routeWithoutQueryParams;\n\n return currentRoute.startsWith(routeWithoutQueryParams);\n}\n\nfunction keepActiveTabVisible() {\n nextTick(() => {\n if (!get(showArrows))\n return;\n\n const elem = get(wrapper);\n const barElem = get(bar);\n if (elem) {\n const activeTab = (elem.querySelector('.active-tab')\n ?? elem.querySelector('.active-tab-link')) as HTMLElement;\n\n if (!activeTab || !barElem)\n return;\n\n const childLeft = activeTab.offsetLeft - elem.offsetLeft;\n const childTop = activeTab.offsetTop - elem.offsetTop;\n const childWidth = activeTab.offsetWidth;\n const childHeight = activeTab.offsetHeight;\n const parentScrollLeft = barElem.scrollLeft;\n const parentScrollTop = barElem.scrollTop;\n const parentWidth = barElem.offsetWidth;\n const parentHeight = barElem.offsetHeight;\n\n const scrollLeft = Math.max(\n Math.min(parentScrollLeft, childLeft),\n childLeft + childWidth - parentWidth,\n );\n\n const scrollTop = Math.max(\n Math.min(parentScrollTop, childTop),\n childTop + childHeight - parentHeight,\n );\n\n barElem.scrollTo({\n left: scrollLeft,\n top: scrollTop,\n behavior: 'smooth',\n });\n }\n });\n}\n\nconst router = useRouter();\n\nfunction applyNewValue(onlyLink = false) {\n const enabledChildren = get(children).filter(\n child => !child.props.disabled,\n );\n if (enabledChildren.length > 0) {\n let newModelValue: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const props = child.props as TabProps;\n if (!onlyLink && index === 0 && props.value)\n newModelValue = props.value;\n\n const to = props.to ? router.resolve(props.to) : undefined;\n\n if (props.link !== false && to && isPathMatch(to.fullPath, props))\n newModelValue = to.fullPath;\n });\n updateModelValue(newModelValue);\n }\n keepActiveTabVisible();\n}\n\nonMounted(() => {\n if (get(modelValue) !== undefined)\n return;\n\n applyNewValue();\n});\n\nwatch(route, () => {\n applyNewValue(true);\n});\n\nconst { width, height } = useElementSize(bar);\nconst { width: wrapperWidth, height: wrapperHeight } = useElementSize(wrapper);\nconst { arrivedState, x, y } = useScroll(bar, { behavior: 'smooth' });\n\nconst { top, bottom, left, right } = toRefs(arrivedState);\n\nconst { trigger: triggerHorizontal, stop: stopHorizontal } = watchTriggerable(\n [wrapperWidth, width],\n ([ww, w]) => {\n if (w > 0)\n set(showArrows, ww > w);\n },\n {\n eventFilter: throttleFilter(50),\n },\n);\n\nconst { trigger: triggerVertical, stop: stopVertical } = watchTriggerable(\n [wrapperHeight, height],\n ([wh, h]) => {\n if (h > 0)\n set(showArrows, wh > h);\n },\n {\n eventFilter: throttleFilter(500),\n },\n);\n\nwatchImmediate(vertical, (vertical) => {\n if (vertical) {\n triggerVertical();\n stopHorizontal();\n }\n else {\n triggerHorizontal();\n stopVertical();\n }\n});\n\nconst prevArrowDisabled = computed(() => {\n if (!get(vertical))\n return get(left);\n\n return get(top);\n});\n\nconst nextArrowDisabled = computed(() => {\n if (!get(vertical))\n return get(right);\n\n return get(bottom);\n});\n\nfunction onPrevSliderClick() {\n if (!get(vertical))\n set(x, get(x) - get(width));\n else\n set(y, get(y) - get(height));\n}\n\nfunction onNextSliderClick() {\n if (!get(vertical))\n set(x, get(x) + get(width));\n else\n set(y, get(y) + get(height));\n}\n\nuseResizeObserver(bar, () => {\n keepActiveTabVisible();\n});\n\nwatchImmediate(modelValue, (modelValue) => {\n set(internalModelValue, modelValue);\n});\n\nwatch(internalModelValue, () => {\n keepActiveTabVisible();\n});\n</script>\n\n<template>\n <div :class=\"[$style.tabs, { [$style['tabs--vertical'] ?? '']: vertical }]\">\n <div\n v-if=\"showArrows\"\n :class=\"[$style.arrow, { [$style['arrow--vertical'] ?? '']: vertical }]\"\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=\"no-scrollbar\"\n :class=\"[\n $style['tabs-bar'],\n { [$style['tabs-bar--vertical'] ?? '']: vertical },\n { [$style['tabs-bar--grow'] ?? '']: grow },\n ]\"\n >\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n :class=\"[\n $style['tabs-wrapper'],\n { [$style['tabs-wrapper--vertical'] ?? '']: vertical },\n { [$style['tabs-wrapper--grow'] ?? '']: grow },\n ]\"\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=\"[$style.arrow, { [$style['arrow--vertical'] ?? '']: vertical }]\"\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\n<style lang=\"scss\" module>\n.tabs {\n @apply flex h-[2.625rem];\n\n &--vertical {\n @apply h-auto max-h-full flex-col;\n }\n\n &-bar {\n @apply max-h-full overflow-auto;\n\n &--vertical,\n &--grow {\n @apply w-full;\n }\n }\n\n &-wrapper {\n @apply h-full inline-flex max-w-none;\n\n &--vertical {\n @apply flex-col h-auto;\n }\n\n &--vertical,\n &--grow {\n @apply min-w-full;\n }\n }\n}\n\n.arrow {\n @apply h-full w-10;\n\n &--vertical {\n @apply min-h-[2.625rem] w-full h-auto;\n }\n}\n</style>\n"],"names":["children","props","vertical","modelValue","_createElementBlock","$style","_unref","_createVNode","_createElementVNode","_normalizeClass","_openBlock","_Fragment","_renderList","_createBlock","_resolveDynamicComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuiTabs.vue2.js","sources":["../../../../src/components/tabs/tabs/RuiTabs.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { Props as TabProps } from '@/components/tabs/tab/RuiTab.vue';\nimport type { ContextColorsType } from '@/consts/colors';\nimport { throttleFilter } from '@vueuse/shared';\nimport { Fragment, getCurrentInstance, isVNode, type VNode } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\n\nexport interface Props {\n color?: ContextColorsType;\n vertical?: boolean;\n disabled?: boolean;\n grow?: boolean;\n align?: 'start' | 'center' | 'end';\n indicatorPosition?: 'start' | 'end';\n}\n\ndefineOptions({\n name: 'RuiTabs',\n});\n\nconst modelValue = defineModel<number | string>();\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');\nconst showArrows: Ref<boolean> = ref(false);\n\nconst slots = useSlots();\nconst hasRouter = !!getCurrentInstance()?.appContext.config.globalProperties.$router;\nconst route = hasRouter ? useRoute() : undefined;\nconst router = hasRouter ? useRouter() : undefined;\nconst { width, height } = useElementSize(bar);\nconst { width: wrapperWidth, height: wrapperHeight } = useElementSize(wrapper);\nconst { arrivedState, x, y } = useScroll(bar, { behavior: 'smooth' });\nconst { top, bottom, left, right } = toRefs(arrivedState);\n\nuseResizeObserver(bar, () => {\n keepActiveTabVisible();\n});\n\nconst children = computed<(VNode & { props: Record<string, any> })[]>(() => {\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 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\nconst prevArrowDisabled = computed<boolean>(() => {\n if (!vertical)\n return get(left);\n\n return get(top);\n});\n\nconst nextArrowDisabled = computed<boolean>(() => {\n if (!vertical)\n return get(right);\n\n return get(bottom);\n});\n\n// When using dynamic content with v-for the slot content can contain fragment,\n// Go through the fragment and always return RuiTab only\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children\n .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 })\n .flat();\n}\n\nfunction updateModelValue(newModelValue: string | number): void {\n set(modelValue, newModelValue);\n set(internalModelValue, newModelValue);\n}\n\nfunction isPathMatch(\n path: string,\n { exactPath, exact }: { exactPath?: boolean; exact?: boolean },\n): boolean {\n if (!route)\n return false;\n\n const currentRoute = route.fullPath;\n\n if (exactPath)\n return currentRoute === path;\n\n const routeWithoutQueryParams = new URL(path, window.location.origin).pathname;\n\n if (exact)\n return currentRoute === routeWithoutQueryParams;\n\n return currentRoute.startsWith(routeWithoutQueryParams);\n}\n\nfunction keepActiveTabVisible(): void {\n nextTick(() => {\n if (!get(showArrows))\n return;\n\n const elem = get(wrapper);\n const barElem = get(bar);\n if (elem) {\n const activeTab = (elem.querySelector('.active-tab') ??\n elem.querySelector('.active-tab-link')) as HTMLElement;\n\n if (!activeTab || !barElem)\n return;\n\n const childLeft = activeTab.offsetLeft - elem.offsetLeft;\n const childTop = activeTab.offsetTop - elem.offsetTop;\n const childWidth = activeTab.offsetWidth;\n const childHeight = activeTab.offsetHeight;\n const parentScrollLeft = barElem.scrollLeft;\n const parentScrollTop = barElem.scrollTop;\n const parentWidth = barElem.offsetWidth;\n const parentHeight = barElem.offsetHeight;\n\n const scrollLeft = Math.max(\n Math.min(parentScrollLeft, childLeft),\n childLeft + childWidth - parentWidth,\n );\n\n const scrollTop = Math.max(\n Math.min(parentScrollTop, childTop),\n childTop + childHeight - parentHeight,\n );\n\n barElem.scrollTo({\n left: scrollLeft,\n top: scrollTop,\n behavior: 'smooth',\n });\n }\n });\n}\n\nfunction applyNewValue(onlyLink = false): void {\n const enabledChildren = get(children).filter(child => !child.props?.disabled);\n if (enabledChildren.length > 0) {\n let newModelValue: string | number = get(modelValue) || 0;\n enabledChildren.forEach((child, index) => {\n const props = child.props as TabProps;\n if (!onlyLink && index === 0 && props.value)\n newModelValue = props.value;\n\n const to = props.to && router ? router.resolve(props.to) : undefined;\n\n if (props.link !== false && to && isPathMatch(to.fullPath, props))\n newModelValue = to.fullPath;\n });\n updateModelValue(newModelValue);\n }\n keepActiveTabVisible();\n}\n\nfunction onPrevSliderClick(): void {\n if (!vertical)\n set(x, get(x) - get(width));\n else set(y, get(y) - get(height));\n}\n\nfunction onNextSliderClick(): void {\n if (!vertical)\n set(x, get(x) + get(width));\n else set(y, get(y) + get(height));\n}\n\nconst { trigger: triggerHorizontal, stop: stopHorizontal } = watchTriggerable(\n [wrapperWidth, width],\n ([ww, w]) => {\n if (w > 0)\n set(showArrows, ww > w);\n },\n {\n eventFilter: throttleFilter(50),\n },\n);\n\nconst { trigger: triggerVertical, stop: stopVertical } = watchTriggerable(\n [wrapperHeight, height],\n ([wh, h]) => {\n if (h > 0)\n set(showArrows, wh > h);\n },\n {\n eventFilter: throttleFilter(500),\n },\n);\n\nwatchImmediate(\n () => vertical,\n (vertical) => {\n if (vertical) {\n triggerVertical();\n stopHorizontal();\n }\n else {\n triggerHorizontal();\n stopVertical();\n }\n },\n);\n\nif (route) {\n watch(route, () => {\n applyNewValue(true);\n });\n}\n\nwatchImmediate(\n () => get(modelValue),\n (modelValue) => {\n set(internalModelValue, modelValue);\n },\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 :class=\"[$style.tabs, { [$style['tabs--vertical'] ?? '']: vertical }]\">\n <div\n v-if=\"showArrows\"\n :class=\"[$style.arrow, { [$style['arrow--vertical'] ?? '']: vertical }]\"\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=\"no-scrollbar\"\n :class=\"[\n $style['tabs-bar'],\n { [$style['tabs-bar--vertical'] ?? '']: vertical },\n { [$style['tabs-bar--grow'] ?? '']: grow },\n ]\"\n >\n <div\n ref=\"wrapper\"\n role=\"tablist\"\n :class=\"[\n $style['tabs-wrapper'],\n { [$style['tabs-wrapper--vertical'] ?? '']: vertical },\n { [$style['tabs-wrapper--grow'] ?? '']: grow },\n ]\"\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=\"[$style.arrow, { [$style['arrow--vertical'] ?? '']: vertical }]\"\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\n<style lang=\"scss\" module>\n.tabs {\n @apply flex h-[2.625rem];\n\n &--vertical {\n @apply h-auto max-h-full flex-col;\n }\n\n &-bar {\n @apply max-h-full overflow-auto;\n\n &--vertical,\n &--grow {\n @apply w-full;\n }\n }\n\n &-wrapper {\n @apply h-full inline-flex max-w-none;\n\n &--vertical {\n @apply flex-col h-auto;\n }\n\n &--vertical,\n &--grow {\n @apply min-w-full;\n }\n }\n}\n\n.arrow {\n @apply h-full w-10;\n\n &--vertical {\n @apply min-h-[2.625rem] w-full h-auto;\n }\n}\n</style>\n"],"names":["_useModel","children","modelValue","_createElementBlock","$style","_unref","_createVNode","_createElementVNode","_normalizeClass","_openBlock","_Fragment","_renderList","_createBlock","_resolveDynamicComponent"],"mappings":"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"}
|
|
@@ -28,9 +28,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
28
28
|
"onUpdate:second"?: ((value: number | undefined) => any) | undefined;
|
|
29
29
|
"onUpdate:millisecond"?: ((value: number | undefined) => any) | undefined;
|
|
30
30
|
"onUpdate:selection"?: ((value: TimePickerSelection) => any) | undefined;
|
|
31
|
-
}>, {
|
|
32
|
-
borderless: boolean;
|
|
33
|
-
accuracy: TimeAccuracy;
|
|
34
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
31
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
35
32
|
declare const _default: typeof __VLS_export;
|
|
36
33
|
export default _default;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, useModel, ref, useTemplateRef, computed,
|
|
1
|
+
import { defineComponent, useModel, ref, useTemplateRef, computed, watch, onMounted, openBlock, createElementBlock, normalizeClass, createElementVNode, toDisplayString, createCommentVNode, normalizeStyle, Fragment, renderList, mergeModels, nextTick } from "vue";
|
|
2
2
|
import { TimeAccuracy } from "../../consts/time-accuracy.js";
|
|
3
3
|
import { assert } from "../../utils/assert.js";
|
|
4
4
|
import { isDefined } from "@vueuse/core";
|
|
@@ -20,7 +20,7 @@ const TWELVE_HOURS = 12;
|
|
|
20
20
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
21
21
|
__name: "RuiTimePicker",
|
|
22
22
|
props: /* @__PURE__ */ mergeModels({
|
|
23
|
-
accuracy: { default: TimeAccuracy.MINUTE },
|
|
23
|
+
accuracy: { default: () => TimeAccuracy.MINUTE },
|
|
24
24
|
borderless: { type: Boolean, default: false }
|
|
25
25
|
}, {
|
|
26
26
|
"modelValue": { required: true },
|
|
@@ -44,7 +44,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
44
44
|
const selectedSecond = useModel(__props, "second");
|
|
45
45
|
const selectedMillisecond = useModel(__props, "millisecond");
|
|
46
46
|
const editMode = useModel(__props, "selection");
|
|
47
|
-
const props = __props;
|
|
48
47
|
const totalItemsPerMode = {
|
|
49
48
|
hour: 12,
|
|
50
49
|
minute: 60,
|
|
@@ -59,9 +58,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
59
58
|
};
|
|
60
59
|
const isDragging = ref(false);
|
|
61
60
|
const clockFace = useTemplateRef("clockFace");
|
|
62
|
-
const showSecond = computed(
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
const showSecond = computed(
|
|
62
|
+
() => __props.accuracy === TimeAccuracy.SECOND || __props.accuracy === TimeAccuracy.MILLISECOND
|
|
63
|
+
);
|
|
64
|
+
const showMillisecond = computed(() => __props.accuracy === TimeAccuracy.MILLISECOND);
|
|
65
|
+
const period = computed(
|
|
66
|
+
() => isDefined(selectedHour) && get(selectedHour) >= TWELVE_HOURS ? "PM" : "AM"
|
|
67
|
+
);
|
|
65
68
|
const displayHour = computed(() => {
|
|
66
69
|
if (!isDefined(selectedHour)) {
|
|
67
70
|
return void 0;
|
|
@@ -153,10 +156,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
153
156
|
}
|
|
154
157
|
function getModelSeconds() {
|
|
155
158
|
const acceptedAccuracy = [TimeAccuracy.SECOND, TimeAccuracy.MILLISECOND];
|
|
156
|
-
return acceptedAccuracy.includes(
|
|
159
|
+
return acceptedAccuracy.includes(__props.accuracy) && isDefined(modelValue) ? new Date(get(modelValue)).getSeconds() : void 0;
|
|
157
160
|
}
|
|
158
161
|
function getModelMilliseconds() {
|
|
159
|
-
return
|
|
162
|
+
return __props.accuracy === TimeAccuracy.MILLISECOND && isDefined(modelValue) ? new Date(get(modelValue)).getMilliseconds() : void 0;
|
|
160
163
|
}
|
|
161
164
|
function generateNumbers(total, interval) {
|
|
162
165
|
const numbers = [];
|
|
@@ -208,32 +211,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
208
211
|
function startDrag(event) {
|
|
209
212
|
event.preventDefault();
|
|
210
213
|
set(isDragging, true);
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
assert(touch);
|
|
221
|
-
clientX = touch.clientX;
|
|
222
|
-
clientY = touch.clientY;
|
|
223
|
-
} else {
|
|
224
|
-
clientX = moveEvent.clientX;
|
|
225
|
-
clientY = moveEvent.clientY;
|
|
226
|
-
}
|
|
227
|
-
const x = clientX - centerX;
|
|
228
|
-
const y = clientY - centerY;
|
|
214
|
+
if (!isDefined(clockFace))
|
|
215
|
+
return;
|
|
216
|
+
const rect = get(clockFace).getBoundingClientRect();
|
|
217
|
+
const centerX = rect.left + rect.width / 2;
|
|
218
|
+
const centerY = rect.top + rect.height / 2;
|
|
219
|
+
let rafId = null;
|
|
220
|
+
const applyMove = (clientX2, clientY2) => {
|
|
221
|
+
const x = clientX2 - centerX;
|
|
222
|
+
const y = clientY2 - centerY;
|
|
229
223
|
let angle = Math.atan2(y, x) * (180 / Math.PI) + 90;
|
|
230
224
|
if (angle < 0)
|
|
231
225
|
angle += FULL_CIRCLE;
|
|
232
226
|
const mode = get(editMode);
|
|
233
227
|
const unit = Math.round(angle / (FULL_CIRCLE / totalItemsPerMode[mode])) % totalItemsPerMode[mode];
|
|
234
228
|
if (mode === "hour") {
|
|
235
|
-
let hour;
|
|
236
|
-
hour = unit;
|
|
229
|
+
let hour = unit;
|
|
237
230
|
if (hour === 0)
|
|
238
231
|
hour = TWELVE_HOURS;
|
|
239
232
|
if (get(period) === "PM" && hour < TWELVE_HOURS) {
|
|
@@ -251,7 +244,32 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
251
244
|
}
|
|
252
245
|
updateModelValue();
|
|
253
246
|
};
|
|
247
|
+
const handleMove = (moveEvent) => {
|
|
248
|
+
if (!get(isDragging))
|
|
249
|
+
return;
|
|
250
|
+
if (rafId !== null)
|
|
251
|
+
return;
|
|
252
|
+
let clientX2;
|
|
253
|
+
let clientY2;
|
|
254
|
+
if ("touches" in moveEvent) {
|
|
255
|
+
const touch = moveEvent.touches[0];
|
|
256
|
+
assert(touch);
|
|
257
|
+
clientX2 = touch.clientX;
|
|
258
|
+
clientY2 = touch.clientY;
|
|
259
|
+
} else {
|
|
260
|
+
clientX2 = moveEvent.clientX;
|
|
261
|
+
clientY2 = moveEvent.clientY;
|
|
262
|
+
}
|
|
263
|
+
rafId = requestAnimationFrame(() => {
|
|
264
|
+
applyMove(clientX2, clientY2);
|
|
265
|
+
rafId = null;
|
|
266
|
+
});
|
|
267
|
+
};
|
|
254
268
|
const handleEnd = () => {
|
|
269
|
+
if (rafId !== null) {
|
|
270
|
+
cancelAnimationFrame(rafId);
|
|
271
|
+
rafId = null;
|
|
272
|
+
}
|
|
255
273
|
set(isDragging, false);
|
|
256
274
|
document.removeEventListener("mousemove", handleMove);
|
|
257
275
|
document.removeEventListener("touchmove", handleMove);
|
|
@@ -269,7 +287,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
269
287
|
document.addEventListener("touchmove", handleMove);
|
|
270
288
|
document.addEventListener("mouseup", handleEnd);
|
|
271
289
|
document.addEventListener("touchend", handleEnd);
|
|
272
|
-
|
|
290
|
+
const initialEvent = event;
|
|
291
|
+
let clientX;
|
|
292
|
+
let clientY;
|
|
293
|
+
if ("touches" in initialEvent) {
|
|
294
|
+
const touch = initialEvent.touches[0];
|
|
295
|
+
assert(touch);
|
|
296
|
+
clientX = touch.clientX;
|
|
297
|
+
clientY = touch.clientY;
|
|
298
|
+
} else {
|
|
299
|
+
clientX = initialEvent.clientX;
|
|
300
|
+
clientY = initialEvent.clientY;
|
|
301
|
+
}
|
|
302
|
+
applyMove(clientX, clientY);
|
|
273
303
|
}
|
|
274
304
|
function selectByClick(num) {
|
|
275
305
|
const mode = get(editMode);
|
|
@@ -307,18 +337,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
307
337
|
set(modelValue, date);
|
|
308
338
|
});
|
|
309
339
|
}
|
|
340
|
+
watch(
|
|
341
|
+
modelValue,
|
|
342
|
+
() => {
|
|
343
|
+
set(selectedHour, getModelHours());
|
|
344
|
+
set(selectedMinute, getModelMinutes());
|
|
345
|
+
set(selectedSecond, getModelSeconds());
|
|
346
|
+
set(selectedMillisecond, getModelMilliseconds());
|
|
347
|
+
}
|
|
348
|
+
);
|
|
310
349
|
onMounted(() => {
|
|
311
350
|
set(selectedHour, getModelHours());
|
|
312
351
|
set(selectedMinute, getModelMinutes());
|
|
313
352
|
set(selectedSecond, getModelSeconds());
|
|
314
353
|
set(selectedMillisecond, getModelMilliseconds());
|
|
315
354
|
});
|
|
316
|
-
watch(modelValue, () => {
|
|
317
|
-
set(selectedHour, getModelHours());
|
|
318
|
-
set(selectedMinute, getModelMinutes());
|
|
319
|
-
set(selectedSecond, getModelSeconds());
|
|
320
|
-
set(selectedMillisecond, getModelMilliseconds());
|
|
321
|
-
}, { deep: true });
|
|
322
355
|
return (_ctx, _cache) => {
|
|
323
356
|
return openBlock(), createElementBlock("div", {
|
|
324
357
|
role: "group",
|