@g4rcez/components 4.0.2 → 4.1.2

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 (337) hide show
  1. package/ai/SKILL.md +120 -153
  2. package/ai/docs/Alert.md +47 -48
  3. package/ai/docs/AnimatedList.md +88 -87
  4. package/ai/docs/Autocomplete.md +102 -106
  5. package/ai/docs/Button.md +33 -33
  6. package/ai/docs/Calendar.md +67 -101
  7. package/ai/docs/Card.md +59 -55
  8. package/ai/docs/Checkbox.md +77 -82
  9. package/ai/docs/CommandPalette.md +154 -172
  10. package/ai/docs/DatePicker.md +45 -64
  11. package/ai/docs/Dropdown.md +98 -126
  12. package/ai/docs/Empty.md +41 -44
  13. package/ai/docs/Expand.md +40 -54
  14. package/ai/docs/FileUpload.md +102 -109
  15. package/ai/docs/Form.md +35 -29
  16. package/ai/docs/FormReset.md +37 -37
  17. package/ai/docs/Heading.md +4 -6
  18. package/ai/docs/Input.md +73 -98
  19. package/ai/docs/InputField.md +67 -67
  20. package/ai/docs/List.md +88 -85
  21. package/ai/docs/Menu.md +62 -60
  22. package/ai/docs/Modal.md +129 -136
  23. package/ai/docs/MultiSelect.md +65 -84
  24. package/ai/docs/Notifications.md +96 -96
  25. package/ai/docs/PageCalendar.md +88 -97
  26. package/ai/docs/Polymorph.md +25 -41
  27. package/ai/docs/Progress.md +55 -51
  28. package/ai/docs/Radiobox.md +49 -41
  29. package/ai/docs/RenderOnView.md +26 -32
  30. package/ai/docs/Resizable.md +60 -65
  31. package/ai/docs/Select.md +158 -158
  32. package/ai/docs/Shortcut.md +14 -14
  33. package/ai/docs/Skeleton.md +56 -60
  34. package/ai/docs/Slider.md +26 -49
  35. package/ai/docs/Slot.md +15 -17
  36. package/ai/docs/Spinner.md +17 -15
  37. package/ai/docs/Stats.md +44 -42
  38. package/ai/docs/Step.md +60 -60
  39. package/ai/docs/Switch.md +44 -54
  40. package/ai/docs/Table.md +124 -136
  41. package/ai/docs/Tabs.md +90 -90
  42. package/ai/docs/Tag.md +63 -65
  43. package/ai/docs/TaskList.md +40 -50
  44. package/ai/docs/Textarea.md +47 -70
  45. package/ai/docs/Timeline.md +98 -96
  46. package/ai/docs/Toolbar.md +46 -46
  47. package/ai/docs/Tooltip.md +103 -103
  48. package/ai/docs/Typography.md +55 -55
  49. package/ai/docs/Wizard.md +104 -109
  50. package/ai/docs/index.md +116 -116
  51. package/dist/autocomplete-DcTNOwyg.js +393 -0
  52. package/dist/autocomplete-DcTNOwyg.js.map +1 -0
  53. package/dist/{calendar-B5lSd0ID.js → calendar-BJMHRoy2.js} +104 -105
  54. package/dist/calendar-BJMHRoy2.js.map +1 -0
  55. package/dist/components/core/button.d.ts.map +1 -1
  56. package/dist/components/core/button.js +10 -10
  57. package/dist/components/core/button.js.map +1 -1
  58. package/dist/components/core/button.jsx +79 -0
  59. package/dist/components/core/heading.jsx +4 -0
  60. package/dist/components/core/polymorph.d.ts +1 -1
  61. package/dist/components/core/polymorph.d.ts.map +1 -1
  62. package/dist/components/core/polymorph.jsx +5 -0
  63. package/dist/components/core/render-on-view.jsx +31 -0
  64. package/dist/components/core/resizable.jsx +51 -0
  65. package/dist/components/core/slot.d.ts.map +1 -1
  66. package/dist/components/core/slot.jsx +156 -0
  67. package/dist/components/core/tag.d.ts +1 -1
  68. package/dist/components/core/tag.d.ts.map +1 -1
  69. package/dist/components/core/tag.js +4 -4
  70. package/dist/components/core/tag.js.map +1 -1
  71. package/dist/components/core/tag.jsx +51 -0
  72. package/dist/components/core/typography.jsx +18 -0
  73. package/dist/components/display/alert.d.ts +1 -1
  74. package/dist/components/display/alert.d.ts.map +1 -1
  75. package/dist/components/display/alert.js +48 -46
  76. package/dist/components/display/alert.js.map +1 -1
  77. package/dist/components/display/alert.jsx +61 -0
  78. package/dist/components/display/calendar.js +6 -6
  79. package/dist/components/display/calendar.jsx +299 -0
  80. package/dist/components/display/card.js +2 -2
  81. package/dist/components/display/card.js.map +1 -1
  82. package/dist/components/display/card.jsx +43 -0
  83. package/dist/components/display/empty.jsx +11 -0
  84. package/dist/components/display/list.js +1 -1
  85. package/dist/components/display/list.js.map +1 -1
  86. package/dist/components/display/list.jsx +81 -0
  87. package/dist/components/display/notifications.d.ts +1 -1
  88. package/dist/components/display/notifications.d.ts.map +1 -1
  89. package/dist/components/display/notifications.js +3 -3
  90. package/dist/components/display/notifications.jsx +126 -0
  91. package/dist/components/display/progress.jsx +11 -0
  92. package/dist/components/display/shortcut.jsx +23 -0
  93. package/dist/components/display/skeleton.d.ts.map +1 -1
  94. package/dist/components/display/skeleton.jsx +19 -0
  95. package/dist/components/display/spinner.d.ts.map +1 -1
  96. package/dist/components/display/spinner.jsx +11 -0
  97. package/dist/components/display/stats.js +1 -1
  98. package/dist/components/display/stats.jsx +20 -0
  99. package/dist/components/display/step.jsx +131 -0
  100. package/dist/components/display/tabs.d.ts +1 -1
  101. package/dist/components/display/tabs.d.ts.map +1 -1
  102. package/dist/components/display/tabs.js +2 -2
  103. package/dist/components/display/tabs.jsx +125 -0
  104. package/dist/components/display/timeline.js +1 -1
  105. package/dist/components/display/timeline.jsx +25 -0
  106. package/dist/components/floating/command-palette.d.ts.map +1 -1
  107. package/dist/components/floating/command-palette.jsx +197 -0
  108. package/dist/components/floating/dropdown.d.ts.map +1 -1
  109. package/dist/components/floating/dropdown.js +25 -17
  110. package/dist/components/floating/dropdown.js.map +1 -1
  111. package/dist/components/floating/dropdown.jsx +56 -0
  112. package/dist/components/floating/expand.js +7 -7
  113. package/dist/components/floating/expand.js.map +1 -1
  114. package/dist/components/floating/expand.jsx +44 -0
  115. package/dist/components/floating/menu.js +10 -10
  116. package/dist/components/floating/menu.js.map +1 -1
  117. package/dist/components/floating/menu.jsx +147 -0
  118. package/dist/components/floating/modal.d.ts +4 -4
  119. package/dist/components/floating/modal.d.ts.map +1 -1
  120. package/dist/components/floating/modal.js +106 -102
  121. package/dist/components/floating/modal.js.map +1 -1
  122. package/dist/components/floating/modal.jsx +301 -0
  123. package/dist/components/floating/toolbar.jsx +5 -0
  124. package/dist/components/floating/tooltip.d.ts.map +1 -1
  125. package/dist/components/floating/tooltip.js +14 -14
  126. package/dist/components/floating/tooltip.js.map +1 -1
  127. package/dist/components/floating/tooltip.jsx +58 -0
  128. package/dist/components/floating/wizard.jsx +161 -0
  129. package/dist/components/form/autocomplete.d.ts.map +1 -1
  130. package/dist/components/form/autocomplete.js +6 -6
  131. package/dist/components/form/autocomplete.jsx +278 -0
  132. package/dist/components/form/checkbox.js +1 -1
  133. package/dist/components/form/checkbox.jsx +12 -0
  134. package/dist/components/form/date-picker.d.ts.map +1 -1
  135. package/dist/components/form/date-picker.js +5 -5
  136. package/dist/components/form/date-picker.jsx +115 -0
  137. package/dist/components/form/file-upload.d.ts.map +1 -1
  138. package/dist/components/form/file-upload.js +2 -2
  139. package/dist/components/form/file-upload.jsx +134 -0
  140. package/dist/components/form/form.js.map +1 -1
  141. package/dist/components/form/form.jsx +10 -0
  142. package/dist/components/form/formReset.jsx +17 -0
  143. package/dist/components/form/free-text.d.ts.map +1 -1
  144. package/dist/components/form/free-text.jsx +41 -0
  145. package/dist/components/form/input-field.d.ts +11 -11
  146. package/dist/components/form/input-field.d.ts.map +1 -1
  147. package/dist/components/form/input-field.jsx +58 -0
  148. package/dist/components/form/input.js +1 -1
  149. package/dist/components/form/input.jsx +36 -0
  150. package/dist/components/form/multi-select.d.ts.map +1 -1
  151. package/dist/components/form/multi-select.jsx +336 -0
  152. package/dist/components/form/radiobox.js +1 -1
  153. package/dist/components/form/radiobox.jsx +6 -0
  154. package/dist/components/form/select.js +3 -3
  155. package/dist/components/form/select.jsx +42 -0
  156. package/dist/components/form/slider.jsx +45 -0
  157. package/dist/components/form/switch.js +2 -2
  158. package/dist/components/form/switch.js.map +1 -1
  159. package/dist/components/form/switch.jsx +46 -0
  160. package/dist/components/form/task-list.jsx +26 -0
  161. package/dist/components/form/textarea.jsx +12 -0
  162. package/dist/components/index.d.ts +0 -1
  163. package/dist/components/index.d.ts.map +1 -1
  164. package/dist/components/index.js +44 -0
  165. package/dist/components/page-calendar/calendar-header.jsx +83 -0
  166. package/dist/components/page-calendar/day-view.jsx +94 -0
  167. package/dist/components/page-calendar/event-pill.d.ts.map +1 -1
  168. package/dist/components/page-calendar/event-pill.jsx +25 -0
  169. package/dist/components/page-calendar/index.js +2 -0
  170. package/dist/components/page-calendar/month-view.jsx +46 -0
  171. package/dist/components/page-calendar/page-calendar.jsx +41 -0
  172. package/dist/components/page-calendar/page-calendar.types.js +1 -0
  173. package/dist/components/page-calendar/page-calendar.utils.js +93 -0
  174. package/dist/components/page-calendar/week-view.jsx +71 -0
  175. package/dist/components/table/filter.jsx +141 -0
  176. package/dist/components/table/group.jsx +68 -0
  177. package/dist/components/table/index.d.ts +2 -3
  178. package/dist/components/table/index.d.ts.map +1 -1
  179. package/dist/components/table/index.jsx +60 -0
  180. package/dist/components/table/inner-table.d.ts +2 -3
  181. package/dist/components/table/inner-table.d.ts.map +1 -1
  182. package/dist/components/table/inner-table.jsx +102 -0
  183. package/dist/components/table/metadata.jsx +36 -0
  184. package/dist/components/table/pagination.d.ts +3 -1
  185. package/dist/components/table/pagination.d.ts.map +1 -1
  186. package/dist/components/table/pagination.jsx +74 -0
  187. package/dist/components/table/row.d.ts +4 -5
  188. package/dist/components/table/row.d.ts.map +1 -1
  189. package/dist/components/table/row.jsx +49 -0
  190. package/dist/components/table/sort.d.ts.map +1 -1
  191. package/dist/components/table/sort.jsx +109 -0
  192. package/dist/components/table/table-lib.d.ts +1 -1
  193. package/dist/components/table/table-lib.d.ts.map +1 -1
  194. package/dist/components/table/table-lib.js +83 -0
  195. package/dist/components/table/table.context.jsx +4 -0
  196. package/dist/components/table/table.js +3 -3
  197. package/dist/components/table/thead.jsx +103 -0
  198. package/dist/config/context.js +12 -0
  199. package/dist/config/default-translations.d.ts +4 -0
  200. package/dist/config/default-translations.d.ts.map +1 -1
  201. package/dist/config/default-translations.jsx +87 -0
  202. package/dist/config/default-tweaks.js +4 -0
  203. package/dist/constants.js +2 -0
  204. package/dist/{date-picker-DwNo22lx.js → date-picker-Bnl07nd8.js} +8 -6
  205. package/dist/date-picker-Bnl07nd8.js.map +1 -0
  206. package/dist/{dom-Dl8XH0CK.js → dom-CyQHY7ID.js} +66 -61
  207. package/dist/dom-CyQHY7ID.js.map +1 -0
  208. package/dist/{file-upload-Brf2NkLr.js → file-upload-93d5DR4q.js} +139 -129
  209. package/dist/file-upload-93d5DR4q.js.map +1 -0
  210. package/dist/{floating-ui.react-QNHG9W4N.js → floating-ui.react-M2PGXLDp.js} +8 -8
  211. package/dist/floating-ui.react-M2PGXLDp.js.map +1 -0
  212. package/dist/{fns-D2eyJKd5.js → fns-C7Dt27Qd.js} +2 -2
  213. package/dist/fns-C7Dt27Qd.js.map +1 -0
  214. package/dist/hooks/use-click-outside.js +17 -0
  215. package/dist/hooks/use-color-parser.js +9 -0
  216. package/dist/hooks/use-components-provider.jsx +22 -0
  217. package/dist/hooks/use-debounce.d.ts +3 -3
  218. package/dist/hooks/use-debounce.d.ts.map +1 -1
  219. package/dist/hooks/use-debounce.js +12 -0
  220. package/dist/hooks/use-floating-ref.js +6 -0
  221. package/dist/hooks/use-form.d.ts +14 -13
  222. package/dist/hooks/use-form.d.ts.map +1 -1
  223. package/dist/hooks/use-form.js +563 -0
  224. package/dist/hooks/use-hover.js +18 -0
  225. package/dist/hooks/use-input-id.js +5 -0
  226. package/dist/hooks/use-is-coarse-device.js +12 -0
  227. package/dist/hooks/use-locale.js +10 -0
  228. package/dist/hooks/use-media-query.js +25 -0
  229. package/dist/hooks/use-on-event.js +7 -0
  230. package/dist/hooks/use-parent.js +21 -0
  231. package/dist/hooks/use-preferences.js +23 -0
  232. package/dist/hooks/use-previous.js +9 -0
  233. package/dist/hooks/use-reactive.js +9 -0
  234. package/dist/hooks/use-remove-scroll.d.ts.map +1 -1
  235. package/dist/hooks/use-remove-scroll.js +48 -0
  236. package/dist/hooks/use-resize-observer.js +17 -0
  237. package/dist/hooks/use-stable-ref.js +9 -0
  238. package/dist/hooks/use-swipe.js +17 -0
  239. package/dist/hooks/use-translations.d.ts +4 -0
  240. package/dist/hooks/use-translations.d.ts.map +1 -1
  241. package/dist/hooks/use-translations.js +9 -0
  242. package/dist/hooks/use-tweaks.js +9 -0
  243. package/dist/hooks/use-window-size.js +14 -0
  244. package/dist/index-BJ1ayTam.js +126 -0
  245. package/dist/index-BJ1ayTam.js.map +1 -0
  246. package/dist/index-C-PuFUZi.js.map +1 -1
  247. package/dist/{index-BelDtX5M.js → index-DDeQW0JW.js} +399 -404
  248. package/dist/index-DDeQW0JW.js.map +1 -0
  249. package/dist/index-DE4shK8D.js +215 -0
  250. package/dist/index-DE4shK8D.js.map +1 -0
  251. package/dist/{index-DJSMaZR4.js → index-DlJ_2RBL.js} +2 -2
  252. package/dist/index-DlJ_2RBL.js.map +1 -0
  253. package/dist/index.css +1 -1
  254. package/dist/index.esm-BaIwleSE.js.map +1 -1
  255. package/dist/index.js +20 -8177
  256. package/dist/index.js.map +1 -1
  257. package/dist/{input-CrGrSnUt.js → input-_MVxmIpu.js} +116 -114
  258. package/dist/input-_MVxmIpu.js.map +1 -0
  259. package/dist/{input-field-5vYcz5tT.js → input-field-CDCOODOl.js} +63 -47
  260. package/dist/input-field-CDCOODOl.js.map +1 -0
  261. package/dist/lib/combi-keys.js +60 -0
  262. package/dist/lib/dict.d.ts +1 -4
  263. package/dist/lib/dict.d.ts.map +1 -1
  264. package/dist/lib/dict.js +28 -0
  265. package/dist/lib/dom.d.ts +3 -2
  266. package/dist/lib/dom.d.ts.map +1 -1
  267. package/dist/lib/dom.js +66 -0
  268. package/dist/lib/fns.js +46 -0
  269. package/dist/lib/fzf.d.ts.map +1 -1
  270. package/dist/lib/fzf.js +115 -0
  271. package/dist/lib/keyboard-area.js +14 -0
  272. package/dist/notifications-Dp0ydKJS.js +2576 -0
  273. package/dist/notifications-Dp0ydKJS.js.map +1 -0
  274. package/dist/polymorph-B5n9fs_K.js.map +1 -1
  275. package/dist/preset/plugin.tailwind.d.ts.map +1 -1
  276. package/dist/preset/plugin.tailwind.js +20 -18
  277. package/dist/preset/preset.tailwind.js +24 -25
  278. package/dist/preset/src/styles/common.js +6 -3
  279. package/dist/preset/src/styles/dark.d.ts.map +1 -1
  280. package/dist/preset/src/styles/dark.js +9 -5
  281. package/dist/preset/src/styles/design-tokens.js +68 -89
  282. package/dist/preset/src/styles/light.d.ts.map +1 -1
  283. package/dist/preset/src/styles/light.js +9 -5
  284. package/dist/preset/src/styles/theme.js +7 -4
  285. package/dist/preset/src/styles/theme.types.d.ts +2 -1
  286. package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
  287. package/dist/preset/src/styles/theme.types.js +2 -1
  288. package/dist/skeleton-BjJobYYf.js +24 -0
  289. package/dist/skeleton-BjJobYYf.js.map +1 -0
  290. package/dist/slot-CRyweuj0.js.map +1 -1
  291. package/dist/styles/common.js +6 -3
  292. package/dist/styles/dark.d.ts.map +1 -1
  293. package/dist/styles/dark.js +9 -5
  294. package/dist/styles/design-tokens.js +68 -89
  295. package/dist/styles/light.d.ts.map +1 -1
  296. package/dist/styles/light.js +9 -5
  297. package/dist/styles/theme.js +7 -4
  298. package/dist/styles/theme.types.d.ts +2 -1
  299. package/dist/styles/theme.types.d.ts.map +1 -1
  300. package/dist/styles/theme.types.js +2 -1
  301. package/dist/tabs-B0g7YtQv.js +123 -0
  302. package/dist/tabs-B0g7YtQv.js.map +1 -0
  303. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  304. package/dist/types.d.ts +2 -2
  305. package/dist/types.d.ts.map +1 -1
  306. package/dist/types.js +1 -0
  307. package/dist/{context-BFXNJVn2.js → use-translations-DSltA7H_.js} +38 -30
  308. package/dist/use-translations-DSltA7H_.js.map +1 -0
  309. package/package.json +99 -86
  310. package/ai/docs/TransferList.md +0 -142
  311. package/dist/autocomplete-Cn9Z2hLq.js +0 -375
  312. package/dist/autocomplete-Cn9Z2hLq.js.map +0 -1
  313. package/dist/calendar-B5lSd0ID.js.map +0 -1
  314. package/dist/components/form/transfer-list.d.ts +0 -14
  315. package/dist/components/form/transfer-list.d.ts.map +0 -1
  316. package/dist/components/form/transfer-list.js +0 -55
  317. package/dist/components/form/transfer-list.js.map +0 -1
  318. package/dist/context-BFXNJVn2.js.map +0 -1
  319. package/dist/date-picker-DwNo22lx.js.map +0 -1
  320. package/dist/dom-Dl8XH0CK.js.map +0 -1
  321. package/dist/file-upload-Brf2NkLr.js.map +0 -1
  322. package/dist/floating-ui.react-QNHG9W4N.js.map +0 -1
  323. package/dist/fns-D2eyJKd5.js.map +0 -1
  324. package/dist/index-BelDtX5M.js.map +0 -1
  325. package/dist/index-DJSMaZR4.js.map +0 -1
  326. package/dist/index-Z-fZHxfJ.js +0 -335
  327. package/dist/index-Z-fZHxfJ.js.map +0 -1
  328. package/dist/input-CrGrSnUt.js.map +0 -1
  329. package/dist/input-field-5vYcz5tT.js.map +0 -1
  330. package/dist/notifications-cUdVPs-B.js +0 -2786
  331. package/dist/notifications-cUdVPs-B.js.map +0 -1
  332. package/dist/skeleton-D75GFBV6.js +0 -10
  333. package/dist/skeleton-D75GFBV6.js.map +0 -1
  334. package/dist/tabs-S00a8qq8.js +0 -106
  335. package/dist/tabs-S00a8qq8.js.map +0 -1
  336. package/dist/use-translations-BwLKTrZv.js +0 -10
  337. package/dist/use-translations-BwLKTrZv.js.map +0 -1
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { FloatingFocusManager, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole } from "@floating-ui/react";
3
+ import { AnimatePresence, motion } from "motion/react";
4
+ import { useEffect, useId, useRef, useState } from "react";
5
+ import { Button } from "../core/button";
6
+ export const Expand = (props) => {
7
+ const root = useRef(null);
8
+ const id = useId();
9
+ const wrapperId = `${id}:wrapper`;
10
+ const titleId = `${id}:title`;
11
+ const [open, setOpen] = useState(props.open ?? false);
12
+ useEffect(() => {
13
+ setOpen(props.open ?? false);
14
+ }, [props.open]);
15
+ const { context, refs } = useFloating({
16
+ transform: true,
17
+ open: open !== null,
18
+ nodeId: id,
19
+ onOpenChange: setOpen,
20
+ strategy: "absolute",
21
+ });
22
+ const click = useClick(context, { enabled: !(props.disabled ?? false) });
23
+ const role = useRole(context, { role: "dialog" });
24
+ const dismiss = useDismiss(context, {
25
+ escapeKey: true,
26
+ referencePress: true,
27
+ outsidePress: true,
28
+ });
29
+ const { getFloatingProps, getReferenceProps } = useInteractions([click, role, dismiss]);
30
+ return (<div className="relative inline-flex items-center justify-center" ref={root}>
31
+ <Button {...getReferenceProps(props)} as={motion.button} layoutId={wrapperId} ref={refs.setReference} size="small" onClick={() => setOpen(true)}>
32
+ <motion.span layoutId={titleId}>{props.trigger}</motion.span>
33
+ </Button>
34
+ <AnimatePresence>
35
+ {open ? (<FloatingPortal root={root}>
36
+ <FloatingFocusManager visuallyHiddenDismiss modal closeOnFocusOut context={context}>
37
+ <motion.div {...getFloatingProps()} ref={refs.setFloating} layoutId={wrapperId} className="absolute -left-1/4 -top-3/4">
38
+ {props.children}
39
+ </motion.div>
40
+ </FloatingFocusManager>
41
+ </FloatingPortal>) : null}
42
+ </AnimatePresence>
43
+ </div>);
44
+ };
@@ -1,11 +1,11 @@
1
1
  import { jsxs as x, jsx as t } from "react/jsx-runtime";
2
- import { p as Y, q, r as te, t as $, u as se, o as ne, f as oe, s as ae, b as ie, d as re, i as le, v as de, w as ce, n as ue, j as fe, x as me, c as ge, y as ve, z as pe, F as Ie, l as xe, A as Fe } from "../../floating-ui.react-QNHG9W4N.js";
2
+ import { p as Y, q, r as te, t as $, u as se, o as ne, f as oe, s as ae, b as ie, d as re, j as le, v as de, w as ce, n as ue, k as fe, x as me, c as ge, y as ve, z as pe, F as Ie, m as xe, A as Fe } from "../../floating-ui.react-M2PGXLDp.js";
3
3
  import { S as be } from "../../slot-CRyweuj0.js";
4
4
  import { e as he } from "../../CaretRight.es-0-M8D9y8.js";
5
- import M, { createContext as ye, useState as C, useRef as _, useContext as G, useEffect as j, Fragment as Ne } from "react";
5
+ import M, { createContext as ye, useState as k, useRef as _, useContext as G, useEffect as j, Fragment as Ne } from "react";
6
6
  import { F as Pe, T as we } from "../../constants-r-AHn273.js";
7
- import { c as R, m as k } from "../../dom-Dl8XH0CK.js";
8
- const U = (o = "") => R(
7
+ import { c as C, m as R } from "../../dom-CyQHY7ID.js";
8
+ const U = (o = "") => C(
9
9
  "w-full min-w-36 outline-none p-2.5 items-center flex justify-between text-left",
10
10
  "hover:bg-primary focus:bg-primary aria-expanded:opacity-80",
11
11
  "focus:text-primary-foreground hover:text-primary-foreground",
@@ -22,7 +22,7 @@ const U = (o = "") => R(
22
22
  }
23
23
  }), D = M.forwardRef(
24
24
  ({ children: o, FloatingComponent: i = "div", hover: g = !0, open: F, isParent: r = !1, restoreFocus: b = !1, floatingClassName: d = "", label: v, ...n }, c) => {
25
- const [s, h] = C(F ?? !1), [E, y] = C(!1), [N, P] = C(null), H = _([]), T = _([]), u = G(A), p = Y(), a = q(), f = te(), I = $(), e = p !== null, { floatingStyles: B, refs: w, context: l } = se({
25
+ const [s, h] = k(F ?? !1), [E, y] = k(!1), [N, P] = k(null), H = _([]), T = _([]), u = G(A), p = Y(), a = q(), f = te(), I = $(), e = p !== null, { floatingStyles: B, refs: w, context: l } = se({
26
26
  nodeId: f,
27
27
  open: s,
28
28
  transform: !0,
@@ -64,7 +64,7 @@ const U = (o = "") => R(
64
64
  }, [a, f, p]), j(() => {
65
65
  s && a && a.events.emit("menuopen", { parentId: p, nodeId: f });
66
66
  }, [a, s, f, p]);
67
- const O = r ? n.className : R(U(n.className));
67
+ const O = r ? n.className : C(U(n.className));
68
68
  return /* @__PURE__ */ x(ve, { id: f, children: [
69
69
  /* @__PURE__ */ t(Ne, { children: n.asChild ? /* @__PURE__ */ t(
70
70
  be,
@@ -83,7 +83,7 @@ const U = (o = "") => R(
83
83
  "data-nested": e ? "" : void 0,
84
84
  role: e ? "menuitem" : void 0,
85
85
  "data-focus-inside": E ? "" : void 0,
86
- ref: k(w.setReference, I.ref, c),
86
+ ref: R(w.setReference, I.ref, c),
87
87
  tabIndex: e ? u.activeIndex === I.index ? 0 : -1 : void 0
88
88
  }
89
89
  ) : /* @__PURE__ */ x(
@@ -95,7 +95,7 @@ const U = (o = "") => R(
95
95
  "data-nested": e ? "" : void 0,
96
96
  role: e ? "menuitem" : void 0,
97
97
  "data-focus-inside": E ? "" : void 0,
98
- ref: k(w.setReference, I.ref, c),
98
+ ref: R(w.setReference, I.ref, c),
99
99
  tabIndex: e ? u.activeIndex === I.index ? 0 : -1 : void 0,
100
100
  ...L(
101
101
  u.getItemProps({
@@ -127,7 +127,7 @@ const U = (o = "") => R(
127
127
  ...Z(),
128
128
  ref: w.setFloating,
129
129
  style: { ...n.style, ...B },
130
- className: R(
130
+ className: C(
131
131
  "isolate z-tooltip flex max-h-80 flex-col items-start overflow-y-auto rounded-lg border border-floating-border bg-floating-background text-left shadow-shadow-floating outline-none",
132
132
  d
133
133
  ),
@@ -152,7 +152,7 @@ const U = (o = "") => R(
152
152
  "data-active": c,
153
153
  "data-open": d.isOpen,
154
154
  tabIndex: c ? 0 : -1,
155
- ref: k(v.ref, b),
155
+ ref: R(v.ref, b),
156
156
  className: U(`${r.className ?? ""} ${c ? "bg-primary text-primary-foreground" : ""}`),
157
157
  ...d.getItemProps({
158
158
  onClick(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sources":["../../../src/components/floating/menu.tsx"],"sourcesContent":["\"use client\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n} from \"@floating-ui/react\";\nimport { Slot } from \"../core/slot\";\nimport { CaretRightIcon, type Icon } from \"@phosphor-icons/react\";\nimport React, { createContext, Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport { FLOATING_DELAY, TYPEAHEAD_RESET_DELAY } from \"../../constants\";\nimport { css, mergeRefs } from \"../../lib/dom\";\nimport { Override } from \"../../types\";\n\nconst menuItemClassName = (highlight: string = \"\") =>\n css(\n \"w-full min-w-36 outline-none p-2.5 items-center flex justify-between text-left\",\n \"hover:bg-primary focus:bg-primary aria-expanded:opacity-80\",\n \"focus:text-primary-foreground hover:text-primary-foreground\",\n \"first-of-type:rounded-t-lg last-of-type:rounded-b-lg\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n highlight\n );\n\nconst MenuContext = createContext<{\n activeIndex: number | null;\n getItemProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n isOpen: boolean;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n}>({\n isOpen: false,\n activeIndex: null,\n getItemProps: () => ({}),\n setActiveIndex: () => {},\n setHasFocusInside: () => {},\n});\n\nexport type MenuProps = Partial<\n {\n hover: boolean;\n open?: boolean;\n nested: boolean;\n asChild: boolean;\n isParent: boolean;\n restoreFocus: boolean;\n children: React.ReactNode;\n floatingClassName: string;\n FloatingComponent: React.ElementType;\n } & ({ label: string } | { label: React.ReactElement; title: string })\n>;\n\nconst MenuComponent = React.forwardRef<HTMLButtonElement, Override<React.HTMLProps<HTMLButtonElement>, MenuProps>>(\n (\n { children, FloatingComponent = \"div\", hover = true, open, isParent = false, restoreFocus = false, floatingClassName = \"\", label, ...props },\n forwardedRef\n ) => {\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const elementsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = useRef<Array<string | null>>([]);\n const parent = useContext(MenuContext);\n\n const parentId = useFloatingParentNodeId();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const item = useListItem();\n\n const isNested = parentId !== null;\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n transform: true,\n strategy: \"absolute\",\n onOpenChange: setIsOpen,\n whileElementsMounted: autoUpdate,\n placement: isNested ? \"right\" : \"bottom-start\",\n middleware: [offset({ mainAxis: isNested ? 0 : 4, alignmentAxis: isNested ? -4 : 0 }), flip(), shift()],\n });\n const role = useRole(context, { role: \"menu\" });\n const dismiss = useDismiss(context, { bubbles: true });\n const hoverModule = useHover(context, {\n move: false,\n enabled: hover,\n delay: { open: FLOATING_DELAY },\n handleClose: safePolygon({ blockPointerEvents: true, requireIntent: false }),\n });\n\n const click = useClick(context, {\n toggle: !isNested,\n event: \"mousedown\",\n ignoreMouse: isNested,\n keyboardHandlers: true,\n });\n\n const listNavigation = useListNavigation(context, {\n loop: true,\n activeIndex,\n nested: isNested,\n listRef: elementsRef,\n onNavigate: setActiveIndex,\n });\n\n const typeahead = useTypeahead(context, {\n activeIndex,\n listRef: labelsRef,\n resetMs: TYPEAHEAD_RESET_DELAY,\n onMatch: isOpen ? setActiveIndex : undefined,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([hoverModule, click, role, dismiss, listNavigation, typeahead]);\n\n useEffect(() => {\n if (!tree) return;\n const handleTreeClick = () => setIsOpen(false);\n const onSubMenuOpen = (event: { nodeId: string; parentId: string }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) setIsOpen(false);\n };\n tree.events.on(\"click\", handleTreeClick);\n tree.events.on(\"menuopen\", onSubMenuOpen);\n return () => {\n tree.events.off(\"click\", handleTreeClick);\n tree.events.off(\"menuopen\", onSubMenuOpen);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [tree, isOpen, nodeId, parentId]);\n\n const className = isParent ? props.className : css(menuItemClassName(props.className));\n\n return (\n <FloatingNode id={nodeId}>\n <Fragment>\n {props.asChild ? (\n <Slot\n {...getReferenceProps(\n parent.getItemProps({\n ...props,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n })\n )}\n children={label}\n className={className}\n data-open={isOpen ? \"\" : undefined}\n data-nested={isNested ? \"\" : undefined}\n role={isNested ? \"menuitem\" : undefined}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n ref={mergeRefs(refs.setReference, item.ref, forwardedRef) as any}\n tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1}\n />\n ) : (\n <button\n type=\"button\"\n className={className}\n data-open={isOpen ? \"\" : undefined}\n data-nested={isNested ? \"\" : undefined}\n role={isNested ? \"menuitem\" : undefined}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n ref={mergeRefs(refs.setReference, item.ref, forwardedRef)}\n tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1}\n {...getReferenceProps(\n parent.getItemProps({\n ...props,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n })\n )}\n >\n {label}\n {isNested && (\n <span style={{ marginLeft: 10, fontSize: 10 }}>\n <span className=\"sr-only\">Next menu</span>\n <CaretRightIcon size={14} />\n </span>\n )}\n </button>\n )}\n </Fragment>\n <MenuContext.Provider value={{ activeIndex, setActiveIndex, getItemProps, setHasFocusInside, isOpen } as any}>\n <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={isNested ? -1 : 0}\n returnFocus={isParent ? restoreFocus : !isNested}\n >\n <FloatingComponent\n {...getFloatingProps()}\n ref={refs.setFloating}\n style={{ ...props.style, ...floatingStyles }}\n className={css(\n \"isolate z-tooltip flex max-h-80 flex-col items-start overflow-y-auto rounded-lg border border-floating-border bg-floating-background text-left shadow-shadow-floating outline-none\",\n floatingClassName\n )}\n >\n {children}\n </FloatingComponent>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n }\n);\n\ntype MenuItemProps = { title: string; disabled?: boolean; Right?: Icon };\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, Override<React.ButtonHTMLAttributes<HTMLButtonElement>, MenuItemProps>>(\n ({ title, Right, disabled, children, ...props }, forwardedRef) => {\n const menu = useContext(MenuContext);\n const item = useListItem({ label: disabled ? null : title });\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n return (\n <button\n {...props}\n title={title}\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n data-active={isActive}\n data-open={menu.isOpen}\n tabIndex={isActive ? 0 : -1}\n ref={mergeRefs(item.ref, forwardedRef)}\n className={menuItemClassName(`${props.className ?? \"\"} ${isActive ? \"bg-primary text-primary-foreground\" : \"\"}`)}\n {...menu.getItemProps({\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n props.onClick?.(event);\n tree?.events.emit(\"click\");\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n })}\n >\n {children}\n {Right ? <Right size={16} /> : null}\n </button>\n );\n }\n);\n\nexport const Menu = React.forwardRef<HTMLButtonElement, Override<React.ComponentProps<\"button\">, MenuProps>>((props, ref) => {\n const parentId = useFloatingParentNodeId();\n return parentId === null ? (\n <FloatingTree>\n <MenuComponent {...props} isParent ref={ref} />\n </FloatingTree>\n ) : (\n <MenuComponent {...props} isParent={false} ref={ref} />\n );\n});\n"],"names":["menuItemClassName","highlight","css","MenuContext","createContext","MenuComponent","React","children","FloatingComponent","hover","open","isParent","restoreFocus","floatingClassName","label","props","forwardedRef","isOpen","setIsOpen","useState","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","elementsRef","useRef","labelsRef","parent","useContext","parentId","useFloatingParentNodeId","tree","useFloatingTree","nodeId","useFloatingNodeId","item","useListItem","isNested","floatingStyles","refs","context","useFloating","autoUpdate","offset","flip","shift","role","useRole","dismiss","useDismiss","hoverModule","useHover","FLOATING_DELAY","safePolygon","click","useClick","listNavigation","useListNavigation","typeahead","useTypeahead","TYPEAHEAD_RESET_DELAY","getReferenceProps","getFloatingProps","getItemProps","useInteractions","useEffect","handleTreeClick","onSubMenuOpen","event","className","jsxs","FloatingNode","jsx","Fragment","Slot","mergeRefs","CaretRightIcon","FloatingList","FloatingPortal","FloatingFocusManager","MenuItem","title","Right","disabled","menu","isActive","Menu","ref","FloatingTree"],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","sources":["../../../src/components/floating/menu.tsx"],"sourcesContent":["\"use client\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n} from \"@floating-ui/react\";\nimport { Slot } from \"../core/slot\";\nimport { CaretRightIcon, type Icon } from \"@phosphor-icons/react\";\nimport React, { createContext, Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport { FLOATING_DELAY, TYPEAHEAD_RESET_DELAY } from \"../../constants\";\nimport { css, mergeRefs } from \"../../lib/dom\";\nimport { Override } from \"../../types\";\n\nconst menuItemClassName = (highlight: string = \"\") =>\n css(\n \"w-full min-w-36 outline-none p-2.5 items-center flex justify-between text-left\",\n \"hover:bg-primary focus:bg-primary aria-expanded:opacity-80\",\n \"focus:text-primary-foreground hover:text-primary-foreground\",\n \"first-of-type:rounded-t-lg last-of-type:rounded-b-lg\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n highlight\n );\n\nconst MenuContext = createContext<{\n activeIndex: number | null;\n getItemProps: (props?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;\n isOpen: boolean;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n}>({\n isOpen: false,\n activeIndex: null,\n getItemProps: () => ({}),\n setActiveIndex: () => {},\n setHasFocusInside: () => {},\n});\n\nexport type MenuProps = Partial<\n {\n hover: boolean;\n open?: boolean;\n nested: boolean;\n asChild: boolean;\n isParent: boolean;\n restoreFocus: boolean;\n children: React.ReactNode;\n floatingClassName: string;\n FloatingComponent: React.ElementType;\n } & ({ label: string } | { label: React.ReactElement; title: string })\n>;\n\nconst MenuComponent = React.forwardRef<HTMLButtonElement, Override<React.HTMLProps<HTMLButtonElement>, MenuProps>>(\n (\n { children, FloatingComponent = \"div\", hover = true, open, isParent = false, restoreFocus = false, floatingClassName = \"\", label, ...props },\n forwardedRef\n ) => {\n const [isOpen, setIsOpen] = useState<boolean>(open ?? false);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const elementsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = useRef<Array<string | null>>([]);\n const parent = useContext(MenuContext);\n\n const parentId = useFloatingParentNodeId();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const item = useListItem();\n\n const isNested = parentId !== null;\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n transform: true,\n strategy: \"absolute\",\n onOpenChange: setIsOpen,\n whileElementsMounted: autoUpdate,\n placement: isNested ? \"right\" : \"bottom-start\",\n middleware: [offset({ mainAxis: isNested ? 0 : 4, alignmentAxis: isNested ? -4 : 0 }), flip(), shift()],\n });\n const role = useRole(context, { role: \"menu\" });\n const dismiss = useDismiss(context, { bubbles: true });\n const hoverModule = useHover(context, {\n move: false,\n enabled: hover,\n delay: { open: FLOATING_DELAY },\n handleClose: safePolygon({ blockPointerEvents: true, requireIntent: false }),\n });\n\n const click = useClick(context, {\n toggle: !isNested,\n event: \"mousedown\",\n ignoreMouse: isNested,\n keyboardHandlers: true,\n });\n\n const listNavigation = useListNavigation(context, {\n loop: true,\n activeIndex,\n nested: isNested,\n listRef: elementsRef,\n onNavigate: setActiveIndex,\n });\n\n const typeahead = useTypeahead(context, {\n activeIndex,\n listRef: labelsRef,\n resetMs: TYPEAHEAD_RESET_DELAY,\n onMatch: isOpen ? setActiveIndex : undefined,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([hoverModule, click, role, dismiss, listNavigation, typeahead]);\n\n useEffect(() => {\n if (!tree) return;\n const handleTreeClick = () => setIsOpen(false);\n const onSubMenuOpen = (event: { nodeId: string; parentId: string }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) setIsOpen(false);\n };\n tree.events.on(\"click\", handleTreeClick);\n tree.events.on(\"menuopen\", onSubMenuOpen);\n return () => {\n tree.events.off(\"click\", handleTreeClick);\n tree.events.off(\"menuopen\", onSubMenuOpen);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [tree, isOpen, nodeId, parentId]);\n\n const className = isParent ? props.className : css(menuItemClassName(props.className));\n\n return (\n <FloatingNode id={nodeId}>\n <Fragment>\n {props.asChild ? (\n <Slot\n {...getReferenceProps(\n parent.getItemProps({\n ...props,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n })\n )}\n children={label}\n className={className}\n data-open={isOpen ? \"\" : undefined}\n data-nested={isNested ? \"\" : undefined}\n role={isNested ? \"menuitem\" : undefined}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n ref={mergeRefs(refs.setReference, item.ref, forwardedRef) as unknown as React.Ref<HTMLElement>}\n tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1}\n />\n ) : (\n <button\n type=\"button\"\n className={className}\n data-open={isOpen ? \"\" : undefined}\n data-nested={isNested ? \"\" : undefined}\n role={isNested ? \"menuitem\" : undefined}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n ref={mergeRefs(refs.setReference, item.ref, forwardedRef)}\n tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1}\n {...getReferenceProps(\n parent.getItemProps({\n ...props,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n })\n )}\n >\n {label}\n {isNested && (\n <span style={{ marginLeft: 10, fontSize: 10 }}>\n <span className=\"sr-only\">Next menu</span>\n <CaretRightIcon size={14} />\n </span>\n )}\n </button>\n )}\n </Fragment>\n <MenuContext.Provider value={{ activeIndex, setActiveIndex, getItemProps, setHasFocusInside, isOpen }}>\n <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={isNested ? -1 : 0}\n returnFocus={isParent ? restoreFocus : !isNested}\n >\n <FloatingComponent\n {...getFloatingProps()}\n ref={refs.setFloating}\n style={{ ...props.style, ...floatingStyles }}\n className={css(\n \"isolate z-tooltip flex max-h-80 flex-col items-start overflow-y-auto rounded-lg border border-floating-border bg-floating-background text-left shadow-shadow-floating outline-none\",\n floatingClassName\n )}\n >\n {children}\n </FloatingComponent>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n }\n);\n\ntype MenuItemProps = { title: string; disabled?: boolean; Right?: Icon };\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, Override<React.ButtonHTMLAttributes<HTMLButtonElement>, MenuItemProps>>(\n ({ title, Right, disabled, children, ...props }, forwardedRef) => {\n const menu = useContext(MenuContext);\n const item = useListItem({ label: disabled ? null : title });\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n return (\n <button\n {...props}\n title={title}\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n data-active={isActive}\n data-open={menu.isOpen}\n tabIndex={isActive ? 0 : -1}\n ref={mergeRefs(item.ref, forwardedRef)}\n className={menuItemClassName(`${props.className ?? \"\"} ${isActive ? \"bg-primary text-primary-foreground\" : \"\"}`)}\n {...menu.getItemProps({\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n props.onClick?.(event);\n tree?.events.emit(\"click\");\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n props.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n })}\n >\n {children}\n {Right ? <Right size={16} /> : null}\n </button>\n );\n }\n);\n\nexport const Menu = React.forwardRef<HTMLButtonElement, Override<React.ComponentProps<\"button\">, MenuProps>>((props, ref) => {\n const parentId = useFloatingParentNodeId();\n return parentId === null ? (\n <FloatingTree>\n <MenuComponent {...props} isParent ref={ref} />\n </FloatingTree>\n ) : (\n <MenuComponent {...props} isParent={false} ref={ref} />\n );\n});\n"],"names":["menuItemClassName","highlight","css","MenuContext","createContext","MenuComponent","React","children","FloatingComponent","hover","open","isParent","restoreFocus","floatingClassName","label","props","forwardedRef","isOpen","setIsOpen","useState","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","elementsRef","useRef","labelsRef","parent","useContext","parentId","useFloatingParentNodeId","tree","useFloatingTree","nodeId","useFloatingNodeId","item","useListItem","isNested","floatingStyles","refs","context","useFloating","autoUpdate","offset","flip","shift","role","useRole","dismiss","useDismiss","hoverModule","useHover","FLOATING_DELAY","safePolygon","click","useClick","listNavigation","useListNavigation","typeahead","useTypeahead","TYPEAHEAD_RESET_DELAY","getReferenceProps","getFloatingProps","getItemProps","useInteractions","useEffect","handleTreeClick","onSubMenuOpen","event","className","jsxs","FloatingNode","jsx","Fragment","Slot","mergeRefs","CaretRightIcon","FloatingList","FloatingPortal","FloatingFocusManager","MenuItem","title","Right","disabled","menu","isActive","Menu","ref","FloatingTree"],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ "use client";
2
+ import { autoUpdate, flip, FloatingFocusManager, FloatingList, FloatingNode, FloatingPortal, FloatingTree, offset, safePolygon, shift, useClick, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingTree, useHover, useInteractions, useListItem, useListNavigation, useRole, useTypeahead, } from "@floating-ui/react";
3
+ import { Slot } from "../core/slot";
4
+ import { CaretRightIcon } from "@phosphor-icons/react";
5
+ import React, { createContext, Fragment, useContext, useEffect, useRef, useState } from "react";
6
+ import { FLOATING_DELAY, TYPEAHEAD_RESET_DELAY } from "../../constants";
7
+ import { css, mergeRefs } from "../../lib/dom";
8
+ const menuItemClassName = (highlight = "") => css("w-full min-w-36 outline-none p-2.5 items-center flex justify-between text-left", "hover:bg-primary focus:bg-primary aria-expanded:opacity-80", "focus:text-primary-foreground hover:text-primary-foreground", "first-of-type:rounded-t-lg last-of-type:rounded-b-lg", "disabled:opacity-40 disabled:cursor-not-allowed", highlight);
9
+ const MenuContext = createContext({
10
+ isOpen: false,
11
+ activeIndex: null,
12
+ getItemProps: () => ({}),
13
+ setActiveIndex: () => { },
14
+ setHasFocusInside: () => { },
15
+ });
16
+ const MenuComponent = React.forwardRef(({ children, FloatingComponent = "div", hover = true, open, isParent = false, restoreFocus = false, floatingClassName = "", label, ...props }, forwardedRef) => {
17
+ const [isOpen, setIsOpen] = useState(open ?? false);
18
+ const [hasFocusInside, setHasFocusInside] = useState(false);
19
+ const [activeIndex, setActiveIndex] = useState(null);
20
+ const elementsRef = useRef([]);
21
+ const labelsRef = useRef([]);
22
+ const parent = useContext(MenuContext);
23
+ const parentId = useFloatingParentNodeId();
24
+ const tree = useFloatingTree();
25
+ const nodeId = useFloatingNodeId();
26
+ const item = useListItem();
27
+ const isNested = parentId !== null;
28
+ const { floatingStyles, refs, context } = useFloating({
29
+ nodeId,
30
+ open: isOpen,
31
+ transform: true,
32
+ strategy: "absolute",
33
+ onOpenChange: setIsOpen,
34
+ whileElementsMounted: autoUpdate,
35
+ placement: isNested ? "right" : "bottom-start",
36
+ middleware: [offset({ mainAxis: isNested ? 0 : 4, alignmentAxis: isNested ? -4 : 0 }), flip(), shift()],
37
+ });
38
+ const role = useRole(context, { role: "menu" });
39
+ const dismiss = useDismiss(context, { bubbles: true });
40
+ const hoverModule = useHover(context, {
41
+ move: false,
42
+ enabled: hover,
43
+ delay: { open: FLOATING_DELAY },
44
+ handleClose: safePolygon({ blockPointerEvents: true, requireIntent: false }),
45
+ });
46
+ const click = useClick(context, {
47
+ toggle: !isNested,
48
+ event: "mousedown",
49
+ ignoreMouse: isNested,
50
+ keyboardHandlers: true,
51
+ });
52
+ const listNavigation = useListNavigation(context, {
53
+ loop: true,
54
+ activeIndex,
55
+ nested: isNested,
56
+ listRef: elementsRef,
57
+ onNavigate: setActiveIndex,
58
+ });
59
+ const typeahead = useTypeahead(context, {
60
+ activeIndex,
61
+ listRef: labelsRef,
62
+ resetMs: TYPEAHEAD_RESET_DELAY,
63
+ onMatch: isOpen ? setActiveIndex : undefined,
64
+ });
65
+ const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([hoverModule, click, role, dismiss, listNavigation, typeahead]);
66
+ useEffect(() => {
67
+ if (!tree)
68
+ return;
69
+ const handleTreeClick = () => setIsOpen(false);
70
+ const onSubMenuOpen = (event) => {
71
+ if (event.nodeId !== nodeId && event.parentId === parentId)
72
+ setIsOpen(false);
73
+ };
74
+ tree.events.on("click", handleTreeClick);
75
+ tree.events.on("menuopen", onSubMenuOpen);
76
+ return () => {
77
+ tree.events.off("click", handleTreeClick);
78
+ tree.events.off("menuopen", onSubMenuOpen);
79
+ };
80
+ }, [tree, nodeId, parentId]);
81
+ useEffect(() => {
82
+ if (isOpen && tree)
83
+ tree.events.emit("menuopen", { parentId, nodeId });
84
+ }, [tree, isOpen, nodeId, parentId]);
85
+ const className = isParent ? props.className : css(menuItemClassName(props.className));
86
+ return (<FloatingNode id={nodeId}>
87
+ <Fragment>
88
+ {props.asChild ? (<Slot {...getReferenceProps(parent.getItemProps({
89
+ ...props,
90
+ onFocus(event) {
91
+ props.onFocus?.(event);
92
+ setHasFocusInside(false);
93
+ parent.setHasFocusInside(true);
94
+ },
95
+ }))} children={label} className={className} data-open={isOpen ? "" : undefined} data-nested={isNested ? "" : undefined} role={isNested ? "menuitem" : undefined} data-focus-inside={hasFocusInside ? "" : undefined} ref={mergeRefs(refs.setReference, item.ref, forwardedRef)} tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1}/>) : (<button type="button" className={className} data-open={isOpen ? "" : undefined} data-nested={isNested ? "" : undefined} role={isNested ? "menuitem" : undefined} data-focus-inside={hasFocusInside ? "" : undefined} ref={mergeRefs(refs.setReference, item.ref, forwardedRef)} tabIndex={!isNested ? undefined : parent.activeIndex === item.index ? 0 : -1} {...getReferenceProps(parent.getItemProps({
96
+ ...props,
97
+ onFocus(event) {
98
+ props.onFocus?.(event);
99
+ setHasFocusInside(false);
100
+ parent.setHasFocusInside(true);
101
+ },
102
+ }))}>
103
+ {label}
104
+ {isNested && (<span style={{ marginLeft: 10, fontSize: 10 }}>
105
+ <span className="sr-only">Next menu</span>
106
+ <CaretRightIcon size={14}/>
107
+ </span>)}
108
+ </button>)}
109
+ </Fragment>
110
+ <MenuContext.Provider value={{ activeIndex, setActiveIndex, getItemProps, setHasFocusInside, isOpen }}>
111
+ <FloatingList elementsRef={elementsRef} labelsRef={labelsRef}>
112
+ {isOpen && (<FloatingPortal>
113
+ <FloatingFocusManager context={context} modal={false} initialFocus={isNested ? -1 : 0} returnFocus={isParent ? restoreFocus : !isNested}>
114
+ <FloatingComponent {...getFloatingProps()} ref={refs.setFloating} style={{ ...props.style, ...floatingStyles }} className={css("isolate z-tooltip flex max-h-80 flex-col items-start overflow-y-auto rounded-lg border border-floating-border bg-floating-background text-left shadow-shadow-floating outline-none", floatingClassName)}>
115
+ {children}
116
+ </FloatingComponent>
117
+ </FloatingFocusManager>
118
+ </FloatingPortal>)}
119
+ </FloatingList>
120
+ </MenuContext.Provider>
121
+ </FloatingNode>);
122
+ });
123
+ export const MenuItem = React.forwardRef(({ title, Right, disabled, children, ...props }, forwardedRef) => {
124
+ const menu = useContext(MenuContext);
125
+ const item = useListItem({ label: disabled ? null : title });
126
+ const tree = useFloatingTree();
127
+ const isActive = item.index === menu.activeIndex;
128
+ return (<button {...props} title={title} type="button" role="menuitem" disabled={disabled} data-active={isActive} data-open={menu.isOpen} tabIndex={isActive ? 0 : -1} ref={mergeRefs(item.ref, forwardedRef)} className={menuItemClassName(`${props.className ?? ""} ${isActive ? "bg-primary text-primary-foreground" : ""}`)} {...menu.getItemProps({
129
+ onClick(event) {
130
+ props.onClick?.(event);
131
+ tree?.events.emit("click");
132
+ },
133
+ onFocus(event) {
134
+ props.onFocus?.(event);
135
+ menu.setHasFocusInside(true);
136
+ },
137
+ })}>
138
+ {children}
139
+ {Right ? <Right size={16}/> : null}
140
+ </button>);
141
+ });
142
+ export const Menu = React.forwardRef((props, ref) => {
143
+ const parentId = useFloatingParentNodeId();
144
+ return parentId === null ? (<FloatingTree>
145
+ <MenuComponent {...props} isParent ref={ref}/>
146
+ </FloatingTree>) : (<MenuComponent {...props} isParent={false} ref={ref}/>);
147
+ });
@@ -1,4 +1,4 @@
1
- import { type ElementProps } from "@floating-ui/react";
1
+ import { type ElementProps, type FloatingContext } from "@floating-ui/react";
2
2
  import { HTMLMotionProps } from "motion/react";
3
3
  import React from "react";
4
4
  import { Label, Override } from "../../types";
@@ -32,10 +32,10 @@ export type ModalProps = Override<HTMLMotionProps<"div">, ({
32
32
  closeOnFocusOut: boolean;
33
33
  role: "dialog";
34
34
  interactions: ElementProps[];
35
- trigger: Label | React.FC<any>;
35
+ trigger: Label;
36
36
  }>>;
37
37
  export type ModalRef = {
38
- context: any;
38
+ context: FloatingContext;
39
39
  floating: HTMLElement | null;
40
40
  };
41
41
  type ModalComponent = React.FC<ModalProps> & {
@@ -43,7 +43,7 @@ type ModalComponent = React.FC<ModalProps> & {
43
43
  };
44
44
  export declare const Modal: ModalComponent;
45
45
  type ButtonConfirmationAction = {
46
- value?: any;
46
+ value?: unknown;
47
47
  text?: Label;
48
48
  theme?: ButtonProps["theme"];
49
49
  };
@@ -1 +1 @@
1
- {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/floating/modal.tsx"],"names":[],"mappings":"AACA,OAAO,EASH,KAAK,YAAY,EACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEH,eAAe,EAQlB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAWN,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,KAAK,EAAO,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAU,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMrD,eAAO,MAAM,UAAU,kBAF8B,cAAc,KAAK,OAAO,CAAC,OAAO,CAEvB,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAuD9C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAC7B,eAAe,CAAC,KAAK,CAAC,EACtB,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GAAG;IAC5E,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C,GAAG,OAAO,CAAC;IACJ,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAClC,CAAC,CACT,CAAC;AAgFF,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC;AAItE,KAAK,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG;IACzC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,cA8PZ,CAAC;AAET,KAAK,wBAAwB,GAAG;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACtC,CAAC;AAaF,eAAO,MAAM,oBAAoB,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,sBAuD/E,CAAC"}
1
+ {"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../../src/components/floating/modal.tsx"],"names":[],"mappings":"AACA,OAAO,EASH,KAAK,YAAY,EACjB,KAAK,eAAe,EACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEH,eAAe,EAQlB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAWN,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,KAAK,EAAO,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAU,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMrD,eAAO,MAAM,UAAU,kBAF8B,cAAc,KAAK,OAAO,CAAC,OAAO,CAEvB,CAAC;AAEjE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC;AAuD9C,MAAM,MAAM,UAAU,GAAG,QAAQ,CAC7B,eAAe,CAAC,KAAK,CAAC,EACtB,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GAAG;IAC5E,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C,GAAG,OAAO,CAAC;IACJ,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,YAAY,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;CAClB,CAAC,CACT,CAAC;AAkFF,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC;AAIlF,KAAK,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG;IACzC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,cA+PU,CAAC;AAE/B,KAAK,wBAAwB,GAAG;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACtC,CAAC;AAaF,eAAO,MAAM,oBAAoB,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,sBAuD/E,CAAC"}