@destyler/popover 0.0.6 → 0.0.7-beta.2

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,420 +0,0 @@
1
- 'use strict';
2
-
3
- const vue = require('vue');
4
- const popper = require('@destyler/popper');
5
- const primitive = require('@destyler/primitive');
6
- const shared = require('@destyler/shared');
7
- const composition = require('@destyler/composition');
8
- const presence = require('@destyler/presence');
9
- const dismissableLayer = require('@destyler/dismissable-layer');
10
- const component = require('@destyler/dismissable-layer/component');
11
- const focusScope = require('@destyler/focus-scope');
12
- const directives = require('@destyler/directives');
13
- const teleport = require('@destyler/teleport');
14
-
15
- const popoverArrowProps = {
16
- ...popper.popperArrowProps
17
- };
18
- const PopoverArrow = vue.defineComponent({
19
- name: "DestylerPopoverArrow",
20
- props: popoverArrowProps,
21
- render() {
22
- return vue.h(popper.PopperArrow, vue.mergeProps(this.$props, {}), () => this.$slots.default?.());
23
- }
24
- });
25
-
26
- const [injectPopoverRootContext, providePopoverRootContext] = shared.createContext("DestylerPopoverRoot");
27
- const popoverRootProps = {
28
- /**
29
- * The open state of the popover when it is initially rendered. Use when you do not need to control its open state.
30
- *
31
- * @default false
32
- */
33
- defaultOpen: {
34
- type: Boolean,
35
- required: false,
36
- default: false
37
- },
38
- /**
39
- * The controlled open state of the popover.
40
- *
41
- * @default undefined
42
- */
43
- open: {
44
- type: Boolean,
45
- required: false,
46
- default: void 0
47
- },
48
- /**
49
- * The modality of the popover. When set to true, interaction with outside elements will be disabled and only popover content will be visible to screen readers.
50
- *
51
- * @default false
52
- */
53
- modal: {
54
- type: Boolean,
55
- required: false,
56
- default: false
57
- }
58
- };
59
- const popoverRootEmits = {
60
- /**
61
- * Event handler called when the open state of the popover changes.
62
- */
63
- "update:open": (_value) => true
64
- };
65
- const PopoverRoot = vue.defineComponent({
66
- name: "DestylerPopoverRoot",
67
- props: popoverRootProps,
68
- emits: popoverRootEmits,
69
- setup(props, { emit }) {
70
- const modalRef = vue.toRef(props.modal);
71
- const openRef = composition.useVModel(props, "open", emit, {
72
- defaultValue: props.defaultOpen,
73
- passive: props.open === void 0
74
- });
75
- const triggerElement = vue.ref();
76
- const hasCustomAnchor = vue.ref(false);
77
- function handleUpdateOpen(value) {
78
- openRef.value = value;
79
- }
80
- providePopoverRootContext({
81
- contentId: composition.useId(),
82
- modal: modalRef,
83
- open: openRef,
84
- onOpenChange: (value) => {
85
- handleUpdateOpen(value);
86
- },
87
- onOpenToggle: () => {
88
- handleUpdateOpen(!openRef.value);
89
- },
90
- triggerElement,
91
- hasCustomAnchor
92
- });
93
- return {
94
- openRef,
95
- modalRef,
96
- triggerElement,
97
- hasCustomAnchor
98
- };
99
- },
100
- render() {
101
- return vue.h(popper.PopperRoot, null, () => this.$slots.default?.());
102
- }
103
- });
104
-
105
- const popoverCloseProps = {
106
- ...primitive.primitiveProps,
107
- /**
108
- * @default button
109
- */
110
- as: {
111
- ...primitive.primitiveProps.as,
112
- default: "button"
113
- }
114
- };
115
- const PopoverClose = vue.defineComponent({
116
- name: "DestylerPopoverClose",
117
- props: popoverCloseProps,
118
- setup() {
119
- const rootContext = injectPopoverRootContext();
120
- return {
121
- rootContext
122
- };
123
- },
124
- render() {
125
- return vue.h(primitive.Primitive, {
126
- as: this.$props.as,
127
- asChild: this.$props.asChild,
128
- type: this.$props.as === "button" ? "button" : void 0,
129
- onClick: () => {
130
- this.rootContext.onOpenChange(false);
131
- }
132
- }, () => this.$slots.default?.());
133
- }
134
- });
135
-
136
- const popoverContentImplProps = {
137
- ...popper.popperContentProps,
138
- ...dismissableLayer.dismissableLayerProps,
139
- /**
140
- * Used to force mounting when more control is needed. Useful when
141
- * controlling animation with Vue animation libraries.
142
- */
143
- trapFocus: {
144
- ...focusScope.focusScopeProps.trapped
145
- }
146
- };
147
- const popoverContentImplEmits = {
148
- ...component.dismissableLayerEmits,
149
- /**
150
- * Event handler called when auto-focusing on open.
151
- * Can be prevented.
152
- */
153
- openAutoFocus: (_event) => true,
154
- /**
155
- * Event handler called when auto-focusing on close.
156
- * Can be prevented.
157
- */
158
- closeAutoFocus: (_event) => true
159
- };
160
- const PopoverContentImpl = vue.defineComponent({
161
- name: "DestylerPopoverContentImpl",
162
- props: popoverContentImplProps,
163
- emits: popoverContentImplEmits,
164
- setup(props) {
165
- const forwarded = composition.useForwardProps(props);
166
- const rootContext = injectPopoverRootContext();
167
- composition.useFocusGuards();
168
- return {
169
- rootContext,
170
- forwarded
171
- };
172
- },
173
- render() {
174
- return vue.h(focusScope.FocusScope, {
175
- asChild: true,
176
- loop: true,
177
- trapped: this.$props.trapFocus,
178
- onMountAutoFocus: (event) => {
179
- this.$emit("openAutoFocus", event);
180
- },
181
- onUnmountAutoFocus: (event) => {
182
- this.$emit("closeAutoFocus", event);
183
- }
184
- }, () => vue.h(dismissableLayer.DismissableLayer, {
185
- asChild: true,
186
- disableOutsidePointerEvents: this.$props.disableOutsidePointerEvents,
187
- onPointerDownOutside: (event) => {
188
- this.$emit("pointerDownOutside", event);
189
- },
190
- onInteractOutside: (event) => {
191
- this.$emit("interactOutside", event);
192
- },
193
- onEscapeKeyDown: (event) => {
194
- this.$emit("escapeKeyDown", event);
195
- },
196
- onFocusOutside: (event) => {
197
- this.$emit("focusOutside", event);
198
- },
199
- onDismiss: () => {
200
- this.rootContext.onOpenChange(false);
201
- }
202
- }, () => vue.withDirectives(vue.h(popper.PopperContent, vue.mergeProps(this.forwarded, {
203
- "data-state": this.rootContext.open.value ? "open" : "closed",
204
- "role": "dialog",
205
- "style": {
206
- "--destyler-popover-content-transform-origin": "var(--destyler-popper-transform-origin)",
207
- "--destyler-popover-content-available-width": "var(--destyler-popper-available-width)",
208
- "--destyler-popover-content-available-height": "var(--destyler-popper-available-height)",
209
- "--destyler-popover-trigger-width": "var(--destyler-popper-anchor-width)",
210
- "--destyler-popover-trigger-height": "var(--destyler-popper-anchor-height)"
211
- }
212
- }), () => this.$slots.default?.()), [
213
- [directives.BindOnceDirective, { id: this.rootContext.contentId }]
214
- ])));
215
- }
216
- });
217
-
218
- const PopoverContentModal = vue.defineComponent({
219
- name: "DestylerPopoverContentModal",
220
- props: popoverContentImplProps,
221
- emits: popoverContentImplEmits,
222
- setup(props, { emit }) {
223
- const rootContext = injectPopoverRootContext();
224
- const isRightClickOutsideRef = vue.ref(false);
225
- const forwarded = composition.useForwardPropsEmits(props, emit);
226
- const { forwardRef, currentElement } = composition.useForwardExpose();
227
- composition.useHideOthers(currentElement);
228
- return {
229
- rootContext,
230
- forwarded,
231
- isRightClickOutsideRef,
232
- forwardRef
233
- };
234
- },
235
- render() {
236
- return vue.h(PopoverContentImpl, {
237
- ref: (el) => this.forwardRef(el),
238
- ...vue.mergeProps(this.forwarded),
239
- trapFocus: this.rootContext.open.value,
240
- disableOutsidePointerEvents: true,
241
- onCloseAutoFocusPrevent: (event) => {
242
- this.$emit("closeAutoFocus", event);
243
- if (!this.isRightClickOutsideRef)
244
- this.rootContext.triggerElement.value?.focus();
245
- },
246
- onPointerDownOutside: (event) => {
247
- this.$emit("pointerDownOutside", event);
248
- const originalEvent = event.detail.originalEvent;
249
- const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
250
- const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
251
- this.isRightClickOutsideRef = isRightClick;
252
- }
253
- }, () => this.$slots.default?.());
254
- }
255
- });
256
-
257
- const PopoverContentNonModal = vue.defineComponent({
258
- name: "DestylerPopoverContentNonModal",
259
- props: popoverContentImplProps,
260
- emits: popoverContentImplEmits,
261
- setup(props, { emit }) {
262
- const rootContext = injectPopoverRootContext();
263
- const hasInteractedOutsideRef = vue.ref(false);
264
- const hasPointerDownOutsideRef = vue.ref(false);
265
- const forwarded = composition.useForwardPropsEmits(props, emit);
266
- return {
267
- forwarded,
268
- rootContext,
269
- hasInteractedOutsideRef,
270
- hasPointerDownOutsideRef
271
- };
272
- },
273
- render() {
274
- return vue.h(PopoverContentImpl, {
275
- ...this.forwarded,
276
- trapFocus: false,
277
- disableOutsidePointerEvents: false,
278
- onCloseAutoFocus: (event) => {
279
- this.$emit("closeAutoFocus", event);
280
- if (!event.defaultPrevented) {
281
- if (!this.hasInteractedOutsideRef)
282
- this.rootContext.triggerElement.value?.focus();
283
- event.preventDefault();
284
- }
285
- this.hasInteractedOutsideRef = false;
286
- this.hasPointerDownOutsideRef = false;
287
- },
288
- onInteractOutside: async (event) => {
289
- this.$emit("interactOutside", event);
290
- if (!event.defaultPrevented) {
291
- this.hasInteractedOutsideRef = true;
292
- if (event.detail.originalEvent.type === "pointerdown")
293
- this.hasPointerDownOutsideRef = true;
294
- }
295
- const target = event.target;
296
- const targetIsTrigger = this.rootContext.triggerElement.value?.contains(target);
297
- if (targetIsTrigger)
298
- event.preventDefault();
299
- if (event.detail.originalEvent.type === "focusin" && this.hasPointerDownOutsideRef)
300
- event.preventDefault();
301
- }
302
- }, () => this.$slots.default?.());
303
- }
304
- });
305
-
306
- const popoverContentProps = {
307
- ...popoverContentImplProps,
308
- /**
309
- * Used to force mounting when more control is needed. Useful when
310
- * controlling animation with Vue animation libraries.
311
- *
312
- * @default false
313
- */
314
- forceMount: {
315
- type: Boolean,
316
- required: false,
317
- default: false
318
- }
319
- };
320
- const popoverContentEmits = {
321
- ...popoverContentImplEmits
322
- };
323
- const PopoverContent = vue.defineComponent({
324
- name: "DestylerPopoverContent",
325
- props: popoverContentProps,
326
- emits: popoverContentEmits,
327
- setup(props, { emit }) {
328
- const rootContext = injectPopoverRootContext();
329
- const forwarded = composition.useForwardPropsEmits(props, emit);
330
- return {
331
- rootContext,
332
- forwarded
333
- };
334
- },
335
- render() {
336
- const useVShow = this.rootContext.modal.value;
337
- return vue.h(presence.Presence, {
338
- present: this.forceMount || this.rootContext.open.value
339
- }, () => useVShow ? vue.h(PopoverContentModal, {
340
- ...this.forwarded
341
- }, () => this.$slots.default?.()) : vue.h(PopoverContentNonModal, {
342
- ...this.forwarded
343
- }, () => this.$slots.default?.()));
344
- }
345
- });
346
-
347
- const popoverPortalProps = {
348
- ...teleport.teleportPrimitiveProps
349
- };
350
- const PopoverPortal = vue.defineComponent({
351
- name: "DestylerPopoverPortal",
352
- props: popoverPortalProps,
353
- render() {
354
- return vue.h(teleport.TeleportPrimitive, vue.mergeProps(this.$props), () => this.$slots.default?.());
355
- }
356
- });
357
-
358
- const popoverTriggerProps = {
359
- ...primitive.primitiveProps,
360
- /**
361
- * @default button
362
- */
363
- as: {
364
- ...primitive.primitiveProps.as,
365
- default: "button"
366
- }
367
- };
368
- const PopoverTrigger = vue.defineComponent({
369
- name: "DestylerPopoverTrigger",
370
- props: popoverTriggerProps,
371
- setup() {
372
- const rootContext = injectPopoverRootContext();
373
- const { forwardRef, currentElement: triggerElement } = composition.useForwardExpose();
374
- vue.onMounted(() => {
375
- rootContext.triggerElement.value = triggerElement.value;
376
- });
377
- return {
378
- rootContext,
379
- forwardRef
380
- };
381
- },
382
- render() {
383
- return vue.h(this.rootContext.hasCustomAnchor.value ? primitive.Primitive : popper.PopperAnchor, {
384
- asChild: true
385
- }, () => vue.h(primitive.Primitive, {
386
- "ref": (el) => this.forwardRef(el),
387
- "type": this.$props.as === "button" ? "button" : void 0,
388
- "as": this.$props.as,
389
- "aria-haspopup": "dialog",
390
- "asChild": this.$props.asChild,
391
- "aria-expanded": this.rootContext.open.value,
392
- "aria-controls": this.rootContext.contentId,
393
- "data-state": this.rootContext.open.value ? "open" : "closed",
394
- "onClick": () => {
395
- this.rootContext.onOpenToggle();
396
- }
397
- }, () => this.$slots.default?.()));
398
- }
399
- });
400
-
401
- exports.PopoverArrow = PopoverArrow;
402
- exports.PopoverClose = PopoverClose;
403
- exports.PopoverContent = PopoverContent;
404
- exports.PopoverContentImpl = PopoverContentImpl;
405
- exports.PopoverContentModal = PopoverContentModal;
406
- exports.PopoverContentNonModal = PopoverContentNonModal;
407
- exports.PopoverPortal = PopoverPortal;
408
- exports.PopoverRoot = PopoverRoot;
409
- exports.PopoverTrigger = PopoverTrigger;
410
- exports.injectPopoverRootContext = injectPopoverRootContext;
411
- exports.popoverArrowProps = popoverArrowProps;
412
- exports.popoverCloseProps = popoverCloseProps;
413
- exports.popoverContentEmits = popoverContentEmits;
414
- exports.popoverContentImplEmits = popoverContentImplEmits;
415
- exports.popoverContentImplProps = popoverContentImplProps;
416
- exports.popoverContentProps = popoverContentProps;
417
- exports.popoverPortalProps = popoverPortalProps;
418
- exports.popoverRootEmits = popoverRootEmits;
419
- exports.popoverRootProps = popoverRootProps;
420
- exports.popoverTriggerProps = popoverTriggerProps;