pxd 0.0.61 → 0.0.62
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/LICENSE +21 -0
- package/dist/components/_internal/dismiss-container.d.vue.ts +28 -0
- package/dist/components/_internal/dismiss-container.vue +162 -0
- package/dist/components/_internal/popover-arrow.d.vue.ts +9 -0
- package/dist/components/_internal/popover-arrow.vue +38 -0
- package/dist/components/active-graph/index.vue +4 -4
- package/dist/components/avatar/index.vue +5 -7
- package/dist/components/avatar-group/index.d.vue.ts +0 -1
- package/dist/components/avatar-group/index.vue +1 -1
- package/dist/components/backtop/index.vue +1 -1
- package/dist/components/badge/index.d.vue.ts +6 -2
- package/dist/components/badge/index.vue +18 -4
- package/dist/components/badge/types.d.ts +5 -0
- package/dist/components/book/index.vue +1 -1
- package/dist/components/browser/index.vue +1 -1
- package/dist/components/bubble/index.d.vue.ts +22 -0
- package/dist/components/bubble/index.vue +59 -0
- package/dist/components/bubble/types.d.ts +6 -0
- package/dist/components/button/index.d.vue.ts +0 -2
- package/dist/components/button/index.vue +30 -21
- package/dist/components/button/types.d.ts +3 -2
- package/dist/components/button-group/index.d.vue.ts +14 -0
- package/dist/components/button-group/index.vue +26 -0
- package/dist/components/button-group/types.d.ts +9 -0
- package/dist/components/carousel/index.d.vue.ts +3 -3
- package/dist/components/carousel/index.vue +146 -113
- package/dist/components/carousel/types.d.ts +1 -1
- package/dist/components/carousel-item/index.vue +22 -17
- package/dist/components/checkbox/index.vue +6 -6
- package/dist/components/checkbox-group/index.d.vue.ts +1 -1
- package/dist/components/chip/index.d.vue.ts +1 -5
- package/dist/components/chip/index.vue +4 -4
- package/dist/components/color-selector/index.d.vue.ts +12 -0
- package/dist/components/color-selector/index.vue +64 -0
- package/dist/components/color-selector/types.d.ts +12 -0
- package/dist/components/command-menu/index.d.vue.ts +6 -6
- package/dist/components/command-menu/index.vue +23 -32
- package/dist/components/command-menu/types.d.ts +1 -1
- package/dist/components/command-menu-group/index.vue +15 -6
- package/dist/components/command-menu-group/types.d.ts +1 -1
- package/dist/components/countdown/index.d.vue.ts +11 -11
- package/dist/components/drawer/index.d.vue.ts +8 -8
- package/dist/components/drawer/index.vue +13 -10
- package/dist/components/drawer/types.d.ts +4 -3
- package/dist/components/ellipsis-text/index.d.vue.ts +4 -1
- package/dist/components/ellipsis-text/index.vue +84 -107
- package/dist/components/ellipsis-text/types.d.ts +2 -1
- package/dist/components/error/index.vue +1 -1
- package/dist/components/fader/index.vue +5 -9
- package/dist/components/gauge/index.vue +34 -29
- package/dist/components/grid/index.vue +1 -1
- package/dist/components/grid-item/index.vue +1 -1
- package/dist/components/hold-button/index.d.vue.ts +8 -10
- package/dist/components/hold-button/index.vue +20 -29
- package/dist/components/hold-button/types.d.ts +5 -6
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.js +7 -0
- package/dist/components/input/index.d.vue.ts +8 -8
- package/dist/components/input/index.vue +5 -4
- package/dist/components/intersection-observer/index.vue +4 -4
- package/dist/components/kbd/index.vue +1 -1
- package/dist/components/link-button/index.d.vue.ts +4 -4
- package/dist/components/link-button/index.vue +9 -8
- package/dist/components/link-button/types.d.ts +0 -3
- package/dist/components/list/index.d.vue.ts +10 -15
- package/dist/components/list/index.vue +58 -131
- package/dist/components/list/types.d.ts +4 -4
- package/dist/components/list-item/index.d.vue.ts +2 -2
- package/dist/components/list-item/index.vue +44 -39
- package/dist/components/loading-bar/index.vue +8 -7
- package/dist/components/material/index.vue +24 -46
- package/dist/components/menu/index.d.vue.ts +6 -8
- package/dist/components/menu/index.vue +18 -24
- package/dist/components/menu/types.d.ts +1 -2
- package/dist/components/message/composables/use-group-expand.d.ts +13 -0
- package/dist/components/message/composables/use-group-expand.js +50 -0
- package/dist/components/message/composables/use-message-timer.d.ts +9 -0
- package/dist/components/message/composables/use-message-timer.js +61 -0
- package/dist/components/message/composables/use-promise-message.d.ts +4 -0
- package/dist/components/message/composables/use-promise-message.js +49 -0
- package/dist/components/message/index.d.vue.ts +6 -33
- package/dist/components/message/index.vue +33 -185
- package/dist/components/message/types.d.ts +2 -2
- package/dist/components/message-item/index.vue +26 -2
- package/dist/components/modal/index.d.vue.ts +7 -7
- package/dist/components/modal/index.vue +7 -3
- package/dist/components/modal/types.d.ts +7 -3
- package/dist/components/note/index.vue +2 -2
- package/dist/components/number-input/index.d.vue.ts +5 -4
- package/dist/components/number-input/index.vue +3 -0
- package/dist/components/number-input/types.d.ts +1 -0
- package/dist/components/overlay/index.d.vue.ts +6 -3
- package/dist/components/overlay/index.vue +63 -68
- package/dist/components/overlay/types.d.ts +5 -4
- package/dist/components/pagination/index.vue +2 -2
- package/dist/components/pin-input/index.d.vue.ts +1 -1
- package/dist/components/pin-input/index.vue +7 -6
- package/dist/components/placeholder/index.vue +1 -1
- package/dist/components/popover/index.d.vue.ts +7 -8
- package/dist/components/popover/index.vue +149 -239
- package/dist/components/popover/types.d.ts +5 -5
- package/dist/components/progress/index.vue +1 -1
- package/dist/components/radio/index.vue +2 -2
- package/dist/components/resizable/index.vue +43 -51
- package/dist/components/resizable/types.d.ts +1 -1
- package/dist/components/resizable-handle/index.d.vue.ts +4 -1
- package/dist/components/resizable-handle/index.vue +29 -3
- package/dist/components/resizable-panel/index.vue +3 -7
- package/dist/components/scalable-text/index.d.vue.ts +9 -0
- package/dist/components/scalable-text/index.vue +147 -0
- package/dist/components/scalable-text/types.d.ts +12 -0
- package/dist/components/scrollable/index.d.vue.ts +2 -2
- package/dist/components/scrollable/index.vue +4 -3
- package/dist/components/separator/index.d.vue.ts +6 -0
- package/dist/components/separator/index.vue +18 -0
- package/dist/components/separator/types.d.ts +5 -0
- package/dist/components/skeleton/index.d.vue.ts +1 -1
- package/dist/components/slider/index.d.vue.ts +1 -1
- package/dist/components/slider/index.vue +39 -7
- package/dist/components/snippet/index.vue +16 -13
- package/dist/components/spinner/index.vue +3 -1
- package/dist/components/stack/index.d.vue.ts +1 -1
- package/dist/components/stack/index.vue +1 -1
- package/dist/components/switch/index.d.vue.ts +1 -1
- package/dist/components/switch/index.vue +4 -3
- package/dist/components/switch-item/index.vue +1 -1
- package/dist/components/tabs/index.d.vue.ts +12 -0
- package/dist/components/tabs/index.vue +270 -0
- package/dist/components/tabs/types.d.ts +12 -0
- package/dist/components/tabs-item/index.d.vue.ts +4 -0
- package/dist/components/tabs-item/index.vue +16 -0
- package/dist/components/tabs-item/types.d.ts +10 -0
- package/dist/components/text/index.vue +1 -1
- package/dist/components/textarea/index.d.vue.ts +2 -2
- package/dist/components/textarea/index.vue +1 -1
- package/dist/components/time-picker/index.d.vue.ts +3 -5
- package/dist/components/time-picker/index.vue +53 -45
- package/dist/components/time-picker/types.d.ts +1 -2
- package/dist/components/toggle/index.d.vue.ts +0 -2
- package/dist/components/toggle/index.vue +6 -6
- package/dist/components/toggle-button/index.vue +8 -6
- package/dist/components/tooltip/index.d.vue.ts +1 -1
- package/dist/components/tooltip/index.vue +19 -11
- package/dist/components/tooltip/types.d.ts +2 -2
- package/dist/components/virtual-list/index.d.vue.ts +8 -8
- package/dist/components/virtual-list/index.vue +27 -5
- package/dist/components/virtual-list/types.d.ts +3 -0
- package/dist/composables/index.d.ts +4 -1
- package/dist/composables/index.js +4 -1
- package/dist/composables/use-browser-observer.js +2 -2
- package/dist/composables/use-client-online.js +2 -2
- package/dist/composables/use-color-scheme.js +2 -2
- package/dist/composables/use-countdown.js +3 -2
- package/dist/composables/use-deferred-value.js +2 -2
- package/dist/composables/use-delay-destroy.js +11 -6
- package/dist/composables/use-document-hidden.js +2 -2
- package/dist/composables/use-focus-trap.js +2 -2
- package/dist/composables/use-list-filter.d.ts +11 -0
- package/dist/composables/use-list-filter.js +56 -0
- package/dist/composables/use-list-navigation.d.ts +27 -0
- package/dist/composables/use-list-navigation.js +159 -0
- package/dist/composables/use-lock-scroll.js +12 -12
- package/dist/composables/use-media-query.js +2 -2
- package/dist/composables/use-outside-click.d.ts +1 -1
- package/dist/composables/use-outside-click.js +8 -11
- package/dist/composables/use-overlay-manager.d.ts +18 -0
- package/dist/composables/use-overlay-manager.js +80 -0
- package/dist/composables/use-popover-responsive.d.ts +6 -8
- package/dist/composables/use-popover-responsive.js +9 -12
- package/dist/composables/use-repeat-action.js +2 -2
- package/dist/composables/use-swipe-gesture.d.ts +65 -0
- package/dist/composables/use-swipe-gesture.js +99 -0
- package/dist/composables/use-virtual-list.d.ts +5 -3
- package/dist/composables/use-virtual-list.js +25 -14
- package/dist/composables/use-window-size.js +2 -2
- package/dist/constants/size.d.ts +12 -0
- package/dist/constants/size.js +12 -0
- package/dist/contexts/button.d.ts +5 -0
- package/dist/contexts/button.js +5 -0
- package/dist/contexts/carousel.d.ts +2 -1
- package/dist/contexts/list.d.ts +23 -3
- package/dist/contexts/list.js +6 -2
- package/dist/contexts/resizable.d.ts +3 -11
- package/dist/contexts/tabs.d.ts +15 -0
- package/dist/contexts/tabs.js +2 -0
- package/dist/locales/en-us.d.ts +4 -4
- package/dist/locales/en-us.js +4 -4
- package/dist/locales/zh-cn.d.ts +4 -4
- package/dist/locales/zh-cn.js +4 -4
- package/dist/plugins/dayjs-millisecond-token.js +1 -1
- package/dist/styles/source.css +133 -128
- package/dist/styles/styles.css +2 -2
- package/dist/styles/tw.css +133 -128
- package/dist/types/shared/props.d.ts +1 -0
- package/dist/types/shared/utils.d.ts +1 -4
- package/dist/utils/date.d.ts +3 -3
- package/dist/utils/dom.d.ts +1 -0
- package/dist/utils/dom.js +4 -0
- package/dist/utils/event.d.ts +2 -1
- package/dist/utils/event.js +7 -1
- package/dist/utils/format.d.ts +3 -3
- package/dist/utils/format.js +5 -4
- package/dist/utils/fuzzy-search.d.ts +7 -0
- package/dist/utils/fuzzy-search.js +61 -0
- package/dist/utils/get.d.ts +2 -0
- package/dist/utils/get.js +15 -1
- package/dist/utils/index.d.ts +10 -11
- package/dist/utils/index.js +2 -3
- package/dist/utils/ref.d.ts +2 -2
- package/dist/utils/{throttle.d.ts → timing.d.ts} +1 -0
- package/dist/utils/{throttle.js → timing.js} +4 -2
- package/package.json +67 -63
- package/volar.d.ts +7 -0
- package/dist/components/overlay/overlay-stack.d.ts +0 -3
- package/dist/components/overlay/overlay-stack.js +0 -17
- package/dist/composables/use-pointer-gesture.d.ts +0 -180
- package/dist/composables/use-pointer-gesture.js +0 -406
- package/dist/utils/debounce.d.ts +0 -1
- package/dist/utils/debounce.js +0 -1
- package/dist/utils/regexp.d.ts +0 -8
- package/dist/utils/regexp.js +0 -8
- package/dist/utils/responsive.d.ts +0 -3
- package/dist/utils/responsive.js +0 -14
|
@@ -2,106 +2,104 @@
|
|
|
2
2
|
import { arrow, autoUpdate, computePosition, flip, shift, hide } from "@floating-ui/dom";
|
|
3
3
|
import { computed, onBeforeUnmount, shallowRef, watch } from "vue";
|
|
4
4
|
import { useDelayDestroy } from "../../composables/use-delay-destroy";
|
|
5
|
-
import {
|
|
5
|
+
import { useFocusTrap } from "../../composables/use-focus-trap";
|
|
6
6
|
import { useOutsideClick } from "../../composables/use-outside-click";
|
|
7
7
|
import { useConfigProvider } from "../../contexts/config-provider";
|
|
8
|
-
import { debounce } from "../../utils/debounce";
|
|
9
|
-
import { cachedOff, cachedOn, sleep } from "../../utils/event";
|
|
10
8
|
import { getCssUnitValue, toArray } from "../../utils/format";
|
|
11
|
-
import
|
|
9
|
+
import PPopoverArrow from "../_internal/popover-arrow.vue";
|
|
10
|
+
import POverlay from "../overlay/index.vue";
|
|
12
11
|
defineOptions({
|
|
13
12
|
name: "PPopover",
|
|
14
|
-
inheritAttrs: false
|
|
13
|
+
inheritAttrs: false,
|
|
14
|
+
model: {
|
|
15
|
+
prop: "modelValue",
|
|
16
|
+
event: "update:modelValue"
|
|
17
|
+
}
|
|
15
18
|
});
|
|
16
19
|
const props = defineProps({
|
|
17
20
|
zIndex: { type: [Number, String], required: false },
|
|
18
|
-
offset: { type: Number, required: false
|
|
19
|
-
visible: { type: Boolean, required: false },
|
|
21
|
+
offset: { type: Number, required: false },
|
|
20
22
|
trigger: { type: [String, Array], required: false, default: () => ["hover"] },
|
|
21
23
|
disabled: { type: Boolean, required: false },
|
|
24
|
+
adaptive: { type: Boolean, required: false },
|
|
22
25
|
maxWidth: { type: [Number, String], required: false },
|
|
23
26
|
position: { type: null, required: false, default: "bottom" },
|
|
24
27
|
showDelay: { type: Number, required: false, default: 0 },
|
|
25
28
|
hideDelay: { type: Number, required: false, default: 0 },
|
|
26
29
|
showArrow: { type: Boolean, required: false },
|
|
27
|
-
arrowColor: { type: String, required: false
|
|
30
|
+
arrowColor: { type: String, required: false },
|
|
31
|
+
modelValue: { type: Boolean, required: false },
|
|
28
32
|
interactive: { type: Boolean, required: false, default: true },
|
|
29
33
|
autoPosition: { type: Boolean, required: false, default: true },
|
|
30
34
|
wrapperClass: { type: [String, Array, Object], required: false },
|
|
31
35
|
contentClass: { type: [String, Array, Object], required: false },
|
|
32
36
|
contentStyle: { type: [Object, String], required: false },
|
|
33
|
-
unsetPosition: { type: Boolean, required: false, default: false },
|
|
34
|
-
transitionType: { type: String, required: false, default: "fade-scale" },
|
|
35
37
|
toggleOnTrigger: { type: Boolean, required: false, default: true },
|
|
36
38
|
closeOnInvisible: { type: Boolean, required: false, default: true },
|
|
37
|
-
closeOnPressEscape: { type: Boolean, required: false },
|
|
39
|
+
closeOnPressEscape: { type: Boolean, required: false, default: true },
|
|
38
40
|
lockScrollOnVisible: { type: Boolean, required: false }
|
|
39
41
|
});
|
|
40
|
-
const emits = defineEmits(["show", "hide", "escape", "outside-click", "trigger-click", "visible-change"]);
|
|
41
|
-
let isLockedScroll = false;
|
|
42
|
+
const emits = defineEmits(["show", "hide", "escape", "outside-click", "trigger-click", "visible-change", "update:modelValue"]);
|
|
42
43
|
let showPopoverTimer;
|
|
43
44
|
let hidePopoverTimer;
|
|
44
45
|
let cleanupAutoUpdate = null;
|
|
45
|
-
const
|
|
46
|
-
const arrayRef = shallowRef(null);
|
|
46
|
+
const arrowRef = shallowRef(null);
|
|
47
47
|
const triggerRef = shallowRef(null);
|
|
48
48
|
const wrapperRef = shallowRef(null);
|
|
49
49
|
const localPosition = shallowRef(props.position);
|
|
50
50
|
const triggerMethods = computed(() => toArray(props.trigger));
|
|
51
|
+
const transitionType = computed(() => props.adaptive ? "fade-slide" : "fade-scale");
|
|
51
52
|
const wrapperStyle = computed(() => ({
|
|
52
|
-
"
|
|
53
|
+
"--popover-index": props.zIndex,
|
|
53
54
|
"--popover-offset": props.offset,
|
|
54
|
-
"--popover-arrow-
|
|
55
|
+
"--popover-arrow-color": props.arrowColor,
|
|
55
56
|
"--popover-max-width": getCssUnitValue(props.maxWidth)
|
|
56
57
|
}));
|
|
57
58
|
const configProvider = useConfigProvider();
|
|
58
|
-
const
|
|
59
|
+
const allowOutsideClick = computed(() => !triggerMethods.value.includes("manual"));
|
|
60
|
+
const focusTrapContainer = computed(() => isVisible.value ? wrapperRef.value : null);
|
|
61
|
+
const computePositionMiddleware = computed(() => {
|
|
62
|
+
return [
|
|
63
|
+
shift(),
|
|
64
|
+
props.autoPosition && flip(),
|
|
65
|
+
props.showArrow && arrow({ element: arrowRef.value }),
|
|
66
|
+
props.closeOnInvisible && hide({ strategy: "referenceHidden" }),
|
|
67
|
+
props.closeOnInvisible && hide({ strategy: "escaped" })
|
|
68
|
+
];
|
|
69
|
+
});
|
|
59
70
|
const {
|
|
60
71
|
render: isRender,
|
|
61
72
|
visible: isVisible,
|
|
62
73
|
show: showPopover,
|
|
63
74
|
hide: hidePopover
|
|
64
|
-
} = useDelayDestroy(props.
|
|
75
|
+
} = useDelayDestroy(props.modelValue, {
|
|
65
76
|
delay: 2e3,
|
|
66
77
|
visibleChange(v) {
|
|
67
|
-
if (
|
|
78
|
+
if (!allowOutsideClick.value) {
|
|
68
79
|
return;
|
|
69
80
|
}
|
|
70
81
|
emits("visible-change", v);
|
|
71
82
|
if (v) {
|
|
72
|
-
if (props.lockScrollOnVisible) {
|
|
73
|
-
isLockedScroll = true;
|
|
74
|
-
lockScroll();
|
|
75
|
-
}
|
|
76
83
|
emits("show");
|
|
84
|
+
emits("update:modelValue", true);
|
|
77
85
|
} else {
|
|
78
|
-
if (isLockedScroll) {
|
|
79
|
-
isLockedScroll = false;
|
|
80
|
-
unlockScroll();
|
|
81
|
-
}
|
|
82
86
|
emits("hide");
|
|
87
|
+
emits("update:modelValue", false);
|
|
83
88
|
}
|
|
84
89
|
}
|
|
85
90
|
});
|
|
91
|
+
useFocusTrap(focusTrapContainer);
|
|
86
92
|
useOutsideClick(wrapperRef, {
|
|
93
|
+
allowList: [triggerRef, wrapperRef],
|
|
87
94
|
isEnabled: () => {
|
|
88
|
-
return isVisible.value &&
|
|
95
|
+
return isVisible.value && allowOutsideClick.value;
|
|
89
96
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
onTrigger: debounce(
|
|
95
|
-
(ev) => {
|
|
96
|
-
emits("outside-click", ev);
|
|
97
|
-
if (triggerMethods.value.includes("manual")) {
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
97
|
+
onTrigger: (ev) => {
|
|
98
|
+
emits("outside-click", ev);
|
|
99
|
+
if (allowOutsideClick.value) {
|
|
100
100
|
handlePopoverHide();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
{ edges: ["leading"] }
|
|
104
|
-
)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
105
103
|
});
|
|
106
104
|
function disposeAutoUpdate() {
|
|
107
105
|
if (cleanupAutoUpdate) {
|
|
@@ -115,13 +113,7 @@ async function updatePosition() {
|
|
|
115
113
|
wrapperRef.value,
|
|
116
114
|
{
|
|
117
115
|
placement: props.position,
|
|
118
|
-
middleware:
|
|
119
|
-
shift(),
|
|
120
|
-
props.autoPosition && flip(),
|
|
121
|
-
props.showArrow && arrow({ element: arrayRef.value }),
|
|
122
|
-
props.closeOnInvisible && hide({ strategy: "referenceHidden" }),
|
|
123
|
-
props.closeOnInvisible && hide({ strategy: "escaped" })
|
|
124
|
-
]
|
|
116
|
+
middleware: computePositionMiddleware.value
|
|
125
117
|
}
|
|
126
118
|
);
|
|
127
119
|
localPosition.value = placement;
|
|
@@ -129,13 +121,14 @@ async function updatePosition() {
|
|
|
129
121
|
handlePopoverHide(true);
|
|
130
122
|
return;
|
|
131
123
|
}
|
|
132
|
-
|
|
133
|
-
left: `${x}px`,
|
|
134
|
-
top: `${y}px`
|
|
135
|
-
}
|
|
124
|
+
const wrapperPositionStyle = {
|
|
125
|
+
left: props.adaptive ? "0" : `${x}px`,
|
|
126
|
+
top: props.adaptive ? "0" : `${y}px`
|
|
127
|
+
};
|
|
128
|
+
Object.assign(wrapperRef.value.style, wrapperPositionStyle);
|
|
136
129
|
if (middlewareData.arrow) {
|
|
137
130
|
const { x: arrowX, y: arrowY } = middlewareData.arrow;
|
|
138
|
-
Object.assign(
|
|
131
|
+
Object.assign(arrowRef.value.style, {
|
|
139
132
|
left: arrowX != null ? `${Math.max(arrowX, 5)}px` : "",
|
|
140
133
|
top: arrowY != null ? `${Math.max(arrowY, 5)}px` : ""
|
|
141
134
|
});
|
|
@@ -156,13 +149,6 @@ async function handlePopoverShow() {
|
|
|
156
149
|
}, props.showDelay);
|
|
157
150
|
});
|
|
158
151
|
await showPopover();
|
|
159
|
-
if (props.closeOnPressEscape) {
|
|
160
|
-
cachedOn(document, "keydown", onPopoverKeystroke);
|
|
161
|
-
}
|
|
162
|
-
if (props.unsetPosition) {
|
|
163
|
-
Object.assign(wrapperRef.value.style, { left: "0", top: "0" });
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
152
|
disposeAutoUpdate();
|
|
167
153
|
if (props.autoPosition) {
|
|
168
154
|
cleanupAutoUpdate = autoUpdate(triggerRef.value, wrapperRef.value, updatePosition);
|
|
@@ -172,7 +158,11 @@ async function handlePopoverShow() {
|
|
|
172
158
|
}
|
|
173
159
|
async function handlePopoverHide(immediate = false) {
|
|
174
160
|
if (hidePopoverTimer) {
|
|
175
|
-
|
|
161
|
+
if (!immediate) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
clearTimeout(hidePopoverTimer);
|
|
165
|
+
hidePopoverTimer = null;
|
|
176
166
|
}
|
|
177
167
|
await new Promise((resolve) => {
|
|
178
168
|
if (showPopoverTimer) {
|
|
@@ -188,22 +178,9 @@ async function handlePopoverHide(immediate = false) {
|
|
|
188
178
|
);
|
|
189
179
|
});
|
|
190
180
|
disposeAutoUpdate();
|
|
191
|
-
|
|
192
|
-
if (props.closeOnPressEscape) {
|
|
193
|
-
cachedOff(document, "keydown", onPopoverKeystroke);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
function onPopoverKeystroke(ev) {
|
|
197
|
-
if (ev.ctrlKey || ev.metaKey || ev.altKey || ev.shiftKey) {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (ev.key !== "Escape") {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
emits("escape", ev);
|
|
204
|
-
handlePopoverHide(true);
|
|
181
|
+
hidePopover();
|
|
205
182
|
}
|
|
206
|
-
|
|
183
|
+
function onTriggerClick(ev) {
|
|
207
184
|
if (props.disabled) {
|
|
208
185
|
return;
|
|
209
186
|
}
|
|
@@ -229,33 +206,27 @@ function onTriggerPointerLeave() {
|
|
|
229
206
|
}
|
|
230
207
|
handlePopoverHide();
|
|
231
208
|
}
|
|
232
|
-
function
|
|
233
|
-
if (props.disabled || !triggerMethods.value.includes("
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
handlePopoverShow();
|
|
237
|
-
}
|
|
238
|
-
async function onTriggerFocusout() {
|
|
239
|
-
if (props.disabled || !triggerMethods.value.includes("focus")) {
|
|
209
|
+
function onTriggerContextmenu() {
|
|
210
|
+
if (props.disabled || !triggerMethods.value.includes("contextmenu")) {
|
|
240
211
|
return;
|
|
241
212
|
}
|
|
242
|
-
|
|
243
|
-
|
|
213
|
+
if (isVisible.value) {
|
|
214
|
+
handlePopoverHide();
|
|
244
215
|
return;
|
|
245
216
|
}
|
|
246
|
-
|
|
217
|
+
handlePopoverShow();
|
|
247
218
|
}
|
|
248
|
-
|
|
249
|
-
|
|
219
|
+
const PREVENT_KEYS = /* @__PURE__ */ new Set(["ArrowUp", "ArrowDown", "Home", "End"]);
|
|
220
|
+
function onWrapperKeydown(ev) {
|
|
221
|
+
if (props.disabled || !isVisible.value) {
|
|
250
222
|
return;
|
|
251
223
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
224
|
+
const { key } = ev;
|
|
225
|
+
if (PREVENT_KEYS.has(key)) {
|
|
226
|
+
ev.preventDefault();
|
|
255
227
|
}
|
|
256
|
-
await handlePopoverShow();
|
|
257
228
|
}
|
|
258
|
-
function
|
|
229
|
+
function onWrapperPointerEnter() {
|
|
259
230
|
if (props.disabled) {
|
|
260
231
|
return;
|
|
261
232
|
}
|
|
@@ -264,7 +235,7 @@ function onContentPointerEnter() {
|
|
|
264
235
|
}
|
|
265
236
|
handlePopoverShow();
|
|
266
237
|
}
|
|
267
|
-
function
|
|
238
|
+
function onWrapperPointerLeave() {
|
|
268
239
|
if (props.disabled) {
|
|
269
240
|
return;
|
|
270
241
|
}
|
|
@@ -274,20 +245,16 @@ function onContentPointerLeave() {
|
|
|
274
245
|
handlePopoverHide();
|
|
275
246
|
}
|
|
276
247
|
watch(
|
|
277
|
-
() => props.
|
|
248
|
+
() => props.modelValue,
|
|
278
249
|
(visible) => {
|
|
279
250
|
if (visible) {
|
|
280
251
|
handlePopoverShow();
|
|
281
252
|
} else {
|
|
282
|
-
handlePopoverHide();
|
|
253
|
+
handlePopoverHide(true);
|
|
283
254
|
}
|
|
284
255
|
}
|
|
285
256
|
);
|
|
286
257
|
onBeforeUnmount(() => {
|
|
287
|
-
if (isLockedScroll) {
|
|
288
|
-
isLockedScroll = false;
|
|
289
|
-
unlockScroll();
|
|
290
|
-
}
|
|
291
258
|
disposeAutoUpdate();
|
|
292
259
|
});
|
|
293
260
|
defineExpose({
|
|
@@ -304,39 +271,39 @@ defineExpose({
|
|
|
304
271
|
:data-disabled="disabled"
|
|
305
272
|
v-bind="$attrs"
|
|
306
273
|
@click="onTriggerClick"
|
|
307
|
-
@focusin="onTriggerFocusin"
|
|
308
|
-
@focusout="onTriggerFocusout"
|
|
309
274
|
@pointerenter="onTriggerPointerEnter"
|
|
310
275
|
@pointerleave="onTriggerPointerLeave"
|
|
311
276
|
@contextmenu.prevent="onTriggerContextmenu"
|
|
312
277
|
>
|
|
313
278
|
<slot />
|
|
314
279
|
|
|
315
|
-
<
|
|
280
|
+
<POverlay
|
|
281
|
+
:model-value="isVisible"
|
|
282
|
+
:show-overlay="adaptive"
|
|
283
|
+
:close-on-press-escape="closeOnPressEscape"
|
|
284
|
+
:lock-scroll-on-visible="adaptive"
|
|
285
|
+
@escape="handlePopoverHide()"
|
|
286
|
+
>
|
|
316
287
|
<div
|
|
317
288
|
v-if="isRender"
|
|
318
289
|
ref="wrapperRef"
|
|
319
290
|
tabindex="-1"
|
|
320
|
-
:class="wrapperClass"
|
|
321
|
-
:style="wrapperStyle"
|
|
322
291
|
:data-visible="isVisible"
|
|
292
|
+
:data-adaptive="adaptive"
|
|
323
293
|
:data-position="localPosition"
|
|
324
294
|
:data-interactive="interactive"
|
|
325
|
-
:
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
@
|
|
295
|
+
:class="wrapperClass"
|
|
296
|
+
:style="wrapperStyle"
|
|
297
|
+
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 outline-none data-[interactive=false]:pointer-events-none data-[visible=false]:pointer-events-none motion-reduce:data-[visible=false]:hidden"
|
|
298
|
+
@keydown="onWrapperKeydown"
|
|
299
|
+
@pointerenter="onWrapperPointerEnter"
|
|
300
|
+
@pointerleave="onWrapperPointerLeave"
|
|
329
301
|
>
|
|
330
302
|
<div
|
|
331
|
-
class="pxd-popover--container
|
|
303
|
+
class="pxd-popover--container relative z-1 w-inherit default-transition-duration default-transition-timing-function"
|
|
332
304
|
:data-transition-type="transitionType"
|
|
333
305
|
:data-show-transition="configProvider.popoverShowTransition"
|
|
334
306
|
>
|
|
335
|
-
<i
|
|
336
|
-
v-if="showArrow"
|
|
337
|
-
ref="arrayRef"
|
|
338
|
-
class="pxd-popover--arrow absolute z-1 rotate-45 border-5 border-(--popover-arrow-bg)"
|
|
339
|
-
/>
|
|
340
307
|
<div
|
|
341
308
|
class="pxd-popover--content h-full max-h-inherit overflow-auto"
|
|
342
309
|
:class="contentClass"
|
|
@@ -344,146 +311,121 @@ defineExpose({
|
|
|
344
311
|
>
|
|
345
312
|
<slot name="content" />
|
|
346
313
|
</div>
|
|
314
|
+
|
|
315
|
+
<div
|
|
316
|
+
v-if="showArrow"
|
|
317
|
+
ref="arrowRef"
|
|
318
|
+
class="pxd-popover--arrow pointer-events-none absolute z-1"
|
|
319
|
+
>
|
|
320
|
+
<PPopoverArrow
|
|
321
|
+
fill="var(--popover-arrow-color,transparent)"
|
|
322
|
+
stroke="var(--popover-arrow-border,transparent)"
|
|
323
|
+
:position="localPosition"
|
|
324
|
+
/>
|
|
325
|
+
</div>
|
|
347
326
|
</div>
|
|
348
327
|
</div>
|
|
349
|
-
</
|
|
328
|
+
</POverlay>
|
|
350
329
|
</div>
|
|
351
330
|
</template>
|
|
352
331
|
|
|
353
332
|
<style lang="postcss">
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
opacity: 0;
|
|
357
|
-
pointer-events: none;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
100% {
|
|
361
|
-
opacity: 1;
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
@keyframes popover-fade-hide {
|
|
366
|
-
0% {
|
|
367
|
-
opacity: 1;
|
|
368
|
-
}
|
|
333
|
+
.pxd-popover--wrapper {
|
|
334
|
+
--popover-padding: calc(var(--popover-offset, 8) * 1px);
|
|
369
335
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
pointer-events: none;
|
|
336
|
+
.pxd-popover--content.border + .pxd-popover--arrow {
|
|
337
|
+
--popover-arrow-border: var(--color-gray-300);
|
|
373
338
|
}
|
|
374
|
-
}
|
|
375
339
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
pointer-events: none;
|
|
381
|
-
}
|
|
340
|
+
&[data-position^='top'] {
|
|
341
|
+
&[data-adaptive='false'] {
|
|
342
|
+
padding-bottom: var(--popover-padding);
|
|
343
|
+
}
|
|
382
344
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
345
|
+
.pxd-popover--arrow {
|
|
346
|
+
bottom: -6px;
|
|
347
|
+
}
|
|
386
348
|
}
|
|
387
|
-
}
|
|
388
349
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
}
|
|
350
|
+
&[data-position^='bottom'] {
|
|
351
|
+
&[data-adaptive='false'] {
|
|
352
|
+
padding-top: var(--popover-padding);
|
|
353
|
+
}
|
|
394
354
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
pointer-events: none;
|
|
355
|
+
.pxd-popover--arrow {
|
|
356
|
+
top: -6px;
|
|
357
|
+
}
|
|
399
358
|
}
|
|
400
|
-
}
|
|
401
359
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
pointer-events: none;
|
|
407
|
-
}
|
|
360
|
+
&[data-position^='left'] {
|
|
361
|
+
&[data-adaptive='false'] {
|
|
362
|
+
padding-right: var(--popover-padding);
|
|
363
|
+
}
|
|
408
364
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
365
|
+
.pxd-popover--arrow {
|
|
366
|
+
right: -6px;
|
|
367
|
+
}
|
|
412
368
|
}
|
|
413
|
-
}
|
|
414
369
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
370
|
+
&[data-position^='right'] {
|
|
371
|
+
&[data-adaptive='false'] {
|
|
372
|
+
padding-left: var(--popover-padding);
|
|
373
|
+
}
|
|
420
374
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
pointer-events: none;
|
|
375
|
+
.pxd-popover--arrow {
|
|
376
|
+
left: -6px;
|
|
377
|
+
}
|
|
425
378
|
}
|
|
426
379
|
}
|
|
427
380
|
|
|
428
381
|
.pxd-popover--container {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
382
|
+
transition-property: opacity, transform;
|
|
383
|
+
max-height: min(800px, 80vh);
|
|
384
|
+
max-height: min(800px, 80dvh);
|
|
385
|
+
pointer-events: none;
|
|
432
386
|
|
|
433
|
-
|
|
434
|
-
|
|
387
|
+
[data-visible='true'] & {
|
|
388
|
+
opacity: 1;
|
|
389
|
+
pointer-events: auto;
|
|
435
390
|
}
|
|
436
391
|
|
|
437
392
|
[data-visible='true'] &[data-show-transition='false'] {
|
|
438
|
-
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
[data-visible='true'] &[data-transition-type='fade'] {
|
|
442
|
-
animation-name: popover-fade-show;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
[data-visible='false'] &[data-transition-type='fade'] {
|
|
446
|
-
animation-name: popover-fade-hide;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
[data-visible='true'] &[data-transition-type='fade-scale'] {
|
|
450
|
-
animation-name: popover-fade-scale-show;
|
|
393
|
+
transition-duration: 0s !important;
|
|
451
394
|
}
|
|
452
395
|
|
|
453
396
|
[data-visible='false'] &[data-transition-type='fade-scale'] {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
[data-visible='true'] &[data-transition-type='fade-slide'] {
|
|
458
|
-
animation-name: popover-fade-slide-show;
|
|
397
|
+
opacity: 0;
|
|
398
|
+
transform: scale(var(--popover-scale));
|
|
399
|
+
transition-duration: var(--faster-transition-duration);
|
|
459
400
|
}
|
|
460
401
|
|
|
461
402
|
[data-visible='false'] &[data-transition-type='fade-slide'] {
|
|
462
|
-
|
|
403
|
+
transform: translateY(100%);
|
|
404
|
+
transition-duration: var(--faster-transition-duration);
|
|
463
405
|
}
|
|
464
406
|
|
|
465
407
|
[data-position='top'] & {
|
|
466
|
-
transform-origin:
|
|
408
|
+
transform-origin: center bottom;
|
|
467
409
|
}
|
|
468
410
|
|
|
469
411
|
[data-position='top-start'] & {
|
|
470
|
-
transform-origin:
|
|
412
|
+
transform-origin: left bottom;
|
|
471
413
|
}
|
|
472
414
|
|
|
473
415
|
[data-position='top-end'] & {
|
|
474
|
-
transform-origin:
|
|
416
|
+
transform-origin: right bottom;
|
|
475
417
|
}
|
|
476
418
|
|
|
477
419
|
[data-position='bottom'] & {
|
|
478
|
-
transform-origin: top
|
|
420
|
+
transform-origin: center top;
|
|
479
421
|
}
|
|
480
422
|
|
|
481
423
|
[data-position='bottom-start'] & {
|
|
482
|
-
transform-origin: top
|
|
424
|
+
transform-origin: left top;
|
|
483
425
|
}
|
|
484
426
|
|
|
485
427
|
[data-position='bottom-end'] & {
|
|
486
|
-
transform-origin: top
|
|
428
|
+
transform-origin: right top;
|
|
487
429
|
}
|
|
488
430
|
|
|
489
431
|
[data-position='left'] & {
|
|
@@ -509,37 +451,5 @@ defineExpose({
|
|
|
509
451
|
[data-position='right-end'] & {
|
|
510
452
|
transform-origin: left bottom;
|
|
511
453
|
}
|
|
512
|
-
|
|
513
|
-
[data-position^='top'][data-unset-position='false'] & {
|
|
514
|
-
padding-bottom: var(--popover-padding);
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
[data-position^='bottom'][data-unset-position='false'] & {
|
|
518
|
-
padding-top: var(--popover-padding);
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
[data-position^='left'][data-unset-position='false'] & {
|
|
522
|
-
padding-right: var(--popover-padding);
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
[data-position^='right'][data-unset-position='false'] & {
|
|
526
|
-
padding-left: var(--popover-padding);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
.pxd-popover--wrapper[data-position^='top'] .pxd-popover--arrow {
|
|
531
|
-
bottom: 4px;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
.pxd-popover--wrapper[data-position^='bottom'] .pxd-popover--arrow {
|
|
535
|
-
top: 4px;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
.pxd-popover--wrapper[data-position^='left'] .pxd-popover--arrow {
|
|
539
|
-
right: 4px;
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
.pxd-popover--wrapper[data-position^='right'] .pxd-popover--arrow {
|
|
543
|
-
left: 4px;
|
|
544
454
|
}
|
|
545
455
|
</style>
|
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
import type { ComponentClass, ComponentPosition } from '../../types/shared'
|
|
2
2
|
import type { CSSProperties } from 'vue'
|
|
3
3
|
|
|
4
|
-
export type PopoverTrigger = 'click' | 'hover' | '
|
|
4
|
+
export type PopoverTrigger = 'click' | 'hover' | 'contextmenu' | 'manual'
|
|
5
5
|
|
|
6
6
|
export interface PopoverProps {
|
|
7
7
|
zIndex?: number | string
|
|
8
8
|
offset?: number
|
|
9
|
-
visible?: boolean
|
|
10
9
|
trigger?: PopoverTrigger | PopoverTrigger[]
|
|
11
10
|
disabled?: boolean
|
|
11
|
+
adaptive?: boolean
|
|
12
12
|
maxWidth?: number | string
|
|
13
13
|
position?: ComponentPosition
|
|
14
14
|
showDelay?: number
|
|
15
15
|
hideDelay?: number
|
|
16
16
|
showArrow?: boolean
|
|
17
17
|
arrowColor?: string
|
|
18
|
+
modelValue?: boolean
|
|
18
19
|
interactive?: boolean
|
|
19
20
|
autoPosition?: boolean
|
|
20
21
|
wrapperClass?: ComponentClass
|
|
21
22
|
contentClass?: ComponentClass
|
|
22
23
|
contentStyle?: CSSProperties | string
|
|
23
|
-
unsetPosition?: boolean
|
|
24
|
-
transitionType?: 'fade' | 'fade-scale' | 'fade-slide'
|
|
25
24
|
toggleOnTrigger?: boolean
|
|
26
25
|
closeOnInvisible?: boolean
|
|
27
26
|
closeOnPressEscape?: boolean
|
|
@@ -32,7 +31,8 @@ export interface PopoverEmits {
|
|
|
32
31
|
show: []
|
|
33
32
|
hide: []
|
|
34
33
|
escape: [KeyboardEvent]
|
|
35
|
-
'outside-click': [
|
|
34
|
+
'outside-click': [PointerEvent]
|
|
36
35
|
'trigger-click': [PointerEvent]
|
|
37
36
|
'visible-change': [visible: boolean]
|
|
37
|
+
'update:modelValue': [visible: boolean]
|
|
38
38
|
}
|
|
@@ -87,7 +87,7 @@ const computedProgressBarStyles = computed(() => {
|
|
|
87
87
|
>
|
|
88
88
|
<div :class="computedClasses">
|
|
89
89
|
<div
|
|
90
|
-
class="h-full rounded-inherit motion-safe:transition-
|
|
90
|
+
class="h-full rounded-inherit motion-safe:transition-appearance"
|
|
91
91
|
:style="computedProgressBarStyles"
|
|
92
92
|
/>
|
|
93
93
|
</div>
|
|
@@ -20,7 +20,7 @@ const props = defineProps({
|
|
|
20
20
|
});
|
|
21
21
|
const emits = defineEmits(["change", "update:modelValue"]);
|
|
22
22
|
const radioVariant = tv({
|
|
23
|
-
base: "pxd-radio--inner size-4 after:content-empty after:size-2 inline-flex items-center justify-center rounded-full border peer-focus-ring after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-
|
|
23
|
+
base: "pxd-radio--inner size-4 after:content-empty after:size-2 inline-flex items-center justify-center rounded-full border peer-focus-ring after:scale-40 after:rounded-full after:bg-primary after:opacity-0 peer-checked:after:scale-100 peer-checked:after:opacity-100 motion-safe:transition-colors motion-safe:after:transition-appearance",
|
|
24
24
|
variants: {
|
|
25
25
|
checked: {
|
|
26
26
|
true: {
|
|
@@ -105,7 +105,7 @@ function onInputChange() {
|
|
|
105
105
|
|
|
106
106
|
<span aria-hidden="true" :class="computedClasses" />
|
|
107
107
|
|
|
108
|
-
<span class="text-sm flex-1 shrink-0 empty:hidden">
|
|
108
|
+
<span class="text-sm flex-1 shrink-0 leading-none empty:hidden">
|
|
109
109
|
<slot>
|
|
110
110
|
{{ label }}
|
|
111
111
|
</slot>
|