pxd 0.1.2 → 0.1.3
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/_internal/calendar-day.vue +19 -19
- package/dist/components/_internal/dismiss-container.d.vue.ts +1 -1
- package/dist/components/_internal/dismiss-container.vue +19 -19
- package/dist/components/_internal/loading-mask.vue +9 -1
- package/dist/components/_internal/mention-editor.d.vue.ts +1 -1
- package/dist/components/_internal/mention-editor.vue +1 -1
- package/dist/components/_internal/popover-arrow.d.vue.ts +1 -1
- package/dist/components/_internal/popover-arrow.vue +1 -1
- package/dist/components/{steps → _internal}/step-item.d.vue.ts +1 -1
- package/dist/components/{steps → _internal}/step-item.vue +1 -1
- package/dist/components/_internal/tree-node.d.vue.ts +20 -20
- package/dist/components/_internal/tree-node.vue +53 -45
- package/dist/components/active-graph/index.d.vue.ts +2 -2
- package/dist/components/approval-card/index.d.vue.ts +1 -1
- package/dist/components/approval-card/index.vue +34 -17
- package/dist/components/approval-card/types.d.ts +1 -1
- package/dist/components/avatar/index.d.vue.ts +2 -2
- package/dist/components/avatar/index.vue +1 -1
- package/dist/components/backtop/index.d.vue.ts +3 -3
- package/dist/components/backtop/index.vue +17 -17
- package/dist/components/backtop/types.d.ts +1 -1
- package/dist/components/badge/index.d.vue.ts +3 -3
- package/dist/components/badge/index.vue +43 -43
- package/dist/components/badge/types.d.ts +1 -1
- package/dist/components/book/types.d.ts +1 -1
- package/dist/components/border-beam/index.vue +1 -1
- package/dist/components/border-beam/types.d.ts +1 -1
- package/dist/components/bubble/index.vue +1 -1
- package/dist/components/bubble-group/index.d.vue.ts +4 -4
- package/dist/components/button/index.d.vue.ts +5 -5
- package/dist/components/button/index.vue +13 -13
- package/dist/components/button/types.d.ts +1 -1
- package/dist/components/button-group/types.d.ts +1 -1
- package/dist/components/calendar/index.d.vue.ts +2 -2
- package/dist/components/calendar/index.vue +5 -5
- package/dist/components/calendar/types.d.ts +1 -1
- package/dist/components/card/types.d.ts +1 -1
- package/dist/components/carousel/index.d.vue.ts +7 -7
- package/dist/components/carousel/index.vue +1 -1
- package/dist/components/carousel/types.d.ts +1 -1
- package/dist/components/checkbox/index.vue +1 -1
- package/dist/components/checkbox/types.d.ts +1 -1
- package/dist/components/checkbox-group/index.d.vue.ts +2 -2
- package/dist/components/checkbox-group/types.d.ts +1 -1
- package/dist/components/chip/index.d.vue.ts +1 -1
- package/dist/components/chip/types.d.ts +1 -1
- package/dist/components/choicebox/index.d.vue.ts +3 -3
- package/dist/components/choicebox/types.d.ts +1 -1
- package/dist/components/choicebox-item/index.vue +8 -8
- package/dist/components/choicebox-item/types.d.ts +1 -1
- package/dist/components/collapse/index.vue +2 -2
- package/dist/components/collapse-group/index.vue +1 -1
- package/dist/components/collapse-group/types.d.ts +1 -1
- package/dist/components/command-menu/index.d.vue.ts +5 -5
- package/dist/components/command-menu/index.vue +10 -3
- package/dist/components/config-provider/index.d.vue.ts +40 -5
- package/dist/components/config-provider/types.d.ts +2 -1
- package/dist/components/confirm-popover/index.d.vue.ts +39 -0
- package/dist/components/confirm-popover/index.vue +177 -0
- package/dist/components/confirm-popover/types.d.ts +23 -0
- package/dist/components/copy-button/index.d.vue.ts +2 -6
- package/dist/components/copy-button/index.vue +4 -6
- package/dist/components/dash-line/index.d.vue.ts +1 -1
- package/dist/components/dash-line/index.vue +8 -8
- package/dist/components/dash-line/types.d.ts +1 -1
- package/dist/components/date-picker/index.d.vue.ts +1 -1
- package/dist/components/date-picker/index.vue +3 -3
- package/dist/components/date-picker/types.d.ts +1 -1
- package/dist/components/drawer/index.d.vue.ts +7 -7
- package/dist/components/drawer/index.vue +30 -15
- package/dist/components/drawer/types.d.ts +2 -2
- package/dist/components/effort-slider/index.vue +12 -18
- package/dist/components/effort-slider/types.d.ts +1 -1
- package/dist/components/ellipsis-text/index.d.vue.ts +2 -2
- package/dist/components/ellipsis-text/index.vue +75 -75
- package/dist/components/error/types.d.ts +1 -1
- package/dist/components/fader/index.vue +2 -2
- package/dist/components/fader/types.d.ts +1 -1
- package/dist/components/gauge/index.vue +2 -2
- package/dist/components/gauge/types.d.ts +1 -1
- package/dist/components/grid/types.d.ts +1 -1
- package/dist/components/grid-item/types.d.ts +1 -1
- package/dist/components/hint/index.d.vue.ts +32 -0
- package/dist/components/hint/index.vue +239 -0
- package/dist/components/hint/types.d.ts +17 -0
- package/dist/components/hold-button/index.d.vue.ts +4 -4
- package/dist/components/hold-button/index.vue +10 -10
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +4 -0
- package/dist/components/input/index.d.vue.ts +1 -1
- package/dist/components/input/index.vue +14 -7
- package/dist/components/input/types.d.ts +1 -1
- package/dist/components/intersection-observer/index.vue +3 -3
- package/dist/components/kbd/index.vue +2 -2
- package/dist/components/kbd/types.d.ts +1 -1
- package/dist/components/link-button/index.d.vue.ts +5 -5
- package/dist/components/list/index.d.vue.ts +4 -4
- package/dist/components/list/index.vue +126 -47
- package/dist/components/list/types.d.ts +1 -1
- package/dist/components/list-group/types.d.ts +1 -1
- package/dist/components/list-item/index.d.vue.ts +2 -2
- package/dist/components/list-item/index.vue +26 -8
- package/dist/components/loading-bar/index.vue +5 -5
- package/dist/components/marching-ants/index.d.vue.ts +2 -2
- package/dist/components/marching-ants/index.vue +56 -56
- package/dist/components/marching-ants/types.d.ts +1 -1
- package/dist/components/marquee/index.d.vue.ts +6 -6
- package/dist/components/marquee/index.vue +16 -16
- package/dist/components/marquee/types.d.ts +1 -1
- package/dist/components/material/index.d.vue.ts +3 -3
- package/dist/components/mention/index.d.vue.ts +5 -5
- package/dist/components/mention/index.vue +68 -68
- package/dist/components/menu/index.d.vue.ts +4 -4
- package/dist/components/menu/index.vue +10 -10
- package/dist/components/menu/types.d.ts +1 -1
- package/dist/components/message/index.d.vue.ts +1 -1
- package/dist/components/message/index.vue +19 -25
- package/dist/components/message/types.d.ts +1 -1
- package/dist/components/message-item/index.vue +2 -6
- package/dist/components/modal/index.d.vue.ts +7 -7
- package/dist/components/modal/index.vue +26 -11
- package/dist/components/modal/types.d.ts +2 -2
- package/dist/components/noise-background/types.d.ts +1 -1
- package/dist/components/note/index.vue +6 -2
- package/dist/components/note/types.d.ts +2 -1
- package/dist/components/number-input/index.d.vue.ts +11 -6
- package/dist/components/number-input/index.vue +57 -16
- package/dist/components/number-input/types.d.ts +2 -1
- package/dist/components/overlay/index.d.vue.ts +2 -3
- package/dist/components/overlay/index.vue +10 -62
- package/dist/components/overlay/types.d.ts +0 -2
- package/dist/components/page-number/index.vue +30 -29
- package/dist/components/page-number/types.d.ts +1 -1
- package/dist/components/pin-input/index.d.vue.ts +1 -1
- package/dist/components/pin-input/index.vue +6 -6
- package/dist/components/pin-input/types.d.ts +1 -1
- package/dist/components/popover/index.vue +49 -21
- package/dist/components/popover/types.d.ts +3 -1
- package/dist/components/progress/index.d.vue.ts +2 -2
- package/dist/components/progress/index.vue +12 -12
- package/dist/components/progress/types.d.ts +1 -1
- package/dist/components/project-banner/types.d.ts +1 -1
- package/dist/components/questionnaire/index.vue +14 -14
- package/dist/components/radio/index.vue +1 -1
- package/dist/components/radio/types.d.ts +1 -1
- package/dist/components/radio-group/index.d.vue.ts +2 -2
- package/dist/components/radio-group/types.d.ts +1 -1
- package/dist/components/rating/index.vue +28 -28
- package/dist/components/rating/types.d.ts +1 -1
- package/dist/components/resizable/index.d.vue.ts +1 -0
- package/dist/components/resizable/index.vue +130 -195
- package/dist/components/resizable/types.d.ts +2 -10
- package/dist/components/reveal/index.d.vue.ts +3 -3
- package/dist/components/reveal/index.vue +4 -4
- package/dist/components/reveal/types.d.ts +1 -1
- package/dist/components/rolling-number/index.d.vue.ts +2 -2
- package/dist/components/rolling-number/index.vue +15 -15
- package/dist/components/scalable-text/index.vue +9 -9
- package/dist/components/scroll-text/index.d.vue.ts +3 -3
- package/dist/components/scroll-text/index.vue +6 -6
- package/dist/components/scroll-text/types.d.ts +1 -1
- package/dist/components/scrollable/types.d.ts +2 -1
- package/dist/components/search-input/index.d.vue.ts +5 -5
- package/dist/components/search-input/index.vue +2 -1
- package/dist/components/select/index.d.vue.ts +12 -9
- package/dist/components/select/index.vue +165 -42
- package/dist/components/select/types.d.ts +3 -1
- package/dist/components/separator/index.d.vue.ts +1 -1
- package/dist/components/separator/types.d.ts +1 -1
- package/dist/components/skeleton/index.d.vue.ts +1 -1
- package/dist/components/skeleton/index.vue +11 -11
- package/dist/components/skeleton/types.d.ts +1 -1
- package/dist/components/slider/index.d.vue.ts +1 -1
- package/dist/components/slider/index.vue +1 -1
- package/dist/components/slider/types.d.ts +1 -1
- package/dist/components/snippet/index.d.vue.ts +3 -3
- package/dist/components/snippet/index.vue +7 -5
- package/dist/components/snippet/types.d.ts +1 -1
- package/dist/components/spinner/index.vue +5 -1
- package/dist/components/spinner-dots/index.d.vue.ts +1 -1
- package/dist/components/split-button/index.d.vue.ts +5 -5
- package/dist/components/split-button/types.d.ts +1 -1
- package/dist/components/stack/index.d.vue.ts +3 -3
- package/dist/components/stack/index.vue +28 -29
- package/dist/components/stack/types.d.ts +1 -1
- package/dist/components/status-dot/types.d.ts +1 -1
- package/dist/components/steps/index.d.vue.ts +2 -2
- package/dist/components/steps/index.vue +6 -6
- package/dist/components/steps/types.d.ts +1 -1
- package/dist/components/stick-to-bottom/types.d.ts +1 -1
- package/dist/components/swipe-cell/index.d.vue.ts +6 -6
- package/dist/components/swipe-cell/index.vue +64 -64
- package/dist/components/swipe-cell/types.d.ts +2 -1
- package/dist/components/switch/index.vue +1 -1
- package/dist/components/switch/types.d.ts +1 -1
- package/dist/components/switch-item/index.vue +1 -1
- package/dist/components/switch-item/types.d.ts +1 -1
- package/dist/components/tabs/index.d.vue.ts +1 -1
- package/dist/components/tabs/index.vue +48 -51
- package/dist/components/tabs/types.d.ts +1 -1
- package/dist/components/teleport/index.vue +2 -2
- package/dist/components/text/index.d.vue.ts +3 -3
- package/dist/components/text/index.vue +11 -11
- package/dist/components/text/types.d.ts +1 -1
- package/dist/components/textarea/index.vue +1 -1
- package/dist/components/textarea/types.d.ts +1 -1
- package/dist/components/theme-switcher/index.d.vue.ts +3 -2
- package/dist/components/theme-switcher/index.vue +15 -7
- package/dist/components/theme-switcher/types.d.ts +2 -2
- package/dist/components/time-ago/index.d.vue.ts +6 -0
- package/dist/components/time-ago/index.vue +143 -0
- package/dist/components/time-ago/types.d.ts +4 -0
- package/dist/components/time-picker/index.d.vue.ts +1 -1
- package/dist/components/time-picker/index.vue +7 -7
- package/dist/components/time-picker/types.d.ts +1 -1
- package/dist/components/toc/index.d.vue.ts +2 -2
- package/dist/components/toc/index.vue +1 -1
- package/dist/components/todo-list/index.d.vue.ts +4 -4
- package/dist/components/todo-list/index.vue +15 -15
- package/dist/components/todo-list/types.d.ts +1 -1
- package/dist/components/toggle/index.vue +3 -3
- package/dist/components/toggle/types.d.ts +1 -1
- package/dist/components/toggle-button/index.vue +14 -11
- package/dist/components/toggle-button/types.d.ts +2 -2
- package/dist/components/toggle-button-group/index.d.vue.ts +3 -3
- package/dist/components/toggle-button-group/index.vue +2 -2
- package/dist/components/toggle-button-group/types.d.ts +2 -2
- package/dist/components/tool-call/index.vue +5 -5
- package/dist/components/tooltip/index.d.vue.ts +4 -5
- package/dist/components/tooltip/index.vue +4 -49
- package/dist/components/tooltip/types.d.ts +3 -7
- package/dist/components/tour/index.d.vue.ts +33 -0
- package/dist/components/tour/index.vue +302 -0
- package/dist/components/tour/types.d.ts +29 -0
- package/dist/components/tree/index.d.vue.ts +24 -28
- package/dist/components/tree/index.vue +290 -223
- package/dist/components/tree/types.d.ts +38 -13
- package/dist/components/virtual-list/index.d.vue.ts +4 -4
- package/dist/composables/_internal/use-list-keyboard-controller.js +9 -10
- package/dist/composables/_internal/use-list-rows.d.ts +4 -0
- package/dist/composables/_internal/use-list-rows.js +12 -4
- package/dist/composables/_internal/use-list-selection.d.ts +1 -1
- package/dist/composables/_internal/use-lock-scroll.d.ts +8 -1
- package/dist/composables/_internal/use-lock-scroll.js +57 -36
- package/dist/composables/_internal/use-mention-editor.js +1 -1
- package/dist/composables/_internal/use-message-group.d.ts +22 -0
- package/dist/composables/_internal/use-message-group.js +143 -0
- package/dist/composables/_internal/use-overlay-dialog.js +1 -3
- package/dist/composables/_internal/use-overlay-manager.d.ts +4 -1
- package/dist/composables/_internal/use-overlay-manager.js +67 -8
- package/dist/composables/_internal/use-swipe-gesture.d.ts +1 -1
- package/dist/composables/_internal/use-tour-target.d.ts +29 -0
- package/dist/composables/_internal/use-tour-target.js +201 -0
- package/dist/composables/_internal/use-tree.d.ts +103 -0
- package/dist/composables/_internal/use-tree.js +676 -0
- package/dist/composables/_internal/use-word-limit.d.ts +1 -1
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/index.js +1 -0
- package/dist/composables/use-color-scheme.d.ts +1 -1
- package/dist/composables/use-color-scheme.js +7 -6
- package/dist/composables/use-delay-destroy.d.ts +1 -1
- package/dist/composables/use-document-hidden.d.ts +1 -1
- package/dist/composables/use-intersection-observer.d.ts +1 -1
- package/dist/composables/use-intersection-observer.js +1 -1
- package/dist/composables/{_internal/use-motion-reduce.js → use-motion-reduce.js} +2 -2
- package/dist/composables/use-mutation-observer.d.ts +1 -1
- package/dist/composables/use-mutation-observer.js +1 -1
- package/dist/composables/use-resize-observer.d.ts +1 -1
- package/dist/composables/use-resize-observer.js +1 -1
- package/dist/composables/use-view-transition.js +1 -0
- package/dist/composables/use-virtual-list.d.ts +1 -1
- package/dist/constants/tooltip-variants.d.ts +28 -0
- package/dist/constants/tooltip-variants.js +27 -0
- package/dist/contexts/avatar.js +1 -1
- package/dist/contexts/breadcrumb.js +1 -1
- package/dist/contexts/button.js +1 -1
- package/dist/contexts/checkbox.js +1 -1
- package/dist/contexts/choicebox.js +1 -1
- package/dist/contexts/collapse.js +1 -1
- package/dist/contexts/config-provider.js +1 -1
- package/dist/contexts/list.js +1 -1
- package/dist/contexts/radio.js +1 -1
- package/dist/contexts/switch.js +1 -1
- package/dist/contexts/toggle-button.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/locales/en-us.d.ts +35 -0
- package/dist/locales/en-us.js +20 -0
- package/dist/locales/zh-cn.d.ts +35 -0
- package/dist/locales/zh-cn.js +20 -0
- package/dist/styles/styles.css +1 -1
- package/dist/styles/tw.css +43 -30
- package/dist/utils/{context.js → _internal/context.js} +1 -1
- package/dist/utils/{observer.d.ts → _internal/observer.d.ts} +1 -1
- package/dist/utils/{observer.js → _internal/observer.js} +4 -4
- package/dist/{components/swipe-cell/instances.d.ts → utils/_internal/swipe-cell-instances.d.ts} +1 -1
- package/dist/utils/event.d.ts +2 -1
- package/dist/utils/event.js +3 -0
- package/package.json +26 -50
- package/volar.d.ts +4 -0
- package/dist/components/message/composables/use-group-expand.d.ts +0 -13
- package/dist/components/message/composables/use-group-expand.js +0 -50
- package/dist/components/message/composables/use-message-timer.d.ts +0 -9
- package/dist/components/message/composables/use-message-timer.js +0 -62
- package/dist/components/message/composables/use-promise-message.d.ts +0 -4
- package/dist/components/message/composables/use-promise-message.js +0 -49
- package/dist/components/resizable/utils.d.ts +0 -4
- package/dist/components/resizable/utils.js +0 -10
- package/dist/composables/_internal/use-tree-drag.d.ts +0 -23
- package/dist/composables/_internal/use-tree-drag.js +0 -196
- package/dist/composables/_internal/use-tree-move.d.ts +0 -20
- package/dist/composables/_internal/use-tree-move.js +0 -96
- package/dist/composables/_internal/use-tree-rows.d.ts +0 -46
- package/dist/composables/_internal/use-tree-rows.js +0 -101
- package/dist/composables/_internal/use-tree-selection.d.ts +0 -22
- package/dist/composables/_internal/use-tree-selection.js +0 -87
- package/dist/styles/source.css +0 -675
- package/dist/types/shared/index.d.ts +0 -2
- /package/dist/composables/{_internal/use-motion-reduce.d.ts → use-motion-reduce.d.ts} +0 -0
- /package/dist/utils/{context.d.ts → _internal/context.d.ts} +0 -0
- /package/dist/utils/{mention-html.d.ts → _internal/mention-html.d.ts} +0 -0
- /package/dist/utils/{mention-html.js → _internal/mention-html.js} +0 -0
- /package/dist/{components/swipe-cell/instances.js → utils/_internal/swipe-cell-instances.js} +0 -0
|
@@ -4,7 +4,7 @@ import PlusIcon from "@gdsicon/vue/plus";
|
|
|
4
4
|
import { computed, reactive, shallowRef, watch } from "vue";
|
|
5
5
|
import { useModelValue } from "../../composables/_internal/use-model-value.js";
|
|
6
6
|
import { useRepeatAction } from "../../composables/use-repeat-action.js";
|
|
7
|
-
import { NOOP } from "../../utils/event.js";
|
|
7
|
+
import { NOOP, isCompositionKeydown } from "../../utils/event.js";
|
|
8
8
|
import { toNumber } from "../../utils/format.js";
|
|
9
9
|
import { isNil, isNumber, isUndefined } from "../../utils/is.js";
|
|
10
10
|
import PInput from "../input/index.vue";
|
|
@@ -53,11 +53,6 @@ const props = defineProps({
|
|
|
53
53
|
type: Boolean,
|
|
54
54
|
required: false
|
|
55
55
|
},
|
|
56
|
-
thousandsSeparator: {
|
|
57
|
-
type: String,
|
|
58
|
-
required: false,
|
|
59
|
-
default: ","
|
|
60
|
-
},
|
|
61
56
|
scientific: {
|
|
62
57
|
type: Boolean,
|
|
63
58
|
required: false,
|
|
@@ -71,6 +66,16 @@ const props = defineProps({
|
|
|
71
66
|
modelValue: {
|
|
72
67
|
type: [Number, null],
|
|
73
68
|
required: false
|
|
69
|
+
},
|
|
70
|
+
controlsPosition: {
|
|
71
|
+
type: String,
|
|
72
|
+
required: false,
|
|
73
|
+
default: "sides"
|
|
74
|
+
},
|
|
75
|
+
thousandsSeparator: {
|
|
76
|
+
type: String,
|
|
77
|
+
required: false,
|
|
78
|
+
default: ","
|
|
74
79
|
}
|
|
75
80
|
});
|
|
76
81
|
const emits = defineEmits([
|
|
@@ -79,7 +84,6 @@ const emits = defineEmits([
|
|
|
79
84
|
"change",
|
|
80
85
|
"update:modelValue"
|
|
81
86
|
]);
|
|
82
|
-
const modelValue = useModelValue(props, emits, { withChange: false });
|
|
83
87
|
const REGEXPS = {
|
|
84
88
|
"remove-leading-zeros": /^(-?)0+(?=\d)/,
|
|
85
89
|
"thousands-separator": /\B(?=(\d{3})+(?!\d))/g
|
|
@@ -89,13 +93,6 @@ const inputData = reactive({
|
|
|
89
93
|
currentValue: props.modelValue,
|
|
90
94
|
userInput: null
|
|
91
95
|
});
|
|
92
|
-
function formatWithThousands(value) {
|
|
93
|
-
const str = String(value);
|
|
94
|
-
const dotIndex = str.indexOf(".");
|
|
95
|
-
const intPart = dotIndex === -1 ? str : str.slice(0, dotIndex);
|
|
96
|
-
const decPart = dotIndex === -1 ? "" : str.slice(dotIndex);
|
|
97
|
-
return intPart.replace(REGEXPS["thousands-separator"], props.thousandsSeparator) + decPart;
|
|
98
|
-
}
|
|
99
96
|
const inputValue = computed(() => {
|
|
100
97
|
if (inputData.userInput !== null) {
|
|
101
98
|
return inputData.userInput;
|
|
@@ -130,6 +127,7 @@ const valuePrecision = computed(() => {
|
|
|
130
127
|
}
|
|
131
128
|
return stringValue.length - decimalIndex - 1;
|
|
132
129
|
});
|
|
130
|
+
const modelValue = useModelValue(props, emits, { withChange: false });
|
|
133
131
|
const { start: startDecrease, stop: stopDecrease } = useRepeatAction({
|
|
134
132
|
disabled: decreaseDisabled,
|
|
135
133
|
action: decreaseValue
|
|
@@ -138,6 +136,13 @@ const { start: startIncrease, stop: stopIncrease } = useRepeatAction({
|
|
|
138
136
|
disabled: increaseDisabled,
|
|
139
137
|
action: increaseValue
|
|
140
138
|
});
|
|
139
|
+
function formatWithThousands(value) {
|
|
140
|
+
const str = String(value);
|
|
141
|
+
const dotIndex = str.indexOf(".");
|
|
142
|
+
const intPart = dotIndex === -1 ? str : str.slice(0, dotIndex);
|
|
143
|
+
const decPart = dotIndex === -1 ? "" : str.slice(dotIndex);
|
|
144
|
+
return intPart.replace(REGEXPS["thousands-separator"], props.thousandsSeparator) + decPart;
|
|
145
|
+
}
|
|
141
146
|
function toPrecision(value) {
|
|
142
147
|
if (!value) {
|
|
143
148
|
return value;
|
|
@@ -180,6 +185,9 @@ function decreaseValue() {
|
|
|
180
185
|
modelValue.value = clampToRange(value ?? 0);
|
|
181
186
|
}
|
|
182
187
|
function onInputKeydown(ev) {
|
|
188
|
+
if (isCompositionKeydown(ev)) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
183
191
|
const key = ev.key;
|
|
184
192
|
if (!props.scientific && ["e", "E"].includes(key)) {
|
|
185
193
|
ev.preventDefault();
|
|
@@ -257,7 +265,7 @@ watch(() => props.modelValue, (newVal, oldVal) => {
|
|
|
257
265
|
>
|
|
258
266
|
<template #prefix>
|
|
259
267
|
<button
|
|
260
|
-
v-if="controls"
|
|
268
|
+
v-if="controls && controlsPosition !== 'right'"
|
|
261
269
|
tabindex="-1"
|
|
262
270
|
class="flex aspect-square h-full cursor-pointer touch-manipulation appearance-none items-center justify-center rounded-l-inherit border-r font-inherit text-foreground outline-none enabled:hover:bg-background-hover enabled:hover:text-gray-1000 enabled:active:bg-background-active disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
263
271
|
:disabled="decreaseDisabled"
|
|
@@ -277,8 +285,41 @@ watch(() => props.modelValue, (newVal, oldVal) => {
|
|
|
277
285
|
<template #suffix>
|
|
278
286
|
<slot name="suffix" />
|
|
279
287
|
|
|
288
|
+
<div
|
|
289
|
+
v-if="controls && controlsPosition === 'right'"
|
|
290
|
+
class="flex aspect-square h-full flex-col rounded-r-inherit border-l"
|
|
291
|
+
>
|
|
292
|
+
<button
|
|
293
|
+
tabindex="-1"
|
|
294
|
+
class="flex h-1/2 w-full cursor-pointer touch-manipulation appearance-none items-center justify-center rounded-tr-inherit border-b font-inherit text-foreground outline-none enabled:hover:bg-background-hover enabled:hover:text-gray-1000 enabled:active:bg-background-active disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
295
|
+
:disabled="increaseDisabled"
|
|
296
|
+
@pointerdown="startIncrease"
|
|
297
|
+
@pointercancel="stopIncrease"
|
|
298
|
+
@pointerup="stopIncrease"
|
|
299
|
+
@contextmenu.prevent="NOOP"
|
|
300
|
+
>
|
|
301
|
+
<slot name="plusIcon">
|
|
302
|
+
<PlusIcon class="size-2 pointer-events-none" />
|
|
303
|
+
</slot>
|
|
304
|
+
</button>
|
|
305
|
+
|
|
306
|
+
<button
|
|
307
|
+
tabindex="-1"
|
|
308
|
+
class="flex h-1/2 w-full cursor-pointer touch-manipulation appearance-none items-center justify-center rounded-br-inherit font-inherit text-foreground outline-none enabled:hover:bg-background-hover enabled:hover:text-gray-1000 enabled:active:bg-background-active disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
309
|
+
:disabled="decreaseDisabled"
|
|
310
|
+
@pointerdown="startDecrease"
|
|
311
|
+
@pointercancel="stopDecrease"
|
|
312
|
+
@pointerup="stopDecrease"
|
|
313
|
+
@contextmenu.prevent="NOOP"
|
|
314
|
+
>
|
|
315
|
+
<slot name="minusIcon">
|
|
316
|
+
<MinusIcon class="size-2 pointer-events-none" />
|
|
317
|
+
</slot>
|
|
318
|
+
</button>
|
|
319
|
+
</div>
|
|
320
|
+
|
|
280
321
|
<button
|
|
281
|
-
v-if="controls"
|
|
322
|
+
v-else-if="controls"
|
|
282
323
|
tabindex="-1"
|
|
283
324
|
class="flex aspect-square h-full cursor-pointer touch-manipulation appearance-none items-center justify-center rounded-r-inherit border-l font-inherit text-foreground outline-none enabled:hover:bg-background-hover enabled:hover:text-gray-1000 enabled:active:bg-background-active disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
284
325
|
:disabled="increaseDisabled"
|
|
@@ -7,10 +7,11 @@ export interface NumberInputProps {
|
|
|
7
7
|
controls?: boolean
|
|
8
8
|
precision?: number
|
|
9
9
|
thousands?: boolean
|
|
10
|
-
thousandsSeparator?: string
|
|
11
10
|
scientific?: boolean
|
|
12
11
|
clearValue?: number | null
|
|
13
12
|
modelValue?: number | null
|
|
13
|
+
controlsPosition?: 'sides' | 'right'
|
|
14
|
+
thousandsSeparator?: string
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
export interface NumberInputEmits {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { OverlayProps } from './types';
|
|
2
|
-
declare var
|
|
2
|
+
declare var __VLS_13: {};
|
|
3
3
|
type __VLS_Slots = {} & {
|
|
4
|
-
default?: (props: typeof
|
|
4
|
+
default?: (props: typeof __VLS_13) => any;
|
|
5
5
|
};
|
|
6
6
|
declare const __VLS_base: import("vue").DefineComponent<OverlayProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
7
|
"update:modelValue": (args_0: boolean) => any;
|
|
@@ -14,7 +14,6 @@ declare const __VLS_base: import("vue").DefineComponent<OverlayProps, {}, {}, {}
|
|
|
14
14
|
}>, {
|
|
15
15
|
modelValue: boolean;
|
|
16
16
|
closeOnPressEscape: boolean;
|
|
17
|
-
appendToBody: boolean;
|
|
18
17
|
lockScrollOnVisible: boolean;
|
|
19
18
|
showOverlay: boolean;
|
|
20
19
|
closeOnClickOverlay: boolean;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { computed,
|
|
2
|
+
import { computed, watch } from "vue";
|
|
3
3
|
import { useLockScroll } from "../../composables/_internal/use-lock-scroll.js";
|
|
4
4
|
import { useOverlayManager } from "../../composables/_internal/use-overlay-manager.js";
|
|
5
5
|
import { useConfigProvider } from "../../contexts/config-provider.js";
|
|
6
|
-
import { getElement } from "../../utils/dom.js";
|
|
7
6
|
import { NOOP } from "../../utils/event.js";
|
|
8
7
|
import { isServer } from "../../utils/is.js";
|
|
9
8
|
import PTeleport from "../teleport/index.vue";
|
|
@@ -34,15 +33,6 @@ const props = defineProps({
|
|
|
34
33
|
required: false,
|
|
35
34
|
default: true
|
|
36
35
|
},
|
|
37
|
-
appendToBody: {
|
|
38
|
-
type: Boolean,
|
|
39
|
-
required: false,
|
|
40
|
-
default: true
|
|
41
|
-
},
|
|
42
|
-
shownElement: {
|
|
43
|
-
type: [String, Object],
|
|
44
|
-
required: false
|
|
45
|
-
},
|
|
46
36
|
closeOnPressEscape: {
|
|
47
37
|
type: Boolean,
|
|
48
38
|
required: false,
|
|
@@ -64,72 +54,35 @@ const emits = defineEmits([
|
|
|
64
54
|
"escape",
|
|
65
55
|
"update:modelValue"
|
|
66
56
|
]);
|
|
57
|
+
const computedStyle = computed(() => ({ "--overlay-index": props.zIndex }));
|
|
67
58
|
const configProvider = useConfigProvider();
|
|
68
|
-
const
|
|
69
|
-
const computedStyle = computed(() => ({
|
|
70
|
-
"--overlay-index": props.zIndex,
|
|
71
|
-
"clip-path": clipPath.value
|
|
72
|
-
}));
|
|
73
|
-
let cacheShownElement = null;
|
|
74
|
-
const { lockScroll, unlockScroll } = useLockScroll();
|
|
59
|
+
const { lockScroll, unlockScroll } = useLockScroll(() => document.body, { walkAncestors: true });
|
|
75
60
|
const { registerOverlay, unregisterOverlay } = useOverlayManager({
|
|
76
61
|
enabled: () => props.modelValue,
|
|
77
62
|
lockScrollOnVisible: () => props.lockScrollOnVisible,
|
|
78
63
|
lockScroll,
|
|
79
64
|
unlockScroll,
|
|
65
|
+
zIndex: () => props.zIndex,
|
|
80
66
|
onPressEscape: (ev) => {
|
|
81
67
|
if (!props.closeOnPressEscape) {
|
|
82
|
-
return;
|
|
68
|
+
return false;
|
|
83
69
|
}
|
|
84
70
|
emits("escape", ev);
|
|
85
|
-
|
|
71
|
+
if (!ev.defaultPrevented) {
|
|
72
|
+
emits("update:modelValue", false);
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
86
75
|
}
|
|
87
76
|
});
|
|
88
|
-
function getShownElementClipPath(el) {
|
|
89
|
-
const { top, left, right, bottom } = el.getBoundingClientRect();
|
|
90
|
-
clipPath.value = `polygon(
|
|
91
|
-
0% 0%,
|
|
92
|
-
0% 100%,
|
|
93
|
-
${left}px 100%,
|
|
94
|
-
${left}px ${top}px,
|
|
95
|
-
${right}px ${top}px,
|
|
96
|
-
${right}px ${bottom}px,
|
|
97
|
-
${left}px ${bottom}px,
|
|
98
|
-
${left}px 100%,
|
|
99
|
-
100% 100%,
|
|
100
|
-
100% 0%
|
|
101
|
-
)`;
|
|
102
|
-
}
|
|
103
|
-
async function getShownElementIfNeed() {
|
|
104
|
-
const { shownElement, modelValue } = props;
|
|
105
|
-
if (!modelValue || !shownElement) {
|
|
106
|
-
toggleShownElementClasses();
|
|
107
|
-
clipPath.value = "";
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
await nextTick();
|
|
111
|
-
const el = getElement(shownElement);
|
|
112
|
-
if (!el) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
cacheShownElement = el;
|
|
116
|
-
getShownElementClipPath(el);
|
|
117
|
-
toggleShownElementClasses(true);
|
|
118
|
-
}
|
|
119
|
-
function toggleShownElementClasses(force = false) {
|
|
120
|
-
cacheShownElement?.classList.toggle("pointer-events-auto!", force);
|
|
121
|
-
}
|
|
122
77
|
function onOverlayVisibleChange(visible) {
|
|
123
78
|
if (isServer()) {
|
|
124
79
|
return;
|
|
125
80
|
}
|
|
126
81
|
if (visible) {
|
|
127
82
|
registerOverlay();
|
|
128
|
-
getShownElementIfNeed();
|
|
129
83
|
return;
|
|
130
84
|
}
|
|
131
85
|
unregisterOverlay();
|
|
132
|
-
toggleShownElementClasses();
|
|
133
86
|
}
|
|
134
87
|
function onOverlayClick(ev) {
|
|
135
88
|
emits("click", ev);
|
|
@@ -139,15 +92,10 @@ function onOverlayClick(ev) {
|
|
|
139
92
|
emits("update:modelValue", false);
|
|
140
93
|
}
|
|
141
94
|
watch(() => props.modelValue, onOverlayVisibleChange, { immediate: true });
|
|
142
|
-
watch(() => props.shownElement, getShownElementIfNeed);
|
|
143
|
-
onBeforeUnmount(() => {
|
|
144
|
-
toggleShownElementClasses();
|
|
145
|
-
cacheShownElement = null;
|
|
146
|
-
});
|
|
147
95
|
</script>
|
|
148
96
|
|
|
149
97
|
<template>
|
|
150
|
-
<PTeleport
|
|
98
|
+
<PTeleport>
|
|
151
99
|
<Transition name="pxd-transition--fade" mode="out-in" appear>
|
|
152
100
|
<div
|
|
153
101
|
data-overlay
|
|
@@ -3,8 +3,6 @@ export interface OverlayProps {
|
|
|
3
3
|
variant?: 'default' | 'blurred' | 'transparent'
|
|
4
4
|
modelValue?: boolean
|
|
5
5
|
showOverlay?: boolean
|
|
6
|
-
appendToBody?: boolean
|
|
7
|
-
shownElement?: string | object
|
|
8
6
|
closeOnPressEscape?: boolean
|
|
9
7
|
closeOnClickOverlay?: boolean
|
|
10
8
|
lockScrollOnVisible?: boolean
|
|
@@ -3,6 +3,7 @@ import ChevronRightIcon from "@gdsicon/vue/chevron-right";
|
|
|
3
3
|
import { computed, ref, watch } from "vue";
|
|
4
4
|
import { BASIC_HEIGHTS } from "../../constants/size.js";
|
|
5
5
|
import { useConfigProvider } from "../../contexts/config-provider.js";
|
|
6
|
+
import { isCompositionKeydown } from "../../utils/event.js";
|
|
6
7
|
import PSelect from "../select/index.vue";
|
|
7
8
|
defineOptions({
|
|
8
9
|
name: "PPageNumber",
|
|
@@ -58,27 +59,10 @@ const props = defineProps({
|
|
|
58
59
|
]
|
|
59
60
|
}
|
|
60
61
|
});
|
|
61
|
-
const mappedPageSizeOptions = computed(() => {
|
|
62
|
-
const label = configProvider.locale.pagination.perPage;
|
|
63
|
-
return props.pageSizeOptions.map((size) => ({
|
|
64
|
-
label: String(size) + label,
|
|
65
|
-
value: size
|
|
66
|
-
}));
|
|
67
|
-
});
|
|
68
62
|
const emits = defineEmits(["update:pageSize", "update:modelValue"]);
|
|
69
|
-
const configProvider = useConfigProvider();
|
|
70
63
|
const pageInput = ref(String(props.modelValue));
|
|
71
64
|
const internalPageSize = ref(props.pageSize);
|
|
72
65
|
const pageCount = computed(() => Math.max(1, Math.ceil(props.total / props.pageSize)));
|
|
73
|
-
const pagesBtnSize = computed(() => {
|
|
74
|
-
const inheritSize = props.size || configProvider.size;
|
|
75
|
-
return {
|
|
76
|
-
sm: "xs",
|
|
77
|
-
md: "sm",
|
|
78
|
-
lg: "md"
|
|
79
|
-
}[inheritSize];
|
|
80
|
-
});
|
|
81
|
-
const pageItemSizeClass = computed(() => BASIC_HEIGHTS[pagesBtnSize.value]);
|
|
82
66
|
const pageItems = computed(() => {
|
|
83
67
|
if (pageCount.value <= 7) {
|
|
84
68
|
return Array.from({ length: pageCount.value }, (_, index) => index + 1);
|
|
@@ -115,6 +99,23 @@ const pageItems = computed(() => {
|
|
|
115
99
|
pageCount.value
|
|
116
100
|
];
|
|
117
101
|
});
|
|
102
|
+
const configProvider = useConfigProvider();
|
|
103
|
+
const mappedPageSizeOptions = computed(() => {
|
|
104
|
+
const label = configProvider.locale.pagination.perPage;
|
|
105
|
+
return props.pageSizeOptions.map((size) => ({
|
|
106
|
+
label: String(size) + label,
|
|
107
|
+
value: size
|
|
108
|
+
}));
|
|
109
|
+
});
|
|
110
|
+
const pagesBtnSize = computed(() => {
|
|
111
|
+
const inheritSize = props.size || configProvider.size;
|
|
112
|
+
return {
|
|
113
|
+
sm: "xs",
|
|
114
|
+
md: "sm",
|
|
115
|
+
lg: "md"
|
|
116
|
+
}[inheritSize];
|
|
117
|
+
});
|
|
118
|
+
const pageItemSizeClass = computed(() => BASIC_HEIGHTS[pagesBtnSize.value]);
|
|
118
119
|
function setPage(page) {
|
|
119
120
|
if (!props.disabled && page !== props.modelValue) {
|
|
120
121
|
emits("update:modelValue", page);
|
|
@@ -131,7 +132,7 @@ function submitPageInput() {
|
|
|
131
132
|
setPage(nextPage);
|
|
132
133
|
}
|
|
133
134
|
function onPageInputKeydown(event) {
|
|
134
|
-
if (event.key === "Enter") {
|
|
135
|
+
if (event.key === "Enter" && !isCompositionKeydown(event)) {
|
|
135
136
|
submitPageInput();
|
|
136
137
|
}
|
|
137
138
|
}
|
|
@@ -193,17 +194,6 @@ watch(() => props.pageSize, (value) => {
|
|
|
193
194
|
</button>
|
|
194
195
|
</template>
|
|
195
196
|
|
|
196
|
-
<button
|
|
197
|
-
type="button"
|
|
198
|
-
class="pxd-page-number--next inline-flex aspect-square items-center justify-center rounded-md border border-transparent self-focus-ring outline-none enabled:cursor-pointer enabled:hover:bg-background-hover enabled:hover:text-foreground enabled:active:bg-background-active disabled:cursor-not-allowed disabled:border-gray-300 disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
199
|
-
:class="pageItemSizeClass"
|
|
200
|
-
:disabled="disabled || modelValue >= pageCount"
|
|
201
|
-
:aria-label="configProvider.locale.pagination.next"
|
|
202
|
-
@click="setPage(modelValue + 1)"
|
|
203
|
-
>
|
|
204
|
-
<ChevronRightIcon class="size-4" aria-hidden="true" />
|
|
205
|
-
</button>
|
|
206
|
-
|
|
207
197
|
<PSelect
|
|
208
198
|
v-if="showPageSize"
|
|
209
199
|
v-model="internalPageSize"
|
|
@@ -228,5 +218,16 @@ watch(() => props.pageSize, (value) => {
|
|
|
228
218
|
@blur="submitPageInput"
|
|
229
219
|
@keydown="onPageInputKeydown"
|
|
230
220
|
/>
|
|
221
|
+
|
|
222
|
+
<button
|
|
223
|
+
type="button"
|
|
224
|
+
class="pxd-page-number--next inline-flex aspect-square items-center justify-center rounded-md border border-transparent self-focus-ring outline-none enabled:cursor-pointer enabled:hover:bg-background-hover enabled:hover:text-foreground enabled:active:bg-background-active disabled:cursor-not-allowed disabled:border-gray-300 disabled:bg-gray-100 disabled:text-gray-700 motion-safe:transition-colors"
|
|
225
|
+
:class="pageItemSizeClass"
|
|
226
|
+
:disabled="disabled || modelValue >= pageCount"
|
|
227
|
+
:aria-label="configProvider.locale.pagination.next"
|
|
228
|
+
@click="setPage(modelValue + 1)"
|
|
229
|
+
>
|
|
230
|
+
<ChevronRightIcon class="size-4" aria-hidden="true" />
|
|
231
|
+
</button>
|
|
231
232
|
</nav>
|
|
232
233
|
</template>
|
|
@@ -13,8 +13,8 @@ declare const __VLS_export: import("vue").DefineComponent<PinInputProps, {
|
|
|
13
13
|
}>, {
|
|
14
14
|
length: number;
|
|
15
15
|
type: "numeric" | "alphabetic" | "alphanumeric" | "numeric-password" | "alphabetic-password" | "alphanumeric-password";
|
|
16
|
-
placeholder: string;
|
|
17
16
|
modelValue: string;
|
|
17
|
+
placeholder: string;
|
|
18
18
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
19
19
|
declare const _default: typeof __VLS_export;
|
|
20
20
|
export default _default;
|
|
@@ -53,10 +53,10 @@ const props = defineProps({
|
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
55
|
const emits = defineEmits(["change", "update:modelValue"]);
|
|
56
|
-
const
|
|
56
|
+
const NUMERIC_REGEX = /^\d+$/;
|
|
57
|
+
const ALPHABETIC_REGEX = /^[a-z]+$/i;
|
|
58
|
+
const ALPHANUMERIC_REGEX = /^[0-9a-z]+$/i;
|
|
57
59
|
const inputsRef = shallowRef([]);
|
|
58
|
-
const modelValue = useModelValue(props, emits);
|
|
59
|
-
let localValue = modelValue.value;
|
|
60
60
|
const computedInputType = computed(() => {
|
|
61
61
|
const { type } = props;
|
|
62
62
|
if (type.includes("password")) {
|
|
@@ -69,6 +69,9 @@ const computedInputType = computed(() => {
|
|
|
69
69
|
const computedInputMode = computed(() => {
|
|
70
70
|
return props.type.includes("numeric") ? "numeric" : "text";
|
|
71
71
|
});
|
|
72
|
+
const configProvider = useConfigProvider();
|
|
73
|
+
const modelValue = useModelValue(props, emits);
|
|
74
|
+
let localValue = modelValue.value;
|
|
72
75
|
const { classes } = useTailwindVariant({
|
|
73
76
|
base: "pxd-input--border rounded-md motion-safe:transition-appearance",
|
|
74
77
|
variants: {
|
|
@@ -152,9 +155,6 @@ function onCompositionEnd(ev) {
|
|
|
152
155
|
}
|
|
153
156
|
setInputValue("", index);
|
|
154
157
|
}
|
|
155
|
-
const NUMERIC_REGEX = /^\d+$/;
|
|
156
|
-
const ALPHABETIC_REGEX = /^[a-z]+$/i;
|
|
157
|
-
const ALPHANUMERIC_REGEX = /^[0-9a-z]+$/i;
|
|
158
158
|
function validateInputValue(value) {
|
|
159
159
|
if (!value) {
|
|
160
160
|
return false;
|
|
@@ -6,7 +6,7 @@ import { useDelayDestroy } from "../../composables/use-delay-destroy.js";
|
|
|
6
6
|
import { useOutsideClick } from "../../composables/use-outside-click.js";
|
|
7
7
|
import { useConfigProvider } from "../../contexts/config-provider.js";
|
|
8
8
|
import { throttleByRaf } from "../../utils/event.js";
|
|
9
|
-
import { getCssUnitValue, toArray } from "../../utils/format.js";
|
|
9
|
+
import { getCssUnitValue, isTruthyProp, toArray } from "../../utils/format.js";
|
|
10
10
|
import PPopoverArrow from "../_internal/popover-arrow.vue";
|
|
11
11
|
import POverlay from "../overlay/index.vue";
|
|
12
12
|
defineOptions({
|
|
@@ -113,6 +113,10 @@ const props = defineProps({
|
|
|
113
113
|
type: [Object, String],
|
|
114
114
|
required: false
|
|
115
115
|
},
|
|
116
|
+
ariaLabelledby: {
|
|
117
|
+
type: String,
|
|
118
|
+
required: false
|
|
119
|
+
},
|
|
116
120
|
toggleOnTrigger: {
|
|
117
121
|
type: Boolean,
|
|
118
122
|
required: false,
|
|
@@ -138,6 +142,11 @@ const props = defineProps({
|
|
|
138
142
|
required: false,
|
|
139
143
|
default: true
|
|
140
144
|
},
|
|
145
|
+
closeOnOutsideClick: {
|
|
146
|
+
type: Boolean,
|
|
147
|
+
required: false,
|
|
148
|
+
default: true
|
|
149
|
+
},
|
|
141
150
|
lockScrollOnVisible: {
|
|
142
151
|
type: Boolean,
|
|
143
152
|
required: false
|
|
@@ -162,6 +171,7 @@ let showPopoverTimer;
|
|
|
162
171
|
let hidePopoverTimer;
|
|
163
172
|
let triggerElementsCache = null;
|
|
164
173
|
let cleanupAutoUpdate = null;
|
|
174
|
+
const throttledUpdatePosition = throttleByRaf(updatePosition);
|
|
165
175
|
const arrowRef = shallowRef(null);
|
|
166
176
|
const triggerRef = shallowRef(null);
|
|
167
177
|
const wrapperRef = shallowRef(null);
|
|
@@ -169,7 +179,6 @@ const activeTriggerRef = shallowRef(null);
|
|
|
169
179
|
const activeTriggerIndex = shallowRef(-1);
|
|
170
180
|
const hasMultipleTriggers = shallowRef(false);
|
|
171
181
|
const pointerPosition = shallowRef(null);
|
|
172
|
-
const localPosition = shallowRef(props.position);
|
|
173
182
|
const pointReference = { getBoundingClientRect() {
|
|
174
183
|
const { x = 0, y = 0 } = pointerPosition.value ?? {};
|
|
175
184
|
return {
|
|
@@ -184,7 +193,9 @@ const pointReference = { getBoundingClientRect() {
|
|
|
184
193
|
toJSON: () => ({})
|
|
185
194
|
};
|
|
186
195
|
} };
|
|
196
|
+
const localPosition = shallowRef(props.position);
|
|
187
197
|
const triggerMethods = computed(() => toArray(props.trigger));
|
|
198
|
+
const isManual = computed(() => triggerMethods.value.includes("manual"));
|
|
188
199
|
const transitionType = computed(() => props.adaptive ? "fade-slide" : "fade-scale");
|
|
189
200
|
const popoverMaxWidth = computed(() => getCssUnitValue(props.maxWidth));
|
|
190
201
|
const wrapperStyle = computed(() => ({
|
|
@@ -193,9 +204,17 @@ const wrapperStyle = computed(() => ({
|
|
|
193
204
|
"--popover-arrow-color": props.arrowColor,
|
|
194
205
|
"--popover-max-width": popoverMaxWidth.value
|
|
195
206
|
}));
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const
|
|
207
|
+
// Hover popovers must not steal focus. Click-triggered popovers keep the trap for Tab
|
|
208
|
+
// containment, but only auto-focus when the caller asked for it.
|
|
209
|
+
const shouldTrapFocus = computed(() => isTruthyProp(props.autoFocusElement) || triggerMethods.value.includes("click"));
|
|
210
|
+
const focusTrapContainer = computed(() => isVisible.value && shouldTrapFocus.value ? wrapperRef.value : null);
|
|
211
|
+
const overlayZIndex = computed(() => {
|
|
212
|
+
if (props.zIndex === undefined || props.zIndex === "") {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const value = Number(props.zIndex);
|
|
216
|
+
return Number.isFinite(value) ? value : undefined;
|
|
217
|
+
});
|
|
199
218
|
const triggerPointerMoveFn = computed(() => props.alignPoint ? onTriggerPointerMove : undefined);
|
|
200
219
|
const computePositionMiddleware = computed(() => {
|
|
201
220
|
return [
|
|
@@ -206,10 +225,11 @@ const computePositionMiddleware = computed(() => {
|
|
|
206
225
|
props.closeOnInvisible && hide({ strategy: "referenceHidden" })
|
|
207
226
|
];
|
|
208
227
|
});
|
|
228
|
+
const configProvider = useConfigProvider();
|
|
209
229
|
const { render: isRender, visible: isVisible, show: showPopover, hide: hidePopover } = useDelayDestroy(props.modelValue, {
|
|
210
230
|
delay: () => props.destroyDelay,
|
|
211
231
|
visibleChange(v) {
|
|
212
|
-
if (
|
|
232
|
+
if (isManual.value) {
|
|
213
233
|
return;
|
|
214
234
|
}
|
|
215
235
|
emits("visible-change", v);
|
|
@@ -222,18 +242,22 @@ const { render: isRender, visible: isVisible, show: showPopover, hide: hidePopov
|
|
|
222
242
|
}
|
|
223
243
|
}
|
|
224
244
|
});
|
|
225
|
-
useFocusTrap(focusTrapContainer, () =>
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
245
|
+
useFocusTrap(focusTrapContainer, () => {
|
|
246
|
+
const options = {
|
|
247
|
+
autoFocusElement: props.autoFocusElement,
|
|
248
|
+
returnFocusOnDeactivate: props.returnFocusOnDeactivate
|
|
249
|
+
};
|
|
250
|
+
return isTruthyProp(props.autoFocusElement) ? options : {
|
|
251
|
+
...options,
|
|
252
|
+
initialFocus: false
|
|
253
|
+
};
|
|
254
|
+
});
|
|
229
255
|
useOutsideClick(wrapperRef, {
|
|
230
256
|
allowList: [triggerRef, wrapperRef],
|
|
231
|
-
enabled: () =>
|
|
232
|
-
return isVisible.value && allowOutsideClick.value;
|
|
233
|
-
},
|
|
257
|
+
enabled: () => isVisible.value,
|
|
234
258
|
onTrigger: (ev) => {
|
|
235
259
|
emits("outside-click", ev);
|
|
236
|
-
if (
|
|
260
|
+
if (!isManual.value && props.closeOnOutsideClick) {
|
|
237
261
|
handlePopoverHide();
|
|
238
262
|
}
|
|
239
263
|
}
|
|
@@ -361,7 +385,7 @@ async function updatePosition() {
|
|
|
361
385
|
middleware: computePositionMiddleware.value
|
|
362
386
|
});
|
|
363
387
|
localPosition.value = placement;
|
|
364
|
-
if (middlewareData.hide?.referenceHidden || middlewareData.hide?.escaped) {
|
|
388
|
+
if (!isManual.value && (middlewareData.hide?.referenceHidden || middlewareData.hide?.escaped)) {
|
|
365
389
|
handlePopoverHide(true);
|
|
366
390
|
return;
|
|
367
391
|
}
|
|
@@ -378,7 +402,6 @@ async function updatePosition() {
|
|
|
378
402
|
});
|
|
379
403
|
}
|
|
380
404
|
}
|
|
381
|
-
const throttledUpdatePosition = throttleByRaf(updatePosition);
|
|
382
405
|
async function handlePopoverShow() {
|
|
383
406
|
if (showPopoverTimer || props.disabled) {
|
|
384
407
|
return;
|
|
@@ -399,7 +422,9 @@ async function handlePopoverShow() {
|
|
|
399
422
|
}
|
|
400
423
|
function handlePopoverEscape(ev) {
|
|
401
424
|
emits("escape", ev);
|
|
402
|
-
|
|
425
|
+
if (!isManual.value) {
|
|
426
|
+
handlePopoverHide();
|
|
427
|
+
}
|
|
403
428
|
}
|
|
404
429
|
async function handlePopoverHide(immediate = false) {
|
|
405
430
|
if (hidePopoverTimer) {
|
|
@@ -577,6 +602,7 @@ defineExpose({
|
|
|
577
602
|
|
|
578
603
|
<POverlay
|
|
579
604
|
:model-value="isVisible"
|
|
605
|
+
:z-index="overlayZIndex"
|
|
580
606
|
:show-overlay="adaptive"
|
|
581
607
|
:close-on-press-escape="closeOnPressEscape"
|
|
582
608
|
:lock-scroll-on-visible="lockScrollOnVisible"
|
|
@@ -586,14 +612,16 @@ defineExpose({
|
|
|
586
612
|
v-if="isRender"
|
|
587
613
|
ref="wrapperRef"
|
|
588
614
|
tabindex="-1"
|
|
615
|
+
role="dialog"
|
|
616
|
+
aria-modal="true"
|
|
589
617
|
:data-visible="isVisible"
|
|
590
618
|
:data-adaptive="adaptive"
|
|
591
619
|
:data-position="localPosition"
|
|
592
620
|
:data-interactive="interactive"
|
|
593
|
-
:data-multiple-triggers="hasMultipleTriggers"
|
|
594
621
|
:class="wrapperClass"
|
|
595
622
|
:style="wrapperStyle"
|
|
596
|
-
|
|
623
|
+
:aria-labelledby="ariaLabelledby"
|
|
624
|
+
class="pxd-popover--wrapper sm:max-w-(--popover-max-width) absolute -top-full -left-full isolate z-(--popover-index) flex max-h-full max-w-full will-change-transform outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none data-[visible=false]:transition-none! motion-reduce:data-[visible=false]:hidden"
|
|
597
625
|
@keydown="onWrapperKeydown"
|
|
598
626
|
@pointerenter="onWrapperPointerEnter"
|
|
599
627
|
@pointerleave="onWrapperPointerLeave"
|
|
@@ -619,7 +647,7 @@ defineExpose({
|
|
|
619
647
|
<div
|
|
620
648
|
v-if="showArrow"
|
|
621
649
|
ref="arrowRef"
|
|
622
|
-
class="pxd-popover--arrow pointer-events-none absolute z-1
|
|
650
|
+
class="pxd-popover--arrow pointer-events-none absolute z-1"
|
|
623
651
|
>
|
|
624
652
|
<PPopoverArrow
|
|
625
653
|
fill="var(--popover-arrow-color,transparent)"
|
|
@@ -634,5 +662,5 @@ defineExpose({
|
|
|
634
662
|
</template>
|
|
635
663
|
|
|
636
664
|
<style>
|
|
637
|
-
.pxd-popover--wrapper{--popover-padding:calc(var(--popover-offset, 8)*1px)}.pxd-popover--wrapper .pxd-popover--
|
|
665
|
+
.pxd-popover--wrapper{--popover-padding:calc(var(--popover-offset, 8)*1px);--popover-origin:center}.pxd-popover--wrapper[data-position=top]{--popover-origin:center bottom}.pxd-popover--wrapper[data-position=top-start]{--popover-origin:left bottom}.pxd-popover--wrapper[data-position=top-end]{--popover-origin:right bottom}.pxd-popover--wrapper[data-position=bottom]{--popover-origin:center top}.pxd-popover--wrapper[data-position=bottom-start]{--popover-origin:left top}.pxd-popover--wrapper[data-position=bottom-end]{--popover-origin:right top}.pxd-popover--wrapper[data-position=left]{--popover-origin:right center}.pxd-popover--wrapper[data-position=left-start]{--popover-origin:right top}.pxd-popover--wrapper[data-position=left-end]{--popover-origin:right bottom}.pxd-popover--wrapper[data-position=right]{--popover-origin:left center}.pxd-popover--wrapper[data-position=right-start]{--popover-origin:left top}.pxd-popover--wrapper[data-position=right-end]{--popover-origin:left bottom}.pxd-popover--wrapper[data-position^=top][data-adaptive=false]{padding-bottom:var(--popover-padding)}.pxd-popover--wrapper[data-position^=top] .pxd-popover--arrow{bottom:-6px}.pxd-popover--wrapper[data-position^=bottom][data-adaptive=false]{padding-top:var(--popover-padding)}.pxd-popover--wrapper[data-position^=bottom] .pxd-popover--arrow{top:-6px}.pxd-popover--wrapper[data-position^=left][data-adaptive=false]{padding-right:var(--popover-padding)}.pxd-popover--wrapper[data-position^=left] .pxd-popover--arrow{right:-6px}.pxd-popover--wrapper[data-position^=right][data-adaptive=false]{padding-left:var(--popover-padding)}.pxd-popover--wrapper[data-position^=right] .pxd-popover--arrow{left:-6px}.pxd-popover--wrapper .pxd-popover--content.variant-invert+.pxd-popover--arrow{--popover-arrow-border:var(--color-gray-300)}.pxd-popover--wrapper .pxd-popover--container{max-height:min(800px,80vh);max-height:min(800px,80dvh);transform-origin:var(--popover-origin);transition-property:opacity,transform}.pxd-popover--wrapper[data-visible=true] .pxd-popover--container{opacity:1;pointer-events:auto}.pxd-popover--wrapper[data-visible=false] .pxd-popover--container[data-transition-type=fade-scale]{opacity:0;transform:scale(var(--popover-scale));transition-duration:var(--faster-transition-duration)}.pxd-popover--wrapper[data-visible=false] .pxd-popover--container[data-transition-type=fade-slide]{transform:translateY(100%);transition-duration:var(--faster-transition-duration)}
|
|
638
666
|
</style>
|