@zag-js/popover 1.34.0 → 1.35.0

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.js CHANGED
@@ -1,447 +1,39 @@
1
- 'use strict';
2
-
3
- var anatomy$1 = require('@zag-js/anatomy');
4
- var domQuery = require('@zag-js/dom-query');
5
- var popper = require('@zag-js/popper');
6
- var ariaHidden = require('@zag-js/aria-hidden');
7
- var core = require('@zag-js/core');
8
- var dismissable = require('@zag-js/dismissable');
9
- var focusTrap = require('@zag-js/focus-trap');
10
- var removeScroll = require('@zag-js/remove-scroll');
11
- var types = require('@zag-js/types');
12
- var utils = require('@zag-js/utils');
13
-
14
- // src/popover.anatomy.ts
15
- var anatomy = anatomy$1.createAnatomy("popover").parts(
16
- "arrow",
17
- "arrowTip",
18
- "anchor",
19
- "trigger",
20
- "indicator",
21
- "positioner",
22
- "content",
23
- "title",
24
- "description",
25
- "closeTrigger"
26
- );
27
- var parts = anatomy.build();
28
- var getAnchorId = (scope) => scope.ids?.anchor ?? `popover:${scope.id}:anchor`;
29
- var getTriggerId = (scope) => scope.ids?.trigger ?? `popover:${scope.id}:trigger`;
30
- var getContentId = (scope) => scope.ids?.content ?? `popover:${scope.id}:content`;
31
- var getPositionerId = (scope) => scope.ids?.positioner ?? `popover:${scope.id}:popper`;
32
- var getArrowId = (scope) => scope.ids?.arrow ?? `popover:${scope.id}:arrow`;
33
- var getTitleId = (scope) => scope.ids?.title ?? `popover:${scope.id}:title`;
34
- var getDescriptionId = (scope) => scope.ids?.description ?? `popover:${scope.id}:desc`;
35
- var getCloseTriggerId = (scope) => scope.ids?.closeTrigger ?? `popover:${scope.id}:close`;
36
- var getAnchorEl = (scope) => scope.getById(getAnchorId(scope));
37
- var getTriggerEl = (scope) => scope.getById(getTriggerId(scope));
38
- var getContentEl = (scope) => scope.getById(getContentId(scope));
39
- var getPositionerEl = (scope) => scope.getById(getPositionerId(scope));
40
- var getTitleEl = (scope) => scope.getById(getTitleId(scope));
41
- var getDescriptionEl = (scope) => scope.getById(getDescriptionId(scope));
42
-
43
- // src/popover.connect.ts
44
- function connect(service, normalize) {
45
- const { state, context, send, computed, prop, scope } = service;
46
- const open = state.matches("open");
47
- const currentPlacement = context.get("currentPlacement");
48
- const portalled = computed("currentPortalled");
49
- const rendered = context.get("renderedElements");
50
- const popperStyles = popper.getPlacementStyles({
51
- ...prop("positioning"),
52
- placement: currentPlacement
53
- });
54
- return {
55
- portalled,
56
- open,
57
- setOpen(nextOpen) {
58
- const open2 = state.matches("open");
59
- if (open2 === nextOpen) return;
60
- send({ type: nextOpen ? "OPEN" : "CLOSE" });
61
- },
62
- reposition(options = {}) {
63
- send({ type: "POSITIONING.SET", options });
64
- },
65
- getArrowProps() {
66
- return normalize.element({
67
- id: getArrowId(scope),
68
- ...parts.arrow.attrs,
69
- dir: prop("dir"),
70
- style: popperStyles.arrow
71
- });
72
- },
73
- getArrowTipProps() {
74
- return normalize.element({
75
- ...parts.arrowTip.attrs,
76
- dir: prop("dir"),
77
- style: popperStyles.arrowTip
78
- });
79
- },
80
- getAnchorProps() {
81
- return normalize.element({
82
- ...parts.anchor.attrs,
83
- dir: prop("dir"),
84
- id: getAnchorId(scope)
85
- });
86
- },
87
- getTriggerProps() {
88
- return normalize.button({
89
- ...parts.trigger.attrs,
90
- dir: prop("dir"),
91
- type: "button",
92
- "data-placement": currentPlacement,
93
- id: getTriggerId(scope),
94
- "aria-haspopup": "dialog",
95
- "aria-expanded": open,
96
- "data-state": open ? "open" : "closed",
97
- "aria-controls": getContentId(scope),
98
- onPointerDown(event) {
99
- if (!domQuery.isLeftClick(event)) return;
100
- if (domQuery.isSafari()) {
101
- event.currentTarget.focus();
102
- }
103
- },
104
- onClick(event) {
105
- if (event.defaultPrevented) return;
106
- send({ type: "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: prop("dir"),
117
- "data-state": open ? "open" : "closed"
118
- });
119
- },
120
- getPositionerProps() {
121
- return normalize.element({
122
- id: getPositionerId(scope),
123
- ...parts.positioner.attrs,
124
- dir: prop("dir"),
125
- style: popperStyles.floating
126
- });
127
- },
128
- getContentProps() {
129
- return normalize.element({
130
- ...parts.content.attrs,
131
- dir: prop("dir"),
132
- id: getContentId(scope),
133
- tabIndex: -1,
134
- role: "dialog",
135
- "aria-modal": domQuery.ariaAttr(prop("modal")),
136
- hidden: !open,
137
- "data-state": open ? "open" : "closed",
138
- "data-expanded": domQuery.dataAttr(open),
139
- "aria-labelledby": rendered.title ? getTitleId(scope) : void 0,
140
- "aria-describedby": rendered.description ? getDescriptionId(scope) : void 0,
141
- "data-placement": currentPlacement
142
- });
143
- },
144
- getTitleProps() {
145
- return normalize.element({
146
- ...parts.title.attrs,
147
- id: getTitleId(scope),
148
- dir: prop("dir")
149
- });
150
- },
151
- getDescriptionProps() {
152
- return normalize.element({
153
- ...parts.description.attrs,
154
- id: getDescriptionId(scope),
155
- dir: prop("dir")
156
- });
157
- },
158
- getCloseTriggerProps() {
159
- return normalize.button({
160
- ...parts.closeTrigger.attrs,
161
- dir: prop("dir"),
162
- id: getCloseTriggerId(scope),
163
- type: "button",
164
- "aria-label": "close",
165
- onClick(event) {
166
- if (event.defaultPrevented) return;
167
- event.stopPropagation();
168
- send({ type: "CLOSE" });
169
- }
170
- });
171
- }
172
- };
173
- }
174
- var machine = core.createMachine({
175
- props({ props: props2 }) {
176
- return {
177
- closeOnInteractOutside: true,
178
- closeOnEscape: true,
179
- autoFocus: true,
180
- modal: false,
181
- portalled: true,
182
- ...props2,
183
- positioning: {
184
- placement: "bottom",
185
- ...props2.positioning
186
- }
187
- };
188
- },
189
- initialState({ prop }) {
190
- const open = prop("open") || prop("defaultOpen");
191
- return open ? "open" : "closed";
192
- },
193
- context({ bindable }) {
194
- return {
195
- currentPlacement: bindable(() => ({
196
- defaultValue: void 0
197
- })),
198
- renderedElements: bindable(() => ({
199
- defaultValue: { title: true, description: true }
200
- }))
201
- };
202
- },
203
- computed: {
204
- currentPortalled: ({ prop }) => !!prop("modal") || !!prop("portalled")
205
- },
206
- watch({ track, prop, action }) {
207
- track([() => prop("open")], () => {
208
- action(["toggleVisibility"]);
209
- });
210
- },
211
- entry: ["checkRenderedElements"],
212
- states: {
213
- closed: {
214
- on: {
215
- "CONTROLLED.OPEN": {
216
- target: "open",
217
- actions: ["setInitialFocus"]
218
- },
219
- TOGGLE: [
220
- {
221
- guard: "isOpenControlled",
222
- actions: ["invokeOnOpen"]
223
- },
224
- {
225
- target: "open",
226
- actions: ["invokeOnOpen", "setInitialFocus"]
227
- }
228
- ],
229
- OPEN: [
230
- {
231
- guard: "isOpenControlled",
232
- actions: ["invokeOnOpen"]
233
- },
234
- {
235
- target: "open",
236
- actions: ["invokeOnOpen", "setInitialFocus"]
237
- }
238
- ]
239
- }
240
- },
241
- open: {
242
- effects: [
243
- "trapFocus",
244
- "preventScroll",
245
- "hideContentBelow",
246
- "trackPositioning",
247
- "trackDismissableElement",
248
- "proxyTabFocus"
249
- ],
250
- on: {
251
- "CONTROLLED.CLOSE": {
252
- target: "closed",
253
- actions: ["setFinalFocus"]
254
- },
255
- CLOSE: [
256
- {
257
- guard: "isOpenControlled",
258
- actions: ["invokeOnClose"]
259
- },
260
- {
261
- target: "closed",
262
- actions: ["invokeOnClose", "setFinalFocus"]
263
- }
264
- ],
265
- TOGGLE: [
266
- {
267
- guard: "isOpenControlled",
268
- actions: ["invokeOnClose"]
269
- },
270
- {
271
- target: "closed",
272
- actions: ["invokeOnClose"]
273
- }
274
- ],
275
- "POSITIONING.SET": {
276
- actions: ["reposition"]
277
- }
278
- }
279
- }
280
- },
281
- implementations: {
282
- guards: {
283
- isOpenControlled: ({ prop }) => prop("open") != void 0
284
- },
285
- effects: {
286
- trackPositioning({ context, prop, scope }) {
287
- context.set("currentPlacement", prop("positioning").placement);
288
- const anchorEl = getAnchorEl(scope) ?? getTriggerEl(scope);
289
- const getPositionerEl2 = () => getPositionerEl(scope);
290
- return popper.getPlacement(anchorEl, getPositionerEl2, {
291
- ...prop("positioning"),
292
- defer: true,
293
- onComplete(data) {
294
- context.set("currentPlacement", data.placement);
295
- }
296
- });
297
- },
298
- trackDismissableElement({ send, prop, scope }) {
299
- const getContentEl2 = () => getContentEl(scope);
300
- let restoreFocus = true;
301
- return dismissable.trackDismissableElement(getContentEl2, {
302
- type: "popover",
303
- pointerBlocking: prop("modal"),
304
- exclude: getTriggerEl(scope),
305
- defer: true,
306
- onEscapeKeyDown(event) {
307
- prop("onEscapeKeyDown")?.(event);
308
- if (prop("closeOnEscape")) return;
309
- event.preventDefault();
310
- },
311
- onInteractOutside(event) {
312
- prop("onInteractOutside")?.(event);
313
- if (event.defaultPrevented) return;
314
- restoreFocus = !(event.detail.focusable || event.detail.contextmenu);
315
- if (!prop("closeOnInteractOutside")) {
316
- event.preventDefault();
317
- }
318
- },
319
- onPointerDownOutside: prop("onPointerDownOutside"),
320
- onFocusOutside: prop("onFocusOutside"),
321
- persistentElements: prop("persistentElements"),
322
- onRequestDismiss: prop("onRequestDismiss"),
323
- onDismiss() {
324
- send({ type: "CLOSE", src: "interact-outside", restoreFocus });
325
- }
326
- });
327
- },
328
- proxyTabFocus({ prop, scope }) {
329
- if (prop("modal") || !prop("portalled")) return;
330
- const getContentEl2 = () => getContentEl(scope);
331
- return domQuery.proxyTabFocus(getContentEl2, {
332
- triggerElement: getTriggerEl(scope),
333
- defer: true,
334
- getShadowRoot: true,
335
- onFocus(el) {
336
- el.focus({ preventScroll: true });
337
- }
338
- });
339
- },
340
- hideContentBelow({ prop, scope }) {
341
- if (!prop("modal")) return;
342
- const getElements = () => [getContentEl(scope), getTriggerEl(scope)];
343
- return ariaHidden.ariaHidden(getElements, { defer: true });
344
- },
345
- preventScroll({ prop, scope }) {
346
- if (!prop("modal")) return;
347
- return removeScroll.preventBodyScroll(scope.getDoc());
348
- },
349
- trapFocus({ prop, scope }) {
350
- if (!prop("modal")) return;
351
- const contentEl = () => getContentEl(scope);
352
- return focusTrap.trapFocus(contentEl, {
353
- initialFocus: () => domQuery.getInitialFocus({
354
- root: getContentEl(scope),
355
- getInitialEl: prop("initialFocusEl"),
356
- enabled: prop("autoFocus")
357
- }),
358
- getShadowRoot: true
359
- });
360
- }
361
- },
362
- actions: {
363
- reposition({ event, prop, scope, context }) {
364
- const anchorEl = getAnchorEl(scope) ?? getTriggerEl(scope);
365
- const getPositionerEl2 = () => getPositionerEl(scope);
366
- popper.getPlacement(anchorEl, getPositionerEl2, {
367
- ...prop("positioning"),
368
- ...event.options,
369
- defer: true,
370
- listeners: false,
371
- onComplete(data) {
372
- context.set("currentPlacement", data.placement);
373
- }
374
- });
375
- },
376
- checkRenderedElements({ context, scope }) {
377
- domQuery.raf(() => {
378
- Object.assign(context.get("renderedElements"), {
379
- title: !!getTitleEl(scope),
380
- description: !!getDescriptionEl(scope)
381
- });
382
- });
383
- },
384
- setInitialFocus({ prop, scope }) {
385
- if (prop("modal")) return;
386
- domQuery.raf(() => {
387
- const element = domQuery.getInitialFocus({
388
- root: getContentEl(scope),
389
- getInitialEl: prop("initialFocusEl"),
390
- enabled: prop("autoFocus")
391
- });
392
- element?.focus({ preventScroll: true });
393
- });
394
- },
395
- setFinalFocus({ event, scope }) {
396
- const restoreFocus = event.restoreFocus ?? event.previousEvent?.restoreFocus;
397
- if (restoreFocus != null && !restoreFocus) return;
398
- domQuery.raf(() => {
399
- const element = getTriggerEl(scope);
400
- element?.focus({ preventScroll: true });
401
- });
402
- },
403
- invokeOnOpen({ prop, flush }) {
404
- flush(() => {
405
- prop("onOpenChange")?.({ open: true });
406
- });
407
- },
408
- invokeOnClose({ prop, flush }) {
409
- flush(() => {
410
- prop("onOpenChange")?.({ open: false });
411
- });
412
- },
413
- toggleVisibility({ event, send, prop }) {
414
- send({ type: prop("open") ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE", previousEvent: event });
415
- }
416
- }
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
417
15
  }
418
- });
419
- var props = types.createProps()([
420
- "autoFocus",
421
- "closeOnEscape",
422
- "closeOnInteractOutside",
423
- "dir",
424
- "getRootNode",
425
- "id",
426
- "ids",
427
- "initialFocusEl",
428
- "modal",
429
- "onEscapeKeyDown",
430
- "onFocusOutside",
431
- "onInteractOutside",
432
- "onOpenChange",
433
- "onPointerDownOutside",
434
- "onRequestDismiss",
435
- "defaultOpen",
436
- "open",
437
- "persistentElements",
438
- "portalled",
439
- "positioning"
440
- ]);
441
- var splitProps = utils.createSplitProps(props);
16
+ return to;
17
+ };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
442
20
 
443
- exports.anatomy = anatomy;
444
- exports.connect = connect;
445
- exports.machine = machine;
446
- exports.props = props;
447
- exports.splitProps = splitProps;
21
+ // src/index.ts
22
+ var index_exports = {};
23
+ __export(index_exports, {
24
+ anatomy: () => import_popover.anatomy,
25
+ connect: () => import_popover2.connect,
26
+ machine: () => import_popover3.machine
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+ var import_popover = require("./popover.anatomy.cjs");
30
+ var import_popover2 = require("./popover.connect.cjs");
31
+ var import_popover3 = require("./popover.machine.cjs");
32
+ __reExport(index_exports, require("./popover.props.cjs"), module.exports);
33
+ // Annotate the CommonJS export names for ESM import in node:
34
+ 0 && (module.exports = {
35
+ anatomy,
36
+ connect,
37
+ machine,
38
+ ...require("./popover.props.cjs")
39
+ });