@depup/react-aria-components 1.21.0-depup.0 → 1.22.0-depup.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.
Files changed (55) hide show
  1. package/README.md +4 -3
  2. package/Sheet/package.json +5 -0
  3. package/changes.json +6 -2
  4. package/dist/exports/Sheet.cjs +30 -0
  5. package/dist/exports/Sheet.cjs.map +1 -0
  6. package/dist/exports/Sheet.js +21 -0
  7. package/dist/exports/Sheet.js.map +1 -0
  8. package/dist/exports/Sheet.mjs +21 -0
  9. package/dist/exports/Sheet.mjs.map +1 -0
  10. package/dist/exports/TokenField.cjs +1 -0
  11. package/dist/exports/TokenField.cjs.map +1 -1
  12. package/dist/exports/TokenField.js +2 -2
  13. package/dist/exports/TokenField.js.map +1 -1
  14. package/dist/exports/TokenField.mjs +2 -2
  15. package/dist/exports/TokenField.mjs.map +1 -1
  16. package/dist/exports/index.cjs +7 -0
  17. package/dist/exports/index.cjs.map +1 -1
  18. package/dist/exports/index.js +3 -1
  19. package/dist/exports/index.js.map +1 -1
  20. package/dist/exports/index.mjs +3 -1
  21. package/dist/exports/index.mjs.map +1 -1
  22. package/dist/private/Breadcrumbs.cjs +1 -1
  23. package/dist/private/Breadcrumbs.cjs.map +1 -1
  24. package/dist/private/Breadcrumbs.js +1 -1
  25. package/dist/private/Breadcrumbs.js.map +1 -1
  26. package/dist/private/Breadcrumbs.mjs +1 -1
  27. package/dist/private/Breadcrumbs.mjs.map +1 -1
  28. package/dist/private/Modal.cjs +56 -11
  29. package/dist/private/Modal.cjs.map +1 -1
  30. package/dist/private/Modal.js +61 -14
  31. package/dist/private/Modal.js.map +1 -1
  32. package/dist/private/Modal.mjs +58 -14
  33. package/dist/private/Modal.mjs.map +1 -1
  34. package/dist/private/NavigationTree.cjs.map +1 -1
  35. package/dist/private/NavigationTree.js.map +1 -1
  36. package/dist/private/NavigationTree.mjs.map +1 -1
  37. package/dist/private/Popover.cjs +10 -2
  38. package/dist/private/Popover.cjs.map +1 -1
  39. package/dist/private/Popover.js +10 -2
  40. package/dist/private/Popover.js.map +1 -1
  41. package/dist/private/Popover.mjs +10 -2
  42. package/dist/private/Popover.mjs.map +1 -1
  43. package/dist/private/Sheet.cjs +827 -0
  44. package/dist/private/Sheet.cjs.map +1 -0
  45. package/dist/private/Sheet.js +820 -0
  46. package/dist/private/Sheet.js.map +1 -0
  47. package/dist/private/Sheet.mjs +814 -0
  48. package/dist/private/Sheet.mjs.map +1 -0
  49. package/dist/types/exports/Sheet.d.ts +3 -0
  50. package/dist/types/exports/TokenField.d.ts +2 -2
  51. package/dist/types/exports/index.d.ts +2 -0
  52. package/dist/types/src/Modal.d.ts +28 -1
  53. package/dist/types/src/NavigationTree.d.ts +1 -1
  54. package/dist/types/src/Sheet.d.ts +149 -0
  55. package/package.json +13 -8
@@ -0,0 +1,814 @@
1
+ import {useRenderProps as $7230ffa83bc0c2cf$export$4d86445c2cf5e3} from "./utils.mjs";
2
+ import {Dialog as $f2ff30fde7b014be$export$3ddf2d174ce01153, DialogTrigger as $f2ff30fde7b014be$export$2e1e1122cf0cba88, OverlayTriggerStateContext as $f2ff30fde7b014be$export$d2f961adcb0afbe} from "./Dialog.mjs";
3
+ import {InternalModalContext as $8b8d26808cb8cb53$export$6bc057cefccad9c8, Modal as $8b8d26808cb8cb53$export$2b77a92f1a5ad772, ModalOverlay as $8b8d26808cb8cb53$export$8948f78d83984c69} from "./Modal.mjs";
4
+ import {filterDOMProps as $dnWcj$filterDOMProps} from "react-aria/filterDOMProps";
5
+ import {isIOS as $dnWcj$isIOS, isSafari as $dnWcj$isSafari} from "react-aria/private/utils/platform";
6
+ import {mergeRefs as $dnWcj$mergeRefs} from "react-aria/mergeRefs";
7
+ import {PressResponder as $dnWcj$PressResponder} from "react-aria/private/interactions/PressResponder";
8
+ import $dnWcj$react, {createContext as $dnWcj$createContext, forwardRef as $dnWcj$forwardRef, useContext as $dnWcj$useContext, useMemo as $dnWcj$useMemo, useState as $dnWcj$useState, useRef as $dnWcj$useRef, useCallback as $dnWcj$useCallback} from "react";
9
+ import {useEffectEvent as $dnWcj$useEffectEvent} from "react-aria/private/utils/useEffectEvent";
10
+ import {useId as $dnWcj$useId} from "react-aria/useId";
11
+ import {useLayoutEffect as $dnWcj$useLayoutEffect} from "react-aria/private/utils/useLayoutEffect";
12
+ import {useLocale as $dnWcj$useLocale} from "react-aria/I18nProvider";
13
+ import {useObjectRef as $dnWcj$useObjectRef} from "react-aria/useObjectRef";
14
+ import {useOverlayTriggerState as $dnWcj$useOverlayTriggerState} from "react-stately/useOverlayTriggerState";
15
+ import {useSyncExternalStore as $dnWcj$useSyncExternalStore} from "use-sync-external-store/shim/index.js";
16
+
17
+ /*
18
+ * Copyright 2026 Adobe. All rights reserved.
19
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
20
+ * you may not use this file except in compliance with the License. You may obtain a copy
21
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
22
+ *
23
+ * Unless required by applicable law or agreed to in writing, software distributed under
24
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
25
+ * OF ANY KIND, either express or implied. See the License for the specific language
26
+ * governing permissions and limitations under the License.
27
+ */
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+ const $f44b3686778108d5$var$InternalSheetContext = /*#__PURE__*/ (0, $dnWcj$createContext)(null);
43
+ let $f44b3686778108d5$var$sheetStack = [];
44
+ let $f44b3686778108d5$var$stackListeners = new Set();
45
+ function $f44b3686778108d5$var$emitStackChange() {
46
+ // Hoist every mounted sheet's timeline name to the root so a parent
47
+ // can still resolve the child's timeline by name.
48
+ // TODO: don't override existing timelines declared in CSS or inline styles.
49
+ let names = Array.from({
50
+ length: $f44b3686778108d5$var$sheetStack.length
51
+ }).map((_, i)=>`--sheet-timeline-${i}`).join(', ');
52
+ document.documentElement.style.setProperty('timeline-scope', names);
53
+ $f44b3686778108d5$var$stackListeners.forEach((listener)=>listener());
54
+ }
55
+ function $f44b3686778108d5$var$subscribeStack(listener) {
56
+ $f44b3686778108d5$var$stackListeners.add(listener);
57
+ return ()=>{
58
+ $f44b3686778108d5$var$stackListeners.delete(listener);
59
+ };
60
+ }
61
+ function $f44b3686778108d5$var$registerSheet(config) {
62
+ $f44b3686778108d5$var$sheetStack = [
63
+ ...$f44b3686778108d5$var$sheetStack,
64
+ config
65
+ ];
66
+ $f44b3686778108d5$var$emitStackChange();
67
+ return ()=>{
68
+ $f44b3686778108d5$var$sheetStack = $f44b3686778108d5$var$sheetStack.filter((e)=>e.id !== config.id);
69
+ $f44b3686778108d5$var$emitStackChange();
70
+ };
71
+ }
72
+ function $f44b3686778108d5$var$getSheetStack() {
73
+ return $f44b3686778108d5$var$sheetStack;
74
+ }
75
+ const $f44b3686778108d5$var$supportsViewTimeline = typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('animation-timeline: view()');
76
+ function $f44b3686778108d5$export$de69b9b0343a1903(props) {
77
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement((0, $f2ff30fde7b014be$export$2e1e1122cf0cba88), props, /*#__PURE__*/ (0, $dnWcj$react).createElement((0, $dnWcj$PressResponder), {
78
+ isPressed: false
79
+ }, props.children));
80
+ }
81
+ // Additional padding added to the viewport to account for browser toolbar.
82
+ // More content than 100lvh is actually visible on iOS, even when the toolbar is collapsed.
83
+ const $f44b3686778108d5$var$VIEWPORT_PADDING = (0, $dnWcj$isIOS)() && (0, $dnWcj$isSafari)() ? 'calc(100lvh - 100svh + 58px)' : '0px';
84
+ const $f44b3686778108d5$var$viewportPadding = (after, axis)=>after && axis === 'y' ? $f44b3686778108d5$var$VIEWPORT_PADDING : '0px';
85
+ const $f44b3686778108d5$export$48dbb295cbd054d8 = /*#__PURE__*/ (0, $dnWcj$forwardRef)(function SheetOverlay(props, domRef) {
86
+ let { children: children, preventDismissal: preventDismissal = false } = props;
87
+ let { direction: direction } = (0, $dnWcj$useLocale)();
88
+ let position = $f44b3686778108d5$var$resolveDirection(props.position ?? 'bottom', direction);
89
+ let swipeDirection = props.swipeDirection ? $f44b3686778108d5$var$resolveDirection(props.swipeDirection, direction) : position === 'center' ? 'vertical' : position;
90
+ // Resolve the state the same way ModalOverlay does, so that swiping to close works
91
+ // both inside a SheetTrigger and when the open state is passed directly to SheetOverlay.
92
+ let contextState = (0, $dnWcj$useContext)((0, $f2ff30fde7b014be$export$d2f961adcb0afbe));
93
+ let localState = (0, $dnWcj$useOverlayTriggerState)(props);
94
+ let state = props.isOpen != null || props.defaultOpen != null || !contextState ? localState : contextState;
95
+ let onCloseEvent = (0, $dnWcj$useEffectEvent)(()=>{
96
+ state.close();
97
+ });
98
+ let { axis: axis, before: before, after: after, maxScroll: maxScroll, enteredScroll: enteredScroll, viewRange: viewRange, viewDirection: viewDirection, viewIterations: viewIterations } = $f44b3686778108d5$var$getSwipeConfig(swipeDirection);
99
+ let id = (0, $dnWcj$useId)();
100
+ let stackItem = (0, $dnWcj$useMemo)(()=>({
101
+ id: id,
102
+ range: viewRange,
103
+ direction: viewDirection,
104
+ iterations: viewIterations
105
+ }), [
106
+ id,
107
+ viewRange,
108
+ viewDirection,
109
+ viewIterations
110
+ ]);
111
+ let [isExpanded, setExpanded] = (0, $dnWcj$useState)(false);
112
+ let isVisible = (0, $dnWcj$useRef)(false);
113
+ let ref = (0, $dnWcj$useCallback)((element)=>{
114
+ if (!element) return;
115
+ // Sheets that rest at scroll 0 (top/left) mount already entered. Move them to the exit position
116
+ // before observing, since onEnter may be deferred (e.g. while waiting for the software keyboard),
117
+ // and the observer would otherwise see the sheet as entered and then close it once onEnter
118
+ // jumps to the exit position.
119
+ if (enteredScroll === 0) {
120
+ let scroller = element.querySelector('[data-sheet-scroll]');
121
+ if (scroller) {
122
+ let vp = axis === 'y' ? window.innerHeight : window.innerWidth;
123
+ $f44b3686778108d5$var$scrollAlongAxis(scroller, axis, maxScroll / 100 * vp);
124
+ }
125
+ }
126
+ // iOS displays content outside the reported viewport, e.g. behind the browser toolbar.
127
+ // Add additional margin to account for that so that the sheet disappears only when it is entirely invisible.
128
+ let rootMargin = `0px 0px ${$f44b3686778108d5$var$calcToPx($f44b3686778108d5$var$viewportPadding(after, axis))} 0px`;
129
+ let hasEntered = false;
130
+ let observer = new IntersectionObserver((entries)=>{
131
+ let entry = entries[0];
132
+ // Expose whether the sheet is resting at its fully-entered detent (all of it revealed). Apps
133
+ // can use `[data-expanded]` to only make the sheet's inner content scrollable once expanded,
134
+ // so that at a partial detent a swipe on the content expands the sheet instead (like iOS).
135
+ setExpanded(entry.intersectionRatio >= 1);
136
+ isVisible.current = entry.intersectionRatio > 0;
137
+ hasEntered ||= entry.intersectionRatio > 0;
138
+ if (hasEntered && entry.intersectionRatio <= 0) {
139
+ // eslint-disable-next-line react/react-compiler
140
+ onCloseEvent();
141
+ element.dispatchEvent(new CustomEvent('react-aria-sheet-close'));
142
+ }
143
+ }, {
144
+ threshold: [
145
+ 0,
146
+ 1
147
+ ],
148
+ rootMargin: rootMargin
149
+ });
150
+ let el = element.querySelector('[data-sheet-content]');
151
+ if (el) observer.observe(el);
152
+ let removeSheet = $f44b3686778108d5$var$registerSheet(stackItem);
153
+ return ()=>{
154
+ observer.disconnect();
155
+ removeSheet();
156
+ };
157
+ }, [
158
+ stackItem,
159
+ axis,
160
+ maxScroll,
161
+ enteredScroll,
162
+ after
163
+ ]);
164
+ let mergedRefs = (0, $dnWcj$useMemo)(()=>(0, $dnWcj$mergeRefs)(ref, domRef), [
165
+ ref,
166
+ domRef
167
+ ]);
168
+ let sheetStack = (0, $dnWcj$useSyncExternalStore)($f44b3686778108d5$var$subscribeStack, $f44b3686778108d5$var$getSheetStack, $f44b3686778108d5$var$getSheetStack);
169
+ let index = Math.max(0, sheetStack.findIndex((e)=>e.id === id));
170
+ let descendants = sheetStack.slice(index + 1);
171
+ let values = {
172
+ position: position,
173
+ swipeDirection: swipeDirection,
174
+ isExpanded: isExpanded,
175
+ stackIndex: index,
176
+ hasDescendants: descendants.length > 0
177
+ };
178
+ let sheetProps = $f44b3686778108d5$var$useSheetRenderProps(props, values, 'react-aria-SheetOverlay', {
179
+ // absolute rather than fixed so the modal is not clipped by iOS Safari.
180
+ position: 'absolute',
181
+ top: 0,
182
+ left: 0,
183
+ width: 'max(var(--page-width), 100vw)',
184
+ height: 'max(var(--page-height), 100dvh)',
185
+ overflow: 'clip',
186
+ // @ts-ignore
187
+ '--sheet-scroll-padding-x': 'calc(100vw - var(--visual-viewport-width))',
188
+ '--sheet-scroll-padding-y': 'calc(100dvh - var(--visual-viewport-height))'
189
+ });
190
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement((0, $8b8d26808cb8cb53$export$8948f78d83984c69), {
191
+ ...props,
192
+ isOpen: state.isOpen,
193
+ defaultOpen: undefined,
194
+ onOpenChange: state.setOpen,
195
+ ref: mergedRefs,
196
+ isDismissable: !preventDismissal,
197
+ isKeyboardDismissDisabled: preventDismissal,
198
+ // Moving the VoiceOver cursor into the sheet (via focus, or by making the content behind it
199
+ // inert) scrolls, which interrupts the enter scroll animation on iOS. Wait until it has entered.
200
+ UNSTABLE_deferUntilEntered: true,
201
+ UNSTABLE_overrideFocus: true,
202
+ ...sheetProps,
203
+ onEnter: (element)=>{
204
+ // The overlay is the document-anchored wrapper; the swipe gesture scrolls the inner container.
205
+ let scroller = element.querySelector('[data-sheet-scroll]');
206
+ let vp = axis === 'y' ? window.innerHeight + parseFloat($f44b3686778108d5$var$calcToPx($f44b3686778108d5$var$viewportPadding(after, axis))) : window.innerWidth;
207
+ // Open at the first custom detent when provided, otherwise the fully-entered position.
208
+ let initial = element.querySelector('[data-sheet-initial]');
209
+ let scrollToRest = (smooth)=>{
210
+ if (initial) $f44b3686778108d5$var$scrollDetentIntoView(scroller, initial, axis, after ? 'start' : 'end', smooth);
211
+ else $f44b3686778108d5$var$scrollAlongAxis(scroller, axis, enteredScroll / 100 * vp, smooth);
212
+ };
213
+ if (enteredScroll === 0) {
214
+ // The rest position is at scroll 0, so the sheet mounts already entered. Jump to the exit
215
+ // first, then animate back in on the next frame — doing both in the same task can leave
216
+ // the browser stuck at the jumped-to position instead of running the smooth scroll.
217
+ $f44b3686778108d5$var$scrollAlongAxis(scroller, axis, maxScroll / 100 * vp);
218
+ requestAnimationFrame(()=>scrollToRest(true));
219
+ } else scrollToRest(true);
220
+ return new Promise((resolve)=>{
221
+ // eslint-disable-next-line rsp-rules/no-non-composing-event-listener
222
+ scroller.addEventListener('scrollend', ()=>resolve(), {
223
+ once: true
224
+ });
225
+ });
226
+ },
227
+ onExit: (element)=>{
228
+ let scroller = element.querySelector('[data-sheet-scroll]');
229
+ if (!isVisible.current) {
230
+ // Wait for the end of the scroll gesture in Safari to avoid momentum scrolling re-targeting to the sheet behind.
231
+ if ((0, $dnWcj$isSafari)() && !(0, $dnWcj$isIOS)()) return new Promise((resolve)=>{
232
+ // eslint-disable-next-line rsp-rules/no-non-composing-event-listener
233
+ scroller.addEventListener('scrollend', ()=>{
234
+ setTimeout(()=>resolve(), 50);
235
+ }, {
236
+ once: true
237
+ });
238
+ });
239
+ return;
240
+ }
241
+ let vp = axis === 'y' ? window.innerHeight + parseFloat($f44b3686778108d5$var$calcToPx($f44b3686778108d5$var$viewportPadding(after, axis))) : window.innerWidth;
242
+ let maxScrollPx = maxScroll / 100 * vp;
243
+ let current = axis === 'y' ? scroller.scrollTop : scroller.scrollLeft;
244
+ let target;
245
+ if (after && !before) target = 0;
246
+ else if (before && !after) target = maxScrollPx;
247
+ else // Dual direction: exit toward whichever edge is nearest the current position.
248
+ target = current > enteredScroll / 100 * vp ? maxScrollPx : 0;
249
+ $f44b3686778108d5$var$scrollAlongAxis(scroller, axis, target, true);
250
+ // The close event is dispatched on the overlay wrapper by the IntersectionObserver below.
251
+ return new Promise((resolve)=>{
252
+ element.addEventListener('react-aria-sheet-close', ()=>resolve(), {
253
+ once: true
254
+ });
255
+ });
256
+ }
257
+ }, (renderProps)=>/*#__PURE__*/ (0, $dnWcj$react).createElement($f44b3686778108d5$var$InternalSheetContext.Provider, {
258
+ value: {
259
+ ...props,
260
+ position: position,
261
+ swipeDirection: swipeDirection,
262
+ index: index,
263
+ descendants: descendants,
264
+ isEntering: renderProps.isEntering,
265
+ isExiting: renderProps.isExiting,
266
+ values: values
267
+ }
268
+ }, typeof children === 'function' ? children({
269
+ ...renderProps,
270
+ ...values
271
+ }) : children));
272
+ });
273
+ function $f44b3686778108d5$var$getDataAttributes(values) {
274
+ return {
275
+ 'data-position': values.position,
276
+ 'data-swipe-direction': values.swipeDirection,
277
+ 'data-expanded': values.isExpanded || undefined,
278
+ 'data-stack-index': values.stackIndex,
279
+ 'data-has-descendants': values.hasDescendants || undefined
280
+ };
281
+ }
282
+ // Merges the sheet-specific values into the render props, className, and style of a Modal or ModalOverlay.
283
+ function $f44b3686778108d5$var$useSheetRenderProps(props, values, defaultClassName, defaultStyle, overrideStyle) {
284
+ return {
285
+ ...$f44b3686778108d5$var$getDataAttributes(values),
286
+ render: props.render ? (domProps, renderProps)=>props.render(domProps, {
287
+ ...renderProps,
288
+ ...values
289
+ }) : undefined,
290
+ className: (renderProps)=>typeof props.className === 'function' ? props.className({
291
+ ...renderProps,
292
+ ...values
293
+ }) : props.className || defaultClassName,
294
+ style: (renderProps)=>({
295
+ ...defaultStyle,
296
+ ...typeof props.style === 'function' ? props.style({
297
+ ...renderProps,
298
+ ...values
299
+ }) : props.style,
300
+ ...overrideStyle
301
+ })
302
+ };
303
+ }
304
+ function $f44b3686778108d5$var$resolveDirection(value, direction) {
305
+ if (value === 'start') return direction === 'rtl' ? 'right' : 'left';
306
+ if (value === 'end') return direction === 'rtl' ? 'left' : 'right';
307
+ return value;
308
+ }
309
+ // The sheet lives inside an oversized scroll container. Scrolling slides a viewport-sized "stage"
310
+ // (which holds the sheet) on and off screen along the swipe axis, so the browser drives the swipe
311
+ // gesture natively. The container is always 2 viewports along the axis; a fixed 1-viewport window
312
+ // (the actual browser viewport) looks onto it. The stage always sits 1 viewport into the content,
313
+ // and snap markers at the content extremes define the entered/exited resting positions.
314
+ function $f44b3686778108d5$var$getSwipeConfig(swipeDirection) {
315
+ let axis = swipeDirection === 'top' || swipeDirection === 'bottom' || swipeDirection === 'vertical' ? 'y' : 'x';
316
+ let before = swipeDirection === 'top' || swipeDirection === 'left' || swipeDirection === 'vertical' || swipeDirection === 'horizontal';
317
+ let after = swipeDirection === 'bottom' || swipeDirection === 'right' || swipeDirection === 'vertical' || swipeDirection === 'horizontal';
318
+ // Each exitable side adds a viewport of scroll travel.
319
+ let maxScroll = (Number(before) + Number(after)) * 100;
320
+ // When the sheet can only exit toward the start edge (top/left), it rests at scroll 0 and is
321
+ // swiped toward maxScroll to dismiss. Otherwise it rests 1 viewport in.
322
+ let enteredScroll = before && !after ? 0 : 100;
323
+ // Position the container so the rest position lands in the real viewport.
324
+ let containerOffset = before && !after ? -100 : 0;
325
+ // The sheet crosses a single viewport edge (the swipe edge), so map the animation to just that
326
+ // crossing. In view-timeline terms `entry` is the scrollport's end edge (bottom/right, where the
327
+ // sheet appears from) and `exit` is the start edge (top/left). Direction is chosen so progress 0
328
+ // is the exited state and 1 is entered, matching keyframes authored from exited -> entered:
329
+ // `entry` already runs gone -> entered, while `exit` runs entered -> gone and is reversed.
330
+ //
331
+ // Dual directions cross both edges, so run the same keyframe over the full `cover` range twice
332
+ // (iteration count 2) with `alternate`: the view timeline splits its progress across the two
333
+ // iterations, so it plays exited -> entered -> exited around the centered rest position. This
334
+ // reuses a single exited -> entered keyframe rather than requiring an author to also write a
335
+ // symmetric (0%/50%/100%) variant.
336
+ const viewRange = before && after ? 'cover' : before ? 'exit' : 'entry';
337
+ const viewDirection = before && after ? 'alternate' : before ? 'reverse' : 'normal';
338
+ const viewIterations = before && after ? 2 : 1;
339
+ return {
340
+ axis: axis,
341
+ before: before,
342
+ after: after,
343
+ maxScroll: maxScroll,
344
+ enteredScroll: enteredScroll,
345
+ containerOffset: containerOffset,
346
+ viewRange: viewRange,
347
+ viewDirection: viewDirection,
348
+ viewIterations: viewIterations
349
+ };
350
+ }
351
+ // The resting [x, y] flex alignment for each sheet position, independent of the swipe direction.
352
+ const $f44b3686778108d5$var$POSITION_ALIGNMENT = {
353
+ top: [
354
+ 'center',
355
+ 'flex-start'
356
+ ],
357
+ bottom: [
358
+ 'center',
359
+ 'flex-end'
360
+ ],
361
+ left: [
362
+ 'flex-start',
363
+ 'center'
364
+ ],
365
+ right: [
366
+ 'flex-end',
367
+ 'center'
368
+ ],
369
+ center: [
370
+ 'center',
371
+ 'center'
372
+ ]
373
+ };
374
+ // Converts a snap point value to a CSS length: numbers are pixels.
375
+ function $f44b3686778108d5$var$toLength(point) {
376
+ return typeof point === 'number' ? `${point}px` : point;
377
+ }
378
+ function $f44b3686778108d5$var$SnapPoint({ point: point, align: align, axis: axis }) {
379
+ let mainUnit = axis === 'y' ? 'dvh' : 'dvw';
380
+ let offset = $f44b3686778108d5$var$toLength(point);
381
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
382
+ style: {
383
+ position: 'absolute',
384
+ top: axis === 'y' ? offset : 0,
385
+ left: axis === 'x' ? offset : 0,
386
+ scrollSnapAlign: align,
387
+ // A full viewport along the swipe axis so its start/end edge lands at the snap position.
388
+ width: axis === 'x' ? `100${mainUnit}` : 1,
389
+ height: axis === 'y' ? `100${mainUnit}` : 1
390
+ }
391
+ });
392
+ }
393
+ // A snap marker placed inside the sheet, `point` in from its leading edge. Because it moves with
394
+ // the sheet, snapping it with a `scroll-margin` of one viewport rests the marker at the edge of the
395
+ // visible viewport, leaving exactly `point` of the sheet on screen. Since `point` is an inset rather
396
+ // than part of the margin, percentages resolve relative to the sheet's size.
397
+ function $f44b3686778108d5$var$DetentPoint({ point: point, axis: axis, after: after, isInitial: isInitial }) {
398
+ let viewport = axis === 'y' ? '100dvh' : '100dvw';
399
+ let offset = $f44b3686778108d5$var$toLength(point);
400
+ let common = {
401
+ position: 'absolute',
402
+ width: 1,
403
+ height: 1,
404
+ scrollSnapAlign: after ? 'start' : 'end'
405
+ };
406
+ let edge = axis === 'y' ? after ? {
407
+ top: offset,
408
+ left: 0,
409
+ scrollMarginTop: viewport
410
+ } : {
411
+ bottom: offset,
412
+ left: 0,
413
+ scrollMarginBottom: viewport
414
+ } : after ? {
415
+ top: 0,
416
+ left: offset,
417
+ scrollMarginLeft: viewport
418
+ } : {
419
+ top: 0,
420
+ right: offset,
421
+ scrollMarginRight: viewport
422
+ };
423
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
424
+ "data-sheet-detent": true,
425
+ "data-sheet-initial": isInitial || undefined,
426
+ style: {
427
+ ...common,
428
+ ...edge
429
+ }
430
+ });
431
+ }
432
+ const $f44b3686778108d5$export$a9bf29f8d87ebbee = /*#__PURE__*/ (0, $dnWcj$forwardRef)(function Sheet(props, domRef) {
433
+ let ref = (0, $dnWcj$useObjectRef)(domRef);
434
+ let scrollRef = (0, $dnWcj$useRef)(null);
435
+ let stageRef = (0, $dnWcj$useRef)(null);
436
+ let { position: position, swipeDirection: swipeDirection, snapPoints: snapPoints, index: index, descendants: descendants, isEntering: isEntering, isExiting: isExiting, preventDismissal: preventDismissal = false, values: values } = (0, $dnWcj$useContext)($f44b3686778108d5$var$InternalSheetContext);
437
+ // The ModalOverlay may defer its enter animation (e.g. until the software keyboard opens), during
438
+ // which isEntering is false. The sheet is not settled until it has opened, so treat it as entering.
439
+ let isOpen = (0, $dnWcj$useContext)((0, $8b8d26808cb8cb53$export$6bc057cefccad9c8))?.isOpen ?? true;
440
+ let isTransitioning = !isOpen || isEntering || isExiting;
441
+ let { direction: direction } = (0, $dnWcj$useLocale)();
442
+ let { axis: axis, after: after, before: before, containerOffset: containerOffset } = $f44b3686778108d5$var$getSwipeConfig(swipeDirection);
443
+ let viewport = axis === 'y' ? '100dvh' : '100dvw';
444
+ // A non-dismissable sheet can still be swiped between its snap points, but not past the smallest
445
+ // one. Enter/exit animations still need the exit space, so only clamp while settled.
446
+ let hasSnapPoints = !!snapPoints?.length && before !== after;
447
+ let isClamped = preventDismissal && !isTransitioning;
448
+ let snapTravel = $f44b3686778108d5$var$useSnapPointTravel(stageRef, ref, axis, after, preventDismissal && hasSnapPoints ? snapPoints.join(' ') : null);
449
+ // Scroll travel between the smallest snap point and the fully revealed sheet. It is at least 1px
450
+ // so the scroll container remains scrollable, which lets the browser show its native overscroll
451
+ // bounce even when there is nowhere to snap to.
452
+ let clampedTravel = `${hasSnapPoints ? Math.max(1, snapTravel) : 1}px`;
453
+ // The stage normally sits 1 viewport in so the sheet can scroll fully off screen toward the start
454
+ // edge. When clamped, sheets exiting toward the end edge move it so scroll 0 rests at the smallest
455
+ // snap point. Sheets exiting toward the start edge rest at scroll 0 already, so only the end of
456
+ // the scroll content (the smallest snap point) moves. Dual direction sheets get 1px either side.
457
+ // viewportPadding pushes bottom sheets down so that they can scroll beyond the viewport behind the iOS toolbar.
458
+ let stageStart = isClamped && after ? clampedTravel : `calc(${viewport} + ${$f44b3686778108d5$var$viewportPadding(after, axis)})`;
459
+ let endMarker;
460
+ if (isClamped && before && after) endMarker = `calc(${stageStart} + ${viewport} + 1px)`;
461
+ else if (isClamped && before) endMarker = `calc(${clampedTravel} + ${viewport})`;
462
+ else endMarker = `calc(${stageStart} + ${viewport}${before && after ? ` + ${viewport}` : ''})`;
463
+ // Keep the sheet visually in place when switching between the clamped and unclamped geometry.
464
+ // Scroll snapping is disabled while a non-dismissable sheet enters and exits so the browser
465
+ // doesn't re-snap when the geometry changes, which would otherwise differ between browsers.
466
+ let prevStageOffset = (0, $dnWcj$useRef)(null);
467
+ let prevClamped = (0, $dnWcj$useRef)(isClamped);
468
+ (0, $dnWcj$useLayoutEffect)(()=>{
469
+ let stage = stageRef.current;
470
+ let scroller = scrollRef.current;
471
+ if (!stage || !scroller) return;
472
+ let offset = axis === 'y' ? stage.offsetTop : stage.offsetLeft;
473
+ if (prevClamped.current !== isClamped && prevStageOffset.current != null) {
474
+ let delta = offset - prevStageOffset.current;
475
+ if (delta !== 0) {
476
+ if (axis === 'y') scroller.scrollTop += delta;
477
+ else scroller.scrollLeft += delta;
478
+ }
479
+ }
480
+ prevClamped.current = isClamped;
481
+ prevStageOffset.current = offset;
482
+ });
483
+ let swipeAnimation = $f44b3686778108d5$var$useSwipeAnimation(props);
484
+ let style = {
485
+ // Positioned so the detent markers below anchor to the sheet's own box.
486
+ position: 'relative',
487
+ ...swipeAnimation
488
+ };
489
+ let overscrollInset;
490
+ if (props.overscrollPadding && position === swipeDirection) {
491
+ overscrollInset = axis === 'y' ? '100vh' : '100vw';
492
+ // Extra padding to allow overscrolling, and a negative margin to offset it.
493
+ switch(position){
494
+ case 'top':
495
+ style.paddingTop = '100vh';
496
+ style.marginTop = '-100vh';
497
+ break;
498
+ case 'bottom':
499
+ style.paddingBottom = '100vh';
500
+ style.marginBottom = '-100vh';
501
+ break;
502
+ case 'left':
503
+ style.paddingLeft = '100vw';
504
+ style.marginLeft = '-100vw';
505
+ break;
506
+ case 'right':
507
+ style.paddingRight = '100vw';
508
+ style.marginRight = '-100vw';
509
+ break;
510
+ }
511
+ }
512
+ if (props.stackAnimation && descendants.length > 0 && $f44b3686778108d5$var$supportsViewTimeline) {
513
+ // Append one animation per descendant sheet, driven by that descendant's view timeline.
514
+ let stackStyle = {
515
+ animationName: ()=>props.stackAnimation,
516
+ animationTimeline: (_, i)=>`--sheet-timeline-${index + 1 + i}`,
517
+ animationDirection: (d)=>d.direction,
518
+ animationIterationCount: (d)=>String(d.iterations),
519
+ animationFillMode: ()=>'both',
520
+ animationRange: (d)=>d.range,
521
+ animationComposition: ()=>'accumulate',
522
+ animationTimingFunction: ()=>'linear'
523
+ };
524
+ for (let [key, value] of Object.entries(stackStyle))style[key] = [
525
+ style[key],
526
+ ...descendants.map(value)
527
+ ].filter(Boolean).join(', ');
528
+ }
529
+ let sheetProps = $f44b3686778108d5$var$useSheetRenderProps(props, values, 'react-aria-Sheet', {
530
+ direction: direction
531
+ }, style);
532
+ let [x, y] = $f44b3686778108d5$var$POSITION_ALIGNMENT[position];
533
+ let justifyContent = axis === 'y' ? y : x;
534
+ let alignItems = axis === 'y' ? x : y;
535
+ let { scrollX: scrollX, scrollY: scrollY } = typeof window !== 'undefined' ? window : {
536
+ scrollX: 0,
537
+ scrollY: 0
538
+ };
539
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
540
+ ref: scrollRef,
541
+ "data-sheet-scroll": true,
542
+ style: {
543
+ position: 'absolute',
544
+ top: axis === 'y' ? `calc(${scrollY}px + ${containerOffset}dvh)` : scrollY,
545
+ left: axis === 'x' ? `calc(${scrollX}px + ${containerOffset}dvw)` : scrollX,
546
+ // The container is 2 viewports along the swipe axis and 1 viewport on the cross axis.
547
+ height: axis === 'y' ? '200dvh' : '100dvh',
548
+ width: axis === 'x' ? '200dvw' : '100dvw',
549
+ overflowX: axis === 'x' ? 'auto' : 'hidden',
550
+ overflowY: axis === 'y' ? 'auto' : 'hidden',
551
+ // Snapping is only disabled when the geometry changes. Changing it during a swipe to dismiss
552
+ // cancels the momentum scroll in Safari without firing scrollend, which onExit waits for.
553
+ scrollSnapType: preventDismissal && isTransitioning ? 'none' : `${axis} mandatory`,
554
+ overscrollBehaviorY: axis === 'y' ? 'contain' : 'none',
555
+ overscrollBehaviorX: axis === 'x' ? 'contain' : 'none',
556
+ scrollbarWidth: 'none',
557
+ // The scroll geometry is physical, so keep the scroll origin and flex alignment
558
+ // left-to-right regardless of the document direction.
559
+ direction: 'ltr'
560
+ }
561
+ }, /*#__PURE__*/ (0, $dnWcj$react).createElement($f44b3686778108d5$var$SnapPoint, {
562
+ point: 0,
563
+ align: isClamped && after ? 'none' : 'start',
564
+ axis: axis
565
+ }), before && after && /*#__PURE__*/ (0, $dnWcj$react).createElement($f44b3686778108d5$var$SnapPoint, {
566
+ point: stageStart,
567
+ align: "start",
568
+ axis: axis
569
+ }), /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
570
+ ref: stageRef,
571
+ style: {
572
+ position: 'absolute',
573
+ // The stage normally sits 1 viewport into the content along the swipe axis.
574
+ top: axis === 'y' ? stageStart : 0,
575
+ left: axis === 'x' ? stageStart : 0,
576
+ height: '100dvh',
577
+ width: '100dvw',
578
+ display: 'flex',
579
+ flexDirection: axis === 'y' ? 'column' : 'row',
580
+ alignItems: alignItems,
581
+ justifyContent: justifyContent
582
+ }
583
+ }, /*#__PURE__*/ (0, $dnWcj$react).createElement((0, $8b8d26808cb8cb53$export$2b77a92f1a5ad772), {
584
+ ...props,
585
+ ref: ref,
586
+ ...sheetProps
587
+ }, (renderProps)=>/*#__PURE__*/ (0, $dnWcj$react).createElement((0, $dnWcj$react).Fragment, null, snapPoints && // Excludes the overscroll padding so percentages are relative to the visible sheet.
588
+ /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
589
+ style: {
590
+ position: 'absolute',
591
+ inset: 0,
592
+ ...overscrollInset ? {
593
+ [position]: overscrollInset
594
+ } : null,
595
+ pointerEvents: 'none'
596
+ }
597
+ }, snapPoints.map((point, i)=>/*#__PURE__*/ (0, $dnWcj$react).createElement($f44b3686778108d5$var$DetentPoint, {
598
+ key: i,
599
+ point: point,
600
+ axis: axis,
601
+ after: after,
602
+ isInitial: i === 0
603
+ }))), typeof props.children === 'function' ? props.children({
604
+ ...renderProps,
605
+ ...values
606
+ }) : props.children))), /*#__PURE__*/ (0, $dnWcj$react).createElement($f44b3686778108d5$var$SnapPoint, {
607
+ point: endMarker,
608
+ align: isClamped && before ? 'none' : 'end',
609
+ axis: axis
610
+ }));
611
+ });
612
+ // Measures how far the sheet must scroll from its smallest snap point to be fully revealed, i.e. the
613
+ // distance from that snap point's marker to the stage's exit edge. Measuring the rendered markers
614
+ // means snap points can use any CSS length, including percentages of the sheet. Uses layout offsets
615
+ // rather than bounding rects so swipe/stack animation transforms don't affect it.
616
+ function $f44b3686778108d5$var$useSnapPointTravel(stageRef, sheetRef, axis, after, // Space-separated snap points, so markers are re-measured when they change. Null to disable.
617
+ snapPointsKey) {
618
+ let [travel, setTravel] = (0, $dnWcj$useState)(0);
619
+ (0, $dnWcj$useLayoutEffect)(()=>{
620
+ let stage = stageRef.current;
621
+ let sheet = sheetRef.current;
622
+ if (snapPointsKey == null || !stage || !sheet) return;
623
+ let measure = ()=>{
624
+ let stageSize = axis === 'y' ? stage.clientHeight : stage.clientWidth;
625
+ let max = 0;
626
+ for (let marker of sheet.querySelectorAll('[data-sheet-detent]')){
627
+ let offset = 0;
628
+ let el = marker;
629
+ while(el && el !== stage){
630
+ offset += axis === 'y' ? el.offsetTop : el.offsetLeft;
631
+ el = el.offsetParent;
632
+ }
633
+ // Markers sit at the snap point's start edge for sheets exiting toward the end edge, and at
634
+ // its end edge for sheets exiting toward the start edge. The smallest snap point travels most.
635
+ let size = axis === 'y' ? marker.offsetHeight : marker.offsetWidth;
636
+ max = Math.max(max, after ? stageSize - offset : offset + size);
637
+ }
638
+ setTravel(max);
639
+ };
640
+ measure();
641
+ let observer = new ResizeObserver(measure);
642
+ observer.observe(stage);
643
+ observer.observe(sheet);
644
+ return ()=>observer.disconnect();
645
+ }, [
646
+ stageRef,
647
+ sheetRef,
648
+ axis,
649
+ after,
650
+ snapPointsKey
651
+ ]);
652
+ return travel;
653
+ }
654
+ const $f44b3686778108d5$export$d79867882ea90c57 = /*#__PURE__*/ (0, $dnWcj$forwardRef)(function SheetBackdrop(props, ref) {
655
+ let style = $f44b3686778108d5$var$useSwipeAnimation(props);
656
+ let { values: values, isEntering: isEntering, isExiting: isExiting } = (0, $dnWcj$useContext)($f44b3686778108d5$var$InternalSheetContext);
657
+ let state = (0, $dnWcj$useContext)((0, $f2ff30fde7b014be$export$d2f961adcb0afbe));
658
+ let renderProps = (0, $7230ffa83bc0c2cf$export$4d86445c2cf5e3)({
659
+ ...props,
660
+ defaultClassName: 'react-aria-SheetBackdrop',
661
+ defaultStyle: {
662
+ ...style,
663
+ position: 'absolute',
664
+ inset: 0
665
+ },
666
+ values: {
667
+ ...values,
668
+ isEntering: isEntering,
669
+ isExiting: isExiting,
670
+ state: state
671
+ }
672
+ });
673
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement("div", {
674
+ ref: ref,
675
+ ...(0, $dnWcj$filterDOMProps)(props, {
676
+ global: true
677
+ }),
678
+ ...renderProps,
679
+ ...$f44b3686778108d5$var$getDataAttributes(values),
680
+ "data-entering": isEntering || undefined,
681
+ "data-exiting": isExiting || undefined
682
+ });
683
+ });
684
+ function $f44b3686778108d5$var$useSwipeAnimation(props) {
685
+ let { swipeDirection: swipeDirection, snapPoints: snapPoints, index: index, isEntering: isEntering, isExiting: isExiting } = (0, $dnWcj$useContext)($f44b3686778108d5$var$InternalSheetContext);
686
+ let { viewRange: viewRange, viewDirection: viewDirection, viewIterations: viewIterations } = $f44b3686778108d5$var$getSwipeConfig(swipeDirection);
687
+ if (props.swipeAnimation) {
688
+ let rangeStart = props.swipeAnimationRange?.start != null ? $f44b3686778108d5$var$toLength(snapPoints?.[props.swipeAnimationRange.start] ?? '0%') : '0%';
689
+ let rangeEnd = props.swipeAnimationRange?.end != null ? $f44b3686778108d5$var$toLength(snapPoints?.[props.swipeAnimationRange.end] ?? '100%') : '100%';
690
+ if (swipeDirection === 'top' || swipeDirection === 'left') {
691
+ rangeStart = `calc(100% - ${rangeStart})`;
692
+ rangeEnd = `calc(100% - ${rangeEnd})`;
693
+ [rangeStart, rangeEnd] = [
694
+ rangeEnd,
695
+ rangeStart
696
+ ];
697
+ }
698
+ // TODO: fix cover with range
699
+ if ($f44b3686778108d5$var$supportsViewTimeline) return {
700
+ animationName: props.swipeAnimation,
701
+ animationTimeline: `--sheet-timeline-${index}`,
702
+ animationDirection: viewDirection,
703
+ animationIterationCount: viewIterations,
704
+ animationFillMode: 'both',
705
+ animationRange: `${viewRange} ${rangeStart} ${viewRange} ${rangeEnd}`,
706
+ animationTimingFunction: 'linear',
707
+ animationComposition: 'replace'
708
+ };
709
+ else if (isEntering || isExiting) // Fallback for Firefox, which doesn't support view timelines.
710
+ return {
711
+ animationName: props.swipeAnimation,
712
+ animationDirection: isExiting ? 'reverse' : 'normal',
713
+ animationDuration: '300ms',
714
+ animationIterationCount: '1',
715
+ animationFillMode: 'both',
716
+ animationTimingFunction: 'linear',
717
+ animationComposition: 'replace'
718
+ };
719
+ }
720
+ return {};
721
+ }
722
+ const $f44b3686778108d5$export$fe5ec5b76996e2d3 = /*#__PURE__*/ (0, $dnWcj$forwardRef)(function SheetContent(props, ref) {
723
+ let { swipeDirection: swipeDirection, index: index } = (0, $dnWcj$useContext)($f44b3686778108d5$var$InternalSheetContext);
724
+ let { axis: axis, before: before, after: after } = $f44b3686778108d5$var$getSwipeConfig(swipeDirection);
725
+ let viewportLength = axis === 'y' ? '100dvh' : '100dvw';
726
+ return /*#__PURE__*/ (0, $dnWcj$react).createElement((0, $f2ff30fde7b014be$export$3ddf2d174ce01153), {
727
+ ...props,
728
+ ref: ref,
729
+ className: props.className || 'react-aria-SheetContent',
730
+ "data-sheet-content": true,
731
+ style: {
732
+ ...props.style,
733
+ width: '100%',
734
+ height: '100%',
735
+ // The dialog is the subject of the view-progress timeline that drives all sheet animations.
736
+ // It is _not_ the Modal because that may have additional padding for overscroll and therefore never be entirely visible.
737
+ // The inset crops the scroll container's scrollport down to the visible viewport.
738
+ // @ts-ignore
739
+ viewTimelineName: `--sheet-timeline-${index}`,
740
+ viewTimelineAxis: axis,
741
+ viewTimelineInset: before && !after ? `${viewportLength} 0` : `0 ${viewportLength}`
742
+ }
743
+ });
744
+ });
745
+ function $f44b3686778108d5$var$reduceMotion() {
746
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
747
+ }
748
+ function $f44b3686778108d5$var$scrollAlongAxis(element, axis, value, smooth = false) {
749
+ let behavior = smooth && !$f44b3686778108d5$var$reduceMotion() ? 'smooth' : undefined;
750
+ element.scrollTo(axis === 'y' ? {
751
+ top: value,
752
+ behavior: behavior
753
+ } : {
754
+ left: value,
755
+ behavior: behavior
756
+ });
757
+ }
758
+ function $f44b3686778108d5$var$scrollDetentIntoView(scroller, marker, axis, align, smooth = false) {
759
+ let behavior = smooth && !$f44b3686778108d5$var$reduceMotion() ? 'smooth' : 'auto';
760
+ let markerRect = marker.getBoundingClientRect();
761
+ let scrollerRect = scroller.getBoundingClientRect();
762
+ let style = getComputedStyle(marker);
763
+ if (axis === 'y') {
764
+ if (align === 'start') {
765
+ let margin = parseFloat(style.scrollMarginTop) || 0;
766
+ // Rest the marker's start edge (less its scroll-margin) at the scrollport's start.
767
+ let top = markerRect.top - scrollerRect.top + scroller.scrollTop - margin;
768
+ scroller.scrollTo({
769
+ top: top,
770
+ behavior: behavior
771
+ });
772
+ } else {
773
+ let margin = parseFloat(style.scrollMarginBottom) || 0;
774
+ // Rest the marker's end edge (plus its scroll-margin) at the scrollport's end.
775
+ let top = markerRect.bottom - scrollerRect.top + scroller.scrollTop + margin - scroller.clientHeight;
776
+ scroller.scrollTo({
777
+ top: top,
778
+ behavior: behavior
779
+ });
780
+ }
781
+ } else if (align === 'start') {
782
+ let margin = parseFloat(style.scrollMarginLeft) || 0;
783
+ let left = markerRect.left - scrollerRect.left + scroller.scrollLeft - margin;
784
+ scroller.scrollTo({
785
+ left: left,
786
+ behavior: behavior
787
+ });
788
+ } else {
789
+ let margin = parseFloat(style.scrollMarginRight) || 0;
790
+ let left = markerRect.right - scrollerRect.left + scroller.scrollLeft + margin - scroller.clientWidth;
791
+ scroller.scrollTo({
792
+ left: left,
793
+ behavior: behavior
794
+ });
795
+ }
796
+ }
797
+ function $f44b3686778108d5$var$calcToPx(calc) {
798
+ if (!calc.startsWith('calc(')) return calc;
799
+ let measure = document.createElement('div');
800
+ measure.inert = true;
801
+ measure.style.position = 'absolute';
802
+ measure.style.top = '0px';
803
+ measure.style.left = '0px';
804
+ measure.style.contain = 'strict';
805
+ measure.style.height = calc;
806
+ document.body.appendChild(measure);
807
+ let height = window.getComputedStyle(measure).height;
808
+ measure.remove();
809
+ return height;
810
+ }
811
+
812
+
813
+ export {$f44b3686778108d5$export$de69b9b0343a1903 as SheetTrigger, $f44b3686778108d5$export$48dbb295cbd054d8 as SheetOverlay, $f44b3686778108d5$export$a9bf29f8d87ebbee as Sheet, $f44b3686778108d5$export$d79867882ea90c57 as SheetBackdrop, $f44b3686778108d5$export$fe5ec5b76996e2d3 as SheetContent};
814
+ //# sourceMappingURL=Sheet.mjs.map