@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,181 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
- import { Input } from '@hanzo/ui/primitives'
6
- import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@hanzo/ui/primitives'
7
- import { Separator } from '@hanzo/ui/primitives'
8
- import { Trash2, Plus, Minus } from 'lucide-react'
9
-
10
- export interface CartItem {
11
- id: string | number
12
- name: string
13
- price: number
14
- quantity: number
15
- image: string
16
- variant?: string
17
- currency?: string
18
- }
19
-
20
- interface ShoppingCartProps extends React.ComponentPropsWithoutRef<'div'> {
21
- items: CartItem[]
22
- onUpdateQuantity?: (id: string | number, quantity: number) => void
23
- onRemoveItem?: (id: string | number) => void
24
- onCheckout?: () => void
25
- shippingCost?: number
26
- taxRate?: number
27
- currency?: string
28
- }
29
-
30
- export function ShoppingCart({
31
- className,
32
- items,
33
- onUpdateQuantity,
34
- onRemoveItem,
35
- onCheckout,
36
- shippingCost = 0,
37
- taxRate = 0,
38
- currency = '$',
39
- ...props
40
- }: ShoppingCartProps) {
41
- const formatPrice = (price: number) => {
42
- return `${currency}${price.toFixed(2)}`
43
- }
44
-
45
- const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0)
46
- const tax = subtotal * taxRate
47
- const total = subtotal + tax + shippingCost
48
-
49
- return (
50
- <div className={cn('grid gap-6 lg:grid-cols-3', className)} {...props}>
51
- <div className="lg:col-span-2">
52
- <Card>
53
- <CardHeader>
54
- <CardTitle>Shopping Cart ({items.length} items)</CardTitle>
55
- </CardHeader>
56
- <CardContent className="p-0">
57
- {items.length === 0 ? (
58
- <div className="p-6 text-center text-muted-foreground">
59
- Your cart is empty
60
- </div>
61
- ) : (
62
- <div className="divide-y">
63
- {items.map((item) => (
64
- <div key={item.id} className="flex gap-4 p-6">
65
- <div className="h-24 w-24 flex-shrink-0 overflow-hidden rounded-lg">
66
- <img
67
- src={item.image}
68
- alt={item.name}
69
- className="h-full w-full object-cover"
70
- />
71
- </div>
72
- <div className="flex flex-1 flex-col">
73
- <div className="flex justify-between">
74
- <div>
75
- <h3 className="font-semibold">{item.name}</h3>
76
- {item.variant && (
77
- <p className="mt-1 text-sm text-muted-foreground">
78
- {item.variant}
79
- </p>
80
- )}
81
- </div>
82
- <p className="font-semibold">
83
- {formatPrice(item.price * item.quantity)}
84
- </p>
85
- </div>
86
- <div className="mt-4 flex items-center justify-between">
87
- <div className="flex items-center gap-2">
88
- <Button
89
- size="icon"
90
- variant="outline"
91
- className="h-8 w-8"
92
- onClick={() =>
93
- onUpdateQuantity?.(item.id, Math.max(1, item.quantity - 1))
94
- }
95
- disabled={item.quantity <= 1}
96
- >
97
- <Minus className="h-4 w-4" />
98
- </Button>
99
- <Input
100
- type="number"
101
- value={item.quantity}
102
- onChange={(e) => {
103
- const value = parseInt(e.target.value, 10)
104
- if (!isNaN(value) && value > 0) {
105
- onUpdateQuantity?.(item.id, value)
106
- }
107
- }}
108
- className="h-8 w-16 text-center"
109
- min="1"
110
- />
111
- <Button
112
- size="icon"
113
- variant="outline"
114
- className="h-8 w-8"
115
- onClick={() =>
116
- onUpdateQuantity?.(item.id, item.quantity + 1)
117
- }
118
- >
119
- <Plus className="h-4 w-4" />
120
- </Button>
121
- </div>
122
- <Button
123
- size="sm"
124
- variant="ghost"
125
- onClick={() => onRemoveItem?.(item.id)}
126
- >
127
- <Trash2 className="h-4 w-4" />
128
- </Button>
129
- </div>
130
- </div>
131
- </div>
132
- ))}
133
- </div>
134
- )}
135
- </CardContent>
136
- </Card>
137
- </div>
138
-
139
- <div>
140
- <Card>
141
- <CardHeader>
142
- <CardTitle>Order Summary</CardTitle>
143
- </CardHeader>
144
- <CardContent className="space-y-4">
145
- <div className="flex justify-between">
146
- <span>Subtotal</span>
147
- <span>{formatPrice(subtotal)}</span>
148
- </div>
149
- {shippingCost > 0 && (
150
- <div className="flex justify-between">
151
- <span>Shipping</span>
152
- <span>{formatPrice(shippingCost)}</span>
153
- </div>
154
- )}
155
- {taxRate > 0 && (
156
- <div className="flex justify-between">
157
- <span>Tax</span>
158
- <span>{formatPrice(tax)}</span>
159
- </div>
160
- )}
161
- <Separator />
162
- <div className="flex justify-between text-lg font-semibold">
163
- <span>Total</span>
164
- <span>{formatPrice(total)}</span>
165
- </div>
166
- </CardContent>
167
- <CardFooter>
168
- <Button
169
- className="w-full"
170
- size="lg"
171
- onClick={onCheckout}
172
- disabled={items.length === 0}
173
- >
174
- Proceed to Checkout
175
- </Button>
176
- </CardFooter>
177
- </Card>
178
- </div>
179
- </div>
180
- )
181
- }
package/blocks/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './def'
2
- export * from './components'
@@ -1,207 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import { Button } from '@hanzo/ui/primitives'
5
-
6
- interface CTASectionProps extends React.ComponentPropsWithoutRef<'section'> {
7
- title: string
8
- description?: string
9
- primaryAction?: {
10
- label: string
11
- onClick: () => void
12
- }
13
- secondaryAction?: {
14
- label: string
15
- onClick: () => void
16
- }
17
- variant?: 'default' | 'centered' | 'card' | 'gradient'
18
- }
19
-
20
- export function CTASection({
21
- className,
22
- title,
23
- description,
24
- primaryAction,
25
- secondaryAction,
26
- variant = 'default',
27
- ...props
28
- }: CTASectionProps) {
29
- if (variant === 'card') {
30
- return (
31
- <section className={cn('py-24 sm:py-32', className)} {...props}>
32
- <div className="container">
33
- <div className="rounded-2xl bg-muted px-6 py-16 sm:px-12 sm:py-20">
34
- <div className="mx-auto max-w-3xl text-center">
35
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
36
- {title}
37
- </h2>
38
- {description && (
39
- <p className="mt-4 text-lg text-muted-foreground">
40
- {description}
41
- </p>
42
- )}
43
- {(primaryAction || secondaryAction) && (
44
- <div className="mt-10 flex flex-col gap-4 sm:flex-row sm:justify-center">
45
- {primaryAction && (
46
- <Button
47
- size="lg"
48
- onClick={primaryAction.onClick}
49
- className="w-full sm:w-auto"
50
- >
51
- {primaryAction.label}
52
- </Button>
53
- )}
54
- {secondaryAction && (
55
- <Button
56
- size="lg"
57
- variant="outline"
58
- onClick={secondaryAction.onClick}
59
- className="w-full sm:w-auto"
60
- >
61
- {secondaryAction.label}
62
- </Button>
63
- )}
64
- </div>
65
- )}
66
- </div>
67
- </div>
68
- </div>
69
- </section>
70
- )
71
- }
72
-
73
- if (variant === 'gradient') {
74
- return (
75
- <section
76
- className={cn(
77
- 'relative overflow-hidden bg-gradient-to-br from-primary/90 to-primary py-24 sm:py-32',
78
- className
79
- )}
80
- {...props}
81
- >
82
- <div className="absolute inset-0 bg-grid-white/10" />
83
- <div className="container relative">
84
- <div className="mx-auto max-w-3xl text-center">
85
- <h2 className="text-3xl font-bold tracking-tight text-primary-foreground sm:text-4xl">
86
- {title}
87
- </h2>
88
- {description && (
89
- <p className="mt-4 text-lg text-primary-foreground/90">
90
- {description}
91
- </p>
92
- )}
93
- {(primaryAction || secondaryAction) && (
94
- <div className="mt-10 flex flex-col gap-4 sm:flex-row sm:justify-center">
95
- {primaryAction && (
96
- <Button
97
- size="lg"
98
- variant="secondary"
99
- onClick={primaryAction.onClick}
100
- className="w-full sm:w-auto"
101
- >
102
- {primaryAction.label}
103
- </Button>
104
- )}
105
- {secondaryAction && (
106
- <Button
107
- size="lg"
108
- variant="outline"
109
- className="w-full border-primary-foreground/20 text-primary-foreground hover:bg-primary-foreground/10 sm:w-auto"
110
- onClick={secondaryAction.onClick}
111
- >
112
- {secondaryAction.label}
113
- </Button>
114
- )}
115
- </div>
116
- )}
117
- </div>
118
- </div>
119
- </section>
120
- )
121
- }
122
-
123
- if (variant === 'centered') {
124
- return (
125
- <section className={cn('py-24 sm:py-32', className)} {...props}>
126
- <div className="container">
127
- <div className="mx-auto max-w-3xl text-center">
128
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
129
- {title}
130
- </h2>
131
- {description && (
132
- <p className="mt-4 text-lg text-muted-foreground">
133
- {description}
134
- </p>
135
- )}
136
- {(primaryAction || secondaryAction) && (
137
- <div className="mt-10 flex flex-col gap-4 sm:flex-row sm:justify-center">
138
- {primaryAction && (
139
- <Button
140
- size="lg"
141
- onClick={primaryAction.onClick}
142
- className="w-full sm:w-auto"
143
- >
144
- {primaryAction.label}
145
- </Button>
146
- )}
147
- {secondaryAction && (
148
- <Button
149
- size="lg"
150
- variant="outline"
151
- onClick={secondaryAction.onClick}
152
- className="w-full sm:w-auto"
153
- >
154
- {secondaryAction.label}
155
- </Button>
156
- )}
157
- </div>
158
- )}
159
- </div>
160
- </div>
161
- </section>
162
- )
163
- }
164
-
165
- // Default variant
166
- return (
167
- <section className={cn('py-24 sm:py-32', className)} {...props}>
168
- <div className="container">
169
- <div className="flex flex-col items-center justify-between gap-8 sm:flex-row sm:gap-12">
170
- <div className="max-w-xl">
171
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
172
- {title}
173
- </h2>
174
- {description && (
175
- <p className="mt-4 text-lg text-muted-foreground">
176
- {description}
177
- </p>
178
- )}
179
- </div>
180
- {(primaryAction || secondaryAction) && (
181
- <div className="flex flex-col gap-4 sm:flex-row">
182
- {primaryAction && (
183
- <Button
184
- size="lg"
185
- onClick={primaryAction.onClick}
186
- className="w-full sm:w-auto"
187
- >
188
- {primaryAction.label}
189
- </Button>
190
- )}
191
- {secondaryAction && (
192
- <Button
193
- size="lg"
194
- variant="outline"
195
- onClick={secondaryAction.onClick}
196
- className="w-full sm:w-auto"
197
- >
198
- {secondaryAction.label}
199
- </Button>
200
- )}
201
- </div>
202
- )}
203
- </div>
204
- </div>
205
- </section>
206
- )
207
- }
@@ -1,159 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@hanzo/ui/util'
4
- import {
5
- Accordion,
6
- AccordionContent,
7
- AccordionItem,
8
- AccordionTrigger,
9
- } from '@hanzo/ui/primitives'
10
-
11
- interface FAQItem {
12
- question: string
13
- answer: string
14
- }
15
-
16
- interface FAQProps extends React.ComponentPropsWithoutRef<'section'> {
17
- title?: string
18
- subtitle?: string
19
- description?: string
20
- items: FAQItem[]
21
- variant?: 'default' | 'centered' | 'split'
22
- }
23
-
24
- export function FAQ({
25
- className,
26
- title,
27
- subtitle,
28
- description,
29
- items,
30
- variant = 'default',
31
- ...props
32
- }: FAQProps) {
33
- if (variant === 'split') {
34
- return (
35
- <section className={cn('py-24 sm:py-32', className)} {...props}>
36
- <div className="container">
37
- <div className="grid gap-12 lg:grid-cols-5">
38
- <div className="lg:col-span-2">
39
- {subtitle && (
40
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
41
- {subtitle}
42
- </p>
43
- )}
44
- {title && (
45
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
46
- {title}
47
- </h2>
48
- )}
49
- {description && (
50
- <p className="mt-4 text-lg text-muted-foreground">
51
- {description}
52
- </p>
53
- )}
54
- </div>
55
- <div className="lg:col-span-3">
56
- <Accordion type="single" collapsible className="w-full">
57
- {items.map((item, i) => (
58
- <AccordionItem key={i} value={`item-${i}`}>
59
- <AccordionTrigger className="text-left">
60
- {item.question}
61
- </AccordionTrigger>
62
- <AccordionContent>{item.answer}</AccordionContent>
63
- </AccordionItem>
64
- ))}
65
- </Accordion>
66
- </div>
67
- </div>
68
- </div>
69
- </section>
70
- )
71
- }
72
-
73
- if (variant === 'centered') {
74
- return (
75
- <section className={cn('py-24 sm:py-32', className)} {...props}>
76
- <div className="container">
77
- <div className="mx-auto max-w-3xl">
78
- {(title || subtitle || description) && (
79
- <div className="text-center">
80
- {subtitle && (
81
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
82
- {subtitle}
83
- </p>
84
- )}
85
- {title && (
86
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
87
- {title}
88
- </h2>
89
- )}
90
- {description && (
91
- <p className="mt-4 text-lg text-muted-foreground">
92
- {description}
93
- </p>
94
- )}
95
- </div>
96
- )}
97
- <Accordion
98
- type="single"
99
- collapsible
100
- className={cn('w-full', (title || subtitle || description) && 'mt-12')}
101
- >
102
- {items.map((item, i) => (
103
- <AccordionItem key={i} value={`item-${i}`}>
104
- <AccordionTrigger className="text-left">
105
- {item.question}
106
- </AccordionTrigger>
107
- <AccordionContent>{item.answer}</AccordionContent>
108
- </AccordionItem>
109
- ))}
110
- </Accordion>
111
- </div>
112
- </div>
113
- </section>
114
- )
115
- }
116
-
117
- // Default variant
118
- return (
119
- <section className={cn('py-24 sm:py-32', className)} {...props}>
120
- <div className="container">
121
- <div className="mx-auto max-w-4xl">
122
- {(title || subtitle || description) && (
123
- <div>
124
- {subtitle && (
125
- <p className="mb-4 text-sm font-semibold uppercase tracking-wide text-primary">
126
- {subtitle}
127
- </p>
128
- )}
129
- {title && (
130
- <h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
131
- {title}
132
- </h2>
133
- )}
134
- {description && (
135
- <p className="mt-4 text-lg text-muted-foreground">
136
- {description}
137
- </p>
138
- )}
139
- </div>
140
- )}
141
- <Accordion
142
- type="single"
143
- collapsible
144
- className={cn('w-full', (title || subtitle || description) && 'mt-12')}
145
- >
146
- {items.map((item, i) => (
147
- <AccordionItem key={i} value={`item-${i}`}>
148
- <AccordionTrigger className="text-left">
149
- {item.question}
150
- </AccordionTrigger>
151
- <AccordionContent>{item.answer}</AccordionContent>
152
- </AccordionItem>
153
- ))}
154
- </Accordion>
155
- </div>
156
- </div>
157
- </section>
158
- )
159
- }