@v-c/trigger 0.0.13 → 0.0.15

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/index.js CHANGED
@@ -1,700 +1,590 @@
1
- import { defineComponent, computed, ref, useId, shallowRef, reactive, watch, nextTick, watchEffect, createVNode, Fragment, mergeDefaults, isVNode } from "vue";
2
- import Portal from "@v-c/portal";
3
- import ResizeObserver from "@v-c/resize-observer";
4
- import { classNames } from "@v-c/util";
5
- import { isDOM } from "@v-c/util/dist/Dom/findDOMNode";
6
- import { getShadowRoot } from "@v-c/util/dist/Dom/shadow";
7
- import { filterEmpty } from "@v-c/util/dist/props-util";
8
- import { useTriggerContext, useUniqueContext, TriggerContextProvider } from "./context.js";
1
+ import { TriggerContextProvider, useTriggerContext, useUniqueContext } from "./context.js";
9
2
  import useAction from "./hooks/useAction.js";
3
+ import { getAlignPopupClassName } from "./util.js";
10
4
  import useAlign from "./hooks/useAlign.js";
11
5
  import useDelay from "./hooks/useDelay.js";
12
6
  import useWatch from "./hooks/useWatch.js";
13
7
  import useWinClick from "./hooks/useWinClick.js";
14
- import Popup from "./Popup/index.js";
15
- import { getAlignPopupClassName } from "./util.js";
16
- import { default as default2 } from "./UniqueProvider/index.js";
8
+ import Popup_default from "./Popup/index.js";
9
+ import UniqueProvider_default from "./UniqueProvider/index.js";
10
+ import { Fragment, computed, createVNode, defineComponent, isVNode, mergeDefaults, nextTick, reactive, ref, shallowRef, useId, watch, watchEffect } from "vue";
11
+ import Portal from "@v-c/portal";
12
+ import ResizeObserver from "@v-c/resize-observer";
13
+ import { classNames } from "@v-c/util";
14
+ import { getShadowRoot } from "@v-c/util/dist/Dom/shadow";
15
+ import { filterEmpty } from "@v-c/util/dist/props-util";
16
+ import { resolveToElement } from "@v-c/util/dist/vnode";
17
17
  function _isSlot(s) {
18
- return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
18
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
19
19
  }
20
- const defaults = {
21
- prefixCls: "vc-trigger-popup",
22
- action: "hover",
23
- mouseLeaveDelay: 0.1,
24
- maskClosable: true,
25
- builtinPlacements: {},
26
- popupVisible: void 0,
27
- defaultPopupVisible: void 0
20
+ var defaults = {
21
+ prefixCls: "vc-trigger-popup",
22
+ action: "hover",
23
+ mouseLeaveDelay: .1,
24
+ maskClosable: true,
25
+ builtinPlacements: {},
26
+ popupVisible: void 0,
27
+ defaultPopupVisible: void 0
28
28
  };
29
29
  function generateTrigger(PortalComponent = Portal) {
30
- return /* @__PURE__ */ defineComponent((props, {
31
- expose,
32
- slots,
33
- attrs
34
- }) => {
35
- const mergedAutoDestroy = computed(() => props.autoDestroy ?? false);
36
- const openUncontrolled = computed(() => props.popupVisible === void 0);
37
- const isMobile = computed(() => !!props.mobile);
38
- const subPopupElements = ref({});
39
- const parentContext = useTriggerContext();
40
- const context = computed(() => {
41
- return {
42
- registerSubPopup(id2, subPopupEle) {
43
- if (subPopupEle) {
44
- subPopupElements.value[id2] = subPopupEle;
45
- } else {
46
- delete subPopupElements.value[id2];
47
- }
48
- parentContext?.value.registerSubPopup(id2, subPopupEle);
49
- }
50
- };
51
- });
52
- const uniqueContext = useUniqueContext();
53
- const id = useId();
54
- const popupEle = shallowRef(null);
55
- const externalPopupRef = shallowRef(null);
56
- const resolveToElement = (node) => {
57
- if (!node) {
58
- return null;
59
- }
60
- if (isDOM(node)) {
61
- return node;
62
- }
63
- const exposed = node;
64
- if (isDOM(exposed?.$el)) {
65
- return exposed.$el;
66
- }
67
- const nativeEl = exposed?.nativeElement;
68
- if (isDOM(nativeEl?.value)) {
69
- return nativeEl.value;
70
- }
71
- if (isDOM(nativeEl)) {
72
- return nativeEl;
73
- }
74
- if (typeof exposed?.getElement === "function") {
75
- const el = exposed.getElement();
76
- if (isDOM(el)) {
77
- return el;
78
- }
79
- }
80
- return null;
81
- };
82
- const setPopupRef = (node) => {
83
- const element = resolveToElement(node);
84
- externalPopupRef.value = element;
85
- if (popupEle.value !== element) {
86
- popupEle.value = element;
87
- }
88
- parentContext?.value?.registerSubPopup(id, element ?? null);
89
- };
90
- const targetEle = shallowRef(null);
91
- const externalForwardRef = shallowRef(null);
92
- const setTargetRef = (node) => {
93
- const element = resolveToElement(node);
94
- if (element && targetEle.value !== element) {
95
- targetEle.value = element;
96
- externalForwardRef.value = element;
97
- } else if (!element) {
98
- targetEle.value = null;
99
- externalForwardRef.value = null;
100
- }
101
- };
102
- const originChildProps = reactive({});
103
- const baseActionProps = shallowRef({});
104
- const hoverActionProps = shallowRef({});
105
- const cloneProps = computed(() => ({
106
- ...baseActionProps.value,
107
- ...hoverActionProps.value
108
- }));
109
- const inPopupOrChild = (ele) => {
110
- const childDOM = targetEle.value;
111
- return childDOM?.contains(ele) || childDOM && getShadowRoot(childDOM)?.host === ele || ele === childDOM || popupEle.value?.contains(ele) || popupEle.value && getShadowRoot(popupEle.value)?.host === ele || ele === popupEle.value || Object.values(subPopupElements.value).some((subPopupEle) => subPopupEle?.contains(ele) || ele === subPopupEle);
112
- };
113
- const innerArrow = computed(() => {
114
- return props.arrow ? {
115
- ...props?.arrow !== true ? props?.arrow : {}
116
- } : null;
117
- });
118
- const internalOpen = shallowRef(props?.defaultPopupVisible ?? false);
119
- if (props.popupVisible !== void 0) {
120
- internalOpen.value = props.popupVisible;
121
- }
122
- const mergedOpen = computed(() => {
123
- return props?.popupVisible ?? internalOpen.value;
124
- });
125
- const setMergedOpen = (nextOpen) => {
126
- if (openUncontrolled.value) {
127
- internalOpen.value = nextOpen;
128
- }
129
- };
130
- const isOpen = () => mergedOpen.value;
131
- watch(() => props.popupVisible, async (nextVisible) => {
132
- if (nextVisible !== void 0) {
133
- await nextTick();
134
- internalOpen.value = nextVisible;
135
- }
136
- });
137
- const getUniqueOptions = (delay = 0) => {
138
- return {
139
- popup: props.popup,
140
- target: targetEle.value,
141
- delay,
142
- prefixCls: props.prefixCls,
143
- popupClassName: props.popupClassName,
144
- uniqueContainerClassName: props.uniqueContainerClassName,
145
- uniqueContainerStyle: props.uniqueContainerStyle,
146
- popupStyle: props.popupStyle,
147
- popupPlacement: props.popupPlacement,
148
- builtinPlacements: props.builtinPlacements,
149
- popupAlign: props.popupAlign,
150
- zIndex: props.zIndex,
151
- mask: props.mask,
152
- maskClosable: props.maskClosable,
153
- popupMotion: props.popupMotion,
154
- maskMotion: props.maskMotion,
155
- arrow: innerArrow.value,
156
- getPopupContainer: props.getPopupContainer,
157
- getPopupClassNameFromAlign: props.getPopupClassNameFromAlign,
158
- id
159
- };
160
- };
161
- watch([mergedOpen, targetEle], () => {
162
- if (uniqueContext && props.unique && targetEle.value && !openUncontrolled.value && !parentContext?.value) {
163
- if (mergedOpen.value) {
164
- const enterDelay = props.mouseEnterDelay ?? 0;
165
- uniqueContext?.show(getUniqueOptions(enterDelay), isOpen);
166
- } else {
167
- uniqueContext?.hide(props.mouseLeaveDelay || 0);
168
- }
169
- }
170
- });
171
- const openRef = shallowRef(mergedOpen.value);
172
- const lastTriggerRef = shallowRef([]);
173
- lastTriggerRef.value = [];
174
- watchEffect(() => {
175
- openRef.value = mergedOpen.value;
176
- if (!mergedOpen.value) {
177
- lastTriggerRef.value = [];
178
- }
179
- });
180
- const internalTriggerOpen = (nextOpen) => {
181
- setMergedOpen(nextOpen);
182
- if ((lastTriggerRef.value[lastTriggerRef.value.length - 1] ?? mergedOpen.value) !== nextOpen) {
183
- lastTriggerRef.value.push(nextOpen);
184
- props?.onOpenChange?.(nextOpen);
185
- props?.onPopupVisibleChange?.(nextOpen);
186
- }
187
- };
188
- const delayInvoke = useDelay();
189
- const triggerOpen = (nextOpen, delay = 0) => {
190
- if (props.popupVisible !== void 0) {
191
- delayInvoke(() => {
192
- internalTriggerOpen(nextOpen);
193
- }, delay);
194
- return;
195
- }
196
- if (uniqueContext && props.unique && openUncontrolled.value && !parentContext?.value) {
197
- if (nextOpen) {
198
- uniqueContext?.show(getUniqueOptions(delay), isOpen);
199
- } else {
200
- uniqueContext.hide(delay);
201
- }
202
- return;
203
- }
204
- delayInvoke(() => {
205
- internalTriggerOpen(nextOpen);
206
- }, delay);
207
- };
208
- const inMotion = shallowRef(false);
209
- watch(mergedOpen, async () => {
210
- await nextTick();
211
- if (mergedOpen.value) {
212
- inMotion.value = true;
213
- }
214
- });
215
- const motionPrepareResolve = shallowRef();
216
- const mousePos = ref(null);
217
- const setMousePosByEvent = (event) => {
218
- mousePos.value = [event.clientX, event.clientY];
219
- };
220
- const [ready, offsetX, offsetY, offsetR, offsetB, arrowX, arrowY, scaleX, scaleY, alignInfo, onAlign] = useAlign(mergedOpen, popupEle, computed(() => props?.alignPoint && mousePos.value !== null ? mousePos.value : targetEle.value), computed(() => props?.popupPlacement), computed(() => props?.builtinPlacements), computed(() => props?.popupAlign), props?.onPopupAlign, isMobile);
221
- const [showActions, hideActions] = useAction(computed(() => props.action), computed(() => props.showAction), computed(() => props.hideAction));
222
- const clickToShow = computed(() => showActions.value?.has("click"));
223
- const clickToHide = computed(() => hideActions.value?.has("click") || hideActions.value?.has("contextmenu"));
224
- const triggerAlign = () => {
225
- if (!inMotion.value) {
226
- onAlign();
227
- }
228
- };
229
- const onScroll = () => {
230
- if (openRef.value && props?.alignPoint && clickToHide.value) {
231
- triggerOpen(false);
232
- }
233
- };
234
- useWatch(mergedOpen, targetEle, popupEle, triggerAlign, onScroll);
235
- watch([mousePos, () => props.popupPlacement], async () => {
236
- await nextTick();
237
- triggerAlign();
238
- });
239
- watch(() => JSON.stringify(props.popupAlign), async () => {
240
- await nextTick();
241
- const {
242
- builtinPlacements,
243
- popupPlacement
244
- } = props;
245
- if (mergedOpen.value && !builtinPlacements?.[popupPlacement]) {
246
- triggerAlign();
247
- }
248
- });
249
- const alignedClassName = computed(() => {
250
- const baseClassName = getAlignPopupClassName(props.builtinPlacements, props.prefixCls, alignInfo.value, props.alignPoint);
251
- return classNames(baseClassName, props?.getPopupClassNameFromAlign?.(alignInfo.value));
252
- });
253
- expose({
254
- nativeElement: externalForwardRef,
255
- popupElement: externalPopupRef,
256
- forceAlign: triggerAlign
257
- });
258
- const targetWidth = shallowRef(0);
259
- const targetHeight = shallowRef(0);
260
- const syncTargetSize = () => {
261
- if (props.stretch && targetEle.value) {
262
- const rect = targetEle.value.getBoundingClientRect();
263
- targetWidth.value = rect.width;
264
- targetHeight.value = rect.height;
265
- }
266
- };
267
- const onTargetResize = () => {
268
- syncTargetSize();
269
- triggerAlign();
270
- };
271
- const onVisibleChanged = (visible) => {
272
- inMotion.value = false;
273
- onAlign();
274
- props?.afterOpenChange?.(visible);
275
- props?.afterPopupVisibleChange?.(visible);
276
- };
277
- const onPrepare = () => {
278
- return new Promise((resolve) => {
279
- syncTargetSize();
280
- motionPrepareResolve.value = resolve;
281
- });
282
- };
283
- watch([motionPrepareResolve], () => {
284
- if (motionPrepareResolve.value) {
285
- onAlign();
286
- motionPrepareResolve.value();
287
- motionPrepareResolve.value = void 0;
288
- }
289
- });
290
- function wrapperAction(target, eventName, nextOpen, delay, callback, ignoreCheck) {
291
- target[eventName] = (event, ...args) => {
292
- if (!ignoreCheck || !ignoreCheck()) {
293
- callback?.(event);
294
- triggerOpen(nextOpen, delay);
295
- }
296
- originChildProps[eventName]?.(event, ...args);
297
- };
298
- }
299
- const touchToShow = computed(() => showActions.value?.has("touch"));
300
- const touchToHide = computed(() => hideActions.value?.has("touch"));
301
- const touchedRef = shallowRef(false);
302
- watchEffect(() => {
303
- const nextCloneProps = {};
304
- if (touchToShow.value || touchToHide.value) {
305
- nextCloneProps.onTouchstart = (...args) => {
306
- touchedRef.value = true;
307
- if (openRef.value && touchToHide.value) {
308
- triggerOpen(false);
309
- } else if (!openRef.value && touchToShow.value) {
310
- triggerOpen(true);
311
- }
312
- originChildProps.onTouchstart?.(...args);
313
- };
314
- }
315
- if (clickToShow.value || clickToHide.value) {
316
- nextCloneProps.onClick = (event, ...args) => {
317
- if (openRef.value && clickToHide.value) {
318
- triggerOpen(false);
319
- } else if (!openRef.value && clickToShow.value) {
320
- setMousePosByEvent(event);
321
- triggerOpen(true);
322
- }
323
- originChildProps?.onClick?.(event, ...args);
324
- touchedRef.value = false;
325
- };
326
- }
327
- baseActionProps.value = nextCloneProps;
328
- });
329
- const onPopupPointerDown = useWinClick(mergedOpen, computed(() => clickToHide.value || touchToHide.value), targetEle, popupEle, computed(() => props.mask), computed(() => props.maskClosable), inPopupOrChild, triggerOpen);
330
- const hoverToShow = computed(() => showActions.value?.has("hover"));
331
- const hoverToHide = computed(() => hideActions.value?.has("hover"));
332
- let onPopupMouseEnter;
333
- let onPopupMouseLeave;
334
- const ignoreMouseTrigger = () => {
335
- return touchedRef.value;
336
- };
337
- watchEffect(() => {
338
- const {
339
- mouseEnterDelay,
340
- mouseLeaveDelay,
341
- alignPoint,
342
- focusDelay,
343
- blurDelay
344
- } = props;
345
- const nextHoverProps = {};
346
- if (hoverToShow.value) {
347
- const onMouseEnterCallback = (event) => {
348
- setMousePosByEvent(event);
349
- };
350
- wrapperAction(nextHoverProps, "onMouseenter", true, mouseEnterDelay, onMouseEnterCallback, ignoreMouseTrigger);
351
- wrapperAction(nextHoverProps, "onPointerenter", true, mouseEnterDelay, onMouseEnterCallback, ignoreMouseTrigger);
352
- onPopupMouseEnter = (event) => {
353
- if ((mergedOpen.value || inMotion.value) && popupEle?.value?.contains(event.target)) {
354
- triggerOpen(true, mouseEnterDelay);
355
- }
356
- };
357
- if (alignPoint) {
358
- nextHoverProps.onMouseMove = (event) => {
359
- originChildProps.onMousemove?.(event);
360
- };
361
- }
362
- } else {
363
- onPopupMouseEnter = void 0;
364
- }
365
- if (hoverToHide.value) {
366
- wrapperAction(nextHoverProps, "onMouseleave", false, mouseLeaveDelay, void 0, ignoreMouseTrigger);
367
- wrapperAction(nextHoverProps, "onPointerleave", false, mouseLeaveDelay, void 0, ignoreMouseTrigger);
368
- onPopupMouseLeave = (event) => {
369
- const {
370
- relatedTarget
371
- } = event;
372
- if (relatedTarget && inPopupOrChild(relatedTarget)) {
373
- return;
374
- }
375
- triggerOpen(false, mouseLeaveDelay);
376
- };
377
- } else {
378
- onPopupMouseLeave = void 0;
379
- }
380
- if (showActions.value.has("focus")) {
381
- wrapperAction(nextHoverProps, "onFocus", true, focusDelay);
382
- }
383
- if (hideActions.value.has("focus")) {
384
- wrapperAction(nextHoverProps, "onBlur", false, blurDelay);
385
- }
386
- if (showActions.value.has("contextmenu")) {
387
- nextHoverProps.onContextmenu = (event, ...args) => {
388
- if (openRef.value && hideActions.value.has("contextmenu")) {
389
- triggerOpen(false);
390
- } else {
391
- setMousePosByEvent(event);
392
- triggerOpen(true);
393
- }
394
- event.preventDefault();
395
- originChildProps.onContextmenu?.(event, ...args);
396
- };
397
- }
398
- hoverActionProps.value = nextHoverProps;
399
- });
400
- const rendedRef = shallowRef(false);
401
- watchEffect(() => {
402
- rendedRef.value ||= props.forceRender || mergedOpen.value || inMotion.value;
403
- });
404
- return () => {
405
- const child = filterEmpty(slots?.default?.() ?? [])?.[0];
406
- const mergedChildrenProps = {
407
- ...originChildProps,
408
- ...cloneProps.value
409
- };
410
- const passedProps = {};
411
- const passedEventList = ["onContextmenu", "onClick", "onMousedown", "onTouchstart", "onMouseenter", "onMouseleave", "onFocus", "onBlur"];
412
- passedEventList.forEach((eventName) => {
413
- if (attrs[eventName]) {
414
- passedProps[eventName] = (...args) => {
415
- mergedChildrenProps[eventName]?.(...args);
416
- attrs[eventName](...args);
417
- };
418
- }
419
- });
420
- const arrowPos = {
421
- x: arrowX.value,
422
- y: arrowY.value
423
- };
424
- const triggerNode = createVNode(child, {
425
- ...mergedChildrenProps,
426
- ...passedProps,
427
- ref: setTargetRef
428
- });
429
- const {
430
- unique,
431
- prefixCls,
432
- popup,
433
- popupClassName,
434
- popupStyle,
435
- zIndex,
436
- fresh,
437
- onPopupClick,
438
- mask,
439
- popupMotion,
440
- maskMotion,
441
- forceRender,
442
- getPopupContainer,
443
- stretch,
444
- mobile
445
- } = props;
446
- return createVNode(Fragment, null, [createVNode(ResizeObserver, {
447
- "disabled": !mergedOpen.value,
448
- "onResize": onTargetResize
449
- }, _isSlot(triggerNode) ? triggerNode : {
450
- default: () => [triggerNode]
451
- }), rendedRef.value && targetEle.value && (!uniqueContext || !unique) && createVNode(TriggerContextProvider, context.value, {
452
- default: () => [createVNode(Popup, {
453
- "portal": PortalComponent,
454
- "ref": setPopupRef,
455
- "prefixCls": prefixCls,
456
- "popup": popup,
457
- "className": classNames(popupClassName, !isMobile.value && alignedClassName.value),
458
- "style": popupStyle,
459
- "target": targetEle.value,
460
- "onMouseEnter": onPopupMouseEnter,
461
- "onMouseLeave": onPopupMouseLeave,
462
- "onPointerEnter": onPopupMouseEnter,
463
- "zIndex": zIndex,
464
- "open": mergedOpen.value,
465
- "keepDom": inMotion.value,
466
- "fresh": fresh,
467
- "onClick": onPopupClick,
468
- "onPointerDownCapture": onPopupPointerDown,
469
- "mask": mask,
470
- "motion": popupMotion,
471
- "maskMotion": maskMotion,
472
- "onVisibleChanged": onVisibleChanged,
473
- "onPrepare": onPrepare,
474
- "forceRender": forceRender,
475
- "autoDestroy": mergedAutoDestroy.value,
476
- "getPopupContainer": getPopupContainer,
477
- "align": alignInfo.value,
478
- "arrow": innerArrow.value,
479
- "arrowPos": arrowPos,
480
- "ready": ready.value,
481
- "offsetX": offsetX.value,
482
- "offsetY": offsetY.value,
483
- "offsetR": offsetR.value,
484
- "offsetB": offsetB.value,
485
- "onAlign": triggerAlign,
486
- "stretch": stretch,
487
- "targetWidth": targetWidth.value / scaleX.value,
488
- "targetHeight": targetHeight.value / scaleY.value,
489
- "mobile": mobile
490
- }, null)]
491
- })]);
492
- };
493
- }, {
494
- props: /* @__PURE__ */ mergeDefaults({
495
- action: {
496
- type: [String, Array],
497
- required: false,
498
- default: void 0
499
- },
500
- showAction: {
501
- type: Array,
502
- required: false,
503
- default: void 0
504
- },
505
- hideAction: {
506
- type: Array,
507
- required: false,
508
- default: void 0
509
- },
510
- prefixCls: {
511
- type: String,
512
- required: false,
513
- default: void 0
514
- },
515
- zIndex: {
516
- type: Number,
517
- required: false,
518
- default: void 0
519
- },
520
- onPopupAlign: {
521
- type: Function,
522
- required: false,
523
- default: void 0
524
- },
525
- stretch: {
526
- type: String,
527
- required: false,
528
- default: void 0
529
- },
530
- popupVisible: {
531
- type: Boolean,
532
- required: false,
533
- default: void 0
534
- },
535
- defaultPopupVisible: {
536
- type: Boolean,
537
- required: false,
538
- default: void 0
539
- },
540
- onOpenChange: {
541
- type: Function,
542
- required: false,
543
- default: void 0
544
- },
545
- afterOpenChange: {
546
- type: Function,
547
- required: false,
548
- default: void 0
549
- },
550
- onPopupVisibleChange: {
551
- type: Function,
552
- required: false,
553
- default: void 0
554
- },
555
- afterPopupVisibleChange: {
556
- type: Function,
557
- required: false,
558
- default: void 0
559
- },
560
- getPopupContainer: {
561
- type: Function,
562
- required: false,
563
- default: void 0
564
- },
565
- forceRender: {
566
- type: Boolean,
567
- required: false,
568
- default: void 0
569
- },
570
- autoDestroy: {
571
- type: Boolean,
572
- required: false,
573
- default: void 0
574
- },
575
- mask: {
576
- type: Boolean,
577
- required: false,
578
- default: void 0
579
- },
580
- maskClosable: {
581
- type: Boolean,
582
- required: false,
583
- default: void 0
584
- },
585
- popupMotion: {
586
- type: Object,
587
- required: false,
588
- default: void 0
589
- },
590
- maskMotion: {
591
- type: Object,
592
- required: false,
593
- default: void 0
594
- },
595
- mouseEnterDelay: {
596
- type: Number,
597
- required: false,
598
- default: void 0
599
- },
600
- mouseLeaveDelay: {
601
- type: Number,
602
- required: false,
603
- default: void 0
604
- },
605
- focusDelay: {
606
- type: Number,
607
- required: false,
608
- default: void 0
609
- },
610
- blurDelay: {
611
- type: Number,
612
- required: false,
613
- default: void 0
614
- },
615
- popup: {
616
- type: [String, Number, null, Array, Function],
617
- required: true,
618
- skipCheck: true,
619
- default: void 0
620
- },
621
- popupPlacement: {
622
- type: String,
623
- required: false,
624
- default: void 0
625
- },
626
- builtinPlacements: {
627
- type: Object,
628
- required: false,
629
- default: void 0
630
- },
631
- popupAlign: {
632
- type: Object,
633
- required: false,
634
- default: void 0
635
- },
636
- popupClassName: {
637
- type: String,
638
- required: false,
639
- default: void 0
640
- },
641
- uniqueContainerClassName: {
642
- type: String,
643
- required: false,
644
- default: void 0
645
- },
646
- uniqueContainerStyle: {
647
- type: null,
648
- required: false,
649
- default: void 0
650
- },
651
- popupStyle: {
652
- type: null,
653
- required: false,
654
- default: void 0
655
- },
656
- getPopupClassNameFromAlign: {
657
- type: Function,
658
- required: false,
659
- default: void 0
660
- },
661
- onPopupClick: {
662
- type: Function,
663
- required: false,
664
- default: void 0
665
- },
666
- alignPoint: {
667
- type: Boolean,
668
- required: false,
669
- default: void 0
670
- },
671
- fresh: {
672
- type: Boolean,
673
- required: false,
674
- default: void 0
675
- },
676
- unique: {
677
- type: Boolean,
678
- required: false,
679
- default: void 0
680
- },
681
- arrow: {
682
- type: [Boolean, Object],
683
- required: false,
684
- default: void 0
685
- },
686
- mobile: {
687
- type: Object,
688
- required: false,
689
- default: void 0
690
- }
691
- }, defaults)
692
- });
30
+ return /* @__PURE__ */ defineComponent((props, { expose, slots, attrs }) => {
31
+ const mergedAutoDestroy = computed(() => props.autoDestroy ?? false);
32
+ const openUncontrolled = computed(() => props.popupVisible === void 0);
33
+ const isMobile = computed(() => !!props.mobile);
34
+ const subPopupElements = ref({});
35
+ const parentContext = useTriggerContext();
36
+ const context = computed(() => {
37
+ return { registerSubPopup(id$1, subPopupEle) {
38
+ if (subPopupEle) subPopupElements.value[id$1] = subPopupEle;
39
+ else delete subPopupElements.value[id$1];
40
+ parentContext?.value.registerSubPopup(id$1, subPopupEle);
41
+ } };
42
+ });
43
+ const uniqueContext = useUniqueContext();
44
+ const id = useId();
45
+ const popupEle = shallowRef(null);
46
+ const externalPopupRef = shallowRef(null);
47
+ const setPopupRef = (node) => {
48
+ const element = resolveToElement(node);
49
+ externalPopupRef.value = element;
50
+ if (popupEle.value !== element) popupEle.value = element;
51
+ parentContext?.value?.registerSubPopup(id, element ?? null);
52
+ };
53
+ const targetEle = shallowRef(null);
54
+ const externalForwardRef = shallowRef(null);
55
+ const setTargetRef = (node) => {
56
+ const element = resolveToElement(node);
57
+ if (element && targetEle.value !== element) {
58
+ targetEle.value = element;
59
+ externalForwardRef.value = element;
60
+ } else if (!element) {
61
+ targetEle.value = null;
62
+ externalForwardRef.value = null;
63
+ }
64
+ };
65
+ const originChildProps = reactive({});
66
+ const baseActionProps = shallowRef({});
67
+ const hoverActionProps = shallowRef({});
68
+ const cloneProps = computed(() => ({
69
+ ...baseActionProps.value,
70
+ ...hoverActionProps.value
71
+ }));
72
+ const inPopupOrChild = (ele) => {
73
+ const childDOM = targetEle.value;
74
+ return childDOM?.contains(ele) || childDOM && getShadowRoot(childDOM)?.host === ele || ele === childDOM || popupEle.value?.contains(ele) || popupEle.value && getShadowRoot(popupEle.value)?.host === ele || ele === popupEle.value || Object.values(subPopupElements.value).some((subPopupEle) => subPopupEle?.contains(ele) || ele === subPopupEle);
75
+ };
76
+ const innerArrow = computed(() => {
77
+ return props.arrow ? { ...props?.arrow !== true ? props?.arrow : {} } : null;
78
+ });
79
+ const internalOpen = shallowRef(props?.defaultPopupVisible ?? false);
80
+ if (props.popupVisible !== void 0) internalOpen.value = props.popupVisible;
81
+ const mergedOpen = computed(() => {
82
+ return props?.popupVisible ?? internalOpen.value;
83
+ });
84
+ const setMergedOpen = (nextOpen) => {
85
+ if (openUncontrolled.value) internalOpen.value = nextOpen;
86
+ };
87
+ const isOpen = () => mergedOpen.value;
88
+ watch(() => props.popupVisible, async (nextVisible) => {
89
+ if (nextVisible !== void 0) {
90
+ await nextTick();
91
+ internalOpen.value = nextVisible;
92
+ }
93
+ });
94
+ const getUniqueOptions = (delay = 0) => {
95
+ return {
96
+ popup: props.popup,
97
+ target: targetEle.value,
98
+ delay,
99
+ prefixCls: props.prefixCls,
100
+ popupClassName: props.popupClassName,
101
+ uniqueContainerClassName: props.uniqueContainerClassName,
102
+ uniqueContainerStyle: props.uniqueContainerStyle,
103
+ popupStyle: props.popupStyle,
104
+ popupPlacement: props.popupPlacement,
105
+ builtinPlacements: props.builtinPlacements,
106
+ popupAlign: props.popupAlign,
107
+ zIndex: props.zIndex,
108
+ mask: props.mask,
109
+ maskClosable: props.maskClosable,
110
+ popupMotion: props.popupMotion,
111
+ maskMotion: props.maskMotion,
112
+ arrow: innerArrow.value,
113
+ getPopupContainer: props.getPopupContainer,
114
+ getPopupClassNameFromAlign: props.getPopupClassNameFromAlign,
115
+ id
116
+ };
117
+ };
118
+ watch([mergedOpen, targetEle], () => {
119
+ if (uniqueContext && props.unique && targetEle.value && !openUncontrolled.value && !parentContext?.value) if (mergedOpen.value) {
120
+ const enterDelay = props.mouseEnterDelay ?? 0;
121
+ uniqueContext?.show(getUniqueOptions(enterDelay), isOpen);
122
+ } else uniqueContext?.hide(props.mouseLeaveDelay || 0);
123
+ });
124
+ const openRef = shallowRef(mergedOpen.value);
125
+ const lastTriggerRef = shallowRef([]);
126
+ lastTriggerRef.value = [];
127
+ watchEffect(() => {
128
+ openRef.value = mergedOpen.value;
129
+ if (!mergedOpen.value) lastTriggerRef.value = [];
130
+ });
131
+ const internalTriggerOpen = (nextOpen) => {
132
+ setMergedOpen(nextOpen);
133
+ if ((lastTriggerRef.value[lastTriggerRef.value.length - 1] ?? mergedOpen.value) !== nextOpen) {
134
+ lastTriggerRef.value.push(nextOpen);
135
+ props?.onOpenChange?.(nextOpen);
136
+ props?.onPopupVisibleChange?.(nextOpen);
137
+ }
138
+ };
139
+ const delayInvoke = useDelay();
140
+ const triggerOpen = (nextOpen, delay = 0) => {
141
+ if (props.popupVisible !== void 0) {
142
+ delayInvoke(() => {
143
+ internalTriggerOpen(nextOpen);
144
+ }, delay);
145
+ return;
146
+ }
147
+ if (uniqueContext && props.unique && openUncontrolled.value && !parentContext?.value) {
148
+ if (nextOpen) uniqueContext?.show(getUniqueOptions(delay), isOpen);
149
+ else uniqueContext.hide(delay);
150
+ return;
151
+ }
152
+ delayInvoke(() => {
153
+ internalTriggerOpen(nextOpen);
154
+ }, delay);
155
+ };
156
+ const inMotion = shallowRef(false);
157
+ watch(mergedOpen, async () => {
158
+ await nextTick();
159
+ if (mergedOpen.value) inMotion.value = true;
160
+ });
161
+ const motionPrepareResolve = shallowRef();
162
+ const mousePos = ref(null);
163
+ const setMousePosByEvent = (event) => {
164
+ mousePos.value = [event.clientX, event.clientY];
165
+ };
166
+ const [ready, offsetX, offsetY, offsetR, offsetB, arrowX, arrowY, scaleX, scaleY, alignInfo, onAlign] = useAlign(mergedOpen, popupEle, computed(() => props?.alignPoint && mousePos.value !== null ? mousePos.value : targetEle.value), computed(() => props?.popupPlacement), computed(() => props?.builtinPlacements), computed(() => props?.popupAlign), props?.onPopupAlign, isMobile);
167
+ const [showActions, hideActions] = useAction(computed(() => props.action), computed(() => props.showAction), computed(() => props.hideAction));
168
+ const clickToShow = computed(() => showActions.value?.has("click"));
169
+ const clickToHide = computed(() => hideActions.value?.has("click") || hideActions.value?.has("contextmenu"));
170
+ const triggerAlign = () => {
171
+ if (!inMotion.value) onAlign();
172
+ };
173
+ const onScroll = () => {
174
+ if (openRef.value && props?.alignPoint && clickToHide.value) triggerOpen(false);
175
+ };
176
+ useWatch(mergedOpen, targetEle, popupEle, triggerAlign, onScroll);
177
+ watch([mousePos, () => props.popupPlacement], async () => {
178
+ await nextTick();
179
+ triggerAlign();
180
+ });
181
+ watch(() => JSON.stringify(props.popupAlign), async () => {
182
+ await nextTick();
183
+ const { builtinPlacements, popupPlacement } = props;
184
+ if (mergedOpen.value && !builtinPlacements?.[popupPlacement]) triggerAlign();
185
+ });
186
+ const alignedClassName = computed(() => {
187
+ return classNames(getAlignPopupClassName(props.builtinPlacements, props.prefixCls, alignInfo.value, props.alignPoint), props?.getPopupClassNameFromAlign?.(alignInfo.value));
188
+ });
189
+ expose({
190
+ nativeElement: externalForwardRef,
191
+ popupElement: externalPopupRef,
192
+ forceAlign: triggerAlign
193
+ });
194
+ const targetWidth = shallowRef(0);
195
+ const targetHeight = shallowRef(0);
196
+ const syncTargetSize = () => {
197
+ if (props.stretch && targetEle.value) {
198
+ const rect = targetEle.value.getBoundingClientRect();
199
+ targetWidth.value = rect.width;
200
+ targetHeight.value = rect.height;
201
+ }
202
+ };
203
+ const onTargetResize = () => {
204
+ syncTargetSize();
205
+ triggerAlign();
206
+ };
207
+ const onVisibleChanged = (visible) => {
208
+ inMotion.value = false;
209
+ onAlign();
210
+ props?.afterOpenChange?.(visible);
211
+ props?.afterPopupVisibleChange?.(visible);
212
+ };
213
+ const onPrepare = () => {
214
+ return new Promise((resolve) => {
215
+ syncTargetSize();
216
+ motionPrepareResolve.value = resolve;
217
+ });
218
+ };
219
+ watch([motionPrepareResolve], () => {
220
+ if (motionPrepareResolve.value) {
221
+ onAlign();
222
+ motionPrepareResolve.value();
223
+ motionPrepareResolve.value = void 0;
224
+ }
225
+ });
226
+ function wrapperAction(target, eventName, nextOpen, delay, callback, ignoreCheck) {
227
+ target[eventName] = (event, ...args) => {
228
+ if (!ignoreCheck || !ignoreCheck()) {
229
+ callback?.(event);
230
+ triggerOpen(nextOpen, delay);
231
+ }
232
+ originChildProps[eventName]?.(event, ...args);
233
+ };
234
+ }
235
+ const touchToShow = computed(() => showActions.value?.has("touch"));
236
+ const touchToHide = computed(() => hideActions.value?.has("touch"));
237
+ const touchedRef = shallowRef(false);
238
+ watchEffect(() => {
239
+ const nextCloneProps = {};
240
+ if (touchToShow.value || touchToHide.value) nextCloneProps.onTouchstart = (...args) => {
241
+ touchedRef.value = true;
242
+ if (openRef.value && touchToHide.value) triggerOpen(false);
243
+ else if (!openRef.value && touchToShow.value) triggerOpen(true);
244
+ originChildProps.onTouchstart?.(...args);
245
+ };
246
+ if (clickToShow.value || clickToHide.value) nextCloneProps.onClick = (event, ...args) => {
247
+ if (openRef.value && clickToHide.value) triggerOpen(false);
248
+ else if (!openRef.value && clickToShow.value) {
249
+ setMousePosByEvent(event);
250
+ triggerOpen(true);
251
+ }
252
+ originChildProps?.onClick?.(event, ...args);
253
+ touchedRef.value = false;
254
+ };
255
+ baseActionProps.value = nextCloneProps;
256
+ });
257
+ const onPopupPointerDown = useWinClick(mergedOpen, computed(() => clickToHide.value || touchToHide.value), targetEle, popupEle, computed(() => props.mask), computed(() => props.maskClosable), inPopupOrChild, triggerOpen);
258
+ const hoverToShow = computed(() => showActions.value?.has("hover"));
259
+ const hoverToHide = computed(() => hideActions.value?.has("hover"));
260
+ let onPopupMouseEnter;
261
+ let onPopupMouseLeave;
262
+ const ignoreMouseTrigger = () => {
263
+ return touchedRef.value;
264
+ };
265
+ watchEffect(() => {
266
+ const { mouseEnterDelay, mouseLeaveDelay, alignPoint, focusDelay, blurDelay } = props;
267
+ const nextHoverProps = {};
268
+ if (hoverToShow.value) {
269
+ const onMouseEnterCallback = (event) => {
270
+ setMousePosByEvent(event);
271
+ };
272
+ wrapperAction(nextHoverProps, "onMouseenter", true, mouseEnterDelay, onMouseEnterCallback, ignoreMouseTrigger);
273
+ wrapperAction(nextHoverProps, "onPointerenter", true, mouseEnterDelay, onMouseEnterCallback, ignoreMouseTrigger);
274
+ onPopupMouseEnter = (event) => {
275
+ if ((mergedOpen.value || inMotion.value) && popupEle?.value?.contains(event.target)) triggerOpen(true, mouseEnterDelay);
276
+ };
277
+ if (alignPoint) nextHoverProps.onMouseMove = (event) => {
278
+ originChildProps.onMousemove?.(event);
279
+ };
280
+ } else onPopupMouseEnter = void 0;
281
+ if (hoverToHide.value) {
282
+ wrapperAction(nextHoverProps, "onMouseleave", false, mouseLeaveDelay, void 0, ignoreMouseTrigger);
283
+ wrapperAction(nextHoverProps, "onPointerleave", false, mouseLeaveDelay, void 0, ignoreMouseTrigger);
284
+ onPopupMouseLeave = (event) => {
285
+ const { relatedTarget } = event;
286
+ if (relatedTarget && inPopupOrChild(relatedTarget)) return;
287
+ triggerOpen(false, mouseLeaveDelay);
288
+ };
289
+ } else onPopupMouseLeave = void 0;
290
+ if (showActions.value.has("focus")) wrapperAction(nextHoverProps, "onFocus", true, focusDelay);
291
+ if (hideActions.value.has("focus")) wrapperAction(nextHoverProps, "onBlur", false, blurDelay);
292
+ if (showActions.value.has("contextmenu")) nextHoverProps.onContextmenu = (event, ...args) => {
293
+ if (openRef.value && hideActions.value.has("contextmenu")) triggerOpen(false);
294
+ else {
295
+ setMousePosByEvent(event);
296
+ triggerOpen(true);
297
+ }
298
+ event.preventDefault();
299
+ originChildProps.onContextmenu?.(event, ...args);
300
+ };
301
+ hoverActionProps.value = nextHoverProps;
302
+ });
303
+ const rendedRef = shallowRef(false);
304
+ watchEffect(() => {
305
+ rendedRef.value ||= props.forceRender || mergedOpen.value || inMotion.value;
306
+ });
307
+ return () => {
308
+ const child = filterEmpty(slots?.default?.() ?? [])?.[0];
309
+ const mergedChildrenProps = {
310
+ ...originChildProps,
311
+ ...cloneProps.value
312
+ };
313
+ const passedProps = {};
314
+ [
315
+ "onContextmenu",
316
+ "onClick",
317
+ "onMousedown",
318
+ "onTouchstart",
319
+ "onMouseenter",
320
+ "onMouseleave",
321
+ "onFocus",
322
+ "onBlur"
323
+ ].forEach((eventName) => {
324
+ if (attrs[eventName]) passedProps[eventName] = (...args) => {
325
+ mergedChildrenProps[eventName]?.(...args);
326
+ attrs[eventName](...args);
327
+ };
328
+ });
329
+ const arrowPos = {
330
+ x: arrowX.value,
331
+ y: arrowY.value
332
+ };
333
+ const triggerNode = createVNode(child, {
334
+ ...mergedChildrenProps,
335
+ ...passedProps,
336
+ ref: setTargetRef
337
+ });
338
+ const { unique, prefixCls, popup, popupClassName, popupStyle, zIndex, fresh, onPopupClick, mask, popupMotion, maskMotion, forceRender, getPopupContainer, stretch, mobile } = props;
339
+ return createVNode(Fragment, null, [createVNode(ResizeObserver, {
340
+ "disabled": !mergedOpen.value,
341
+ "onResize": onTargetResize
342
+ }, _isSlot(triggerNode) ? triggerNode : { default: () => [triggerNode] }), rendedRef.value && targetEle.value && (!uniqueContext || !unique) && createVNode(TriggerContextProvider, context.value, { default: () => [createVNode(Popup_default, {
343
+ "portal": PortalComponent,
344
+ "ref": setPopupRef,
345
+ "prefixCls": prefixCls,
346
+ "popup": popup,
347
+ "className": classNames(popupClassName, !isMobile.value && alignedClassName.value),
348
+ "style": popupStyle,
349
+ "target": targetEle.value,
350
+ "onMouseEnter": onPopupMouseEnter,
351
+ "onMouseLeave": onPopupMouseLeave,
352
+ "onPointerEnter": onPopupMouseEnter,
353
+ "zIndex": zIndex,
354
+ "open": mergedOpen.value,
355
+ "keepDom": inMotion.value,
356
+ "fresh": fresh,
357
+ "onClick": onPopupClick,
358
+ "onPointerDownCapture": onPopupPointerDown,
359
+ "mask": mask,
360
+ "motion": popupMotion,
361
+ "maskMotion": maskMotion,
362
+ "onVisibleChanged": onVisibleChanged,
363
+ "onPrepare": onPrepare,
364
+ "forceRender": forceRender,
365
+ "autoDestroy": mergedAutoDestroy.value,
366
+ "getPopupContainer": getPopupContainer,
367
+ "align": alignInfo.value,
368
+ "arrow": innerArrow.value,
369
+ "arrowPos": arrowPos,
370
+ "ready": ready.value,
371
+ "offsetX": offsetX.value,
372
+ "offsetY": offsetY.value,
373
+ "offsetR": offsetR.value,
374
+ "offsetB": offsetB.value,
375
+ "onAlign": triggerAlign,
376
+ "stretch": stretch,
377
+ "targetWidth": targetWidth.value / scaleX.value,
378
+ "targetHeight": targetHeight.value / scaleY.value,
379
+ "mobile": mobile
380
+ }, null)] })]);
381
+ };
382
+ }, { props: /* @__PURE__ */ mergeDefaults({
383
+ action: {
384
+ type: [String, Array],
385
+ required: false,
386
+ default: void 0
387
+ },
388
+ showAction: {
389
+ type: Array,
390
+ required: false,
391
+ default: void 0
392
+ },
393
+ hideAction: {
394
+ type: Array,
395
+ required: false,
396
+ default: void 0
397
+ },
398
+ prefixCls: {
399
+ type: String,
400
+ required: false,
401
+ default: void 0
402
+ },
403
+ zIndex: {
404
+ type: Number,
405
+ required: false,
406
+ default: void 0
407
+ },
408
+ onPopupAlign: {
409
+ type: Function,
410
+ required: false,
411
+ default: void 0
412
+ },
413
+ stretch: {
414
+ type: String,
415
+ required: false,
416
+ default: void 0
417
+ },
418
+ popupVisible: {
419
+ type: Boolean,
420
+ required: false,
421
+ default: void 0
422
+ },
423
+ defaultPopupVisible: {
424
+ type: Boolean,
425
+ required: false,
426
+ default: void 0
427
+ },
428
+ onOpenChange: {
429
+ type: Function,
430
+ required: false,
431
+ default: void 0
432
+ },
433
+ afterOpenChange: {
434
+ type: Function,
435
+ required: false,
436
+ default: void 0
437
+ },
438
+ onPopupVisibleChange: {
439
+ type: Function,
440
+ required: false,
441
+ default: void 0
442
+ },
443
+ afterPopupVisibleChange: {
444
+ type: Function,
445
+ required: false,
446
+ default: void 0
447
+ },
448
+ getPopupContainer: {
449
+ type: Function,
450
+ required: false,
451
+ default: void 0
452
+ },
453
+ forceRender: {
454
+ type: Boolean,
455
+ required: false,
456
+ default: void 0
457
+ },
458
+ autoDestroy: {
459
+ type: Boolean,
460
+ required: false,
461
+ default: void 0
462
+ },
463
+ mask: {
464
+ type: Boolean,
465
+ required: false,
466
+ default: void 0
467
+ },
468
+ maskClosable: {
469
+ type: Boolean,
470
+ required: false,
471
+ default: void 0
472
+ },
473
+ popupMotion: {
474
+ type: Object,
475
+ required: false,
476
+ default: void 0
477
+ },
478
+ maskMotion: {
479
+ type: Object,
480
+ required: false,
481
+ default: void 0
482
+ },
483
+ mouseEnterDelay: {
484
+ type: Number,
485
+ required: false,
486
+ default: void 0
487
+ },
488
+ mouseLeaveDelay: {
489
+ type: Number,
490
+ required: false,
491
+ default: void 0
492
+ },
493
+ focusDelay: {
494
+ type: Number,
495
+ required: false,
496
+ default: void 0
497
+ },
498
+ blurDelay: {
499
+ type: Number,
500
+ required: false,
501
+ default: void 0
502
+ },
503
+ popup: {
504
+ type: [
505
+ String,
506
+ Number,
507
+ null,
508
+ Boolean,
509
+ Array,
510
+ Function
511
+ ],
512
+ required: true,
513
+ skipCheck: true,
514
+ default: void 0
515
+ },
516
+ popupPlacement: {
517
+ type: String,
518
+ required: false,
519
+ default: void 0
520
+ },
521
+ builtinPlacements: {
522
+ type: Object,
523
+ required: false,
524
+ default: void 0
525
+ },
526
+ popupAlign: {
527
+ type: Object,
528
+ required: false,
529
+ default: void 0
530
+ },
531
+ popupClassName: {
532
+ type: String,
533
+ required: false,
534
+ default: void 0
535
+ },
536
+ uniqueContainerClassName: {
537
+ type: String,
538
+ required: false,
539
+ default: void 0
540
+ },
541
+ uniqueContainerStyle: {
542
+ type: null,
543
+ required: false,
544
+ default: void 0
545
+ },
546
+ popupStyle: {
547
+ type: null,
548
+ required: false,
549
+ default: void 0
550
+ },
551
+ getPopupClassNameFromAlign: {
552
+ type: Function,
553
+ required: false,
554
+ default: void 0
555
+ },
556
+ onPopupClick: {
557
+ type: Function,
558
+ required: false,
559
+ default: void 0
560
+ },
561
+ alignPoint: {
562
+ type: Boolean,
563
+ required: false,
564
+ default: void 0
565
+ },
566
+ fresh: {
567
+ type: Boolean,
568
+ required: false,
569
+ default: void 0
570
+ },
571
+ unique: {
572
+ type: Boolean,
573
+ required: false,
574
+ default: void 0
575
+ },
576
+ arrow: {
577
+ type: [Boolean, Object],
578
+ required: false,
579
+ default: void 0
580
+ },
581
+ mobile: {
582
+ type: Object,
583
+ required: false,
584
+ default: void 0
585
+ }
586
+ }, defaults) });
693
587
  }
694
- const Trigger = generateTrigger(Portal);
695
- export {
696
- Trigger,
697
- default2 as UniqueProvider,
698
- Trigger as default,
699
- generateTrigger
700
- };
588
+ var Trigger = generateTrigger(Portal);
589
+ var src_default = Trigger;
590
+ export { Trigger, UniqueProvider_default as UniqueProvider, src_default as default, generateTrigger };