react-shadcn-kit 0.1.1 → 0.2.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 (337) hide show
  1. package/README.md +145 -71
  2. package/dist/assets/global.css +1 -1
  3. package/dist/components/composites/ComponentSearch.d.ts +43 -0
  4. package/dist/components/composites/ComponentSearch.js +141 -0
  5. package/dist/components/composites/ComponentSearch.js.map +1 -0
  6. package/dist/components/composites/action-button.d.ts +16 -0
  7. package/dist/components/composites/action-button.js +71 -0
  8. package/dist/components/composites/action-button.js.map +1 -0
  9. package/dist/components/composites/index.d.ts +9 -0
  10. package/dist/components/composites/sidebar-wrapper.d.ts +27 -0
  11. package/dist/components/composites/sidebar-wrapper.js +21 -0
  12. package/dist/components/composites/sidebar-wrapper.js.map +1 -0
  13. package/dist/{molecules → components/composites}/theme-toggle.js +3 -3
  14. package/dist/components/composites/theme-toggle.js.map +1 -0
  15. package/dist/{molecules → components/composites}/user-menu.js +4 -4
  16. package/dist/components/composites/user-menu.js.map +1 -0
  17. package/dist/components/marketing/hero.d.ts +12 -0
  18. package/dist/components/marketing/hero.js +87 -0
  19. package/dist/components/marketing/hero.js.map +1 -0
  20. package/dist/components/marketing/index.d.ts +6 -0
  21. package/dist/components/marketing/social-proof.d.ts +10 -0
  22. package/dist/components/marketing/social-proof.js +21 -0
  23. package/dist/components/marketing/social-proof.js.map +1 -0
  24. package/dist/components/marketing/value-props.d.ts +14 -0
  25. package/dist/components/marketing/value-props.js +25 -0
  26. package/dist/components/marketing/value-props.js.map +1 -0
  27. package/dist/{atoms → components/primitives}/accordion.js +1 -1
  28. package/dist/components/primitives/accordion.js.map +1 -0
  29. package/dist/{atoms → components/primitives}/alert-dialog.js +2 -2
  30. package/dist/components/primitives/alert-dialog.js.map +1 -0
  31. package/dist/{atoms → components/primitives}/alert.js +1 -1
  32. package/dist/components/primitives/alert.js.map +1 -0
  33. package/dist/components/primitives/aspect-ratio.js.map +1 -0
  34. package/dist/{atoms → components/primitives}/avatar.js +1 -1
  35. package/dist/components/primitives/avatar.js.map +1 -0
  36. package/dist/components/primitives/badge-variants.d.ts +3 -0
  37. package/dist/{atoms/badge.js → components/primitives/badge-variants.js} +7 -19
  38. package/dist/components/primitives/badge-variants.js.map +1 -0
  39. package/dist/components/primitives/badge.d.ts +9 -0
  40. package/dist/components/primitives/badge.js +21 -0
  41. package/dist/components/primitives/badge.js.map +1 -0
  42. package/dist/{atoms → components/primitives}/breadcrumb.js +1 -1
  43. package/dist/components/primitives/breadcrumb.js.map +1 -0
  44. package/dist/components/primitives/button-group-variants.d.ts +3 -0
  45. package/dist/components/primitives/button-group-variants.js +19 -0
  46. package/dist/components/primitives/button-group-variants.js.map +1 -0
  47. package/dist/components/primitives/button-group.d.ts +13 -0
  48. package/dist/components/primitives/button-group.js +52 -0
  49. package/dist/components/primitives/button-group.js.map +1 -0
  50. package/dist/components/primitives/button-variants.d.ts +4 -0
  51. package/dist/{atoms/button.js → components/primitives/button-variants.js} +8 -28
  52. package/dist/components/primitives/button-variants.js.map +1 -0
  53. package/dist/components/primitives/button.d.ts +9 -0
  54. package/dist/components/primitives/button.js +21 -0
  55. package/dist/components/primitives/button.js.map +1 -0
  56. package/dist/{atoms → components/primitives}/calendar.d.ts +1 -1
  57. package/dist/{atoms → components/primitives}/calendar.js +5 -4
  58. package/dist/components/primitives/calendar.js.map +1 -0
  59. package/dist/{atoms → components/primitives}/card.js +1 -1
  60. package/dist/components/primitives/card.js.map +1 -0
  61. package/dist/{atoms → components/primitives}/carousel.d.ts +1 -1
  62. package/dist/{atoms → components/primitives}/carousel.js +1 -1
  63. package/dist/components/primitives/carousel.js.map +1 -0
  64. package/dist/{atoms → components/primitives}/chart.js +1 -1
  65. package/dist/components/primitives/chart.js.map +1 -0
  66. package/dist/{atoms → components/primitives}/checkbox.js +1 -1
  67. package/dist/components/primitives/checkbox.js.map +1 -0
  68. package/dist/components/primitives/collapsible.js.map +1 -0
  69. package/dist/{atoms → components/primitives}/command.d.ts +1 -1
  70. package/dist/{atoms → components/primitives}/command.js +1 -1
  71. package/dist/components/primitives/command.js.map +1 -0
  72. package/dist/{atoms → components/primitives}/context-menu.js +1 -1
  73. package/dist/components/primitives/context-menu.js.map +1 -0
  74. package/dist/components/primitives/custom-button-variants.d.ts +5 -0
  75. package/dist/components/primitives/custom-button-variants.js +38 -0
  76. package/dist/components/primitives/custom-button-variants.js.map +1 -0
  77. package/dist/components/primitives/custom-button.d.ts +22 -0
  78. package/dist/components/primitives/custom-button.js +64 -0
  79. package/dist/components/primitives/custom-button.js.map +1 -0
  80. package/dist/{atoms → components/primitives}/dialog.js +8 -8
  81. package/dist/components/primitives/dialog.js.map +1 -0
  82. package/dist/{atoms → components/primitives}/drawer.js +1 -1
  83. package/dist/components/primitives/drawer.js.map +1 -0
  84. package/dist/{atoms → components/primitives}/dropdown-menu.js +1 -1
  85. package/dist/components/primitives/dropdown-menu.js.map +1 -0
  86. package/dist/{atoms → components/primitives}/empty.js +1 -1
  87. package/dist/components/primitives/empty.js.map +1 -0
  88. package/dist/{atoms → components/primitives}/field.d.ts +1 -1
  89. package/dist/{atoms → components/primitives}/field.js +1 -1
  90. package/dist/components/primitives/field.js.map +1 -0
  91. package/dist/components/primitives/form-context.d.ts +23 -0
  92. package/dist/components/primitives/form-context.js +26 -0
  93. package/dist/components/primitives/form-context.js.map +1 -0
  94. package/dist/components/primitives/form.d.ts +11 -0
  95. package/dist/components/primitives/form.js +85 -0
  96. package/dist/components/primitives/form.js.map +1 -0
  97. package/dist/{atoms → components/primitives}/hover-card.js +1 -1
  98. package/dist/components/primitives/hover-card.js.map +1 -0
  99. package/dist/components/primitives/index.d.ts +116 -0
  100. package/dist/{atoms → components/primitives}/input-group.d.ts +2 -2
  101. package/dist/{atoms → components/primitives}/input-group.js +1 -1
  102. package/dist/components/primitives/input-group.js.map +1 -0
  103. package/dist/{atoms → components/primitives}/input-otp.js +1 -1
  104. package/dist/components/primitives/input-otp.js.map +1 -0
  105. package/dist/{atoms → components/primitives}/input.js +1 -1
  106. package/dist/components/primitives/input.js.map +1 -0
  107. package/dist/{atoms → components/primitives}/item.d.ts +2 -2
  108. package/dist/{atoms → components/primitives}/item.js +1 -1
  109. package/dist/components/primitives/item.js.map +1 -0
  110. package/dist/{atoms → components/primitives}/kbd.js +1 -1
  111. package/dist/components/primitives/kbd.js.map +1 -0
  112. package/dist/{atoms → components/primitives}/label.js +1 -1
  113. package/dist/components/primitives/label.js.map +1 -0
  114. package/dist/components/primitives/loading-swap.d.ts +8 -0
  115. package/dist/components/primitives/loading-swap.js +25 -0
  116. package/dist/components/primitives/loading-swap.js.map +1 -0
  117. package/dist/{atoms → components/primitives}/menubar.js +1 -1
  118. package/dist/components/primitives/menubar.js.map +1 -0
  119. package/dist/components/primitives/navigation-menu-variants.d.ts +1 -0
  120. package/dist/components/primitives/navigation-menu-variants.js +8 -0
  121. package/dist/components/primitives/navigation-menu-variants.js.map +1 -0
  122. package/dist/components/primitives/navigation-menu.d.ts +13 -0
  123. package/dist/components/primitives/navigation-menu.js +102 -0
  124. package/dist/components/primitives/navigation-menu.js.map +1 -0
  125. package/dist/{atoms → components/primitives}/pagination.d.ts +1 -1
  126. package/dist/{atoms → components/primitives}/pagination.js +2 -2
  127. package/dist/components/primitives/pagination.js.map +1 -0
  128. package/dist/{atoms → components/primitives}/popover.js +1 -1
  129. package/dist/components/primitives/popover.js.map +1 -0
  130. package/dist/{atoms → components/primitives}/progress.js +1 -1
  131. package/dist/components/primitives/progress.js.map +1 -0
  132. package/dist/{atoms → components/primitives}/radio-group.js +1 -1
  133. package/dist/components/primitives/radio-group.js.map +1 -0
  134. package/dist/{atoms → components/primitives}/resizable.js +1 -1
  135. package/dist/components/primitives/resizable.js.map +1 -0
  136. package/dist/{atoms → components/primitives}/scroll-area.js +1 -1
  137. package/dist/components/primitives/scroll-area.js.map +1 -0
  138. package/dist/{atoms → components/primitives}/select.js +1 -1
  139. package/dist/components/primitives/select.js.map +1 -0
  140. package/dist/{atoms → components/primitives}/separator.js +1 -1
  141. package/dist/components/primitives/separator.js.map +1 -0
  142. package/dist/{atoms → components/primitives}/sheet.js +5 -5
  143. package/dist/components/primitives/sheet.js.map +1 -0
  144. package/dist/components/primitives/sidebar-context.d.ts +12 -0
  145. package/dist/components/primitives/sidebar-context.js +13 -0
  146. package/dist/components/primitives/sidebar-context.js.map +1 -0
  147. package/dist/components/primitives/sidebar-variants.d.ts +4 -0
  148. package/dist/components/primitives/sidebar-variants.js +25 -0
  149. package/dist/components/primitives/sidebar-variants.js.map +1 -0
  150. package/dist/components/primitives/sidebar.d.ts +56 -0
  151. package/dist/components/primitives/sidebar.js +542 -0
  152. package/dist/components/primitives/sidebar.js.map +1 -0
  153. package/dist/{atoms → components/primitives}/skeleton.js +1 -1
  154. package/dist/components/primitives/skeleton.js.map +1 -0
  155. package/dist/{atoms → components/primitives}/slider.js +1 -1
  156. package/dist/components/primitives/slider.js.map +1 -0
  157. package/dist/components/primitives/sonner.js.map +1 -0
  158. package/dist/{atoms → components/primitives}/spinner.js +1 -1
  159. package/dist/components/primitives/spinner.js.map +1 -0
  160. package/dist/{atoms → components/primitives}/switch.js +1 -1
  161. package/dist/components/primitives/switch.js.map +1 -0
  162. package/dist/{atoms → components/primitives}/table.js +1 -1
  163. package/dist/components/primitives/table.js.map +1 -0
  164. package/dist/{atoms → components/primitives}/tabs.js +1 -1
  165. package/dist/components/primitives/tabs.js.map +1 -0
  166. package/dist/{atoms → components/primitives}/textarea.js +1 -1
  167. package/dist/components/primitives/textarea.js.map +1 -0
  168. package/dist/components/primitives/theme-provider.js.map +1 -0
  169. package/dist/{atoms → components/primitives}/toggle-group.d.ts +1 -1
  170. package/dist/{atoms → components/primitives}/toggle-group.js +2 -2
  171. package/dist/components/primitives/toggle-group.js.map +1 -0
  172. package/dist/components/primitives/toggle-variants.d.ts +4 -0
  173. package/dist/{atoms/toggle.js → components/primitives/toggle-variants.js} +5 -24
  174. package/dist/components/primitives/toggle-variants.js.map +1 -0
  175. package/dist/components/primitives/toggle.d.ts +9 -0
  176. package/dist/components/primitives/toggle.js +21 -0
  177. package/dist/components/primitives/toggle.js.map +1 -0
  178. package/dist/{atoms → components/primitives}/tooltip.js +1 -1
  179. package/dist/components/primitives/tooltip.js.map +1 -0
  180. package/dist/composites/index.js +13 -0
  181. package/dist/{organisms → composites}/index.js.map +1 -1
  182. package/dist/hooks/index.d.ts +7 -0
  183. package/dist/hooks/index.js +8 -2
  184. package/dist/hooks/index.js.map +1 -1
  185. package/dist/hooks/use-aria-live.d.ts +22 -0
  186. package/dist/hooks/use-aria-live.js +18 -0
  187. package/dist/hooks/use-aria-live.js.map +1 -0
  188. package/dist/hooks/use-focus-visible.d.ts +15 -0
  189. package/dist/hooks/use-focus-visible.js +16 -0
  190. package/dist/hooks/use-focus-visible.js.map +1 -0
  191. package/dist/hooks/use-screen-reader-only.d.ts +14 -0
  192. package/dist/hooks/use-screen-reader-only.js +10 -0
  193. package/dist/hooks/use-screen-reader-only.js.map +1 -0
  194. package/dist/index.d.ts +10 -58
  195. package/dist/index.js +372 -343
  196. package/dist/index.js.map +1 -1
  197. package/dist/lib/index.d.ts +3 -0
  198. package/dist/lib/index.js +8 -2
  199. package/dist/lib/index.js.map +1 -1
  200. package/dist/lib/utils-enhanced.d.ts +27 -0
  201. package/dist/lib/utils-enhanced.js +28 -0
  202. package/dist/lib/utils-enhanced.js.map +1 -0
  203. package/dist/lib/utils-enhanced.test.d.ts +1 -0
  204. package/dist/marketing/index.js +9 -0
  205. package/dist/primitives/index.js +345 -0
  206. package/dist/{atoms → primitives}/index.js.map +1 -1
  207. package/package.json +24 -27
  208. package/dist/atoms/accordion.js.map +0 -1
  209. package/dist/atoms/alert-dialog.js.map +0 -1
  210. package/dist/atoms/alert.js.map +0 -1
  211. package/dist/atoms/aspect-ratio.js.map +0 -1
  212. package/dist/atoms/avatar.js.map +0 -1
  213. package/dist/atoms/badge.d.ts +0 -9
  214. package/dist/atoms/badge.js.map +0 -1
  215. package/dist/atoms/breadcrumb.js.map +0 -1
  216. package/dist/atoms/button-group.d.ts +0 -11
  217. package/dist/atoms/button-group.js +0 -76
  218. package/dist/atoms/button-group.js.map +0 -1
  219. package/dist/atoms/button.d.ts +0 -10
  220. package/dist/atoms/button.js.map +0 -1
  221. package/dist/atoms/calendar.js.map +0 -1
  222. package/dist/atoms/card.js.map +0 -1
  223. package/dist/atoms/carousel.js.map +0 -1
  224. package/dist/atoms/chart.js.map +0 -1
  225. package/dist/atoms/checkbox.js.map +0 -1
  226. package/dist/atoms/collapsible.js.map +0 -1
  227. package/dist/atoms/command.js.map +0 -1
  228. package/dist/atoms/context-menu.js.map +0 -1
  229. package/dist/atoms/dialog.js.map +0 -1
  230. package/dist/atoms/drawer.js.map +0 -1
  231. package/dist/atoms/dropdown-menu.js.map +0 -1
  232. package/dist/atoms/empty.js.map +0 -1
  233. package/dist/atoms/field.js.map +0 -1
  234. package/dist/atoms/form.d.ts +0 -24
  235. package/dist/atoms/form.js +0 -88
  236. package/dist/atoms/form.js.map +0 -1
  237. package/dist/atoms/hover-card.js.map +0 -1
  238. package/dist/atoms/index.d.ts +0 -54
  239. package/dist/atoms/index.js +0 -342
  240. package/dist/atoms/input-group.js.map +0 -1
  241. package/dist/atoms/input-otp.js.map +0 -1
  242. package/dist/atoms/input.js.map +0 -1
  243. package/dist/atoms/item.js.map +0 -1
  244. package/dist/atoms/kbd.js.map +0 -1
  245. package/dist/atoms/label.js.map +0 -1
  246. package/dist/atoms/menubar.js.map +0 -1
  247. package/dist/atoms/navigation-menu.d.ts +0 -14
  248. package/dist/atoms/navigation-menu.js +0 -160
  249. package/dist/atoms/navigation-menu.js.map +0 -1
  250. package/dist/atoms/pagination.js.map +0 -1
  251. package/dist/atoms/popover.js.map +0 -1
  252. package/dist/atoms/progress.js.map +0 -1
  253. package/dist/atoms/radio-group.js.map +0 -1
  254. package/dist/atoms/resizable.js.map +0 -1
  255. package/dist/atoms/scroll-area.js.map +0 -1
  256. package/dist/atoms/select.js.map +0 -1
  257. package/dist/atoms/separator.js.map +0 -1
  258. package/dist/atoms/sheet.js.map +0 -1
  259. package/dist/atoms/sidebar.d.ts +0 -70
  260. package/dist/atoms/sidebar.js +0 -573
  261. package/dist/atoms/sidebar.js.map +0 -1
  262. package/dist/atoms/skeleton.js.map +0 -1
  263. package/dist/atoms/slider.js.map +0 -1
  264. package/dist/atoms/sonner.js.map +0 -1
  265. package/dist/atoms/spinner.js.map +0 -1
  266. package/dist/atoms/switch.js.map +0 -1
  267. package/dist/atoms/table.js.map +0 -1
  268. package/dist/atoms/tabs.js.map +0 -1
  269. package/dist/atoms/textarea.js.map +0 -1
  270. package/dist/atoms/theme-provider.js.map +0 -1
  271. package/dist/atoms/toggle-group.js.map +0 -1
  272. package/dist/atoms/toggle.d.ts +0 -9
  273. package/dist/atoms/toggle.js.map +0 -1
  274. package/dist/atoms/tooltip.js.map +0 -1
  275. package/dist/default-layout.js +0 -114
  276. package/dist/default-layout.js.map +0 -1
  277. package/dist/molecules/index.d.ts +0 -3
  278. package/dist/molecules/index.js +0 -9
  279. package/dist/molecules/sidebar-theme-toggle.d.ts +0 -5
  280. package/dist/molecules/sidebar-theme-toggle.js +0 -39
  281. package/dist/molecules/sidebar-theme-toggle.js.map +0 -1
  282. package/dist/molecules/theme-toggle.js.map +0 -1
  283. package/dist/molecules/user-menu.js.map +0 -1
  284. package/dist/organisms/app-navbar.d.ts +0 -73
  285. package/dist/organisms/app-navbar.js +0 -142
  286. package/dist/organisms/app-navbar.js.map +0 -1
  287. package/dist/organisms/app-sidebar.d.ts +0 -67
  288. package/dist/organisms/app-sidebar.js +0 -161
  289. package/dist/organisms/app-sidebar.js.map +0 -1
  290. package/dist/organisms/index.d.ts +0 -2
  291. package/dist/organisms/index.js +0 -7
  292. /package/dist/{molecules → components/composites}/theme-toggle.d.ts +0 -0
  293. /package/dist/{molecules → components/composites}/user-menu.d.ts +0 -0
  294. /package/dist/{atoms → components/primitives}/accordion.d.ts +0 -0
  295. /package/dist/{atoms → components/primitives}/alert-dialog.d.ts +0 -0
  296. /package/dist/{atoms → components/primitives}/alert.d.ts +0 -0
  297. /package/dist/{atoms → components/primitives}/aspect-ratio.d.ts +0 -0
  298. /package/dist/{atoms → components/primitives}/aspect-ratio.js +0 -0
  299. /package/dist/{atoms → components/primitives}/avatar.d.ts +0 -0
  300. /package/dist/{atoms → components/primitives}/breadcrumb.d.ts +0 -0
  301. /package/dist/{atoms → components/primitives}/card.d.ts +0 -0
  302. /package/dist/{atoms → components/primitives}/chart.d.ts +0 -0
  303. /package/dist/{atoms → components/primitives}/checkbox.d.ts +0 -0
  304. /package/dist/{atoms → components/primitives}/collapsible.d.ts +0 -0
  305. /package/dist/{atoms → components/primitives}/collapsible.js +0 -0
  306. /package/dist/{atoms → components/primitives}/context-menu.d.ts +0 -0
  307. /package/dist/{atoms → components/primitives}/dialog.d.ts +0 -0
  308. /package/dist/{atoms → components/primitives}/drawer.d.ts +0 -0
  309. /package/dist/{atoms → components/primitives}/dropdown-menu.d.ts +0 -0
  310. /package/dist/{atoms → components/primitives}/empty.d.ts +0 -0
  311. /package/dist/{atoms → components/primitives}/hover-card.d.ts +0 -0
  312. /package/dist/{atoms → components/primitives}/input-otp.d.ts +0 -0
  313. /package/dist/{atoms → components/primitives}/input.d.ts +0 -0
  314. /package/dist/{atoms → components/primitives}/kbd.d.ts +0 -0
  315. /package/dist/{atoms → components/primitives}/label.d.ts +0 -0
  316. /package/dist/{atoms → components/primitives}/menubar.d.ts +0 -0
  317. /package/dist/{atoms → components/primitives}/popover.d.ts +0 -0
  318. /package/dist/{atoms → components/primitives}/progress.d.ts +0 -0
  319. /package/dist/{atoms → components/primitives}/radio-group.d.ts +0 -0
  320. /package/dist/{atoms → components/primitives}/resizable.d.ts +0 -0
  321. /package/dist/{atoms → components/primitives}/scroll-area.d.ts +0 -0
  322. /package/dist/{atoms → components/primitives}/select.d.ts +0 -0
  323. /package/dist/{atoms → components/primitives}/separator.d.ts +0 -0
  324. /package/dist/{atoms → components/primitives}/sheet.d.ts +0 -0
  325. /package/dist/{atoms → components/primitives}/skeleton.d.ts +0 -0
  326. /package/dist/{atoms → components/primitives}/slider.d.ts +0 -0
  327. /package/dist/{atoms → components/primitives}/sonner.d.ts +0 -0
  328. /package/dist/{atoms → components/primitives}/sonner.js +0 -0
  329. /package/dist/{atoms → components/primitives}/spinner.d.ts +0 -0
  330. /package/dist/{atoms → components/primitives}/switch.d.ts +0 -0
  331. /package/dist/{atoms → components/primitives}/table.d.ts +0 -0
  332. /package/dist/{atoms → components/primitives}/tabs.d.ts +0 -0
  333. /package/dist/{atoms → components/primitives}/textarea.d.ts +0 -0
  334. /package/dist/{atoms → components/primitives}/theme-provider.d.ts +0 -0
  335. /package/dist/{atoms → components/primitives}/theme-provider.js +0 -0
  336. /package/dist/{atoms → components/primitives}/tooltip.d.ts +0 -0
  337. /package/dist/{molecules → marketing}/index.js.map +0 -0
@@ -0,0 +1,141 @@
1
+ import { jsxs as a, jsx as o } from "react/jsx-runtime";
2
+ import { useState as d, useRef as S, useEffect as w } from "react";
3
+ import { Search as N, Loader2 as A, X as D } from "lucide-react";
4
+ import { AnimatePresence as F, motion as K } from "framer-motion";
5
+ import { Input as T } from "../primitives/input.js";
6
+ import { cn as q } from "../../lib/utils.js";
7
+ function H({
8
+ placeholder: y = "Search components...",
9
+ onSearch: m,
10
+ onSelect: u,
11
+ minQueryLength: l = 2,
12
+ debounceMs: h = 300,
13
+ className: k,
14
+ showOnMobile: C = !1
15
+ }) {
16
+ const [t, p] = d(""), [x, i] = d([]), [b, c] = d(!1), [g, s] = d(!1), f = S(null);
17
+ w(() => {
18
+ const e = (n) => {
19
+ f.current && !f.current.contains(n.target) && s(!1);
20
+ };
21
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
22
+ }, []), w(() => {
23
+ const e = new AbortController(), n = setTimeout(async () => {
24
+ if (t.trim().length >= l) {
25
+ c(!0), s(!0);
26
+ try {
27
+ if (m) {
28
+ const r = await m(t);
29
+ e.signal.aborted || (i(r || []), c(!1));
30
+ } else
31
+ i([]), c(!1);
32
+ } catch {
33
+ e.signal.aborted || (i([]), c(!1));
34
+ }
35
+ } else
36
+ i([]), t.length === 0 && s(!1);
37
+ }, h);
38
+ return () => {
39
+ clearTimeout(n), e.abort();
40
+ };
41
+ }, [t, l, h, m]);
42
+ const R = () => {
43
+ t.trim().length >= l && s(!0);
44
+ }, E = () => {
45
+ p(""), i([]), s(!1);
46
+ }, j = (e) => {
47
+ s(!1), u && u(e);
48
+ }, O = (e) => {
49
+ e.key === "Enter" && t.trim().length >= l && s(!1), e.key === "Escape" && s(!1);
50
+ }, I = x.reduce(
51
+ (e, n) => {
52
+ const r = n.category || "Results";
53
+ return e[r] || (e[r] = []), e[r].push(n), e;
54
+ },
55
+ {}
56
+ ), v = x.length > 0;
57
+ return /* @__PURE__ */ a(
58
+ "div",
59
+ {
60
+ ref: f,
61
+ className: q("relative w-full max-w-md", !C && "hidden md:flex", k),
62
+ children: [
63
+ /* @__PURE__ */ a("div", { className: "relative group w-full", children: [
64
+ /* @__PURE__ */ o("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: /* @__PURE__ */ o(N, { className: "h-4 w-4 text-muted-foreground group-focus-within:text-primary transition-colors" }) }),
65
+ /* @__PURE__ */ o(
66
+ T,
67
+ {
68
+ type: "text",
69
+ value: t,
70
+ onChange: (e) => p(e.target.value),
71
+ onFocus: R,
72
+ onKeyDown: O,
73
+ placeholder: y,
74
+ role: "combobox",
75
+ "aria-autocomplete": "list",
76
+ "aria-expanded": g && t.length >= l,
77
+ "aria-controls": "search-results-dropdown",
78
+ className: "pl-10 pr-10 h-9 w-full border-none bg-muted/50 rounded-full focus-visible:ring-1 focus-visible:bg-background focus-visible:border-border transition-all"
79
+ }
80
+ ),
81
+ t.length > 0 && /* @__PURE__ */ o(
82
+ "button",
83
+ {
84
+ onClick: E,
85
+ className: "absolute inset-y-0 right-0 pr-3 flex items-center text-muted-foreground hover:text-foreground transition-colors",
86
+ "aria-label": "Clear search",
87
+ children: b ? /* @__PURE__ */ o(A, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ o(D, { className: "h-4 w-4" })
88
+ }
89
+ )
90
+ ] }),
91
+ /* @__PURE__ */ o(F, { children: g && t.length >= l && /* @__PURE__ */ a(
92
+ K.div,
93
+ {
94
+ initial: { opacity: 0, y: 10 },
95
+ animate: { opacity: 1, y: 0 },
96
+ exit: { opacity: 0, y: 10 },
97
+ transition: { duration: 0.2 },
98
+ id: "search-results-dropdown",
99
+ role: "listbox",
100
+ className: "absolute top-full left-0 right-0 mt-2 bg-card border border-border rounded-xl shadow-lg overflow-hidden z-50 max-h-[80vh] overflow-y-auto",
101
+ children: [
102
+ !v && !b && /* @__PURE__ */ a("div", { className: "p-4 text-center text-sm text-muted-foreground", children: [
103
+ 'No results found for "',
104
+ t,
105
+ '"'
106
+ ] }),
107
+ v && /* @__PURE__ */ o("div", { className: "py-2", children: Object.entries(I).map(([e, n]) => /* @__PURE__ */ a("div", { className: "mb-2 last:mb-0", children: [
108
+ /* @__PURE__ */ o("div", { className: "px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider", children: e }),
109
+ n.map((r) => /* @__PURE__ */ a(
110
+ "button",
111
+ {
112
+ onClick: () => j(r),
113
+ className: "flex items-center gap-3 px-4 py-2 hover:bg-accent transition-colors w-full text-left",
114
+ children: [
115
+ r.icon && /* @__PURE__ */ o("div", { className: "shrink-0 text-muted-foreground", children: r.icon }),
116
+ /* @__PURE__ */ a("div", { className: "overflow-hidden flex-1", children: [
117
+ /* @__PURE__ */ o("div", { className: "text-sm font-medium truncate text-foreground", children: r.title }),
118
+ r.description && /* @__PURE__ */ o("div", { className: "text-xs text-muted-foreground truncate", children: r.description })
119
+ ] })
120
+ ]
121
+ },
122
+ r.id
123
+ ))
124
+ ] }, e)) }),
125
+ t.length >= l && /* @__PURE__ */ a("div", { className: "flex items-center justify-center gap-2 w-full p-4 text-sm font-medium border-t border-border hover:bg-accent transition-colors text-primary cursor-pointer", children: [
126
+ /* @__PURE__ */ o(N, { className: "h-4 w-4" }),
127
+ 'View all results for "',
128
+ t,
129
+ '"'
130
+ ] })
131
+ ]
132
+ }
133
+ ) })
134
+ ]
135
+ }
136
+ );
137
+ }
138
+ export {
139
+ H as default
140
+ };
141
+ //# sourceMappingURL=ComponentSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComponentSearch.js","sources":["../../../src/components/composites/ComponentSearch.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport { Search, X, Loader2 } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { Input } from \"../primitives/input\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface SearchResult {\n id: string;\n title: string;\n description?: string;\n icon?: React.ReactNode;\n href?: string;\n category?: string;\n}\n\nexport interface ComponentSearchProps {\n /**\n * Placeholder text for the search input\n * @default \"Search components...\"\n */\n placeholder?: string;\n /**\n * Async function to fetch search results based on query\n */\n onSearch?: (query: string) => Promise<SearchResult[]>;\n /**\n * Callback when a search result is selected\n */\n onSelect?: (result: SearchResult) => void;\n /**\n * Minimum characters required before triggering search\n * @default 2\n */\n minQueryLength?: number;\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounceMs?: number;\n /**\n * Custom className for the container\n */\n className?: string;\n /**\n * Whether to show the component on mobile\n * @default false\n */\n showOnMobile?: boolean;\n}\n\nexport default function ComponentSearch({\n placeholder = \"Search components...\",\n onSearch,\n onSelect,\n minQueryLength = 2,\n debounceMs = 300,\n className,\n showOnMobile = false,\n}: ComponentSearchProps) {\n const [query, setQuery] = useState(\"\");\n const [results, setResults] = useState<SearchResult[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Handle outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // Debounced search implementation\n useEffect(() => {\n const abortController = new AbortController();\n const timer = setTimeout(async () => {\n if (query.trim().length >= minQueryLength) {\n setIsLoading(true);\n setIsOpen(true);\n try {\n if (onSearch) {\n const res = await onSearch(query);\n if (!abortController.signal.aborted) {\n setResults(res || []);\n setIsLoading(false);\n }\n } else {\n // Default mock search if no onSearch provided\n setResults([]);\n setIsLoading(false);\n }\n } catch {\n if (!abortController.signal.aborted) {\n setResults([]);\n setIsLoading(false);\n }\n }\n } else {\n setResults([]);\n if (query.length === 0) setIsOpen(false);\n }\n }, debounceMs);\n\n return () => {\n clearTimeout(timer);\n abortController.abort();\n };\n }, [query, minQueryLength, debounceMs, onSearch]);\n\n const handleFocus = () => {\n if (query.trim().length >= minQueryLength) {\n setIsOpen(true);\n }\n };\n\n const clearSearch = () => {\n setQuery(\"\");\n setResults([]);\n setIsOpen(false);\n };\n\n const handleSelect = (result: SearchResult) => {\n setIsOpen(false);\n if (onSelect) {\n onSelect(result);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && query.trim().length >= minQueryLength) {\n // Handle enter key - could navigate to search results page\n setIsOpen(false);\n }\n if (e.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n // Group results by category\n const groupedResults = results.reduce(\n (acc, result) => {\n const category = result.category || \"Results\";\n if (!acc[category]) {\n acc[category] = [];\n }\n acc[category].push(result);\n return acc;\n },\n {} as Record<string, SearchResult[]>,\n );\n\n const hasResults = results.length > 0;\n\n return (\n <div\n ref={containerRef}\n className={cn(\"relative w-full max-w-md\", !showOnMobile && \"hidden md:flex\", className)}\n >\n <div className=\"relative group w-full\">\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <Search className=\"h-4 w-4 text-muted-foreground group-focus-within:text-primary transition-colors\" />\n </div>\n <Input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen && query.length >= minQueryLength}\n aria-controls=\"search-results-dropdown\"\n className=\"pl-10 pr-10 h-9 w-full border-none bg-muted/50 rounded-full focus-visible:ring-1 focus-visible:bg-background focus-visible:border-border transition-all\"\n />\n {query.length > 0 && (\n <button\n onClick={clearSearch}\n className=\"absolute inset-y-0 right-0 pr-3 flex items-center text-muted-foreground hover:text-foreground transition-colors\"\n aria-label=\"Clear search\"\n >\n {isLoading ? <Loader2 className=\"h-4 w-4 animate-spin\" /> : <X className=\"h-4 w-4\" />}\n </button>\n )}\n </div>\n\n <AnimatePresence>\n {isOpen && query.length >= minQueryLength && (\n <motion.div\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 10 }}\n transition={{ duration: 0.2 }}\n id=\"search-results-dropdown\"\n role=\"listbox\"\n className=\"absolute top-full left-0 right-0 mt-2 bg-card border border-border rounded-xl shadow-lg overflow-hidden z-50 max-h-[80vh] overflow-y-auto\"\n >\n {!hasResults && !isLoading && (\n <div className=\"p-4 text-center text-sm text-muted-foreground\">\n No results found for &quot;{query}&quot;\n </div>\n )}\n\n {hasResults && (\n <div className=\"py-2\">\n {Object.entries(groupedResults).map(([category, categoryResults]) => (\n <div key={category} className=\"mb-2 last:mb-0\">\n <div className=\"px-3 py-1.5 text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {category}\n </div>\n {categoryResults.map((result) => (\n <button\n key={result.id}\n onClick={() => handleSelect(result)}\n className=\"flex items-center gap-3 px-4 py-2 hover:bg-accent transition-colors w-full text-left\"\n >\n {result.icon && (\n <div className=\"shrink-0 text-muted-foreground\">{result.icon}</div>\n )}\n <div className=\"overflow-hidden flex-1\">\n <div className=\"text-sm font-medium truncate text-foreground\">\n {result.title}\n </div>\n {result.description && (\n <div className=\"text-xs text-muted-foreground truncate\">\n {result.description}\n </div>\n )}\n </div>\n </button>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {query.length >= minQueryLength && (\n <div className=\"flex items-center justify-center gap-2 w-full p-4 text-sm font-medium border-t border-border hover:bg-accent transition-colors text-primary cursor-pointer\">\n <Search className=\"h-4 w-4\" />\n View all results for &quot;{query}&quot;\n </div>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n"],"names":["jsxs","jsx","useState","useRef","useEffect","Search","Loader2","X","AnimatePresence","motion","Input","cn","ComponentSearch","placeholder","onSearch","onSelect","minQueryLength","debounceMs","className","showOnMobile","query","setQuery","results","setResults","isLoading","setIsLoading","isOpen","setIsOpen","containerRef","handleClickOutside","event","abortController","timer","res","handleFocus","clearSearch","handleSelect","result","handleKeyDown","groupedResults","acc","category","hasResults","categoryResults"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { CustomButtonProps } from '../primitives/custom-button';
2
+ import * as React from "react";
3
+ interface ActionButtonProps extends CustomButtonProps {
4
+ action: () => Promise<{
5
+ error: boolean;
6
+ message?: string;
7
+ }>;
8
+ requireAreYouSure?: boolean;
9
+ areYouSureTitle?: React.ReactNode;
10
+ areYouSureDescription?: React.ReactNode;
11
+ showSuccessToast?: boolean;
12
+ showErrorToast?: boolean;
13
+ }
14
+ declare const ActionButton: React.ForwardRefExoticComponent<ActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
15
+ export { ActionButton };
16
+ export type { ActionButtonProps };
@@ -0,0 +1,71 @@
1
+ import { jsx as t, jsxs as e } from "react/jsx-runtime";
2
+ import * as B from "react";
3
+ import { useTransition as y } from "react";
4
+ import { toast as n } from "sonner";
5
+ import { AlertDialog as T, AlertDialogTrigger as v, AlertDialogContent as x, AlertDialogHeader as b, AlertDialogTitle as j, AlertDialogDescription as k, AlertDialogFooter as R, AlertDialogCancel as w, AlertDialogAction as F } from "../primitives/alert-dialog.js";
6
+ import { CustomButton as s } from "../primitives/custom-button.js";
7
+ const H = B.forwardRef(
8
+ ({
9
+ action: d,
10
+ requireAreYouSure: o = !1,
11
+ areYouSureTitle: g = "Are you sure?",
12
+ areYouSureDescription: m = "This action cannot be undone.",
13
+ showSuccessToast: f = !0,
14
+ showErrorToast: l = !0,
15
+ children: u,
16
+ onClick: A,
17
+ disabled: h,
18
+ ...p
19
+ }, D) => {
20
+ const [i, C] = y(), c = () => {
21
+ C(async () => {
22
+ try {
23
+ const r = await d();
24
+ r.error ? l && n.error(r.message || "An error occurred") : f && r.message && n.success(r.message);
25
+ } catch (r) {
26
+ l && n.error("A critical error occurred"), console.error("ActionButton error:", r);
27
+ }
28
+ });
29
+ }, a = /* @__PURE__ */ t(
30
+ s,
31
+ {
32
+ ...p,
33
+ ref: D,
34
+ disabled: h || i,
35
+ loading: !o && i,
36
+ onClick: (r) => {
37
+ o || c(), A?.(r);
38
+ },
39
+ children: u
40
+ }
41
+ );
42
+ return o ? /* @__PURE__ */ e(T, { children: [
43
+ /* @__PURE__ */ t(v, { asChild: !0, children: a }),
44
+ /* @__PURE__ */ e(x, { children: [
45
+ /* @__PURE__ */ e(b, { children: [
46
+ /* @__PURE__ */ t(j, { children: g }),
47
+ /* @__PURE__ */ t(k, { children: m })
48
+ ] }),
49
+ /* @__PURE__ */ e(R, { children: [
50
+ /* @__PURE__ */ t(w, { children: "Cancel" }),
51
+ /* @__PURE__ */ t(F, { asChild: !0, children: /* @__PURE__ */ t(
52
+ s,
53
+ {
54
+ variant: "destructive",
55
+ loading: i,
56
+ onClick: (r) => {
57
+ r.preventDefault(), c();
58
+ },
59
+ children: "Confirm"
60
+ }
61
+ ) })
62
+ ] })
63
+ ] })
64
+ ] }) : a;
65
+ }
66
+ );
67
+ H.displayName = "ActionButton";
68
+ export {
69
+ H as ActionButton
70
+ };
71
+ //# sourceMappingURL=action-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-button.js","sources":["../../../src/components/composites/action-button.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useTransition } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../primitives/alert-dialog\";\nimport { CustomButton, type CustomButtonProps } from \"../primitives/custom-button\";\n\ninterface ActionButtonProps extends CustomButtonProps {\n action: () => Promise<{ error: boolean; message?: string }>;\n requireAreYouSure?: boolean;\n areYouSureTitle?: React.ReactNode;\n areYouSureDescription?: React.ReactNode;\n showSuccessToast?: boolean;\n showErrorToast?: boolean;\n}\n\nconst ActionButton = React.forwardRef<HTMLButtonElement, ActionButtonProps>(\n (\n {\n action,\n requireAreYouSure = false,\n areYouSureTitle = \"Are you sure?\",\n areYouSureDescription = \"This action cannot be undone.\",\n showSuccessToast = true,\n showErrorToast = true,\n children,\n onClick,\n disabled,\n ...props\n },\n ref,\n ) => {\n const [isPending, startTransition] = useTransition();\n\n const performAction = () => {\n startTransition(async () => {\n try {\n const result = await action();\n if (result.error) {\n if (showErrorToast) {\n toast.error(result.message || \"An error occurred\");\n }\n } else {\n if (showSuccessToast && result.message) {\n toast.success(result.message);\n }\n }\n } catch (error) {\n if (showErrorToast) {\n toast.error(\"A critical error occurred\");\n }\n console.error(\"ActionButton error:\", error);\n }\n });\n };\n\n const triggerButton = (\n <CustomButton\n {...props}\n ref={ref}\n disabled={disabled || isPending}\n loading={!requireAreYouSure && isPending}\n onClick={(e) => {\n if (!requireAreYouSure) {\n performAction();\n }\n onClick?.(e);\n }}\n >\n {children}\n </CustomButton>\n );\n\n if (requireAreYouSure) {\n return (\n <AlertDialog>\n <AlertDialogTrigger asChild>{triggerButton}</AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{areYouSureTitle}</AlertDialogTitle>\n <AlertDialogDescription>{areYouSureDescription}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction asChild>\n <CustomButton\n variant=\"destructive\"\n loading={isPending}\n onClick={(e) => {\n e.preventDefault(); // Prevent closing immediately if we want to show loading\n performAction();\n }}\n >\n Confirm\n </CustomButton>\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n return triggerButton;\n },\n);\n\nActionButton.displayName = \"ActionButton\";\n\nexport { ActionButton };\nexport type { ActionButtonProps };\n"],"names":["jsx","jsxs","React","useTransition","toast","AlertDialog","AlertDialogTrigger","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","CustomButton","ActionButton","action","requireAreYouSure","areYouSureTitle","areYouSureDescription","showSuccessToast","showErrorToast","children","onClick","disabled","props","ref","isPending","startTransition","performAction","result","error","triggerButton","e"],"mappings":"AA2BA,SAAA,OAAAA,GAAA,QAAAC,SAAA;AAAA,YAAAC,OAAA;AAAA,SAAA,iBAAAC,SAAA;AAAA,SAAA,SAAAC,SAAA;AAAA,SAAA,eAAAC,GAAA,sBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,GAAA,oBAAAC,GAAA,0BAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,SAAA;AAAA,SAAA,gBAAAC,SAAA;AAAA,MAAMC,IAAeb,EAAM;AAAA,EACzB,CACE;AAAA,IACE,QAAAc;AAAA,IACA,mBAAAC,IAAoB;AAAA,IACpB,iBAAAC,IAAkB;AAAA,IAClB,uBAAAC,IAAwB;AAAA,IACxB,kBAAAC,IAAmB;AAAA,IACnB,gBAAAC,IAAiB;AAAA,IACjB,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,CAACC,GAAWC,CAAe,IAAIzB,EAAA,GAE/B0B,IAAgB,MAAM;AAC1B,MAAAD,EAAgB,YAAY;AAC1B,YAAI;AACF,gBAAME,IAAS,MAAMd,EAAA;AACrB,UAAIc,EAAO,QACLT,KACFjB,EAAM,MAAM0B,EAAO,WAAW,mBAAmB,IAG/CV,KAAoBU,EAAO,WAC7B1B,EAAM,QAAQ0B,EAAO,OAAO;AAAA,QAGlC,SAASC,GAAO;AACd,UAAIV,KACFjB,EAAM,MAAM,2BAA2B,GAEzC,QAAQ,MAAM,uBAAuB2B,CAAK;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH,GAEMC,IACJ,gBAAAhC;AAAA,MAACc;AAAA,MAAA;AAAA,QACE,GAAGW;AAAA,QACJ,KAAAC;AAAA,QACA,UAAUF,KAAYG;AAAA,QACtB,SAAS,CAACV,KAAqBU;AAAA,QAC/B,SAAS,CAACM,MAAM;AACd,UAAKhB,KACHY,EAAA,GAEFN,IAAUU,CAAC;AAAA,QACb;AAAA,QAEC,UAAAX;AAAA,MAAA;AAAA,IAAA;AAIL,WAAIL,sBAECZ,GAAA,EACC,UAAA;AAAA,MAAA,gBAAAL,EAACM,GAAA,EAAmB,SAAO,IAAE,UAAA0B,GAAc;AAAA,wBAC1CzB,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAN,EAACO,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAR,EAACS,KAAkB,UAAAS,EAAA,CAAgB;AAAA,UACnC,gBAAAlB,EAACU,KAAwB,UAAAS,EAAA,CAAsB;AAAA,QAAA,GACjD;AAAA,0BACCR,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAX,EAACY,KAAkB,UAAA,SAAA,CAAM;AAAA,UACzB,gBAAAZ,EAACa,GAAA,EAAkB,SAAO,IACxB,UAAA,gBAAAb;AAAA,YAACc;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,SAASa;AAAA,cACT,SAAS,CAACM,MAAM;AACd,gBAAAA,EAAE,eAAA,GACFJ,EAAA;AAAA,cACF;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA,EAED,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF,IAIGG;AAAA,EACT;AACF;AAEAjB,EAAa,cAAc;"}
@@ -0,0 +1,9 @@
1
+ export * from './theme-toggle';
2
+ export * from './user-menu';
3
+ export * from './sidebar-wrapper';
4
+ export * from './action-button';
5
+ export { default as ComponentSearch } from './ComponentSearch';
6
+ export type * from './theme-toggle';
7
+ export type * from './user-menu';
8
+ export type * from './sidebar-wrapper';
9
+ export type * from './action-button';
@@ -0,0 +1,27 @@
1
+ import { Sidebar } from '../primitives/sidebar';
2
+ import * as React from "react";
3
+ export interface SidebarWrapperProps extends React.ComponentPropsWithoutRef<typeof Sidebar> {
4
+ /**
5
+ * Optional custom trigger component. If not provided, a default trigger button is rendered.
6
+ */
7
+ trigger?: React.ReactNode;
8
+ /**
9
+ * Children rendered inside the SidebarContent area.
10
+ */
11
+ children: React.ReactNode;
12
+ }
13
+ /**
14
+ * SidebarWrapper
15
+ *
16
+ * A composable wrapper around the shadcn/ui `Sidebar` components tailored for the
17
+ * `mcomposites` package. It provides a ready‑to‑use layout consisting of a
18
+ * `SidebarProvider`, a `Sidebar` with optional custom trigger, and a content
19
+ * area. The wrapper can be dropped into any page to instantly gain a fully
20
+ * functional, accessible sidebar.
21
+ *
22
+ * Example usage:
23
+ * ```tsx
24
+ * <SidebarWrapper trigger={<MyTrigger />}>...</SidebarWrapper>
25
+ * ```
26
+ */
27
+ export declare function SidebarWrapper({ trigger, children, className, ...sidebarProps }: SidebarWrapperProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,21 @@
1
+ import { jsxs as e, jsx as r } from "react/jsx-runtime";
2
+ import { SidebarProvider as o, Sidebar as t, SidebarHeader as b, SidebarContent as S, SidebarTrigger as p, SidebarInset as m } from "../primitives/sidebar.js";
3
+ function f({
4
+ trigger: i,
5
+ children: d,
6
+ className: a,
7
+ ...n
8
+ }) {
9
+ return /* @__PURE__ */ e(o, { children: [
10
+ /* @__PURE__ */ e(t, { className: a, ...n, children: [
11
+ /* @__PURE__ */ r(b, {}),
12
+ /* @__PURE__ */ r(S, { children: d }),
13
+ i ?? /* @__PURE__ */ r(p, {})
14
+ ] }),
15
+ /* @__PURE__ */ r(m, {})
16
+ ] });
17
+ }
18
+ export {
19
+ f as SidebarWrapper
20
+ };
21
+ //# sourceMappingURL=sidebar-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar-wrapper.js","sources":["../../../src/components/composites/sidebar-wrapper.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n Sidebar,\n SidebarHeader,\n SidebarContent,\n SidebarProvider,\n SidebarTrigger,\n SidebarInset,\n} from \"../primitives/sidebar\";\n\nexport interface SidebarWrapperProps extends React.ComponentPropsWithoutRef<typeof Sidebar> {\n /**\n * Optional custom trigger component. If not provided, a default trigger button is rendered.\n */\n trigger?: React.ReactNode;\n /**\n * Children rendered inside the SidebarContent area.\n */\n children: React.ReactNode;\n}\n\n/**\n * SidebarWrapper\n *\n * A composable wrapper around the shadcn/ui `Sidebar` components tailored for the\n * `mcomposites` package. It provides a ready‑to‑use layout consisting of a\n * `SidebarProvider`, a `Sidebar` with optional custom trigger, and a content\n * area. The wrapper can be dropped into any page to instantly gain a fully\n * functional, accessible sidebar.\n *\n * Example usage:\n * ```tsx\n * <SidebarWrapper trigger={<MyTrigger />}>...</SidebarWrapper>\n * ```\n */\nexport function SidebarWrapper({\n trigger,\n children,\n className,\n ...sidebarProps\n}: SidebarWrapperProps) {\n return (\n <SidebarProvider>\n <Sidebar className={className} {...sidebarProps}>\n {/* Header can be customized by the consumer via children or by extending this component */}\n <SidebarHeader />\n <SidebarContent>{children}</SidebarContent>\n {/* Optional trigger – falls back to the default button when omitted */}\n {trigger ?? <SidebarTrigger />}\n </Sidebar>\n {/* Inset provides the main content area next to the sidebar */}\n <SidebarInset />\n </SidebarProvider>\n );\n}\n"],"names":["jsxs","jsx","SidebarProvider","Sidebar","SidebarHeader","SidebarContent","SidebarTrigger","SidebarInset","SidebarWrapper","trigger","children","className","sidebarProps"],"mappings":"AAmCO,SAAA,QAAAA,GAAA,OAAAC,SAAA;AAAA,SAAA,mBAAAC,GAAA,WAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,gBAAAC,SAAA;AAAA,SAASC,EAAe;AAAA,EAC7B,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAwB;AACtB,2BACGV,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAF,EAACG,GAAA,EAAQ,WAAAQ,GAAuB,GAAGC,GAEjC,UAAA;AAAA,MAAA,gBAAAX,EAACG,GAAA,EAAc;AAAA,MACf,gBAAAH,EAACI,KAAgB,UAAAK,GAAS;AAAA,MAEzBD,uBAAYH,GAAA,CAAA,CAAe;AAAA,IAAA,GAC9B;AAAA,sBAECC,GAAA,CAAA,CAAa;AAAA,EAAA,GAChB;AAEJ;"}
@@ -1,9 +1,9 @@
1
1
  import { jsxs as o, jsx as e } from "react/jsx-runtime";
2
2
  import { Sun as m, Moon as c } from "lucide-react";
3
3
  import { useTheme as d } from "next-themes";
4
- import { Button as h } from "../atoms/button.js";
5
- import { DropdownMenu as p, DropdownMenuTrigger as u, DropdownMenuContent as k, DropdownMenuItem as n } from "../atoms/dropdown-menu.js";
6
- import { cn as f } from "../lib/utils.js";
4
+ import { Button as h } from "../primitives/button.js";
5
+ import { DropdownMenu as p, DropdownMenuTrigger as u, DropdownMenuContent as k, DropdownMenuItem as n } from "../primitives/dropdown-menu.js";
6
+ import { cn as f } from "../../lib/utils.js";
7
7
  function N({
8
8
  align: a = "end",
9
9
  side: l = "bottom",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.js","sources":["../../../src/components/composites/theme-toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Moon, Sun } from \"lucide-react\";\nimport { useTheme } from \"next-themes\";\n\nimport { Button } from \"../primitives/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../primitives/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ThemeToggleProps {\n align?: \"center\" | \"start\" | \"end\";\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n sideOffset?: number;\n className?: string;\n trigger?: React.ReactNode;\n}\n\nexport function ThemeToggle({\n align = \"end\",\n side = \"bottom\",\n sideOffset = 4,\n className,\n trigger,\n}: ThemeToggleProps) {\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n {trigger ? (\n trigger\n ) : (\n <Button variant=\"ghost\" size=\"icon\" className={cn(\"h-9 w-9\", className)}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100\" />\n <span className=\"sr-only\">Toggle theme</span>\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} side={side} sideOffset={sideOffset}>\n <DropdownMenuItem onClick={() => setTheme(\"light\")}>Light</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"dark\")}>Dark</DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(\"system\")}>System</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["jsxs","jsx","Sun","Moon","useTheme","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","cn","ThemeToggle","align","side","sideOffset","className","trigger","setTheme"],"mappings":"AAuBO,SAAA,QAAAA,GAAA,OAAAC,SAAA;AAAA,SAAA,OAAAC,GAAA,QAAAC,SAAA;AAAA,SAAA,YAAAC,SAAA;AAAA,SAAA,UAAAC,SAAA;AAAA,SAAA,gBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,SAAA;AAAA,SAAA,MAAAC,SAAA;AAAA,SAASC,EAAY;AAAA,EAC1B,OAAAC,IAAQ;AAAA,EACR,MAAAC,IAAO;AAAA,EACP,YAAAC,IAAa;AAAA,EACb,WAAAC;AAAA,EACA,SAAAC;AACF,GAAqB;AACnB,QAAM,EAAE,UAAAC,EAAA,IAAab,EAAA;AAErB,2BACGE,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAL,EAACM,GAAA,EAAoB,SAAO,IACzB,UAAAS,KAGC,gBAAAhB,EAACK,GAAA,EAAO,SAAQ,SAAQ,MAAK,QAAO,WAAWK,EAAG,WAAWK,CAAS,GACpE,UAAA;AAAA,MAAA,gBAAAd,EAACC,GAAA,EAAI,WAAU,uFAAA,CAAuF;AAAA,MACtG,gBAAAD,EAACE,GAAA,EAAK,WAAU,+FAAA,CAA+F;AAAA,MAC/G,gBAAAF,EAAC,QAAA,EAAK,WAAU,WAAU,UAAA,eAAA,CAAY;AAAA,IAAA,EAAA,CACxC,EAAA,CAEJ;AAAA,IACA,gBAAAD,EAACQ,GAAA,EAAoB,OAAAI,GAAc,MAAAC,GAAY,YAAAC,GAC7C,UAAA;AAAA,MAAA,gBAAAb,EAACQ,KAAiB,SAAS,MAAMQ,EAAS,OAAO,GAAG,UAAA,SAAK;AAAA,wBACxDR,GAAA,EAAiB,SAAS,MAAMQ,EAAS,MAAM,GAAG,UAAA,QAAI;AAAA,wBACtDR,GAAA,EAAiB,SAAS,MAAMQ,EAAS,QAAQ,GAAG,UAAA,SAAA,CAAM;AAAA,IAAA,EAAA,CAC7D;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,9 +1,9 @@
1
1
  import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
2
  import * as i from "react";
3
- import { Avatar as t, AvatarImage as d, AvatarFallback as m } from "../atoms/avatar.js";
4
- import { Button as s } from "../atoms/button.js";
5
- import { DropdownMenu as h, DropdownMenuTrigger as p, DropdownMenuContent as f, DropdownMenuLabel as u, DropdownMenuSeparator as x, DropdownMenuItem as g } from "../atoms/dropdown-menu.js";
6
- import { cn as w } from "../lib/utils.js";
3
+ import { Avatar as t, AvatarImage as d, AvatarFallback as m } from "../primitives/avatar.js";
4
+ import { Button as s } from "../primitives/button.js";
5
+ import { DropdownMenu as h, DropdownMenuTrigger as p, DropdownMenuContent as f, DropdownMenuLabel as u, DropdownMenuSeparator as x, DropdownMenuItem as g } from "../primitives/dropdown-menu.js";
6
+ import { cn as w } from "../../lib/utils.js";
7
7
  function b({ user: n, items: o, className: l }) {
8
8
  return /* @__PURE__ */ a(h, { children: [
9
9
  /* @__PURE__ */ e(p, { asChild: !0, children: /* @__PURE__ */ e(s, { variant: "ghost", size: "icon", className: w("rounded-full", l), children: /* @__PURE__ */ a(t, { className: "h-8 w-8", children: [
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-menu.js","sources":["../../../src/components/composites/user-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../primitives/avatar\";\nimport { Button } from \"../primitives/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../primitives/dropdown-menu\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface UserMenuProps {\n user: {\n name: string;\n email: string;\n avatar?: string;\n };\n items?: Array<{\n label: string;\n href?: string;\n onClick?: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n }>;\n className?: string;\n}\n\nexport function UserMenu({ user, items, className }: UserMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className={cn(\"rounded-full\", className)}>\n <Avatar className=\"h-8 w-8\">\n <AvatarImage src={user.avatar} alt={user.name} />\n <AvatarFallback>{user.name?.[0] ?? \"U\"}</AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"p-0 font-normal\">\n <div className=\"flex flex-col space-y-1\">\n <p className=\"text-sm font-medium leading-none\">{user.name}</p>\n <p className=\"text-xs leading-none text-muted-foreground\">{user.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items?.map((item, i) => (\n <DropdownMenuItem key={i} asChild>\n <a href={item.href ?? \"#\"} onClick={item.onClick}>\n {item.icon && React.createElement(item.icon, { className: \"mr-2 h-4 w-4\" })}\n <span>{item.label}</span>\n </a>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["UserMenu","user","items","className","DropdownMenu","jsx","DropdownMenuTrigger","Button","cn","jsxs","Avatar","AvatarImage","AvatarFallback","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","item","i","DropdownMenuItem","React"],"mappings":";;;;;;AA8BO,SAASA,EAAS,EAAE,MAAAC,GAAM,OAAAC,GAAO,WAAAC,KAA4B;AAClE,2BACGC,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAoB,SAAO,IAC1B,UAAA,gBAAAD,EAACE,GAAA,EAAO,SAAQ,SAAQ,MAAK,QAAO,WAAWC,EAAG,gBAAgBL,CAAS,GACzE,UAAA,gBAAAM,EAACC,GAAA,EAAO,WAAU,WAChB,UAAA;AAAA,MAAA,gBAAAL,EAACM,KAAY,KAAKV,EAAK,QAAQ,KAAKA,EAAK,MAAM;AAAA,wBAC9CW,GAAA,EAAgB,UAAAX,EAAK,OAAO,CAAC,KAAK,IAAA,CAAI;AAAA,IAAA,EAAA,CACzC,GACF,GACF;AAAA,IACA,gBAAAQ,EAACI,GAAA,EAAoB,OAAM,OACzB,UAAA;AAAA,MAAA,gBAAAR,EAACS,KAAkB,WAAU,mBAC3B,UAAA,gBAAAL,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAJ,EAAC,KAAA,EAAE,WAAU,oCAAoC,UAAAJ,EAAK,MAAK;AAAA,QAC3D,gBAAAI,EAAC,KAAA,EAAE,WAAU,8CAA8C,YAAK,MAAA,CAAM;AAAA,MAAA,EAAA,CACxE,EAAA,CACF;AAAA,wBACCU,GAAA,EAAsB;AAAA,MACtBb,GAAO,IAAI,CAACc,GAAMC,wBAChBC,GAAA,EAAyB,SAAO,IAC/B,UAAA,gBAAAT,EAAC,OAAE,MAAMO,EAAK,QAAQ,KAAK,SAASA,EAAK,SACtC,UAAA;AAAA,QAAAA,EAAK,QAAQG,EAAM,cAAcH,EAAK,MAAM,EAAE,WAAW,gBAAgB;AAAA,QAC1E,gBAAAX,EAAC,QAAA,EAAM,UAAAW,EAAK,MAAA,CAAM;AAAA,MAAA,EAAA,CACpB,EAAA,GAJqBC,CAKvB,CACD;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -0,0 +1,12 @@
1
+ import * as React from "react";
2
+ interface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {
3
+ title: string;
4
+ subtitle?: string;
5
+ ctaText?: string;
6
+ ctaHref?: string;
7
+ secondaryCtaText?: string;
8
+ secondaryCtaHref?: string;
9
+ badge?: string;
10
+ }
11
+ declare const HeroSection: React.ForwardRefExoticComponent<HeroSectionProps & React.RefAttributes<HTMLElement>>;
12
+ export { HeroSection };
@@ -0,0 +1,87 @@
1
+ import { jsxs as t, jsx as e } from "react/jsx-runtime";
2
+ import * as p from "react";
3
+ import { CustomButton as n } from "../primitives/custom-button.js";
4
+ import { cn as h } from "../../lib/utils.js";
5
+ const x = p.forwardRef(
6
+ ({
7
+ title: o,
8
+ subtitle: r,
9
+ ctaText: l,
10
+ ctaHref: a = "#",
11
+ secondaryCtaText: i,
12
+ secondaryCtaHref: c = "#",
13
+ badge: s,
14
+ className: d,
15
+ ...m
16
+ }, f) => /* @__PURE__ */ t(
17
+ "section",
18
+ {
19
+ ref: f,
20
+ className: h(
21
+ "relative flex flex-col items-center justify-center overflow-hidden px-6 py-24 text-center sm:py-32 lg:px-8",
22
+ d
23
+ ),
24
+ ...m,
25
+ children: [
26
+ /* @__PURE__ */ e(
27
+ "div",
28
+ {
29
+ className: "absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80",
30
+ "aria-hidden": "true",
31
+ children: /* @__PURE__ */ e(
32
+ "div",
33
+ {
34
+ className: "relative left-[calc(50%-11rem)] aspect-1155/678 w-144.5 -translate-x-1/2 rotate-30 bg-linear-to-tr from-[#ff80b5] to-[#9089fc] opacity-20 sm:left-[calc(50%-30rem)] sm:w-288.75",
35
+ style: {
36
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
37
+ }
38
+ }
39
+ )
40
+ }
41
+ ),
42
+ /* @__PURE__ */ t("div", { className: "mx-auto max-w-2xl", children: [
43
+ s && /* @__PURE__ */ e("div", { className: "mb-8 flex justify-center", children: /* @__PURE__ */ t("div", { className: "relative rounded-full px-3 py-1 text-sm leading-6 text-muted-foreground ring-1 ring-border hover:ring-border/80 transition-all", children: [
44
+ s,
45
+ " ",
46
+ /* @__PURE__ */ t("a", { href: a, className: "font-semibold text-primary", children: [
47
+ /* @__PURE__ */ e("span", { className: "absolute inset-0", "aria-hidden": "true" }),
48
+ "Read more ",
49
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", children: "→" })
50
+ ] })
51
+ ] }) }),
52
+ /* @__PURE__ */ e("h1", { className: "text-4xl font-bold tracking-tight text-foreground sm:text-6xl bg-clip-text", children: o }),
53
+ r && /* @__PURE__ */ e("p", { className: "mt-6 text-lg leading-8 text-muted-foreground", children: r }),
54
+ /* @__PURE__ */ t("div", { className: "mt-10 flex items-center justify-center gap-x-6", children: [
55
+ l && /* @__PURE__ */ e("a", { href: a, children: /* @__PURE__ */ e(n, { size: "lg", effect: "expandIcon", children: l }) }),
56
+ i && /* @__PURE__ */ e("a", { href: c, children: /* @__PURE__ */ t(n, { variant: "ghost", size: "lg", children: [
57
+ i,
58
+ " ",
59
+ /* @__PURE__ */ e("span", { "aria-hidden": "true", children: "→" })
60
+ ] }) })
61
+ ] })
62
+ ] }),
63
+ /* @__PURE__ */ e(
64
+ "div",
65
+ {
66
+ className: "absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]",
67
+ "aria-hidden": "true",
68
+ children: /* @__PURE__ */ e(
69
+ "div",
70
+ {
71
+ className: "relative left-[calc(50%+3rem)] aspect-1155/678 w-144.5 -translate-x-1/2 bg-linear-to-tr from-[#ff80b5] to-[#9089fc] opacity-20 sm:left-[calc(50%+36rem)] sm:w-288.75",
72
+ style: {
73
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
74
+ }
75
+ }
76
+ )
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ )
82
+ );
83
+ x.displayName = "HeroSection";
84
+ export {
85
+ x as HeroSection
86
+ };
87
+ //# sourceMappingURL=hero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hero.js","sources":["../../../src/components/marketing/hero.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { CustomButton } from \"../primitives/custom-button\";\nimport { cn } from \"@/lib/utils\";\n\ninterface HeroSectionProps extends React.HTMLAttributes<HTMLElement> {\n title: string;\n subtitle?: string;\n ctaText?: string;\n ctaHref?: string;\n secondaryCtaText?: string;\n secondaryCtaHref?: string;\n badge?: string;\n}\n\nconst HeroSection = React.forwardRef<HTMLElement, HeroSectionProps>(\n (\n {\n title,\n subtitle,\n ctaText,\n ctaHref = \"#\",\n secondaryCtaText,\n secondaryCtaHref = \"#\",\n badge,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={cn(\n \"relative flex flex-col items-center justify-center overflow-hidden px-6 py-24 text-center sm:py-32 lg:px-8\",\n className,\n )}\n {...props}\n >\n {/* Abstract Background Decoration */}\n <div\n className=\"absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80\"\n aria-hidden=\"true\"\n >\n <div\n className=\"relative left-[calc(50%-11rem)] aspect-1155/678 w-144.5 -translate-x-1/2 rotate-30 bg-linear-to-tr from-[#ff80b5] to-[#9089fc] opacity-20 sm:left-[calc(50%-30rem)] sm:w-288.75\"\n style={{\n clipPath:\n \"polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)\",\n }}\n />\n </div>\n\n <div className=\"mx-auto max-w-2xl\">\n {badge && (\n <div className=\"mb-8 flex justify-center\">\n <div className=\"relative rounded-full px-3 py-1 text-sm leading-6 text-muted-foreground ring-1 ring-border hover:ring-border/80 transition-all\">\n {badge}{\" \"}\n <a href={ctaHref} className=\"font-semibold text-primary\">\n <span className=\"absolute inset-0\" aria-hidden=\"true\" />\n Read more <span aria-hidden=\"true\">&rarr;</span>\n </a>\n </div>\n </div>\n )}\n <h1 className=\"text-4xl font-bold tracking-tight text-foreground sm:text-6xl bg-clip-text\">\n {title}\n </h1>\n {subtitle && <p className=\"mt-6 text-lg leading-8 text-muted-foreground\">{subtitle}</p>}\n <div className=\"mt-10 flex items-center justify-center gap-x-6\">\n {ctaText && (\n <a href={ctaHref}>\n <CustomButton size=\"lg\" effect=\"expandIcon\">\n {ctaText}\n </CustomButton>\n </a>\n )}\n {secondaryCtaText && (\n <a href={secondaryCtaHref}>\n <CustomButton variant=\"ghost\" size=\"lg\">\n {secondaryCtaText} <span aria-hidden=\"true\">→</span>\n </CustomButton>\n </a>\n )}\n </div>\n </div>\n\n <div\n className=\"absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]\"\n aria-hidden=\"true\"\n >\n <div\n className=\"relative left-[calc(50%+3rem)] aspect-1155/678 w-144.5 -translate-x-1/2 bg-linear-to-tr from-[#ff80b5] to-[#9089fc] opacity-20 sm:left-[calc(50%+36rem)] sm:w-288.75\"\n style={{\n clipPath:\n \"polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)\",\n }}\n />\n </div>\n </section>\n );\n },\n);\n\nHeroSection.displayName = \"HeroSection\";\n\nexport { HeroSection };\n"],"names":["jsxs","jsx","React","CustomButton","cn","HeroSection","title","subtitle","ctaText","ctaHref","secondaryCtaText","secondaryCtaHref","badge","className","props","ref"],"mappings":"AAgBA,SAAA,QAAAA,GAAA,OAAAC,SAAA;AAAA,YAAAC,OAAA;AAAA,SAAA,gBAAAC,SAAA;AAAA,SAAA,MAAAC,SAAA;AAAA,MAAMC,IAAcH,EAAM;AAAA,EACxB,CACE;AAAA,IACE,OAAAI;AAAA,IACA,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,kBAAAC;AAAA,IACA,kBAAAC,IAAmB;AAAA,IACnB,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MAGE,gBAAAf;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAe;AAAA,MACA,WAAWX;AAAA,QACT;AAAA,QACAS;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAGJ,UAAA;AAAA,QAAA,gBAAAb;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA,YAEZ,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UACE;AAAA,gBAAA;AAAA,cACJ;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,QAGF,gBAAAD,EAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,UAAAY,uBACE,OAAA,EAAI,WAAU,4BACb,UAAA,gBAAAZ,EAAC,OAAA,EAAI,WAAU,kIACZ,UAAA;AAAA,YAAAY;AAAA,YAAO;AAAA,YACR,gBAAAZ,EAAC,KAAA,EAAE,MAAMS,GAAS,WAAU,8BAC1B,UAAA;AAAA,cAAA,gBAAAR,EAAC,QAAA,EAAK,WAAU,oBAAmB,eAAY,QAAO;AAAA,cAAE;AAAA,cAC9C,gBAAAA,EAAC,QAAA,EAAK,eAAY,QAAO,UAAA,IAAA,CAAM;AAAA,YAAA,EAAA,CAC3C;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,UAEF,gBAAAA,EAAC,MAAA,EAAG,WAAU,8EACX,UAAAK,GACH;AAAA,UACCC,KAAY,gBAAAN,EAAC,KAAA,EAAE,WAAU,gDAAgD,UAAAM,GAAS;AAAA,UACnF,gBAAAP,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAA;AAAA,YAAAQ,KACC,gBAAAP,EAAC,KAAA,EAAE,MAAMQ,GACP,UAAA,gBAAAR,EAACE,GAAA,EAAa,MAAK,MAAK,QAAO,cAC5B,UAAAK,EAAA,CACH,GACF;AAAA,YAEDE,KACC,gBAAAT,EAAC,KAAA,EAAE,MAAMU,GACP,4BAACR,GAAA,EAAa,SAAQ,SAAQ,MAAK,MAChC,UAAA;AAAA,cAAAO;AAAA,cAAiB;AAAA,cAAC,gBAAAT,EAAC,QAAA,EAAK,eAAY,QAAO,UAAA,IAAA,CAAC;AAAA,YAAA,EAAA,CAC/C,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,eAAY;AAAA,YAEZ,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,UACE;AAAA,gBAAA;AAAA,cACJ;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEAI,EAAY,cAAc;"}
@@ -0,0 +1,6 @@
1
+ export * from './hero';
2
+ export * from './social-proof';
3
+ export * from './value-props';
4
+ export type * from './hero';
5
+ export type * from './social-proof';
6
+ export type * from './value-props';
@@ -0,0 +1,10 @@
1
+ import * as React from "react";
2
+ interface SocialProofProps extends React.HTMLAttributes<HTMLElement> {
3
+ logos: {
4
+ name: string;
5
+ src: string;
6
+ }[];
7
+ title?: string;
8
+ }
9
+ declare const SocialProof: React.ForwardRefExoticComponent<SocialProofProps & React.RefAttributes<HTMLElement>>;
10
+ export { SocialProof };
@@ -0,0 +1,21 @@
1
+ import { jsx as e, jsxs as m } from "react/jsx-runtime";
2
+ import * as i from "react";
3
+ import { cn as c } from "../../lib/utils.js";
4
+ const n = i.forwardRef(
5
+ ({ logos: t, title: r = "Trusted by the world's most innovative teams", className: s, ...o }, l) => /* @__PURE__ */ e("section", { ref: l, className: c("py-24 sm:py-32 bg-secondary/30", s), ...o, children: /* @__PURE__ */ m("div", { className: "mx-auto max-w-7xl px-6 lg:px-8", children: [
6
+ /* @__PURE__ */ e("h2", { className: "text-center text-lg font-semibold leading-8 text-muted-foreground", children: r }),
7
+ /* @__PURE__ */ e("div", { className: "mx-auto mt-10 grid max-w-lg grid-cols-4 items-center gap-x-8 gap-y-10 sm:max-w-xl sm:grid-cols-6 sm:gap-x-10 lg:mx-0 lg:max-w-none lg:grid-cols-5", children: t.map((a) => /* @__PURE__ */ e(
8
+ "div",
9
+ {
10
+ className: "flex items-center justify-center grayscale opacity-50 hover:grayscale-0 hover:opacity-100 transition-all duration-300",
11
+ children: /* @__PURE__ */ e("span", { className: "text-xl font-bold italic text-muted-foreground", children: a.name })
12
+ },
13
+ a.name
14
+ )) })
15
+ ] }) })
16
+ );
17
+ n.displayName = "SocialProof";
18
+ export {
19
+ n as SocialProof
20
+ };
21
+ //# sourceMappingURL=social-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-proof.js","sources":["../../../src/components/marketing/social-proof.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\ninterface SocialProofProps extends React.HTMLAttributes<HTMLElement> {\n logos: { name: string; src: string }[];\n title?: string;\n}\n\nconst SocialProof = React.forwardRef<HTMLElement, SocialProofProps>(\n ({ logos, title = \"Trusted by the world's most innovative teams\", className, ...props }, ref) => {\n return (\n <section ref={ref} className={cn(\"py-24 sm:py-32 bg-secondary/30\", className)} {...props}>\n <div className=\"mx-auto max-w-7xl px-6 lg:px-8\">\n <h2 className=\"text-center text-lg font-semibold leading-8 text-muted-foreground\">\n {title}\n </h2>\n <div className=\"mx-auto mt-10 grid max-w-lg grid-cols-4 items-center gap-x-8 gap-y-10 sm:max-w-xl sm:grid-cols-6 sm:gap-x-10 lg:mx-0 lg:max-w-none lg:grid-cols-5\">\n {logos.map((logo) => (\n <div\n key={logo.name}\n className=\"flex items-center justify-center grayscale opacity-50 hover:grayscale-0 hover:opacity-100 transition-all duration-300\"\n >\n <span className=\"text-xl font-bold italic text-muted-foreground\">{logo.name}</span>\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n },\n);\n\nSocialProof.displayName = \"SocialProof\";\n\nexport { SocialProof };\n"],"names":["jsx","jsxs","React","cn","SocialProof","logos","title","className","props","ref","logo"],"mappings":"AAUA,SAAA,OAAAA,GAAA,QAAAC,SAAA;AAAA,YAAAC,OAAA;AAAA,SAAA,MAAAC,SAAA;AAAA,MAAMC,IAAcF,EAAM;AAAA,EACxB,CAAC,EAAE,OAAAG,GAAO,OAAAC,IAAQ,gDAAgD,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAErF,gBAAAT,EAAC,WAAA,EAAQ,KAAAS,GAAU,WAAWN,EAAG,kCAAkCI,CAAS,GAAI,GAAGC,GACjF,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,IAAA,gBAAAD,EAAC,MAAA,EAAG,WAAU,qEACX,UAAAM,GACH;AAAA,sBACC,OAAA,EAAI,WAAU,qJACZ,UAAAD,EAAM,IAAI,CAACK,MACV,gBAAAV;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QAEV,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,kDAAkD,YAAK,KAAA,CAAK;AAAA,MAAA;AAAA,MAHvEU,EAAK;AAAA,IAAA,CAKb,EAAA,CACH;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAGN;AAEAN,EAAY,cAAc;"}
@@ -0,0 +1,14 @@
1
+ import * as React from "react";
2
+ interface Feature {
3
+ name: string;
4
+ description: string;
5
+ icon?: React.ElementType;
6
+ }
7
+ interface ValuePropsProps extends React.HTMLAttributes<HTMLElement> {
8
+ features: Feature[];
9
+ title: string;
10
+ subtitle?: string;
11
+ badge?: string;
12
+ }
13
+ declare const ValueProps: React.ForwardRefExoticComponent<ValuePropsProps & React.RefAttributes<HTMLElement>>;
14
+ export { ValueProps };
@@ -0,0 +1,25 @@
1
+ import { jsx as e, jsxs as l } from "react/jsx-runtime";
2
+ import * as x from "react";
3
+ import { cn as c } from "../../lib/utils.js";
4
+ import { CheckIcon as d } from "lucide-react";
5
+ const p = x.forwardRef(
6
+ ({ features: s, title: r, subtitle: t, badge: m, className: i, ...n }, o) => /* @__PURE__ */ e("section", { ref: o, className: c("py-24 sm:py-32", i), ...n, children: /* @__PURE__ */ l("div", { className: "mx-auto max-w-7xl px-6 lg:px-8", children: [
7
+ /* @__PURE__ */ l("div", { className: "mx-auto max-w-2xl lg:text-center", children: [
8
+ m && /* @__PURE__ */ e("h2", { className: "text-base font-semibold leading-7 text-primary", children: m }),
9
+ /* @__PURE__ */ e("p", { className: "mt-2 text-3xl font-bold tracking-tight text-foreground sm:text-4xl", children: r }),
10
+ t && /* @__PURE__ */ e("p", { className: "mt-6 text-lg leading-8 text-muted-foreground", children: t })
11
+ ] }),
12
+ /* @__PURE__ */ e("div", { className: "mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none", children: /* @__PURE__ */ e("dl", { className: "grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-3", children: s.map((a) => /* @__PURE__ */ l("div", { className: "flex flex-col", children: [
13
+ /* @__PURE__ */ l("dt", { className: "flex items-center gap-x-3 text-base font-semibold leading-7 text-foreground", children: [
14
+ a.icon ? /* @__PURE__ */ e(a.icon, { className: "size-5 flex-none text-primary", "aria-hidden": "true" }) : /* @__PURE__ */ e(d, { className: "size-5 flex-none text-primary", "aria-hidden": "true" }),
15
+ a.name
16
+ ] }),
17
+ /* @__PURE__ */ e("dd", { className: "mt-4 flex flex-auto flex-col text-base leading-7 text-muted-foreground", children: /* @__PURE__ */ e("p", { className: "flex-auto", children: a.description }) })
18
+ ] }, a.name)) }) })
19
+ ] }) })
20
+ );
21
+ p.displayName = "ValueProps";
22
+ export {
23
+ p as ValueProps
24
+ };
25
+ //# sourceMappingURL=value-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-props.js","sources":["../../../src/components/marketing/value-props.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { CheckIcon } from \"lucide-react\";\n\ninterface Feature {\n name: string;\n description: string;\n icon?: React.ElementType;\n}\n\ninterface ValuePropsProps extends React.HTMLAttributes<HTMLElement> {\n features: Feature[];\n title: string;\n subtitle?: string;\n badge?: string;\n}\n\nconst ValueProps = React.forwardRef<HTMLElement, ValuePropsProps>(\n ({ features, title, subtitle, badge, className, ...props }, ref) => {\n return (\n <section ref={ref} className={cn(\"py-24 sm:py-32\", className)} {...props}>\n <div className=\"mx-auto max-w-7xl px-6 lg:px-8\">\n <div className=\"mx-auto max-w-2xl lg:text-center\">\n {badge && <h2 className=\"text-base font-semibold leading-7 text-primary\">{badge}</h2>}\n <p className=\"mt-2 text-3xl font-bold tracking-tight text-foreground sm:text-4xl\">\n {title}\n </p>\n {subtitle && <p className=\"mt-6 text-lg leading-8 text-muted-foreground\">{subtitle}</p>}\n </div>\n <div className=\"mx-auto mt-16 max-w-2xl sm:mt-20 lg:mt-24 lg:max-w-none\">\n <dl className=\"grid max-w-xl grid-cols-1 gap-x-8 gap-y-16 lg:max-w-none lg:grid-cols-3\">\n {features.map((feature) => (\n <div key={feature.name} className=\"flex flex-col\">\n <dt className=\"flex items-center gap-x-3 text-base font-semibold leading-7 text-foreground\">\n {feature.icon ? (\n <feature.icon className=\"size-5 flex-none text-primary\" aria-hidden=\"true\" />\n ) : (\n <CheckIcon className=\"size-5 flex-none text-primary\" aria-hidden=\"true\" />\n )}\n {feature.name}\n </dt>\n <dd className=\"mt-4 flex flex-auto flex-col text-base leading-7 text-muted-foreground\">\n <p className=\"flex-auto\">{feature.description}</p>\n </dd>\n </div>\n ))}\n </dl>\n </div>\n </div>\n </section>\n );\n },\n);\n\nValueProps.displayName = \"ValueProps\";\n\nexport { ValueProps };\n"],"names":["jsx","jsxs","React","cn","CheckIcon","ValueProps","features","title","subtitle","badge","className","props","ref","feature"],"mappings":"AAmBA,SAAA,OAAAA,GAAA,QAAAC,SAAA;AAAA,YAAAC,OAAA;AAAA,SAAA,MAAAC,SAAA;AAAA,SAAA,aAAAC,SAAA;AAAA,MAAMC,IAAaH,EAAM;AAAA,EACvB,CAAC,EAAE,UAAAI,GAAU,OAAAC,GAAO,UAAAC,GAAU,OAAAC,GAAO,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAExD,gBAAAZ,EAAC,WAAA,EAAQ,KAAAY,GAAU,WAAWT,EAAG,kBAAkBO,CAAS,GAAI,GAAGC,GACjE,UAAA,gBAAAV,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oCACZ,UAAA;AAAA,MAAAQ,KAAS,gBAAAT,EAAC,MAAA,EAAG,WAAU,kDAAkD,UAAAS,GAAM;AAAA,MAChF,gBAAAT,EAAC,KAAA,EAAE,WAAU,sEACV,UAAAO,GACH;AAAA,MACCC,KAAY,gBAAAR,EAAC,KAAA,EAAE,WAAU,gDAAgD,UAAAQ,EAAA,CAAS;AAAA,IAAA,GACrF;AAAA,IACA,gBAAAR,EAAC,OAAA,EAAI,WAAU,2DACb,4BAAC,MAAA,EAAG,WAAU,2EACX,UAAAM,EAAS,IAAI,CAACO,MACb,gBAAAZ,EAAC,OAAA,EAAuB,WAAU,iBAChC,UAAA;AAAA,MAAA,gBAAAA,EAAC,MAAA,EAAG,WAAU,+EACX,UAAA;AAAA,QAAAY,EAAQ,OACP,gBAAAb,EAACa,EAAQ,MAAR,EAAa,WAAU,iCAAgC,eAAY,OAAA,CAAO,IAE3E,gBAAAb,EAACI,GAAA,EAAU,WAAU,iCAAgC,eAAY,QAAO;AAAA,QAEzES,EAAQ;AAAA,MAAA,GACX;AAAA,MACA,gBAAAb,EAAC,MAAA,EAAG,WAAU,0EACZ,UAAA,gBAAAA,EAAC,OAAE,WAAU,aAAa,UAAAa,EAAQ,YAAA,CAAY,EAAA,CAChD;AAAA,IAAA,EAAA,GAXQA,EAAQ,IAYlB,CACD,EAAA,CACH,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAGN;AAEAR,EAAW,cAAc;"}