@hanzo/ui 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/dist/accordion.js +1 -0
  2. package/dist/accordion.mjs +1 -0
  3. package/dist/alert-dialog.js +1 -0
  4. package/dist/alert-dialog.mjs +1 -0
  5. package/dist/alert.js +1 -0
  6. package/dist/alert.mjs +1 -0
  7. package/dist/avatar.js +1 -0
  8. package/dist/avatar.mjs +1 -0
  9. package/dist/badge.js +1 -0
  10. package/dist/badge.mjs +1 -0
  11. package/dist/breadcrumb.js +1 -0
  12. package/dist/breadcrumb.mjs +1 -0
  13. package/dist/calendar.js +1 -0
  14. package/dist/calendar.mjs +1 -0
  15. package/dist/carousel.js +1 -0
  16. package/dist/carousel.mjs +1 -0
  17. package/dist/checkbox.js +1 -0
  18. package/dist/checkbox.mjs +1 -0
  19. package/dist/chunk-3H5S2OQ3.mjs +1 -0
  20. package/dist/chunk-5GRJ7UQX.js +1 -0
  21. package/dist/chunk-63HNMH7C.js +1 -0
  22. package/dist/chunk-72TOQ4DM.mjs +1 -0
  23. package/dist/chunk-7AEFTV5R.mjs +1 -0
  24. package/dist/chunk-7M4AVV2R.js +1 -0
  25. package/dist/chunk-DKPVJSBC.js +1 -0
  26. package/dist/chunk-EI7MMDWY.js +1 -0
  27. package/dist/chunk-GANGDIZG.mjs +1 -0
  28. package/dist/chunk-GRGT2Z4K.js +1 -0
  29. package/dist/chunk-JCUUC6NY.mjs +1 -0
  30. package/dist/chunk-JUQMWLIN.js +1 -0
  31. package/dist/chunk-PRVEIITE.js +1 -0
  32. package/dist/chunk-SH52AKNZ.js +1 -0
  33. package/dist/chunk-TU67EJEW.mjs +1 -0
  34. package/dist/chunk-WN5KN73U.mjs +1 -0
  35. package/dist/chunk-YSXGDEY5.mjs +1 -0
  36. package/dist/chunk-Z76OOVUE.mjs +1 -0
  37. package/dist/collapsible.js +1 -0
  38. package/dist/collapsible.mjs +1 -0
  39. package/dist/command.js +1 -0
  40. package/dist/command.mjs +1 -0
  41. package/dist/context-menu.js +1 -0
  42. package/dist/context-menu.mjs +1 -0
  43. package/dist/dialog.js +1 -0
  44. package/dist/dialog.mjs +1 -0
  45. package/dist/drawer.js +1 -0
  46. package/dist/drawer.mjs +1 -0
  47. package/dist/dropdown-menu.js +1 -0
  48. package/dist/dropdown-menu.mjs +1 -0
  49. package/dist/form.js +1 -0
  50. package/dist/form.mjs +1 -0
  51. package/dist/hover-card.js +1 -0
  52. package/dist/hover-card.mjs +1 -0
  53. package/dist/index.js +1 -9079
  54. package/dist/index.mjs +1 -8700
  55. package/dist/input-otp.js +1 -0
  56. package/dist/input-otp.mjs +1 -0
  57. package/dist/lib/utils.js +1 -0
  58. package/dist/lib/utils.mjs +1 -0
  59. package/dist/navigation-menu.js +1 -0
  60. package/dist/navigation-menu.mjs +1 -0
  61. package/dist/popover.js +1 -0
  62. package/dist/popover.mjs +1 -0
  63. package/dist/progress.js +1 -0
  64. package/dist/progress.mjs +1 -0
  65. package/dist/radio-group.js +1 -0
  66. package/dist/radio-group.mjs +1 -0
  67. package/dist/resizable.js +1 -0
  68. package/dist/resizable.mjs +1 -0
  69. package/dist/scroll-area.js +1 -0
  70. package/dist/scroll-area.mjs +1 -0
  71. package/dist/select.js +1 -0
  72. package/dist/select.mjs +1 -0
  73. package/dist/separator.js +1 -0
  74. package/dist/separator.mjs +1 -0
  75. package/dist/sheet.js +1 -0
  76. package/dist/sheet.mjs +1 -0
  77. package/dist/skeleton.js +1 -0
  78. package/dist/skeleton.mjs +1 -0
  79. package/dist/slider.js +1 -0
  80. package/dist/slider.mjs +1 -0
  81. package/dist/sonner.js +1 -0
  82. package/dist/sonner.mjs +1 -0
  83. package/dist/src/utils.js +1 -0
  84. package/dist/src/utils.mjs +1 -0
  85. package/dist/switch.js +1 -0
  86. package/dist/switch.mjs +1 -0
  87. package/dist/table.js +1 -0
  88. package/dist/table.mjs +1 -0
  89. package/dist/tabs.js +1 -0
  90. package/dist/tabs.mjs +1 -0
  91. package/dist/tailwind/index.js +1 -0
  92. package/dist/tailwind/index.mjs +1 -0
  93. package/dist/textarea.js +1 -0
  94. package/dist/textarea.mjs +1 -0
  95. package/dist/toggle-group.js +1 -0
  96. package/dist/toggle-group.mjs +1 -0
  97. package/dist/toggle.js +1 -0
  98. package/dist/toggle.mjs +1 -0
  99. package/dist/tooltip.js +1 -0
  100. package/dist/tooltip.mjs +1 -0
  101. package/dist/types/index.js +1 -0
  102. package/dist/types/index.mjs +1 -0
  103. package/package.json +110 -81
  104. package/assets/ai-icons.tsx +0 -207
  105. package/assets/crypto.tsx +0 -33
  106. package/assets/file-type-icon.tsx +0 -66
  107. package/assets/file.tsx +0 -45
  108. package/assets/general.tsx +0 -2318
  109. package/assets/hanzo-logo.svg +0 -9
  110. package/assets/hanzo-logo.tsx +0 -17
  111. package/assets/index.ts +0 -122
  112. package/assets/index.tsx +0 -4
  113. package/assets/llm-provider.tsx +0 -1094
  114. package/blocks/auth/index.ts +0 -6
  115. package/blocks/auth/login-2fa.tsx +0 -165
  116. package/blocks/auth/login-basic.tsx +0 -94
  117. package/blocks/auth/login-social.tsx +0 -148
  118. package/blocks/auth/magic-link.tsx +0 -129
  119. package/blocks/auth/password-reset.tsx +0 -97
  120. package/blocks/auth/signup.tsx +0 -157
  121. package/blocks/components/accordian-block.tsx +0 -48
  122. package/blocks/components/block-component-props.ts +0 -11
  123. package/blocks/components/bullet-cards-block.tsx +0 -46
  124. package/blocks/components/card-block/index.tsx +0 -171
  125. package/blocks/components/card-block/link-out-button.tsx +0 -20
  126. package/blocks/components/card-block/util.ts +0 -28
  127. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  128. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  129. package/blocks/components/content.tsx +0 -70
  130. package/blocks/components/cta-block.tsx +0 -115
  131. package/blocks/components/enh-heading-block.tsx +0 -204
  132. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  133. package/blocks/components/grid-block/index.tsx +0 -83
  134. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  135. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  136. package/blocks/components/group-block.tsx +0 -83
  137. package/blocks/components/heading-block.tsx +0 -88
  138. package/blocks/components/image-block.tsx +0 -111
  139. package/blocks/components/index.ts +0 -30
  140. package/blocks/components/screenful-block/content.tsx +0 -123
  141. package/blocks/components/screenful-block/index.tsx +0 -107
  142. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  143. package/blocks/components/screenful-block/video-background.tsx +0 -45
  144. package/blocks/components/space-block.tsx +0 -66
  145. package/blocks/components/video-block.tsx +0 -138
  146. package/blocks/data-display/activity-feed.tsx +0 -242
  147. package/blocks/data-display/data-table.tsx +0 -235
  148. package/blocks/data-display/stats-grid.tsx +0 -194
  149. package/blocks/def/accordian-block.ts +0 -14
  150. package/blocks/def/block.ts +0 -7
  151. package/blocks/def/bullet-cards-block.ts +0 -22
  152. package/blocks/def/card-block.ts +0 -22
  153. package/blocks/def/carte-blanche-block.ts +0 -21
  154. package/blocks/def/cta-block.ts +0 -19
  155. package/blocks/def/element-block.ts +0 -11
  156. package/blocks/def/enh-heading-block.ts +0 -44
  157. package/blocks/def/grid-block.ts +0 -16
  158. package/blocks/def/group-block.ts +0 -11
  159. package/blocks/def/heading-block.ts +0 -15
  160. package/blocks/def/image-block.ts +0 -31
  161. package/blocks/def/index.ts +0 -35
  162. package/blocks/def/screenful-block.ts +0 -54
  163. package/blocks/def/space-block.ts +0 -64
  164. package/blocks/def/video-block.ts +0 -9
  165. package/blocks/ecommerce/checkout.tsx +0 -242
  166. package/blocks/ecommerce/index.ts +0 -7
  167. package/blocks/ecommerce/product-detail.tsx +0 -257
  168. package/blocks/ecommerce/product-grid.tsx +0 -148
  169. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  170. package/blocks/index.ts +0 -2
  171. package/blocks/marketing/cta-section.tsx +0 -207
  172. package/blocks/marketing/faq.tsx +0 -159
  173. package/blocks/marketing/features-grid.tsx +0 -156
  174. package/blocks/marketing/hero-section.tsx +0 -192
  175. package/blocks/marketing/index.ts +0 -6
  176. package/blocks/marketing/pricing-table.tsx +0 -121
  177. package/blocks/marketing/testimonials.tsx +0 -196
  178. package/components/index.ts +0 -9
  179. package/dist/index.js.map +0 -1
  180. package/dist/index.mjs.map +0 -1
  181. package/dist/tailwind.js +0 -2025
  182. package/dist/tailwind.js.map +0 -1
  183. package/dist/tailwind.mjs +0 -2013
  184. package/dist/tailwind.mjs.map +0 -1
  185. package/dist/types.js +0 -59
  186. package/dist/types.js.map +0 -1
  187. package/dist/types.mjs +0 -53
  188. package/dist/types.mjs.map +0 -1
  189. package/dist/utils.js +0 -30
  190. package/dist/utils.js.map +0 -1
  191. package/dist/utils.mjs +0 -26
  192. package/dist/utils.mjs.map +0 -1
  193. package/frameworks/core/index.ts +0 -6
  194. package/frameworks/core/utils/index.ts +0 -64
  195. package/frameworks/react/components/button.tsx +0 -26
  196. package/frameworks/react/components/index.ts +0 -5
  197. package/frameworks/react/hooks/index.ts +0 -5
  198. package/frameworks/react/index.ts +0 -9
  199. package/frameworks/react/package.json +0 -8
  200. package/frameworks/react/utils/index.ts +0 -2
  201. package/frameworks/react-native/index.ts +0 -9
  202. package/frameworks/react-native/package.json +0 -8
  203. package/frameworks/registry.json +0 -371
  204. package/frameworks/setup.sh +0 -69
  205. package/frameworks/svelte/index.ts +0 -9
  206. package/frameworks/svelte/package.json +0 -8
  207. package/frameworks/tracker.json +0 -1854
  208. package/frameworks/vue/index.ts +0 -9
  209. package/frameworks/vue/package.json +0 -8
  210. package/helpers/file.ts +0 -33
  211. package/helpers/memoization.ts +0 -40
  212. package/primitives/accordion.tsx +0 -74
  213. package/primitives/action-button.tsx +0 -42
  214. package/primitives/alert-dialog.tsx +0 -185
  215. package/primitives/alert.tsx +0 -74
  216. package/primitives/apply-typography.tsx +0 -55
  217. package/primitives/aspect-ratio.tsx +0 -5
  218. package/primitives/avatar.tsx +0 -57
  219. package/primitives/background-beams.tsx +0 -142
  220. package/primitives/badge.tsx +0 -45
  221. package/primitives/breadcrumb.tsx +0 -130
  222. package/primitives/breakpoint-indicator.tsx +0 -19
  223. package/primitives/button.tsx +0 -72
  224. package/primitives/calendar.tsx +0 -72
  225. package/primitives/card.tsx +0 -97
  226. package/primitives/carousel.tsx +0 -238
  227. package/primitives/chat/chat-input-area.tsx +0 -88
  228. package/primitives/chat/chat-input.tsx +0 -71
  229. package/primitives/chat/files-preview.tsx +0 -331
  230. package/primitives/chat/index.ts +0 -6
  231. package/primitives/chat/json-form.tsx +0 -8
  232. package/primitives/chat/message-list.tsx +0 -308
  233. package/primitives/chat/message.tsx +0 -569
  234. package/primitives/chat/sqlite-preview.tsx +0 -215
  235. package/primitives/checkbox.tsx +0 -32
  236. package/primitives/collapsible.tsx +0 -9
  237. package/primitives/combobox.tsx +0 -239
  238. package/primitives/command.tsx +0 -151
  239. package/primitives/context-menu.tsx +0 -206
  240. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  241. package/primitives/dialog-video-controller.tsx +0 -38
  242. package/primitives/dialog.tsx +0 -128
  243. package/primitives/dot-pattern.tsx +0 -57
  244. package/primitives/dots-loader.tsx +0 -13
  245. package/primitives/drawer.tsx +0 -113
  246. package/primitives/dropdown-menu.tsx +0 -199
  247. package/primitives/error-message.tsx +0 -19
  248. package/primitives/file-uploader.tsx +0 -203
  249. package/primitives/form.tsx +0 -185
  250. package/primitives/hover-card.tsx +0 -28
  251. package/primitives/icons/github.tsx +0 -14
  252. package/primitives/icons/index.ts +0 -18
  253. package/primitives/icons/youtube-logo.tsx +0 -59
  254. package/primitives/index-client.ts +0 -4
  255. package/primitives/index-common.ts +0 -304
  256. package/primitives/index-next.ts +0 -4
  257. package/primitives/input-otp.tsx +0 -65
  258. package/primitives/input.tsx +0 -128
  259. package/primitives/label.tsx +0 -21
  260. package/primitives/list-adaptor.ts +0 -12
  261. package/primitives/list-box.tsx +0 -74
  262. package/primitives/loading-spinner.tsx +0 -33
  263. package/primitives/markdown-preview.tsx +0 -612
  264. package/primitives/mermaid.tsx +0 -196
  265. package/primitives/navigation-menu.tsx +0 -147
  266. package/primitives/next/image.tsx +0 -91
  267. package/primitives/next/index.ts +0 -7
  268. package/primitives/next/inline-icon.tsx +0 -36
  269. package/primitives/next/link-element.tsx +0 -109
  270. package/primitives/next/mdx-link.tsx +0 -22
  271. package/primitives/next/media-stack.tsx +0 -52
  272. package/primitives/next/nav-items.tsx +0 -45
  273. package/primitives/next/youtube-embed.tsx +0 -83
  274. package/primitives/pagination.tsx +0 -117
  275. package/primitives/popover.tsx +0 -34
  276. package/primitives/pretty-json-print.tsx +0 -28
  277. package/primitives/progress.tsx +0 -27
  278. package/primitives/prompt-textarea.tsx +0 -72
  279. package/primitives/qr-code.tsx +0 -112
  280. package/primitives/radio-group.tsx +0 -42
  281. package/primitives/resizable.tsx +0 -47
  282. package/primitives/scroll-area.tsx +0 -57
  283. package/primitives/search-input.tsx +0 -66
  284. package/primitives/select.tsx +0 -122
  285. package/primitives/separator.tsx +0 -26
  286. package/primitives/sheet.tsx +0 -139
  287. package/primitives/skeleton.tsx +0 -18
  288. package/primitives/slider.tsx +0 -63
  289. package/primitives/sonner.tsx +0 -35
  290. package/primitives/step-indicator.tsx +0 -69
  291. package/primitives/stepper.tsx +0 -272
  292. package/primitives/switch.tsx +0 -27
  293. package/primitives/table.tsx +0 -105
  294. package/primitives/tabs.tsx +0 -50
  295. package/primitives/text-area.tsx +0 -26
  296. package/primitives/text-link.tsx +0 -27
  297. package/primitives/textarea.tsx +0 -64
  298. package/primitives/textfield.tsx +0 -78
  299. package/primitives/toast.tsx +0 -30
  300. package/primitives/toggle-group.tsx +0 -63
  301. package/primitives/toggle.tsx +0 -44
  302. package/primitives/tooltip.tsx +0 -47
  303. package/primitives/video-player.tsx +0 -23
  304. package/src/button.ts +0 -1
  305. package/src/hooks/index.ts +0 -7
  306. package/src/hooks/use-click-away.ts +0 -31
  307. package/src/hooks/use-combined-refs.ts +0 -22
  308. package/src/hooks/use-copy-clipboard.ts +0 -30
  309. package/src/hooks/use-debounce.ts +0 -17
  310. package/src/hooks/use-fill-ids.ts +0 -25
  311. package/src/hooks/use-map.ts +0 -26
  312. package/src/hooks/use-measure.ts +0 -42
  313. package/src/hooks/use-reverse-video-playback.ts +0 -43
  314. package/src/hooks/use-scroll-restoration.ts +0 -50
  315. package/src/index-lean.ts +0 -87
  316. package/src/index.ts +0 -54
  317. package/src/mcp/README.md +0 -141
  318. package/src/mcp/enhanced-server.ts +0 -1208
  319. package/src/mcp/index.ts +0 -518
  320. package/src/mcp/package.json +0 -10
  321. package/src/registry/api.ts +0 -164
  322. package/src/registry/index.ts +0 -60
  323. package/src/registry/package.json +0 -10
  324. package/src/utils.ts +0 -19
  325. package/tailwind/colors.tailwind.js +0 -53
  326. package/tailwind/fontFamily.tailwind.ts +0 -7
  327. package/tailwind/fontSize.tailwind.ts +0 -13
  328. package/tailwind/index.ts +0 -7
  329. package/tailwind/safelist.tailwind.js +0 -26
  330. package/tailwind/screens.tailwind.js +0 -8
  331. package/tailwind/spacing.tailwind.js +0 -65
  332. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  333. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  334. package/tailwind/tw-font-desc.ts +0 -15
  335. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  336. package/tailwind/typo-plugin/index.d.ts +0 -9
  337. package/tailwind/typo-plugin/index.js +0 -141
  338. package/tailwind/typo-plugin/utils.js +0 -60
  339. package/tailwind/typography-test.mdx +0 -35
  340. package/tailwind/z-index.tailwind.js +0 -71
  341. package/types/animation-def.ts +0 -3
  342. package/types/breakpoints.ts +0 -11
  343. package/types/bullet-item.ts +0 -10
  344. package/types/button-def.ts +0 -39
  345. package/types/dimensions.ts +0 -8
  346. package/types/grid-def.ts +0 -56
  347. package/types/image-def.ts +0 -32
  348. package/types/index.ts +0 -30
  349. package/types/link-def.ts +0 -56
  350. package/types/media-stack-def.ts +0 -31
  351. package/types/t-shirt-size.ts +0 -5
  352. package/types/tshirt-dimensions.ts +0 -20
  353. package/types/video-def.ts +0 -25
  354. package/util/blob.ts +0 -33
  355. package/util/copy-to-clipboard.ts +0 -17
  356. package/util/create-shadow-root.ts +0 -22
  357. package/util/date.ts +0 -84
  358. package/util/debounce.ts +0 -11
  359. package/util/file.ts +0 -15
  360. package/util/format-and-abbreviate-as-currency.ts +0 -125
  361. package/util/format-text.ts +0 -34
  362. package/util/format-to-max-char.ts +0 -68
  363. package/util/index-client.ts +0 -3
  364. package/util/index.ts +0 -112
  365. package/util/number-abbreviate.ts +0 -49
  366. package/util/specifier.ts +0 -43
  367. package/util/spread-to-transform.ts +0 -25
  368. package/util/step-animation.ts +0 -90
  369. package/util/timing.ts +0 -3
  370. package/util/toasts.tsx +0 -17
  371. package/util/two-way-map.ts +0 -19
@@ -1,156 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@hanzo/ui/primitives'
5
- import type { LucideIcon } from 'lucide-react'
6
-
7
- interface Feature {
8
- icon?: LucideIcon
9
- title: string
10
- description: string
11
- href?: string
12
- }
13
-
14
- interface FeaturesGridProps extends React.ComponentPropsWithoutRef<'section'> {
15
- title?: string
16
- subtitle?: string
17
- description?: string
18
- features: Feature[]
19
- columns?: 2 | 3 | 4
20
- variant?: 'default' | 'cards' | 'minimal'
21
- }
22
-
23
- export function FeaturesGrid({
24
- className,
25
- title,
26
- subtitle,
27
- description,
28
- features,
29
- columns = 3,
30
- variant = 'default',
31
- ...props
32
- }: FeaturesGridProps) {
33
- const gridCols = {
34
- 2: 'md:grid-cols-2',
35
- 3: 'md:grid-cols-2 lg:grid-cols-3',
36
- 4: 'md:grid-cols-2 lg:grid-cols-4',
37
- }[columns]
38
-
39
- return (
40
- <section className={cn('py-24 sm:py-32', className)} {...props}>
41
- <div className="container">
42
- {(title || subtitle || description) && (
43
- <div className="mx-auto max-w-3xl text-center">
44
- {subtitle && (
45
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
46
- {subtitle}
47
- </p>
48
- )}
49
- {title && (
50
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
51
- {title}
52
- </h2>
53
- )}
54
- {description && (
55
- <p className="mt-4 text-lg text-muted-foreground">
56
- {description}
57
- </p>
58
- )}
59
- </div>
60
- )}
61
-
62
- {variant === 'cards' && (
63
- <div className={cn('mt-16 grid gap-6', gridCols)}>
64
- {features.map((feature, i) => {
65
- const Icon = feature.icon
66
- return (
67
- <Card key={i} className="relative">
68
- {feature.href && (
69
- <a
70
- href={feature.href}
71
- className="absolute inset-0 z-10"
72
- aria-label={feature.title}
73
- />
74
- )}
75
- <CardHeader>
76
- {Icon && (
77
- <div className="mb-2 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
78
- <Icon className="h-5 w-5 text-primary" />
79
- </div>
80
- )}
81
- <CardTitle>{feature.title}</CardTitle>
82
- </CardHeader>
83
- <CardContent>
84
- <CardDescription>{feature.description}</CardDescription>
85
- </CardContent>
86
- </Card>
87
- )
88
- })}
89
- </div>
90
- )}
91
-
92
- {variant === 'minimal' && (
93
- <div className={cn('mt-16 grid gap-x-8 gap-y-10', gridCols)}>
94
- {features.map((feature, i) => {
95
- const Icon = feature.icon
96
- return (
97
- <div key={i} className="relative">
98
- {feature.href && (
99
- <a
100
- href={feature.href}
101
- className="absolute inset-0 z-10"
102
- aria-label={feature.title}
103
- />
104
- )}
105
- <div className="flex items-start gap-4">
106
- {Icon && (
107
- <div className="flex-shrink-0">
108
- <div className="inline-flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
109
- <Icon className="h-5 w-5 text-primary" />
110
- </div>
111
- </div>
112
- )}
113
- <div>
114
- <h3 className="font-semibold">{feature.title}</h3>
115
- <p className="mt-2 text-sm text-muted-foreground">
116
- {feature.description}
117
- </p>
118
- </div>
119
- </div>
120
- </div>
121
- )
122
- })}
123
- </div>
124
- )}
125
-
126
- {variant === 'default' && (
127
- <div className={cn('mt-16 grid gap-8', gridCols)}>
128
- {features.map((feature, i) => {
129
- const Icon = feature.icon
130
- return (
131
- <div key={i} className="relative text-center">
132
- {feature.href && (
133
- <a
134
- href={feature.href}
135
- className="absolute inset-0 z-10"
136
- aria-label={feature.title}
137
- />
138
- )}
139
- {Icon && (
140
- <div className="mx-auto mb-4 inline-flex h-12 w-12 items-center justify-center rounded-lg bg-primary/10">
141
- <Icon className="h-6 w-6 text-primary" />
142
- </div>
143
- )}
144
- <h3 className="mb-2 text-lg font-semibold">{feature.title}</h3>
145
- <p className="text-sm text-muted-foreground">
146
- {feature.description}
147
- </p>
148
- </div>
149
- )
150
- })}
151
- </div>
152
- )}
153
- </div>
154
- </section>
155
- )
156
- }
@@ -1,192 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
-
6
- interface HeroSectionProps extends React.ComponentPropsWithoutRef<'section'> {
7
- title: string
8
- subtitle?: string
9
- description?: string
10
- primaryAction?: {
11
- label: string
12
- onClick: () => void
13
- }
14
- secondaryAction?: {
15
- label: string
16
- onClick: () => void
17
- }
18
- backgroundImage?: string
19
- variant?: 'default' | 'centered' | 'split'
20
- }
21
-
22
- export function HeroSection({
23
- className,
24
- title,
25
- subtitle,
26
- description,
27
- primaryAction,
28
- secondaryAction,
29
- backgroundImage,
30
- variant = 'default',
31
- ...props
32
- }: HeroSectionProps) {
33
- if (variant === 'centered') {
34
- return (
35
- <section
36
- className={cn('relative py-24 sm:py-32', className)}
37
- style={{
38
- backgroundImage: backgroundImage ? `url(${backgroundImage})` : undefined,
39
- }}
40
- {...props}
41
- >
42
- {backgroundImage && (
43
- <div className="absolute inset-0 bg-gradient-to-t from-background/90 to-background/20" />
44
- )}
45
- <div className="container relative">
46
- <div className="mx-auto max-w-3xl text-center">
47
- {subtitle && (
48
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
49
- {subtitle}
50
- </p>
51
- )}
52
- <h1 className="text-4xl font-bold tracking-tight sm:text-5xl lg:text-6xl">
53
- {title}
54
- </h1>
55
- {description && (
56
- <p className="mt-6 text-lg text-muted-foreground">
57
- {description}
58
- </p>
59
- )}
60
- {(primaryAction || secondaryAction) && (
61
- <div className="mt-10 flex flex-col gap-4 sm:flex-row sm:justify-center">
62
- {primaryAction && (
63
- <Button
64
- size="lg"
65
- onClick={primaryAction.onClick}
66
- className="w-full sm:w-auto"
67
- >
68
- {primaryAction.label}
69
- </Button>
70
- )}
71
- {secondaryAction && (
72
- <Button
73
- size="lg"
74
- variant="outline"
75
- onClick={secondaryAction.onClick}
76
- className="w-full sm:w-auto"
77
- >
78
- {secondaryAction.label}
79
- </Button>
80
- )}
81
- </div>
82
- )}
83
- </div>
84
- </div>
85
- </section>
86
- )
87
- }
88
-
89
- if (variant === 'split') {
90
- return (
91
- <section className={cn('py-24 sm:py-32', className)} {...props}>
92
- <div className="container">
93
- <div className="grid gap-12 lg:grid-cols-2 lg:gap-8">
94
- <div className="flex flex-col justify-center">
95
- {subtitle && (
96
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
97
- {subtitle}
98
- </p>
99
- )}
100
- <h1 className="text-4xl font-bold tracking-tight sm:text-5xl lg:text-6xl">
101
- {title}
102
- </h1>
103
- {description && (
104
- <p className="mt-6 text-lg text-muted-foreground">
105
- {description}
106
- </p>
107
- )}
108
- {(primaryAction || secondaryAction) && (
109
- <div className="mt-10 flex flex-col gap-4 sm:flex-row">
110
- {primaryAction && (
111
- <Button
112
- size="lg"
113
- onClick={primaryAction.onClick}
114
- className="w-full sm:w-auto"
115
- >
116
- {primaryAction.label}
117
- </Button>
118
- )}
119
- {secondaryAction && (
120
- <Button
121
- size="lg"
122
- variant="outline"
123
- onClick={secondaryAction.onClick}
124
- className="w-full sm:w-auto"
125
- >
126
- {secondaryAction.label}
127
- </Button>
128
- )}
129
- </div>
130
- )}
131
- </div>
132
- {backgroundImage && (
133
- <div className="relative aspect-[4/3] overflow-hidden rounded-lg">
134
- <img
135
- src={backgroundImage}
136
- alt=""
137
- className="h-full w-full object-cover"
138
- />
139
- </div>
140
- )}
141
- </div>
142
- </div>
143
- </section>
144
- )
145
- }
146
-
147
- // Default variant
148
- return (
149
- <section className={cn('py-24 sm:py-32', className)} {...props}>
150
- <div className="container">
151
- <div className="max-w-3xl">
152
- {subtitle && (
153
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
154
- {subtitle}
155
- </p>
156
- )}
157
- <h1 className="text-4xl font-bold tracking-tight sm:text-5xl lg:text-6xl">
158
- {title}
159
- </h1>
160
- {description && (
161
- <p className="mt-6 text-lg text-muted-foreground">
162
- {description}
163
- </p>
164
- )}
165
- {(primaryAction || secondaryAction) && (
166
- <div className="mt-10 flex flex-col gap-4 sm:flex-row">
167
- {primaryAction && (
168
- <Button
169
- size="lg"
170
- onClick={primaryAction.onClick}
171
- className="w-full sm:w-auto"
172
- >
173
- {primaryAction.label}
174
- </Button>
175
- )}
176
- {secondaryAction && (
177
- <Button
178
- size="lg"
179
- variant="outline"
180
- onClick={secondaryAction.onClick}
181
- className="w-full sm:w-auto"
182
- >
183
- {secondaryAction.label}
184
- </Button>
185
- )}
186
- </div>
187
- )}
188
- </div>
189
- </div>
190
- </section>
191
- )
192
- }
@@ -1,6 +0,0 @@
1
- export { HeroSection } from './hero-section'
2
- export { FeaturesGrid } from './features-grid'
3
- export { PricingTable } from './pricing-table'
4
- export { Testimonials } from './testimonials'
5
- export { CTASection } from './cta-section'
6
- export { FAQ } from './faq'
@@ -1,121 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
- import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@hanzo/ui/primitives'
6
- import { Check } from 'lucide-react'
7
-
8
- interface PricingPlan {
9
- name: string
10
- description: string
11
- price: string | number
12
- currency?: string
13
- interval?: string
14
- features: string[]
15
- highlighted?: boolean
16
- badge?: string
17
- onSelect?: () => void
18
- buttonLabel?: string
19
- buttonVariant?: 'default' | 'outline' | 'ghost'
20
- }
21
-
22
- interface PricingTableProps extends React.ComponentPropsWithoutRef<'section'> {
23
- title?: string
24
- subtitle?: string
25
- description?: string
26
- plans: PricingPlan[]
27
- columns?: 2 | 3 | 4
28
- }
29
-
30
- export function PricingTable({
31
- className,
32
- title,
33
- subtitle,
34
- description,
35
- plans,
36
- columns = 3,
37
- ...props
38
- }: PricingTableProps) {
39
- const gridCols = {
40
- 2: 'md:grid-cols-2',
41
- 3: 'md:grid-cols-2 lg:grid-cols-3',
42
- 4: 'md:grid-cols-2 lg:grid-cols-4',
43
- }[columns]
44
-
45
- return (
46
- <section className={cn('py-24 sm:py-32', className)} {...props}>
47
- <div className="container">
48
- {(title || subtitle || description) && (
49
- <div className="mx-auto max-w-3xl text-center">
50
- {subtitle && (
51
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
52
- {subtitle}
53
- </p>
54
- )}
55
- {title && (
56
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
57
- {title}
58
- </h2>
59
- )}
60
- {description && (
61
- <p className="mt-4 text-lg text-muted-foreground">
62
- {description}
63
- </p>
64
- )}
65
- </div>
66
- )}
67
-
68
- <div className={cn('mt-16 grid gap-8', gridCols)}>
69
- {plans.map((plan, i) => (
70
- <Card
71
- key={i}
72
- className={cn(
73
- 'relative flex flex-col',
74
- plan.highlighted && 'border-primary shadow-lg'
75
- )}
76
- >
77
- {plan.badge && (
78
- <div className="absolute -top-3 left-0 right-0 mx-auto w-fit">
79
- <div className="rounded-full bg-primary px-3 py-1 text-xs font-semibold text-primary-foreground">
80
- {plan.badge}
81
- </div>
82
- </div>
83
- )}
84
- <CardHeader className={plan.badge ? 'pt-8' : ''}>
85
- <CardTitle className="text-xl">{plan.name}</CardTitle>
86
- <CardDescription>{plan.description}</CardDescription>
87
- </CardHeader>
88
- <CardContent className="flex-1">
89
- <div className="mb-6">
90
- <span className="text-4xl font-bold">
91
- {plan.currency || '$'}{plan.price}
92
- </span>
93
- {plan.interval && (
94
- <span className="text-muted-foreground">/{plan.interval}</span>
95
- )}
96
- </div>
97
- <ul className="space-y-3">
98
- {plan.features.map((feature, j) => (
99
- <li key={j} className="flex items-start gap-2">
100
- <Check className="mt-0.5 h-4 w-4 flex-shrink-0 text-primary" />
101
- <span className="text-sm">{feature}</span>
102
- </li>
103
- ))}
104
- </ul>
105
- </CardContent>
106
- <CardFooter>
107
- <Button
108
- className="w-full"
109
- variant={plan.buttonVariant || (plan.highlighted ? 'default' : 'outline')}
110
- onClick={plan.onSelect}
111
- >
112
- {plan.buttonLabel || 'Get started'}
113
- </Button>
114
- </CardFooter>
115
- </Card>
116
- ))}
117
- </div>
118
- </div>
119
- </section>
120
- )
121
- }
@@ -1,196 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Avatar, AvatarFallback, AvatarImage } from '@hanzo/ui/primitives'
5
- import { Card, CardContent } from '@hanzo/ui/primitives'
6
- import { Star } from 'lucide-react'
7
-
8
- interface Testimonial {
9
- content: string
10
- author: {
11
- name: string
12
- title?: string
13
- company?: string
14
- avatar?: string
15
- }
16
- rating?: number
17
- }
18
-
19
- interface TestimonialsProps extends React.ComponentPropsWithoutRef<'section'> {
20
- title?: string
21
- subtitle?: string
22
- description?: string
23
- testimonials: Testimonial[]
24
- columns?: 1 | 2 | 3
25
- variant?: 'default' | 'cards' | 'minimal'
26
- }
27
-
28
- export function Testimonials({
29
- className,
30
- title,
31
- subtitle,
32
- description,
33
- testimonials,
34
- columns = 3,
35
- variant = 'default',
36
- ...props
37
- }: TestimonialsProps) {
38
- const gridCols = {
39
- 1: '',
40
- 2: 'md:grid-cols-2',
41
- 3: 'md:grid-cols-2 lg:grid-cols-3',
42
- }[columns]
43
-
44
- return (
45
- <section className={cn('py-24 sm:py-32', className)} {...props}>
46
- <div className="container">
47
- {(title || subtitle || description) && (
48
- <div className="mx-auto max-w-3xl text-center">
49
- {subtitle && (
50
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
51
- {subtitle}
52
- </p>
53
- )}
54
- {title && (
55
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
56
- {title}
57
- </h2>
58
- )}
59
- {description && (
60
- <p className="mt-4 text-lg text-muted-foreground">
61
- {description}
62
- </p>
63
- )}
64
- </div>
65
- )}
66
-
67
- {variant === 'cards' && (
68
- <div className={cn('mt-16 grid gap-6', gridCols)}>
69
- {testimonials.map((testimonial, i) => (
70
- <Card key={i}>
71
- <CardContent className="pt-6">
72
- {testimonial.rating && (
73
- <div className="mb-4 flex gap-1">
74
- {Array.from({ length: 5 }).map((_, j) => (
75
- <Star
76
- key={j}
77
- className={cn(
78
- 'h-4 w-4',
79
- j < testimonial.rating
80
- ? 'fill-primary text-primary'
81
- : 'text-muted-foreground'
82
- )}
83
- />
84
- ))}
85
- </div>
86
- )}
87
- <blockquote className="text-lg">
88
- &ldquo;{testimonial.content}&rdquo;
89
- </blockquote>
90
- <div className="mt-6 flex items-center gap-4">
91
- <Avatar>
92
- <AvatarImage src={testimonial.author.avatar} />
93
- <AvatarFallback>
94
- {testimonial.author.name.split(' ').map(n => n[0]).join('')}
95
- </AvatarFallback>
96
- </Avatar>
97
- <div>
98
- <div className="font-semibold">{testimonial.author.name}</div>
99
- {(testimonial.author.title || testimonial.author.company) && (
100
- <div className="text-sm text-muted-foreground">
101
- {testimonial.author.title}
102
- {testimonial.author.title && testimonial.author.company && ', '}
103
- {testimonial.author.company}
104
- </div>
105
- )}
106
- </div>
107
- </div>
108
- </CardContent>
109
- </Card>
110
- ))}
111
- </div>
112
- )}
113
-
114
- {variant === 'minimal' && (
115
- <div className={cn('mt-16 space-y-12', columns > 1 && 'md:space-y-0 md:grid md:gap-8', gridCols)}>
116
- {testimonials.map((testimonial, i) => (
117
- <div key={i} className="mx-auto max-w-2xl">
118
- {testimonial.rating && (
119
- <div className="mb-4 flex gap-1">
120
- {Array.from({ length: 5 }).map((_, j) => (
121
- <Star
122
- key={j}
123
- className={cn(
124
- 'h-4 w-4',
125
- j < testimonial.rating
126
- ? 'fill-primary text-primary'
127
- : 'text-muted-foreground'
128
- )}
129
- />
130
- ))}
131
- </div>
132
- )}
133
- <blockquote className="text-lg text-muted-foreground">
134
- &ldquo;{testimonial.content}&rdquo;
135
- </blockquote>
136
- <div className="mt-4">
137
- <div className="font-semibold">{testimonial.author.name}</div>
138
- {(testimonial.author.title || testimonial.author.company) && (
139
- <div className="text-sm text-muted-foreground">
140
- {testimonial.author.title}
141
- {testimonial.author.title && testimonial.author.company && ', '}
142
- {testimonial.author.company}
143
- </div>
144
- )}
145
- </div>
146
- </div>
147
- ))}
148
- </div>
149
- )}
150
-
151
- {variant === 'default' && (
152
- <div className={cn('mt-16 grid gap-8', gridCols)}>
153
- {testimonials.map((testimonial, i) => (
154
- <div key={i} className="text-center">
155
- <div className="mx-auto mb-4 h-16 w-16">
156
- <Avatar className="h-full w-full">
157
- <AvatarImage src={testimonial.author.avatar} />
158
- <AvatarFallback className="text-lg">
159
- {testimonial.author.name.split(' ').map(n => n[0]).join('')}
160
- </AvatarFallback>
161
- </Avatar>
162
- </div>
163
- {testimonial.rating && (
164
- <div className="mb-4 flex justify-center gap-1">
165
- {Array.from({ length: 5 }).map((_, j) => (
166
- <Star
167
- key={j}
168
- className={cn(
169
- 'h-4 w-4',
170
- j < testimonial.rating
171
- ? 'fill-primary text-primary'
172
- : 'text-muted-foreground'
173
- )}
174
- />
175
- ))}
176
- </div>
177
- )}
178
- <blockquote className="mb-4 text-lg">
179
- &ldquo;{testimonial.content}&rdquo;
180
- </blockquote>
181
- <div className="font-semibold">{testimonial.author.name}</div>
182
- {(testimonial.author.title || testimonial.author.company) && (
183
- <div className="text-sm text-muted-foreground">
184
- {testimonial.author.title}
185
- {testimonial.author.title && testimonial.author.company && ', '}
186
- {testimonial.author.company}
187
- </div>
188
- )}
189
- </div>
190
- ))}
191
- </div>
192
- )}
193
- </div>
194
- </section>
195
- )
196
- }
@@ -1,9 +0,0 @@
1
- // Component exports
2
- // This file provides a central import point for all UI components
3
- // Usage: import { Button, Card, cn } from '@hanzo/ui/components'
4
-
5
- // Export commonly used utilities
6
- export { cn, formatDate, absoluteUrl } from '../src/utils'
7
-
8
- // Re-export all primitives as components for backward compatibility
9
- export * from '../primitives/index-next'