@corvu-next/drawer 0.1.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 ADDED
@@ -0,0 +1,663 @@
1
+ import { createComponent, mergeProps, memo } from 'solid-js/web';
2
+ import Dialog2, { useContext, Portal } from '@corvu-next/dialog';
3
+ import { dataIf, isFunction } from '@corvu-next/utils';
4
+ import { createContext, merge, omit, createSignal, createMemo, createEffect, untrack, useContext as useContext$1 } from 'solid-js';
5
+ import { afterPaint, combineStyle } from '@corvu-next/utils/dom';
6
+ import { getScrollAtLocation } from '@corvu-next/utils/scroll';
7
+ import { useKeyedContext, createKeyedContext } from '@corvu-next/utils/create/keyedContext';
8
+ import createControllableSignal from '@corvu-next/utils/create/controllableSignal';
9
+ import createOnce from '@corvu-next/utils/create/once';
10
+ import createSize from '@corvu-next/utils/create/size';
11
+ import createTransitionSize from '@corvu-next/transition-size';
12
+
13
+ // src/Close.tsx
14
+ var DrawerClose = (props) => {
15
+ return createComponent(Dialog2.Close, mergeProps({
16
+ "data-corvu-drawer-close": "",
17
+ "data-corvu-dialog-close": null
18
+ }, props));
19
+ };
20
+ var Close_default = DrawerClose;
21
+
22
+ // src/lib.ts
23
+ var resolveSnapPoint = (snapPoint, drawerSize, index, breakPoints) => {
24
+ if (index === void 0 || breakPoints === void 0) {
25
+ return {
26
+ value: snapPoint,
27
+ offset: resolvePoint(snapPoint, drawerSize)
28
+ };
29
+ }
30
+ const lowerBreakPoint = breakPoints[index - 1];
31
+ const upperBreakPoint = breakPoints[index];
32
+ return {
33
+ value: snapPoint,
34
+ offset: resolvePoint(snapPoint, drawerSize),
35
+ ...lowerBreakPoint !== void 0 && lowerBreakPoint !== null && {
36
+ lowerBreakPoint: resolvePoint(lowerBreakPoint, drawerSize)
37
+ },
38
+ ...upperBreakPoint !== void 0 && upperBreakPoint !== null && {
39
+ upperBreakPoint: resolvePoint(upperBreakPoint, drawerSize)
40
+ }
41
+ };
42
+ };
43
+ var resolvePoint = (point, drawerSize) => {
44
+ if (typeof point === "number") return drawerSize - point * drawerSize;
45
+ if (!point.endsWith("px")) {
46
+ throw new Error(
47
+ `[corvu] Snap and break points must be a number or a string ending with 'px'. Got ${point}`
48
+ );
49
+ }
50
+ return drawerSize - parseInt(point, 10);
51
+ };
52
+ var findClosestSnapPoint = (snapPoints, offset, offsetWithVelocity, allowSkippingSnapPoints) => {
53
+ const upperSnapPoint = findNearbySnapPoint(
54
+ "upper",
55
+ snapPoints,
56
+ allowSkippingSnapPoints ? offsetWithVelocity : offset
57
+ );
58
+ const lowerSnapPoint = findNearbySnapPoint(
59
+ "lower",
60
+ snapPoints,
61
+ allowSkippingSnapPoints ? offsetWithVelocity : offset
62
+ );
63
+ if (!upperSnapPoint) return lowerSnapPoint;
64
+ if (!lowerSnapPoint) return upperSnapPoint;
65
+ if (lowerSnapPoint.upperBreakPoint === void 0 || upperSnapPoint.lowerBreakPoint === void 0) {
66
+ return Math.abs(lowerSnapPoint.offset - offsetWithVelocity) < Math.abs(upperSnapPoint.offset - offsetWithVelocity) ? lowerSnapPoint : upperSnapPoint;
67
+ }
68
+ return offsetWithVelocity < upperSnapPoint.lowerBreakPoint ? lowerSnapPoint : upperSnapPoint;
69
+ };
70
+ var findNearbySnapPoint = (side, snapPoints, offset) => {
71
+ return snapPoints.reduce(
72
+ (previousSnapPoint, currentSnapPoint) => {
73
+ if (side == "upper" && currentSnapPoint.offset >= offset && (!previousSnapPoint || currentSnapPoint.offset < previousSnapPoint.offset)) {
74
+ return currentSnapPoint;
75
+ } else if (side == "lower" && currentSnapPoint.offset <= offset && (!previousSnapPoint || currentSnapPoint.offset > previousSnapPoint.offset)) {
76
+ return currentSnapPoint;
77
+ }
78
+ return previousSnapPoint;
79
+ },
80
+ void 0
81
+ );
82
+ };
83
+ var locationIsDraggable = (location, stopAt, pointerType) => {
84
+ let currentElement = location;
85
+ do {
86
+ if (currentElement.hasAttribute("data-corvu-no-drag") || currentElement.type === "range" || currentElement.tagName === "SELECT" && pointerType === "mouse")
87
+ return false;
88
+ if (currentElement === stopAt) break;
89
+ currentElement = currentElement.parentElement;
90
+ } while (currentElement);
91
+ return true;
92
+ };
93
+ var DrawerContext = createContext(null);
94
+ var createDrawerContext = (contextId) => {
95
+ if (contextId === void 0) return DrawerContext;
96
+ const context = createKeyedContext(`drawer-${contextId}`);
97
+ return context;
98
+ };
99
+ var useDrawerContext = (contextId) => {
100
+ if (contextId === void 0) {
101
+ const context2 = useContext$1(DrawerContext);
102
+ if (!context2) {
103
+ throw new Error(
104
+ "[corvu]: Drawer context not found. Make sure to wrap Drawer components in <Drawer.Root>"
105
+ );
106
+ }
107
+ return context2;
108
+ }
109
+ const context = useKeyedContext(`drawer-${contextId}`);
110
+ if (!context) {
111
+ throw new Error(
112
+ `[corvu]: Drawer context with id "${contextId}" not found. Make sure to wrap Drawer components in <Drawer.Root contextId="${contextId}">`
113
+ );
114
+ }
115
+ return context;
116
+ };
117
+ var InternalDrawerContext = createContext(null);
118
+ var createInternalDrawerContext = (contextId) => {
119
+ if (contextId === void 0) return InternalDrawerContext;
120
+ const context = createKeyedContext(
121
+ `drawer-internal-${contextId}`
122
+ );
123
+ return context;
124
+ };
125
+ var useInternalDrawerContext = (contextId) => {
126
+ if (contextId === void 0) {
127
+ const context2 = useContext$1(InternalDrawerContext);
128
+ if (!context2) {
129
+ throw new Error(
130
+ "[corvu]: Drawer context not found. Make sure to wrap Drawer components in <Drawer.Root>"
131
+ );
132
+ }
133
+ return context2;
134
+ }
135
+ const context = useKeyedContext(
136
+ `drawer-internal-${contextId}`
137
+ );
138
+ if (!context) {
139
+ throw new Error(
140
+ `[corvu]: Drawer context with id "${contextId}" not found. Make sure to wrap Drawer components in <Drawer.Root contextId="${contextId}">`
141
+ );
142
+ }
143
+ return context;
144
+ };
145
+
146
+ // src/Content.tsx
147
+ var DrawerContent = (props) => {
148
+ const otherProps = omit(props, "contextId", "style");
149
+ let pointerDown = false;
150
+ let dragStartPos = null;
151
+ let currentPointerStart = [0, 0];
152
+ let cachedMoveTimestamp;
153
+ let cachedTranslate = 0;
154
+ const drawerContext = createMemo(() => useInternalDrawerContext(props.contextId));
155
+ const dialogContext = createMemo(() => Dialog2.useContext(props.contextId));
156
+ const snapPoints = createMemo(() => drawerContext().snapPoints().map((snapPoint, index) => resolveSnapPoint(snapPoint, drawerContext().drawerSize(), index, drawerContext().breakPoints())));
157
+ const transformValue = createMemo(() => {
158
+ switch (drawerContext().side()) {
159
+ case "top":
160
+ return `translate3d(0, ${-drawerContext().translate()}px, 0)`;
161
+ case "bottom":
162
+ return `translate3d(0, ${drawerContext().translate()}px, 0)`;
163
+ case "right":
164
+ return `translate3d(${drawerContext().translate()}px, 0, 0)`;
165
+ case "left":
166
+ return `translate3d(${-drawerContext().translate()}px, 0, 0)`;
167
+ }
168
+ });
169
+ const transitionHeight = createMemo(() => {
170
+ const transitionSize = drawerContext().transitionSize();
171
+ if (transitionSize === null) return void 0;
172
+ switch (drawerContext().side()) {
173
+ case "top":
174
+ case "bottom":
175
+ return `${transitionSize}px`;
176
+ }
177
+ return void 0;
178
+ });
179
+ const transitionWidth = createMemo(() => {
180
+ const transitionSize = drawerContext().transitionSize();
181
+ if (transitionSize === null) return void 0;
182
+ switch (drawerContext().side()) {
183
+ case "left":
184
+ case "right":
185
+ return `${transitionSize}px`;
186
+ }
187
+ return void 0;
188
+ });
189
+ createEffect(() => dialogContext().open(), (isOpen) => {
190
+ if (!isOpen) return;
191
+ document.addEventListener("pointermove", onPointerMove);
192
+ document.addEventListener("touchmove", onTouchMove);
193
+ document.addEventListener("pointerup", onPointerUp);
194
+ document.addEventListener("touchend", onTouchEnd);
195
+ document.addEventListener("contextmenu", onUp);
196
+ return () => {
197
+ document.removeEventListener("pointermove", onPointerMove);
198
+ document.removeEventListener("touchmove", onTouchMove);
199
+ document.removeEventListener("pointerup", onPointerUp);
200
+ document.removeEventListener("touchend", onTouchEnd);
201
+ document.removeEventListener("contextmenu", onUp);
202
+ };
203
+ });
204
+ createEffect(() => drawerContext().transitionState(), (state) => {
205
+ if (state === "closing") {
206
+ drawerContext().setIsDragging(false);
207
+ }
208
+ });
209
+ const onPointerDown = (event) => {
210
+ if (event.button !== 0) return;
211
+ if (!locationIsDraggable(event.target, dialogContext().contentRef(), event.pointerType)) return;
212
+ if (drawerContext().transitionState() === "closing") return;
213
+ pointerDown = true;
214
+ if (drawerContext().handleScrollableElements()) {
215
+ currentPointerStart = [event.clientX, event.clientY];
216
+ }
217
+ };
218
+ const onPointerMove = (event) => {
219
+ onMove(event.target, event.clientX, event.clientY);
220
+ };
221
+ const onTouchMove = (event) => {
222
+ if (!event.touches[0]) return;
223
+ onMove(event.target, event.touches[0].clientX, event.touches[0].clientY);
224
+ };
225
+ const onMove = (target, x, y) => {
226
+ if (!pointerDown) return;
227
+ if (!drawerContext().isDragging() || dragStartPos === null) {
228
+ const selection = window.getSelection();
229
+ if (selection && selection.toString().length > 0) {
230
+ onUp();
231
+ return;
232
+ }
233
+ if (drawerContext().handleScrollableElements()) {
234
+ const delta2 = [x, y].map((pointer, i) => currentPointerStart[i] - pointer);
235
+ const axis = Math.abs(delta2[0]) > Math.abs(delta2[1]) ? "x" : "y";
236
+ const axisDelta = axis === "x" ? delta2[0] : delta2[1];
237
+ if (Math.abs(axisDelta) < 0.3) return;
238
+ const wrapper = dialogContext().contentRef();
239
+ const [availableScroll, availableScrollTop] = getScrollAtLocation(target, axis, wrapper);
240
+ if (axisDelta > 0 && Math.abs(availableScroll) > 1 || axisDelta < 0 && Math.abs(availableScrollTop) > 0) {
241
+ onUp();
242
+ return;
243
+ }
244
+ }
245
+ switch (drawerContext().side()) {
246
+ case "top":
247
+ case "bottom":
248
+ dragStartPos = y;
249
+ break;
250
+ case "right":
251
+ case "left":
252
+ dragStartPos = x;
253
+ }
254
+ cachedMoveTimestamp = /* @__PURE__ */ new Date();
255
+ cachedTranslate = drawerContext().translate();
256
+ drawerContext().setIsDragging(true);
257
+ drawerContext().setTransitionState(null);
258
+ }
259
+ let delta;
260
+ switch (drawerContext().side()) {
261
+ case "top":
262
+ delta = -(dragStartPos - y);
263
+ break;
264
+ case "bottom":
265
+ delta = dragStartPos - y;
266
+ break;
267
+ case "right":
268
+ delta = dragStartPos - x;
269
+ break;
270
+ case "left":
271
+ delta = -(dragStartPos - x);
272
+ break;
273
+ }
274
+ delta -= drawerContext().resolvedActiveSnapPoint().offset;
275
+ if (delta > 0) delta = drawerContext().dampFunction(delta);
276
+ const now = /* @__PURE__ */ new Date();
277
+ if (now.getTime() - cachedMoveTimestamp.getTime() > drawerContext().velocityCacheReset()) {
278
+ cachedMoveTimestamp = now;
279
+ cachedTranslate = drawerContext().translate();
280
+ }
281
+ drawerContext().setTranslate(-delta);
282
+ };
283
+ const onPointerUp = (event) => {
284
+ if (event.pointerType !== "touch") onUp();
285
+ };
286
+ const onTouchEnd = (event) => {
287
+ if (event.touches.length === 0) onUp();
288
+ };
289
+ const onUp = () => {
290
+ pointerDown = false;
291
+ if (!drawerContext().isDragging()) return;
292
+ const now = /* @__PURE__ */ new Date();
293
+ const velocity = drawerContext().velocityFunction(-(cachedTranslate - drawerContext().translate()), now.getTime() - cachedMoveTimestamp.getTime() || 1);
294
+ const translateWithVelocity = drawerContext().translate() * velocity;
295
+ const closestSnapPoint = findClosestSnapPoint(snapPoints(), drawerContext().translate(), translateWithVelocity, drawerContext().allowSkippingSnapPoints());
296
+ drawerContext().setTransitionState("snapping");
297
+ drawerContext().setIsDragging(false);
298
+ drawerContext().setActiveSnapPoint(closestSnapPoint.value);
299
+ if (closestSnapPoint.offset === drawerContext().drawerSize()) {
300
+ dialogContext().setOpen(false);
301
+ } else {
302
+ drawerContext().setTranslate(closestSnapPoint.offset);
303
+ const transitionDuration = parseFloat(drawerContext().drawerStyles().transitionDuration);
304
+ if (transitionDuration === 0) {
305
+ drawerContext().setTransitionState(null);
306
+ }
307
+ }
308
+ };
309
+ return createComponent(Dialog2.Content, mergeProps({
310
+ get contextId() {
311
+ return props.contextId;
312
+ },
313
+ get style() {
314
+ return combineStyle({
315
+ transform: transformValue(),
316
+ "transition-duration": drawerContext().isDragging() ? "0ms" : void 0,
317
+ height: transitionHeight(),
318
+ width: transitionWidth()
319
+ }, props.style);
320
+ },
321
+ onPointerDown,
322
+ onTouchStart: (e) => {
323
+ if (e.touches.length !== 1) return;
324
+ dragStartPos = null;
325
+ },
326
+ onTransitionEnd: (e) => {
327
+ if (e.target !== dialogContext().contentRef()) return;
328
+ if (drawerContext().transitionState() === "closing") {
329
+ drawerContext().closeDrawer();
330
+ }
331
+ if (drawerContext().transitionState() !== "resizing") {
332
+ drawerContext().setTransitionState(null);
333
+ }
334
+ },
335
+ get ["data-side"]() {
336
+ return drawerContext().side();
337
+ },
338
+ get ["data-opening"]() {
339
+ return dataIf(drawerContext().transitionState() === "opening");
340
+ },
341
+ get ["data-closing"]() {
342
+ return dataIf(drawerContext().transitionState() === "closing");
343
+ },
344
+ get ["data-snapping"]() {
345
+ return dataIf(drawerContext().transitionState() === "snapping");
346
+ },
347
+ get ["data-transitioning"]() {
348
+ return dataIf(drawerContext().isTransitioning());
349
+ },
350
+ get ["data-resizing"]() {
351
+ return dataIf(drawerContext().transitionState() === "resizing");
352
+ },
353
+ "data-corvu-drawer-content": "",
354
+ "data-corvu-dialog-content": null
355
+ }, otherProps));
356
+ };
357
+ var Content_default = DrawerContent;
358
+ var DrawerDescription = (props) => {
359
+ return createComponent(Dialog2.Description, mergeProps({
360
+ "data-corvu-drawer-description": "",
361
+ "data-corvu-dialog-description": null
362
+ }, props));
363
+ };
364
+ var Description_default = DrawerDescription;
365
+ var DrawerLabel = (props) => {
366
+ return createComponent(Dialog2.Label, mergeProps({
367
+ "data-corvu-drawer-label": "",
368
+ "data-corvu-dialog-label": null
369
+ }, props));
370
+ };
371
+ var Label_default = DrawerLabel;
372
+ var DrawerOverlay = (props) => {
373
+ const otherProps = omit(props, "contextId");
374
+ const drawerContext = createMemo(() => useInternalDrawerContext(props.contextId));
375
+ return createComponent(Dialog2.Overlay, mergeProps({
376
+ get contextId() {
377
+ return props.contextId;
378
+ },
379
+ get ["data-side"]() {
380
+ return drawerContext().side();
381
+ },
382
+ get ["data-opening"]() {
383
+ return dataIf(drawerContext().transitionState() === "opening");
384
+ },
385
+ get ["data-closing"]() {
386
+ return dataIf(drawerContext().transitionState() === "closing");
387
+ },
388
+ get ["data-snapping"]() {
389
+ return dataIf(drawerContext().transitionState() === "snapping");
390
+ },
391
+ get ["data-transitioning"]() {
392
+ return dataIf(drawerContext().isTransitioning());
393
+ },
394
+ get ["data-resizing"]() {
395
+ return dataIf(drawerContext().transitionState() === "resizing");
396
+ },
397
+ "data-corvu-drawer-overlay": "",
398
+ "data-corvu-dialog-overlay": null
399
+ }, otherProps));
400
+ };
401
+ var Overlay_default = DrawerOverlay;
402
+ var DrawerRoot = (props) => {
403
+ const defaultedProps = merge({
404
+ initialOpen: false,
405
+ snapPoints: [0, 1],
406
+ breakPoints: [null],
407
+ defaultSnapPoint: 1,
408
+ side: "bottom",
409
+ dampFunction: (distance) => 6 * Math.log(distance + 1),
410
+ velocityFunction: (distance, time) => {
411
+ const velocity = distance / time;
412
+ return velocity < 1 && velocity > -1 ? 1 : velocity;
413
+ },
414
+ velocityCacheReset: 200,
415
+ allowSkippingSnapPoints: true,
416
+ handleScrollableElements: true,
417
+ transitionResize: false,
418
+ closeOnOutsidePointer: true,
419
+ allowPinchZoom: false
420
+ }, props);
421
+ const otherProps = omit(defaultedProps, "snapPoints", "breakPoints", "defaultSnapPoint", "activeSnapPoint", "onActiveSnapPointChange", "side", "dampFunction", "velocityFunction", "velocityCacheReset", "allowSkippingSnapPoints", "handleScrollableElements", "transitionResize", "open", "initialOpen", "onOpenChange", "closeOnOutsidePointer", "contextId", "children");
422
+ const [open, setOpen] = createControllableSignal({
423
+ value: () => defaultedProps.open,
424
+ initialValue: defaultedProps.initialOpen,
425
+ onChange: defaultedProps.onOpenChange
426
+ });
427
+ const [activeSnapPoint, setActiveSnapPoint] = createControllableSignal({
428
+ value: () => defaultedProps.activeSnapPoint,
429
+ initialValue: 0,
430
+ onChange: defaultedProps.onActiveSnapPointChange
431
+ });
432
+ const [dialogContext, setDialogContext] = createSignal();
433
+ const {
434
+ transitioning: sizeTransitioning,
435
+ transitionSize
436
+ } = createTransitionSize({
437
+ element: () => dialogContext()?.contentRef() ?? null,
438
+ enabled: () => open() && defaultedProps.transitionResize,
439
+ dimension: () => {
440
+ switch (defaultedProps.side) {
441
+ case "top":
442
+ case "bottom":
443
+ return "height";
444
+ case "left":
445
+ case "right":
446
+ return "width";
447
+ }
448
+ }
449
+ });
450
+ const [isDragging, setIsDragging] = createSignal(false);
451
+ const [transitionState, setTransitionState] = createSignal(() => {
452
+ if (sizeTransitioning()) return "resizing";
453
+ return null;
454
+ });
455
+ const drawerStyles = createMemo(() => {
456
+ const contentRef = dialogContext()?.contentRef();
457
+ if (!contentRef) return void 0;
458
+ return getComputedStyle(contentRef);
459
+ });
460
+ const [transitionAwareOpen, setTransitionAwareOpen] = createSignal(false);
461
+ createEffect(() => open(), (_open) => {
462
+ untrack(() => {
463
+ if (transitionAwareOpen() === _open) {
464
+ return;
465
+ }
466
+ if (_open) {
467
+ setTransitionAwareOpen(true);
468
+ afterPaint(() => {
469
+ setTransitionState("opening");
470
+ setActiveSnapPoint(defaultedProps.defaultSnapPoint);
471
+ const transitionDuration = parseFloat(drawerStyles().transitionDuration);
472
+ if (transitionDuration === 0) {
473
+ setTransitionState(null);
474
+ }
475
+ });
476
+ } else {
477
+ setTransitionState("closing");
478
+ setActiveSnapPoint(0);
479
+ afterPaint(() => {
480
+ const transitionDuration = parseFloat(drawerStyles().transitionDuration);
481
+ if (transitionDuration === 0) {
482
+ closeDrawer();
483
+ }
484
+ });
485
+ }
486
+ });
487
+ });
488
+ const closeDrawer = () => {
489
+ setTransitionAwareOpen(false);
490
+ setTransitionState(null);
491
+ };
492
+ const drawerSize = createSize({
493
+ element: () => dialogContext()?.contentRef() ?? null,
494
+ dimension: () => {
495
+ switch (defaultedProps.side) {
496
+ case "top":
497
+ case "bottom":
498
+ return "height";
499
+ case "left":
500
+ case "right":
501
+ return "width";
502
+ }
503
+ }
504
+ });
505
+ const resolvedActiveSnapPoint = createMemo(() => resolveSnapPoint(activeSnapPoint(), drawerSize()));
506
+ const [translate, setTranslate] = createSignal(() => resolvedActiveSnapPoint().offset);
507
+ const openPercentage = createMemo(() => {
508
+ if (!drawerSize()) return 0;
509
+ return (drawerSize() - translate()) / drawerSize();
510
+ });
511
+ const childrenProps = {
512
+ get snapPoints() {
513
+ return defaultedProps.snapPoints;
514
+ },
515
+ get breakPoints() {
516
+ return defaultedProps.breakPoints;
517
+ },
518
+ get defaultSnapPoint() {
519
+ return defaultedProps.defaultSnapPoint;
520
+ },
521
+ get activeSnapPoint() {
522
+ return activeSnapPoint();
523
+ },
524
+ setActiveSnapPoint,
525
+ get side() {
526
+ return defaultedProps.side;
527
+ },
528
+ get isDragging() {
529
+ return isDragging();
530
+ },
531
+ get isTransitioning() {
532
+ return transitionState() !== null;
533
+ },
534
+ get transitionState() {
535
+ return transitionState();
536
+ },
537
+ get openPercentage() {
538
+ return openPercentage();
539
+ },
540
+ get translate() {
541
+ return translate();
542
+ },
543
+ get velocityCacheReset() {
544
+ return defaultedProps.velocityCacheReset;
545
+ },
546
+ get allowSkippingSnapPoints() {
547
+ return defaultedProps.allowSkippingSnapPoints;
548
+ },
549
+ get handleScrollableElements() {
550
+ return defaultedProps.handleScrollableElements;
551
+ },
552
+ get transitionResize() {
553
+ return defaultedProps.transitionResize;
554
+ }
555
+ };
556
+ const memoizedChildren = createOnce(() => defaultedProps.children);
557
+ const resolveChildren = (dialogChildrenProps) => {
558
+ setDialogContext(Dialog2.useContext(defaultedProps.contextId));
559
+ const children = memoizedChildren()();
560
+ if (isFunction(children)) {
561
+ const mergedProps = merge(dialogChildrenProps, childrenProps);
562
+ return children(mergedProps);
563
+ }
564
+ return children;
565
+ };
566
+ const memoizedDrawerRoot = createMemo(() => {
567
+ const DrawerContext2 = createDrawerContext(defaultedProps.contextId);
568
+ const InternalDrawerContext2 = createInternalDrawerContext(defaultedProps.contextId);
569
+ return untrack(() => createComponent(DrawerContext2, {
570
+ value: {
571
+ snapPoints: () => defaultedProps.snapPoints,
572
+ breakPoints: () => defaultedProps.breakPoints,
573
+ defaultSnapPoint: () => defaultedProps.defaultSnapPoint,
574
+ activeSnapPoint,
575
+ setActiveSnapPoint,
576
+ side: () => defaultedProps.side,
577
+ isDragging,
578
+ isTransitioning: () => transitionState() !== null,
579
+ transitionState,
580
+ openPercentage,
581
+ translate,
582
+ velocityCacheReset: () => defaultedProps.velocityCacheReset,
583
+ allowSkippingSnapPoints: () => defaultedProps.allowSkippingSnapPoints,
584
+ handleScrollableElements: () => defaultedProps.handleScrollableElements,
585
+ transitionResize: () => defaultedProps.transitionResize
586
+ },
587
+ get children() {
588
+ return createComponent(InternalDrawerContext2, {
589
+ get value() {
590
+ return {
591
+ snapPoints: () => defaultedProps.snapPoints,
592
+ breakPoints: () => defaultedProps.breakPoints,
593
+ defaultSnapPoint: () => defaultedProps.defaultSnapPoint,
594
+ activeSnapPoint,
595
+ setActiveSnapPoint,
596
+ side: () => defaultedProps.side,
597
+ isDragging,
598
+ isTransitioning: () => transitionState() !== null,
599
+ transitionState,
600
+ openPercentage,
601
+ translate,
602
+ velocityCacheReset: () => defaultedProps.velocityCacheReset,
603
+ allowSkippingSnapPoints: () => defaultedProps.allowSkippingSnapPoints,
604
+ handleScrollableElements: () => defaultedProps.handleScrollableElements,
605
+ transitionResize: () => defaultedProps.transitionResize,
606
+ dampFunction: defaultedProps.dampFunction,
607
+ velocityFunction: defaultedProps.velocityFunction,
608
+ setIsDragging,
609
+ setTranslate,
610
+ drawerSize,
611
+ resolvedActiveSnapPoint,
612
+ drawerStyles,
613
+ setTransitionState,
614
+ transitionSize,
615
+ closeDrawer
616
+ };
617
+ },
618
+ get children() {
619
+ return createComponent(Dialog2, mergeProps({
620
+ get open() {
621
+ return transitionAwareOpen();
622
+ },
623
+ onOpenChange: setOpen,
624
+ get contextId() {
625
+ return defaultedProps.contextId;
626
+ },
627
+ get closeOnOutsidePointer() {
628
+ return memo(() => !!!isDragging())() && defaultedProps.closeOnOutsidePointer;
629
+ }
630
+ }, otherProps, {
631
+ children: (dialogChildrenProps) => resolveChildren(dialogChildrenProps)
632
+ }));
633
+ }
634
+ });
635
+ }
636
+ }));
637
+ });
638
+ return memoizedDrawerRoot;
639
+ };
640
+ var Root_default = DrawerRoot;
641
+ var DrawerTrigger = (props) => {
642
+ return createComponent(Dialog2.Trigger, mergeProps({
643
+ "data-corvu-drawer-trigger": "",
644
+ "data-corvu-dialog-trigger": null
645
+ }, props));
646
+ };
647
+ var Trigger_default = DrawerTrigger;
648
+
649
+ // src/index.ts
650
+ var Drawer = Object.assign(Root_default, {
651
+ Trigger: Trigger_default,
652
+ Portal,
653
+ Overlay: Overlay_default,
654
+ Content: Content_default,
655
+ Label: Label_default,
656
+ Description: Description_default,
657
+ Close: Close_default,
658
+ useContext: useDrawerContext,
659
+ useDialogContext: useContext
660
+ });
661
+ var index_default = Drawer;
662
+
663
+ export { index_default as default };