@g4rcez/components 2.0.32 → 2.0.33

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 (184) hide show
  1. package/dist/components/core/{button.js → button.jsx} +5 -3
  2. package/dist/components/core/heading.d.ts +1 -1
  3. package/dist/components/core/heading.d.ts.map +1 -1
  4. package/dist/components/core/heading.jsx +4 -0
  5. package/dist/components/core/{polymorph.js → polymorph.jsx} +1 -2
  6. package/dist/components/core/render-on-view.d.ts +1 -1
  7. package/dist/components/core/render-on-view.d.ts.map +1 -1
  8. package/dist/components/core/{render-on-view.js → render-on-view.jsx} +4 -3
  9. package/dist/components/core/resizable.d.ts +1 -1
  10. package/dist/components/core/resizable.d.ts.map +1 -1
  11. package/dist/components/core/{resizable.js → resizable.jsx} +4 -3
  12. package/dist/components/core/{slot.js → slot.jsx} +8 -5
  13. package/dist/components/core/{tag.js → tag.jsx} +6 -3
  14. package/dist/components/core/typography.d.ts +5 -5
  15. package/dist/components/core/typography.d.ts.map +1 -1
  16. package/dist/components/core/typography.jsx +26 -0
  17. package/dist/components/display/alert.d.ts +1 -1
  18. package/dist/components/display/alert.d.ts.map +1 -1
  19. package/dist/components/display/alert.jsx +56 -0
  20. package/dist/components/display/calendar.d.ts +1 -1
  21. package/dist/components/display/calendar.d.ts.map +1 -1
  22. package/dist/components/display/{calendar.js → calendar.jsx} +83 -21
  23. package/dist/components/display/card.d.ts +3 -3
  24. package/dist/components/display/card.d.ts.map +1 -1
  25. package/dist/components/display/card.jsx +43 -0
  26. package/dist/components/display/empty.d.ts +1 -1
  27. package/dist/components/display/empty.d.ts.map +1 -1
  28. package/dist/components/display/empty.jsx +11 -0
  29. package/dist/components/display/list.d.ts +2 -2
  30. package/dist/components/display/list.d.ts.map +1 -1
  31. package/dist/components/display/list.jsx +81 -0
  32. package/dist/components/display/notifications.d.ts +1 -1
  33. package/dist/components/display/notifications.d.ts.map +1 -1
  34. package/dist/components/display/{notifications.js → notifications.jsx} +34 -10
  35. package/dist/components/display/progress.d.ts +1 -1
  36. package/dist/components/display/progress.d.ts.map +1 -1
  37. package/dist/components/display/progress.jsx +13 -0
  38. package/dist/components/display/shortcut.d.ts +1 -1
  39. package/dist/components/display/shortcut.d.ts.map +1 -1
  40. package/dist/components/display/shortcut.jsx +23 -0
  41. package/dist/components/display/skeleton.d.ts +4 -4
  42. package/dist/components/display/skeleton.d.ts.map +1 -1
  43. package/dist/components/display/skeleton.jsx +14 -0
  44. package/dist/components/display/spinner.d.ts +2 -2
  45. package/dist/components/display/spinner.d.ts.map +1 -1
  46. package/dist/components/display/spinner.jsx +7 -0
  47. package/dist/components/display/stats.d.ts +1 -1
  48. package/dist/components/display/stats.d.ts.map +1 -1
  49. package/dist/components/display/stats.jsx +20 -0
  50. package/dist/components/display/step.d.ts +2 -2
  51. package/dist/components/display/step.d.ts.map +1 -1
  52. package/dist/components/display/step.jsx +133 -0
  53. package/dist/components/display/tabs.d.ts +3 -3
  54. package/dist/components/display/tabs.d.ts.map +1 -1
  55. package/dist/components/display/{tabs.js → tabs.jsx} +21 -7
  56. package/dist/components/display/timeline.d.ts +6 -6
  57. package/dist/components/display/timeline.d.ts.map +1 -1
  58. package/dist/components/display/timeline.jsx +25 -0
  59. package/dist/components/floating/command-palette.d.ts +1 -1
  60. package/dist/components/floating/command-palette.d.ts.map +1 -1
  61. package/dist/components/floating/command-palette.jsx +187 -0
  62. package/dist/components/floating/dropdown.d.ts +1 -1
  63. package/dist/components/floating/dropdown.d.ts.map +1 -1
  64. package/dist/components/floating/{dropdown.js → dropdown.jsx} +17 -3
  65. package/dist/components/floating/expand.d.ts +1 -1
  66. package/dist/components/floating/expand.d.ts.map +1 -1
  67. package/dist/components/floating/{expand.js → expand.jsx} +14 -2
  68. package/dist/components/floating/{menu.js → menu.jsx} +52 -27
  69. package/dist/components/floating/modal.d.ts +10 -2
  70. package/dist/components/floating/modal.d.ts.map +1 -1
  71. package/dist/components/floating/modal.jsx +240 -0
  72. package/dist/components/floating/toolbar.d.ts +1 -1
  73. package/dist/components/floating/toolbar.d.ts.map +1 -1
  74. package/dist/components/floating/toolbar.jsx +5 -0
  75. package/dist/components/floating/{tooltip.js → tooltip.jsx} +12 -3
  76. package/dist/components/floating/wizard.d.ts +1 -1
  77. package/dist/components/floating/wizard.d.ts.map +1 -1
  78. package/dist/components/floating/{wizard.js → wizard.jsx} +64 -19
  79. package/dist/components/form/autocomplete.jsx +276 -0
  80. package/dist/components/form/checkbox.jsx +12 -0
  81. package/dist/components/form/{date-picker.js → date-picker.jsx} +15 -4
  82. package/dist/components/form/file-upload.d.ts +1 -1
  83. package/dist/components/form/file-upload.d.ts.map +1 -1
  84. package/dist/components/form/file-upload.jsx +133 -0
  85. package/dist/components/form/form.d.ts +1 -1
  86. package/dist/components/form/form.d.ts.map +1 -1
  87. package/dist/components/form/{form.js → form.jsx} +2 -2
  88. package/dist/components/form/{free-text.js → free-text.jsx} +4 -3
  89. package/dist/components/form/input-field.d.ts +1 -1
  90. package/dist/components/form/input-field.d.ts.map +1 -1
  91. package/dist/components/form/input-field.jsx +54 -0
  92. package/dist/components/form/multi-select.jsx +328 -0
  93. package/dist/components/form/radiobox.d.ts +1 -1
  94. package/dist/components/form/radiobox.d.ts.map +1 -1
  95. package/dist/components/form/radiobox.jsx +6 -0
  96. package/dist/components/form/select.jsx +42 -0
  97. package/dist/components/form/slider.d.ts +1 -1
  98. package/dist/components/form/slider.d.ts.map +1 -1
  99. package/dist/components/form/{slider.js → slider.jsx} +11 -3
  100. package/dist/components/form/switch.jsx +46 -0
  101. package/dist/components/form/task-list.d.ts +1 -1
  102. package/dist/components/form/task-list.d.ts.map +1 -1
  103. package/dist/components/form/{task-list.js → task-list.jsx} +1 -2
  104. package/dist/components/form/transfer-list.d.ts +1 -1
  105. package/dist/components/form/transfer-list.d.ts.map +1 -1
  106. package/dist/components/form/transfer-list.jsx +39 -0
  107. package/dist/components/table/filter.d.ts +2 -2
  108. package/dist/components/table/filter.d.ts.map +1 -1
  109. package/dist/components/table/{filter.js → filter.jsx} +35 -7
  110. package/dist/components/table/group.d.ts +1 -1
  111. package/dist/components/table/group.d.ts.map +1 -1
  112. package/dist/components/table/group.jsx +68 -0
  113. package/dist/components/table/index.d.ts +1 -1
  114. package/dist/components/table/index.d.ts.map +1 -1
  115. package/dist/components/table/{index.js → index.jsx} +10 -2
  116. package/dist/components/table/inner-table.d.ts +1 -1
  117. package/dist/components/table/inner-table.d.ts.map +1 -1
  118. package/dist/components/table/{inner-table.js → inner-table.jsx} +21 -9
  119. package/dist/components/table/metadata.d.ts +1 -1
  120. package/dist/components/table/metadata.d.ts.map +1 -1
  121. package/dist/components/table/metadata.jsx +37 -0
  122. package/dist/components/table/pagination.d.ts +1 -1
  123. package/dist/components/table/pagination.d.ts.map +1 -1
  124. package/dist/components/table/pagination.jsx +73 -0
  125. package/dist/components/table/row.d.ts +1 -1
  126. package/dist/components/table/row.d.ts.map +1 -1
  127. package/dist/components/table/row.jsx +58 -0
  128. package/dist/components/table/sort.d.ts +2 -2
  129. package/dist/components/table/sort.d.ts.map +1 -1
  130. package/dist/components/table/{sort.js → sort.jsx} +32 -6
  131. package/dist/components/table/thead.d.ts +2 -1
  132. package/dist/components/table/thead.d.ts.map +1 -1
  133. package/dist/components/table/thead.jsx +103 -0
  134. package/dist/config/default-translations.d.ts +1 -1
  135. package/dist/config/{default-translations.js → default-translations.jsx} +5 -3
  136. package/dist/flow/flow.d.ts +1 -1
  137. package/dist/flow/flow.d.ts.map +1 -1
  138. package/dist/flow/flow.jsx +111 -0
  139. package/dist/hooks/use-components-provider.d.ts +2 -2
  140. package/dist/hooks/use-components-provider.d.ts.map +1 -1
  141. package/dist/hooks/{use-components-provider.js → use-components-provider.jsx} +2 -3
  142. package/dist/hooks/use-translations.d.ts +1 -1
  143. package/dist/index.css +1 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/index.mjs +13463 -16070
  146. package/dist/index.mjs.map +1 -1
  147. package/dist/index.umd.js +14 -31
  148. package/dist/index.umd.js.map +1 -1
  149. package/package.json +1 -1
  150. package/dist/components/core/heading.js +0 -5
  151. package/dist/components/core/typography.js +0 -10
  152. package/dist/components/display/alert.js +0 -37
  153. package/dist/components/display/card.js +0 -18
  154. package/dist/components/display/empty.js +0 -8
  155. package/dist/components/display/list.js +0 -32
  156. package/dist/components/display/progress.js +0 -9
  157. package/dist/components/display/shortcut.js +0 -19
  158. package/dist/components/display/skeleton.js +0 -13
  159. package/dist/components/display/spinner.js +0 -6
  160. package/dist/components/display/stats.js +0 -5
  161. package/dist/components/display/step.js +0 -122
  162. package/dist/components/display/timeline.js +0 -14
  163. package/dist/components/floating/command-palette.js +0 -155
  164. package/dist/components/floating/modal.js +0 -195
  165. package/dist/components/floating/toolbar.js +0 -4
  166. package/dist/components/form/autocomplete.js +0 -247
  167. package/dist/components/form/checkbox.js +0 -7
  168. package/dist/components/form/file-upload.js +0 -88
  169. package/dist/components/form/input-field.js +0 -17
  170. package/dist/components/form/multi-select.js +0 -277
  171. package/dist/components/form/radiobox.js +0 -3
  172. package/dist/components/form/select.js +0 -31
  173. package/dist/components/form/switch.js +0 -36
  174. package/dist/components/form/transfer-list.js +0 -22
  175. package/dist/components/table/group.js +0 -41
  176. package/dist/components/table/metadata.js +0 -10
  177. package/dist/components/table/pagination.js +0 -42
  178. package/dist/components/table/row.js +0 -47
  179. package/dist/components/table/thead.js +0 -71
  180. package/dist/flow/flow.js +0 -77
  181. /package/dist/components/form/{formReset.js → formReset.jsx} +0 -0
  182. /package/dist/components/form/{input.js → input.jsx} +0 -0
  183. /package/dist/components/form/{textarea.js → textarea.jsx} +0 -0
  184. /package/dist/components/table/{table.context.js → table.context.jsx} +0 -0
@@ -0,0 +1,240 @@
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 { AnimatePresence, motion, MotionConfig, useMotionValue } 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
+ const animationDuration = "500ms";
11
+ const drawerLeft = {
12
+ exit: { x: ["0%", "-30%"], opacity: 0, animationDuration },
13
+ enter: { x: ["-30%", "0%"], opacity: 1, animationDuration },
14
+ initial: { x: ["-30%", "0%"], opacity: 0.8, animationDuration },
15
+ };
16
+ const drawerRight = {
17
+ enter: { x: "0%", opacity: 1, animationDuration },
18
+ exit: { x: ["0%", "30%"], opacity: 0, animationDuration },
19
+ initial: { x: ["30%", "0%"], opacity: 0.8, animationDuration },
20
+ };
21
+ const animations = {
22
+ drawer: (type) => (type === "left" ? drawerLeft : drawerRight),
23
+ sheet: {
24
+ enter: { opacity: 1, y: "0%", animationDuration, transformOrigin: "bottom" },
25
+ exit: { opacity: 0.4, y: "10%", animationDuration, transformOrigin: "bottom" },
26
+ initial: { opacity: 0.7, y: "10%", animationDuration, transformOrigin: "bottom" },
27
+ },
28
+ dialog: {
29
+ exit: { opacity: 0, scale: 0.95, animationDuration },
30
+ enter: { opacity: 1, scale: [1.05, 1], animationDuration },
31
+ initial: { opacity: 0.5, scale: 0.95, animationDuration, transition: { duration: 0.5, ease: "easeInOut" } },
32
+ },
33
+ };
34
+ const variants = cva("z-floating border border-card-border ring-0 outline-0 appearance-none flex flex-col gap-4 flex-nowrap min-w-xs bg-floating-background", {
35
+ variants: {
36
+ type: {
37
+ drawer: "max-h-screen max-w-[90%] absolute w-fit h-screen min-h-0",
38
+ dialog: "max-h-[calc(100lvh-10%)] relative container h-min rounded-lg py-4",
39
+ 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",
40
+ },
41
+ position: {
42
+ none: "",
43
+ right: "py-4 absolute right-0 top-0 rounded-l-lg",
44
+ left: "py-4 absolute left-0 top-0 rounded-r-lg",
45
+ },
46
+ },
47
+ defaultVariants: { position: "right", type: "dialog" },
48
+ });
49
+ const dragConstraints = { top: 0, left: 0, right: 0, bottom: 0 };
50
+ const calculateClose = (n) => n * 0.6;
51
+ const Draggable = (props) => {
52
+ const onDrag = (e, info) => {
53
+ if (props.parent.current) {
54
+ e.stopPropagation();
55
+ e.stopImmediatePropagation();
56
+ if (props.sheet) {
57
+ const div = props.parent.current;
58
+ const rect = div.getBoundingClientRect();
59
+ const v = props.value.get() || rect.height;
60
+ const result = Math.abs(v - info.delta.y);
61
+ const max = window.outerHeight;
62
+ const screenHeightToClose = calculateClose(max);
63
+ if (result >= screenHeightToClose)
64
+ return props.value.set(result);
65
+ if (document.activeElement instanceof HTMLElement) {
66
+ document.activeElement?.blur();
67
+ }
68
+ props.onChange(false);
69
+ return setTimeout(() => props.value.set(undefined), 350);
70
+ }
71
+ const div = props.parent.current;
72
+ const v = props.value.get() || div.getBoundingClientRect().width;
73
+ const delta = props.position === "right" ? -info.delta.x : info.delta.x;
74
+ const value = Math.abs(v + delta);
75
+ return props.value.set(value);
76
+ }
77
+ };
78
+ 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
79
+ ? "top-1 flex h-3 w-full justify-center py-2"
80
+ : props.position === "left"
81
+ ? "right-5 top-1/2 h-10 w-2"
82
+ : "left-2 top-1/2 h-10 w-2")}>
83
+ {props.sheet ? <div className="w-1/4 h-2 rounded-lg bg-floating-border"/> : null}
84
+ </motion.button>);
85
+ };
86
+ const positions = { drawer: "right", sheet: "none", dialog: "none" };
87
+ const fetchPosition = (isDesktop, forceType, propsType, propsPosition) => {
88
+ const type = propsType || "dialog";
89
+ if (isDesktop)
90
+ return propsType === "drawer" ? (propsPosition ?? positions.drawer) : positions[type];
91
+ return forceType ? positions[type] : positions.sheet;
92
+ };
93
+ const noop = [];
94
+ 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, role: roleName = "dialog", interactions: outInteractions = noop, ...props }, externalRef) => {
95
+ const innerContent = useRef(null);
96
+ const removeScrollRef = useRef(null);
97
+ const headingId = useId();
98
+ const descriptionId = useId();
99
+ const isDesktop = useMediaQuery("(min-width: 64rem)");
100
+ const position = fetchPosition(isDesktop, forceType, _type, propsPosition);
101
+ const func = isDesktop ? animations[_type] : forceType ? animations[_type] : animations.sheet;
102
+ const animation = typeof func === "function" ? func(position) : func;
103
+ const type = isDesktop ? _type : forceType ? _type : "sheet";
104
+ const useResizer = type !== "dialog";
105
+ const floating = useFloating({ open, onOpenChange: onChange, strategy: "fixed" });
106
+ const click = useClick(floating.context, {});
107
+ const role = useRole(floating.context, { role: roleName });
108
+ const dismiss = useDismiss(floating.context, {
109
+ bubbles: true,
110
+ escapeKey: true,
111
+ ancestorScroll: true,
112
+ outsidePress: overlayClickClose,
113
+ });
114
+ const interactions = useInteractions([click, dismiss, role].concat(outInteractions));
115
+ const Trigger = trigger;
116
+ const floatingSize = useMotionValue(undefined);
117
+ useEffect(() => floatingSize.set(undefined), [type, floatingSize]);
118
+ const onClose = () => onChange(false);
119
+ useImperativeHandle(externalRef, () => ({ context: floating.context, floating: removeScrollRef.current }), [floating.context, removeScrollRef]);
120
+ const onDragHeader = (_, info) => {
121
+ const div = floating.refs.floating.current;
122
+ const rect = div.getBoundingClientRect();
123
+ const v = floatingSize.get() || rect.height;
124
+ const result = Math.abs(v - info.delta.y);
125
+ const max = window.outerHeight;
126
+ const screenHeightToClose = calculateClose(max);
127
+ if (result >= screenHeightToClose)
128
+ return floatingSize.set(result);
129
+ if (document.activeElement instanceof HTMLElement) {
130
+ document.activeElement?.blur();
131
+ }
132
+ onChange?.(false);
133
+ return setTimeout(() => floatingSize.set(undefined), 350);
134
+ };
135
+ const onDragBody = (_, info) => {
136
+ const div = floating.refs.floating.current;
137
+ if (info.delta.y < 0 && info.offset.y < 0) {
138
+ div.scrollTo({ top: div.scrollTop + Math.abs(info.offset.y), behavior: "smooth" });
139
+ return;
140
+ }
141
+ const rect = div.getBoundingClientRect();
142
+ const v = floatingSize.get() || rect.height;
143
+ const result = Math.abs(v - info.delta.y);
144
+ const max = window.outerHeight;
145
+ const screenHeightToClose = calculateClose(max);
146
+ if (result >= screenHeightToClose)
147
+ return floatingSize.set(result);
148
+ if (document.activeElement instanceof HTMLElement) {
149
+ document.activeElement?.blur();
150
+ }
151
+ onChange?.(false);
152
+ return setTimeout(() => floatingSize.set(undefined), 350);
153
+ };
154
+ const draggableMotionProps = type === "sheet" ? {
155
+ drag: "y",
156
+ animate: false,
157
+ dragElastic: 0,
158
+ initial: false,
159
+ dragConstraints,
160
+ draggable: true,
161
+ dragListener: true,
162
+ dragMomentum: true,
163
+ onDrag: onDragHeader,
164
+ dragPropagation: true,
165
+ dragSnapToOrigin: true,
166
+ dragDirectionLock: true,
167
+ whileDrag: { cursor: "grabbing" },
168
+ } : { animate: animated, initial: false };
169
+ const scrollInitial = useMotionValue(undefined);
170
+ const scroll = useMotionValue(undefined);
171
+ const Component = asChild ? Slot : motion.button;
172
+ return (<Fragment>
173
+ {trigger ? (<Component ref={floating.refs.setReference} {...interactions.getReferenceProps()} layoutId={layoutId} type="button">
174
+ {Trigger}
175
+ </Component>) : null}
176
+ <FloatingPortal preserveTabOrder>
177
+ <AnimatePresence custom presenceAffectsLayout propagate mode="sync" initial={false}>
178
+ {open ? (<FloatingOverlay lockScroll className={css("inset-0 flex isolate bg-floating-overlay/70 z-overlay h-[100dvh] !overflow-clip", type === "drawer" ? "" : "items-start justify-center p-10", overlayClassName)}>
179
+ <MotionConfig reducedMotion={animated ? "user" : "always"}>
180
+ <FloatingFocusManager guards visuallyHiddenDismiss modal closeOnFocusOut context={floating.context}>
181
+ <motion.div {...props} {...(title
182
+ ? {
183
+ "aria-labelledby": headingId,
184
+ "aria-describedby": descriptionId,
185
+ }
186
+ : { "aria-label": ariaTitle })} {...interactions.getFloatingProps({
187
+ "aria-modal": open,
188
+ ref: mergeRefs(floating.refs.setFloating, removeScrollRef),
189
+ className: css(variants({ position, type }), className, "isolate overscroll-contain"),
190
+ })} exit="exit" layout={true} animate="enter" initial="initial" layoutId={layoutId} variants={animation} data-component="modal" style={type === "drawer" ? { width: floatingSize } : { height: floatingSize }}>
191
+ {useResizer && resizer ? (<Draggable onChange={onChange} value={floatingSize} sheet={type === "sheet"} position={position} parent={floating.refs.floating}/>) : null}
192
+ {title ? (<motion.header {...draggableMotionProps} className="relative w-full isolate">
193
+ {title ? (<h2 id={headingId} className="block px-8 pb-2 text-3xl font-medium leading-relaxed border-b select-text border-floating-border">
194
+ {title}
195
+ </h2>) : null}
196
+ </motion.header>) : null}
197
+ <motion.section ref={innerContent} data-component="modal-body" dragConstraints={dragConstraints} drag={isDesktop ? undefined : "y"} onDrag={type === "sheet" ? (isDesktop ? undefined : onDragBody) : undefined} className={css("flex-1 select-text overflow-y-auto px-8 py-1", bodyClassName)} onTouchEnd={() => {
198
+ scroll.set(undefined);
199
+ scrollInitial.set(undefined);
200
+ }} onTouchStart={e => {
201
+ const touch = e.changedTouches[0];
202
+ scrollInitial.set(touch.pageY);
203
+ scroll.set(touch.pageY);
204
+ }} onTouchMove={e => {
205
+ const touch = e.changedTouches[0];
206
+ const y = touch.pageY;
207
+ const initial = scrollInitial.get();
208
+ if (initial < y) {
209
+ const distanceFromTop = innerContent.current?.scrollTop;
210
+ if (distanceFromTop === 0) {
211
+ const div = floating.refs.floating.current;
212
+ const rect = div.getBoundingClientRect();
213
+ const v = floatingSize.get() || rect.height;
214
+ const diff = (initial - y) / 10;
215
+ const down = v + diff;
216
+ const max = window.outerHeight;
217
+ const screenHeightToClose = calculateClose(max);
218
+ if (down < screenHeightToClose)
219
+ onChange?.(false);
220
+ floatingSize.set(down);
221
+ }
222
+ }
223
+ scroll.set(touch.pageY);
224
+ }}>
225
+ {children}
226
+ </motion.section>
227
+ {footer ? (<footer className="px-8 pt-4 w-full border-t select-text border-floating-border">{footer}</footer>) : null}
228
+ {closable ? (<nav className="absolute top-1 right-4 z-floating">
229
+ <button type="button" onClick={onClose} className="p-1 opacity-70 transition-colors hover:opacity-100 hover:text-danger focus:text-danger">
230
+ <XIcon />
231
+ </button>
232
+ </nav>) : null}
233
+ </motion.div>
234
+ </FloatingFocusManager>
235
+ </MotionConfig>
236
+ </FloatingOverlay>) : null}
237
+ </AnimatePresence>
238
+ </FloatingPortal>
239
+ </Fragment>);
240
+ });
@@ -2,5 +2,5 @@ import { PropsWithChildren } from "react";
2
2
  export type ToolbarProps = {
3
3
  root?: HTMLElement;
4
4
  };
5
- export declare const Toolbar: (props: PropsWithChildren<ToolbarProps>) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const Toolbar: (props: PropsWithChildren<ToolbarProps>) => import("react").JSX.Element;
6
6
  //# sourceMappingURL=toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/floating/toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG;IACvB,IAAI,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,OAAO,iBAAiB,CAAC,YAAY,CAAC,4CAI7D,CAAC"}
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/floating/toolbar.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,MAAM,YAAY,GAAG;IACvB,IAAI,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,OAAO,iBAAiB,CAAC,YAAY,CAAC,gCAI7D,CAAC"}
@@ -0,0 +1,5 @@
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,7 +1,6 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
2
  import { arrow, autoPlacement, autoUpdate, flip, FloatingArrow, FloatingPortal, offset, safePolygon, shift, useClick, useClientPoint, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole, } from "@floating-ui/react";
4
- import { forwardRef, Fragment, useEffect, useRef, useState } from "react";
3
+ import React, { forwardRef, Fragment, useEffect, useRef, useState } from "react";
5
4
  import { Polymorph } from "../../components/core/polymorph";
6
5
  import { FLOATING_DELAY } from "../../constants";
7
6
  import { mergeRefs } from "../../lib/dom";
@@ -51,5 +50,15 @@ export const Tooltip = forwardRef(function Tooltip({ as, open, title, children,
51
50
  return setInnerOpen(false);
52
51
  return setInnerOpen(open);
53
52
  }, [open]);
54
- return (_jsxs(Fragment, { children: [_jsx(Component, { ...getReferenceProps(props), ref: mergeRefs(refs.setReference, outerRef), children: title }), innerOpen && (_jsx(FloatingPortal, { children: _jsxs(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", children: [_jsx(FloatingArrow, { ref: arrowRef, context: context, strokeWidth: 0.1, className: "fill-tooltip-background stroke-tooltip-border" }), children] }) }))] }));
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>);
55
64
  });
@@ -22,5 +22,5 @@ export type WizardProps = {
22
22
  previous?: string;
23
23
  };
24
24
  };
25
- export declare const Wizard: ({ steps, active, onClose, onFinish, onChange, labels: labelsProp, }: WizardProps) => import("react/jsx-runtime").JSX.Element | null;
25
+ export declare const Wizard: ({ steps, active, onClose, onFinish, onChange, labels: labelsProp, }: WizardProps) => React.JSX.Element | null;
26
26
  //# sourceMappingURL=wizard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/components/floating/wizard.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,SAAS,EAKV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAgF,MAAM,OAAO,CAAC;AAOrG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E,CAAC;AAiBF,eAAO,MAAM,MAAM,GAAI,qEAOpB,WAAW,mDAqLb,CAAC"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../../src/components/floating/wizard.tsx"],"names":[],"mappings":"AACA,OAAO,EAOL,SAAS,EAKV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAgF,MAAM,OAAO,CAAC;AAOrG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E,CAAC;AAiBF,eAAO,MAAM,MAAM,GAAI,qEAOpB,WAAW,6BAgMb,CAAC"}
@@ -1,8 +1,7 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
2
  import { arrow, autoUpdate, flip, FloatingArrow, FloatingPortal, offset, shift, useFloating, useInteractions, useRole, } from "@floating-ui/react";
4
3
  import { AnimatePresence, motion } from "motion/react";
5
- import { Fragment, useEffect, useLayoutEffect, useRef, useState } from "react";
4
+ import React, { Fragment, useEffect, useLayoutEffect, useRef, useState } from "react";
6
5
  import { useResizeObserver } from "../../hooks/use-resize-observer";
7
6
  import { useTranslations } from "../../hooks/use-translations";
8
7
  import { useWindowSize } from "../../hooks/use-window-size";
@@ -62,10 +61,12 @@ export const Wizard = ({ steps, active = false, onClose = noop, onFinish = noop,
62
61
  return;
63
62
  const el = resolveElement(currentStep.element);
64
63
  if (el) {
65
- setElement(el);
66
- setRect(el.getBoundingClientRect());
67
- refs.setReference(el);
68
64
  currentStep.onEnter?.();
65
+ setTimeout(() => {
66
+ setRect(el.getBoundingClientRect());
67
+ refs.setReference(el);
68
+ setElement(el);
69
+ }, 100);
69
70
  }
70
71
  else {
71
72
  console.warn(`Driver: Element not found:`, currentStep.element);
@@ -90,14 +91,16 @@ export const Wizard = ({ steps, active = false, onClose = noop, onFinish = noop,
90
91
  });
91
92
  const handleNext = () => {
92
93
  currentStep.onNext?.();
93
- if (index < steps.length - 1) {
94
- setIndex((i) => i + 1);
95
- onChange(index + 1);
96
- }
97
- else {
98
- onFinish();
99
- onClose();
100
- }
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);
101
104
  };
102
105
  const handlePrevious = () => {
103
106
  currentStep.onPrevious?.();
@@ -110,10 +113,52 @@ export const Wizard = ({ steps, active = false, onClose = noop, onFinish = noop,
110
113
  return null;
111
114
  const hasNext = index < steps.length - 1;
112
115
  const hasPrevious = index > 0;
113
- return (_jsx(FloatingPortal, { children: _jsxs("div", { className: "fixed inset-0 pointer-events-none z-[9999]", children: [_jsxs("svg", { className: "absolute inset-0 w-full h-full fill-current text-floating-overlay/70", xmlns: "http://www.w3.org/2000/svg", children: [_jsx("defs", { children: _jsxs("mask", { id: "driver-mask", children: [_jsx("rect", { x: "0", y: "0", width: "100%", height: "100%", fill: "white" }), _jsx(motion.rect, { rx: "4", fill: "black", initial: false, onAnimationComplete: () => setIsOverlayReady(true), transition: { type: "spring", duration: 0.5, ease: "easeInOut" }, animate: {
114
- x: rect.left - 5,
115
- y: rect.top - 5,
116
- width: rect.width + 10,
117
- height: rect.height + 10
118
- } })] }) }), _jsx("rect", { x: "0", y: "0", width: "100%", height: "100%", mask: "url(#driver-mask)", className: "pointer-events-auto" })] }), _jsx(AnimatePresence, { mode: "wait", children: currentStep && element && isOverlayReady && (_jsx("div", { ...getFloatingProps(), ref: refs.setFloating, style: floatingStyles, className: "outline-none pointer-events-auto", children: _jsxs(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", children: [_jsx(FloatingArrow, { ref: arrowRef, context: context, className: "fill-card-background stroke-card-border" }), currentStep.title && (_jsx("h3", { children: currentStep.title })), currentStep.description && (_jsx(Fragment, { children: currentStep.description })), _jsxs("div", { className: "flex justify-between items-center pt-2 mt-2 border-t border-floating-border", children: [_jsx(Button, { theme: "raw", size: "small", onClick: onClose, className: "text-xs text-muted-foreground hover:text-foreground", children: labels.skip }), _jsxs("div", { className: "flex gap-2", children: [hasPrevious && (_jsx(Button, { size: "small", theme: "neutral", onClick: handlePrevious, children: labels.previous })), _jsx(Button, { size: "small", onClick: handleNext, children: hasNext ? labels.next : labels.finish })] })] }), _jsxs("div", { className: "absolute top-2 right-2 text-xs text-muted-foreground", children: [index + 1, " / ", steps.length] })] }) })) })] }) }));
116
+ return (<FloatingPortal>
117
+ <div className="fixed inset-0 pointer-events-none z-[9999]">
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-none 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>);
119
164
  };