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