@g4rcez/components 3.0.0-0 → 3.0.1

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 (265) hide show
  1. package/dist/ai/SKILL.md +266 -0
  2. package/dist/ai/docs/Alert.md +167 -0
  3. package/dist/ai/docs/AnimatedList.md +205 -0
  4. package/dist/ai/docs/Autocomplete.md +225 -0
  5. package/dist/ai/docs/Button.md +182 -0
  6. package/dist/ai/docs/Calendar.md +219 -0
  7. package/dist/ai/docs/Card.md +174 -0
  8. package/dist/ai/docs/Checkbox.md +199 -0
  9. package/dist/ai/docs/CommandPalette.md +293 -0
  10. package/dist/ai/docs/DatePicker.md +171 -0
  11. package/dist/ai/docs/Dropdown.md +223 -0
  12. package/dist/ai/docs/Empty.md +163 -0
  13. package/dist/ai/docs/Expand.md +143 -0
  14. package/dist/ai/docs/FileUpload.md +225 -0
  15. package/dist/ai/docs/Form.md +107 -0
  16. package/dist/ai/docs/FormReset.md +117 -0
  17. package/dist/ai/docs/Heading.md +88 -0
  18. package/dist/ai/docs/Input.md +237 -0
  19. package/dist/ai/docs/InputField.md +170 -0
  20. package/dist/ai/docs/List.md +205 -0
  21. package/dist/ai/docs/Menu.md +166 -0
  22. package/dist/ai/docs/Modal.md +280 -0
  23. package/dist/ai/docs/MultiSelect.md +196 -0
  24. package/dist/ai/docs/Notifications.md +231 -0
  25. package/dist/ai/docs/PageCalendar.md +271 -0
  26. package/dist/ai/docs/Polymorph.md +159 -0
  27. package/dist/ai/docs/Progress.md +145 -0
  28. package/dist/ai/docs/Radiobox.md +128 -0
  29. package/dist/ai/docs/RenderOnView.md +138 -0
  30. package/dist/ai/docs/Resizable.md +159 -0
  31. package/dist/ai/docs/Select.md +284 -0
  32. package/dist/ai/docs/Shortcut.md +105 -0
  33. package/dist/ai/docs/Skeleton.md +166 -0
  34. package/dist/ai/docs/Slider.md +144 -0
  35. package/dist/ai/docs/Slot.md +173 -0
  36. package/dist/ai/docs/Spinner.md +118 -0
  37. package/dist/ai/docs/Stats.md +137 -0
  38. package/dist/ai/docs/Step.md +159 -0
  39. package/dist/ai/docs/Switch.md +167 -0
  40. package/dist/ai/docs/Table.md +298 -0
  41. package/dist/ai/docs/Tabs.md +191 -0
  42. package/dist/ai/docs/Tag.md +224 -0
  43. package/dist/ai/docs/TaskList.md +144 -0
  44. package/dist/ai/docs/Textarea.md +167 -0
  45. package/dist/ai/docs/Timeline.md +210 -0
  46. package/dist/ai/docs/Toolbar.md +132 -0
  47. package/dist/ai/docs/Tooltip.md +231 -0
  48. package/dist/ai/docs/TransferList.md +142 -0
  49. package/dist/ai/docs/Typography.md +187 -0
  50. package/dist/ai/docs/Wizard.md +213 -0
  51. package/dist/ai/docs/index.md +183 -0
  52. package/dist/components/core/button.d.ts +2 -8
  53. package/dist/components/core/button.d.ts.map +1 -1
  54. package/dist/components/core/polymorph.d.ts.map +1 -1
  55. package/dist/components/core/slot.d.ts +1 -1
  56. package/dist/components/core/slot.d.ts.map +1 -1
  57. package/dist/components/core/tag.d.ts +2 -2
  58. package/dist/components/core/tag.d.ts.map +1 -1
  59. package/dist/components/core/typography.d.ts.map +1 -1
  60. package/dist/components/display/alert.d.ts.map +1 -1
  61. package/dist/components/display/calendar.d.ts.map +1 -1
  62. package/dist/components/display/card.d.ts.map +1 -1
  63. package/dist/components/display/list.d.ts.map +1 -1
  64. package/dist/components/display/notifications.d.ts +2 -0
  65. package/dist/components/display/notifications.d.ts.map +1 -1
  66. package/dist/components/display/progress.d.ts.map +1 -1
  67. package/dist/components/display/skeleton.d.ts.map +1 -1
  68. package/dist/components/display/step.d.ts.map +1 -1
  69. package/dist/components/display/tabs.d.ts.map +1 -1
  70. package/dist/components/floating/command-palette.d.ts +1 -0
  71. package/dist/components/floating/command-palette.d.ts.map +1 -1
  72. package/dist/components/floating/dropdown.d.ts +1 -0
  73. package/dist/components/floating/dropdown.d.ts.map +1 -1
  74. package/dist/components/floating/menu.d.ts +2 -2
  75. package/dist/components/floating/menu.d.ts.map +1 -1
  76. package/dist/components/floating/modal.d.ts +20 -53
  77. package/dist/components/floating/modal.d.ts.map +1 -1
  78. package/dist/components/floating/tooltip.d.ts.map +1 -1
  79. package/dist/components/floating/wizard.d.ts +1 -1
  80. package/dist/components/floating/wizard.d.ts.map +1 -1
  81. package/dist/components/form/autocomplete.d.ts.map +1 -1
  82. package/dist/components/form/date-picker.d.ts.map +1 -1
  83. package/dist/components/form/free-text.d.ts.map +1 -1
  84. package/dist/components/form/input-field.d.ts +3 -2
  85. package/dist/components/form/input-field.d.ts.map +1 -1
  86. package/dist/components/form/multi-select.d.ts.map +1 -1
  87. package/dist/components/form/select.d.ts.map +1 -1
  88. package/dist/components/form/slider.d.ts.map +1 -1
  89. package/dist/components/index.d.ts +2 -0
  90. package/dist/components/index.d.ts.map +1 -1
  91. package/dist/components/page-calendar/calendar-header.d.ts +16 -0
  92. package/dist/components/page-calendar/calendar-header.d.ts.map +1 -0
  93. package/dist/components/page-calendar/day-view.d.ts +12 -0
  94. package/dist/components/page-calendar/day-view.d.ts.map +1 -0
  95. package/dist/components/page-calendar/event-pill.d.ts +9 -0
  96. package/dist/components/page-calendar/event-pill.d.ts.map +1 -0
  97. package/dist/components/page-calendar/index.d.ts +4 -0
  98. package/dist/components/page-calendar/index.d.ts.map +1 -0
  99. package/dist/components/page-calendar/month-view.d.ts +11 -0
  100. package/dist/components/page-calendar/month-view.d.ts.map +1 -0
  101. package/dist/components/page-calendar/page-calendar.d.ts +18 -0
  102. package/dist/components/page-calendar/page-calendar.d.ts.map +1 -0
  103. package/dist/components/page-calendar/page-calendar.types.d.ts +18 -0
  104. package/dist/components/page-calendar/page-calendar.types.d.ts.map +1 -0
  105. package/dist/components/page-calendar/page-calendar.utils.d.ts +18 -0
  106. package/dist/components/page-calendar/page-calendar.utils.d.ts.map +1 -0
  107. package/dist/components/page-calendar/week-view.d.ts +11 -0
  108. package/dist/components/page-calendar/week-view.d.ts.map +1 -0
  109. package/dist/components/table/index.d.ts.map +1 -1
  110. package/dist/components/table/inner-table.d.ts.map +1 -1
  111. package/dist/components/table/metadata.d.ts.map +1 -1
  112. package/dist/components/table/row.d.ts.map +1 -1
  113. package/dist/components/table/table-lib.d.ts.map +1 -1
  114. package/dist/components/table/thead.d.ts.map +1 -1
  115. package/dist/config/context.d.ts.map +1 -1
  116. package/dist/config/default-translations.d.ts +21 -4
  117. package/dist/config/default-translations.d.ts.map +1 -1
  118. package/dist/constants.d.ts.map +1 -1
  119. package/dist/hooks/use-components-provider.d.ts.map +1 -1
  120. package/dist/hooks/use-form.d.ts +11 -11
  121. package/dist/hooks/use-form.d.ts.map +1 -1
  122. package/dist/hooks/use-input-id.d.ts.map +1 -1
  123. package/dist/hooks/use-preferences.d.ts.map +1 -1
  124. package/dist/hooks/use-previous.d.ts.map +1 -1
  125. package/dist/hooks/use-reactive.d.ts.map +1 -1
  126. package/dist/hooks/use-resize-observer.d.ts.map +1 -1
  127. package/dist/hooks/use-stable-ref.d.ts.map +1 -1
  128. package/dist/hooks/use-swipe.d.ts.map +1 -1
  129. package/dist/hooks/use-translations.d.ts +21 -4
  130. package/dist/hooks/use-translations.d.ts.map +1 -1
  131. package/dist/index.css +1 -0
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +28 -20
  134. package/dist/index.js.map +1 -1
  135. package/dist/index.mjs +13862 -12512
  136. package/dist/index.mjs.map +1 -1
  137. package/dist/index.umd.js +24 -17
  138. package/dist/index.umd.js.map +1 -1
  139. package/dist/lib/dom.d.ts +1 -0
  140. package/dist/lib/dom.d.ts.map +1 -1
  141. package/dist/lib/fns.d.ts.map +1 -1
  142. package/dist/preset/plugin.tailwind.d.ts +9 -0
  143. package/dist/preset/plugin.tailwind.d.ts.map +1 -0
  144. package/dist/preset/plugin.tailwind.js +27 -0
  145. package/dist/preset/preset.tailwind.d.ts +8 -0
  146. package/dist/preset/preset.tailwind.d.ts.map +1 -0
  147. package/dist/preset/preset.tailwind.js +54 -0
  148. package/dist/preset/src/styles/common.d.ts +2 -14
  149. package/dist/preset/src/styles/common.d.ts.map +1 -1
  150. package/dist/preset/src/styles/common.js +1 -0
  151. package/dist/preset/src/styles/dark.d.ts.map +1 -1
  152. package/dist/preset/src/styles/dark.js +119 -114
  153. package/dist/preset/src/styles/light.d.ts.map +1 -1
  154. package/dist/preset/src/styles/light.js +111 -106
  155. package/dist/preset/src/styles/theme.types.d.ts +17 -8
  156. package/dist/preset/src/styles/theme.types.d.ts.map +1 -1
  157. package/dist/styles/common.d.ts +2 -14
  158. package/dist/styles/common.d.ts.map +1 -1
  159. package/dist/styles/dark.d.ts.map +1 -1
  160. package/dist/styles/light.d.ts.map +1 -1
  161. package/dist/styles/theme.types.d.ts +17 -8
  162. package/dist/styles/theme.types.d.ts.map +1 -1
  163. package/package.json +299 -301
  164. package/dist/components/core/button.jsx +0 -86
  165. package/dist/components/core/heading.jsx +0 -4
  166. package/dist/components/core/polymorph.jsx +0 -5
  167. package/dist/components/core/render-on-view.jsx +0 -31
  168. package/dist/components/core/resizable.jsx +0 -51
  169. package/dist/components/core/slot.jsx +0 -163
  170. package/dist/components/core/tag.jsx +0 -51
  171. package/dist/components/core/typography.jsx +0 -26
  172. package/dist/components/display/alert.jsx +0 -56
  173. package/dist/components/display/calendar.jsx +0 -301
  174. package/dist/components/display/card.jsx +0 -43
  175. package/dist/components/display/empty.jsx +0 -11
  176. package/dist/components/display/list.jsx +0 -81
  177. package/dist/components/display/notifications.jsx +0 -98
  178. package/dist/components/display/progress.jsx +0 -13
  179. package/dist/components/display/shortcut.jsx +0 -23
  180. package/dist/components/display/skeleton.jsx +0 -14
  181. package/dist/components/display/spinner.jsx +0 -7
  182. package/dist/components/display/stats.jsx +0 -20
  183. package/dist/components/display/step.jsx +0 -131
  184. package/dist/components/display/tabs.jsx +0 -100
  185. package/dist/components/display/timeline.jsx +0 -25
  186. package/dist/components/floating/command-palette.jsx +0 -172
  187. package/dist/components/floating/dropdown.jsx +0 -53
  188. package/dist/components/floating/expand.jsx +0 -44
  189. package/dist/components/floating/menu.jsx +0 -147
  190. package/dist/components/floating/modal.jsx +0 -241
  191. package/dist/components/floating/toolbar.jsx +0 -5
  192. package/dist/components/floating/tooltip.jsx +0 -64
  193. package/dist/components/floating/wizard.jsx +0 -164
  194. package/dist/components/form/autocomplete.jsx +0 -275
  195. package/dist/components/form/checkbox.jsx +0 -12
  196. package/dist/components/form/date-picker.jsx +0 -115
  197. package/dist/components/form/file-upload.jsx +0 -133
  198. package/dist/components/form/form.jsx +0 -10
  199. package/dist/components/form/formReset.jsx +0 -17
  200. package/dist/components/form/free-text.jsx +0 -41
  201. package/dist/components/form/input-field.jsx +0 -54
  202. package/dist/components/form/input.jsx +0 -36
  203. package/dist/components/form/multi-select.jsx +0 -328
  204. package/dist/components/form/radiobox.jsx +0 -6
  205. package/dist/components/form/select.jsx +0 -42
  206. package/dist/components/form/slider.jsx +0 -45
  207. package/dist/components/form/switch.jsx +0 -46
  208. package/dist/components/form/task-list.jsx +0 -26
  209. package/dist/components/form/textarea.jsx +0 -12
  210. package/dist/components/form/transfer-list.jsx +0 -39
  211. package/dist/components/index.js +0 -43
  212. package/dist/components/table/filter.jsx +0 -141
  213. package/dist/components/table/group.jsx +0 -68
  214. package/dist/components/table/index.jsx +0 -60
  215. package/dist/components/table/inner-table.jsx +0 -104
  216. package/dist/components/table/metadata.jsx +0 -37
  217. package/dist/components/table/pagination.jsx +0 -73
  218. package/dist/components/table/row.jsx +0 -58
  219. package/dist/components/table/sort.jsx +0 -105
  220. package/dist/components/table/table-lib.js +0 -84
  221. package/dist/components/table/table.context.jsx +0 -4
  222. package/dist/components/table/thead.jsx +0 -103
  223. package/dist/config/context.js +0 -12
  224. package/dist/config/default-translations.jsx +0 -66
  225. package/dist/config/default-tweaks.js +0 -4
  226. package/dist/constants.js +0 -2
  227. package/dist/hooks/use-click-outside.js +0 -17
  228. package/dist/hooks/use-color-parser.js +0 -9
  229. package/dist/hooks/use-components-provider.jsx +0 -16
  230. package/dist/hooks/use-debounce.js +0 -12
  231. package/dist/hooks/use-floating-ref.js +0 -6
  232. package/dist/hooks/use-form.js +0 -549
  233. package/dist/hooks/use-hover.js +0 -18
  234. package/dist/hooks/use-input-id.js +0 -5
  235. package/dist/hooks/use-is-coarse-device.js +0 -12
  236. package/dist/hooks/use-locale.js +0 -10
  237. package/dist/hooks/use-media-query.js +0 -25
  238. package/dist/hooks/use-on-event.js +0 -7
  239. package/dist/hooks/use-parent.js +0 -21
  240. package/dist/hooks/use-preferences.js +0 -23
  241. package/dist/hooks/use-previous.js +0 -8
  242. package/dist/hooks/use-reactive.js +0 -8
  243. package/dist/hooks/use-remove-scroll.js +0 -61
  244. package/dist/hooks/use-resize-observer.js +0 -17
  245. package/dist/hooks/use-stable-ref.js +0 -8
  246. package/dist/hooks/use-swipe.js +0 -16
  247. package/dist/hooks/use-translations.js +0 -9
  248. package/dist/hooks/use-tweaks.js +0 -9
  249. package/dist/hooks/use-window-size.js +0 -14
  250. package/dist/lib/combi-keys.js +0 -60
  251. package/dist/lib/dict.js +0 -39
  252. package/dist/lib/dom.js +0 -44
  253. package/dist/lib/fns.js +0 -46
  254. package/dist/lib/fzf.js +0 -117
  255. package/dist/lib/keyboard-area.js +0 -14
  256. package/dist/preset/tailwindcssv4.d.ts +0 -3
  257. package/dist/preset/tailwindcssv4.d.ts.map +0 -1
  258. package/dist/preset/tailwindcssv4.js +0 -75
  259. package/dist/styles/common.js +0 -28
  260. package/dist/styles/dark.js +0 -209
  261. package/dist/styles/design-tokens.js +0 -69
  262. package/dist/styles/light.js +0 -209
  263. package/dist/styles/theme.js +0 -4
  264. package/dist/styles/theme.types.js +0 -1
  265. package/dist/types.js +0 -1
@@ -1,147 +0,0 @@
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 { ChevronRightIcon } from "lucide-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-hidden 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
- <ChevronRightIcon 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-hidden", 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,241 +0,0 @@
1
- "use client";
2
- import { FloatingFocusManager, FloatingOverlay, FloatingPortal, useClick, useDismiss, useFloating, useInteractions, useRole, } from "@floating-ui/react";
3
- import { cva } from "class-variance-authority";
4
- import { XIcon } from "lucide-react";
5
- import { motion, MotionConfig, useMotionValue, animate } from "motion/react";
6
- import { Slot } from "../core/slot";
7
- import React, { forwardRef, Fragment, useEffect, useId, useImperativeHandle, useRef } from "react";
8
- import { useMediaQuery } from "../../hooks/use-media-query";
9
- import { css, mergeRefs } from "../../lib/dom";
10
- import { useFloatingRef } from "../../hooks/use-floating-ref";
11
- const animationDuration = "500ms";
12
- const drawerLeft = {
13
- exit: { x: ["0%", "-30%"], opacity: 0, animationDuration },
14
- enter: { x: ["-30%", "0%"], opacity: 1, animationDuration },
15
- initial: { x: ["-30%", "0%"], opacity: 0.8, animationDuration },
16
- };
17
- const drawerRight = {
18
- enter: { x: "0%", opacity: 1, animationDuration },
19
- exit: { x: ["0%", "30%"], opacity: 0, animationDuration },
20
- initial: { x: ["30%", "0%"], opacity: 0.8, animationDuration },
21
- };
22
- const animations = {
23
- drawer: (type) => (type === "left" ? drawerLeft : drawerRight),
24
- sheet: {
25
- enter: { opacity: 1, y: "0%", animationDuration, transformOrigin: "bottom" },
26
- exit: { opacity: 0.4, y: "10%", animationDuration, transformOrigin: "bottom" },
27
- initial: { opacity: 0.7, y: "10%", animationDuration, transformOrigin: "bottom" },
28
- },
29
- dialog: {
30
- exit: { opacity: 0, scale: 0.95, animationDuration },
31
- enter: { opacity: 1, scale: [1.05, 1], animationDuration },
32
- initial: { opacity: 0.5, scale: 0.95, animationDuration, transition: { duration: 0.5, ease: "easeInOut" } },
33
- },
34
- };
35
- const variants = cva("z-floating border border-floating-border ring-0 outline-0 appearance-none flex flex-col gap-4 flex-nowrap min-w-xs bg-floating-background", {
36
- variants: {
37
- type: {
38
- drawer: "max-h-screen max-w-[90%] absolute w-fit h-screen min-h-0",
39
- dialog: "max-h-[calc(100lvh-10%)] relative container h-min rounded-lg py-4",
40
- sheet: "w-screen absolute bottom-0 max-h-[calc(100vh-15%)] max-h-[calc(100svh-5%)] h-screen pt-6 pb-4 rounded-t-lg",
41
- },
42
- position: {
43
- none: "",
44
- right: "py-4 absolute right-0 top-0 rounded-l-lg",
45
- left: "py-4 absolute left-0 top-0 rounded-r-lg",
46
- },
47
- },
48
- defaultVariants: { position: "right", type: "dialog" },
49
- });
50
- const dragConstraints = { top: 0, left: 0, right: 0, bottom: 0 };
51
- const calculateClose = (n) => n * 0.6;
52
- const Draggable = (props) => {
53
- const onDrag = (e, info) => {
54
- if (props.parent.current) {
55
- e.stopPropagation();
56
- e.stopImmediatePropagation();
57
- if (props.sheet) {
58
- const div = props.parent.current;
59
- const rect = div.getBoundingClientRect();
60
- const v = props.value.get() || rect.height;
61
- const result = Math.abs(v - info.delta.y);
62
- const max = window.outerHeight;
63
- const screenHeightToClose = calculateClose(max);
64
- if (result >= screenHeightToClose)
65
- return props.value.set(result);
66
- if (document.activeElement instanceof HTMLElement) {
67
- document.activeElement?.blur();
68
- }
69
- props.onChange(false);
70
- return setTimeout(() => props.value.set(undefined), 350);
71
- }
72
- const div = props.parent.current;
73
- const v = props.value.get() || div.getBoundingClientRect().width;
74
- const delta = props.position === "right" ? -info.delta.x : info.delta.x;
75
- const value = Math.abs(v + delta);
76
- return props.value.set(value);
77
- }
78
- };
79
- return (<motion.button draggable dragListener dragMomentum type="button" animate={false} dragElastic={0} dragPropagation initial={false} onDrag={onDrag} dragSnapToOrigin dragDirectionLock drag={props.sheet ? "y" : "x"} dragConstraints={dragConstraints} whileDrag={{ cursor: "grabbing" }} className={css("absolute rounded-lg isolate z-calendar", props.sheet ? "cursor-row-resize" : "cursor-col-resize bg-floating-border", props.sheet
80
- ? "top-1 flex h-3 w-full justify-center py-2"
81
- : props.position === "left"
82
- ? "right-5 top-1/2 h-10 w-2"
83
- : "left-2 top-1/2 h-10 w-2")}>
84
- {props.sheet ? <div className="w-1/4 h-2 rounded-lg bg-floating-border"/> : null}
85
- </motion.button>);
86
- };
87
- const positions = { drawer: "right", sheet: "none", dialog: "none" };
88
- const fetchPosition = (isDesktop, forceType, propsType, propsPosition) => {
89
- const type = propsType || "dialog";
90
- if (isDesktop)
91
- return propsType === "drawer" ? (propsPosition ?? positions.drawer) : positions[type];
92
- return forceType ? positions[type] : positions.sheet;
93
- };
94
- const noop = [];
95
- export const Modal = forwardRef(({ open, title, footer, asChild, trigger, children, onChange, ariaTitle, className, bodyClassName, resizer = true, animated = true, closable = true, forceType = false, layoutId = undefined, overlayClassName = "", type: _type = "dialog", position: propsPosition, overlayClickClose = false, closeOnFocusOut = false, interactions: outInteractions = noop, ...props }, externalRef) => {
96
- const root = useFloatingRef();
97
- const innerContent = useRef(null);
98
- const removeScrollRef = useRef(null);
99
- const headingId = useId();
100
- const descriptionId = useId();
101
- const isDesktop = useMediaQuery("(min-width: 64rem)");
102
- const position = fetchPosition(isDesktop, forceType, _type, propsPosition);
103
- const func = isDesktop ? animations[_type] : forceType ? animations[_type] : animations.sheet;
104
- const animation = typeof func === "function" ? func(position) : func;
105
- const type = isDesktop ? _type : forceType ? _type : "sheet";
106
- const useResizer = type !== "dialog";
107
- const floating = useFloating({ open, onOpenChange: onChange, strategy: "fixed" });
108
- const click = useClick(floating.context, {});
109
- const role = useRole(floating.context, { role: "dialog" });
110
- const dismiss = useDismiss(floating.context, {
111
- bubbles: true,
112
- escapeKey: true,
113
- outsidePress: (event) => {
114
- const target = event.target;
115
- return overlayClickClose && !!target?.isConnected;
116
- },
117
- });
118
- const interactions = useInteractions([click, dismiss, role].concat(outInteractions));
119
- const Trigger = trigger;
120
- const floatingSize = useMotionValue(undefined);
121
- const sheetY = useMotionValue(undefined);
122
- const isDragging = useRef(false);
123
- const dragStart = useRef(0);
124
- useEffect(() => {
125
- floatingSize.set(undefined);
126
- sheetY.set(undefined);
127
- }, [type, floatingSize, sheetY]);
128
- const onClose = () => onChange(false);
129
- useImperativeHandle(externalRef, () => ({ context: floating.context, floating: removeScrollRef.current }), [floating.context, removeScrollRef]);
130
- const onDragHeader = (_, info) => {
131
- const div = floating.refs.floating.current;
132
- const rect = div.getBoundingClientRect();
133
- const v = floatingSize.get() || rect.height;
134
- const result = Math.abs(v - info.delta.y);
135
- const max = window.outerHeight;
136
- const screenHeightToClose = calculateClose(max);
137
- if (result >= screenHeightToClose)
138
- return floatingSize.set(result);
139
- if (document.activeElement instanceof HTMLElement) {
140
- document.activeElement?.blur();
141
- }
142
- onChange?.(false);
143
- return setTimeout(() => floatingSize.set(undefined), 350);
144
- };
145
- const draggableMotionProps = type === "sheet" ? {
146
- drag: "y",
147
- animate: false,
148
- dragElastic: 0,
149
- initial: false,
150
- dragConstraints,
151
- draggable: true,
152
- dragListener: true,
153
- dragMomentum: true,
154
- onDrag: onDragHeader,
155
- dragPropagation: true,
156
- dragSnapToOrigin: true,
157
- dragDirectionLock: true,
158
- whileDrag: { cursor: "grabbing" },
159
- } : { animate: animated, initial: false };
160
- const scrollInitial = useMotionValue(undefined);
161
- const scroll = useMotionValue(undefined);
162
- const Component = asChild ? Slot : motion.button;
163
- return (<Fragment>
164
- {trigger ? (<Component ref={floating.refs.setReference} {...interactions.getReferenceProps()} layoutId={layoutId} type="button">
165
- {Trigger}
166
- </Component>) : null}
167
- <FloatingPortal preserveTabOrder root={root}>
168
- {open ? (<FloatingOverlay lockScroll className={css("inset-0 flex isolate bg-floating-overlay/70 z-overlay h-dvh overflow-clip!", type === "drawer" ? "" : "items-start justify-center lg:p-10 pt-10", overlayClassName)}>
169
- <MotionConfig reducedMotion={animated ? "user" : "always"}>
170
- <FloatingFocusManager guards modal closeOnFocusOut={closeOnFocusOut} context={floating.context}>
171
- <motion.div {...props} {...(title
172
- ? {
173
- "aria-labelledby": headingId,
174
- "aria-describedby": descriptionId,
175
- }
176
- : { "aria-label": ariaTitle })} {...interactions.getFloatingProps({
177
- "aria-modal": open,
178
- ref: mergeRefs(floating.refs.setFloating, removeScrollRef),
179
- className: css(variants({ position, type }), className, "isolate overscroll-contain"),
180
- })} exit="exit" layout={true} animate="enter" initial="initial" layoutId={layoutId} variants={animation} data-component="modal" style={type === "drawer" ? { width: floatingSize } : { height: floatingSize, y: sheetY }}>
181
- {useResizer && resizer ? (<Draggable onChange={onChange} value={floatingSize} sheet={type === "sheet"} position={position} parent={floating.refs.floating}/>) : null}
182
- {title ? (<motion.header {...draggableMotionProps} className="relative w-full isolate">
183
- {title ? (<h2 id={headingId} className="block px-8 pb-2 text-3xl font-medium leading-relaxed border-b select-text border-floating-border">
184
- {title}
185
- </h2>) : null}
186
- </motion.header>) : null}
187
- <motion.section ref={innerContent} data-component="modal-body" className={css("flex-1 select-text overflow-y-auto px-8 py-1", bodyClassName)} onTouchEnd={async () => {
188
- scroll.set(undefined);
189
- scrollInitial.set(undefined);
190
- if (isDragging.current) {
191
- const currentY = sheetY.get() || 0;
192
- const threshold = window.innerHeight * 0.2;
193
- if (currentY > threshold) {
194
- await animate(sheetY, window.innerHeight, { duration: 0.2, ease: "easeIn" }).finished;
195
- onChange(false);
196
- }
197
- else {
198
- animate(sheetY, 0, { type: "spring", bounce: 0, duration: 0.3 });
199
- }
200
- isDragging.current = false;
201
- }
202
- }} onTouchStart={(e) => {
203
- const touch = e.changedTouches[0];
204
- scrollInitial.set(touch.pageY);
205
- scroll.set(touch.pageY);
206
- isDragging.current = false;
207
- }} onTouchMove={(e) => {
208
- const touch = e.changedTouches[0];
209
- const y = touch.pageY;
210
- const prevY = scroll.get() || y;
211
- const scrollTop = innerContent.current?.scrollTop || 0;
212
- if (!isDragging.current && scrollTop <= 0 && y > prevY && type === "sheet") {
213
- isDragging.current = true;
214
- dragStart.current = y;
215
- }
216
- if (isDragging.current) {
217
- const delta = y - dragStart.current;
218
- if (delta < 0) {
219
- sheetY.set(delta * 0.2);
220
- }
221
- else {
222
- sheetY.set(delta);
223
- }
224
- }
225
- scroll.set(y);
226
- }}>
227
- {children}
228
- </motion.section>
229
- {footer ? (<footer className="px-8 pt-4 w-full border-t select-text border-floating-border">{footer}</footer>) : null}
230
- {closable ? (<nav className="absolute top-1 right-4 z-floating">
231
- <button type="button" onClick={onClose} className="p-1 opacity-70 transition-colors hover:opacity-100 hover:text-danger focus:text-danger">
232
- <XIcon />
233
- </button>
234
- </nav>) : null}
235
- </motion.div>
236
- </FloatingFocusManager>
237
- </MotionConfig>
238
- </FloatingOverlay>) : null}
239
- </FloatingPortal>
240
- </Fragment>);
241
- });
@@ -1,5 +0,0 @@
1
- "use client";
2
- import { motion } from "motion/react";
3
- export const Toolbar = (props) => (<motion.div className="sticky bottom-4 flex items-center justify-center rounded-lg border border-card-border bg-background p-4">
4
- {props.children}
5
- </motion.div>);
@@ -1,64 +0,0 @@
1
- "use client";
2
- import { arrow, autoPlacement, autoUpdate, flip, FloatingArrow, FloatingPortal, offset, safePolygon, shift, useClick, useClientPoint, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole, } from "@floating-ui/react";
3
- import React, { forwardRef, Fragment, useEffect, useRef, useState } from "react";
4
- import { Polymorph } from "../../components/core/polymorph";
5
- import { FLOATING_DELAY } from "../../constants";
6
- import { mergeRefs } from "../../lib/dom";
7
- import { noop } from "../../lib/fns";
8
- export const Tooltip = forwardRef(function Tooltip({ as, open, title, children, placement, focus = true, hover = true, enabled = true, popover = true, onChange = noop, followCursor = false, ...props }, outerRef) {
9
- const [innerOpen, setInnerOpen] = useState(open ?? false);
10
- const arrowRef = useRef(null);
11
- const Component = as || "span";
12
- const toggleBoth = (b) => {
13
- setInnerOpen(b);
14
- onChange?.(b);
15
- };
16
- const { refs, floatingStyles, context } = useFloating({
17
- placement,
18
- open: innerOpen,
19
- whileElementsMounted: autoUpdate,
20
- onOpenChange: open ? undefined : toggleBoth,
21
- middleware: [
22
- shift(),
23
- offset(5),
24
- autoPlacement(),
25
- arrow({ padding: 5, element: arrowRef }),
26
- flip({ fallbackAxisSideDirection: "start" }),
27
- ],
28
- });
29
- const dismiss = useDismiss(context, { enabled });
30
- const role = useRole(context, { role: "tooltip", enabled });
31
- const focusController = useFocus(context, { enabled: enabled ? focus : false });
32
- const clickController = useClick(context, { enabled: enabled ? popover : false });
33
- const clientPoint = useClientPoint(context, { enabled: !!enabled && !!followCursor });
34
- const hoverController = useHover(context, {
35
- move: true,
36
- delay: { open: FLOATING_DELAY },
37
- enabled: enabled ? hover : false,
38
- handleClose: popover ? safePolygon() : null,
39
- });
40
- const { getReferenceProps, getFloatingProps } = useInteractions([
41
- role,
42
- dismiss,
43
- clientPoint,
44
- focus ? focusController : undefined,
45
- hover ? hoverController : undefined,
46
- popover ? clickController : undefined,
47
- ]);
48
- useEffect(() => {
49
- if (open === undefined)
50
- return setInnerOpen(false);
51
- return setInnerOpen(open);
52
- }, [open]);
53
- return (<Fragment>
54
- <Component {...getReferenceProps(props)} ref={mergeRefs(refs.setReference, outerRef)}>
55
- {title}
56
- </Component>
57
- {innerOpen && (<FloatingPortal>
58
- <Polymorph {...getFloatingProps()} ref={refs.setFloating} style={floatingStyles} className="p-3 rounded-lg border isolate z-tooltip border-tooltip-border bg-tooltip-background text-tooltip-foreground shadow-shadow-floating">
59
- <FloatingArrow ref={arrowRef} context={context} strokeWidth={0.1} className="fill-tooltip-background stroke-tooltip-border"/>
60
- {children}
61
- </Polymorph>
62
- </FloatingPortal>)}
63
- </Fragment>);
64
- });
@@ -1,164 +0,0 @@
1
- "use client";
2
- import { arrow, autoUpdate, flip, FloatingArrow, FloatingPortal, offset, shift, useFloating, useInteractions, useRole, } from "@floating-ui/react";
3
- import { AnimatePresence, motion } from "motion/react";
4
- import React, { Fragment, useEffect, useLayoutEffect, useRef, useState } from "react";
5
- import { useResizeObserver } from "../../hooks/use-resize-observer";
6
- import { useTranslations } from "../../hooks/use-translations";
7
- import { useWindowSize } from "../../hooks/use-window-size";
8
- import { noop } from "../../lib/fns";
9
- import { Button } from "../core/button";
10
- const getRect = (element) => {
11
- if (!element)
12
- return { top: 0, left: 0, width: 0, height: 0, bottom: 0, right: 0 };
13
- return element.getBoundingClientRect();
14
- };
15
- const resolveElement = (element) => {
16
- if (typeof element === 'string') {
17
- return document.querySelector(element);
18
- }
19
- if ('current' in element) {
20
- return element.current;
21
- }
22
- return element;
23
- };
24
- export const Wizard = ({ steps, active = false, onClose = noop, onFinish = noop, onChange = noop, labels: labelsProp, }) => {
25
- const translation = useTranslations();
26
- const [index, setIndex] = useState(0);
27
- const currentStep = steps[index];
28
- const [element, setElement] = useState(null);
29
- const [rect, setRect] = useState(getRect(null));
30
- const [isOverlayReady, setIsOverlayReady] = useState(false);
31
- const arrowRef = useRef(null);
32
- const { width, height } = useWindowSize();
33
- const labels = {
34
- next: labelsProp?.next ?? translation.driverNext,
35
- previous: labelsProp?.previous ?? translation.driverPrevious,
36
- finish: labelsProp?.finish ?? translation.driverFinish,
37
- skip: labelsProp?.skip ?? translation.driverSkip,
38
- };
39
- const { refs, floatingStyles, context } = useFloating({
40
- open: active && isOverlayReady,
41
- placement: currentStep?.side || "bottom",
42
- whileElementsMounted: autoUpdate,
43
- middleware: [
44
- offset(10),
45
- flip(),
46
- shift(),
47
- arrow({ element: arrowRef }),
48
- ],
49
- });
50
- const { getFloatingProps } = useInteractions([useRole(context),]);
51
- useEffect(() => {
52
- if (active) {
53
- setIndex(0);
54
- }
55
- }, [active]);
56
- useEffect(() => {
57
- setIsOverlayReady(false);
58
- }, [index, active]);
59
- useEffect(() => {
60
- if (!active || !currentStep)
61
- return;
62
- const el = resolveElement(currentStep.element);
63
- if (el) {
64
- currentStep.onEnter?.();
65
- setTimeout(() => {
66
- setRect(el.getBoundingClientRect());
67
- refs.setReference(el);
68
- setElement(el);
69
- }, 100);
70
- }
71
- else {
72
- console.warn(`Driver: Element not found:`, currentStep.element);
73
- setElement(null);
74
- setRect({ top: 0, left: 0, width: 0, height: 0, bottom: 0, right: 0 });
75
- }
76
- }, [index, active, currentStep, refs]);
77
- useLayoutEffect(() => {
78
- if (!element)
79
- return;
80
- const update = () => setRect(element.getBoundingClientRect());
81
- update();
82
- window.addEventListener("scroll", update, { capture: true, passive: true });
83
- window.addEventListener("resize", update, { capture: true, passive: true });
84
- return () => {
85
- window.removeEventListener("scroll", update, { capture: true });
86
- window.removeEventListener("resize", update, { capture: true });
87
- };
88
- }, [element, width, height]);
89
- useResizeObserver(element, (entry) => {
90
- setRect(entry.target.getBoundingClientRect());
91
- });
92
- const handleNext = () => {
93
- currentStep.onNext?.();
94
- setTimeout(() => {
95
- if (index < steps.length - 1) {
96
- setIndex((i) => i + 1);
97
- onChange(index + 1);
98
- }
99
- else {
100
- onFinish();
101
- onClose();
102
- }
103
- }, 0);
104
- };
105
- const handlePrevious = () => {
106
- currentStep.onPrevious?.();
107
- if (index > 0) {
108
- setIndex((i) => i - 1);
109
- onChange(index - 1);
110
- }
111
- };
112
- if (!active)
113
- return null;
114
- const hasNext = index < steps.length - 1;
115
- const hasPrevious = index > 0;
116
- return (<FloatingPortal>
117
- <div className="fixed inset-0 pointer-events-none z-wizard">
118
- <svg className="absolute inset-0 w-full h-full fill-current text-floating-overlay/70" xmlns="http://www.w3.org/2000/svg">
119
- <defs>
120
- <mask id="driver-mask">
121
- <rect x="0" y="0" width="100%" height="100%" fill="white"/>
122
- <motion.rect rx="4" fill="black" initial={false} onAnimationComplete={() => setIsOverlayReady(true)} transition={{ type: "spring", duration: 0.5, ease: "easeInOut" }} animate={{
123
- x: rect.left - 5,
124
- y: rect.top - 5,
125
- width: rect.width + 10,
126
- height: rect.height + 10
127
- }}/>
128
- </mask>
129
- </defs>
130
- <rect x="0" y="0" width="100%" height="100%" mask="url(#driver-mask)" className="pointer-events-auto"/>
131
- </svg>
132
- <AnimatePresence mode="wait">
133
- {currentStep && isOverlayReady && (<div {...getFloatingProps()} ref={refs.setFloating} style={element ? floatingStyles : {
134
- position: "fixed",
135
- top: "50%",
136
- left: "50%",
137
- transform: "translate(-50%, -50%)"
138
- }} className="outline-hidden pointer-events-auto">
139
- <motion.div transition={{ duration: 0.2 }} exit={{ opacity: 0, scale: 0.9 }} animate={{ opacity: 1, scale: 1 }} initial={{ opacity: 0, scale: 0.9 }} className="flex flex-col gap-3 p-4 w-80 max-w-sm rounded-lg border shadow-lg bg-card-background border-card-border">
140
- {element && (<FloatingArrow ref={arrowRef} context={context} className="fill-card-background stroke-card-border"/>)}
141
- {currentStep.title && (<h3>{currentStep.title}</h3>)}
142
- {currentStep.description && (<Fragment>{currentStep.description}</Fragment>)}
143
- <div className="flex justify-between items-center pt-2 mt-2 border-t border-floating-border">
144
- <Button theme="raw" size="small" onClick={onClose} className="text-xs text-muted-foreground hover:text-foreground">
145
- {labels.skip}
146
- </Button>
147
- <div className="flex gap-2">
148
- {hasPrevious && (<Button size="small" theme="neutral" onClick={handlePrevious}>
149
- {labels.previous}
150
- </Button>)}
151
- <Button size="small" onClick={handleNext}>
152
- {hasNext ? labels.next : labels.finish}
153
- </Button>
154
- </div>
155
- </div>
156
- <div className="absolute top-2 right-2 text-xs text-muted-foreground">
157
- {index + 1} / {steps.length}
158
- </div>
159
- </motion.div>
160
- </div>)}
161
- </AnimatePresence>
162
- </div>
163
- </FloatingPortal>);
164
- };