react-marketing-ui 0.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 (318) hide show
  1. package/README.md +34 -0
  2. package/dist/accordion.d.cts +21 -0
  3. package/dist/accordion.d.ts +21 -0
  4. package/dist/accordion.d.ts.map +1 -0
  5. package/dist/accordion.js +230 -0
  6. package/dist/accordion.js.map +1 -0
  7. package/dist/accordion.mjs +4 -0
  8. package/dist/accordion.mjs.map +1 -0
  9. package/dist/action-swap.d.cts +23 -0
  10. package/dist/action-swap.d.ts +23 -0
  11. package/dist/action-swap.d.ts.map +1 -0
  12. package/dist/action-swap.js +81 -0
  13. package/dist/action-swap.js.map +1 -0
  14. package/dist/action-swap.mjs +5 -0
  15. package/dist/action-swap.mjs.map +1 -0
  16. package/dist/animated-beam.d.cts +24 -0
  17. package/dist/animated-beam.d.ts +24 -0
  18. package/dist/animated-beam.d.ts.map +1 -0
  19. package/dist/animated-beam.js +130 -0
  20. package/dist/animated-beam.js.map +1 -0
  21. package/dist/animated-beam.mjs +4 -0
  22. package/dist/animated-beam.mjs.map +1 -0
  23. package/dist/button.d.cts +55 -0
  24. package/dist/button.d.ts +55 -0
  25. package/dist/button.d.ts.map +1 -0
  26. package/dist/button.js +119 -0
  27. package/dist/button.js.map +1 -0
  28. package/dist/button.mjs +4 -0
  29. package/dist/button.mjs.map +1 -0
  30. package/dist/card.d.cts +20 -0
  31. package/dist/card.d.ts +20 -0
  32. package/dist/card.d.ts.map +1 -0
  33. package/dist/card.js +146 -0
  34. package/dist/card.js.map +1 -0
  35. package/dist/card.mjs +5 -0
  36. package/dist/card.mjs.map +1 -0
  37. package/dist/chunk-3SB6HUBA.mjs +31 -0
  38. package/dist/chunk-3SB6HUBA.mjs.map +1 -0
  39. package/dist/chunk-4PBVBXGY.mjs +84 -0
  40. package/dist/chunk-4PBVBXGY.mjs.map +1 -0
  41. package/dist/chunk-4VCFWVSJ.mjs +42 -0
  42. package/dist/chunk-4VCFWVSJ.mjs.map +1 -0
  43. package/dist/chunk-5QQAPGR2.mjs +109 -0
  44. package/dist/chunk-5QQAPGR2.mjs.map +1 -0
  45. package/dist/chunk-6MB4UKRX.mjs +19 -0
  46. package/dist/chunk-6MB4UKRX.mjs.map +1 -0
  47. package/dist/chunk-6T5LR34O.mjs +45 -0
  48. package/dist/chunk-6T5LR34O.mjs.map +1 -0
  49. package/dist/chunk-AYLCYDUM.mjs +275 -0
  50. package/dist/chunk-AYLCYDUM.mjs.map +1 -0
  51. package/dist/chunk-AYY7D2RJ.mjs +112 -0
  52. package/dist/chunk-AYY7D2RJ.mjs.map +1 -0
  53. package/dist/chunk-CTZEI2YS.mjs +324 -0
  54. package/dist/chunk-CTZEI2YS.mjs.map +1 -0
  55. package/dist/chunk-DA3I3Y5O.mjs +71 -0
  56. package/dist/chunk-DA3I3Y5O.mjs.map +1 -0
  57. package/dist/chunk-EYHT2EWJ.mjs +18 -0
  58. package/dist/chunk-EYHT2EWJ.mjs.map +1 -0
  59. package/dist/chunk-IHLGCS63.mjs +36 -0
  60. package/dist/chunk-IHLGCS63.mjs.map +1 -0
  61. package/dist/chunk-JVXJ6SFX.mjs +38 -0
  62. package/dist/chunk-JVXJ6SFX.mjs.map +1 -0
  63. package/dist/chunk-KBHYXLRG.mjs +13 -0
  64. package/dist/chunk-KBHYXLRG.mjs.map +1 -0
  65. package/dist/chunk-KMXUQYR3.mjs +74 -0
  66. package/dist/chunk-KMXUQYR3.mjs.map +1 -0
  67. package/dist/chunk-KNPOZ34H.mjs +88 -0
  68. package/dist/chunk-KNPOZ34H.mjs.map +1 -0
  69. package/dist/chunk-KRNWCJ4D.mjs +219 -0
  70. package/dist/chunk-KRNWCJ4D.mjs.map +1 -0
  71. package/dist/chunk-M5MESV26.mjs +124 -0
  72. package/dist/chunk-M5MESV26.mjs.map +1 -0
  73. package/dist/chunk-MJYBPJBA.mjs +115 -0
  74. package/dist/chunk-MJYBPJBA.mjs.map +1 -0
  75. package/dist/chunk-NNHPQ67J.mjs +10 -0
  76. package/dist/chunk-NNHPQ67J.mjs.map +1 -0
  77. package/dist/chunk-OCZFHVVD.mjs +71 -0
  78. package/dist/chunk-OCZFHVVD.mjs.map +1 -0
  79. package/dist/chunk-QAWSH567.mjs +19 -0
  80. package/dist/chunk-QAWSH567.mjs.map +1 -0
  81. package/dist/chunk-R2E2J42H.mjs +38 -0
  82. package/dist/chunk-R2E2J42H.mjs.map +1 -0
  83. package/dist/chunk-TPGLLSYV.mjs +65 -0
  84. package/dist/chunk-TPGLLSYV.mjs.map +1 -0
  85. package/dist/chunk-VJENJHXJ.mjs +72 -0
  86. package/dist/chunk-VJENJHXJ.mjs.map +1 -0
  87. package/dist/chunk-W22G7XHR.mjs +104 -0
  88. package/dist/chunk-W22G7XHR.mjs.map +1 -0
  89. package/dist/chunk-WDR5VPZJ.mjs +79 -0
  90. package/dist/chunk-WDR5VPZJ.mjs.map +1 -0
  91. package/dist/chunk-WLUGKBH7.mjs +37 -0
  92. package/dist/chunk-WLUGKBH7.mjs.map +1 -0
  93. package/dist/chunk-WYJYLDUA.mjs +84 -0
  94. package/dist/chunk-WYJYLDUA.mjs.map +1 -0
  95. package/dist/chunk-XZEDZVXT.mjs +38 -0
  96. package/dist/chunk-XZEDZVXT.mjs.map +1 -0
  97. package/dist/chunk-YKGP5JIL.mjs +328 -0
  98. package/dist/chunk-YKGP5JIL.mjs.map +1 -0
  99. package/dist/chunk-YM3U2OBE.mjs +99 -0
  100. package/dist/chunk-YM3U2OBE.mjs.map +1 -0
  101. package/dist/dia-text-reveal.css +18 -0
  102. package/dist/dia-text-reveal.css.map +1 -0
  103. package/dist/dia-text-reveal.d.cts +37 -0
  104. package/dist/dia-text-reveal.d.ts +37 -0
  105. package/dist/dia-text-reveal.d.ts.map +1 -0
  106. package/dist/dia-text-reveal.js +334 -0
  107. package/dist/dia-text-reveal.js.map +1 -0
  108. package/dist/dia-text-reveal.lines.d.cts +23 -0
  109. package/dist/dia-text-reveal.lines.d.ts +23 -0
  110. package/dist/dia-text-reveal.lines.d.ts.map +1 -0
  111. package/dist/dia-text-reveal.mjs +4 -0
  112. package/dist/dia-text-reveal.mjs.map +1 -0
  113. package/dist/dia-text-reveal.sweep.d.cts +49 -0
  114. package/dist/dia-text-reveal.sweep.d.ts +49 -0
  115. package/dist/dia-text-reveal.sweep.d.ts.map +1 -0
  116. package/dist/dia-text-reveal.utils.d.cts +3 -0
  117. package/dist/dia-text-reveal.utils.d.ts +3 -0
  118. package/dist/dia-text-reveal.utils.d.ts.map +1 -0
  119. package/dist/elevated-input.d.cts +11 -0
  120. package/dist/elevated-input.d.ts +11 -0
  121. package/dist/elevated-input.d.ts.map +1 -0
  122. package/dist/elevated-input.js +52 -0
  123. package/dist/elevated-input.js.map +1 -0
  124. package/dist/elevated-input.mjs +4 -0
  125. package/dist/elevated-input.mjs.map +1 -0
  126. package/dist/fade-in.d.cts +43 -0
  127. package/dist/fade-in.d.ts +43 -0
  128. package/dist/fade-in.d.ts.map +1 -0
  129. package/dist/fade-in.js +89 -0
  130. package/dist/fade-in.js.map +1 -0
  131. package/dist/fade-in.mjs +4 -0
  132. package/dist/fade-in.mjs.map +1 -0
  133. package/dist/feature-card.d.cts +23 -0
  134. package/dist/feature-card.d.ts +23 -0
  135. package/dist/feature-card.d.ts.map +1 -0
  136. package/dist/feature-card.js +38 -0
  137. package/dist/feature-card.js.map +1 -0
  138. package/dist/feature-card.mjs +4 -0
  139. package/dist/feature-card.mjs.map +1 -0
  140. package/dist/flowchart-parts.d.cts +61 -0
  141. package/dist/flowchart-parts.d.ts +61 -0
  142. package/dist/flowchart-parts.d.ts.map +1 -0
  143. package/dist/flowchart-parts.js +102 -0
  144. package/dist/flowchart-parts.js.map +1 -0
  145. package/dist/flowchart-parts.mjs +4 -0
  146. package/dist/flowchart-parts.mjs.map +1 -0
  147. package/dist/glossy-button.d.cts +21 -0
  148. package/dist/glossy-button.d.ts +21 -0
  149. package/dist/glossy-button.d.ts.map +1 -0
  150. package/dist/glossy-button.js +87 -0
  151. package/dist/glossy-button.js.map +1 -0
  152. package/dist/glossy-button.mjs +4 -0
  153. package/dist/glossy-button.mjs.map +1 -0
  154. package/dist/grainient.css +9 -0
  155. package/dist/grainient.css.map +1 -0
  156. package/dist/grainient.d.cts +5 -0
  157. package/dist/grainient.d.ts +5 -0
  158. package/dist/grainient.d.ts.map +1 -0
  159. package/dist/grainient.js +330 -0
  160. package/dist/grainient.js.map +1 -0
  161. package/dist/grainient.mjs +4 -0
  162. package/dist/grainient.mjs.map +1 -0
  163. package/dist/grainient.shader.d.cts +9 -0
  164. package/dist/grainient.shader.d.ts +9 -0
  165. package/dist/grainient.shader.d.ts.map +1 -0
  166. package/dist/grainient.types.d.cts +30 -0
  167. package/dist/grainient.types.d.ts +30 -0
  168. package/dist/grainient.types.d.ts.map +1 -0
  169. package/dist/highlighter.d.cts +47 -0
  170. package/dist/highlighter.d.ts +47 -0
  171. package/dist/highlighter.d.ts.map +1 -0
  172. package/dist/highlighter.js +125 -0
  173. package/dist/highlighter.js.map +1 -0
  174. package/dist/highlighter.mjs +5 -0
  175. package/dist/highlighter.mjs.map +1 -0
  176. package/dist/index.css +27 -0
  177. package/dist/index.css.map +1 -0
  178. package/dist/index.d.cts +56 -0
  179. package/dist/index.d.ts +56 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +2723 -0
  182. package/dist/index.js.map +1 -0
  183. package/dist/index.mjs +34 -0
  184. package/dist/index.mjs.map +1 -0
  185. package/dist/input.d.cts +15 -0
  186. package/dist/input.d.ts +15 -0
  187. package/dist/input.d.ts.map +1 -0
  188. package/dist/input.js +110 -0
  189. package/dist/input.js.map +1 -0
  190. package/dist/input.mjs +4 -0
  191. package/dist/input.mjs.map +1 -0
  192. package/dist/lib/breakpoints.d.cts +36 -0
  193. package/dist/lib/breakpoints.d.ts +36 -0
  194. package/dist/lib/breakpoints.d.ts.map +1 -0
  195. package/dist/lib/breakpoints.js +41 -0
  196. package/dist/lib/breakpoints.js.map +1 -0
  197. package/dist/lib/breakpoints.mjs +3 -0
  198. package/dist/lib/breakpoints.mjs.map +1 -0
  199. package/dist/lib/cn.js +24 -0
  200. package/dist/lib/cn.js.map +1 -0
  201. package/dist/lib/cn.mjs +3 -0
  202. package/dist/lib/cn.mjs.map +1 -0
  203. package/dist/lib/ease.d.cts +19 -0
  204. package/dist/lib/ease.d.ts +19 -0
  205. package/dist/lib/ease.d.ts.map +1 -0
  206. package/dist/lib/ease.js +16 -0
  207. package/dist/lib/ease.js.map +1 -0
  208. package/dist/lib/ease.mjs +3 -0
  209. package/dist/lib/ease.mjs.map +1 -0
  210. package/dist/lib/surface.d.cts +14 -0
  211. package/dist/lib/surface.d.ts +14 -0
  212. package/dist/lib/surface.d.ts.map +1 -0
  213. package/dist/lib/surface.js +40 -0
  214. package/dist/lib/surface.js.map +1 -0
  215. package/dist/lib/surface.mjs +3 -0
  216. package/dist/lib/surface.mjs.map +1 -0
  217. package/dist/lib/use-media-query.d.cts +9 -0
  218. package/dist/lib/use-media-query.d.ts +9 -0
  219. package/dist/lib/use-media-query.d.ts.map +1 -0
  220. package/dist/lib/use-media-query.js +19 -0
  221. package/dist/lib/use-media-query.js.map +1 -0
  222. package/dist/lib/use-media-query.mjs +3 -0
  223. package/dist/lib/use-media-query.mjs.map +1 -0
  224. package/dist/lib/utils.d.cts +25 -0
  225. package/dist/lib/utils.d.ts +25 -0
  226. package/dist/lib/utils.d.ts.map +1 -0
  227. package/dist/liquid-metal.d.cts +24 -0
  228. package/dist/liquid-metal.d.ts +24 -0
  229. package/dist/liquid-metal.d.ts.map +1 -0
  230. package/dist/liquid-metal.js +43 -0
  231. package/dist/liquid-metal.js.map +1 -0
  232. package/dist/liquid-metal.mjs +4 -0
  233. package/dist/liquid-metal.mjs.map +1 -0
  234. package/dist/navigation-menu-icons.d.cts +5 -0
  235. package/dist/navigation-menu-icons.d.ts +5 -0
  236. package/dist/navigation-menu-icons.d.ts.map +1 -0
  237. package/dist/navigation-menu-icons.js +42 -0
  238. package/dist/navigation-menu-icons.js.map +1 -0
  239. package/dist/navigation-menu-icons.mjs +3 -0
  240. package/dist/navigation-menu-icons.mjs.map +1 -0
  241. package/dist/navigation-menu-styles.d.cts +45 -0
  242. package/dist/navigation-menu-styles.d.ts +45 -0
  243. package/dist/navigation-menu-styles.d.ts.map +1 -0
  244. package/dist/navigation-menu-styles.js +16 -0
  245. package/dist/navigation-menu-styles.js.map +1 -0
  246. package/dist/navigation-menu-styles.mjs +3 -0
  247. package/dist/navigation-menu-styles.mjs.map +1 -0
  248. package/dist/navigation-menu.d.cts +18 -0
  249. package/dist/navigation-menu.d.ts +18 -0
  250. package/dist/navigation-menu.d.ts.map +1 -0
  251. package/dist/navigation-menu.js +367 -0
  252. package/dist/navigation-menu.js.map +1 -0
  253. package/dist/navigation-menu.mjs +7 -0
  254. package/dist/navigation-menu.mjs.map +1 -0
  255. package/dist/password-input.d.cts +6 -0
  256. package/dist/password-input.d.ts +6 -0
  257. package/dist/password-input.d.ts.map +1 -0
  258. package/dist/password-input.js +174 -0
  259. package/dist/password-input.js.map +1 -0
  260. package/dist/password-input.mjs +5 -0
  261. package/dist/password-input.mjs.map +1 -0
  262. package/dist/rainbow-button.d.cts +16 -0
  263. package/dist/rainbow-button.d.ts +16 -0
  264. package/dist/rainbow-button.d.ts.map +1 -0
  265. package/dist/rainbow-button.js +49 -0
  266. package/dist/rainbow-button.js.map +1 -0
  267. package/dist/rainbow-button.mjs +4 -0
  268. package/dist/rainbow-button.mjs.map +1 -0
  269. package/dist/range-slider.d.cts +20 -0
  270. package/dist/range-slider.d.ts +20 -0
  271. package/dist/range-slider.d.ts.map +1 -0
  272. package/dist/range-slider.js +85 -0
  273. package/dist/range-slider.js.map +1 -0
  274. package/dist/range-slider.mjs +3 -0
  275. package/dist/range-slider.mjs.map +1 -0
  276. package/dist/rolling-badge.d.cts +11 -0
  277. package/dist/rolling-badge.d.ts +11 -0
  278. package/dist/rolling-badge.d.ts.map +1 -0
  279. package/dist/rolling-badge.js +71 -0
  280. package/dist/rolling-badge.js.map +1 -0
  281. package/dist/rolling-badge.mjs +4 -0
  282. package/dist/rolling-badge.mjs.map +1 -0
  283. package/dist/savings-badge.d.cts +10 -0
  284. package/dist/savings-badge.d.ts +10 -0
  285. package/dist/savings-badge.d.ts.map +1 -0
  286. package/dist/savings-badge.js +26 -0
  287. package/dist/savings-badge.js.map +1 -0
  288. package/dist/savings-badge.mjs +4 -0
  289. package/dist/savings-badge.mjs.map +1 -0
  290. package/dist/shine-border.d.cts +15 -0
  291. package/dist/shine-border.d.ts +15 -0
  292. package/dist/shine-border.d.ts.map +1 -0
  293. package/dist/shine-border.js +47 -0
  294. package/dist/shine-border.js.map +1 -0
  295. package/dist/shine-border.mjs +4 -0
  296. package/dist/shine-border.mjs.map +1 -0
  297. package/dist/sparkles-text.d.cts +22 -0
  298. package/dist/sparkles-text.d.ts +22 -0
  299. package/dist/sparkles-text.d.ts.map +1 -0
  300. package/dist/sparkles-text.js +87 -0
  301. package/dist/sparkles-text.js.map +1 -0
  302. package/dist/sparkles-text.mjs +5 -0
  303. package/dist/sparkles-text.mjs.map +1 -0
  304. package/dist/tabs.d.cts +16 -0
  305. package/dist/tabs.d.ts +16 -0
  306. package/dist/tabs.d.ts.map +1 -0
  307. package/dist/tabs.js +121 -0
  308. package/dist/tabs.js.map +1 -0
  309. package/dist/tabs.mjs +4 -0
  310. package/dist/tabs.mjs.map +1 -0
  311. package/dist/theme-toggle.d.cts +10 -0
  312. package/dist/theme-toggle.d.ts +10 -0
  313. package/dist/theme-toggle.d.ts.map +1 -0
  314. package/dist/theme-toggle.js +251 -0
  315. package/dist/theme-toggle.js.map +1 -0
  316. package/dist/theme-toggle.mjs +7 -0
  317. package/dist/theme-toggle.mjs.map +1 -0
  318. package/package.json +428 -0
@@ -0,0 +1,74 @@
1
+ import { Button } from './chunk-AYY7D2RJ.mjs';
2
+ import { ActionSwapRollIcon, ActionSwapRollText } from './chunk-DA3I3Y5O.mjs';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ var ICON_LAYOUT = "w-8 p-0";
6
+ var LABELED_LAYOUT = "gap-2 px-3 text-[13px]";
7
+ function SunIcon() {
8
+ return /* @__PURE__ */ jsxs(
9
+ "svg",
10
+ {
11
+ width: 14,
12
+ height: 14,
13
+ viewBox: "0 0 24 24",
14
+ fill: "none",
15
+ stroke: "currentColor",
16
+ strokeWidth: 2,
17
+ strokeLinecap: "round",
18
+ strokeLinejoin: "round",
19
+ "aria-hidden": true,
20
+ children: [
21
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "4" }),
22
+ /* @__PURE__ */ jsx("line", { x1: "12", y1: "3", x2: "12", y2: "1" }),
23
+ /* @__PURE__ */ jsx("line", { x1: "12", y1: "23", x2: "12", y2: "21" }),
24
+ /* @__PURE__ */ jsx("line", { x1: "3", y1: "12", x2: "1", y2: "12" }),
25
+ /* @__PURE__ */ jsx("line", { x1: "23", y1: "12", x2: "21", y2: "12" }),
26
+ /* @__PURE__ */ jsx("line", { x1: "5", y1: "5", x2: "3.5", y2: "3.5" }),
27
+ /* @__PURE__ */ jsx("line", { x1: "20.5", y1: "20.5", x2: "19", y2: "19" }),
28
+ /* @__PURE__ */ jsx("line", { x1: "19", y1: "5", x2: "20.5", y2: "3.5" }),
29
+ /* @__PURE__ */ jsx("line", { x1: "4.5", y1: "20.5", x2: "3", y2: "19" })
30
+ ]
31
+ }
32
+ );
33
+ }
34
+ function MoonIcon() {
35
+ return /* @__PURE__ */ jsx(
36
+ "svg",
37
+ {
38
+ width: 14,
39
+ height: 14,
40
+ viewBox: "0 0 24 24",
41
+ fill: "none",
42
+ stroke: "currentColor",
43
+ strokeWidth: 2,
44
+ strokeLinecap: "round",
45
+ strokeLinejoin: "round",
46
+ "aria-hidden": true,
47
+ children: /* @__PURE__ */ jsx("path", { d: "M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z" })
48
+ }
49
+ );
50
+ }
51
+ function ThemeToggle({ theme, onToggle, showLabel = false }) {
52
+ const size = showLabel ? "md" : "sm";
53
+ const layoutClassName = showLabel ? LABELED_LAYOUT : ICON_LAYOUT;
54
+ const isDark = theme === "dark";
55
+ const label = isDark ? "Switch to light mode" : "Switch to dark mode";
56
+ return /* @__PURE__ */ jsxs(
57
+ Button,
58
+ {
59
+ variant: "filled",
60
+ size,
61
+ actionOrLink: onToggle,
62
+ className: layoutClassName,
63
+ "aria-label": label,
64
+ children: [
65
+ /* @__PURE__ */ jsx(ActionSwapRollIcon, { value: theme, className: "h-4 w-4", children: isDark ? /* @__PURE__ */ jsx(SunIcon, {}) : /* @__PURE__ */ jsx(MoonIcon, {}) }),
66
+ showLabel ? /* @__PURE__ */ jsx(ActionSwapRollText, { value: theme, children: label }) : null
67
+ ]
68
+ }
69
+ );
70
+ }
71
+
72
+ export { ThemeToggle };
73
+ //# sourceMappingURL=chunk-KMXUQYR3.mjs.map
74
+ //# sourceMappingURL=chunk-KMXUQYR3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/theme-toggle.tsx"],"names":[],"mappings":"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","file":"chunk-KMXUQYR3.mjs","sourcesContent":["'use client';\n\nimport { ActionSwapRollIcon, ActionSwapRollText } from './action-swap.js';\nimport { Button } from './button.js';\n\n/*\n * Controlled theme toggle: the parent owns the current theme and the flip\n * handler, so there's no next-themes, no hydration detection, and no\n * pre-hydration CSS fallback — the theme is always known and the roll renders\n * directly on first paint.\n */\n\n// Icon-only (navbar / footer) sits on the `sm` height; the labeled row (mobile\n// drawer) on `md`. The `w-8 p-0` / `gap-2 px-3 text-[13px]` overrides turn the\n// shared <Button> sizes into the toggle's square and labeled geometries.\nconst ICON_LAYOUT = 'w-8 p-0';\nconst LABELED_LAYOUT = 'gap-2 px-3 text-[13px]';\n\n/** Sun glyph — the icon shown while dark, i.e. the theme you switch *to*. */\nfunction SunIcon() {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden={true}\n >\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"1\" />\n <line x1=\"12\" y1=\"23\" x2=\"12\" y2=\"21\" />\n <line x1=\"3\" y1=\"12\" x2=\"1\" y2=\"12\" />\n <line x1=\"23\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"5\" y1=\"5\" x2=\"3.5\" y2=\"3.5\" />\n <line x1=\"20.5\" y1=\"20.5\" x2=\"19\" y2=\"19\" />\n <line x1=\"19\" y1=\"5\" x2=\"20.5\" y2=\"3.5\" />\n <line x1=\"4.5\" y1=\"20.5\" x2=\"3\" y2=\"19\" />\n </svg>\n );\n}\n\n/** Moon glyph — the icon shown while light, i.e. the theme you switch *to*. */\nfunction MoonIcon() {\n return (\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden={true}\n >\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8z\" />\n </svg>\n );\n}\n\nexport type ThemeToggleProps = {\n /** Current theme — drives which icon/label the roll shows. */\n theme: 'light' | 'dark';\n /** Flip handler; the parent persists the new theme. */\n onToggle: () => void;\n /** Render the labeled row (mobile drawer) instead of the icon-only square. */\n showLabel?: boolean;\n};\n\nexport function ThemeToggle({ theme, onToggle, showLabel = false }: ThemeToggleProps) {\n const size = showLabel ? 'md' : 'sm';\n const layoutClassName = showLabel ? LABELED_LAYOUT : ICON_LAYOUT;\n\n // The icon shows the theme you are switching *to*, matching the label.\n const isDark = theme === 'dark';\n const label = isDark ? 'Switch to light mode' : 'Switch to dark mode';\n\n return (\n <Button\n variant=\"filled\"\n size={size}\n actionOrLink={onToggle}\n className={layoutClassName}\n // The visible label rolls, so mid-swap both strings are briefly in the\n // tree. Naming the button explicitly keeps it unambiguous either way.\n aria-label={label}\n >\n <ActionSwapRollIcon value={theme} className=\"h-4 w-4\">\n {isDark ? <SunIcon /> : <MoonIcon />}\n </ActionSwapRollIcon>\n {showLabel ? <ActionSwapRollText value={theme}>{label}</ActionSwapRollText> : null}\n </Button>\n );\n}\n"]}
@@ -0,0 +1,88 @@
1
+ import { cn } from './chunk-QAWSH567.mjs';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+
4
+ var downChevronClass = "absolute left-1/2 top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)";
5
+ var rightChevronClass = "absolute right-0 top-1/2 size-2 translate-x-1/2 -translate-y-1/2 rotate-45 border-t border-r border-(--foreground-muted)";
6
+ var leftChevronClass = "absolute left-0 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 -rotate-45 border-t border-l border-(--foreground-muted)";
7
+ var microLabelClass = "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full border border-(--border) bg-(--muted) px-1.5 py-px font-mono text-[8.5px] leading-tight text-(--foreground-secondary)";
8
+ function ArrowRight({ label, className }) {
9
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex items-center", className), children: [
10
+ /* @__PURE__ */ jsx("span", { className: "h-px w-full bg-(--foreground-muted)" }),
11
+ /* @__PURE__ */ jsx("span", { className: rightChevronClass }),
12
+ label ? /* @__PURE__ */ jsx("span", { className: microLabelClass, children: label }) : null
13
+ ] });
14
+ }
15
+ function ArrowLeft({ label, className }) {
16
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex items-center", className), children: [
17
+ /* @__PURE__ */ jsx("span", { className: "h-px w-full bg-(--foreground-muted)" }),
18
+ /* @__PURE__ */ jsx("span", { className: leftChevronClass }),
19
+ label ? /* @__PURE__ */ jsx("span", { className: microLabelClass, children: label }) : null
20
+ ] });
21
+ }
22
+ function TurnDown({ className }) {
23
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative h-4", className), children: [
24
+ /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-0 h-full w-px -translate-x-1/2 bg-(--foreground-muted)" }),
25
+ /* @__PURE__ */ jsx("span", { className: downChevronClass })
26
+ ] });
27
+ }
28
+ function SplitArrow({ leftLabel, rightLabel, className }) {
29
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative h-12", className), children: [
30
+ /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
31
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[25%] right-[25%] top-1/2 h-px -translate-y-1/2 bg-(--foreground-muted)" }),
32
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[25%] top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
33
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[75%] top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
34
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[25%] top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)" }),
35
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[75%] top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)" }),
36
+ leftLabel ? /* @__PURE__ */ jsx("span", { className: "absolute left-[30%] top-1/2 -translate-y-1/2 rounded-full border border-(--border) bg-(--muted) px-2 py-0.5 font-mono text-[10px] text-(--foreground-secondary)", children: leftLabel }) : null,
37
+ rightLabel ? /* @__PURE__ */ jsx("span", { className: "absolute right-[30%] top-1/2 -translate-y-1/2 rounded-full border border-(--border) bg-(--muted) px-2 py-0.5 font-mono text-[10px] text-(--foreground-secondary)", children: rightLabel }) : null
38
+ ] });
39
+ }
40
+ function JoinArrow({ className }) {
41
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative h-12", className), children: [
42
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[25%] top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
43
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[75%] top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
44
+ /* @__PURE__ */ jsx("span", { className: "absolute left-[25%] right-[25%] top-1/2 h-px -translate-y-1/2 bg-(--foreground-muted)" }),
45
+ /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)" }),
46
+ /* @__PURE__ */ jsx("span", { className: "absolute left-1/2 top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)" })
47
+ ] });
48
+ }
49
+ function FlowNode({ icon, chipClass, title, body, tag, children, className }) {
50
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full flex-col rounded-[12px] border border-(--border) bg-(--surface) p-2.5", className), children: [
51
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-2", children: [
52
+ icon ? /* @__PURE__ */ jsx("div", { className: cn("flex size-7 shrink-0 items-center justify-center rounded-[8px]", chipClass ?? "bg-(--muted)"), children: icon }) : null,
53
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
54
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-1.5 gap-y-0.5", children: [
55
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-[11px] leading-snug text-foreground sm:text-[12px]", children: title }),
56
+ tag ? /* @__PURE__ */ jsx("span", { className: "rounded-full border border-(--border) px-1.5 py-px font-mono text-[8.5px] text-(--foreground-muted)", children: tag }) : null
57
+ ] }),
58
+ body ? /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-[9.5px] leading-snug text-(--foreground-secondary) sm:text-[10px]", children: body }) : null
59
+ ] })
60
+ ] }),
61
+ children ? /* @__PURE__ */ jsx("div", { className: "mt-2", children }) : null
62
+ ] });
63
+ }
64
+ function FlowPill({ title, className }) {
65
+ return /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ className: cn(
69
+ "mx-auto flex w-fit max-w-full items-center justify-center rounded-full border border-(--border) bg-(--surface) px-4 py-2 text-center",
70
+ className
71
+ ),
72
+ children: /* @__PURE__ */ jsx("p", { className: "text-[12px] font-semibold leading-snug text-foreground", children: title })
73
+ }
74
+ );
75
+ }
76
+ function FlowDiamond({ label, sub, className }) {
77
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative h-14 w-36 justify-self-center sm:h-16 sm:w-44", className), children: [
78
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-(--border-hi) [clip-path:polygon(50%_0,100%_50%,50%_100%,0_50%)]" }),
79
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-[1px] flex flex-col items-center justify-center gap-0.5 bg-(--surface) px-6 text-center [clip-path:polygon(50%_0,100%_50%,50%_100%,0_50%)]", children: [
80
+ /* @__PURE__ */ jsx("p", { className: "text-[11px] font-semibold leading-tight text-foreground sm:text-[12px]", children: label }),
81
+ sub ? /* @__PURE__ */ jsx("p", { className: "text-[8.5px] leading-tight text-(--foreground-muted)", children: sub }) : null
82
+ ] })
83
+ ] });
84
+ }
85
+
86
+ export { ArrowLeft, ArrowRight, FlowDiamond, FlowNode, FlowPill, JoinArrow, SplitArrow, TurnDown };
87
+ //# sourceMappingURL=chunk-KNPOZ34H.mjs.map
88
+ //# sourceMappingURL=chunk-KNPOZ34H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/flowchart-parts.tsx"],"names":[],"mappings":"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","file":"chunk-KNPOZ34H.mjs","sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cn } from '../lib/utils.js';\n\n// ── Non-exported helpers ──────────────────────────────────────────────────────\n\n/** Downward chevron (rotated square, two borders) placed at the end of a line. */\nconst downChevronClass =\n 'absolute left-1/2 top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)';\n\nconst rightChevronClass =\n 'absolute right-0 top-1/2 size-2 translate-x-1/2 -translate-y-1/2 rotate-45 border-t border-r border-(--foreground-muted)';\n\nconst leftChevronClass =\n 'absolute left-0 top-1/2 size-2 -translate-x-1/2 -translate-y-1/2 -rotate-45 border-t border-l border-(--foreground-muted)';\n\n/** Micro label chip that masks the line it sits on. */\nconst microLabelClass =\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full border border-(--border) bg-(--muted) px-1.5 py-px font-mono text-[8.5px] leading-tight text-(--foreground-secondary)';\n\n// ── Exports ───────────────────────────────────────────────────────────────────\n\ntype ArrowRightProps = { label?: string; className?: string };\n\n/** Horizontal connector (left → right) between two snake cells. */\nexport function ArrowRight({ label, className }: ArrowRightProps) {\n return (\n <div className={cn('relative flex items-center', className)}>\n <span className=\"h-px w-full bg-(--foreground-muted)\" />\n <span className={rightChevronClass} />\n {label ? <span className={microLabelClass}>{label}</span> : null}\n </div>\n );\n}\n\ntype ArrowLeftProps = { label?: string; className?: string };\n\n/** Horizontal connector (right → left) between two snake cells. */\nexport function ArrowLeft({ label, className }: ArrowLeftProps) {\n return (\n <div className={cn('relative flex items-center', className)}>\n <span className=\"h-px w-full bg-(--foreground-muted)\" />\n <span className={leftChevronClass} />\n {label ? <span className={microLabelClass}>{label}</span> : null}\n </div>\n );\n}\n\ntype TurnDownProps = { className?: string };\n\n/** Short vertical connector used when the snake drops to the next row. */\nexport function TurnDown({ className }: TurnDownProps) {\n return (\n <div className={cn('relative h-4', className)}>\n <span className=\"absolute left-1/2 top-0 h-full w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className={downChevronClass} />\n </div>\n );\n}\n\ntype SplitArrowProps = { leftLabel?: string; rightLabel?: string; className?: string };\n\n/** One-to-two branch connector: spine down, horizontal arm, drops at 25% / 75%. */\nexport function SplitArrow({ leftLabel, rightLabel, className }: SplitArrowProps) {\n return (\n <div className={cn('relative h-12', className)}>\n <span className=\"absolute left-1/2 top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[25%] right-[25%] top-1/2 h-px -translate-y-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[25%] top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[75%] top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[25%] top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)\" />\n <span className=\"absolute left-[75%] top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)\" />\n {leftLabel ? (\n <span className=\"absolute left-[30%] top-1/2 -translate-y-1/2 rounded-full border border-(--border) bg-(--muted) px-2 py-0.5 font-mono text-[10px] text-(--foreground-secondary)\">\n {leftLabel}\n </span>\n ) : null}\n {rightLabel ? (\n <span className=\"absolute right-[30%] top-1/2 -translate-y-1/2 rounded-full border border-(--border) bg-(--muted) px-2 py-0.5 font-mono text-[10px] text-(--foreground-secondary)\">\n {rightLabel}\n </span>\n ) : null}\n </div>\n );\n}\n\ntype JoinArrowProps = { className?: string };\n\n/** Two-to-one join connector: risers at 25% / 75%, horizontal arm, spine down. */\nexport function JoinArrow({ className }: JoinArrowProps) {\n return (\n <div className={cn('relative h-12', className)}>\n <span className=\"absolute left-[25%] top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[75%] top-0 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-[25%] right-[25%] top-1/2 h-px -translate-y-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-1/2 top-1/2 h-1/2 w-px -translate-x-1/2 bg-(--foreground-muted)\" />\n <span className=\"absolute left-1/2 top-full size-2 -translate-x-1/2 -translate-y-1/2 rotate-45 border-b border-r border-(--foreground-muted)\" />\n </div>\n );\n}\n\ntype FlowNodeProps = {\n icon?: ReactNode;\n /**\n * Accepted for API compatibility with the site's icon-based version; the icon is now a\n * caller-supplied ReactNode that carries its own sizing/color classes, so this is unused.\n */\n iconClass?: string;\n chipClass?: string;\n title: string;\n body?: string;\n tag?: string;\n children?: ReactNode;\n className?: string;\n};\n\n/** A compact rounded node: icon chip, one-line title, one-line sub, optional children. */\nexport function FlowNode({ icon, chipClass, title, body, tag, children, className }: FlowNodeProps) {\n return (\n <div className={cn('flex h-full flex-col rounded-[12px] border border-(--border) bg-(--surface) p-2.5', className)}>\n <div className=\"flex items-start gap-2\">\n {icon ? (\n <div className={cn('flex size-7 shrink-0 items-center justify-center rounded-[8px]', chipClass ?? 'bg-(--muted)')}>\n {icon}\n </div>\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-x-1.5 gap-y-0.5\">\n <p className=\"font-semibold text-[11px] leading-snug text-foreground sm:text-[12px]\">{title}</p>\n {tag ? (\n <span className=\"rounded-full border border-(--border) px-1.5 py-px font-mono text-[8.5px] text-(--foreground-muted)\">\n {tag}\n </span>\n ) : null}\n </div>\n {body ? <p className=\"mt-0.5 text-[9.5px] leading-snug text-(--foreground-secondary) sm:text-[10px]\">{body}</p> : null}\n </div>\n </div>\n {children ? <div className=\"mt-2\">{children}</div> : null}\n </div>\n );\n}\n\ntype FlowPillProps = { title: string; className?: string };\n\n/** A start/end pill: centered, fits content, sits on the flowchart spine. */\nexport function FlowPill({ title, className }: FlowPillProps) {\n return (\n <div\n className={cn(\n 'mx-auto flex w-fit max-w-full items-center justify-center rounded-full border border-(--border) bg-(--surface) px-4 py-2 text-center',\n className,\n )}\n >\n <p className=\"text-[12px] font-semibold leading-snug text-foreground\">{title}</p>\n </div>\n );\n}\n\ntype FlowDiamondProps = { label: string; sub?: string; className?: string };\n\n/** A compact decision diamond (clip-path, straight text inside). */\nexport function FlowDiamond({ label, sub, className }: FlowDiamondProps) {\n return (\n <div className={cn('relative h-14 w-36 justify-self-center sm:h-16 sm:w-44', className)}>\n <div className=\"absolute inset-0 bg-(--border-hi) [clip-path:polygon(50%_0,100%_50%,50%_100%,0_50%)]\" />\n <div className=\"absolute inset-[1px] flex flex-col items-center justify-center gap-0.5 bg-(--surface) px-6 text-center [clip-path:polygon(50%_0,100%_50%,50%_100%,0_50%)]\">\n <p className=\"text-[11px] font-semibold leading-tight text-foreground sm:text-[12px]\">{label}</p>\n {sub ? <p className=\"text-[8.5px] leading-tight text-(--foreground-muted)\">{sub}</p> : null}\n </div>\n </div>\n );\n}\n"]}
@@ -0,0 +1,219 @@
1
+ import { cn } from './chunk-QAWSH567.mjs';
2
+ import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ function Accordion({
6
+ className,
7
+ multiple = false,
8
+ variant = "default",
9
+ ...props
10
+ }) {
11
+ return /* @__PURE__ */ jsx(
12
+ Accordion$1.Root,
13
+ {
14
+ "data-slot": "accordion",
15
+ "data-variant": variant,
16
+ multiple,
17
+ className: cn(
18
+ "group flex w-full flex-col",
19
+ variant === "split" && "space-y-2",
20
+ variant === "outline" && "overflow-hidden rounded-lg border bg-(--surface)",
21
+ variant === "nested" && "rounded-lg border bg-muted p-1",
22
+ className
23
+ ),
24
+ ...props
25
+ }
26
+ );
27
+ }
28
+ function AccordionItem({ className, ...props }) {
29
+ return /* @__PURE__ */ jsx(
30
+ Accordion$1.Item,
31
+ {
32
+ "data-slot": "accordion-item",
33
+ className: cn(
34
+ "transition-[margin,border-radius,border] duration-250 ease-out-expo",
35
+ // Default variant styles
36
+ "group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0",
37
+ // Split variant styles (individual cards)
38
+ "group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)",
39
+ // Outline variant styles (items within single card)
40
+ "group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0",
41
+ // Nested variant styles - items within the single outer card
42
+ "group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0",
43
+ // Isolated bordered variant styles - dynamically separates open items from closed ones
44
+ // Base styles: all items have borders and background to look like cards
45
+ "group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)",
46
+ // Closed items: group together by overlapping borders with negative margin
47
+ // Only apply to closed items that follow another closed item (not open items, first item, or items after open items)
48
+ "group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px",
49
+ // Opened item - separated with margins
50
+ "group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg",
51
+ // First item
52
+ "group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0",
53
+ // Last item
54
+ "group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0",
55
+ // Item after open item: round top corners (start of new group)
56
+ "group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg",
57
+ // Item before open item: round bottom corners (end of group)
58
+ "group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg",
59
+ // Isolated filled variant
60
+ "group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted",
61
+ // Opened item - separated with margins and rounded
62
+ "group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg",
63
+ // First item
64
+ "group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0",
65
+ // Last item
66
+ "group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0",
67
+ // Item after open item: round top corners (start of new group)
68
+ "group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg",
69
+ // Item before open item: round bottom corners (end of group)
70
+ "group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg",
71
+ // Isolated filled bordered variant - filled background with borders between closed items
72
+ "group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted",
73
+ // All items except last have border-bottom to prevent layout shift, default to visible border
74
+ "group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b",
75
+ // Make border transparent (invisible) for: items before open items, and open items themselves
76
+ "group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent",
77
+ "group-data-[variant=isolated-filled-bordered]:data-open:border-transparent",
78
+ // Opened item - separated with margins and rounded
79
+ "group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg",
80
+ // First item
81
+ "group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0",
82
+ // Last item
83
+ "group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0",
84
+ // Item after open item: round top corners (start of new group)
85
+ "group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg",
86
+ // Item before open item: round bottom corners (end of group)
87
+ "group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg",
88
+ className
89
+ ),
90
+ ...props
91
+ }
92
+ );
93
+ }
94
+ function AccordionHeader({ className, ...props }) {
95
+ return /* @__PURE__ */ jsx(
96
+ Accordion$1.Header,
97
+ {
98
+ "data-slot": "accordion-header",
99
+ className: cn("not-prose", className),
100
+ ...props
101
+ }
102
+ );
103
+ }
104
+ function AccordionTrigger({
105
+ children,
106
+ className,
107
+ showIndicator = true,
108
+ indicatorType = "plus",
109
+ indicatorPosition = "end",
110
+ indicatorColor,
111
+ icon,
112
+ subtitle,
113
+ ...props
114
+ }) {
115
+ const hasStartIndicator = showIndicator && indicatorPosition === "start";
116
+ const hasEndIndicator = showIndicator && indicatorPosition === "end";
117
+ const renderIndicator = () => {
118
+ if (!showIndicator) return null;
119
+ const indicatorClassName = cn("size-4 shrink-0 transition-transform duration-200 ease-out-expo", indicatorColor);
120
+ const indicatorIcon = indicatorType === "chevron" ? /* @__PURE__ */ jsx(ChevronDownIcon, { "data-slot": "accordion-indicator", className: indicatorClassName }) : /* @__PURE__ */ jsx(PlusIcon, { "data-slot": "accordion-indicator", className: indicatorClassName });
121
+ return /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: indicatorIcon });
122
+ };
123
+ return /* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsxs(
124
+ Accordion$1.Trigger,
125
+ {
126
+ "data-slot": "accordion-trigger",
127
+ "data-has-icon": hasStartIndicator ? "true" : void 0,
128
+ className: cn(
129
+ "group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60",
130
+ // Default variant styles
131
+ "group-data-[variant=default]:px-0",
132
+ // Split variant styles
133
+ "group-data-[variant=split]:rounded-t-lg",
134
+ // Nested variant styles - trigger with subtle interaction
135
+ "group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50",
136
+ // Indicator rotation animations
137
+ indicatorType === "chevron" && "[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180",
138
+ indicatorType === "plus" && "[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90",
139
+ className
140
+ ),
141
+ ...props,
142
+ children: [
143
+ hasStartIndicator ? renderIndicator() : null,
144
+ icon && !hasStartIndicator && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: icon }),
145
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
146
+ /* @__PURE__ */ jsx("span", { className: "underline-offset-2 group-hover/trigger:underline", children }),
147
+ subtitle ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-sm no-underline", children: subtitle }) : null
148
+ ] }),
149
+ hasEndIndicator ? renderIndicator() : null
150
+ ]
151
+ }
152
+ ) });
153
+ }
154
+ function AccordionContent({ children, className, ...props }) {
155
+ return /* @__PURE__ */ jsx(
156
+ Accordion$1.Panel,
157
+ {
158
+ "data-slot": "accordion-content",
159
+ className: cn(
160
+ "h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0"
161
+ ),
162
+ ...props,
163
+ children: /* @__PURE__ */ jsx(
164
+ "div",
165
+ {
166
+ className: cn(
167
+ "p-3.5 text-muted-foreground",
168
+ "group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0",
169
+ "group-data-[variant=split]:pt-0",
170
+ "group-data-[variant=outline]:pt-0",
171
+ // Nested variant
172
+ "group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0",
173
+ // Isolated bordered variant
174
+ "group-data-[variant=isolated-bordered]:pt-0",
175
+ // Isolated filled variant
176
+ "group-data-[variant=isolated-filled]:pt-0",
177
+ // Isolated filled bordered variant
178
+ "group-data-[variant=isolated-filled-bordered]:pt-0",
179
+ // Icon alignment - add left padding when parent item contains a trigger with icon
180
+ "[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]",
181
+ "[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]",
182
+ className
183
+ ),
184
+ children
185
+ }
186
+ )
187
+ }
188
+ );
189
+ }
190
+ function PlusIcon(props) {
191
+ return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", ...props, children: [
192
+ /* @__PURE__ */ jsx(
193
+ "path",
194
+ {
195
+ fillRule: "evenodd",
196
+ clipRule: "evenodd",
197
+ d: "M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z",
198
+ fill: "currentColor",
199
+ className: "in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo"
200
+ }
201
+ ),
202
+ /* @__PURE__ */ jsx(
203
+ "path",
204
+ {
205
+ fillRule: "evenodd",
206
+ clipRule: "evenodd",
207
+ d: "M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z",
208
+ fill: "currentColor"
209
+ }
210
+ )
211
+ ] });
212
+ }
213
+ function ChevronDownIcon(props) {
214
+ return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", ...props, children: /* @__PURE__ */ jsx("path", { d: "M1 3.5L5 7.5L9 3.5", stroke: "currentColor", strokeWidth: "1.5" }) });
215
+ }
216
+
217
+ export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };
218
+ //# sourceMappingURL=chunk-KRNWCJ4D.mjs.map
219
+ //# sourceMappingURL=chunk-KRNWCJ4D.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/accordion.tsx"],"names":["BaseAccordion"],"mappings":"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","file":"chunk-KRNWCJ4D.mjs","sourcesContent":["import { Accordion as BaseAccordion } from '@base-ui/react/accordion';\nimport type * as React from 'react';\nimport { cn } from '../lib/utils.js';\n\ntype AccordionVariant =\n | 'default'\n | 'split'\n | 'outline'\n | 'nested'\n | 'isolated-bordered'\n | 'isolated-filled'\n | 'isolated-filled-bordered';\n\nfunction Accordion({\n className,\n multiple = false,\n variant = 'default',\n ...props\n}: BaseAccordion.Root.Props & { variant?: AccordionVariant }) {\n return (\n <BaseAccordion.Root\n data-slot=\"accordion\"\n data-variant={variant}\n multiple={multiple}\n className={cn(\n 'group flex w-full flex-col',\n variant === 'split' && 'space-y-2',\n variant === 'outline' && 'overflow-hidden rounded-lg border bg-(--surface)',\n variant === 'nested' && 'rounded-lg border bg-muted p-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: BaseAccordion.Item.Props) {\n return (\n <BaseAccordion.Item\n data-slot=\"accordion-item\"\n className={cn(\n 'transition-[margin,border-radius,border] duration-250 ease-out-expo',\n // Default variant styles\n 'group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0',\n // Split variant styles (individual cards)\n 'group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)',\n // Outline variant styles (items within single card)\n 'group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0',\n // Nested variant styles - items within the single outer card\n 'group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0',\n // Isolated bordered variant styles - dynamically separates open items from closed ones\n // Base styles: all items have borders and background to look like cards\n 'group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)',\n // Closed items: group together by overlapping borders with negative margin\n // Only apply to closed items that follow another closed item (not open items, first item, or items after open items)\n 'group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px',\n // Opened item - separated with margins\n 'group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled bordered variant - filled background with borders between closed items\n 'group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted',\n // All items except last have border-bottom to prevent layout shift, default to visible border\n 'group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b',\n // Make border transparent (invisible) for: items before open items, and open items themselves\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent',\n 'group-data-[variant=isolated-filled-bordered]:data-open:border-transparent',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionHeader({ className, ...props }: BaseAccordion.Header.Props) {\n return (\n <BaseAccordion.Header\n data-slot=\"accordion-header\"\n // `not-prose` guards the trigger from document typography when the\n // accordion is rendered inside a prose/markdown container (e.g. MDX docs),\n // which would otherwise style this heading with large margins and an\n // inflated line-height. Inert outside a prose context.\n className={cn('not-prose', className)}\n {...props}\n />\n );\n}\n\ninterface AccordionTriggerProps extends BaseAccordion.Trigger.Props {\n showIndicator?: boolean;\n indicatorType?: 'chevron' | 'plus';\n indicatorPosition?: 'start' | 'end';\n /** Colour class applied to the indicator glyph, e.g. `text-(--accent-brand)`. Defaults to muted-foreground. */\n indicatorColor?: string;\n icon?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nfunction AccordionTrigger({\n children,\n className,\n showIndicator = true,\n indicatorType = 'plus',\n indicatorPosition = 'end',\n indicatorColor,\n icon,\n subtitle,\n ...props\n}: AccordionTriggerProps) {\n const hasStartIndicator = showIndicator && indicatorPosition === 'start';\n const hasEndIndicator = showIndicator && indicatorPosition === 'end';\n\n const renderIndicator = () => {\n if (!showIndicator) return null;\n\n const indicatorClassName = cn('size-4 shrink-0 transition-transform duration-200 ease-out-expo', indicatorColor);\n\n const indicatorIcon =\n indicatorType === 'chevron' ? (\n <ChevronDownIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n ) : (\n <PlusIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n );\n\n return (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {indicatorIcon}\n </span>\n );\n };\n\n return (\n <AccordionHeader>\n <BaseAccordion.Trigger\n data-slot=\"accordion-trigger\"\n data-has-icon={hasStartIndicator ? 'true' : undefined}\n className={cn(\n 'group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60',\n // Default variant styles\n 'group-data-[variant=default]:px-0',\n // Split variant styles\n 'group-data-[variant=split]:rounded-t-lg',\n // Nested variant styles - trigger with subtle interaction\n 'group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50',\n // Indicator rotation animations\n indicatorType === 'chevron' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180',\n indicatorType === 'plus' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90',\n className,\n )}\n {...props}\n >\n {hasStartIndicator ? renderIndicator() : null}\n\n {/* icon prop — only rendered when indicator is at end position */}\n {icon && !hasStartIndicator && (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"underline-offset-2 group-hover/trigger:underline\">{children}</span>\n {subtitle ? <span className=\"text-muted-foreground text-sm no-underline\">{subtitle}</span> : null}\n </div>\n\n {hasEndIndicator ? renderIndicator() : null}\n </BaseAccordion.Trigger>\n </AccordionHeader>\n );\n}\n\nfunction AccordionContent({ children, className, ...props }: BaseAccordion.Panel.Props) {\n return (\n <BaseAccordion.Panel\n data-slot=\"accordion-content\"\n className={cn(\n 'h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0',\n )}\n {...props}\n >\n <div\n className={cn(\n 'p-3.5 text-muted-foreground',\n 'group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0',\n 'group-data-[variant=split]:pt-0',\n 'group-data-[variant=outline]:pt-0',\n // Nested variant\n 'group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0',\n // Isolated bordered variant\n 'group-data-[variant=isolated-bordered]:pt-0',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:pt-0',\n // Isolated filled bordered variant\n 'group-data-[variant=isolated-filled-bordered]:pt-0',\n // Icon alignment - add left padding when parent item contains a trigger with icon\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]',\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]',\n className,\n )}\n >\n {children}\n </div>\n </BaseAccordion.Panel>\n );\n}\n\nfunction PlusIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n {/* Horizontal bar - fades out when accordion opens */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z\"\n fill=\"currentColor\"\n className=\"in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo\"\n />\n {/* Vertical bar - remains visible (becomes horizontal after 90° rotation) */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Inline replacement for the site's `@iconify-icons/mingcute/down-line` glyph. */\nfunction ChevronDownIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" {...props}>\n <path d=\"M1 3.5L5 7.5L9 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };\n"]}
@@ -0,0 +1,124 @@
1
+ import { cn } from './chunk-QAWSH567.mjs';
2
+ import { motion } from 'framer-motion';
3
+ import { useId, useState, useEffect } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function AnimatedBeam({
7
+ className,
8
+ containerRef,
9
+ fromRef,
10
+ toRef,
11
+ curvature = 0,
12
+ reverse = false,
13
+ duration = 5,
14
+ delay = 0,
15
+ pathColor = "gray",
16
+ pathWidth = 2,
17
+ pathOpacity = 0.2,
18
+ gradientStartColor = "#ffaa40",
19
+ gradientStopColor = "#9c40ff",
20
+ repeat = Number.POSITIVE_INFINITY,
21
+ repeatDelay = 0,
22
+ startXOffset = 0,
23
+ startYOffset = 0,
24
+ endXOffset = 0,
25
+ endYOffset = 0
26
+ }) {
27
+ const id = useId();
28
+ const [pathD, setPathD] = useState("");
29
+ const [svgDimensions, setSvgDimensions] = useState({
30
+ width: 0,
31
+ height: 0
32
+ });
33
+ const gradientCoordinates = reverse ? {
34
+ x1: ["90%", "-10%"],
35
+ x2: ["100%", "0%"],
36
+ y1: ["0%", "0%"],
37
+ y2: ["0%", "0%"]
38
+ } : {
39
+ x1: ["10%", "110%"],
40
+ x2: ["0%", "100%"],
41
+ y1: ["0%", "0%"],
42
+ y2: ["0%", "0%"]
43
+ };
44
+ useEffect(() => {
45
+ const updatePath = () => {
46
+ if (containerRef.current && fromRef.current && toRef.current) {
47
+ const containerRect = containerRef.current.getBoundingClientRect();
48
+ const rectA = fromRef.current.getBoundingClientRect();
49
+ const rectB = toRef.current.getBoundingClientRect();
50
+ const svgWidth = containerRect.width;
51
+ const svgHeight = containerRect.height;
52
+ setSvgDimensions({ width: svgWidth, height: svgHeight });
53
+ const startX = rectA.left - containerRect.left + rectA.width / 2 + startXOffset;
54
+ const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
55
+ const endX = rectB.left - containerRect.left + rectB.width / 2 + endXOffset;
56
+ const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
57
+ const controlY = startY - curvature;
58
+ const d = `M ${startX},${startY} Q ${(startX + endX) / 2},${controlY} ${endX},${endY}`;
59
+ setPathD(d);
60
+ }
61
+ };
62
+ const resizeObserver = new ResizeObserver(() => {
63
+ updatePath();
64
+ });
65
+ if (containerRef.current) resizeObserver.observe(containerRef.current);
66
+ updatePath();
67
+ return () => {
68
+ resizeObserver.disconnect();
69
+ };
70
+ }, [containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset]);
71
+ return /* @__PURE__ */ jsxs(
72
+ "svg",
73
+ {
74
+ "aria-hidden": "true",
75
+ fill: "none",
76
+ width: svgDimensions.width,
77
+ height: svgDimensions.height,
78
+ xmlns: "http://www.w3.org/2000/svg",
79
+ className: cn("pointer-events-none absolute top-0 left-0 transform-gpu stroke-2", className),
80
+ viewBox: `0 0 ${svgDimensions.width} ${svgDimensions.height}`,
81
+ children: [
82
+ /* @__PURE__ */ jsx("path", { d: pathD, stroke: pathColor, strokeWidth: pathWidth, strokeOpacity: pathOpacity, strokeLinecap: "round" }),
83
+ /* @__PURE__ */ jsx("path", { d: pathD, strokeWidth: pathWidth, stroke: `url(#${id})`, strokeOpacity: "1", strokeLinecap: "round" }),
84
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
85
+ motion.linearGradient,
86
+ {
87
+ className: "transform-gpu",
88
+ id,
89
+ gradientUnits: "userSpaceOnUse",
90
+ initial: {
91
+ x1: "0%",
92
+ x2: "0%",
93
+ y1: "0%",
94
+ y2: "0%"
95
+ },
96
+ animate: {
97
+ x1: gradientCoordinates.x1,
98
+ x2: gradientCoordinates.x2,
99
+ y1: gradientCoordinates.y1,
100
+ y2: gradientCoordinates.y2
101
+ },
102
+ transition: {
103
+ delay,
104
+ duration,
105
+ ease: [0.16, 1, 0.3, 1],
106
+ repeat,
107
+ repeatDelay
108
+ },
109
+ children: [
110
+ /* @__PURE__ */ jsx("stop", { stopColor: gradientStartColor, stopOpacity: "0" }),
111
+ /* @__PURE__ */ jsx("stop", { stopColor: gradientStartColor }),
112
+ /* @__PURE__ */ jsx("stop", { offset: "32.5%", stopColor: gradientStopColor }),
113
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: gradientStopColor, stopOpacity: "0" })
114
+ ]
115
+ }
116
+ ) })
117
+ ]
118
+ }
119
+ );
120
+ }
121
+
122
+ export { AnimatedBeam };
123
+ //# sourceMappingURL=chunk-M5MESV26.mjs.map
124
+ //# sourceMappingURL=chunk-M5MESV26.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/animated-beam.tsx"],"names":[],"mappings":"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","file":"chunk-M5MESV26.mjs","sourcesContent":["'use client';\n\nimport { motion } from 'framer-motion';\nimport { type RefObject, useEffect, useId, useState } from 'react';\nimport { cn } from '../lib/utils.js';\n\nexport type AnimatedBeamProps = {\n className?: string;\n containerRef: RefObject<HTMLElement | null>;\n fromRef: RefObject<HTMLElement | null>;\n toRef: RefObject<HTMLElement | null>;\n curvature?: number;\n reverse?: boolean;\n pathColor?: string;\n pathWidth?: number;\n pathOpacity?: number;\n gradientStartColor?: string;\n gradientStopColor?: string;\n delay?: number;\n duration?: number;\n repeat?: number;\n repeatDelay?: number;\n startXOffset?: number;\n startYOffset?: number;\n endXOffset?: number;\n endYOffset?: number;\n};\n\nexport function AnimatedBeam({\n className,\n containerRef,\n fromRef,\n toRef,\n curvature = 0,\n reverse = false,\n duration = 5,\n delay = 0,\n pathColor = 'gray',\n pathWidth = 2,\n pathOpacity = 0.2,\n gradientStartColor = '#ffaa40',\n gradientStopColor = '#9c40ff',\n repeat = Number.POSITIVE_INFINITY,\n repeatDelay = 0,\n startXOffset = 0,\n startYOffset = 0,\n endXOffset = 0,\n endYOffset = 0,\n}: AnimatedBeamProps) {\n const id = useId();\n const [pathD, setPathD] = useState('');\n const [svgDimensions, setSvgDimensions] = useState({\n width: 0,\n height: 0,\n });\n\n const gradientCoordinates = reverse\n ? {\n x1: ['90%', '-10%'],\n x2: ['100%', '0%'],\n y1: ['0%', '0%'],\n y2: ['0%', '0%'],\n }\n : {\n x1: ['10%', '110%'],\n x2: ['0%', '100%'],\n y1: ['0%', '0%'],\n y2: ['0%', '0%'],\n };\n\n // biome-ignore lint/plugin: measures live DOM layout to compute beam path — post-render measurement.\n useEffect(() => {\n const updatePath = () => {\n if (containerRef.current && fromRef.current && toRef.current) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const rectA = fromRef.current.getBoundingClientRect();\n const rectB = toRef.current.getBoundingClientRect();\n\n const svgWidth = containerRect.width;\n const svgHeight = containerRect.height;\n setSvgDimensions({ width: svgWidth, height: svgHeight });\n\n const startX = rectA.left - containerRect.left + rectA.width / 2 + startXOffset;\n const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;\n const endX = rectB.left - containerRect.left + rectB.width / 2 + endXOffset;\n const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;\n\n const controlY = startY - curvature;\n const d = `M ${startX},${startY} Q ${(startX + endX) / 2},${controlY} ${endX},${endY}`;\n setPathD(d);\n }\n };\n\n const resizeObserver = new ResizeObserver(() => {\n updatePath();\n });\n\n if (containerRef.current) resizeObserver.observe(containerRef.current);\n\n updatePath();\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset]);\n\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n width={svgDimensions.width}\n height={svgDimensions.height}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn('pointer-events-none absolute top-0 left-0 transform-gpu stroke-2', className)}\n viewBox={`0 0 ${svgDimensions.width} ${svgDimensions.height}`}\n >\n <path d={pathD} stroke={pathColor} strokeWidth={pathWidth} strokeOpacity={pathOpacity} strokeLinecap=\"round\" />\n <path d={pathD} strokeWidth={pathWidth} stroke={`url(#${id})`} strokeOpacity=\"1\" strokeLinecap=\"round\" />\n <defs>\n <motion.linearGradient\n className=\"transform-gpu\"\n id={id}\n gradientUnits=\"userSpaceOnUse\"\n initial={{\n x1: '0%',\n x2: '0%',\n y1: '0%',\n y2: '0%',\n }}\n animate={{\n x1: gradientCoordinates.x1,\n x2: gradientCoordinates.x2,\n y1: gradientCoordinates.y1,\n y2: gradientCoordinates.y2,\n }}\n transition={{\n delay,\n duration,\n ease: [0.16, 1, 0.3, 1],\n repeat,\n repeatDelay,\n }}\n >\n <stop stopColor={gradientStartColor} stopOpacity=\"0\" />\n <stop stopColor={gradientStartColor} />\n <stop offset=\"32.5%\" stopColor={gradientStopColor} />\n <stop offset=\"100%\" stopColor={gradientStopColor} stopOpacity=\"0\" />\n </motion.linearGradient>\n </defs>\n </svg>\n );\n}\n"]}