@evinvest/uikit 0.19.0 → 0.21.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 (269) hide show
  1. package/README.md +17 -5
  2. package/dist/components/accordion.js +136 -0
  3. package/dist/components/accordion.js.map +1 -0
  4. package/dist/components/alert-dialog.js +175 -0
  5. package/dist/components/alert-dialog.js.map +1 -0
  6. package/dist/components/alert.js +49 -0
  7. package/dist/components/alert.js.map +1 -0
  8. package/dist/components/avatar.js +54 -0
  9. package/dist/components/avatar.js.map +1 -0
  10. package/dist/components/badge.js +25 -0
  11. package/dist/components/badge.js.map +1 -0
  12. package/dist/components/band.js +75 -0
  13. package/dist/components/band.js.map +1 -0
  14. package/dist/components/breadcrumb.js +132 -0
  15. package/dist/components/breadcrumb.js.map +1 -0
  16. package/dist/components/button-group.js +61 -0
  17. package/dist/components/button-group.js.map +1 -0
  18. package/dist/components/button.js +55 -0
  19. package/dist/components/button.js.map +1 -0
  20. package/dist/components/calendar.js +226 -0
  21. package/dist/components/calendar.js.map +1 -0
  22. package/dist/components/card.js +98 -0
  23. package/dist/components/card.js.map +1 -0
  24. package/dist/components/carousel.js +262 -0
  25. package/dist/components/carousel.js.map +1 -0
  26. package/dist/components/chart.js +151 -0
  27. package/dist/components/chart.js.map +1 -0
  28. package/dist/components/checkbox.js +68 -0
  29. package/dist/components/checkbox.js.map +1 -0
  30. package/dist/components/collapsible.js +60 -0
  31. package/dist/components/collapsible.js.map +1 -0
  32. package/dist/components/command.js +274 -0
  33. package/dist/components/command.js.map +1 -0
  34. package/dist/components/container.js +18 -0
  35. package/dist/components/container.js.map +1 -0
  36. package/dist/components/context-menu.js +337 -0
  37. package/dist/components/context-menu.js.map +1 -0
  38. package/dist/components/date-time-picker.js +301 -0
  39. package/dist/components/date-time-picker.js.map +1 -0
  40. package/dist/components/dialog.js +207 -0
  41. package/dist/components/dialog.js.map +1 -0
  42. package/dist/components/drawer.js +351 -0
  43. package/dist/components/drawer.js.map +1 -0
  44. package/dist/components/dropdown-menu.js +356 -0
  45. package/dist/components/dropdown-menu.js.map +1 -0
  46. package/dist/components/empty.js +91 -0
  47. package/dist/components/empty.js.map +1 -0
  48. package/dist/components/field-context.js +30 -0
  49. package/dist/components/field-context.js.map +1 -0
  50. package/dist/components/field.js +216 -0
  51. package/dist/components/field.js.map +1 -0
  52. package/dist/components/footer.js +89 -0
  53. package/dist/components/footer.js.map +1 -0
  54. package/dist/components/form.js +101 -0
  55. package/dist/components/form.js.map +1 -0
  56. package/dist/components/hover-card.js +90 -0
  57. package/dist/components/hover-card.js.map +1 -0
  58. package/dist/components/info-tip.js +161 -0
  59. package/dist/components/info-tip.js.map +1 -0
  60. package/dist/components/input-group.js +124 -0
  61. package/dist/components/input-group.js.map +1 -0
  62. package/dist/components/input-otp.js +120 -0
  63. package/dist/components/input-otp.js.map +1 -0
  64. package/dist/components/input.js +26 -0
  65. package/dist/components/input.js.map +1 -0
  66. package/dist/components/item.js +167 -0
  67. package/dist/components/item.js.map +1 -0
  68. package/dist/components/kbd.js +29 -0
  69. package/dist/components/kbd.js.map +1 -0
  70. package/dist/components/label.js +11 -0
  71. package/dist/components/label.js.map +1 -0
  72. package/dist/components/logo.js +41 -0
  73. package/dist/components/logo.js.map +1 -0
  74. package/dist/components/menubar.js +330 -0
  75. package/dist/components/menubar.js.map +1 -0
  76. package/dist/components/native-select.js +62 -0
  77. package/dist/components/native-select.js.map +1 -0
  78. package/dist/components/navigation-menu.js +204 -0
  79. package/dist/components/navigation-menu.js.map +1 -0
  80. package/dist/components/pagination.js +138 -0
  81. package/dist/components/pagination.js.map +1 -0
  82. package/dist/components/popover.js +104 -0
  83. package/dist/components/popover.js.map +1 -0
  84. package/dist/components/progress.js +30 -0
  85. package/dist/components/progress.js.map +1 -0
  86. package/dist/components/radio-group.js +113 -0
  87. package/dist/components/radio-group.js.map +1 -0
  88. package/dist/components/resizable.js +193 -0
  89. package/dist/components/resizable.js.map +1 -0
  90. package/dist/components/scroll-area.js +40 -0
  91. package/dist/components/scroll-area.js.map +1 -0
  92. package/dist/components/section-descriptor.js +88 -0
  93. package/dist/components/section-descriptor.js.map +1 -0
  94. package/dist/components/select-chevron.js +25 -0
  95. package/dist/components/select-chevron.js.map +1 -0
  96. package/dist/components/select.js +288 -0
  97. package/dist/components/select.js.map +1 -0
  98. package/dist/components/separator.js +31 -0
  99. package/dist/components/separator.js.map +1 -0
  100. package/dist/components/sheet.js +200 -0
  101. package/dist/components/sheet.js.map +1 -0
  102. package/dist/components/sidebar.js +326 -0
  103. package/dist/components/sidebar.js.map +1 -0
  104. package/dist/components/skeleton.js +18 -0
  105. package/dist/components/skeleton.js.map +1 -0
  106. package/dist/components/slider.js +138 -0
  107. package/dist/components/slider.js.map +1 -0
  108. package/dist/components/sonner.js +319 -0
  109. package/dist/components/sonner.js.map +1 -0
  110. package/dist/components/spinner.js +23 -0
  111. package/dist/components/spinner.js.map +1 -0
  112. package/dist/components/status-screen.js +145 -0
  113. package/dist/components/status-screen.js.map +1 -0
  114. package/dist/components/switch.js +54 -0
  115. package/dist/components/switch.js.map +1 -0
  116. package/dist/components/table.js +124 -0
  117. package/dist/components/table.js.map +1 -0
  118. package/dist/components/tabs.js +133 -0
  119. package/dist/components/tabs.js.map +1 -0
  120. package/dist/components/terminal.js +206 -0
  121. package/dist/components/terminal.js.map +1 -0
  122. package/dist/components/textarea.js +22 -0
  123. package/dist/components/textarea.js.map +1 -0
  124. package/dist/components/toggle-group.js +105 -0
  125. package/dist/components/toggle-group.js.map +1 -0
  126. package/dist/components/toggle.js +53 -0
  127. package/dist/components/toggle.js.map +1 -0
  128. package/dist/components/tooltip.js +102 -0
  129. package/dist/components/tooltip.js.map +1 -0
  130. package/dist/generated/accent.js +27 -0
  131. package/dist/generated/accent.js.map +1 -0
  132. package/dist/generated/accordion.js +13 -0
  133. package/dist/generated/accordion.js.map +1 -0
  134. package/dist/generated/alert-dialog.js +15 -0
  135. package/dist/generated/alert-dialog.js.map +1 -0
  136. package/dist/generated/alert.js +16 -0
  137. package/dist/generated/alert.js.map +1 -0
  138. package/dist/generated/avatar.js +9 -0
  139. package/dist/generated/avatar.js.map +1 -0
  140. package/dist/generated/badge.js +13 -0
  141. package/dist/generated/badge.js.map +1 -0
  142. package/dist/generated/band.js +39 -0
  143. package/dist/generated/band.js.map +1 -0
  144. package/dist/generated/breadcrumb.js +15 -0
  145. package/dist/generated/breadcrumb.js.map +1 -0
  146. package/dist/generated/button-group.js +14 -0
  147. package/dist/generated/button-group.js.map +1 -0
  148. package/dist/generated/button.js +30 -0
  149. package/dist/generated/button.js.map +1 -0
  150. package/dist/generated/calendar.js +29 -0
  151. package/dist/generated/calendar.js.map +1 -0
  152. package/dist/generated/card.js +17 -0
  153. package/dist/generated/card.js.map +1 -0
  154. package/dist/generated/carousel.js +31 -0
  155. package/dist/generated/carousel.js.map +1 -0
  156. package/dist/generated/chart.js +9 -0
  157. package/dist/generated/chart.js.map +1 -0
  158. package/dist/generated/checkbox.js +7 -0
  159. package/dist/generated/checkbox.js.map +1 -0
  160. package/dist/generated/command.js +27 -0
  161. package/dist/generated/command.js.map +1 -0
  162. package/dist/generated/container.js +5 -0
  163. package/dist/generated/container.js.map +1 -0
  164. package/dist/generated/context-menu.js +19 -0
  165. package/dist/generated/context-menu.js.map +1 -0
  166. package/dist/generated/date-time-picker.js +15 -0
  167. package/dist/generated/date-time-picker.js.map +1 -0
  168. package/dist/generated/dialog.js +17 -0
  169. package/dist/generated/dialog.js.map +1 -0
  170. package/dist/generated/drawer.js +26 -0
  171. package/dist/generated/drawer.js.map +1 -0
  172. package/dist/generated/dropdown-menu.js +21 -0
  173. package/dist/generated/dropdown-menu.js.map +1 -0
  174. package/dist/generated/empty.js +20 -0
  175. package/dist/generated/empty.js.map +1 -0
  176. package/dist/generated/field.js +33 -0
  177. package/dist/generated/field.js.map +1 -0
  178. package/dist/generated/focus.js +5 -0
  179. package/dist/generated/focus.js.map +1 -0
  180. package/dist/generated/form.js +11 -0
  181. package/dist/generated/form.js.map +1 -0
  182. package/dist/generated/hover-card.js +5 -0
  183. package/dist/generated/hover-card.js.map +1 -0
  184. package/dist/generated/input-group.js +29 -0
  185. package/dist/generated/input-group.js.map +1 -0
  186. package/dist/generated/input-otp.js +15 -0
  187. package/dist/generated/input-otp.js.map +1 -0
  188. package/dist/generated/input.js +11 -0
  189. package/dist/generated/input.js.map +1 -0
  190. package/dist/generated/item.js +40 -0
  191. package/dist/generated/item.js.map +1 -0
  192. package/dist/generated/kbd.js +7 -0
  193. package/dist/generated/kbd.js.map +1 -0
  194. package/dist/generated/label.js +5 -0
  195. package/dist/generated/label.js.map +1 -0
  196. package/dist/generated/menubar.js +27 -0
  197. package/dist/generated/menubar.js.map +1 -0
  198. package/dist/generated/navigation-menu.js +19 -0
  199. package/dist/generated/navigation-menu.js.map +1 -0
  200. package/dist/generated/popover.js +5 -0
  201. package/dist/generated/popover.js.map +1 -0
  202. package/dist/generated/progress.js +7 -0
  203. package/dist/generated/progress.js.map +1 -0
  204. package/dist/generated/radio-group.js +7 -0
  205. package/dist/generated/radio-group.js.map +1 -0
  206. package/dist/generated/resizable.js +11 -0
  207. package/dist/generated/resizable.js.map +1 -0
  208. package/dist/generated/scroll-area.js +14 -0
  209. package/dist/generated/scroll-area.js.map +1 -0
  210. package/dist/generated/select.js +15 -0
  211. package/dist/generated/select.js.map +1 -0
  212. package/dist/generated/separator.js +10 -0
  213. package/dist/generated/separator.js.map +1 -0
  214. package/dist/generated/sheet.js +25 -0
  215. package/dist/generated/sheet.js.map +1 -0
  216. package/dist/generated/sidebar.js +41 -0
  217. package/dist/generated/sidebar.js.map +1 -0
  218. package/dist/generated/skeleton.js +5 -0
  219. package/dist/generated/skeleton.js.map +1 -0
  220. package/dist/generated/slider.js +11 -0
  221. package/dist/generated/slider.js.map +1 -0
  222. package/dist/generated/sonner.js +30 -0
  223. package/dist/generated/sonner.js.map +1 -0
  224. package/dist/generated/switch.js +7 -0
  225. package/dist/generated/switch.js.map +1 -0
  226. package/dist/generated/table.js +21 -0
  227. package/dist/generated/table.js.map +1 -0
  228. package/dist/generated/tabs.js +11 -0
  229. package/dist/generated/tabs.js.map +1 -0
  230. package/dist/generated/terminal.js +70 -0
  231. package/dist/generated/terminal.js.map +1 -0
  232. package/dist/generated/textarea.js +11 -0
  233. package/dist/generated/textarea.js.map +1 -0
  234. package/dist/generated/toggle.js +18 -0
  235. package/dist/generated/toggle.js.map +1 -0
  236. package/dist/generated/tooltip.js +5 -0
  237. package/dist/generated/tooltip.js.map +1 -0
  238. package/dist/index.d.ts +43 -10
  239. package/dist/index.js +73 -8805
  240. package/dist/lib/cn.js +12 -0
  241. package/dist/lib/cn.js.map +1 -0
  242. package/dist/lib/focus.js +5 -0
  243. package/dist/lib/focus.js.map +1 -0
  244. package/dist/primitives/dismissable-layer.js +35 -0
  245. package/dist/primitives/dismissable-layer.js.map +1 -0
  246. package/dist/primitives/focus-scope.js +58 -0
  247. package/dist/primitives/focus-scope.js.map +1 -0
  248. package/dist/primitives/merge-refs.js +13 -0
  249. package/dist/primitives/merge-refs.js.map +1 -0
  250. package/dist/primitives/portal.js +19 -0
  251. package/dist/primitives/portal.js.map +1 -0
  252. package/dist/primitives/presence.js +45 -0
  253. package/dist/primitives/presence.js.map +1 -0
  254. package/dist/primitives/slot.js +39 -0
  255. package/dist/primitives/slot.js.map +1 -0
  256. package/dist/primitives/use-controllable-state.js +24 -0
  257. package/dist/primitives/use-controllable-state.js.map +1 -0
  258. package/dist/primitives/use-floating.js +128 -0
  259. package/dist/primitives/use-floating.js.map +1 -0
  260. package/dist/primitives/use-hover-intent.js +50 -0
  261. package/dist/primitives/use-hover-intent.js.map +1 -0
  262. package/dist/primitives/use-roving-focus.js +40 -0
  263. package/dist/primitives/use-roving-focus.js.map +1 -0
  264. package/dist/primitives/walk-elements.js +13 -0
  265. package/dist/primitives/walk-elements.js.map +1 -0
  266. package/package.json +5 -4
  267. package/styles/theme.css +5 -1
  268. package/styles/tokens.css +5 -1
  269. package/dist/index.js.map +0 -1
@@ -0,0 +1,351 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { useControllableState } from "../primitives/use-controllable-state.js";
6
+ import { useFocusScope } from "../primitives/focus-scope.js";
7
+ import { mergeRefs } from "../primitives/merge-refs.js";
8
+ import { Portal } from "../primitives/portal.js";
9
+ import { Slot } from "../primitives/slot.js";
10
+ import {
11
+ DRAWER_BODY,
12
+ DRAWER_CONTENT_BASE,
13
+ DRAWER_DESCRIPTION,
14
+ DRAWER_FOOTER,
15
+ DRAWER_HANDLE,
16
+ DRAWER_HEADER,
17
+ DRAWER_OVERLAY,
18
+ DRAWER_TITLE,
19
+ drawerDirectionClasses
20
+ } from "../generated/drawer.js";
21
+ const CLOSE_THRESHOLD = 0.25;
22
+ const VELOCITY_THRESHOLD = 0.4;
23
+ const DRAG_AFTER_OPEN_MS = 500;
24
+ const EXIT_FALLBACK_MS = 600;
25
+ const DrawerContext = React.createContext(null);
26
+ function useDrawer() {
27
+ const ctx = React.useContext(DrawerContext);
28
+ if (!ctx) throw new Error("Drawer parts must be used within <Drawer>");
29
+ return ctx;
30
+ }
31
+ function Drawer({
32
+ open,
33
+ defaultOpen = false,
34
+ onOpenChange,
35
+ direction = "bottom",
36
+ children
37
+ }) {
38
+ const [isOpen, setOpen] = useControllableState({
39
+ ...open !== void 0 ? { value: open } : {},
40
+ defaultValue: defaultOpen,
41
+ ...onOpenChange ? { onChange: onOpenChange } : {}
42
+ });
43
+ return /* @__PURE__ */ jsx(DrawerContext.Provider, { value: { open: isOpen, setOpen, direction }, children: /* @__PURE__ */ jsx("div", { "data-slot": "drawer", children }) });
44
+ }
45
+ function DrawerTrigger({ asChild = false, onClick, ...props }) {
46
+ const { setOpen } = useDrawer();
47
+ const Comp = asChild ? Slot : "button";
48
+ return /* @__PURE__ */ jsx(
49
+ Comp,
50
+ {
51
+ "data-slot": "drawer-trigger",
52
+ onClick: (e) => {
53
+ onClick?.(e);
54
+ setOpen(true);
55
+ },
56
+ ...props
57
+ }
58
+ );
59
+ }
60
+ function DrawerClose({ asChild = false, onClick, ...props }) {
61
+ const { setOpen } = useDrawer();
62
+ const Comp = asChild ? Slot : "button";
63
+ return /* @__PURE__ */ jsx(
64
+ Comp,
65
+ {
66
+ "data-slot": "drawer-close",
67
+ onClick: (e) => {
68
+ onClick?.(e);
69
+ setOpen(false);
70
+ },
71
+ ...props
72
+ }
73
+ );
74
+ }
75
+ function DrawerOverlay({ className, ...props }) {
76
+ const { open, setOpen } = useDrawer();
77
+ if (!open) return null;
78
+ return /* @__PURE__ */ jsx(
79
+ "div",
80
+ {
81
+ "data-slot": "drawer-overlay",
82
+ "data-state": "open",
83
+ onClick: () => setOpen(false),
84
+ className: cn(DRAWER_OVERLAY, className),
85
+ ...props
86
+ }
87
+ );
88
+ }
89
+ const EDGE_SIGN = {
90
+ bottom: 1,
91
+ top: -1,
92
+ right: 1,
93
+ left: -1
94
+ };
95
+ function isVertical(direction) {
96
+ return direction === "bottom" || direction === "top";
97
+ }
98
+ function translateAlong(direction, px) {
99
+ return isVertical(direction) ? `translate3d(0, ${px}px, 0)` : `translate3d(${px}px, 0, 0)`;
100
+ }
101
+ function dampen(px) {
102
+ return Math.max(8 * (Math.log(px + 1) - 2), 0);
103
+ }
104
+ function shouldDrag(target, panel, direction, towardsEdge) {
105
+ if (!(target instanceof Element)) return false;
106
+ if (target.tagName === "SELECT") return false;
107
+ if (target.closest("[data-vaul-no-drag]")) return false;
108
+ if (!isVertical(direction)) return true;
109
+ if (!towardsEdge) return false;
110
+ const selection = window.getSelection?.()?.toString();
111
+ if (selection && selection.length > 0) return false;
112
+ let el = target;
113
+ while (el && el !== panel) {
114
+ if (el.scrollHeight > el.clientHeight && el.scrollTop > 0) return false;
115
+ el = el.parentElement;
116
+ }
117
+ return true;
118
+ }
119
+ function useDrawerDrag(opts) {
120
+ const { panelRef, scrimRef, direction, open, present, openedAtRef, onClose } = opts;
121
+ const dragRef = React.useRef(null);
122
+ React.useEffect(() => {
123
+ if (!present) return;
124
+ const panel = panelRef.current;
125
+ if (!panel) return;
126
+ const onTouchMove = (e) => {
127
+ if (dragRef.current?.allowed) e.preventDefault();
128
+ };
129
+ panel.addEventListener("touchmove", onTouchMove, { passive: false });
130
+ return () => panel.removeEventListener("touchmove", onTouchMove);
131
+ }, [present, panelRef]);
132
+ const axisPos = (e) => isVertical(direction) ? e.clientY : e.clientX;
133
+ const onPointerDown = (e) => {
134
+ const panel = panelRef.current;
135
+ if (!panel || e.button > 0 || !open || dragRef.current) return;
136
+ const target = e.target;
137
+ if (target.closest('[data-slot="drawer-close"]')) return;
138
+ if (!panel.contains(target)) return;
139
+ const rect = panel.getBoundingClientRect();
140
+ dragRef.current = {
141
+ pointerId: e.pointerId,
142
+ target,
143
+ start: axisPos(e),
144
+ time: Date.now(),
145
+ size: isVertical(direction) ? rect.height : rect.width,
146
+ allowed: null,
147
+ delta: 0
148
+ };
149
+ try {
150
+ target.setPointerCapture?.(e.pointerId);
151
+ } catch {
152
+ }
153
+ };
154
+ const onPointerMove = (e) => {
155
+ const drag = dragRef.current;
156
+ const panel = panelRef.current;
157
+ if (!drag || !panel) return;
158
+ const delta = (axisPos(e) - drag.start) * EDGE_SIGN[direction];
159
+ drag.delta = delta;
160
+ if (!drag.allowed) {
161
+ if (Date.now() - openedAtRef.current < DRAG_AFTER_OPEN_MS) return;
162
+ if (!shouldDrag(drag.target, panel, direction, delta > 0)) return;
163
+ drag.allowed = true;
164
+ panel.setAttribute("data-dragging", "true");
165
+ scrimRef.current?.setAttribute("data-dragging", "true");
166
+ }
167
+ const scrim = scrimRef.current;
168
+ if (delta < 0) {
169
+ panel.style.transform = translateAlong(direction, -dampen(-delta) * EDGE_SIGN[direction]);
170
+ if (scrim) scrim.style.opacity = "1";
171
+ return;
172
+ }
173
+ panel.style.transform = translateAlong(direction, delta * EDGE_SIGN[direction]);
174
+ if (scrim) {
175
+ scrim.style.opacity = `${Math.min(1, Math.max(0, 1 - delta / drag.size))}`;
176
+ }
177
+ };
178
+ const endGesture = (e, cancelled) => {
179
+ const drag = dragRef.current;
180
+ const panel = panelRef.current;
181
+ if (!drag || !panel || e.pointerId !== drag.pointerId) return;
182
+ dragRef.current = null;
183
+ try {
184
+ drag.target.releasePointerCapture?.(drag.pointerId);
185
+ } catch {
186
+ }
187
+ if (!drag.allowed) return;
188
+ panel.removeAttribute("data-dragging");
189
+ panel.style.transform = "";
190
+ const scrim = scrimRef.current;
191
+ if (scrim) {
192
+ scrim.removeAttribute("data-dragging");
193
+ scrim.style.opacity = "";
194
+ }
195
+ if (cancelled || drag.delta <= 0) return;
196
+ const dt = Date.now() - drag.time;
197
+ const velocity = dt > 0 ? drag.delta / dt : 0;
198
+ if (velocity > VELOCITY_THRESHOLD || drag.delta >= drag.size * CLOSE_THRESHOLD) {
199
+ onClose();
200
+ }
201
+ };
202
+ return {
203
+ onPointerDown,
204
+ onPointerMove,
205
+ onPointerUp: (e) => endGesture(e, false),
206
+ onPointerCancel: (e) => endGesture(e, true)
207
+ };
208
+ }
209
+ function DrawerContent({ className, children, ...props }) {
210
+ const { open, setOpen, direction } = useDrawer();
211
+ const [present, setPresent] = React.useState(open);
212
+ if (open && !present) setPresent(true);
213
+ const closing = present && !open;
214
+ const scopeRef = useFocusScope(open);
215
+ const panelRef = React.useRef(null);
216
+ const scrimRef = React.useRef(null);
217
+ const openedAtRef = React.useRef(0);
218
+ React.useEffect(() => {
219
+ if (open) openedAtRef.current = Date.now();
220
+ }, [open]);
221
+ React.useEffect(() => {
222
+ if (!open) return;
223
+ const prev = document.body.style.overflow;
224
+ document.body.style.overflow = "hidden";
225
+ return () => {
226
+ document.body.style.overflow = prev;
227
+ };
228
+ }, [open]);
229
+ React.useEffect(() => {
230
+ if (!closing) return;
231
+ const id = setTimeout(() => setPresent(false), EXIT_FALLBACK_MS);
232
+ return () => clearTimeout(id);
233
+ }, [closing]);
234
+ const drag = useDrawerDrag({
235
+ panelRef,
236
+ scrimRef,
237
+ direction,
238
+ open,
239
+ present,
240
+ openedAtRef,
241
+ onClose: () => setOpen(false)
242
+ });
243
+ if (!present) return null;
244
+ const state = closing ? "closed" : "open";
245
+ return /* @__PURE__ */ jsxs(Portal, { children: [
246
+ /* @__PURE__ */ jsx(
247
+ "div",
248
+ {
249
+ ref: scrimRef,
250
+ "data-slot": "drawer-overlay",
251
+ "data-state": state,
252
+ className: DRAWER_OVERLAY,
253
+ onClick: () => setOpen(false)
254
+ }
255
+ ),
256
+ /* @__PURE__ */ jsxs(
257
+ "div",
258
+ {
259
+ role: "dialog",
260
+ "aria-modal": "true",
261
+ "data-slot": "drawer-content",
262
+ "data-state": state,
263
+ "data-vaul-drawer-direction": direction,
264
+ ref: mergeRefs(scopeRef, panelRef),
265
+ onKeyDown: (e) => {
266
+ if (e.key === "Escape") setOpen(false);
267
+ },
268
+ onTransitionEnd: (e) => {
269
+ if (closing && e.propertyName === "transform" && e.target === e.currentTarget) {
270
+ setPresent(false);
271
+ }
272
+ },
273
+ onPointerDown: drag.onPointerDown,
274
+ onPointerMove: drag.onPointerMove,
275
+ onPointerUp: drag.onPointerUp,
276
+ onPointerCancel: drag.onPointerCancel,
277
+ className: cn(DRAWER_CONTENT_BASE, drawerDirectionClasses[direction], className),
278
+ ...props,
279
+ children: [
280
+ direction === "bottom" ? /* @__PURE__ */ jsx(
281
+ "div",
282
+ {
283
+ "data-slot": "drawer-handle",
284
+ className: DRAWER_HANDLE
285
+ }
286
+ ) : null,
287
+ /* @__PURE__ */ jsx(
288
+ "div",
289
+ {
290
+ "data-slot": "drawer-body",
291
+ className: DRAWER_BODY,
292
+ children
293
+ }
294
+ )
295
+ ]
296
+ }
297
+ )
298
+ ] });
299
+ }
300
+ function DrawerHeader({ className, ...props }) {
301
+ return /* @__PURE__ */ jsx(
302
+ "div",
303
+ {
304
+ "data-slot": "drawer-header",
305
+ className: cn(DRAWER_HEADER, className),
306
+ ...props
307
+ }
308
+ );
309
+ }
310
+ function DrawerFooter({ className, ...props }) {
311
+ return /* @__PURE__ */ jsx(
312
+ "div",
313
+ {
314
+ "data-slot": "drawer-footer",
315
+ className: cn(DRAWER_FOOTER, className),
316
+ ...props
317
+ }
318
+ );
319
+ }
320
+ function DrawerTitle({ className, ...props }) {
321
+ return /* @__PURE__ */ jsx(
322
+ "div",
323
+ {
324
+ "data-slot": "drawer-title",
325
+ className: cn(DRAWER_TITLE, className),
326
+ ...props
327
+ }
328
+ );
329
+ }
330
+ function DrawerDescription({ className, ...props }) {
331
+ return /* @__PURE__ */ jsx(
332
+ "div",
333
+ {
334
+ "data-slot": "drawer-description",
335
+ className: cn(DRAWER_DESCRIPTION, className),
336
+ ...props
337
+ }
338
+ );
339
+ }
340
+ export {
341
+ Drawer,
342
+ DrawerClose,
343
+ DrawerContent,
344
+ DrawerDescription,
345
+ DrawerFooter,
346
+ DrawerHeader,
347
+ DrawerOverlay,
348
+ DrawerTitle,
349
+ DrawerTrigger
350
+ };
351
+ //# sourceMappingURL=drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/drawer.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport { useFocusScope } from \"../primitives/focus-scope\";\nimport { mergeRefs } from \"../primitives/merge-refs\";\nimport { Portal } from \"../primitives/portal\";\nimport { Slot } from \"../primitives/slot\";\nimport {\n DRAWER_BODY,\n DRAWER_CONTENT_BASE,\n DRAWER_DESCRIPTION,\n DRAWER_FOOTER,\n DRAWER_HANDLE,\n DRAWER_HEADER,\n DRAWER_OVERLAY,\n DRAWER_TITLE,\n drawerDirectionClasses,\n type DrawerDirection,\n} from \"../generated/drawer\";\n\nexport type { DrawerDirection };\n\n// Drag-to-dismiss tuning (pointer physics, TS-only — Rust stays render-only).\n// Values from Vaul: a release past 25% of the panel's size along the drag\n// axis, or a flick faster than 0.4px/ms, closes; anything short snaps back.\n// Drags are refused for the first 500ms after opening so the enter finishes.\nconst CLOSE_THRESHOLD = 0.25;\nconst VELOCITY_THRESHOLD = 0.4;\nconst DRAG_AFTER_OPEN_MS = 500;\n// The closing node is dropped on its exit `transitionend`; this is the safety\n// net for when that never fires (display:none ancestor, tab hidden, a full\n// drag that left the panel exactly at its off-screen transform). Just past\n// the 500ms transition in motion.css.\nconst EXIT_FALLBACK_MS = 600;\n\ninterface DrawerContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n direction: DrawerDirection;\n}\n\nconst DrawerContext = React.createContext<DrawerContextValue | null>(null);\n\nfunction useDrawer(): DrawerContextValue {\n const ctx = React.useContext(DrawerContext);\n if (!ctx) throw new Error(\"Drawer parts must be used within <Drawer>\");\n return ctx;\n}\n\nexport interface DrawerProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n direction?: DrawerDirection;\n children?: React.ReactNode;\n}\n\nexport function Drawer({\n open,\n defaultOpen = false,\n onOpenChange,\n direction = \"bottom\",\n children,\n}: DrawerProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n return (\n <DrawerContext.Provider value={{ open: isOpen, setOpen, direction }}>\n <div data-slot=\"drawer\">{children}</div>\n </DrawerContext.Provider>\n );\n}\n\nexport interface DrawerTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function DrawerTrigger({ asChild = false, onClick, ...props }: DrawerTriggerProps) {\n const { setOpen } = useDrawer();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"drawer-trigger\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(true);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface DrawerCloseProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function DrawerClose({ asChild = false, onClick, ...props }: DrawerCloseProps) {\n const { setOpen } = useDrawer();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"drawer-close\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\n/**\n * Standalone scrim, redundant with the one {@link DrawerContent} renders (as in\n * shadcn). Mounted only while open; the animated exit lives on the content's\n * own scrim.\n */\nexport function DrawerOverlay({ className, ...props }: React.ComponentProps<\"div\">) {\n const { open, setOpen } = useDrawer();\n if (!open) return null;\n return (\n <div\n data-slot=\"drawer-overlay\"\n data-state=\"open\"\n onClick={() => setOpen(false)}\n className={cn(DRAWER_OVERLAY, className)}\n {...props}\n />\n );\n}\n\n// Positive delta = the finger moved towards the docked edge (bottom: down,\n// top: up, right: right, left: left), i.e. the closing direction.\nconst EDGE_SIGN: Record<DrawerDirection, 1 | -1> = {\n bottom: 1,\n top: -1,\n right: 1,\n left: -1,\n};\n\nfunction isVertical(direction: DrawerDirection): boolean {\n return direction === \"bottom\" || direction === \"top\";\n}\n\nfunction translateAlong(direction: DrawerDirection, px: number): string {\n return isVertical(direction) ? `translate3d(0, ${px}px, 0)` : `translate3d(${px}px, 0, 0)`;\n}\n\n// Vaul's over-drag curve: the panel barely moves past its docked edge. Only\n// starts displacing once the finger has gone ~6px (log(v + 1) > 2); before\n// that the curve is negative, which reads as \"stay home\".\nfunction dampen(px: number): number {\n return Math.max(8 * (Math.log(px + 1) - 2), 0);\n}\n\n// Vaul's `shouldDrag`, minus snap points. `towardsEdge` false = the user is\n// pulling the panel further open, which on a vertical sheet is the scroll\n// gesture — hand it to the scroller. The scroll walk is vertical-only: a\n// horizontal sheet never competes with its body's vertical scroll.\nfunction shouldDrag(\n target: EventTarget | null,\n panel: HTMLElement,\n direction: DrawerDirection,\n towardsEdge: boolean,\n): boolean {\n if (!(target instanceof Element)) return false;\n if (target.tagName === \"SELECT\") return false; // https://github.com/emilkowalski/vaul/issues/483\n if (target.closest(\"[data-vaul-no-drag]\")) return false;\n if (!isVertical(direction)) return true;\n if (!towardsEdge) return false;\n const selection = window.getSelection?.()?.toString();\n if (selection && selection.length > 0) return false;\n // any scroller between the finger and the panel that isn't at its top owns\n // the gesture; the user can scroll up and the next move re-asks\n let el: Element | null = target;\n while (el && el !== panel) {\n if (el.scrollHeight > el.clientHeight && el.scrollTop > 0) return false;\n el = el.parentElement;\n }\n return true;\n}\n\ninterface DragGesture {\n pointerId: number;\n // the element under the finger at pointerdown — once the panel captures the\n // pointer, every later event's `target` is the panel itself, and the scroll\n // walk in `shouldDrag` would never see the scroller it started in\n target: EventTarget | null;\n start: number; // clientX/Y along the axis\n time: number;\n size: number; // panel extent along the axis, for the close threshold + scrim fade\n allowed: boolean | null; // null = undecided; true sticks for the gesture (Vaul's isAllowedToDrag)\n delta: number;\n}\n\n// ── drag-to-dismiss (Vaul pointer physics) ────────────────────────────────\n// No React state on the hot path: the gesture lives in a ref and every move is\n// one inline `transform` write on the panel plus one `opacity` write on the\n// scrim. Not a CSS var: a custom-property change re-resolves inherited values\n// across the whole subtree, per move.\nfunction useDrawerDrag(opts: {\n panelRef: React.RefObject<HTMLDivElement | null>;\n scrimRef: React.RefObject<HTMLDivElement | null>;\n direction: DrawerDirection;\n open: boolean;\n present: boolean;\n openedAtRef: React.RefObject<number>;\n onClose: () => void;\n}) {\n const { panelRef, scrimRef, direction, open, present, openedAtRef, onClose } = opts;\n const dragRef = React.useRef<DragGesture | null>(null);\n\n // Native scroll suppression. Once a gesture is allowed, the browser must not\n // turn the same touch into a scroll/overscroll of a body sitting at its top —\n // that would pointercancel us mid-drag. Pointer events precede the compat\n // touch events, so `allowed` is already decided when this runs. React's\n // onTouchMove is passive, hence the manual listener.\n React.useEffect(() => {\n if (!present) return;\n const panel = panelRef.current;\n if (!panel) return;\n const onTouchMove = (e: TouchEvent) => {\n if (dragRef.current?.allowed) e.preventDefault();\n };\n panel.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n return () => panel.removeEventListener(\"touchmove\", onTouchMove);\n }, [present, panelRef]);\n\n const axisPos = (e: React.PointerEvent) => (isVertical(direction) ? e.clientY : e.clientX);\n\n const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n const panel = panelRef.current;\n // one gesture at a time: a second finger must not reset the first one's\n // state and leave the panel stranded mid-drag\n if (!panel || e.button > 0 || !open || dragRef.current) return;\n const target = e.target as HTMLElement;\n if (target.closest('[data-slot=\"drawer-close\"]')) return;\n // React bubbles portal events (a Select's listbox, a Popover) through the\n // tree; a drag can only start from the panel's own DOM\n if (!panel.contains(target)) return;\n const rect = panel.getBoundingClientRect();\n dragRef.current = {\n pointerId: e.pointerId,\n target,\n start: axisPos(e),\n time: Date.now(),\n size: isVertical(direction) ? rect.height : rect.width,\n allowed: null,\n delta: 0,\n };\n // Capture on the element under the finger, not the panel (Vaul does the\n // same): a click's target is the common ancestor of pointerdown and\n // pointerup, so capturing on the panel would steal every click from the\n // buttons and links inside. No preventDefault either — inputs inside the\n // sheet must still focus on tap.\n try {\n target.setPointerCapture?.(e.pointerId);\n } catch {\n // jsdom / unsupported — capture is a nice-to-have, the drag works without it\n }\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n const panel = panelRef.current;\n if (!drag || !panel) return;\n const delta = (axisPos(e) - drag.start) * EDGE_SIGN[direction];\n drag.delta = delta;\n if (!drag.allowed) {\n if (Date.now() - openedAtRef.current < DRAG_AFTER_OPEN_MS) return;\n // refused on this move only — the user may scroll the body to its top\n // and carry on, so the gesture stays alive\n if (!shouldDrag(drag.target, panel, direction, delta > 0)) return;\n drag.allowed = true;\n panel.setAttribute(\"data-dragging\", \"true\"); // CSS drops the transitions for 1:1 tracking\n scrimRef.current?.setAttribute(\"data-dragging\", \"true\");\n }\n const scrim = scrimRef.current;\n if (delta < 0) {\n panel.style.transform = translateAlong(direction, -dampen(-delta) * EDGE_SIGN[direction]);\n if (scrim) scrim.style.opacity = \"1\";\n return;\n }\n panel.style.transform = translateAlong(direction, delta * EDGE_SIGN[direction]);\n if (scrim) {\n scrim.style.opacity = `${Math.min(1, Math.max(0, 1 - delta / drag.size))}`;\n }\n };\n\n // Release hands styling back to the CSS: with the inline transform gone and\n // data-dragging cleared in the same frame, the restored transition carries\n // the panel from wherever the finger left it — home on a snap-back, or (with\n // data-state=closed committed by `onClose` in the same frame) straight off.\n const endGesture = (e: React.PointerEvent<HTMLDivElement>, cancelled: boolean) => {\n const drag = dragRef.current;\n const panel = panelRef.current;\n if (!drag || !panel || e.pointerId !== drag.pointerId) return;\n dragRef.current = null;\n try {\n (drag.target as HTMLElement).releasePointerCapture?.(drag.pointerId);\n } catch {\n // jsdom / unsupported\n }\n if (!drag.allowed) return;\n panel.removeAttribute(\"data-dragging\");\n panel.style.transform = \"\";\n const scrim = scrimRef.current;\n if (scrim) {\n scrim.removeAttribute(\"data-dragging\");\n scrim.style.opacity = \"\";\n }\n if (cancelled || drag.delta <= 0) return;\n const dt = Date.now() - drag.time;\n const velocity = dt > 0 ? drag.delta / dt : 0;\n if (velocity > VELOCITY_THRESHOLD || drag.delta >= drag.size * CLOSE_THRESHOLD) {\n onClose();\n }\n };\n\n return {\n onPointerDown,\n onPointerMove,\n onPointerUp: (e: React.PointerEvent<HTMLDivElement>) => endGesture(e, false),\n onPointerCancel: (e: React.PointerEvent<HTMLDivElement>) => endGesture(e, true),\n };\n}\n\n/**\n * The panel plus its scrim. Presence outlives `open`: once it turns false the\n * panel flips to `data-state=\"closed\"` and is unmounted when its exit\n * `transform` transition ends (or the fallback timer fires). Re-opening\n * mid-exit just flips the state back and the same transition carries the\n * panel home. Drag-to-dismiss is TS-only pointer physics; opt a region out\n * with `data-vaul-no-drag`.\n */\nexport function DrawerContent({ className, children, ...props }: React.ComponentProps<\"div\">) {\n const { open, setOpen, direction } = useDrawer();\n // Derived during render so the panel is in the same commit that opened it —\n // the enter keyframe plays on insertion, no mount flip needed.\n const [present, setPresent] = React.useState(open);\n if (open && !present) setPresent(true);\n const closing = present && !open;\n\n const scopeRef = useFocusScope(open);\n const panelRef = React.useRef<HTMLDivElement | null>(null);\n const scrimRef = React.useRef<HTMLDivElement | null>(null);\n const openedAtRef = React.useRef(0);\n\n React.useEffect(() => {\n if (open) openedAtRef.current = Date.now();\n }, [open]);\n\n React.useEffect(() => {\n if (!open) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open]);\n\n // Safety net for a missed exit transitionend; the cleanup is what cancels it\n // on re-open.\n React.useEffect(() => {\n if (!closing) return;\n const id = setTimeout(() => setPresent(false), EXIT_FALLBACK_MS);\n return () => clearTimeout(id);\n }, [closing]);\n\n const drag = useDrawerDrag({\n panelRef,\n scrimRef,\n direction,\n open,\n present,\n openedAtRef,\n onClose: () => setOpen(false),\n });\n\n if (!present) return null;\n const state = closing ? \"closed\" : \"open\";\n return (\n <Portal>\n <div\n ref={scrimRef}\n data-slot=\"drawer-overlay\"\n data-state={state}\n className={DRAWER_OVERLAY}\n onClick={() => setOpen(false)}\n />\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n data-slot=\"drawer-content\"\n data-state={state}\n data-vaul-drawer-direction={direction}\n ref={mergeRefs(scopeRef, panelRef)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setOpen(false);\n }}\n // transitionend bubbles from children (a hover on a button inside),\n // so pin it to the panel's own exit transform\n onTransitionEnd={(e) => {\n if (closing && e.propertyName === \"transform\" && e.target === e.currentTarget) {\n setPresent(false);\n }\n }}\n onPointerDown={drag.onPointerDown}\n onPointerMove={drag.onPointerMove}\n onPointerUp={drag.onPointerUp}\n onPointerCancel={drag.onPointerCancel}\n className={cn(DRAWER_CONTENT_BASE, drawerDirectionClasses[direction], className)}\n {...(props as Record<string, unknown>)}\n >\n {direction === \"bottom\" ? (\n <div\n data-slot=\"drawer-handle\"\n className={DRAWER_HANDLE}\n />\n ) : null}\n <div\n data-slot=\"drawer-body\"\n className={DRAWER_BODY}\n >\n {children}\n </div>\n </div>\n </Portal>\n );\n}\n\nexport function DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(DRAWER_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport function DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(DRAWER_FOOTER, className)}\n {...props}\n />\n );\n}\n\nexport function DrawerTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-title\"\n className={cn(DRAWER_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function DrawerDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-description\"\n className={cn(DRAWER_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n"],"mappings":"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","names":[]}