@justanarthur/modo-ui 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE.beui +21 -0
  3. package/LICENSE.fluid-functionalism +21 -0
  4. package/LICENSE.motion-primitives +21 -0
  5. package/LICENSE.sileo +21 -0
  6. package/README.md +608 -2
  7. package/dist/base.css +994 -0
  8. package/dist/blocks/sidebar-app/index.d.ts +34 -0
  9. package/dist/blocks/sidebar-app/index.js +31 -0
  10. package/dist/components/badge/index.d.ts +59 -0
  11. package/dist/components/badge/index.js +16 -0
  12. package/dist/components/button/index.d.ts +59 -0
  13. package/dist/components/button/index.js +14 -0
  14. package/dist/components/card/index.d.ts +141 -0
  15. package/dist/components/card/index.js +42 -0
  16. package/dist/components/inputs/checkbox-group/index.d.ts +50 -0
  17. package/dist/components/inputs/checkbox-group/index.js +21 -0
  18. package/dist/components/inputs/color-picker/index.d.ts +137 -0
  19. package/dist/components/inputs/color-picker/index.js +35 -0
  20. package/dist/components/inputs/combobox/index.d.ts +161 -0
  21. package/dist/components/inputs/combobox/index.js +38 -0
  22. package/dist/components/inputs/date-time/calendar/index.d.ts +45 -0
  23. package/dist/components/inputs/date-time/calendar/index.js +18 -0
  24. package/dist/components/inputs/date-time/date-picker/index.d.ts +82 -0
  25. package/dist/components/inputs/date-time/date-picker/index.js +32 -0
  26. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +64 -0
  27. package/dist/components/inputs/date-time/date-range-picker/index.js +31 -0
  28. package/dist/components/inputs/date-time/duration-picker/index.d.ts +57 -0
  29. package/dist/components/inputs/date-time/duration-picker/index.js +31 -0
  30. package/dist/components/inputs/date-time/month-picker/index.d.ts +57 -0
  31. package/dist/components/inputs/date-time/month-picker/index.js +30 -0
  32. package/dist/components/inputs/date-time/time-picker/index.d.ts +59 -0
  33. package/dist/components/inputs/date-time/time-picker/index.js +31 -0
  34. package/dist/components/inputs/input/index.d.ts +84 -0
  35. package/dist/components/inputs/input/index.js +19 -0
  36. package/dist/components/inputs/input-copy/index.d.ts +44 -0
  37. package/dist/components/inputs/input-copy/index.js +16 -0
  38. package/dist/components/inputs/input-message/index.d.ts +125 -0
  39. package/dist/components/inputs/input-message/index.js +25 -0
  40. package/dist/components/inputs/radio-group/index.d.ts +58 -0
  41. package/dist/components/inputs/radio-group/index.js +20 -0
  42. package/dist/components/inputs/search/index.d.ts +83 -0
  43. package/dist/components/inputs/search/index.js +25 -0
  44. package/dist/components/inputs/select/index.d.ts +105 -0
  45. package/dist/components/inputs/select/index.js +34 -0
  46. package/dist/components/inputs/slider/index.d.ts +108 -0
  47. package/dist/components/inputs/slider/index.js +14 -0
  48. package/dist/components/inputs/switch/index.d.ts +43 -0
  49. package/dist/components/inputs/switch/index.js +14 -0
  50. package/dist/components/navigation/accordion/index.d.ts +117 -0
  51. package/dist/components/navigation/accordion/index.js +28 -0
  52. package/dist/components/navigation/sidebar/index.d.ts +388 -0
  53. package/dist/components/navigation/sidebar/index.js +99 -0
  54. package/dist/components/navigation/tabs/index.d.ts +70 -0
  55. package/dist/components/navigation/tabs/index.js +23 -0
  56. package/dist/components/navigation/tabs-subtle/index.d.ts +73 -0
  57. package/dist/components/navigation/tabs-subtle/index.js +21 -0
  58. package/dist/components/overlays/alert-dialog/index.d.ts +67 -0
  59. package/dist/components/overlays/alert-dialog/index.js +22 -0
  60. package/dist/components/overlays/command/index.d.ts +121 -0
  61. package/dist/components/overlays/command/index.js +36 -0
  62. package/dist/components/overlays/context-menu/index.d.ts +97 -0
  63. package/dist/components/overlays/context-menu/index.js +29 -0
  64. package/dist/components/overlays/dialog/index.d.ts +130 -0
  65. package/dist/components/overlays/dialog/index.js +37 -0
  66. package/dist/components/overlays/dropdown/index.d.ts +222 -0
  67. package/dist/components/overlays/dropdown/index.js +44 -0
  68. package/dist/components/overlays/popover/index.d.ts +87 -0
  69. package/dist/components/overlays/popover/index.js +26 -0
  70. package/dist/components/overlays/preview-card/index.d.ts +75 -0
  71. package/dist/components/overlays/preview-card/index.js +19 -0
  72. package/dist/components/overlays/sheet/index.d.ts +67 -0
  73. package/dist/components/overlays/sheet/index.js +24 -0
  74. package/dist/components/overlays/toast/index.d.ts +107 -0
  75. package/dist/components/overlays/toast/index.js +21 -0
  76. package/dist/components/overlays/tooltip/index.d.ts +75 -0
  77. package/dist/components/overlays/tooltip/index.js +17 -0
  78. package/dist/components/table/index.d.ts +44 -0
  79. package/dist/components/table/index.js +26 -0
  80. package/dist/components/thinking-indicator/index.d.ts +32 -0
  81. package/dist/components/thinking-indicator/index.js +13 -0
  82. package/dist/index.d.ts +3926 -0
  83. package/dist/index.js +511 -0
  84. package/dist/preset.d.ts +104 -0
  85. package/dist/preset.js +124 -0
  86. package/dist/primitives/code/index.d.ts +23 -0
  87. package/dist/primitives/code/index.js +11 -0
  88. package/dist/primitives/craft/index.d.ts +31 -0
  89. package/dist/primitives/craft/index.js +11 -0
  90. package/dist/primitives/fluid-hover/index.d.ts +233 -0
  91. package/dist/primitives/fluid-hover/index.js +25 -0
  92. package/dist/primitives/morph/index.d.ts +127 -0
  93. package/dist/primitives/morph/index.js +19 -0
  94. package/dist/primitives/motion/index.d.ts +115 -0
  95. package/dist/primitives/motion/index.js +19 -0
  96. package/dist/primitives/scroll-area/index.d.ts +41 -0
  97. package/dist/primitives/scroll-area/index.js +12 -0
  98. package/dist/primitives/sizes/index.d.ts +128 -0
  99. package/dist/primitives/sizes/index.js +21 -0
  100. package/dist/primitives/surface/index.d.ts +69 -0
  101. package/dist/primitives/surface/index.js +17 -0
  102. package/dist/shared/components-0ke6xada.js +123 -0
  103. package/dist/shared/components-0q0sqfh4.js +146 -0
  104. package/dist/shared/components-0sn7ypjw.js +61 -0
  105. package/dist/shared/components-1j9791sn.js +345 -0
  106. package/dist/shared/components-1rfwbyyc.js +361 -0
  107. package/dist/shared/components-1v7rxytx.js +30 -0
  108. package/dist/shared/components-1xekx2hx.js +215 -0
  109. package/dist/shared/components-39jq9va1.js +86 -0
  110. package/dist/shared/components-3gae8nta.js +719 -0
  111. package/dist/shared/components-3k8xpnpq.js +1759 -0
  112. package/dist/shared/components-3ky44908.js +9 -0
  113. package/dist/shared/components-3mkepka5.js +111 -0
  114. package/dist/shared/components-3wk0w46f.js +667 -0
  115. package/dist/shared/components-4cnjmgex.js +124 -0
  116. package/dist/shared/components-59efxjd9.js +298 -0
  117. package/dist/shared/components-5xc2j8jz.js +159 -0
  118. package/dist/shared/components-62ybc7t2.js +496 -0
  119. package/dist/shared/components-66mv71kx.js +262 -0
  120. package/dist/shared/components-7ans7ce5.js +120 -0
  121. package/dist/shared/components-7btqt08d.js +270 -0
  122. package/dist/shared/components-7r3etddy.js +171 -0
  123. package/dist/shared/components-7x9kawxv.js +152 -0
  124. package/dist/shared/components-8fpr3s4p.js +292 -0
  125. package/dist/shared/components-9jvzzvt1.js +198 -0
  126. package/dist/shared/components-apdwtweq.js +484 -0
  127. package/dist/shared/components-asr5pg50.js +191 -0
  128. package/dist/shared/components-b2wyq2cq.js +232 -0
  129. package/dist/shared/components-c6s6b43g.js +15 -0
  130. package/dist/shared/components-ca2c898n.js +1828 -0
  131. package/dist/shared/components-cbxjn9p8.js +141 -0
  132. package/dist/shared/components-chacnk61.js +216 -0
  133. package/dist/shared/components-cv16mryv.js +62 -0
  134. package/dist/shared/components-ez65vtbq.js +110 -0
  135. package/dist/shared/components-ezxhrmer.js +17 -0
  136. package/dist/shared/components-gc5vtq2f.js +149 -0
  137. package/dist/shared/components-gf5s6ap9.js +42 -0
  138. package/dist/shared/components-gvr9w41t.js +193 -0
  139. package/dist/shared/components-h2dpcwgc.js +137 -0
  140. package/dist/shared/components-hawvy2qz.js +105 -0
  141. package/dist/shared/components-hqeq3w9q.js +375 -0
  142. package/dist/shared/components-jjw69c4c.js +28 -0
  143. package/dist/shared/components-jwst3vtj.js +346 -0
  144. package/dist/shared/components-kvr7f9hy.js +45 -0
  145. package/dist/shared/components-men63rwj.js +9 -0
  146. package/dist/shared/components-mhd39z7x.js +22 -0
  147. package/dist/shared/components-n7mjr357.js +26 -0
  148. package/dist/shared/components-ng72k97e.js +128 -0
  149. package/dist/shared/components-nh8tma1n.js +986 -0
  150. package/dist/shared/components-njzgqdwy.js +445 -0
  151. package/dist/shared/components-ny774h8p.js +293 -0
  152. package/dist/shared/components-q4daerx0.js +58 -0
  153. package/dist/shared/components-q5xj5c16.js +79 -0
  154. package/dist/shared/components-rr7a6ja9.js +160 -0
  155. package/dist/shared/components-s2bz1xpk.js +63 -0
  156. package/dist/shared/components-tqvarbfv.js +288 -0
  157. package/dist/shared/components-v6xp325t.js +304 -0
  158. package/dist/shared/components-v7wtz8hk.js +144 -0
  159. package/dist/shared/components-vc7vq5nz.js +32 -0
  160. package/dist/shared/components-vfbhxf5r.js +58 -0
  161. package/dist/shared/components-vynjtrk6.js +19 -0
  162. package/dist/shared/components-wvp1m52g.js +1200 -0
  163. package/dist/shared/components-yh3kwdhr.js +981 -0
  164. package/dist/shared/components-ytb2tefr.js +291 -0
  165. package/dist/shared/components-zfnmn5d4.js +220 -0
  166. package/dist/shared/components-zrkzcayz.js +141 -0
  167. package/dist/shared/components-zx6b6yby.js +42 -0
  168. package/dist/styles.css +1949 -0
  169. package/dist/tailwind.css +219 -0
  170. package/dist/tokens.css +345 -0
  171. package/package.json +103 -4
@@ -0,0 +1,667 @@
1
+ import {
2
+ useReduceMotion
3
+ } from "./components-men63rwj.js";
4
+ import {
5
+ GOO_BLUR_RATIO
6
+ } from "./components-hqeq3w9q.js";
7
+ import {
8
+ cn2
9
+ } from "./components-ezxhrmer.js";
10
+ import {
11
+ FluidHoverHighlight2
12
+ } from "./components-kvr7f9hy.js";
13
+ import {
14
+ useIcon
15
+ } from "./components-zrkzcayz.js";
16
+ import {
17
+ GooFilter
18
+ } from "./components-0q0sqfh4.js";
19
+ import {
20
+ useShape
21
+ } from "./components-cv16mryv.js";
22
+ import {
23
+ useSize2
24
+ } from "./components-0sn7ypjw.js";
25
+ import {
26
+ useControllableState
27
+ } from "./components-n7mjr357.js";
28
+ import {
29
+ useFluidHover2,
30
+ useRegisterFluidHoverItem2
31
+ } from "./components-59efxjd9.js";
32
+ import {
33
+ SizeProvider2
34
+ } from "./components-jjw69c4c.js";
35
+ import {
36
+ spring2
37
+ } from "./components-1v7rxytx.js";
38
+
39
+ // components/navigation/accordion/index.tsx
40
+ import { Accordion as AccordionPrimitive } from "@base-ui/react/accordion";
41
+ import { AnimatePresence, animate, motion, useMotionValue, useTransform } from "motion/react";
42
+ import {
43
+ createContext,
44
+ forwardRef,
45
+ useCallback,
46
+ useContext,
47
+ useEffect,
48
+ useId,
49
+ useImperativeHandle,
50
+ useLayoutEffect,
51
+ useMemo,
52
+ useRef,
53
+ useState
54
+ } from "react";
55
+ import { jsx, jsxs } from "react/jsx-runtime";
56
+ var useIsoLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
57
+ var AccordionGroupContext = createContext(null);
58
+ function useAccordionGroup() {
59
+ return useContext(AccordionGroupContext);
60
+ }
61
+ var AccordionItemContext = createContext(null);
62
+ function useAccordionItemContext() {
63
+ const ctx = useContext(AccordionItemContext);
64
+ if (!ctx)
65
+ throw new Error("AccordionTrigger/AccordionContent must be used within an AccordionItem");
66
+ return ctx;
67
+ }
68
+ var AccordionGroup2 = forwardRef((props, ref) => {
69
+ const { children, highlight = "item", type = "single", size, className, ...rest } = props;
70
+ const containerRef = useRef(null);
71
+ const fullItemElementsRef = useRef(new Map);
72
+ const [openItemRects, setOpenItemRects] = useState(new Map);
73
+ const openItemRectsRef = useRef(openItemRects);
74
+ const hover = useFluidHover2(containerRef);
75
+ const { activeIndex, setActiveIndex, itemRects, handlers, registerItem, measureItems } = hover;
76
+ const registerFullItem = useCallback((index, element) => {
77
+ if (element) {
78
+ fullItemElementsRef.current.set(index, element);
79
+ } else {
80
+ fullItemElementsRef.current.delete(index);
81
+ }
82
+ }, []);
83
+ const measureFullItems = useCallback(() => {
84
+ if (!containerRef.current)
85
+ return;
86
+ const next = new Map;
87
+ fullItemElementsRef.current.forEach((el, idx) => {
88
+ next.set(idx, {
89
+ top: el.offsetTop,
90
+ left: el.offsetLeft,
91
+ width: el.offsetWidth,
92
+ height: el.offsetHeight
93
+ });
94
+ });
95
+ const prev = openItemRectsRef.current;
96
+ let changed = prev.size !== next.size;
97
+ if (!changed) {
98
+ for (const [idx, r] of next) {
99
+ const p = prev.get(idx);
100
+ if (!p || p.top !== r.top || p.left !== r.left || p.width !== r.width || p.height !== r.height) {
101
+ changed = true;
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ if (!changed)
107
+ return;
108
+ openItemRectsRef.current = next;
109
+ setOpenItemRects(next);
110
+ }, []);
111
+ const sp = props;
112
+ const mp = props;
113
+ const [singleValue, setSingleValue] = useControllableState(type === "single" ? sp.value : undefined, type === "single" ? sp.defaultValue ?? "" : "", type === "single" ? sp.onValueChange : undefined);
114
+ const [multipleValue, setMultipleValue] = useControllableState(type === "multiple" ? mp.value : undefined, type === "multiple" ? mp.defaultValue ?? [] : [], type === "multiple" ? mp.onValueChange : undefined);
115
+ const openValuesList = type === "multiple" ? multipleValue : singleValue ? [singleValue] : [];
116
+ const openValuesKey = openValuesList.join(",");
117
+ const openValues = useMemo(() => new Set(openValuesList), [openValuesKey]);
118
+ useEffect(() => {
119
+ measureItems();
120
+ measureFullItems();
121
+ }, [measureItems, measureFullItems, children]);
122
+ useEffect(() => {
123
+ measureItems();
124
+ measureFullItems();
125
+ }, [measureItems, measureFullItems, openValuesKey]);
126
+ const [focusedIndex, setFocusedIndex] = useState(null);
127
+ const focusRect = focusedIndex !== null ? itemRects[focusedIndex] : null;
128
+ const expandedRects = highlight === "trigger" ? new Map([...openItemRects.keys()].flatMap((idx) => {
129
+ const rect = idx === activeIndex ? itemRects[idx] : null;
130
+ return rect ? [[idx, rect]] : [];
131
+ })) : new Map;
132
+ const isHoveringNonOpen = activeIndex !== null && !openItemRects.has(activeIndex);
133
+ const shape = useShape();
134
+ const {
135
+ value: _value,
136
+ defaultValue: _defaultValue,
137
+ onValueChange: _onValueChange,
138
+ collapsible: _collapsible,
139
+ type: _type,
140
+ ...htmlProps
141
+ } = rest;
142
+ const baseValue = openValuesList;
143
+ const baseOnValueChange = (next) => {
144
+ if (type === "multiple")
145
+ setMultipleValue(next);
146
+ else
147
+ setSingleValue(next[0] ?? "");
148
+ };
149
+ const [reflowing, setReflowing] = useState(false);
150
+ const remeasure = useCallback(() => {
151
+ setReflowing(true);
152
+ measureItems();
153
+ measureFullItems();
154
+ }, [measureItems, measureFullItems]);
155
+ const groupContextValue = useMemo(() => ({
156
+ registerItem,
157
+ registerFullItem,
158
+ activeIndex,
159
+ grouped: true,
160
+ remeasure,
161
+ openValues,
162
+ openItemRects,
163
+ highlight,
164
+ dimOpen: isHoveringNonOpen
165
+ }), [registerItem, registerFullItem, activeIndex, remeasure, openValues, openItemRects, highlight, isHoveringNonOpen]);
166
+ const group = /* @__PURE__ */ jsx(AccordionGroupContext.Provider, {
167
+ value: groupContextValue,
168
+ children: /* @__PURE__ */ jsx(AccordionPrimitive.Root, {
169
+ value: baseValue,
170
+ onValueChange: baseOnValueChange,
171
+ multiple: type === "multiple",
172
+ render: (rootProps) => {
173
+ const {
174
+ style: _baseStyle,
175
+ onDrag: _onDrag,
176
+ onDragStart: _onDragStart,
177
+ onDragEnd: _onDragEnd,
178
+ onAnimationStart: _onAnimationStart,
179
+ onAnimationEnd: _onAnimationEnd,
180
+ onAnimationIteration: _onAnimationIteration,
181
+ ...restRoot
182
+ } = rootProps;
183
+ return /* @__PURE__ */ jsxs("div", {
184
+ ...restRoot,
185
+ ref: (node) => {
186
+ containerRef.current = node;
187
+ if (typeof ref === "function")
188
+ ref(node);
189
+ else if (ref)
190
+ ref.current = node;
191
+ },
192
+ onMouseEnter: handlers.onMouseEnter,
193
+ onMouseMove: (e) => {
194
+ setReflowing(false);
195
+ const container = containerRef.current;
196
+ if (container) {
197
+ const cRect = container.getBoundingClientRect();
198
+ const layoutH = container.offsetHeight;
199
+ const visualH = cRect.height;
200
+ const scale = layoutH > 0 ? visualH / layoutH : 1;
201
+ const localY = (e.clientY - cRect.top) / scale + container.scrollTop;
202
+ for (const [idx, full] of openItemRects) {
203
+ const trigger = itemRects[idx];
204
+ if (!trigger)
205
+ continue;
206
+ const contentTop = trigger.top + trigger.height;
207
+ const contentBottom = full.top + full.height;
208
+ if (localY >= contentTop && localY <= contentBottom) {
209
+ setActiveIndex(null);
210
+ return;
211
+ }
212
+ }
213
+ }
214
+ handlers.onMouseMove(e);
215
+ },
216
+ onMouseLeave: handlers.onMouseLeave,
217
+ onFocus: (e) => {
218
+ setReflowing(false);
219
+ const indexAttr = e.target.closest("[data-fluid-hover-index]")?.getAttribute("data-fluid-hover-index");
220
+ if (indexAttr != null) {
221
+ const idx = Number(indexAttr);
222
+ setActiveIndex(idx);
223
+ setFocusedIndex(e.target.matches(":focus-visible") ? idx : null);
224
+ }
225
+ },
226
+ onBlur: (e) => {
227
+ if (containerRef.current?.contains(e.relatedTarget))
228
+ return;
229
+ setFocusedIndex(null);
230
+ setActiveIndex(null);
231
+ },
232
+ className: cn2("relative flex flex-col w-72 max-w-full", className),
233
+ ...htmlProps,
234
+ children: [
235
+ /* @__PURE__ */ jsx(AnimatePresence, {
236
+ children: [...expandedRects.entries()].map(([idx, rect]) => /* @__PURE__ */ jsx(motion.div, {
237
+ className: `absolute ${shape.bg} bg-accent/20 dark:bg-accent/12 pointer-events-none`,
238
+ initial: {
239
+ top: rect.top,
240
+ left: rect.left,
241
+ width: rect.width,
242
+ height: rect.height,
243
+ opacity: 0
244
+ },
245
+ animate: {
246
+ top: rect.top,
247
+ left: rect.left,
248
+ width: rect.width,
249
+ height: rect.height,
250
+ opacity: isHoveringNonOpen ? 0.7 : 1
251
+ },
252
+ exit: { opacity: 0, transition: spring2.moderate.exit },
253
+ transition: {
254
+ top: { duration: 0 },
255
+ left: { duration: 0 },
256
+ width: { duration: 0 },
257
+ height: { duration: 0 },
258
+ opacity: { duration: spring2.moderate.exit.duration }
259
+ }
260
+ }, `expanded-${idx}`))
261
+ }),
262
+ /* @__PURE__ */ jsx(FluidHoverHighlight2, {
263
+ hover,
264
+ className: cn2(shape.bg, "z-1"),
265
+ transition: reflowing ? false : undefined
266
+ }),
267
+ /* @__PURE__ */ jsx(AnimatePresence, {
268
+ children: focusRect && /* @__PURE__ */ jsx(motion.div, {
269
+ className: `absolute ${shape.focusRing} pointer-events-none z-20 border border-focus-ring`,
270
+ initial: false,
271
+ animate: {
272
+ left: focusRect.left - 2,
273
+ top: focusRect.top - 2,
274
+ width: focusRect.width + 4,
275
+ height: focusRect.height + 4
276
+ },
277
+ exit: { opacity: 0, transition: spring2.fast.exit },
278
+ transition: {
279
+ ...reflowing ? { duration: 0 } : spring2.fast,
280
+ opacity: { duration: spring2.fast.duration }
281
+ }
282
+ })
283
+ }),
284
+ children
285
+ ]
286
+ });
287
+ }
288
+ })
289
+ });
290
+ return size ? /* @__PURE__ */ jsx(SizeProvider2, {
291
+ size,
292
+ children: group
293
+ }) : group;
294
+ });
295
+ AccordionGroup2.displayName = "AccordionGroup";
296
+ var Accordion2 = forwardRef(({
297
+ children,
298
+ type = "single",
299
+ collapsible = true,
300
+ defaultValue,
301
+ value,
302
+ onValueChange,
303
+ highlight,
304
+ size,
305
+ className,
306
+ ...props
307
+ }, ref) => {
308
+ const [singleValue, setSingleValue] = useControllableState(type === "single" ? value : undefined, type === "single" ? defaultValue ?? "" : "", type === "single" ? onValueChange : undefined);
309
+ const [multipleValue, setMultipleValue] = useControllableState(type === "multiple" ? value : undefined, type === "multiple" ? defaultValue ?? [] : [], type === "multiple" ? onValueChange : undefined);
310
+ const openValues = new Set(type === "multiple" ? multipleValue : singleValue ? [singleValue] : []);
311
+ const baseValue = [...openValues];
312
+ const baseOnValueChange = (next) => {
313
+ if (type === "multiple")
314
+ setMultipleValue(next);
315
+ else
316
+ setSingleValue(next[0] ?? "");
317
+ };
318
+ const root = /* @__PURE__ */ jsx(AccordionPrimitive.Root, {
319
+ value: baseValue,
320
+ onValueChange: baseOnValueChange,
321
+ multiple: type === "multiple",
322
+ render: (rootProps) => {
323
+ const { style: _s, ...restRoot } = rootProps;
324
+ return /* @__PURE__ */ jsx("div", {
325
+ ...restRoot,
326
+ ref,
327
+ className: cn2("w-72 max-w-full flex flex-col", className),
328
+ ...props,
329
+ children: /* @__PURE__ */ jsx(StandaloneOpenContext.Provider, {
330
+ value: openValues,
331
+ children: /* @__PURE__ */ jsx(StandaloneHighlightContext.Provider, {
332
+ value: highlight,
333
+ children
334
+ })
335
+ })
336
+ });
337
+ }
338
+ });
339
+ return size ? /* @__PURE__ */ jsx(SizeProvider2, {
340
+ size,
341
+ children: root
342
+ }) : root;
343
+ });
344
+ Accordion2.displayName = "Accordion";
345
+ var StandaloneOpenContext = createContext(new Set);
346
+ var StandaloneHighlightContext = createContext(undefined);
347
+ var AccordionItem2 = forwardRef(({ value, index, disabled, highlight: highlightProp, children, className, ...props }, ref) => {
348
+ const internalRef = useRef(null);
349
+ const groupCtx = useAccordionGroup();
350
+ const standaloneOpen = useContext(StandaloneOpenContext);
351
+ const standaloneHighlight = useContext(StandaloneHighlightContext);
352
+ const highlight = groupCtx ? groupCtx.highlight : highlightProp ?? standaloneHighlight ?? "item";
353
+ const isOpen = groupCtx?.grouped ? groupCtx.openValues.has(value) : standaloneOpen.has(value);
354
+ const triggerRef = useRef(null);
355
+ const press = useRef(null);
356
+ useRegisterFluidHoverItem2(groupCtx?.grouped ? groupCtx.registerItem : undefined, index, triggerRef);
357
+ useEffect(() => {
358
+ if (groupCtx?.grouped && index !== undefined) {
359
+ if (isOpen) {
360
+ groupCtx.registerFullItem(index, internalRef.current);
361
+ } else {
362
+ groupCtx.registerFullItem(index, null);
363
+ }
364
+ return () => groupCtx.registerFullItem(index, null);
365
+ }
366
+ }, [index, groupCtx, isOpen]);
367
+ return /* @__PURE__ */ jsx(AccordionItemContext.Provider, {
368
+ value: { index, value, isOpen, triggerRef, highlight, press },
369
+ children: /* @__PURE__ */ jsx(AccordionPrimitive.Item, {
370
+ ref: (node) => {
371
+ internalRef.current = node;
372
+ if (typeof ref === "function")
373
+ ref(node);
374
+ else if (ref)
375
+ ref.current = node;
376
+ },
377
+ value,
378
+ disabled,
379
+ render: (itemProps) => {
380
+ const { style: _s, ...restItem } = itemProps;
381
+ return /* @__PURE__ */ jsx("div", {
382
+ ...restItem,
383
+ "data-fluid-hover-index": index,
384
+ className: cn2("relative", className),
385
+ ...props,
386
+ children
387
+ });
388
+ }
389
+ })
390
+ });
391
+ });
392
+ AccordionItem2.displayName = "AccordionItem";
393
+ var AccordionTrigger2 = forwardRef(({ children, className, ...props }, ref) => {
394
+ const ChevronRight = useIcon("chevron-right");
395
+ const groupCtx = useAccordionGroup();
396
+ const { index, isOpen, triggerRef, highlight, press } = useAccordionItemContext();
397
+ const shape = useShape();
398
+ const sizeClasses = useSize2();
399
+ const [isHovered, setIsHovered] = useState(false);
400
+ const isActive = groupCtx?.grouped ? groupCtx.activeIndex === index : isHovered;
401
+ const capture = (event) => {
402
+ const row = event.currentTarget;
403
+ const box = row.getBoundingClientRect();
404
+ press.current = (event.clientX - box.left) * row.offsetWidth / box.width;
405
+ };
406
+ const triggerContent = /* @__PURE__ */ jsx(AccordionPrimitive.Header, {
407
+ render: /* @__PURE__ */ jsx("div", {}),
408
+ children: /* @__PURE__ */ jsxs(AccordionPrimitive.Trigger, {
409
+ ref,
410
+ className: cn2(`relative z-10 flex items-center ${sizeClasses.gap} ${shape.item} ${sizeClasses.px} ${sizeClasses.variant === "compact" ? "py-1" : "py-2"} w-full cursor-pointer outline-none select-none`, !groupCtx?.grouped && "focus-visible:ring-1 focus-visible:ring-focus-ring focus-visible:ring-offset-0", className),
411
+ ...props,
412
+ children: [
413
+ /* @__PURE__ */ jsxs("span", {
414
+ className: cn2("inline-grid flex-1 text-left", sizeClasses.text),
415
+ children: [
416
+ /* @__PURE__ */ jsx("span", {
417
+ className: "col-start-1 row-start-1 invisible weight-semibold",
418
+ "aria-hidden": "true",
419
+ children
420
+ }),
421
+ /* @__PURE__ */ jsx("span", {
422
+ className: cn2("col-start-1 row-start-1 transition-[color,font-variation-settings] duration-fast", isOpen || isActive ? "text-foreground" : "text-muted-foreground", isOpen ? "weight-semibold" : "weight-normal"),
423
+ children
424
+ })
425
+ ]
426
+ }),
427
+ /* @__PURE__ */ jsx(motion.span, {
428
+ className: "shrink-0 inline-flex items-center justify-center",
429
+ animate: { rotate: isOpen ? 90 : 0 },
430
+ transition: spring2.fast,
431
+ children: /* @__PURE__ */ jsx(ChevronRight, {
432
+ size: sizeClasses.icon,
433
+ strokeWidth: isOpen || isActive ? 2 : 1.5,
434
+ className: cn2("transition-[color,stroke-width] duration-fast", isOpen || isActive ? "text-foreground" : "text-muted-foreground")
435
+ })
436
+ })
437
+ ]
438
+ })
439
+ });
440
+ if (groupCtx?.grouped) {
441
+ return /* @__PURE__ */ jsx("div", {
442
+ ref: triggerRef,
443
+ onPointerDown: capture,
444
+ children: triggerContent
445
+ });
446
+ }
447
+ return /* @__PURE__ */ jsxs("div", {
448
+ className: "relative",
449
+ onPointerDown: capture,
450
+ onMouseEnter: () => setIsHovered(true),
451
+ onMouseLeave: () => setIsHovered(false),
452
+ children: [
453
+ /* @__PURE__ */ jsx(AnimatePresence, {
454
+ children: isOpen && highlight === "trigger" && isHovered && /* @__PURE__ */ jsx(motion.div, {
455
+ className: `absolute inset-0 ${shape.bg} bg-accent/20 dark:bg-accent/12 pointer-events-none`,
456
+ initial: { opacity: 0 },
457
+ animate: { opacity: 1 },
458
+ exit: { opacity: 0, transition: spring2.moderate.exit },
459
+ transition: { duration: spring2.moderate.exit.duration }
460
+ })
461
+ }),
462
+ /* @__PURE__ */ jsx(AnimatePresence, {
463
+ children: isHovered && /* @__PURE__ */ jsx(motion.div, {
464
+ className: `absolute inset-0 z-1 ${shape.bg} bg-hover pointer-events-none`,
465
+ initial: { opacity: 0 },
466
+ animate: { opacity: 1 },
467
+ exit: { opacity: 0, transition: spring2.fast.exit },
468
+ transition: { duration: spring2.fast.duration }
469
+ })
470
+ }),
471
+ triggerContent
472
+ ]
473
+ });
474
+ });
475
+ AccordionTrigger2.displayName = "AccordionTrigger";
476
+ function grow(a, b, t) {
477
+ const p = Math.min(1, t);
478
+ const at = (from, to) => from + (to - from) * p;
479
+ const w = at(a.w, b.w);
480
+ const h = at(a.h, b.h);
481
+ return { x: at(a.x, b.x), y: at(a.y, b.y), w, h, r: Math.min(at(a.r, b.r), w / 2, h / 2) };
482
+ }
483
+ function place(el, { x, y, w, h, r }) {
484
+ if (!el)
485
+ return;
486
+ el.style.left = `${x}px`;
487
+ el.style.top = `${y}px`;
488
+ el.style.width = `${w}px`;
489
+ el.style.height = `${h}px`;
490
+ el.style.borderRadius = `${r}px`;
491
+ }
492
+ var AccordionContent2 = forwardRef(({ children, className, effect = "goo", tier = "slow", ...props }, ref) => {
493
+ const groupCtx = useAccordionGroup();
494
+ const { isOpen, highlight, press } = useAccordionItemContext();
495
+ const shape = useShape();
496
+ const sizeClasses = useSize2();
497
+ const reduceMotion = useReduceMotion();
498
+ const gooId = `accordion-goo-${useId().replace(/:/g, "")}`;
499
+ const progress = useMotionValue(isOpen ? 1 : 0);
500
+ const tint = useTransform(progress, [0, 0.3], [0, 1]);
501
+ const tinted = highlight === "item";
502
+ const remeasure = useRef(groupCtx?.remeasure);
503
+ remeasure.current = groupCtx?.remeasure;
504
+ const refs = {
505
+ panel: useRef(null),
506
+ content: useRef(null),
507
+ rest: useRef(null),
508
+ goo: useRef(null),
509
+ row: useRef(null),
510
+ shape: useRef(null)
511
+ };
512
+ useImperativeHandle(ref, () => refs.panel.current, []);
513
+ const geometry = useRef({ x: 0, width: 0, row: 0, body: 0 });
514
+ const render = (p) => {
515
+ const { x, width, row, body } = geometry.current;
516
+ const rect = grow({ x, y: row / 2, w: 0, h: 0, r: width }, { x: 0, y: 0, w: width, h: row + body, r: shape.bgRadius }, p);
517
+ const reach = rect.y + rect.h - row;
518
+ const { panel, content } = refs;
519
+ if (panel.current)
520
+ panel.current.style.height = `${Math.max(0, reach)}px`;
521
+ if (content.current) {
522
+ content.current.style.clipPath = `inset(${rect.y - row}px ${width - rect.x - rect.w}px ${body - reach}px ${rect.x}px round ${rect.r}px)`;
523
+ }
524
+ place(refs.shape.current, rect);
525
+ remeasure.current?.();
526
+ };
527
+ const [exitComplete, setExitComplete] = useState(!isOpen);
528
+ if (isOpen && exitComplete) {
529
+ setExitComplete(false);
530
+ }
531
+ const settle = (open) => {
532
+ const { panel, content, goo, rest } = refs;
533
+ if (panel.current)
534
+ panel.current.style.height = open ? "" : "0px";
535
+ if (content.current)
536
+ content.current.style.clipPath = open ? "" : "inset(50%)";
537
+ if (goo.current)
538
+ goo.current.style.display = "";
539
+ if (rest.current)
540
+ rest.current.style.display = "";
541
+ remeasure.current?.();
542
+ if (!open)
543
+ setExitComplete(true);
544
+ };
545
+ const wasOpen = useRef(isOpen);
546
+ useIsoLayoutEffect(() => {
547
+ if (wasOpen.current === isOpen)
548
+ return;
549
+ wasOpen.current = isOpen;
550
+ const { panel, content, goo, rest, row } = refs;
551
+ if (!panel.current || !content.current)
552
+ return;
553
+ const g = geometry.current;
554
+ g.width = panel.current.offsetWidth;
555
+ g.row = panel.current.offsetTop;
556
+ g.body = content.current.offsetHeight;
557
+ if (isOpen && progress.get() === 0)
558
+ g.x = press.current ?? g.width / 2;
559
+ press.current = null;
560
+ if (reduceMotion) {
561
+ progress.set(isOpen ? 1 : 0);
562
+ settle(isOpen);
563
+ return;
564
+ }
565
+ if (goo.current)
566
+ goo.current.style.display = "block";
567
+ if (rest.current)
568
+ rest.current.style.display = "none";
569
+ if (row.current)
570
+ row.current.style.height = `${g.row}px`;
571
+ render(progress.get());
572
+ const { exit, ...enter } = spring2[tier];
573
+ const controls = animate(progress, isOpen ? 1 : 0, {
574
+ ...isOpen ? enter : exit,
575
+ onUpdate: render,
576
+ onComplete: () => settle(isOpen)
577
+ });
578
+ return () => controls.stop();
579
+ }, [isOpen]);
580
+ useIsoLayoutEffect(() => {
581
+ const content = refs.content.current;
582
+ if (!content)
583
+ return;
584
+ const observer = new ResizeObserver(() => {
585
+ if (content.offsetHeight > 0)
586
+ geometry.current.body = content.offsetHeight;
587
+ remeasure.current?.();
588
+ });
589
+ observer.observe(content);
590
+ return () => observer.disconnect();
591
+ }, []);
592
+ return /* @__PURE__ */ jsx(AccordionPrimitive.Panel, {
593
+ keepMounted: true,
594
+ render: (panelProps) => {
595
+ const {
596
+ hidden: _baseHidden,
597
+ style: _baseStyle,
598
+ ...restPanel
599
+ } = panelProps;
600
+ return /* @__PURE__ */ jsx("div", {
601
+ ...restPanel,
602
+ hidden: !isOpen && exitComplete,
603
+ children: /* @__PURE__ */ jsxs("div", {
604
+ ref: refs.panel,
605
+ className,
606
+ ...props,
607
+ children: [
608
+ tinted && /* @__PURE__ */ jsx(motion.div, {
609
+ "aria-hidden": true,
610
+ className: "pointer-events-none absolute inset-0",
611
+ initial: false,
612
+ animate: { opacity: groupCtx?.dimOpen ? 0.7 : 1 },
613
+ transition: { duration: spring2.moderate.exit.duration },
614
+ children: /* @__PURE__ */ jsx(motion.div, {
615
+ className: "absolute inset-0",
616
+ style: { opacity: tint },
617
+ children: /* @__PURE__ */ jsxs("div", {
618
+ className: "absolute inset-0 opacity-20 dark:opacity-12",
619
+ children: [
620
+ /* @__PURE__ */ jsx("div", {
621
+ ref: refs.rest,
622
+ className: cn2("absolute inset-0 bg-accent", shape.bg)
623
+ }),
624
+ effect === "goo" && /* @__PURE__ */ jsx(GooFilter, {
625
+ id: gooId,
626
+ blur: shape.bgRadius * GOO_BLUR_RATIO
627
+ }),
628
+ /* @__PURE__ */ jsxs("div", {
629
+ ref: refs.goo,
630
+ className: "absolute inset-0 hidden",
631
+ style: effect === "goo" ? { filter: `url(#${gooId})` } : undefined,
632
+ children: [
633
+ /* @__PURE__ */ jsx("div", {
634
+ ref: refs.row,
635
+ className: cn2("absolute inset-x-0 top-0 bg-accent", shape.bg)
636
+ }),
637
+ /* @__PURE__ */ jsx("div", {
638
+ ref: refs.shape,
639
+ className: "absolute bg-accent"
640
+ })
641
+ ]
642
+ })
643
+ ]
644
+ })
645
+ })
646
+ }),
647
+ /* @__PURE__ */ jsx("div", {
648
+ ref: refs.content,
649
+ className: cn2("relative pt-1 text-muted-foreground", sizeClasses.px, sizeClasses.text, sizeClasses.variant === "compact" ? "pb-2.5" : "pb-3"),
650
+ children
651
+ })
652
+ ]
653
+ })
654
+ });
655
+ }
656
+ });
657
+ });
658
+ AccordionContent2.displayName = "AccordionContent";
659
+ Object.assign(Accordion2, {
660
+ Group: AccordionGroup2,
661
+ Item: AccordionItem2,
662
+ Trigger: AccordionTrigger2,
663
+ Content: AccordionContent2
664
+ });
665
+ var accordion_default = Accordion2;
666
+
667
+ export { AccordionGroup2, Accordion2, AccordionItem2, AccordionTrigger2, AccordionContent2, accordion_default };