@v-c/trigger 0.0.9 → 0.0.11

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