pxd 0.0.40 → 0.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/components/active-graph/index.vue +9 -4
- package/dist/components/backtop/index.vue +75 -0
- package/dist/components/badge/index.vue +9 -7
- package/dist/components/book/index.vue +2 -2
- package/dist/components/browser/index.vue +1 -1
- package/dist/components/checkbox/index.vue +1 -1
- package/dist/components/command-menu/index.vue +15 -24
- package/dist/components/command-menu-item/index.vue +5 -15
- package/dist/components/countdown/index.vue +2 -1
- package/dist/components/drawer/index.vue +2 -2
- package/dist/components/error/index.vue +1 -1
- package/dist/components/fader/index.vue +24 -11
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +3 -0
- package/dist/components/input/index.vue +18 -10
- package/dist/components/intersection-observer/index.vue +3 -3
- package/dist/components/kbd/index.vue +7 -6
- package/dist/components/{intersection-observer/content.vue → keep-alive-container/index.vue} +3 -1
- package/dist/components/list/index.vue +4 -4
- package/dist/components/list-item/index.vue +21 -8
- package/dist/components/loading-bar/index.vue +11 -18
- package/dist/components/menu/index.vue +15 -15
- package/dist/components/message/index.vue +9 -9
- package/dist/components/modal/index.vue +8 -10
- package/dist/components/note/index.vue +1 -1
- package/dist/components/overlay/index.vue +71 -19
- package/dist/components/popover/index.vue +76 -74
- package/dist/components/progress/index.vue +1 -1
- package/dist/components/radio/index.vue +1 -1
- package/dist/components/scrollable/index.vue +43 -24
- package/dist/components/slider/index.vue +7 -7
- package/dist/components/switch/index.vue +1 -1
- package/dist/components/time-picker/index.vue +281 -0
- package/dist/components/tooltip/index.vue +1 -1
- package/dist/composables/use-browser-observer.d.ts +4 -4
- package/dist/composables/use-countdown.d.ts +6 -0
- package/dist/composables/use-countdown.js +21 -7
- package/dist/composables/use-delay-destroy.d.ts +2 -2
- package/dist/composables/use-delay-destroy.js +13 -9
- package/dist/composables/use-focus-trap.d.ts +2 -2
- package/dist/composables/use-focus-trap.js +5 -5
- package/dist/composables/use-pointer-gesture.d.ts +2 -2
- package/dist/composables/use-pointer-gesture.js +1 -1
- package/dist/composables/use-repeat-action.d.ts +2 -2
- package/dist/composables/use-repeat-action.js +5 -5
- package/dist/contexts/list.d.ts +1 -0
- package/dist/contexts/list.js +4 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/locales/en-us.d.ts +12 -7
- package/dist/locales/en-us.js +14 -9
- package/dist/locales/zh-cn.d.ts +12 -7
- package/dist/locales/zh-cn.js +14 -9
- package/dist/src/components/active-graph/index.vue.d.ts +6 -4
- package/dist/src/components/backtop/index.vue.d.ts +20 -0
- package/dist/src/components/badge/index.vue.d.ts +1 -0
- package/dist/src/components/command-menu-item/index.vue.d.ts +11 -9
- package/dist/src/components/drawer/index.vue.d.ts +2 -2
- package/dist/src/components/fader/index.vue.d.ts +2 -3
- package/dist/src/components/input/index.vue.d.ts +9 -4
- package/dist/src/components/kbd/index.vue.d.ts +7 -5
- package/dist/src/components/keep-alive-container/index.vue.d.ts +12 -0
- package/dist/src/components/menu/index.vue.d.ts +2 -2
- package/dist/src/components/message/index.vue.d.ts +5 -5
- package/dist/src/components/modal/index.vue.d.ts +2 -2
- package/dist/src/components/overlay/index.vue.d.ts +1 -0
- package/dist/src/components/popover/index.vue.d.ts +4 -5
- package/dist/src/components/time-picker/index.vue.d.ts +25 -0
- package/dist/src/composables/use-browser-observer.d.ts +4 -4
- package/dist/src/composables/use-countdown.d.ts +6 -0
- package/dist/src/composables/use-delay-destroy.d.ts +2 -2
- package/dist/src/composables/use-focus-trap.d.ts +2 -2
- package/dist/src/composables/use-pointer-gesture.d.ts +2 -2
- package/dist/src/composables/use-repeat-action.d.ts +2 -2
- package/dist/src/contexts/list.d.ts +1 -0
- package/dist/src/locales/en-us.d.ts +12 -7
- package/dist/src/types/components/time-picker.d.ts +4 -0
- package/dist/src/utils/event.d.ts +1 -0
- package/dist/src/utils/format.d.ts +1 -0
- package/dist/src/utils/ref.d.ts +2 -5
- package/dist/src/utils/regexp.d.ts +4 -0
- package/dist/styles/styles.css +1 -1
- package/dist/styles/tw.css +14 -0
- package/dist/types/components/time-picker.d.ts +4 -0
- package/dist/types/components/time-picker.js +0 -0
- package/dist/types/shared/utils.d.ts +5 -2
- package/dist/utils/event.d.ts +1 -0
- package/dist/utils/event.js +3 -0
- package/dist/utils/format.d.ts +1 -0
- package/dist/utils/format.js +3 -0
- package/dist/utils/ref.d.ts +2 -5
- package/dist/utils/regexp.d.ts +4 -0
- package/dist/utils/regexp.js +4 -0
- package/dist/utils/uid.js +1 -1
- package/package.json +7 -7
- package/volar.d.ts +3 -0
- package/dist/contexts/command-menu.d.ts +0 -6
- package/dist/contexts/command-menu.js +0 -5
- package/dist/src/contexts/command-menu.d.ts +0 -6
- /package/dist/{src/components/intersection-observer/content.vue.d.ts → dist/components/keep-alive-container/index.vue.d.ts} +0 -0
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
getScrollElByContainer,
|
|
8
8
|
getScrollPositions
|
|
9
9
|
} from "../../utils/dom";
|
|
10
|
-
import {
|
|
10
|
+
import { optimizedOff, optimizedOn } from "../../utils/event";
|
|
11
11
|
import { toArray } from "../../utils/format";
|
|
12
12
|
import { isServer } from "../../utils/is";
|
|
13
13
|
import { throttleByRaf } from "../../utils/throttle";
|
|
@@ -18,7 +18,6 @@ defineOptions({
|
|
|
18
18
|
const props = defineProps({
|
|
19
19
|
zIndex: { type: Number, required: false, default: 5 },
|
|
20
20
|
offset: { type: Number, required: false, default: 10 },
|
|
21
|
-
content: { type: String, required: false },
|
|
22
21
|
visible: { type: Boolean, required: false },
|
|
23
22
|
trigger: { type: [String, Array], required: false, default: () => ["hover"] },
|
|
24
23
|
disabled: { type: Boolean, required: false },
|
|
@@ -38,14 +37,14 @@ const props = defineProps({
|
|
|
38
37
|
triggerStyle: { type: [Object, String], required: false },
|
|
39
38
|
contentStyle: { type: [Object, String], required: false },
|
|
40
39
|
transitionName: { type: String, required: false },
|
|
41
|
-
showTransition: { type: Boolean, required: false, default: true },
|
|
42
|
-
hideTransition: { type: Boolean, required: false, default: true },
|
|
43
40
|
minVisibleRatio: { type: Number, required: false, default: 0.88 },
|
|
44
41
|
closeOnPressEscape: { type: Boolean, required: false, default: false },
|
|
45
42
|
autoPositionThreshold: { type: Number, required: false, default: 30 },
|
|
46
|
-
scrollHiddenThreshold: { type: Number, required: false, default: 150 }
|
|
43
|
+
scrollHiddenThreshold: { type: Number, required: false, default: 150 },
|
|
44
|
+
disabledShowTransition: { type: Boolean, required: false },
|
|
45
|
+
disabledHideTransition: { type: Boolean, required: false }
|
|
47
46
|
});
|
|
48
|
-
const emits = defineEmits(["show", "hide", "visible-change", "trigger-click", "trigger-keydown"]);
|
|
47
|
+
const emits = defineEmits(["show", "hide", "visible-change", "outside-click", "trigger-click", "trigger-keydown"]);
|
|
49
48
|
const triggerRect = shallowRef();
|
|
50
49
|
let viewportRect = null;
|
|
51
50
|
let scrollContainer;
|
|
@@ -69,7 +68,7 @@ const {
|
|
|
69
68
|
});
|
|
70
69
|
const triggerMethods = computed(() => toArray(props.trigger));
|
|
71
70
|
const computedTransitionName = computed(
|
|
72
|
-
() => props.transitionName ??
|
|
71
|
+
() => props.transitionName ?? "pxd-transition--fade"
|
|
73
72
|
);
|
|
74
73
|
let savedScrollTop = 0;
|
|
75
74
|
const onContainerScroll = throttleByRaf(async (ev) => {
|
|
@@ -149,36 +148,58 @@ async function handleDirectionInvertIfNeed() {
|
|
|
149
148
|
}
|
|
150
149
|
}
|
|
151
150
|
async function handlePopoverShow(immediate = false) {
|
|
151
|
+
if (showPopoverTimer) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
getTriggerRect();
|
|
152
155
|
await new Promise((resolve) => {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
+
if (hidePopoverTimer) {
|
|
157
|
+
clearTimeout(hidePopoverTimer);
|
|
158
|
+
hidePopoverTimer = null;
|
|
159
|
+
}
|
|
156
160
|
showPopoverTimer = setTimeout(() => {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
openPopover();
|
|
160
|
-
resolve(true);
|
|
161
|
+
showPopoverTimer = null;
|
|
162
|
+
resolve();
|
|
161
163
|
}, immediate ? 0 : props.showDelay);
|
|
162
164
|
});
|
|
165
|
+
localPosition.value = props.position;
|
|
166
|
+
updateContentPosition();
|
|
167
|
+
await openPopover();
|
|
168
|
+
emits("show");
|
|
169
|
+
emits("visible-change", true);
|
|
163
170
|
savedScrollTop = getScrollElByContainer(scrollContainer).scrollTop;
|
|
164
|
-
|
|
171
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
172
|
+
optimizedOff(scrollContainer, "scroll", onContainerScroll, { passive: true });
|
|
173
|
+
optimizedOn(document, "click", onClickOutsideToHide);
|
|
174
|
+
optimizedOn(scrollContainer, "scroll", onContainerScroll, { passive: true });
|
|
165
175
|
if (!props.autoPosition) {
|
|
166
176
|
return;
|
|
167
177
|
}
|
|
168
178
|
handleDirectionInvertIfNeed();
|
|
169
179
|
}
|
|
170
180
|
async function handlePopoverHide(immediate = false) {
|
|
181
|
+
if (hidePopoverTimer) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (!isRender.value) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
171
187
|
await new Promise((resolve) => {
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
if (showPopoverTimer) {
|
|
189
|
+
clearTimeout(showPopoverTimer);
|
|
190
|
+
showPopoverTimer = null;
|
|
191
|
+
}
|
|
174
192
|
hidePopoverTimer = setTimeout(() => {
|
|
175
|
-
|
|
176
|
-
resolve(
|
|
193
|
+
hidePopoverTimer = null;
|
|
194
|
+
resolve();
|
|
177
195
|
}, immediate ? 0 : props.hideDelay);
|
|
178
196
|
});
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
197
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
198
|
+
optimizedOff(document, "contextmenu", onTriggerContextmenu);
|
|
199
|
+
optimizedOff(scrollContainer, "scroll", onContainerScroll);
|
|
200
|
+
await closePopover();
|
|
201
|
+
emits("hide");
|
|
202
|
+
emits("visible-change", false);
|
|
182
203
|
}
|
|
183
204
|
async function onTriggerClick(ev) {
|
|
184
205
|
if (props.disabled) {
|
|
@@ -189,12 +210,11 @@ async function onTriggerClick(ev) {
|
|
|
189
210
|
return;
|
|
190
211
|
}
|
|
191
212
|
if (isVisible.value) {
|
|
192
|
-
|
|
213
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
193
214
|
await handlePopoverHide();
|
|
194
215
|
return;
|
|
195
216
|
}
|
|
196
|
-
|
|
197
|
-
await handlePopoverShow();
|
|
217
|
+
handlePopoverShow();
|
|
198
218
|
}
|
|
199
219
|
function onTriggerPointerEnter() {
|
|
200
220
|
if (props.disabled) {
|
|
@@ -227,17 +247,23 @@ async function onTriggerContextmenu(ev) {
|
|
|
227
247
|
ev.preventDefault();
|
|
228
248
|
if (isVisible.value) {
|
|
229
249
|
await handlePopoverHide();
|
|
230
|
-
|
|
231
|
-
|
|
250
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
251
|
+
optimizedOff(document, "contextmenu", onTriggerContextmenu);
|
|
232
252
|
return;
|
|
233
253
|
}
|
|
234
254
|
await handlePopoverShow();
|
|
235
|
-
|
|
236
|
-
|
|
255
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
256
|
+
optimizedOff(document, "contextmenu", onTriggerContextmenu);
|
|
257
|
+
optimizedOn(document, "click", onClickOutsideToHide);
|
|
258
|
+
optimizedOn(document, "contextmenu", onTriggerContextmenu);
|
|
237
259
|
}
|
|
238
260
|
function onClickOutsideToHide(ev) {
|
|
261
|
+
if (!triggerMethods.value.includes("click") && !triggerMethods.value.includes("manual") && !triggerMethods.value.includes("contextmenu")) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
239
264
|
const target = ev.target;
|
|
240
265
|
if (!triggerRef.value?.contains(target) && !wrapperRef.value?.contains(target)) {
|
|
266
|
+
emits("outside-click", ev);
|
|
241
267
|
handlePopoverHide();
|
|
242
268
|
}
|
|
243
269
|
}
|
|
@@ -245,7 +271,7 @@ function onContentPointerEnter() {
|
|
|
245
271
|
if (props.disabled) {
|
|
246
272
|
return;
|
|
247
273
|
}
|
|
248
|
-
if (!props.enterable) {
|
|
274
|
+
if (!props.enterable || !isVisible.value) {
|
|
249
275
|
return;
|
|
250
276
|
}
|
|
251
277
|
handlePopoverShow();
|
|
@@ -254,7 +280,7 @@ function onContentPointerLeave() {
|
|
|
254
280
|
if (props.disabled) {
|
|
255
281
|
return;
|
|
256
282
|
}
|
|
257
|
-
if (!triggerMethods.value.includes("hover")) {
|
|
283
|
+
if (props.enterable && !triggerMethods.value.includes("hover")) {
|
|
258
284
|
return;
|
|
259
285
|
}
|
|
260
286
|
handlePopoverHide();
|
|
@@ -426,19 +452,11 @@ watch(
|
|
|
426
452
|
}
|
|
427
453
|
}
|
|
428
454
|
);
|
|
429
|
-
watch(() => isVisible.value, (visible) => {
|
|
430
|
-
emits("visible-change", visible);
|
|
431
|
-
if (visible) {
|
|
432
|
-
emits("show");
|
|
433
|
-
} else {
|
|
434
|
-
emits("hide");
|
|
435
|
-
}
|
|
436
|
-
});
|
|
437
455
|
watch(
|
|
438
456
|
() => [triggerRef.value, triggerMethods.value],
|
|
439
457
|
([newDom, newMethods], [oldDom, oldMethods]) => {
|
|
440
|
-
updateTriggerEvents(oldMethods, oldDom,
|
|
441
|
-
updateTriggerEvents(newMethods, newDom,
|
|
458
|
+
updateTriggerEvents(oldMethods, oldDom, optimizedOff);
|
|
459
|
+
updateTriggerEvents(newMethods, newDom, optimizedOn);
|
|
442
460
|
}
|
|
443
461
|
);
|
|
444
462
|
onMounted(() => {
|
|
@@ -450,12 +468,10 @@ onMounted(() => {
|
|
|
450
468
|
});
|
|
451
469
|
onBeforeUnmount(() => {
|
|
452
470
|
viewportRect = null;
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
off(document, "click", onClickOutsideToHide);
|
|
456
|
-
off(document, "contextmenu", onTriggerContextmenu);
|
|
457
|
-
off(scrollContainer, "scroll", onContainerScroll);
|
|
471
|
+
optimizedOff(document, "click", onClickOutsideToHide);
|
|
472
|
+
optimizedOff(document, "contextmenu", onTriggerContextmenu);
|
|
458
473
|
optimizedOff(window, "resize", onResizeUpdatePosition);
|
|
474
|
+
optimizedOff(scrollContainer, "scroll", onContainerScroll);
|
|
459
475
|
});
|
|
460
476
|
defineExpose({
|
|
461
477
|
show: handlePopoverShow,
|
|
@@ -464,21 +480,26 @@ defineExpose({
|
|
|
464
480
|
</script>
|
|
465
481
|
|
|
466
482
|
<template>
|
|
467
|
-
<div class="pxd-popover relative inline-flex w-
|
|
483
|
+
<div class="pxd-popover relative inline-flex max-w-full">
|
|
468
484
|
<div
|
|
469
485
|
ref="triggerRef"
|
|
470
|
-
class="pxd-popover--trigger active:select-none"
|
|
486
|
+
class="pxd-popover--trigger max-w-full active:select-none"
|
|
471
487
|
:class="triggerClass"
|
|
472
488
|
:style="triggerStyle"
|
|
473
489
|
@contextmenu.prevent
|
|
474
|
-
@click="onTriggerClick"
|
|
475
490
|
@keydown="onTriggerKeydown"
|
|
491
|
+
@click="onTriggerClick"
|
|
476
492
|
>
|
|
477
493
|
<slot />
|
|
478
494
|
</div>
|
|
479
495
|
|
|
480
496
|
<PTeleport>
|
|
481
|
-
<Transition
|
|
497
|
+
<Transition
|
|
498
|
+
appear
|
|
499
|
+
mode="out-in"
|
|
500
|
+
:name="computedTransitionName"
|
|
501
|
+
:class="{ disabledShowTransition, disabledHideTransition }"
|
|
502
|
+
>
|
|
482
503
|
<div
|
|
483
504
|
v-if="isRender"
|
|
484
505
|
v-show="isVisible"
|
|
@@ -487,15 +508,13 @@ defineExpose({
|
|
|
487
508
|
:style="wrapperStyle"
|
|
488
509
|
:data-enterable="enterable"
|
|
489
510
|
:data-position="localPosition"
|
|
490
|
-
class="pxd-popover--container sm:max-w-(--popover-max-width) absolute isolate
|
|
511
|
+
class="pxd-popover--container sm:max-w-(--popover-max-width) absolute isolate max-w-full data-[enterable=false]:pointer-events-none"
|
|
491
512
|
@pointerenter="onContentPointerEnter"
|
|
492
513
|
@pointerleave="onContentPointerLeave"
|
|
493
514
|
>
|
|
494
515
|
<i v-if="showArrow" class="pxd-popover--arrow absolute z-1" />
|
|
495
516
|
<div class="pxd-popover--content" :class="contentClass" :style="contentStyle">
|
|
496
|
-
<slot name="content"
|
|
497
|
-
{{ content }}
|
|
498
|
-
</slot>
|
|
517
|
+
<slot name="content" />
|
|
499
518
|
</div>
|
|
500
519
|
</div>
|
|
501
520
|
</Transition>
|
|
@@ -591,25 +610,8 @@ defineExpose({
|
|
|
591
610
|
}
|
|
592
611
|
}
|
|
593
612
|
|
|
594
|
-
.
|
|
595
|
-
.
|
|
596
|
-
|
|
597
|
-
.hideTransition.pxd-transition--popover-bottom-leave-active,
|
|
598
|
-
.showTransition.pxd-transition--popover-left-enter-active,
|
|
599
|
-
.hideTransition.pxd-transition--popover-left-leave-active,
|
|
600
|
-
.showTransition.pxd-transition--popover-right-enter-active,
|
|
601
|
-
.hideTransition.pxd-transition--popover-right-leave-active {
|
|
602
|
-
transition: opacity var(--default-transition-duration) var(--default-transition-timing-function);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
.showTransition.pxd-transition--popover-top-enter-from,
|
|
606
|
-
.hideTransition.pxd-transition--popover-top-leave-to,
|
|
607
|
-
.showTransition.pxd-transition--popover-bottom-enter-from,
|
|
608
|
-
.hideTransition.pxd-transition--popover-bottom-leave-to,
|
|
609
|
-
.showTransition.pxd-transition--popover-left-enter-from,
|
|
610
|
-
.hideTransition.pxd-transition--popover-left-leave-to,
|
|
611
|
-
.showTransition.pxd-transition--popover-right-enter-from,
|
|
612
|
-
.hideTransition.pxd-transition--popover-right-leave-to {
|
|
613
|
-
opacity: 0;
|
|
613
|
+
.disabledShowTransition.pxd-transition--fade-enter-active,
|
|
614
|
+
.disabledHideTransition.pxd-transition--fade-leave-active {
|
|
615
|
+
--default-transition-duration: 0 !important
|
|
614
616
|
}
|
|
615
617
|
</style>
|
|
@@ -48,7 +48,7 @@ const computedLabel = computed(() => {
|
|
|
48
48
|
return false;
|
|
49
49
|
});
|
|
50
50
|
const computedClass = computed(() => {
|
|
51
|
-
const classes = ["pxd-progress-bar flex-1 overflow-hidden rounded-full bg-gray-200", getFallbackValue(props.size, SIZES, config.size)];
|
|
51
|
+
const classes = ["pxd-progress-bar flex-1 shrink-0 overflow-hidden rounded-full bg-gray-200", getFallbackValue(props.size, SIZES, config.size)];
|
|
52
52
|
return classes.join(" ");
|
|
53
53
|
});
|
|
54
54
|
const computedColors = computed(() => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { computed, onBeforeUnmount, onMounted, ref, shallowRef } from "vue";
|
|
3
3
|
import { useResizeObserver } from "../../composables/use-browser-observer";
|
|
4
|
-
import {
|
|
4
|
+
import { once, optimizedOff, optimizedOn } from "../../utils/event";
|
|
5
5
|
import { isServer } from "../../utils/is";
|
|
6
6
|
import { throttleByRaf } from "../../utils/throttle";
|
|
7
7
|
import PFader from "../fader/index.vue";
|
|
@@ -10,16 +10,16 @@ defineOptions({
|
|
|
10
10
|
});
|
|
11
11
|
const props = defineProps({
|
|
12
12
|
fader: { type: Boolean, required: false, default: true },
|
|
13
|
-
faderSize: { type: Number, required: false
|
|
13
|
+
faderSize: { type: Number, required: false },
|
|
14
14
|
faderColor: { type: String, required: false },
|
|
15
15
|
faderDirection: { type: String, required: false },
|
|
16
16
|
scrollbar: { type: Boolean, required: false, default: true },
|
|
17
17
|
wrapperClass: { type: [String, Array, Object], required: false },
|
|
18
18
|
contentClass: { type: [String, Array, Object], required: false },
|
|
19
19
|
contentStyle: { type: [Object, String], required: false },
|
|
20
|
-
scrollbarSize: { type: Number, required: false
|
|
21
|
-
scrollbarColor: { type: String, required: false
|
|
22
|
-
scrollbarHoverColor: { type: String, required: false
|
|
20
|
+
scrollbarSize: { type: Number, required: false },
|
|
21
|
+
scrollbarColor: { type: String, required: false },
|
|
22
|
+
scrollbarHoverColor: { type: String, required: false },
|
|
23
23
|
loading: { type: Boolean, required: false },
|
|
24
24
|
endThreshold: { type: Number, required: false, default: 10 }
|
|
25
25
|
});
|
|
@@ -43,7 +43,7 @@ const scrollInfo = ref({
|
|
|
43
43
|
});
|
|
44
44
|
const computedStyle = computed(() => {
|
|
45
45
|
return {
|
|
46
|
-
"--scrollbar-size":
|
|
46
|
+
"--scrollbar-size": props.scrollbarSize,
|
|
47
47
|
"--scrollbar-color": props.scrollbarColor,
|
|
48
48
|
"--scrollbar-hover-color": props.scrollbarHoverColor
|
|
49
49
|
};
|
|
@@ -160,7 +160,7 @@ function startDragVertical(e) {
|
|
|
160
160
|
startClientPos: e.clientY,
|
|
161
161
|
startThumbPos: scrollInfo.value.verticalThumbTop
|
|
162
162
|
};
|
|
163
|
-
|
|
163
|
+
optimizedOn(document, "mousemove", onDragMove);
|
|
164
164
|
once(document, "mouseup", onEndDrag);
|
|
165
165
|
}
|
|
166
166
|
function startDragHorizontal(e) {
|
|
@@ -175,7 +175,7 @@ function startDragHorizontal(e) {
|
|
|
175
175
|
startClientPos: e.clientX,
|
|
176
176
|
startThumbPos: scrollInfo.value.horizontalThumbLeft
|
|
177
177
|
};
|
|
178
|
-
|
|
178
|
+
optimizedOn(document, "mousemove", onDragMove);
|
|
179
179
|
once(document, "mouseup", onEndDrag);
|
|
180
180
|
}
|
|
181
181
|
function onDragMove(e) {
|
|
@@ -210,7 +210,7 @@ function onEndDrag(ev) {
|
|
|
210
210
|
ev.stopPropagation();
|
|
211
211
|
dragState.isDragging = false;
|
|
212
212
|
dragState.direction = null;
|
|
213
|
-
|
|
213
|
+
optimizedOff(document, "mousemove", onDragMove);
|
|
214
214
|
throttledUpdate.cancel();
|
|
215
215
|
requestAnimationFrame(updateScrollbarMetrics);
|
|
216
216
|
}
|
|
@@ -230,13 +230,13 @@ onMounted(async () => {
|
|
|
230
230
|
if (!props.scrollbar && !props.fader) {
|
|
231
231
|
return;
|
|
232
232
|
}
|
|
233
|
-
|
|
233
|
+
optimizedOn(window, "resize", updateScrollbarMetrics, { passive: true });
|
|
234
234
|
requestAnimationFrame(updateScrollbarMetrics);
|
|
235
235
|
});
|
|
236
236
|
onBeforeUnmount(() => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
237
|
+
optimizedOff(window, "resize", updateScrollbarMetrics);
|
|
238
|
+
optimizedOff(document, "mousemove", onDragMove);
|
|
239
|
+
optimizedOff(document, "mouseup", onEndDrag);
|
|
240
240
|
throttledUpdate.cancel();
|
|
241
241
|
});
|
|
242
242
|
defineExpose({
|
|
@@ -256,7 +256,7 @@ defineExpose({
|
|
|
256
256
|
ref="contentRef"
|
|
257
257
|
:class="contentClass"
|
|
258
258
|
:style="contentStyle"
|
|
259
|
-
class="pxd-scrollable--content relative scrollbar-hidden max-h-full flex-1 overflow-scroll"
|
|
259
|
+
class="pxd-scrollable--content relative scrollbar-hidden max-h-full flex-1 shrink-0 overflow-scroll"
|
|
260
260
|
@scroll.passive="onContainerScroll"
|
|
261
261
|
>
|
|
262
262
|
<slot />
|
|
@@ -272,28 +272,47 @@ defineExpose({
|
|
|
272
272
|
|
|
273
273
|
<template v-if="scrollbar">
|
|
274
274
|
<div
|
|
275
|
-
v-if="scrollInfo.
|
|
275
|
+
v-if="scrollInfo.isScrollableX"
|
|
276
276
|
aria-hidden="true"
|
|
277
|
-
class="pxd-scrollable--scrollbar-
|
|
277
|
+
class="pxd-scrollable--scrollbar-x left-0 right-0 bottom-0 absolute touch-none opacity-(--o) select-none active:opacity-100 motion-safe:transition-opacity"
|
|
278
278
|
>
|
|
279
279
|
<div
|
|
280
|
-
class="pxd-scrollable--thumb
|
|
281
|
-
:style="
|
|
282
|
-
@mousedown="
|
|
280
|
+
class="pxd-scrollable--thumb h-inherit rounded-full hover:will-change-transform active:opacity-100 motion-safe:transition-colors"
|
|
281
|
+
:style="horizontalThumbStyle"
|
|
282
|
+
@mousedown="startDragHorizontal"
|
|
283
283
|
/>
|
|
284
284
|
</div>
|
|
285
285
|
|
|
286
286
|
<div
|
|
287
|
-
v-if="scrollInfo.
|
|
287
|
+
v-if="scrollInfo.isScrollableY"
|
|
288
288
|
aria-hidden="true"
|
|
289
|
-
class="pxd-scrollable--scrollbar-
|
|
289
|
+
class="pxd-scrollable--scrollbar-y top-0 right-0 bottom-0 absolute touch-none opacity-(--o) select-none active:opacity-100 motion-safe:transition-opacity"
|
|
290
290
|
>
|
|
291
291
|
<div
|
|
292
|
-
class="pxd-scrollable--thumb
|
|
293
|
-
:style="
|
|
294
|
-
@mousedown="
|
|
292
|
+
class="pxd-scrollable--thumb w-inherit rounded-full hover:will-change-transform active:opacity-100 motion-safe:transition-colors"
|
|
293
|
+
:style="verticalThumbStyle"
|
|
294
|
+
@mousedown="startDragVertical"
|
|
295
295
|
/>
|
|
296
296
|
</div>
|
|
297
297
|
</template>
|
|
298
298
|
</div>
|
|
299
299
|
</template>
|
|
300
|
+
|
|
301
|
+
<style lang="postcss">
|
|
302
|
+
.pxd-scrollable--scrollbar-x {
|
|
303
|
+
height: calc(var(--scrollbar-size, 6) * 1px);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.pxd-scrollable--scrollbar-y {
|
|
307
|
+
width: calc(var(--scrollbar-size, 6) * 1px);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.pxd-scrollable--thumb {
|
|
311
|
+
background-color: var(--scrollbar-color, var(--color-gray-alpha-300));
|
|
312
|
+
|
|
313
|
+
&:hover,
|
|
314
|
+
&:active {
|
|
315
|
+
background-color: var(--scrollbar-hover-color, var(--color-gray-alpha-500));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
</style>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { computed, onBeforeUnmount, shallowRef } from "vue";
|
|
3
3
|
import { useConfigProvider } from "../../composables/use-config-provider-context";
|
|
4
4
|
import { useModelValue } from "../../composables/use-model-value";
|
|
5
|
-
import {
|
|
5
|
+
import { once, optimizedOff, optimizedOn } from "../../utils/event";
|
|
6
6
|
import { getFallbackValue } from "../../utils/get";
|
|
7
7
|
defineOptions({
|
|
8
8
|
name: "PSlider",
|
|
@@ -134,9 +134,9 @@ function startDragging(ev, thumb) {
|
|
|
134
134
|
activeThumb.value = thumb;
|
|
135
135
|
lastClientX = ev.clientX;
|
|
136
136
|
updateValueFromPosition(ev.clientX);
|
|
137
|
-
on(document, "pointermove", handleMove, { passive: false });
|
|
138
137
|
once(document, "pointerup", endDragging);
|
|
139
138
|
once(document, "pointercancel", endDragging);
|
|
139
|
+
optimizedOn(document, "pointermove", handleMove, { passive: false });
|
|
140
140
|
}
|
|
141
141
|
function handleMove(ev) {
|
|
142
142
|
if (!isDragging || props.disabled) {
|
|
@@ -154,8 +154,8 @@ function endDragging() {
|
|
|
154
154
|
cancelAnimationFrame(animationFrameId);
|
|
155
155
|
animationFrameId = null;
|
|
156
156
|
}
|
|
157
|
-
|
|
158
|
-
|
|
157
|
+
optimizedOff(document, "pointermove", handleMove);
|
|
158
|
+
optimizedOff(document, "pointercancel", endDragging);
|
|
159
159
|
}
|
|
160
160
|
function handleSliderClick(ev) {
|
|
161
161
|
if (isDragging || !props.range || props.disabled) {
|
|
@@ -193,9 +193,9 @@ onBeforeUnmount(() => {
|
|
|
193
193
|
if (animationFrameId) {
|
|
194
194
|
cancelAnimationFrame(animationFrameId);
|
|
195
195
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
optimizedOff(document, "pointermove", handleMove);
|
|
197
|
+
optimizedOff(document, "pointerup", endDragging);
|
|
198
|
+
optimizedOff(document, "pointercancel", endDragging);
|
|
199
199
|
});
|
|
200
200
|
</script>
|
|
201
201
|
|