@destyler/hover-card 0.0.5 → 0.0.7-beta.1

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.
@@ -1,357 +0,0 @@
1
- import { defineComponent, h, toRefs, ref, watchEffect, onMounted, onUnmounted, withModifiers, mergeProps, nextTick } from 'vue';
2
- import { primitiveProps, Primitive } from '@destyler/primitive';
3
- import { useForwardExpose, useVModel, useForwardProps, useForwardPropsEmits } from '@destyler/composition';
4
- import { PopperArrow, PopperRoot, popperContentProps, PopperContent, PopperAnchor } from '@destyler/popper';
5
- import { Presence } from '@destyler/presence';
6
- import { DismissableLayer } from '@destyler/dismissable-layer';
7
- import { dismissableLayerEmits } from '@destyler/dismissable-layer/component';
8
- import { createContext } from '@destyler/shared';
9
- import { teleportPrimitiveProps, TeleportPrimitive } from '@destyler/teleport';
10
-
11
- const hoverCardArrowProps = {
12
- ...primitiveProps,
13
- /**
14
- * @default svg
15
- */
16
- as: {
17
- ...primitiveProps.as,
18
- default: "svg"
19
- },
20
- /**
21
- * The width of the arrow in pixels.
22
- *
23
- * @default 10
24
- */
25
- width: {
26
- type: Number,
27
- required: false,
28
- default: 10
29
- },
30
- /**
31
- * The height of the arrow in pixels.
32
- *
33
- * @default 5
34
- */
35
- height: {
36
- type: Number,
37
- required: false,
38
- default: 5
39
- }
40
- };
41
- const HoverCardArrow = defineComponent({
42
- name: "DestylerHoverCardArrow",
43
- props: hoverCardArrowProps,
44
- setup() {
45
- useForwardExpose();
46
- },
47
- render() {
48
- return h(PopperArrow, this.$props, () => this.$slots.default?.());
49
- }
50
- });
51
-
52
- function excludeTouch(eventHandler) {
53
- return (event) => event.pointerType === "touch" ? void 0 : eventHandler();
54
- }
55
- function getTabbableNodes(container) {
56
- const nodes = [];
57
- const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {
58
- acceptNode: (node) => {
59
- return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
60
- }
61
- });
62
- while (walker.nextNode())
63
- nodes.push(walker.currentNode);
64
- return nodes;
65
- }
66
-
67
- const hoverCardRootProps = {
68
- /**
69
- * The controlled open state of the hover card.
70
- * Can be binded as `v-model:open`.
71
- *
72
- * @default undefined
73
- */
74
- open: {
75
- type: Boolean,
76
- required: false,
77
- default: void 0
78
- },
79
- /**
80
- * The open state of the hover card when it is initially rendered.
81
- * Use when you do not need to control its open state.
82
- *
83
- * @default false
84
- */
85
- defaultOpen: {
86
- type: Boolean,
87
- required: false,
88
- default: false
89
- },
90
- /**
91
- * The duration from when the mouse enters the
92
- * trigger until the hover card opens.
93
- *
94
- * @default 700
95
- */
96
- openDelay: {
97
- type: Number,
98
- required: false,
99
- default: 700
100
- },
101
- /**
102
- * The duration from when the mouse leaves the trigger
103
- * or content until the hover card closes.
104
- *
105
- * @default 300
106
- */
107
- closeDelay: {
108
- type: Number,
109
- required: false,
110
- default: 300
111
- }
112
- };
113
- const hoverCardRootEmits = {
114
- /**
115
- * Event handler called when the open state of the hover card changes.
116
- */
117
- "update:open": (_value) => true
118
- };
119
- const [injectHoverCardRootContext, provideHoverCardRootContext] = createContext("DestylerHoverCardRoot");
120
- const HoverCardRoot = defineComponent({
121
- name: "DestylerHoverCardRoot",
122
- props: hoverCardRootProps,
123
- emits: hoverCardRootEmits,
124
- setup(props, { emit }) {
125
- const { openDelay, closeDelay } = toRefs(props);
126
- useForwardExpose();
127
- const open = useVModel(props, "open", emit, {
128
- defaultValue: props.defaultOpen,
129
- passive: props.open === void 0
130
- });
131
- const openTimerRef = ref(0);
132
- const closeTimerRef = ref(0);
133
- const hasSelectionRef = ref(false);
134
- const isPointerDownOnContentRef = ref(false);
135
- function handleOpen() {
136
- clearTimeout(closeTimerRef.value);
137
- openTimerRef.value = window.setTimeout(() => open.value = true, openDelay.value);
138
- }
139
- function handleClose() {
140
- clearTimeout(openTimerRef.value);
141
- if (!hasSelectionRef.value && !isPointerDownOnContentRef.value)
142
- closeTimerRef.value = window.setTimeout(() => open.value = false, closeDelay.value);
143
- }
144
- function handleDismiss() {
145
- open.value = false;
146
- }
147
- provideHoverCardRootContext({
148
- open,
149
- onOpenChange(value) {
150
- open.value = value;
151
- },
152
- onOpen: handleOpen,
153
- onClose: handleClose,
154
- onDismiss: handleDismiss,
155
- hasSelectionRef,
156
- isPointerDownOnContentRef
157
- });
158
- },
159
- render() {
160
- return h(PopperRoot, {}, () => this.$slots.default?.());
161
- }
162
- });
163
-
164
- const hoverCardContentImplProps = {
165
- ...popperContentProps
166
- };
167
- const hoverCardContentImplEmits = {
168
- ...dismissableLayerEmits
169
- };
170
- const HoverCardContentImpl = defineComponent({
171
- name: "DestylerHoverCardContentImpl",
172
- props: hoverCardContentImplProps,
173
- emits: hoverCardContentImplEmits,
174
- setup(props) {
175
- const forwarded = useForwardProps(props);
176
- const { forwardRef, currentElement: contentElement } = useForwardExpose();
177
- const rootContext = injectHoverCardRootContext();
178
- const containSelection = ref(false);
179
- let originalBodyUserSelect;
180
- watchEffect((cleanupFn) => {
181
- if (containSelection.value) {
182
- const body = document.body;
183
- originalBodyUserSelect = body.style.userSelect || body.style.webkitUserSelect;
184
- body.style.userSelect = "none";
185
- body.style.webkitUserSelect = "none";
186
- cleanupFn(() => {
187
- body.style.userSelect = originalBodyUserSelect;
188
- body.style.webkitUserSelect = originalBodyUserSelect;
189
- });
190
- }
191
- });
192
- function handlePointerUp() {
193
- containSelection.value = false;
194
- rootContext.isPointerDownOnContentRef.value = false;
195
- nextTick(() => {
196
- const hasSelection = document.getSelection()?.toString() !== "";
197
- if (hasSelection)
198
- rootContext.hasSelectionRef.value = true;
199
- });
200
- }
201
- onMounted(() => {
202
- if (contentElement.value) {
203
- document.addEventListener("pointerup", handlePointerUp);
204
- const tabbables = getTabbableNodes(contentElement.value);
205
- tabbables.forEach((tabbable) => tabbable.setAttribute("tabindex", "-1"));
206
- }
207
- });
208
- onUnmounted(() => {
209
- document.removeEventListener("pointerup", handlePointerUp);
210
- rootContext.hasSelectionRef.value = false;
211
- rootContext.isPointerDownOnContentRef.value = false;
212
- });
213
- return {
214
- rootContext,
215
- forwarded,
216
- forwardRef,
217
- containSelection
218
- };
219
- },
220
- render() {
221
- return h(DismissableLayer, {
222
- asChild: true,
223
- disableOutsidePointerEvents: false,
224
- onEscapeKeyDown: (event) => {
225
- this.$emit("escapeKeyDown", event);
226
- },
227
- onPointerDownOutside: (event) => {
228
- this.$emit("pointerDownOutside", event);
229
- },
230
- onFocusOutside: withModifiers((event) => {
231
- this.$emit("focusOutside", event);
232
- }, ["prevent"]),
233
- onDismiss: () => {
234
- this.rootContext.onDismiss();
235
- }
236
- }, () => h(PopperContent, mergeProps(this.forwarded, this.$attrs, {
237
- "ref": (el) => this.forwardRef(el),
238
- "data-state": this.rootContext.open.value ? "open" : "closed",
239
- "style": {
240
- "userSelect": this.containSelection ? "text" : void 0,
241
- "WebkitUserSelect": this.containSelection ? "text" : void 0,
242
- "--destyler-hover-card-content-transform-origin": "var(--destyler-popper-transform-origin)",
243
- "--destyler-hover-card-content-available-width": "var(--destyler-popper-available-width)",
244
- "--destyler-hover-card-content-available-height": "var(--destyler-popper-available-height)",
245
- "--destyler-hover-card-trigger-width": "var(--destyler-popper-anchor-width)",
246
- "--destyler-hover-card-trigger-height": "var(--destyler-popper-anchor-height)"
247
- },
248
- "onPointerdown": (event) => {
249
- if (event.currentTarget.contains(event.target))
250
- this.containSelection = true;
251
- this.rootContext.hasSelectionRef.value = false;
252
- this.rootContext.isPointerDownOnContentRef.value = true;
253
- }
254
- }), () => this.$slots.default?.()));
255
- }
256
- });
257
-
258
- const hoverCardContentProps = {
259
- ...hoverCardContentImplProps,
260
- /**
261
- * Used to force mounting when more control is needed.
262
- * Useful when controlling animation with Vue animation libraries.
263
- */
264
- forceMount: {
265
- type: Boolean,
266
- required: false
267
- }
268
- };
269
- const hoverCardContentEmits = {
270
- ...hoverCardContentImplEmits
271
- };
272
- const HoverCardContent = defineComponent({
273
- name: "DestylerHoverCardContent",
274
- props: hoverCardContentProps,
275
- emits: hoverCardContentEmits,
276
- setup(props, { emit }) {
277
- const forwarded = useForwardPropsEmits(props, emit);
278
- const { forwardRef } = useForwardExpose();
279
- const rootContext = injectHoverCardRootContext();
280
- return {
281
- rootContext,
282
- forwarded,
283
- forwardRef
284
- };
285
- },
286
- render() {
287
- return h(Presence, {
288
- present: this.forceMount || this.rootContext.open.value
289
- }, () => h(HoverCardContentImpl, mergeProps(this.forwarded, {
290
- ref: (el) => this.forwardRef(el),
291
- onPointerenter: (event) => {
292
- excludeTouch(this.rootContext.onOpen)(event);
293
- },
294
- onPointerleave: (event) => {
295
- excludeTouch(this.rootContext.onClose)(event);
296
- }
297
- }), () => this.$slots.default?.()));
298
- }
299
- });
300
-
301
- const hoverCardPortalProps = {
302
- ...teleportPrimitiveProps
303
- };
304
- const HoverCardPortal = defineComponent({
305
- name: "DestylerHoverCardPortal",
306
- props: hoverCardPortalProps,
307
- render() {
308
- return h(TeleportPrimitive, this.$props, () => this.$slots.default?.());
309
- }
310
- });
311
-
312
- const hoverCardTriggerProps = {
313
- ...primitiveProps,
314
- /**
315
- * @default a
316
- */
317
- as: {
318
- ...primitiveProps.as,
319
- default: "a"
320
- }
321
- };
322
- const HoverCardTrigger = defineComponent({
323
- name: "DestylerHoverCardTrigger",
324
- props: hoverCardTriggerProps,
325
- setup() {
326
- const { forwardRef } = useForwardExpose();
327
- const rootContext = injectHoverCardRootContext();
328
- return {
329
- rootContext,
330
- forwardRef
331
- };
332
- },
333
- render() {
334
- return h(PopperAnchor, {
335
- asChild: true
336
- }, () => h(Primitive, {
337
- "ref": (el) => this.forwardRef(el),
338
- "as": this.$props.as,
339
- "asChild": this.$props.asChild,
340
- "data-state": this.rootContext.open.value ? "open" : "closed",
341
- "onPointerenter": (event) => {
342
- excludeTouch(this.rootContext.onOpen)(event);
343
- },
344
- "onPointerleave": (event) => {
345
- excludeTouch(this.rootContext.onClose)(event);
346
- },
347
- "onFocus": () => {
348
- this.rootContext.onOpen();
349
- },
350
- "onBlur": () => {
351
- this.rootContext.onClose();
352
- }
353
- }, () => this.$slots.default?.()));
354
- }
355
- });
356
-
357
- export { HoverCardArrow, HoverCardContent, HoverCardContentImpl, HoverCardPortal, HoverCardRoot, HoverCardTrigger, hoverCardArrowProps, hoverCardContentEmits, hoverCardContentImplEmits, hoverCardContentImplProps, hoverCardContentProps, hoverCardPortalProps, hoverCardRootEmits, hoverCardRootProps, hoverCardTriggerProps };
package/dist/resolver.cjs DELETED
@@ -1,24 +0,0 @@
1
- 'use strict';
2
-
3
- const name = "@destyler/hover-card";
4
-
5
- const packageName = name;
6
- const hoverCardComponentName = [
7
- "HoverCardArrow",
8
- "HoverCardContent",
9
- "HoverCardPortal",
10
- "HoverCardRoot",
11
- "HoverCardTrigger"
12
- ];
13
- function HoverCardResolver() {
14
- return {
15
- type: "component",
16
- resolve: (name2) => {
17
- if (hoverCardComponentName.includes(name2))
18
- return { name: name2, from: packageName };
19
- }
20
- };
21
- }
22
-
23
- exports.HoverCardResolver = HoverCardResolver;
24
- exports.hoverCardComponentName = hoverCardComponentName;
@@ -1,6 +0,0 @@
1
- import { ComponentResolver } from 'unplugin-vue-components';
2
-
3
- declare const hoverCardComponentName: string[];
4
- declare function HoverCardResolver(): ComponentResolver;
5
-
6
- export { HoverCardResolver, hoverCardComponentName };
@@ -1,6 +0,0 @@
1
- import { ComponentResolver } from 'unplugin-vue-components';
2
-
3
- declare const hoverCardComponentName: string[];
4
- declare function HoverCardResolver(): ComponentResolver;
5
-
6
- export { HoverCardResolver, hoverCardComponentName };
@@ -1,6 +0,0 @@
1
- import { ComponentResolver } from 'unplugin-vue-components';
2
-
3
- declare const hoverCardComponentName: string[];
4
- declare function HoverCardResolver(): ComponentResolver;
5
-
6
- export { HoverCardResolver, hoverCardComponentName };
package/dist/resolver.mjs DELETED
@@ -1,21 +0,0 @@
1
- const name = "@destyler/hover-card";
2
-
3
- const packageName = name;
4
- const hoverCardComponentName = [
5
- "HoverCardArrow",
6
- "HoverCardContent",
7
- "HoverCardPortal",
8
- "HoverCardRoot",
9
- "HoverCardTrigger"
10
- ];
11
- function HoverCardResolver() {
12
- return {
13
- type: "component",
14
- resolve: (name2) => {
15
- if (hoverCardComponentName.includes(name2))
16
- return { name: name2, from: packageName };
17
- }
18
- };
19
- }
20
-
21
- export { HoverCardResolver, hoverCardComponentName };