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,130 @@
1
+ 'use strict';
2
+
3
+ var framerMotion = require('framer-motion');
4
+ var react = require('react');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function cn(...inputs) {
10
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
11
+ }
12
+ function AnimatedBeam({
13
+ className,
14
+ containerRef,
15
+ fromRef,
16
+ toRef,
17
+ curvature = 0,
18
+ reverse = false,
19
+ duration = 5,
20
+ delay = 0,
21
+ pathColor = "gray",
22
+ pathWidth = 2,
23
+ pathOpacity = 0.2,
24
+ gradientStartColor = "#ffaa40",
25
+ gradientStopColor = "#9c40ff",
26
+ repeat = Number.POSITIVE_INFINITY,
27
+ repeatDelay = 0,
28
+ startXOffset = 0,
29
+ startYOffset = 0,
30
+ endXOffset = 0,
31
+ endYOffset = 0
32
+ }) {
33
+ const id = react.useId();
34
+ const [pathD, setPathD] = react.useState("");
35
+ const [svgDimensions, setSvgDimensions] = react.useState({
36
+ width: 0,
37
+ height: 0
38
+ });
39
+ const gradientCoordinates = reverse ? {
40
+ x1: ["90%", "-10%"],
41
+ x2: ["100%", "0%"],
42
+ y1: ["0%", "0%"],
43
+ y2: ["0%", "0%"]
44
+ } : {
45
+ x1: ["10%", "110%"],
46
+ x2: ["0%", "100%"],
47
+ y1: ["0%", "0%"],
48
+ y2: ["0%", "0%"]
49
+ };
50
+ react.useEffect(() => {
51
+ const updatePath = () => {
52
+ if (containerRef.current && fromRef.current && toRef.current) {
53
+ const containerRect = containerRef.current.getBoundingClientRect();
54
+ const rectA = fromRef.current.getBoundingClientRect();
55
+ const rectB = toRef.current.getBoundingClientRect();
56
+ const svgWidth = containerRect.width;
57
+ const svgHeight = containerRect.height;
58
+ setSvgDimensions({ width: svgWidth, height: svgHeight });
59
+ const startX = rectA.left - containerRect.left + rectA.width / 2 + startXOffset;
60
+ const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
61
+ const endX = rectB.left - containerRect.left + rectB.width / 2 + endXOffset;
62
+ const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
63
+ const controlY = startY - curvature;
64
+ const d = `M ${startX},${startY} Q ${(startX + endX) / 2},${controlY} ${endX},${endY}`;
65
+ setPathD(d);
66
+ }
67
+ };
68
+ const resizeObserver = new ResizeObserver(() => {
69
+ updatePath();
70
+ });
71
+ if (containerRef.current) resizeObserver.observe(containerRef.current);
72
+ updatePath();
73
+ return () => {
74
+ resizeObserver.disconnect();
75
+ };
76
+ }, [containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset]);
77
+ return /* @__PURE__ */ jsxRuntime.jsxs(
78
+ "svg",
79
+ {
80
+ "aria-hidden": "true",
81
+ fill: "none",
82
+ width: svgDimensions.width,
83
+ height: svgDimensions.height,
84
+ xmlns: "http://www.w3.org/2000/svg",
85
+ className: cn("pointer-events-none absolute top-0 left-0 transform-gpu stroke-2", className),
86
+ viewBox: `0 0 ${svgDimensions.width} ${svgDimensions.height}`,
87
+ children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: pathD, stroke: pathColor, strokeWidth: pathWidth, strokeOpacity: pathOpacity, strokeLinecap: "round" }),
89
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: pathD, strokeWidth: pathWidth, stroke: `url(#${id})`, strokeOpacity: "1", strokeLinecap: "round" }),
90
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs(
91
+ framerMotion.motion.linearGradient,
92
+ {
93
+ className: "transform-gpu",
94
+ id,
95
+ gradientUnits: "userSpaceOnUse",
96
+ initial: {
97
+ x1: "0%",
98
+ x2: "0%",
99
+ y1: "0%",
100
+ y2: "0%"
101
+ },
102
+ animate: {
103
+ x1: gradientCoordinates.x1,
104
+ x2: gradientCoordinates.x2,
105
+ y1: gradientCoordinates.y1,
106
+ y2: gradientCoordinates.y2
107
+ },
108
+ transition: {
109
+ delay,
110
+ duration,
111
+ ease: [0.16, 1, 0.3, 1],
112
+ repeat,
113
+ repeatDelay
114
+ },
115
+ children: [
116
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { stopColor: gradientStartColor, stopOpacity: "0" }),
117
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { stopColor: gradientStartColor }),
118
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "32.5%", stopColor: gradientStopColor }),
119
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: gradientStopColor, stopOpacity: "0" })
120
+ ]
121
+ }
122
+ ) })
123
+ ]
124
+ }
125
+ );
126
+ }
127
+
128
+ exports.AnimatedBeam = AnimatedBeam;
129
+ //# sourceMappingURL=animated-beam.js.map
130
+ //# sourceMappingURL=animated-beam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/animated-beam.tsx"],"names":["twMerge","clsx","useId","useState","useEffect","jsxs","jsx","motion"],"mappings":"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","file":"animated-beam.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'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"]}
@@ -0,0 +1,4 @@
1
+ export { AnimatedBeam } from './chunk-M5MESV26.mjs';
2
+ import './chunk-QAWSH567.mjs';
3
+ //# sourceMappingURL=animated-beam.mjs.map
4
+ //# sourceMappingURL=animated-beam.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"animated-beam.mjs"}
@@ -0,0 +1,55 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type { ReactNode } from 'react';
3
+ /**
4
+ * Shared marketing-site button styles.
5
+ *
6
+ * The `transition` in the base string matches the former `.button-transition`
7
+ * utility — a pure-CSS morph so the component stays server-renderable.
8
+ */
9
+ declare const buttonVariants: (props?: ({
10
+ variant?: "filled" | "bordered" | "ghost" | null | undefined;
11
+ size?: "icon" | "sm" | "md" | "lg" | null | undefined;
12
+ shape?: "rounded" | "pill" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ export type ButtonProps = VariantProps<typeof buttonVariants> & {
15
+ showArrow?: boolean;
16
+ /**
17
+ * Set when `actionOrLink` is an off-site URL — renders the anchor with
18
+ * `target="_blank"` and `rel="noopener noreferrer"`.
19
+ */
20
+ external?: boolean;
21
+ /** Hover tooltip on the rendered anchor/button. */
22
+ title?: string;
23
+ /**
24
+ * String → renders as a plain anchor <a href={...}>.
25
+ * Function → renders as a <button type="button" onClick={...}>.
26
+ */
27
+ actionOrLink: string | (() => void);
28
+ children: ReactNode;
29
+ className?: string;
30
+ 'aria-label'?: string;
31
+ 'aria-expanded'?: boolean;
32
+ };
33
+ /**
34
+ * Shared marketing-site button.
35
+ *
36
+ * variant="filled" → primary CTA (inverse theming: bg-(--foreground) + text-(--primary-foreground)
37
+ * + shadow-elevated-3 — flips with the theme so it pops against any surface)
38
+ * variant="bordered" → elevated surface + border (bg-surface-3 + shadow-elevated-3 + border)
39
+ * variant="ghost" → transparent, muted text that gains a surface on hover
40
+ * size="sm" → h-8, px-3.5, text-[15px] (navbar / compact)
41
+ * size="md" → h-9, px-5, text-[17px] (default)
42
+ * size="lg" → h-11, px-6, text-[17px] (hero CTAs)
43
+ * size="icon" → size-11 square (icon-only buttons)
44
+ * shape="pill" → fully rounded (rounded-full); pill is the default
45
+ * showArrow → chevron right at rest, morphs to arrow-right on hover
46
+ *
47
+ * Server-renderable: the arrow morph is pure CSS (group-hover), so no client
48
+ * state or animation library is needed. When `actionOrLink` is a function the
49
+ * component renders a <button>; passing a function requires a client-component
50
+ * parent (functions can't cross the server→client boundary), which is inherent
51
+ * to any onClick prop and unchanged by this component being server-capable.
52
+ */
53
+ export declare function Button({ variant, size, shape, showArrow, external, title, actionOrLink, children, className, 'aria-label': ariaLabel, 'aria-expanded': ariaExpanded, }: ButtonProps): import("react").JSX.Element;
54
+ export {};
55
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1,55 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type { ReactNode } from 'react';
3
+ /**
4
+ * Shared marketing-site button styles.
5
+ *
6
+ * The `transition` in the base string matches the former `.button-transition`
7
+ * utility — a pure-CSS morph so the component stays server-renderable.
8
+ */
9
+ declare const buttonVariants: (props?: ({
10
+ variant?: "filled" | "bordered" | "ghost" | null | undefined;
11
+ size?: "icon" | "sm" | "md" | "lg" | null | undefined;
12
+ shape?: "rounded" | "pill" | null | undefined;
13
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
14
+ export type ButtonProps = VariantProps<typeof buttonVariants> & {
15
+ showArrow?: boolean;
16
+ /**
17
+ * Set when `actionOrLink` is an off-site URL — renders the anchor with
18
+ * `target="_blank"` and `rel="noopener noreferrer"`.
19
+ */
20
+ external?: boolean;
21
+ /** Hover tooltip on the rendered anchor/button. */
22
+ title?: string;
23
+ /**
24
+ * String → renders as a plain anchor <a href={...}>.
25
+ * Function → renders as a <button type="button" onClick={...}>.
26
+ */
27
+ actionOrLink: string | (() => void);
28
+ children: ReactNode;
29
+ className?: string;
30
+ 'aria-label'?: string;
31
+ 'aria-expanded'?: boolean;
32
+ };
33
+ /**
34
+ * Shared marketing-site button.
35
+ *
36
+ * variant="filled" → primary CTA (inverse theming: bg-(--foreground) + text-(--primary-foreground)
37
+ * + shadow-elevated-3 — flips with the theme so it pops against any surface)
38
+ * variant="bordered" → elevated surface + border (bg-surface-3 + shadow-elevated-3 + border)
39
+ * variant="ghost" → transparent, muted text that gains a surface on hover
40
+ * size="sm" → h-8, px-3.5, text-[15px] (navbar / compact)
41
+ * size="md" → h-9, px-5, text-[17px] (default)
42
+ * size="lg" → h-11, px-6, text-[17px] (hero CTAs)
43
+ * size="icon" → size-11 square (icon-only buttons)
44
+ * shape="pill" → fully rounded (rounded-full); pill is the default
45
+ * showArrow → chevron right at rest, morphs to arrow-right on hover
46
+ *
47
+ * Server-renderable: the arrow morph is pure CSS (group-hover), so no client
48
+ * state or animation library is needed. When `actionOrLink` is a function the
49
+ * component renders a <button>; passing a function requires a client-component
50
+ * parent (functions can't cross the server→client boundary), which is inherent
51
+ * to any onClick prop and unchanged by this component being server-capable.
52
+ */
53
+ export declare function Button({ variant, size, shape, showArrow, external, title, actionOrLink, children, className, 'aria-label': ariaLabel, 'aria-expanded': ariaExpanded, }: ButtonProps): import("react").JSX.Element;
54
+ export {};
55
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;GAKG;AACH,QAAA,MAAM,cAAc;;;;8EAuBnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,IAAI,EACJ,KAAK,EACL,SAAiB,EACjB,QAAgB,EAChB,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,YAAY,GAC9B,EAAE,WAAW,+BAkEb"}
package/dist/button.js ADDED
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ var classVarianceAuthority = require('class-variance-authority');
4
+ var clsx = require('clsx');
5
+ var tailwindMerge = require('tailwind-merge');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/components/button.tsx
9
+ function cn(...inputs) {
10
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
11
+ }
12
+ var buttonVariants = classVarianceAuthority.cva(
13
+ "group inline-flex items-center justify-center gap-1.5 font-medium [transition:opacity_.24s_80ms,transform_.15s_cubic-bezier(.4,0,.2,1),box-shadow_.15s_cubic-bezier(.4,0,.2,1),filter_.15s_cubic-bezier(.4,0,.2,1)] disabled:[transition:opacity_.1s]",
14
+ {
15
+ variants: {
16
+ variant: {
17
+ filled: "bg-(--foreground) text-(--primary-foreground) shadow-elevated-3 hover:opacity-90",
18
+ bordered: "border border-(--border-hi) bg-surface-3 text-foreground shadow-elevated-3 hover:bg-(--muted)",
19
+ ghost: "text-(--foreground-secondary) hover:bg-(--surface-hover) hover:text-(--foreground)"
20
+ },
21
+ size: {
22
+ sm: "h-8 px-3.5 text-[15px]",
23
+ md: "h-9 px-5 text-[17px]",
24
+ lg: "h-11 px-6 text-[17px]",
25
+ icon: "size-11"
26
+ },
27
+ shape: {
28
+ rounded: "rounded-interactive",
29
+ pill: "rounded-full"
30
+ }
31
+ },
32
+ // Pill is the house standard — every CTA is fully rounded.
33
+ defaultVariants: { variant: "filled", size: "md", shape: "pill" }
34
+ }
35
+ );
36
+ function Button({
37
+ variant,
38
+ size,
39
+ shape,
40
+ showArrow = false,
41
+ external = false,
42
+ title,
43
+ actionOrLink,
44
+ children,
45
+ className,
46
+ "aria-label": ariaLabel,
47
+ "aria-expanded": ariaExpanded
48
+ }) {
49
+ const buttonClassName = cn(buttonVariants({ variant, size, shape }), className);
50
+ const arrowSlot = showArrow && /* @__PURE__ */ jsxRuntime.jsxs(
51
+ "svg",
52
+ {
53
+ viewBox: "0 0 14 14",
54
+ width: "14",
55
+ height: "14",
56
+ fill: "none",
57
+ stroke: "currentColor",
58
+ strokeWidth: "2",
59
+ strokeLinecap: "round",
60
+ strokeLinejoin: "round",
61
+ "aria-hidden": true,
62
+ className: "shrink-0",
63
+ children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ "line",
66
+ {
67
+ x1: "0",
68
+ y1: "7",
69
+ x2: "9",
70
+ y2: "7",
71
+ strokeDasharray: "9",
72
+ className: "[stroke-dashoffset:9] [transition:stroke-dashoffset_.08s_cubic-bezier(.22,1,.36,1)] group-hover:[stroke-dashoffset:0] group-hover:[transition-duration:.22s]"
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsxRuntime.jsx(
76
+ "path",
77
+ {
78
+ d: "M5 3l4 4-4 4",
79
+ className: "[transform:translateX(0)] [transition:transform_.22s_cubic-bezier(.22,1,.36,1)] group-hover:[transform:translateX(2px)]"
80
+ }
81
+ )
82
+ ]
83
+ }
84
+ );
85
+ if (typeof actionOrLink === "string")
86
+ return /* @__PURE__ */ jsxRuntime.jsxs(
87
+ "a",
88
+ {
89
+ href: actionOrLink,
90
+ className: cn(buttonClassName, "no-underline"),
91
+ "aria-label": ariaLabel,
92
+ title,
93
+ ...external ? { target: "_blank", rel: "noopener noreferrer" } : {},
94
+ children: [
95
+ children,
96
+ arrowSlot
97
+ ]
98
+ }
99
+ );
100
+ return /* @__PURE__ */ jsxRuntime.jsxs(
101
+ "button",
102
+ {
103
+ type: "button",
104
+ className: buttonClassName,
105
+ onClick: actionOrLink,
106
+ "aria-label": ariaLabel,
107
+ "aria-expanded": ariaExpanded,
108
+ title,
109
+ children: [
110
+ children,
111
+ arrowSlot
112
+ ]
113
+ }
114
+ );
115
+ }
116
+
117
+ exports.Button = Button;
118
+ //# sourceMappingURL=button.js.map
119
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/components/button.tsx"],"names":["twMerge","clsx","cva","jsxs","jsx"],"mappings":";;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACIA,IAAM,cAAA,GAAiBC,0BAAA;AAAA,EACrB,uPAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kFAAA;AAAA,QACR,QAAA,EAAU,+FAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACT;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,wBAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,EAAA,EAAI,uBAAA;AAAA,QACJ,IAAA,EAAM;AAAA,OACR;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,qBAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACF;AAAA;AAAA,IAEA,iBAAiB,EAAE,OAAA,EAAS,UAAU,IAAA,EAAM,IAAA,EAAM,OAAO,MAAA;AAAO;AAEpE,CAAA;AA0CO,SAAS,MAAA,CAAO;AAAA,EACrB,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA,EAAgB;AACd,EAAA,MAAM,eAAA,GAAkB,GAAG,cAAA,CAAe,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA;AAQ9E,EAAA,MAAM,YAAY,SAAA,oBAChBC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,WAAA;AAAA,MACR,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAa,IAAA;AAAA,MACb,SAAA,EAAU,UAAA;AAAA,MAGV,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAG,GAAA;AAAA,YACH,EAAA,EAAG,GAAA;AAAA,YACH,EAAA,EAAG,GAAA;AAAA,YACH,EAAA,EAAG,GAAA;AAAA,YACH,eAAA,EAAgB,GAAA;AAAA,YAChB,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,wBAEAA,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,cAAA;AAAA,YACF,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,OAAO,YAAA,KAAiB,QAAA;AAC1B,IAAA,uBACED,eAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,EAAA,CAAG,eAAA,EAAiB,cAAc,CAAA;AAAA,QAC7C,YAAA,EAAY,SAAA;AAAA,QACZ,KAAA;AAAA,QACC,GAAI,WAAW,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,qBAAA,KAA0B,EAAC;AAAA,QAEnE,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACH;AAGJ,EAAA,uBACEA,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,eAAA;AAAA,MACX,OAAA,EAAS,YAAA;AAAA,MACT,YAAA,EAAY,SAAA;AAAA,MACZ,eAAA,EAAe,YAAA;AAAA,MACf,KAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ","file":"button.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { ReactNode } from 'react';\nimport { cn } from '../lib/utils.js';\n\n/**\n * Shared marketing-site button styles.\n *\n * The `transition` in the base string matches the former `.button-transition`\n * utility — a pure-CSS morph so the component stays server-renderable.\n */\nconst buttonVariants = cva(\n 'group inline-flex items-center justify-center gap-1.5 font-medium [transition:opacity_.24s_80ms,transform_.15s_cubic-bezier(.4,0,.2,1),box-shadow_.15s_cubic-bezier(.4,0,.2,1),filter_.15s_cubic-bezier(.4,0,.2,1)] disabled:[transition:opacity_.1s]',\n {\n variants: {\n variant: {\n filled: 'bg-(--foreground) text-(--primary-foreground) shadow-elevated-3 hover:opacity-90',\n bordered: 'border border-(--border-hi) bg-surface-3 text-foreground shadow-elevated-3 hover:bg-(--muted)',\n ghost: 'text-(--foreground-secondary) hover:bg-(--surface-hover) hover:text-(--foreground)',\n },\n size: {\n sm: 'h-8 px-3.5 text-[15px]',\n md: 'h-9 px-5 text-[17px]',\n lg: 'h-11 px-6 text-[17px]',\n icon: 'size-11',\n },\n shape: {\n rounded: 'rounded-interactive',\n pill: 'rounded-full',\n },\n },\n // Pill is the house standard — every CTA is fully rounded.\n defaultVariants: { variant: 'filled', size: 'md', shape: 'pill' },\n },\n);\n\nexport type ButtonProps = VariantProps<typeof buttonVariants> & {\n showArrow?: boolean;\n /**\n * Set when `actionOrLink` is an off-site URL — renders the anchor with\n * `target=\"_blank\"` and `rel=\"noopener noreferrer\"`.\n */\n external?: boolean;\n /** Hover tooltip on the rendered anchor/button. */\n title?: string;\n /**\n * String → renders as a plain anchor <a href={...}>.\n * Function → renders as a <button type=\"button\" onClick={...}>.\n */\n actionOrLink: string | (() => void);\n children: ReactNode;\n className?: string;\n 'aria-label'?: string;\n 'aria-expanded'?: boolean;\n};\n\n/**\n * Shared marketing-site button.\n *\n * variant=\"filled\" → primary CTA (inverse theming: bg-(--foreground) + text-(--primary-foreground)\n * + shadow-elevated-3 — flips with the theme so it pops against any surface)\n * variant=\"bordered\" → elevated surface + border (bg-surface-3 + shadow-elevated-3 + border)\n * variant=\"ghost\" → transparent, muted text that gains a surface on hover\n * size=\"sm\" → h-8, px-3.5, text-[15px] (navbar / compact)\n * size=\"md\" → h-9, px-5, text-[17px] (default)\n * size=\"lg\" → h-11, px-6, text-[17px] (hero CTAs)\n * size=\"icon\" → size-11 square (icon-only buttons)\n * shape=\"pill\" → fully rounded (rounded-full); pill is the default\n * showArrow → chevron right at rest, morphs to arrow-right on hover\n *\n * Server-renderable: the arrow morph is pure CSS (group-hover), so no client\n * state or animation library is needed. When `actionOrLink` is a function the\n * component renders a <button>; passing a function requires a client-component\n * parent (functions can't cross the server→client boundary), which is inherent\n * to any onClick prop and unchanged by this component being server-capable.\n */\nexport function Button({\n variant,\n size,\n shape,\n showArrow = false,\n external = false,\n title,\n actionOrLink,\n children,\n className,\n 'aria-label': ariaLabel,\n 'aria-expanded': ariaExpanded,\n}: ButtonProps) {\n const buttonClassName = cn(buttonVariants({ variant, size, shape }), className);\n\n /*\n * Single SVG that morphs from › to → on hover — pure CSS, no JS.\n * The shaft draws in from the left (stroke-dashoffset 9 → 0) and the arrowhead\n * nudges right. Draw-in is slower (.22s) than the reverse (.08s), matching the\n * asymmetric timing of the former framer-motion version. ease = cubic-bezier(.22,1,.36,1).\n */\n const arrowSlot = showArrow && (\n <svg\n viewBox=\"0 0 14 14\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden={true}\n className=\"shrink-0\"\n >\n {/* Shaft — draws in from the left */}\n <line\n x1=\"0\"\n y1=\"7\"\n x2=\"9\"\n y2=\"7\"\n strokeDasharray=\"9\"\n className=\"[stroke-dashoffset:9] [transition:stroke-dashoffset_.08s_cubic-bezier(.22,1,.36,1)] group-hover:[stroke-dashoffset:0] group-hover:[transition-duration:.22s]\"\n />\n {/* Arrowhead — nudges right so the shaft \"connects\" underneath */}\n <path\n d=\"M5 3l4 4-4 4\"\n className=\"[transform:translateX(0)] [transition:transform_.22s_cubic-bezier(.22,1,.36,1)] group-hover:[transform:translateX(2px)]\"\n />\n </svg>\n );\n\n if (typeof actionOrLink === 'string')\n return (\n <a\n href={actionOrLink}\n className={cn(buttonClassName, 'no-underline')}\n aria-label={ariaLabel}\n title={title}\n {...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n >\n {children}\n {arrowSlot}\n </a>\n );\n\n return (\n <button\n type=\"button\"\n className={buttonClassName}\n onClick={actionOrLink}\n aria-label={ariaLabel}\n aria-expanded={ariaExpanded}\n title={title}\n >\n {children}\n {arrowSlot}\n </button>\n );\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { Button } from './chunk-AYY7D2RJ.mjs';
2
+ import './chunk-QAWSH567.mjs';
3
+ //# sourceMappingURL=button.mjs.map
4
+ //# sourceMappingURL=button.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"button.mjs"}
@@ -0,0 +1,20 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type * as React from 'react';
3
+ import { type SurfaceLevel } from '../lib/surface.js';
4
+ declare const cardVariants: (props?: ({
5
+ variant?: "inset" | "default" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {
8
+ level?: SurfaceLevel;
9
+ shadowLevel?: SurfaceLevel;
10
+ }
11
+ declare function Card({ className, variant, level, shadowLevel, ...props }: CardProps): React.JSX.Element;
12
+ declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
13
+ declare function CardTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
14
+ declare function CardDescription({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
15
+ declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
16
+ declare function CardContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
17
+ declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
18
+ export type { CardProps };
19
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
20
+ //# sourceMappingURL=card.d.ts.map
package/dist/card.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type * as React from 'react';
3
+ import { type SurfaceLevel } from '../lib/surface.js';
4
+ declare const cardVariants: (props?: ({
5
+ variant?: "inset" | "default" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {
8
+ level?: SurfaceLevel;
9
+ shadowLevel?: SurfaceLevel;
10
+ }
11
+ declare function Card({ className, variant, level, shadowLevel, ...props }: CardProps): React.JSX.Element;
12
+ declare function CardHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
13
+ declare function CardTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
14
+ declare function CardDescription({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
15
+ declare function CardAction({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
16
+ declare function CardContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
17
+ declare function CardFooter({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
18
+ export type { CardProps };
19
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
20
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/components/card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AAGpE,QAAA,MAAM,YAAY;;8EAUhB,CAAC;AAEH,UAAU,SAAU,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,OAAO,YAAY,CAAC;IACjG,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,OAAmB,EAAE,KAAS,EAAE,WAAe,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBAiBhG;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAavE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAItE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAE5E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQvE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAavE;AAED,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
package/dist/card.js ADDED
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ var classVarianceAuthority = require('class-variance-authority');
4
+ var clsx = require('clsx');
5
+ var tailwindMerge = require('tailwind-merge');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/components/card.tsx
9
+
10
+ // src/lib/surface.ts
11
+ var SURFACE_BG = {
12
+ 1: "bg-surface-1",
13
+ 2: "bg-surface-2",
14
+ 3: "bg-surface-3",
15
+ 4: "bg-surface-4",
16
+ 5: "bg-surface-5",
17
+ 6: "bg-surface-6",
18
+ 7: "bg-surface-7",
19
+ 8: "bg-surface-8"
20
+ };
21
+ var SURFACE_VAR = {
22
+ 1: "[--popup-surface:var(--surface-1)]",
23
+ 2: "[--popup-surface:var(--surface-2)]",
24
+ 3: "[--popup-surface:var(--surface-3)]",
25
+ 4: "[--popup-surface:var(--surface-4)]",
26
+ 5: "[--popup-surface:var(--surface-5)]",
27
+ 6: "[--popup-surface:var(--surface-6)]",
28
+ 7: "[--popup-surface:var(--surface-7)]",
29
+ 8: "[--popup-surface:var(--surface-8)]"
30
+ };
31
+ var SURFACE_SHADOW_COMBINED = {
32
+ 1: "shadow-elevated-1",
33
+ 2: "shadow-elevated-2",
34
+ 3: "shadow-elevated-3",
35
+ 4: "shadow-elevated-4",
36
+ 5: "shadow-elevated-5",
37
+ 6: "shadow-elevated-6",
38
+ 7: "shadow-elevated-7",
39
+ 8: "shadow-elevated-8"
40
+ };
41
+ function solidSurface(level, shadowLevel = level) {
42
+ return `${SURFACE_BG[level]} ${SURFACE_SHADOW_COMBINED[shadowLevel]} ${SURFACE_VAR[level]}`;
43
+ }
44
+ function cn(...inputs) {
45
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
46
+ }
47
+ var cardVariants = classVarianceAuthority.cva("text-foreground flex flex-col", {
48
+ variants: {
49
+ variant: {
50
+ default: "gap-6 rounded-2xl py-6",
51
+ inset: "rounded-2xl p-1"
52
+ }
53
+ },
54
+ defaultVariants: {
55
+ variant: "default"
56
+ }
57
+ });
58
+ function Card({ className, variant = "default", level = 3, shadowLevel = 1, ...props }) {
59
+ return /* @__PURE__ */ jsxRuntime.jsx(
60
+ "div",
61
+ {
62
+ "data-slot": "card",
63
+ "data-variant": variant,
64
+ "data-level": level,
65
+ className: cn(
66
+ cardVariants({ variant }),
67
+ solidSurface(level, shadowLevel),
68
+ // bg-muted overrides solidSurface's bg, making the outer a gray frame
69
+ // while keeping its shadow, rim, and --popup-surface.
70
+ variant === "inset" && "bg-muted",
71
+ className
72
+ ),
73
+ ...props
74
+ }
75
+ );
76
+ }
77
+ function CardHeader({ className, ...props }) {
78
+ return /* @__PURE__ */ jsxRuntime.jsx(
79
+ "div",
80
+ {
81
+ "data-slot": "card-header",
82
+ className: cn(
83
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-[[data-slot=card-action]]:grid-cols-[1fr_auto] [.border-b]:pb-6",
84
+ "[[data-variant=default]>_&]:gap-1.5 [[data-variant=default]>_&]:px-6",
85
+ "[[data-variant=inset]>_&]:px-3 [[data-variant=inset]>_&]:py-2 [[data-variant=inset]>_&]:pt-1",
86
+ className
87
+ ),
88
+ ...props
89
+ }
90
+ );
91
+ }
92
+ function CardTitle({ className, ...props }) {
93
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "card-title", className: cn("font-semibold [[data-variant=default]_&]:leading-none", className), ...props });
94
+ }
95
+ function CardDescription({ className, ...props }) {
96
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "card-description", className: cn("text-muted-foreground text-sm", className), ...props });
97
+ }
98
+ function CardAction({ className, ...props }) {
99
+ return /* @__PURE__ */ jsxRuntime.jsx(
100
+ "div",
101
+ {
102
+ "data-slot": "card-action",
103
+ className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className),
104
+ ...props
105
+ }
106
+ );
107
+ }
108
+ function CardContent({ className, ...props }) {
109
+ return /* @__PURE__ */ jsxRuntime.jsx(
110
+ "div",
111
+ {
112
+ "data-slot": "card-content",
113
+ className: cn(
114
+ "[[data-variant=default]>_&]:px-6",
115
+ "[[data-variant=inset]>_&]:flex [[data-variant=inset]>_&]:flex-1 [[data-variant=inset]>_&]:flex-col [[data-variant=inset]>_&]:rounded-lg [[data-variant=inset]>_&]:bg-surface-3 [[data-variant=inset]>_&]:p-4 [[data-variant=inset]>_&]:shadow-elevated-3 [[data-variant=inset]>_&]:[--popup-surface:var(--surface-3)]",
116
+ className
117
+ ),
118
+ ...props
119
+ }
120
+ );
121
+ }
122
+ function CardFooter({ className, ...props }) {
123
+ return /* @__PURE__ */ jsxRuntime.jsx(
124
+ "div",
125
+ {
126
+ "data-slot": "card-footer",
127
+ className: cn(
128
+ "flex items-center [.border-t]:pt-6",
129
+ "[[data-variant=default]>_&]:px-6",
130
+ "[[data-variant=inset]>_&]:mt-auto [[data-variant=inset]>_&]:justify-end [[data-variant=inset]>_&]:pt-4",
131
+ className
132
+ ),
133
+ ...props
134
+ }
135
+ );
136
+ }
137
+
138
+ exports.Card = Card;
139
+ exports.CardAction = CardAction;
140
+ exports.CardContent = CardContent;
141
+ exports.CardDescription = CardDescription;
142
+ exports.CardFooter = CardFooter;
143
+ exports.CardHeader = CardHeader;
144
+ exports.CardTitle = CardTitle;
145
+ //# sourceMappingURL=card.js.map
146
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/surface.ts","../src/lib/utils.ts","../src/components/card.tsx"],"names":["twMerge","clsx","cva","jsx"],"mappings":"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","file":"card.js","sourcesContent":["export type SurfaceLevel = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;\n\nconst SURFACE_BG: Record<SurfaceLevel, string> = {\n 1: 'bg-surface-1',\n 2: 'bg-surface-2',\n 3: 'bg-surface-3',\n 4: 'bg-surface-4',\n 5: 'bg-surface-5',\n 6: 'bg-surface-6',\n 7: 'bg-surface-7',\n 8: 'bg-surface-8',\n};\n\nconst SURFACE_VAR: Record<SurfaceLevel, string> = {\n 1: '[--popup-surface:var(--surface-1)]',\n 2: '[--popup-surface:var(--surface-2)]',\n 3: '[--popup-surface:var(--surface-3)]',\n 4: '[--popup-surface:var(--surface-4)]',\n 5: '[--popup-surface:var(--surface-5)]',\n 6: '[--popup-surface:var(--surface-6)]',\n 7: '[--popup-surface:var(--surface-7)]',\n 8: '[--popup-surface:var(--surface-8)]',\n};\n\n/**\n * Drops + rim insets in a single `box-shadow` (no `::after`). Used by `solidSurface()`.\n * Literal Tailwind classes so the scanner picks them up.\n */\nconst SURFACE_SHADOW_COMBINED: Record<SurfaceLevel, string> = {\n 1: 'shadow-elevated-1',\n 2: 'shadow-elevated-2',\n 3: 'shadow-elevated-3',\n 4: 'shadow-elevated-4',\n 5: 'shadow-elevated-5',\n 6: 'shadow-elevated-6',\n 7: 'shadow-elevated-7',\n 8: 'shadow-elevated-8',\n};\n\n/**\n * Elevation for a free-floating surface: background, elevation variable, and the drop shadow with\n * its rim inset painted in the same `box-shadow` — which leaves `::after` free for other purposes.\n *\n * Suits containers with no opaque children near their edges. A child painted over the rim (a sticky\n * label, a pinned input, a dialog header) covers it, since nothing re-paints the rim above the\n * children.\n *\n * When `level !== shadowLevel` the rim color tracks `shadowLevel` — the two cannot be controlled\n * independently.\n */\nexport function solidSurface(level: SurfaceLevel, shadowLevel: SurfaceLevel = level): string {\n return `${SURFACE_BG[level]} ${SURFACE_SHADOW_COMBINED[shadowLevel]} ${SURFACE_VAR[level]}`;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type * as React from 'react';\nimport { type SurfaceLevel, solidSurface } from '../lib/surface.js';\nimport { cn } from '../lib/utils.js';\n\nconst cardVariants = cva('text-foreground flex flex-col', {\n variants: {\n variant: {\n default: 'gap-6 rounded-2xl py-6',\n inset: 'rounded-2xl p-1',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {\n level?: SurfaceLevel;\n shadowLevel?: SurfaceLevel;\n}\n\nfunction Card({ className, variant = 'default', level = 3, shadowLevel = 1, ...props }: CardProps) {\n return (\n <div\n data-slot=\"card\"\n data-variant={variant}\n data-level={level}\n className={cn(\n cardVariants({ variant }),\n solidSurface(level, shadowLevel),\n // bg-muted overrides solidSurface's bg, making the outer a gray frame\n // while keeping its shadow, rim, and --popup-surface.\n variant === 'inset' && 'bg-muted',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start has-[[data-slot=card-action]]:grid-cols-[1fr_auto] [.border-b]:pb-6',\n '[[data-variant=default]>_&]:gap-1.5 [[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:px-3 [[data-variant=inset]>_&]:py-2 [[data-variant=inset]>_&]:pt-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div data-slot=\"card-title\" className={cn('font-semibold [[data-variant=default]_&]:leading-none', className)} {...props} />\n );\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-description\" className={cn('text-muted-foreground text-sm', className)} {...props} />;\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n );\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\n '[[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:flex [[data-variant=inset]>_&]:flex-1 [[data-variant=inset]>_&]:flex-col [[data-variant=inset]>_&]:rounded-lg [[data-variant=inset]>_&]:bg-surface-3 [[data-variant=inset]>_&]:p-4 [[data-variant=inset]>_&]:shadow-elevated-3 [[data-variant=inset]>_&]:[--popup-surface:var(--surface-3)]',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n 'flex items-center [.border-t]:pt-6',\n '[[data-variant=default]>_&]:px-6',\n '[[data-variant=inset]>_&]:mt-auto [[data-variant=inset]>_&]:justify-end [[data-variant=inset]>_&]:pt-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type { CardProps };\nexport { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };\n"]}