@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.
package/dist/index.mjs CHANGED
@@ -1,12 +1,437 @@
1
- export { P as PopoverArrow, a as PopoverClose, c as PopoverContent, l as PopoverPortal, n as PopoverRoot, r as PopoverTrigger, p as popoverArrowProps, b as popoverCloseProps, d as popoverContentProps, m as popoverPortalProps, o as popoverRootProps, s as popoverTriggerProps } from './shared/popover.005a231a.mjs';
2
- import 'vue';
3
- import '@destyler/popper';
4
- import '@destyler/primitive';
5
- import '@destyler/shared';
6
- import '@destyler/composition';
7
- import '@destyler/presence';
8
- import '@destyler/dismissable-layer';
9
- import '@destyler/dismissable-layer/component';
10
- import '@destyler/focus-scope';
11
- import '@destyler/directives';
12
- import '@destyler/teleport';
1
+ import { createAnatomy } from '@zag-js/anatomy';
2
+ import { createScope, getFocusables, isSafari, dataAttr, proxyTabFocus, getInitialFocus, raf } from '@zag-js/dom-query';
3
+ import { getPlacementStyles, getPlacement } from '@zag-js/popper';
4
+ import { ariaHidden } from '@zag-js/aria-hidden';
5
+ import { createMachine } from '@zag-js/core';
6
+ import { trackDismissableElement } from '@zag-js/dismissable';
7
+ import { trapFocus } from '@zag-js/focus-trap';
8
+ import { preventBodyScroll } from '@zag-js/remove-scroll';
9
+ import { compact, createSplitProps } from '@zag-js/utils';
10
+ import { createProps } from '@zag-js/types';
11
+
12
+ const anatomy = createAnatomy("popover").parts(
13
+ "arrow",
14
+ "arrowTip",
15
+ "anchor",
16
+ "trigger",
17
+ "indicator",
18
+ "positioner",
19
+ "content",
20
+ "title",
21
+ "description",
22
+ "closeTrigger"
23
+ );
24
+ const parts = anatomy.build();
25
+
26
+ const dom = createScope({
27
+ getAnchorId: (ctx) => ctx.ids?.anchor ?? `popover:${ctx.id}:anchor`,
28
+ getTriggerId: (ctx) => ctx.ids?.trigger ?? `popover:${ctx.id}:trigger`,
29
+ getContentId: (ctx) => ctx.ids?.content ?? `popover:${ctx.id}:content`,
30
+ getPositionerId: (ctx) => ctx.ids?.positioner ?? `popover:${ctx.id}:popper`,
31
+ getArrowId: (ctx) => ctx.ids?.arrow ?? `popover:${ctx.id}:arrow`,
32
+ getTitleId: (ctx) => ctx.ids?.title ?? `popover:${ctx.id}:title`,
33
+ getDescriptionId: (ctx) => ctx.ids?.description ?? `popover:${ctx.id}:desc`,
34
+ getCloseTriggerId: (ctx) => ctx.ids?.closeTrigger ?? `popover:${ctx.id}:close`,
35
+ getAnchorEl: (ctx) => dom.getById(ctx, dom.getAnchorId(ctx)),
36
+ getTriggerEl: (ctx) => dom.getById(ctx, dom.getTriggerId(ctx)),
37
+ getContentEl: (ctx) => dom.getById(ctx, dom.getContentId(ctx)),
38
+ getPositionerEl: (ctx) => dom.getById(ctx, dom.getPositionerId(ctx)),
39
+ getTitleEl: (ctx) => dom.getById(ctx, dom.getTitleId(ctx)),
40
+ getDescriptionEl: (ctx) => dom.getById(ctx, dom.getDescriptionId(ctx)),
41
+ getFocusableEls: (ctx) => getFocusables(dom.getContentEl(ctx)),
42
+ getFirstFocusableEl: (ctx) => dom.getFocusableEls(ctx)[0]
43
+ });
44
+
45
+ function connect(state, send, normalize) {
46
+ const open = state.matches("open");
47
+ const currentPlacement = state.context.currentPlacement;
48
+ const portalled = state.context.currentPortalled;
49
+ const rendered = state.context.renderedElements;
50
+ const popperStyles = getPlacementStyles({
51
+ ...state.context.positioning,
52
+ placement: currentPlacement
53
+ });
54
+ return {
55
+ portalled,
56
+ open,
57
+ setOpen(nextOpen) {
58
+ if (nextOpen === open)
59
+ return;
60
+ send(nextOpen ? "OPEN" : "CLOSE");
61
+ },
62
+ reposition(options = {}) {
63
+ send({ type: "POSITIONING.SET", options });
64
+ },
65
+ getArrowProps() {
66
+ return normalize.element({
67
+ id: dom.getArrowId(state.context),
68
+ ...parts.arrow.attrs,
69
+ dir: state.context.dir,
70
+ style: popperStyles.arrow
71
+ });
72
+ },
73
+ getArrowTipProps() {
74
+ return normalize.element({
75
+ ...parts.arrowTip.attrs,
76
+ dir: state.context.dir,
77
+ style: popperStyles.arrowTip
78
+ });
79
+ },
80
+ getAnchorProps() {
81
+ return normalize.element({
82
+ ...parts.anchor.attrs,
83
+ dir: state.context.dir,
84
+ id: dom.getAnchorId(state.context)
85
+ });
86
+ },
87
+ getTriggerProps() {
88
+ return normalize.button({
89
+ ...parts.trigger.attrs,
90
+ "dir": state.context.dir,
91
+ "type": "button",
92
+ "data-placement": currentPlacement,
93
+ "id": dom.getTriggerId(state.context),
94
+ "aria-haspopup": "dialog",
95
+ "aria-expanded": open,
96
+ "data-state": open ? "open" : "closed",
97
+ "aria-controls": dom.getContentId(state.context),
98
+ onPointerDown(event) {
99
+ if (isSafari()) {
100
+ event.currentTarget.focus();
101
+ }
102
+ },
103
+ onClick(event) {
104
+ if (event.defaultPrevented)
105
+ return;
106
+ send("TOGGLE");
107
+ },
108
+ onBlur(event) {
109
+ send({ type: "TRIGGER_BLUR", target: event.relatedTarget });
110
+ }
111
+ });
112
+ },
113
+ getIndicatorProps() {
114
+ return normalize.element({
115
+ ...parts.indicator.attrs,
116
+ "dir": state.context.dir,
117
+ "data-state": open ? "open" : "closed"
118
+ });
119
+ },
120
+ getPositionerProps() {
121
+ return normalize.element({
122
+ id: dom.getPositionerId(state.context),
123
+ ...parts.positioner.attrs,
124
+ dir: state.context.dir,
125
+ style: popperStyles.floating
126
+ });
127
+ },
128
+ getContentProps() {
129
+ return normalize.element({
130
+ ...parts.content.attrs,
131
+ "dir": state.context.dir,
132
+ "id": dom.getContentId(state.context),
133
+ "tabIndex": -1,
134
+ "role": "dialog",
135
+ "hidden": !open,
136
+ "data-state": open ? "open" : "closed",
137
+ "data-expanded": dataAttr(open),
138
+ "aria-labelledby": rendered.title ? dom.getTitleId(state.context) : void 0,
139
+ "aria-describedby": rendered.description ? dom.getDescriptionId(state.context) : void 0,
140
+ "data-placement": currentPlacement
141
+ });
142
+ },
143
+ getTitleProps() {
144
+ return normalize.element({
145
+ ...parts.title.attrs,
146
+ id: dom.getTitleId(state.context),
147
+ dir: state.context.dir
148
+ });
149
+ },
150
+ getDescriptionProps() {
151
+ return normalize.element({
152
+ ...parts.description.attrs,
153
+ id: dom.getDescriptionId(state.context),
154
+ dir: state.context.dir
155
+ });
156
+ },
157
+ getCloseTriggerProps() {
158
+ return normalize.button({
159
+ ...parts.closeTrigger.attrs,
160
+ "dir": state.context.dir,
161
+ "id": dom.getCloseTriggerId(state.context),
162
+ "type": "button",
163
+ "aria-label": "close",
164
+ onClick(event) {
165
+ if (event.defaultPrevented)
166
+ return;
167
+ send("CLOSE");
168
+ }
169
+ });
170
+ }
171
+ };
172
+ }
173
+
174
+ function machine(userContext) {
175
+ const ctx = compact(userContext);
176
+ return createMachine(
177
+ {
178
+ id: "popover",
179
+ initial: ctx.open ? "open" : "closed",
180
+ context: {
181
+ closeOnInteractOutside: true,
182
+ closeOnEscape: true,
183
+ autoFocus: true,
184
+ modal: false,
185
+ portalled: true,
186
+ positioning: {
187
+ placement: "bottom",
188
+ ...ctx.positioning
189
+ },
190
+ currentPlacement: void 0,
191
+ ...ctx,
192
+ renderedElements: {
193
+ title: true,
194
+ description: true
195
+ }
196
+ },
197
+ computed: {
198
+ currentPortalled: (ctx2) => !!ctx2.modal || !!ctx2.portalled
199
+ },
200
+ watch: {
201
+ open: ["toggleVisibility"]
202
+ },
203
+ entry: ["checkRenderedElements"],
204
+ states: {
205
+ closed: {
206
+ on: {
207
+ "CONTROLLED.OPEN": {
208
+ target: "open",
209
+ actions: ["setInitialFocus"]
210
+ },
211
+ "TOGGLE": [
212
+ {
213
+ guard: "isOpenControlled",
214
+ actions: ["invokeOnOpen"]
215
+ },
216
+ {
217
+ target: "open",
218
+ actions: ["invokeOnOpen", "setInitialFocus"]
219
+ }
220
+ ],
221
+ "OPEN": [
222
+ {
223
+ guard: "isOpenControlled",
224
+ actions: ["invokeOnOpen"]
225
+ },
226
+ {
227
+ target: "open",
228
+ actions: ["invokeOnOpen", "setInitialFocus"]
229
+ }
230
+ ]
231
+ }
232
+ },
233
+ open: {
234
+ activities: [
235
+ "trapFocus",
236
+ "preventScroll",
237
+ "hideContentBelow",
238
+ "trackPositioning",
239
+ "trackDismissableElement",
240
+ "proxyTabFocus"
241
+ ],
242
+ on: {
243
+ "CONTROLLED.CLOSE": {
244
+ target: "closed",
245
+ actions: ["setFinalFocus"]
246
+ },
247
+ "CLOSE": [
248
+ {
249
+ guard: "isOpenControlled",
250
+ actions: ["invokeOnClose"]
251
+ },
252
+ {
253
+ target: "closed",
254
+ actions: ["invokeOnClose", "setFinalFocus"]
255
+ }
256
+ ],
257
+ "TOGGLE": [
258
+ {
259
+ guard: "isOpenControlled",
260
+ actions: ["invokeOnClose"]
261
+ },
262
+ {
263
+ target: "closed",
264
+ actions: ["invokeOnClose"]
265
+ }
266
+ ],
267
+ "POSITIONING.SET": {
268
+ actions: "reposition"
269
+ }
270
+ }
271
+ }
272
+ }
273
+ },
274
+ {
275
+ guards: {
276
+ isOpenControlled: (ctx2) => !!ctx2["open.controlled"]
277
+ },
278
+ activities: {
279
+ trackPositioning(ctx2) {
280
+ ctx2.currentPlacement = ctx2.positioning.placement;
281
+ const anchorEl = dom.getAnchorEl(ctx2) ?? dom.getTriggerEl(ctx2);
282
+ const getPositionerEl = () => dom.getPositionerEl(ctx2);
283
+ return getPlacement(anchorEl, getPositionerEl, {
284
+ ...ctx2.positioning,
285
+ defer: true,
286
+ onComplete(data) {
287
+ ctx2.currentPlacement = data.placement;
288
+ }
289
+ });
290
+ },
291
+ trackDismissableElement(ctx2, _evt, { send }) {
292
+ const getContentEl = () => dom.getContentEl(ctx2);
293
+ let restoreFocus = true;
294
+ return trackDismissableElement(getContentEl, {
295
+ pointerBlocking: ctx2.modal,
296
+ exclude: dom.getTriggerEl(ctx2),
297
+ defer: true,
298
+ onEscapeKeyDown(event) {
299
+ ctx2.onEscapeKeyDown?.(event);
300
+ if (ctx2.closeOnEscape)
301
+ return;
302
+ event.preventDefault();
303
+ },
304
+ onInteractOutside(event) {
305
+ ctx2.onInteractOutside?.(event);
306
+ if (event.defaultPrevented)
307
+ return;
308
+ restoreFocus = !(event.detail.focusable || event.detail.contextmenu);
309
+ if (!ctx2.closeOnInteractOutside) {
310
+ event.preventDefault();
311
+ }
312
+ },
313
+ onPointerDownOutside: ctx2.onPointerDownOutside,
314
+ onFocusOutside: ctx2.onFocusOutside,
315
+ persistentElements: ctx2.persistentElements,
316
+ onDismiss() {
317
+ send({ type: "CLOSE", src: "interact-outside", restoreFocus });
318
+ }
319
+ });
320
+ },
321
+ proxyTabFocus(ctx2) {
322
+ if (ctx2.modal || !ctx2.portalled)
323
+ return;
324
+ const getContentEl = () => dom.getContentEl(ctx2);
325
+ return proxyTabFocus(getContentEl, {
326
+ triggerElement: dom.getTriggerEl(ctx2),
327
+ defer: true,
328
+ onFocus(el) {
329
+ el.focus({ preventScroll: true });
330
+ }
331
+ });
332
+ },
333
+ hideContentBelow(ctx2) {
334
+ if (!ctx2.modal)
335
+ return;
336
+ const getElements = () => [dom.getContentEl(ctx2), dom.getTriggerEl(ctx2)];
337
+ return ariaHidden(getElements, { defer: true });
338
+ },
339
+ preventScroll(ctx2) {
340
+ if (!ctx2.modal)
341
+ return;
342
+ return preventBodyScroll(dom.getDoc(ctx2));
343
+ },
344
+ trapFocus(ctx2) {
345
+ if (!ctx2.modal)
346
+ return;
347
+ const contentEl = () => dom.getContentEl(ctx2);
348
+ return trapFocus(contentEl, {
349
+ initialFocus: () => getInitialFocus({
350
+ root: dom.getContentEl(ctx2),
351
+ getInitialEl: ctx2.initialFocusEl,
352
+ enabled: ctx2.autoFocus
353
+ })
354
+ });
355
+ }
356
+ },
357
+ actions: {
358
+ reposition(ctx2, evt) {
359
+ const anchorEl = dom.getAnchorEl(ctx2) ?? dom.getTriggerEl(ctx2);
360
+ const getPositionerEl = () => dom.getPositionerEl(ctx2);
361
+ getPlacement(anchorEl, getPositionerEl, {
362
+ ...ctx2.positioning,
363
+ ...evt.options,
364
+ defer: true,
365
+ listeners: false,
366
+ onComplete(data) {
367
+ ctx2.currentPlacement = data.placement;
368
+ }
369
+ });
370
+ },
371
+ checkRenderedElements(ctx2) {
372
+ raf(() => {
373
+ Object.assign(ctx2.renderedElements, {
374
+ title: !!dom.getTitleEl(ctx2),
375
+ description: !!dom.getDescriptionEl(ctx2)
376
+ });
377
+ });
378
+ },
379
+ setInitialFocus(ctx2) {
380
+ if (ctx2.modal)
381
+ return;
382
+ raf(() => {
383
+ const element = getInitialFocus({
384
+ root: dom.getContentEl(ctx2),
385
+ getInitialEl: ctx2.initialFocusEl,
386
+ enabled: ctx2.autoFocus
387
+ });
388
+ element?.focus({ preventScroll: true });
389
+ });
390
+ },
391
+ setFinalFocus(ctx2, evt) {
392
+ const restoreFocus = evt.restoreFocus ?? evt.previousEvent?.restoreFocus;
393
+ if (restoreFocus != null && !restoreFocus)
394
+ return;
395
+ raf(() => {
396
+ const element = dom.getTriggerEl(ctx2);
397
+ element?.focus({ preventScroll: true });
398
+ });
399
+ },
400
+ invokeOnOpen(ctx2) {
401
+ ctx2.onOpenChange?.({ open: true });
402
+ },
403
+ invokeOnClose(ctx2) {
404
+ ctx2.onOpenChange?.({ open: false });
405
+ },
406
+ toggleVisibility(ctx2, evt, { send }) {
407
+ send({ type: ctx2.open ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE", previousEvent: evt });
408
+ }
409
+ }
410
+ }
411
+ );
412
+ }
413
+
414
+ const props = createProps()([
415
+ "autoFocus",
416
+ "closeOnEscape",
417
+ "closeOnInteractOutside",
418
+ "dir",
419
+ "getRootNode",
420
+ "id",
421
+ "ids",
422
+ "initialFocusEl",
423
+ "modal",
424
+ "onEscapeKeyDown",
425
+ "onFocusOutside",
426
+ "onInteractOutside",
427
+ "onOpenChange",
428
+ "onPointerDownOutside",
429
+ "open.controlled",
430
+ "open",
431
+ "persistentElements",
432
+ "portalled",
433
+ "positioning"
434
+ ]);
435
+ const splitProps = createSplitProps(props);
436
+
437
+ export { anatomy, connect, machine, props, splitProps };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@destyler/popover",
3
3
  "type": "module",
4
- "version": "0.0.6",
4
+ "version": "0.0.7-beta.2",
5
5
  "description": "displays rich content in a portal, triggered by a button.",
6
6
  "author": "Elone Hoo <elonehoo@gmail.com>",
7
7
  "license": "MIT",
@@ -10,14 +10,6 @@
10
10
  "types": "./dist/index.d.mts",
11
11
  "default": "./dist/index.mjs"
12
12
  },
13
- "./resolver": {
14
- "types": "./dist/resolver.d.mts",
15
- "default": "./dist/resolver.mjs"
16
- },
17
- "./component": {
18
- "types": "./dist/component.d.mts",
19
- "default": "./dist/component.mjs"
20
- },
21
13
  "./*": "./*"
22
14
  },
23
15
  "main": "dist/index.cjs",
@@ -27,22 +19,21 @@
27
19
  "*.d.ts",
28
20
  "dist"
29
21
  ],
30
- "peerDependencies": {
31
- "vue": ">=3.4.21"
32
- },
33
22
  "dependencies": {
34
- "@destyler/composition": "0.0.6",
35
- "@destyler/directives": "0.0.6",
36
- "@destyler/dismissable-layer": "0.0.6",
37
- "@destyler/popper": "0.0.6",
38
- "@destyler/primitive": "0.0.6",
39
- "@destyler/presence": "0.0.6",
40
- "@destyler/shared": "0.0.6",
41
- "@destyler/teleport": "0.0.6",
42
- "@destyler/focus-scope": "0.0.6"
23
+ "@zag-js/anatomy": "^0.80.0",
24
+ "@zag-js/aria-hidden": "^0.80.0",
25
+ "@zag-js/core": "^0.80.0",
26
+ "@zag-js/dismissable": "^0.80.0",
27
+ "@zag-js/dom-query": "^0.80.0",
28
+ "@zag-js/focus-trap": "^0.80.0",
29
+ "@zag-js/popper": "^0.80.0",
30
+ "@zag-js/remove-scroll": "^0.80.0",
31
+ "@zag-js/types": "^0.80.0",
32
+ "@zag-js/utils": "^0.80.0"
43
33
  },
44
34
  "scripts": {
45
35
  "clear": "rimraf ./dist",
36
+ "clear:node_modules": "rimraf ./node_modules",
46
37
  "build": "pnpm run clear && unbuild",
47
38
  "stub": "unbuild --stub"
48
39
  }
package/README.md DELETED
@@ -1,7 +0,0 @@
1
- # @destyler/popover
2
-
3
- [![NPM version](https://img.shields.io/npm/v/@destyler/popover?color=a1b858&popover=)](https://www.npmjs.com/package/@destyler/popover)
4
-
5
- > displays rich content in a portal, triggered by a button.
6
-
7
- [GitHub](https://github.com/destyler/destyler) | [Documentation](https://destyler-dev.zeabur.app/)
@@ -1,56 +0,0 @@
1
- 'use strict';
2
-
3
- const vue = require('vue');
4
- const popper = require('@destyler/popper');
5
- const index = require('./shared/popover.49550c9f.cjs');
6
- require('@destyler/primitive');
7
- require('@destyler/shared');
8
- require('@destyler/composition');
9
- require('@destyler/presence');
10
- require('@destyler/dismissable-layer');
11
- require('@destyler/dismissable-layer/component');
12
- require('@destyler/focus-scope');
13
- require('@destyler/directives');
14
- require('@destyler/teleport');
15
-
16
- const popoverAnchorProps = {
17
- ...popper.popperAnchorProps
18
- };
19
- const PopoverAnchor = vue.defineComponent({
20
- name: "DestylerPopoverAnchor",
21
- props: popoverAnchorProps,
22
- setup() {
23
- const rootContext = index.injectPopoverRootContext();
24
- vue.onBeforeMount(() => {
25
- rootContext.hasCustomAnchor.value = true;
26
- });
27
- vue.onUnmounted(() => {
28
- rootContext.hasCustomAnchor.value = false;
29
- });
30
- },
31
- render() {
32
- return vue.h(popper.PopperAnchor, vue.mergeProps(this.$props, {}), () => this.$slots.default?.());
33
- }
34
- });
35
-
36
- exports.PopoverArrow = index.PopoverArrow;
37
- exports.PopoverClose = index.PopoverClose;
38
- exports.PopoverContent = index.PopoverContent;
39
- exports.PopoverContentImpl = index.PopoverContentImpl;
40
- exports.PopoverContentModal = index.PopoverContentModal;
41
- exports.PopoverContentNonModal = index.PopoverContentNonModal;
42
- exports.PopoverPortal = index.PopoverPortal;
43
- exports.PopoverRoot = index.PopoverRoot;
44
- exports.PopoverTrigger = index.PopoverTrigger;
45
- exports.popoverArrowProps = index.popoverArrowProps;
46
- exports.popoverCloseProps = index.popoverCloseProps;
47
- exports.popoverContentEmits = index.popoverContentEmits;
48
- exports.popoverContentImplEmits = index.popoverContentImplEmits;
49
- exports.popoverContentImplProps = index.popoverContentImplProps;
50
- exports.popoverContentProps = index.popoverContentProps;
51
- exports.popoverPortalProps = index.popoverPortalProps;
52
- exports.popoverRootEmits = index.popoverRootEmits;
53
- exports.popoverRootProps = index.popoverRootProps;
54
- exports.popoverTriggerProps = index.popoverTriggerProps;
55
- exports.PopoverAnchor = PopoverAnchor;
56
- exports.popoverAnchorProps = popoverAnchorProps;