@destyler/hover-card 0.0.1-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/component.cjs +427 -0
- package/dist/component.d.cts +286 -0
- package/dist/component.d.mts +286 -0
- package/dist/component.d.ts +286 -0
- package/dist/component.mjs +420 -0
- package/dist/index.cjs +19 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.mjs +9 -0
- package/dist/resolver.cjs +20 -0
- package/dist/resolver.d.cts +6 -0
- package/dist/resolver.d.mts +6 -0
- package/dist/resolver.d.ts +6 -0
- package/dist/resolver.mjs +17 -0
- package/dist/shared/hover-card.2208f99f.d.cts +546 -0
- package/dist/shared/hover-card.2208f99f.d.mts +546 -0
- package/dist/shared/hover-card.2208f99f.d.ts +546 -0
- package/package.json +48 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { H as HoverCardRootContext } from './shared/hover-card.2208f99f.js';
|
|
2
|
+
export { D as DestylerHoverCardArrow, a as DestylerHoverCardArrowProps, b as DestylerHoverCardContent, c as DestylerHoverCardContentProps, d as DestylerHoverCardPortal, e as DestylerHoverCardPortalProps, f as DestylerHoverCardRoot, g as DestylerHoverCardRootProps, h as DestylerHoverCardTrigger, i as DestylerHoverCardTriggerProps } from './shared/hover-card.2208f99f.js';
|
|
3
|
+
import * as vue from 'vue';
|
|
4
|
+
import { PropType, Component } from 'vue';
|
|
5
|
+
import * as _destyler_shared from '@destyler/shared';
|
|
6
|
+
import { ExtractPublicPropTypes } from '@destyler/shared';
|
|
7
|
+
import * as _vue_shared from '@vue/shared';
|
|
8
|
+
import { AsTag } from '@destyler/primitive';
|
|
9
|
+
|
|
10
|
+
declare const destylerHoverCardContentImplProps: {
|
|
11
|
+
readonly as: {
|
|
12
|
+
readonly type: PropType<AsTag | Component>;
|
|
13
|
+
readonly required: false;
|
|
14
|
+
readonly default: "div";
|
|
15
|
+
};
|
|
16
|
+
readonly asChild: {
|
|
17
|
+
readonly type: PropType<boolean>;
|
|
18
|
+
readonly required: false;
|
|
19
|
+
readonly default: false;
|
|
20
|
+
};
|
|
21
|
+
readonly side: {
|
|
22
|
+
readonly type: PropType<"top" | "right" | "bottom" | "left">;
|
|
23
|
+
readonly required: false;
|
|
24
|
+
readonly default: "bottom";
|
|
25
|
+
};
|
|
26
|
+
readonly sideOffset: {
|
|
27
|
+
readonly type: PropType<number>;
|
|
28
|
+
readonly required: false;
|
|
29
|
+
readonly default: 0;
|
|
30
|
+
};
|
|
31
|
+
readonly align: {
|
|
32
|
+
readonly type: PropType<"start" | "center" | "end">;
|
|
33
|
+
readonly required: false;
|
|
34
|
+
readonly default: "center";
|
|
35
|
+
};
|
|
36
|
+
readonly alignOffset: {
|
|
37
|
+
readonly type: PropType<number>;
|
|
38
|
+
readonly required: false;
|
|
39
|
+
readonly default: 0;
|
|
40
|
+
};
|
|
41
|
+
readonly avoidCollisions: {
|
|
42
|
+
readonly type: PropType<boolean>;
|
|
43
|
+
readonly required: false;
|
|
44
|
+
readonly default: true;
|
|
45
|
+
};
|
|
46
|
+
readonly collisionBoundary: {
|
|
47
|
+
readonly type: PropType<Element | (Element | null)[] | null>;
|
|
48
|
+
readonly required: false;
|
|
49
|
+
readonly default: () => never[];
|
|
50
|
+
};
|
|
51
|
+
readonly collisionPadding: {
|
|
52
|
+
readonly type: PropType<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
|
|
53
|
+
readonly required: false;
|
|
54
|
+
readonly default: 0;
|
|
55
|
+
};
|
|
56
|
+
readonly arrowPadding: {
|
|
57
|
+
readonly type: PropType<number>;
|
|
58
|
+
readonly required: false;
|
|
59
|
+
readonly default: 0;
|
|
60
|
+
};
|
|
61
|
+
readonly sticky: {
|
|
62
|
+
readonly type: PropType<"partial" | "always">;
|
|
63
|
+
readonly required: false;
|
|
64
|
+
readonly default: "partial";
|
|
65
|
+
};
|
|
66
|
+
readonly hideWhenDetached: {
|
|
67
|
+
readonly type: PropType<boolean>;
|
|
68
|
+
readonly required: false;
|
|
69
|
+
readonly default: false;
|
|
70
|
+
};
|
|
71
|
+
readonly updatePositionStrategy: {
|
|
72
|
+
readonly type: PropType<"always" | "optimized">;
|
|
73
|
+
readonly required: false;
|
|
74
|
+
readonly default: "optimized";
|
|
75
|
+
};
|
|
76
|
+
readonly onPlaced: {
|
|
77
|
+
readonly type: PropType<() => void>;
|
|
78
|
+
readonly required: false;
|
|
79
|
+
};
|
|
80
|
+
readonly prioritizePosition: {
|
|
81
|
+
readonly type: PropType<boolean>;
|
|
82
|
+
readonly required: false;
|
|
83
|
+
readonly default: false;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
type DestylerHoverCardContentImplProps = ExtractPublicPropTypes<typeof destylerHoverCardContentImplProps>;
|
|
87
|
+
declare const DestylerHoverCardContentImpl: vue.DefineComponent<{
|
|
88
|
+
readonly as: {
|
|
89
|
+
readonly type: PropType<AsTag | Component>;
|
|
90
|
+
readonly required: false;
|
|
91
|
+
readonly default: "div";
|
|
92
|
+
};
|
|
93
|
+
readonly asChild: {
|
|
94
|
+
readonly type: PropType<boolean>;
|
|
95
|
+
readonly required: false;
|
|
96
|
+
readonly default: false;
|
|
97
|
+
};
|
|
98
|
+
readonly side: {
|
|
99
|
+
readonly type: PropType<"top" | "right" | "bottom" | "left">;
|
|
100
|
+
readonly required: false;
|
|
101
|
+
readonly default: "bottom";
|
|
102
|
+
};
|
|
103
|
+
readonly sideOffset: {
|
|
104
|
+
readonly type: PropType<number>;
|
|
105
|
+
readonly required: false;
|
|
106
|
+
readonly default: 0;
|
|
107
|
+
};
|
|
108
|
+
readonly align: {
|
|
109
|
+
readonly type: PropType<"start" | "center" | "end">;
|
|
110
|
+
readonly required: false;
|
|
111
|
+
readonly default: "center";
|
|
112
|
+
};
|
|
113
|
+
readonly alignOffset: {
|
|
114
|
+
readonly type: PropType<number>;
|
|
115
|
+
readonly required: false;
|
|
116
|
+
readonly default: 0;
|
|
117
|
+
};
|
|
118
|
+
readonly avoidCollisions: {
|
|
119
|
+
readonly type: PropType<boolean>;
|
|
120
|
+
readonly required: false;
|
|
121
|
+
readonly default: true;
|
|
122
|
+
};
|
|
123
|
+
readonly collisionBoundary: {
|
|
124
|
+
readonly type: PropType<Element | (Element | null)[] | null>;
|
|
125
|
+
readonly required: false;
|
|
126
|
+
readonly default: () => never[];
|
|
127
|
+
};
|
|
128
|
+
readonly collisionPadding: {
|
|
129
|
+
readonly type: PropType<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
|
|
130
|
+
readonly required: false;
|
|
131
|
+
readonly default: 0;
|
|
132
|
+
};
|
|
133
|
+
readonly arrowPadding: {
|
|
134
|
+
readonly type: PropType<number>;
|
|
135
|
+
readonly required: false;
|
|
136
|
+
readonly default: 0;
|
|
137
|
+
};
|
|
138
|
+
readonly sticky: {
|
|
139
|
+
readonly type: PropType<"partial" | "always">;
|
|
140
|
+
readonly required: false;
|
|
141
|
+
readonly default: "partial";
|
|
142
|
+
};
|
|
143
|
+
readonly hideWhenDetached: {
|
|
144
|
+
readonly type: PropType<boolean>;
|
|
145
|
+
readonly required: false;
|
|
146
|
+
readonly default: false;
|
|
147
|
+
};
|
|
148
|
+
readonly updatePositionStrategy: {
|
|
149
|
+
readonly type: PropType<"always" | "optimized">;
|
|
150
|
+
readonly required: false;
|
|
151
|
+
readonly default: "optimized";
|
|
152
|
+
};
|
|
153
|
+
readonly onPlaced: {
|
|
154
|
+
readonly type: PropType<() => void>;
|
|
155
|
+
readonly required: false;
|
|
156
|
+
};
|
|
157
|
+
readonly prioritizePosition: {
|
|
158
|
+
readonly type: PropType<boolean>;
|
|
159
|
+
readonly required: false;
|
|
160
|
+
readonly default: false;
|
|
161
|
+
};
|
|
162
|
+
}, {
|
|
163
|
+
rootContext: HoverCardRootContext;
|
|
164
|
+
forwarded: _destyler_shared.ComputedRefWithControl<_vue_shared.LooseRequired<{
|
|
165
|
+
readonly asChild: boolean;
|
|
166
|
+
readonly as: AsTag | Component;
|
|
167
|
+
readonly side: "top" | "right" | "bottom" | "left";
|
|
168
|
+
readonly sideOffset: number;
|
|
169
|
+
readonly align: "start" | "center" | "end";
|
|
170
|
+
readonly alignOffset: number;
|
|
171
|
+
readonly avoidCollisions: boolean;
|
|
172
|
+
readonly collisionBoundary: Element | (Element | null)[] | null;
|
|
173
|
+
readonly collisionPadding: number | Partial<Record<"top" | "right" | "bottom" | "left", number>>;
|
|
174
|
+
readonly arrowPadding: number;
|
|
175
|
+
readonly sticky: "partial" | "always";
|
|
176
|
+
readonly hideWhenDetached: boolean;
|
|
177
|
+
readonly updatePositionStrategy: "always" | "optimized";
|
|
178
|
+
readonly prioritizePosition: boolean;
|
|
179
|
+
readonly onPlaced?: (() => void) | undefined;
|
|
180
|
+
readonly onEscapeKeyDown?: ((...args: any[]) => any) | undefined;
|
|
181
|
+
readonly onPointerDownOutside?: ((...args: any[]) => any) | undefined;
|
|
182
|
+
readonly onFocusOutside?: ((...args: any[]) => any) | undefined;
|
|
183
|
+
readonly onInteractOutside?: ((...args: any[]) => any) | undefined;
|
|
184
|
+
readonly onDismiss?: ((...args: any[]) => any) | undefined;
|
|
185
|
+
} & {}>>;
|
|
186
|
+
forwardRef: (ref: Element | vue.ComponentPublicInstance | null) => void;
|
|
187
|
+
containSelection: vue.Ref<boolean>;
|
|
188
|
+
}, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, ("escapeKeyDown" | "pointerDownOutside" | "focusOutside" | "interactOutside" | "dismiss")[], "escapeKeyDown" | "pointerDownOutside" | "focusOutside" | "interactOutside" | "dismiss", vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
189
|
+
readonly as: {
|
|
190
|
+
readonly type: PropType<AsTag | Component>;
|
|
191
|
+
readonly required: false;
|
|
192
|
+
readonly default: "div";
|
|
193
|
+
};
|
|
194
|
+
readonly asChild: {
|
|
195
|
+
readonly type: PropType<boolean>;
|
|
196
|
+
readonly required: false;
|
|
197
|
+
readonly default: false;
|
|
198
|
+
};
|
|
199
|
+
readonly side: {
|
|
200
|
+
readonly type: PropType<"top" | "right" | "bottom" | "left">;
|
|
201
|
+
readonly required: false;
|
|
202
|
+
readonly default: "bottom";
|
|
203
|
+
};
|
|
204
|
+
readonly sideOffset: {
|
|
205
|
+
readonly type: PropType<number>;
|
|
206
|
+
readonly required: false;
|
|
207
|
+
readonly default: 0;
|
|
208
|
+
};
|
|
209
|
+
readonly align: {
|
|
210
|
+
readonly type: PropType<"start" | "center" | "end">;
|
|
211
|
+
readonly required: false;
|
|
212
|
+
readonly default: "center";
|
|
213
|
+
};
|
|
214
|
+
readonly alignOffset: {
|
|
215
|
+
readonly type: PropType<number>;
|
|
216
|
+
readonly required: false;
|
|
217
|
+
readonly default: 0;
|
|
218
|
+
};
|
|
219
|
+
readonly avoidCollisions: {
|
|
220
|
+
readonly type: PropType<boolean>;
|
|
221
|
+
readonly required: false;
|
|
222
|
+
readonly default: true;
|
|
223
|
+
};
|
|
224
|
+
readonly collisionBoundary: {
|
|
225
|
+
readonly type: PropType<Element | (Element | null)[] | null>;
|
|
226
|
+
readonly required: false;
|
|
227
|
+
readonly default: () => never[];
|
|
228
|
+
};
|
|
229
|
+
readonly collisionPadding: {
|
|
230
|
+
readonly type: PropType<number | Partial<Record<"top" | "right" | "bottom" | "left", number>>>;
|
|
231
|
+
readonly required: false;
|
|
232
|
+
readonly default: 0;
|
|
233
|
+
};
|
|
234
|
+
readonly arrowPadding: {
|
|
235
|
+
readonly type: PropType<number>;
|
|
236
|
+
readonly required: false;
|
|
237
|
+
readonly default: 0;
|
|
238
|
+
};
|
|
239
|
+
readonly sticky: {
|
|
240
|
+
readonly type: PropType<"partial" | "always">;
|
|
241
|
+
readonly required: false;
|
|
242
|
+
readonly default: "partial";
|
|
243
|
+
};
|
|
244
|
+
readonly hideWhenDetached: {
|
|
245
|
+
readonly type: PropType<boolean>;
|
|
246
|
+
readonly required: false;
|
|
247
|
+
readonly default: false;
|
|
248
|
+
};
|
|
249
|
+
readonly updatePositionStrategy: {
|
|
250
|
+
readonly type: PropType<"always" | "optimized">;
|
|
251
|
+
readonly required: false;
|
|
252
|
+
readonly default: "optimized";
|
|
253
|
+
};
|
|
254
|
+
readonly onPlaced: {
|
|
255
|
+
readonly type: PropType<() => void>;
|
|
256
|
+
readonly required: false;
|
|
257
|
+
};
|
|
258
|
+
readonly prioritizePosition: {
|
|
259
|
+
readonly type: PropType<boolean>;
|
|
260
|
+
readonly required: false;
|
|
261
|
+
readonly default: false;
|
|
262
|
+
};
|
|
263
|
+
}>> & {
|
|
264
|
+
onEscapeKeyDown?: ((...args: any[]) => any) | undefined;
|
|
265
|
+
onPointerDownOutside?: ((...args: any[]) => any) | undefined;
|
|
266
|
+
onFocusOutside?: ((...args: any[]) => any) | undefined;
|
|
267
|
+
onInteractOutside?: ((...args: any[]) => any) | undefined;
|
|
268
|
+
onDismiss?: ((...args: any[]) => any) | undefined;
|
|
269
|
+
}, {
|
|
270
|
+
readonly asChild: boolean;
|
|
271
|
+
readonly as: AsTag | Component;
|
|
272
|
+
readonly side: "top" | "right" | "bottom" | "left";
|
|
273
|
+
readonly sideOffset: number;
|
|
274
|
+
readonly align: "start" | "center" | "end";
|
|
275
|
+
readonly alignOffset: number;
|
|
276
|
+
readonly avoidCollisions: boolean;
|
|
277
|
+
readonly collisionBoundary: Element | (Element | null)[] | null;
|
|
278
|
+
readonly collisionPadding: number | Partial<Record<"top" | "right" | "bottom" | "left", number>>;
|
|
279
|
+
readonly arrowPadding: number;
|
|
280
|
+
readonly sticky: "partial" | "always";
|
|
281
|
+
readonly hideWhenDetached: boolean;
|
|
282
|
+
readonly updatePositionStrategy: "always" | "optimized";
|
|
283
|
+
readonly prioritizePosition: boolean;
|
|
284
|
+
}, {}>;
|
|
285
|
+
|
|
286
|
+
export { DestylerHoverCardContentImpl, type DestylerHoverCardContentImplProps };
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
import { defineComponent, h, toRefs, ref, watchEffect, onMounted, onUnmounted, withModifiers, mergeProps, nextTick } from 'vue';
|
|
2
|
+
import { useForwardExpose, useVModel, useForwardProps, useForwardPropsEmits } from '@destyler/composition';
|
|
3
|
+
import { DestylerPopperArrow, DestylerPopperRoot, DestylerPopperContent, DestylerPopperAnchor } from '@destyler/popper';
|
|
4
|
+
import { DestylerPresence } from '@destyler/presence';
|
|
5
|
+
import { DestylerDismissableLayer } from '@destyler/dismissable-layer';
|
|
6
|
+
import { createContext } from '@destyler/shared';
|
|
7
|
+
import { DestylerTeleport } from '@destyler/teleport';
|
|
8
|
+
import { DestylerPrimitive } from '@destyler/primitive';
|
|
9
|
+
|
|
10
|
+
const destylerHoverCardArrowProps = {
|
|
11
|
+
asChild: {
|
|
12
|
+
type: Boolean,
|
|
13
|
+
required: false,
|
|
14
|
+
default: false
|
|
15
|
+
},
|
|
16
|
+
width: {
|
|
17
|
+
type: Number,
|
|
18
|
+
required: false,
|
|
19
|
+
default: 10
|
|
20
|
+
},
|
|
21
|
+
height: {
|
|
22
|
+
type: Number,
|
|
23
|
+
required: false,
|
|
24
|
+
default: 5
|
|
25
|
+
},
|
|
26
|
+
as: {
|
|
27
|
+
type: [String, Object],
|
|
28
|
+
required: false,
|
|
29
|
+
default: "svg"
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const DestylerHoverCardArrow = defineComponent({
|
|
33
|
+
name: "DestylerHoverCardArrow",
|
|
34
|
+
props: destylerHoverCardArrowProps,
|
|
35
|
+
setup() {
|
|
36
|
+
useForwardExpose();
|
|
37
|
+
},
|
|
38
|
+
render() {
|
|
39
|
+
return h(DestylerPopperArrow, this.$props, {
|
|
40
|
+
default: () => this.$slots.default?.()
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
function excludeTouch(eventHandler) {
|
|
46
|
+
return (event) => event.pointerType === "touch" ? void 0 : eventHandler();
|
|
47
|
+
}
|
|
48
|
+
function getTabbableNodes(container) {
|
|
49
|
+
const nodes = [];
|
|
50
|
+
const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
|
|
51
|
+
acceptNode: (node) => {
|
|
52
|
+
return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
while (walker.nextNode())
|
|
56
|
+
nodes.push(walker.currentNode);
|
|
57
|
+
return nodes;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const destylerHoverCardRootProps = {
|
|
61
|
+
open: {
|
|
62
|
+
type: Boolean,
|
|
63
|
+
required: void 0
|
|
64
|
+
},
|
|
65
|
+
defaultOpen: {
|
|
66
|
+
type: Boolean,
|
|
67
|
+
required: false,
|
|
68
|
+
default: false
|
|
69
|
+
},
|
|
70
|
+
openDelay: {
|
|
71
|
+
type: Number,
|
|
72
|
+
required: false,
|
|
73
|
+
default: 700
|
|
74
|
+
},
|
|
75
|
+
closeDelay: {
|
|
76
|
+
type: Number,
|
|
77
|
+
required: false,
|
|
78
|
+
default: 300
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const [injectHoverCardRootContext, provideHoverCardRootContext] = createContext("DestylerHoverCardRoot");
|
|
82
|
+
const DestylerHoverCardRoot = defineComponent({
|
|
83
|
+
name: "DestylerHoverCardRoot",
|
|
84
|
+
props: destylerHoverCardRootProps,
|
|
85
|
+
emits: ["update:open"],
|
|
86
|
+
setup(props, { emit }) {
|
|
87
|
+
const { openDelay, closeDelay } = toRefs(props);
|
|
88
|
+
useForwardExpose();
|
|
89
|
+
const open = useVModel(props, "open", emit, {
|
|
90
|
+
defaultValue: props.defaultOpen,
|
|
91
|
+
passive: props.open === void 0
|
|
92
|
+
});
|
|
93
|
+
const openTimerRef = ref(0);
|
|
94
|
+
const closeTimerRef = ref(0);
|
|
95
|
+
const hasSelectionRef = ref(false);
|
|
96
|
+
const isPointerDownOnContentRef = ref(false);
|
|
97
|
+
function handleOpen() {
|
|
98
|
+
clearTimeout(closeTimerRef.value);
|
|
99
|
+
openTimerRef.value = window.setTimeout(() => open.value = true, openDelay.value);
|
|
100
|
+
}
|
|
101
|
+
function handleClose() {
|
|
102
|
+
clearTimeout(openTimerRef.value);
|
|
103
|
+
if (!hasSelectionRef.value && !isPointerDownOnContentRef.value)
|
|
104
|
+
closeTimerRef.value = window.setTimeout(() => open.value = false, closeDelay.value);
|
|
105
|
+
}
|
|
106
|
+
function handleDismiss() {
|
|
107
|
+
open.value = false;
|
|
108
|
+
}
|
|
109
|
+
provideHoverCardRootContext({
|
|
110
|
+
open,
|
|
111
|
+
onOpenChange(value) {
|
|
112
|
+
open.value = value;
|
|
113
|
+
},
|
|
114
|
+
onOpen: handleOpen,
|
|
115
|
+
onClose: handleClose,
|
|
116
|
+
onDismiss: handleDismiss,
|
|
117
|
+
hasSelectionRef,
|
|
118
|
+
isPointerDownOnContentRef
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
render() {
|
|
122
|
+
return h(DestylerPopperRoot, {}, {
|
|
123
|
+
default: () => this.$slots.default?.()
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const destylerHoverCardContentImplProps = {
|
|
129
|
+
as: {
|
|
130
|
+
type: [String, Object],
|
|
131
|
+
required: false,
|
|
132
|
+
default: "div"
|
|
133
|
+
},
|
|
134
|
+
asChild: {
|
|
135
|
+
type: Boolean,
|
|
136
|
+
required: false,
|
|
137
|
+
default: false
|
|
138
|
+
},
|
|
139
|
+
side: {
|
|
140
|
+
type: String,
|
|
141
|
+
required: false,
|
|
142
|
+
default: "bottom"
|
|
143
|
+
},
|
|
144
|
+
sideOffset: {
|
|
145
|
+
type: Number,
|
|
146
|
+
required: false,
|
|
147
|
+
default: 0
|
|
148
|
+
},
|
|
149
|
+
align: {
|
|
150
|
+
type: String,
|
|
151
|
+
required: false,
|
|
152
|
+
default: "center"
|
|
153
|
+
},
|
|
154
|
+
alignOffset: {
|
|
155
|
+
type: Number,
|
|
156
|
+
required: false,
|
|
157
|
+
default: 0
|
|
158
|
+
},
|
|
159
|
+
avoidCollisions: {
|
|
160
|
+
type: Boolean,
|
|
161
|
+
required: false,
|
|
162
|
+
default: true
|
|
163
|
+
},
|
|
164
|
+
collisionBoundary: {
|
|
165
|
+
type: [Object, Array, null],
|
|
166
|
+
required: false,
|
|
167
|
+
default: () => []
|
|
168
|
+
},
|
|
169
|
+
collisionPadding: {
|
|
170
|
+
type: [Number, Object],
|
|
171
|
+
required: false,
|
|
172
|
+
default: 0
|
|
173
|
+
},
|
|
174
|
+
arrowPadding: {
|
|
175
|
+
type: Number,
|
|
176
|
+
required: false,
|
|
177
|
+
default: 0
|
|
178
|
+
},
|
|
179
|
+
sticky: {
|
|
180
|
+
type: String,
|
|
181
|
+
required: false,
|
|
182
|
+
default: "partial"
|
|
183
|
+
},
|
|
184
|
+
hideWhenDetached: {
|
|
185
|
+
type: Boolean,
|
|
186
|
+
required: false,
|
|
187
|
+
default: false
|
|
188
|
+
},
|
|
189
|
+
updatePositionStrategy: {
|
|
190
|
+
type: String,
|
|
191
|
+
required: false,
|
|
192
|
+
default: "optimized"
|
|
193
|
+
},
|
|
194
|
+
onPlaced: {
|
|
195
|
+
type: Function,
|
|
196
|
+
required: false
|
|
197
|
+
},
|
|
198
|
+
prioritizePosition: {
|
|
199
|
+
type: Boolean,
|
|
200
|
+
required: false,
|
|
201
|
+
default: false
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
const DestylerHoverCardContentImpl = defineComponent({
|
|
205
|
+
name: "DestylerHoverCardContentImpl",
|
|
206
|
+
props: destylerHoverCardContentImplProps,
|
|
207
|
+
emits: ["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "dismiss"],
|
|
208
|
+
setup(props) {
|
|
209
|
+
const forwarded = useForwardProps(props);
|
|
210
|
+
const { forwardRef, currentElement: contentElement } = useForwardExpose();
|
|
211
|
+
const rootContext = injectHoverCardRootContext();
|
|
212
|
+
const containSelection = ref(false);
|
|
213
|
+
let originalBodyUserSelect;
|
|
214
|
+
watchEffect((cleanupFn) => {
|
|
215
|
+
if (containSelection.value) {
|
|
216
|
+
const body = document.body;
|
|
217
|
+
originalBodyUserSelect = body.style.userSelect || body.style.webkitUserSelect;
|
|
218
|
+
body.style.userSelect = "none";
|
|
219
|
+
body.style.webkitUserSelect = "none";
|
|
220
|
+
cleanupFn(() => {
|
|
221
|
+
body.style.userSelect = originalBodyUserSelect;
|
|
222
|
+
body.style.webkitUserSelect = originalBodyUserSelect;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
function handlePointerUp() {
|
|
227
|
+
containSelection.value = false;
|
|
228
|
+
rootContext.isPointerDownOnContentRef.value = false;
|
|
229
|
+
nextTick(() => {
|
|
230
|
+
const hasSelection = document.getSelection()?.toString() !== "";
|
|
231
|
+
if (hasSelection)
|
|
232
|
+
rootContext.hasSelectionRef.value = true;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
onMounted(() => {
|
|
236
|
+
if (contentElement.value) {
|
|
237
|
+
document.addEventListener("pointerup", handlePointerUp);
|
|
238
|
+
const tabbables = getTabbableNodes(contentElement.value);
|
|
239
|
+
tabbables.forEach((tabbable) => tabbable.setAttribute("tabindex", "_1"));
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
onUnmounted(() => {
|
|
243
|
+
document.removeEventListener("pointerup", handlePointerUp);
|
|
244
|
+
rootContext.hasSelectionRef.value = false;
|
|
245
|
+
rootContext.isPointerDownOnContentRef.value = false;
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
rootContext,
|
|
249
|
+
forwarded,
|
|
250
|
+
forwardRef,
|
|
251
|
+
containSelection
|
|
252
|
+
};
|
|
253
|
+
},
|
|
254
|
+
render() {
|
|
255
|
+
return h(DestylerDismissableLayer, {
|
|
256
|
+
asChild: true,
|
|
257
|
+
disableOutsidePointerEvents: false,
|
|
258
|
+
onEscapeKeyDown: (event) => {
|
|
259
|
+
this.$emit("escapeKeyDown", event);
|
|
260
|
+
},
|
|
261
|
+
onPointerDownOutside: (event) => {
|
|
262
|
+
this.$emit("pointerDownOutside", event);
|
|
263
|
+
},
|
|
264
|
+
onFocusOutside: withModifiers((event) => {
|
|
265
|
+
this.$emit("focusOutside", event);
|
|
266
|
+
}, ["prevent"]),
|
|
267
|
+
onDismiss: () => {
|
|
268
|
+
this.rootContext.onDismiss();
|
|
269
|
+
}
|
|
270
|
+
}, {
|
|
271
|
+
default: () => {
|
|
272
|
+
return h(DestylerPopperContent, mergeProps(this.forwarded, this.$attrs, {
|
|
273
|
+
ref: (el) => this.forwardRef(el),
|
|
274
|
+
data_state: this.rootContext.open.value ? "open" : "closed",
|
|
275
|
+
style: {
|
|
276
|
+
"userSelect": this.containSelection ? "text" : void 0,
|
|
277
|
+
"WebkitUserSelect": this.containSelection ? "text" : void 0,
|
|
278
|
+
"--destyler_hover_card_content_transform_origin": "var(--destyler_popper_transform_origin)",
|
|
279
|
+
"--destyler_hover_card_content_available_width": "var(--destyler_popper_available_width)",
|
|
280
|
+
"--destyler_hover_card_content_available_height": "var(--destyler_popper_available_height)",
|
|
281
|
+
"--destyler_hover_card_trigger_width": "var(--destyler_popper_anchor_width)",
|
|
282
|
+
"--destyler_hover_card_trigger_height": "var(--destyler_popper_anchor_height)"
|
|
283
|
+
},
|
|
284
|
+
onPointerdown: (event) => {
|
|
285
|
+
if (event.currentTarget.contains(event.target))
|
|
286
|
+
this.containSelection = true;
|
|
287
|
+
this.rootContext.hasSelectionRef.value = false;
|
|
288
|
+
this.rootContext.isPointerDownOnContentRef.value = true;
|
|
289
|
+
}
|
|
290
|
+
}), {
|
|
291
|
+
default: () => this.$slots.default?.()
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
const destylerHoverCardContentProps = {
|
|
299
|
+
...destylerHoverCardContentImplProps,
|
|
300
|
+
forceMount: {
|
|
301
|
+
type: Boolean,
|
|
302
|
+
required: false
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
const DestylerHoverCardContent = defineComponent({
|
|
306
|
+
name: "DestylerHoverCardContent",
|
|
307
|
+
props: destylerHoverCardContentProps,
|
|
308
|
+
emits: ["escapeKeyDown", "pointerDownOutside", "focusOutside", "interactOutside", "dismiss"],
|
|
309
|
+
setup(props, { emit }) {
|
|
310
|
+
const forwarded = useForwardPropsEmits(props, emit);
|
|
311
|
+
const { forwardRef } = useForwardExpose();
|
|
312
|
+
const rootContext = injectHoverCardRootContext();
|
|
313
|
+
return {
|
|
314
|
+
rootContext,
|
|
315
|
+
forwarded,
|
|
316
|
+
forwardRef
|
|
317
|
+
};
|
|
318
|
+
},
|
|
319
|
+
render() {
|
|
320
|
+
return h(DestylerPresence, {
|
|
321
|
+
present: this.forceMount || this.rootContext.open.value
|
|
322
|
+
}, {
|
|
323
|
+
default: () => {
|
|
324
|
+
return h(DestylerHoverCardContentImpl, mergeProps(this.forwarded, {
|
|
325
|
+
ref: (el) => this.forwardRef(el),
|
|
326
|
+
onPointerenter: (event) => {
|
|
327
|
+
excludeTouch(this.rootContext.onOpen)(event);
|
|
328
|
+
},
|
|
329
|
+
onPointerleave: (event) => {
|
|
330
|
+
excludeTouch(this.rootContext.onClose)(event);
|
|
331
|
+
}
|
|
332
|
+
}), {
|
|
333
|
+
default: () => this.$slots.default?.()
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
const destylerHoverCardPortalProps = {
|
|
341
|
+
to: {
|
|
342
|
+
type: [String, Object],
|
|
343
|
+
required: false,
|
|
344
|
+
default: "body"
|
|
345
|
+
},
|
|
346
|
+
disabled: {
|
|
347
|
+
type: Boolean,
|
|
348
|
+
required: false,
|
|
349
|
+
default: false
|
|
350
|
+
},
|
|
351
|
+
forceMount: {
|
|
352
|
+
type: Boolean,
|
|
353
|
+
required: false,
|
|
354
|
+
default: false
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
const DestylerHoverCardPortal = defineComponent({
|
|
358
|
+
name: "DestylerHoverCardPortal",
|
|
359
|
+
props: destylerHoverCardPortalProps,
|
|
360
|
+
render() {
|
|
361
|
+
return h(DestylerTeleport, this.$props, {
|
|
362
|
+
default: () => this.$slots.default?.()
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const destylerHoverCardTriggerProps = {
|
|
368
|
+
as: {
|
|
369
|
+
type: [String, Object],
|
|
370
|
+
required: false,
|
|
371
|
+
default: "a"
|
|
372
|
+
},
|
|
373
|
+
asChild: {
|
|
374
|
+
type: Boolean,
|
|
375
|
+
required: false,
|
|
376
|
+
default: false
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const DestylerHoverCardTrigger = defineComponent({
|
|
380
|
+
name: "DestylerHoverCardTrigger",
|
|
381
|
+
props: destylerHoverCardTriggerProps,
|
|
382
|
+
setup() {
|
|
383
|
+
const { forwardRef } = useForwardExpose();
|
|
384
|
+
const rootContext = injectHoverCardRootContext();
|
|
385
|
+
return {
|
|
386
|
+
rootContext,
|
|
387
|
+
forwardRef
|
|
388
|
+
};
|
|
389
|
+
},
|
|
390
|
+
render() {
|
|
391
|
+
return h(DestylerPopperAnchor, {
|
|
392
|
+
asChild: true
|
|
393
|
+
}, {
|
|
394
|
+
default: () => {
|
|
395
|
+
return h(DestylerPrimitive, {
|
|
396
|
+
"ref": (el) => this.forwardRef(el),
|
|
397
|
+
"as": this.$props.as,
|
|
398
|
+
"asChild": this.$props.asChild,
|
|
399
|
+
"data-state": this.rootContext.open.value ? "open" : "closed",
|
|
400
|
+
"onPointerenter": (event) => {
|
|
401
|
+
excludeTouch(this.rootContext.onOpen)(event);
|
|
402
|
+
},
|
|
403
|
+
"onPointerleave": (event) => {
|
|
404
|
+
excludeTouch(this.rootContext.onClose)(event);
|
|
405
|
+
},
|
|
406
|
+
"onFocus": () => {
|
|
407
|
+
this.rootContext.onOpen();
|
|
408
|
+
},
|
|
409
|
+
"onBlur": () => {
|
|
410
|
+
this.rootContext.onClose();
|
|
411
|
+
}
|
|
412
|
+
}, {
|
|
413
|
+
default: () => this.$slots.default?.()
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
export { DestylerHoverCardArrow, DestylerHoverCardContent, DestylerHoverCardContentImpl, DestylerHoverCardPortal, DestylerHoverCardRoot, DestylerHoverCardTrigger };
|