@hanzo/ui 4.5.0 → 4.5.2

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 (311) hide show
  1. package/MCP-INSTRUCTIONS.md +73 -0
  2. package/README-MCP.md +175 -0
  3. package/bin/cli.js +100 -0
  4. package/bin/create-registry.js +108 -0
  5. package/bin/mcp.js +403 -0
  6. package/bin/npx-registry-mcp.js +15 -0
  7. package/bin/registry-mcp-wrapper.sh +19 -0
  8. package/bin/registry-mcp.js +100 -0
  9. package/bin/start-mcp-server.sh +22 -0
  10. package/bin/test-mcp.sh +52 -0
  11. package/bin/update-registry.js +196 -0
  12. package/blocks/components/screenful-block/index.tsx +2 -0
  13. package/dist/blocks/components/accordian-block.d.ts +4 -0
  14. package/dist/blocks/components/accordian-block.jsx +25 -0
  15. package/dist/blocks/components/block-component-props.d.ts +7 -0
  16. package/dist/blocks/components/block-component-props.js +1 -0
  17. package/dist/blocks/components/bullet-cards-block.d.ts +4 -0
  18. package/dist/blocks/components/bullet-cards-block.jsx +25 -0
  19. package/dist/blocks/components/card-block/index.d.ts +6 -0
  20. package/dist/blocks/components/card-block/index.jsx +87 -0
  21. package/dist/blocks/components/card-block/link-out-button.d.ts +6 -0
  22. package/dist/blocks/components/card-block/link-out-button.jsx +4 -0
  23. package/dist/blocks/components/card-block/util.d.ts +4 -0
  24. package/dist/blocks/components/card-block/util.js +6 -0
  25. package/dist/blocks/components/carte-blanche-block/index.d.ts +4 -0
  26. package/dist/blocks/components/carte-blanche-block/index.jsx +82 -0
  27. package/dist/blocks/components/carte-blanche-block/variant-content-left.d.ts +10 -0
  28. package/dist/blocks/components/carte-blanche-block/variant-content-left.jsx +23 -0
  29. package/dist/blocks/components/content.d.ts +10 -0
  30. package/dist/blocks/components/content.jsx +47 -0
  31. package/dist/blocks/components/cta-block.d.ts +12 -0
  32. package/dist/blocks/components/cta-block.jsx +69 -0
  33. package/dist/blocks/components/enh-heading-block.d.ts +7 -0
  34. package/dist/blocks/components/enh-heading-block.jsx +142 -0
  35. package/dist/blocks/components/grid-block/grid-block-mutator.d.ts +5 -0
  36. package/dist/blocks/components/grid-block/grid-block-mutator.js +1 -0
  37. package/dist/blocks/components/grid-block/index.d.ts +9 -0
  38. package/dist/blocks/components/grid-block/index.jsx +56 -0
  39. package/dist/blocks/components/grid-block/mutator-registry.d.ts +3 -0
  40. package/dist/blocks/components/grid-block/mutator-registry.js +5 -0
  41. package/dist/blocks/components/grid-block/table-borders.mutator.d.ts +3 -0
  42. package/dist/blocks/components/grid-block/table-borders.mutator.js +36 -0
  43. package/dist/blocks/components/group-block.d.ts +7 -0
  44. package/dist/blocks/components/group-block.jsx +61 -0
  45. package/dist/blocks/components/heading-block.d.ts +4 -0
  46. package/dist/blocks/components/heading-block.jsx +99 -0
  47. package/dist/blocks/components/image-block.d.ts +7 -0
  48. package/dist/blocks/components/image-block.jsx +69 -0
  49. package/dist/blocks/components/index.d.ts +14 -0
  50. package/dist/blocks/components/index.js +13 -0
  51. package/dist/blocks/components/screenful-block/content.d.ts +8 -0
  52. package/dist/blocks/components/screenful-block/content.jsx +71 -0
  53. package/dist/blocks/components/screenful-block/index.d.ts +12 -0
  54. package/dist/blocks/components/screenful-block/index.jsx +57 -0
  55. package/dist/blocks/components/screenful-block/poster-background.d.ts +7 -0
  56. package/dist/blocks/components/screenful-block/poster-background.jsx +14 -0
  57. package/dist/blocks/components/screenful-block/video-background.d.ts +8 -0
  58. package/dist/blocks/components/screenful-block/video-background.jsx +20 -0
  59. package/dist/blocks/components/space-block.d.ts +4 -0
  60. package/dist/blocks/components/space-block.jsx +42 -0
  61. package/dist/blocks/components/video-block.d.ts +9 -0
  62. package/dist/blocks/components/video-block.jsx +83 -0
  63. package/dist/blocks/def/accordian-block.d.ts +10 -0
  64. package/dist/blocks/def/accordian-block.js +2 -0
  65. package/dist/blocks/def/block.d.ts +4 -0
  66. package/dist/blocks/def/block.js +1 -0
  67. package/dist/blocks/def/bullet-cards-block.d.ts +17 -0
  68. package/dist/blocks/def/bullet-cards-block.js +1 -0
  69. package/dist/blocks/def/card-block.d.ts +17 -0
  70. package/dist/blocks/def/card-block.js +2 -0
  71. package/dist/blocks/def/carte-blanche-block.d.ts +12 -0
  72. package/dist/blocks/def/carte-blanche-block.js +1 -0
  73. package/dist/blocks/def/cta-block.d.ts +8 -0
  74. package/dist/blocks/def/cta-block.js +1 -0
  75. package/dist/blocks/def/element-block.d.ts +7 -0
  76. package/dist/blocks/def/element-block.js +2 -0
  77. package/dist/blocks/def/enh-heading-block.d.ts +22 -0
  78. package/dist/blocks/def/enh-heading-block.js +1 -0
  79. package/dist/blocks/def/grid-block.d.ts +12 -0
  80. package/dist/blocks/def/grid-block.js +1 -0
  81. package/dist/blocks/def/group-block.d.ts +7 -0
  82. package/dist/blocks/def/group-block.js +1 -0
  83. package/dist/blocks/def/heading-block.d.ts +11 -0
  84. package/dist/blocks/def/heading-block.js +1 -0
  85. package/dist/blocks/def/image-block.d.ts +26 -0
  86. package/dist/blocks/def/image-block.js +1 -0
  87. package/dist/blocks/def/index.d.ts +17 -0
  88. package/dist/blocks/def/index.js +2 -0
  89. package/dist/blocks/def/screenful-block.d.ts +41 -0
  90. package/dist/blocks/def/screenful-block.js +1 -0
  91. package/dist/blocks/def/space-block.d.ts +47 -0
  92. package/dist/blocks/def/space-block.js +8 -0
  93. package/dist/blocks/def/video-block.d.ts +5 -0
  94. package/dist/blocks/def/video-block.js +1 -0
  95. package/dist/blocks/index.d.ts +2 -0
  96. package/dist/blocks/index.js +2 -0
  97. package/dist/mcp/enhanced-server.d.ts +29 -0
  98. package/dist/mcp/enhanced-server.js +1128 -0
  99. package/dist/mcp/index.d.ts +28 -0
  100. package/dist/mcp/index.js +436 -0
  101. package/dist/primitives/accordion.d.ts +10 -0
  102. package/dist/primitives/accordion.jsx +21 -0
  103. package/dist/primitives/action-button.d.ts +9 -0
  104. package/dist/primitives/action-button.jsx +16 -0
  105. package/dist/primitives/apply-typography.d.ts +7 -0
  106. package/dist/primitives/apply-typography.jsx +38 -0
  107. package/dist/primitives/aspect-ratio.d.ts +3 -0
  108. package/dist/primitives/aspect-ratio.jsx +4 -0
  109. package/dist/primitives/avatar.d.ts +6 -0
  110. package/dist/primitives/avatar.jsx +11 -0
  111. package/dist/primitives/badge.d.ts +9 -0
  112. package/dist/primitives/badge.jsx +18 -0
  113. package/dist/primitives/breadcrumb.d.ts +19 -0
  114. package/dist/primitives/breadcrumb.jsx +27 -0
  115. package/dist/primitives/breakpoint-indicator.d.ts +3 -0
  116. package/dist/primitives/breakpoint-indicator.jsx +14 -0
  117. package/dist/primitives/button.d.ts +12 -0
  118. package/dist/primitives/button.jsx +55 -0
  119. package/dist/primitives/calendar.d.ts +8 -0
  120. package/dist/primitives/calendar.jsx +40 -0
  121. package/dist/primitives/card.d.ts +8 -0
  122. package/dist/primitives/card.jsx +18 -0
  123. package/dist/primitives/carousel.d.ts +18 -0
  124. package/dist/primitives/carousel.jsx +106 -0
  125. package/dist/primitives/checkbox.d.ts +4 -0
  126. package/dist/primitives/checkbox.jsx +15 -0
  127. package/dist/primitives/combobox.d.ts +41 -0
  128. package/dist/primitives/combobox.jsx +77 -0
  129. package/dist/primitives/command.d.ts +17 -0
  130. package/dist/primitives/command.jsx +38 -0
  131. package/dist/primitives/context-menu.d.ts +27 -0
  132. package/dist/primitives/context-menu.jsx +57 -0
  133. package/dist/primitives/dialog-video-controller.d.ts +3 -0
  134. package/dist/primitives/dialog-video-controller.jsx +24 -0
  135. package/dist/primitives/dialog.d.ts +28 -0
  136. package/dist/primitives/dialog.jsx +37 -0
  137. package/dist/primitives/drawer.d.ts +29 -0
  138. package/dist/primitives/drawer.jsx +34 -0
  139. package/dist/primitives/form.d.ts +12 -0
  140. package/dist/primitives/form.jsx +69 -0
  141. package/dist/primitives/icons/github.d.ts +4 -0
  142. package/dist/primitives/icons/github.jsx +6 -0
  143. package/dist/primitives/icons/index.d.ts +4 -0
  144. package/dist/primitives/icons/index.js +4 -0
  145. package/dist/primitives/icons/youtube-logo.d.ts +4 -0
  146. package/dist/primitives/icons/youtube-logo.jsx +39 -0
  147. package/dist/primitives/index-common.d.ts +47 -0
  148. package/dist/primitives/index-common.js +46 -0
  149. package/dist/primitives/index-next.d.ts +2 -0
  150. package/dist/primitives/index-next.js +2 -0
  151. package/dist/primitives/input-otp.d.ts +7 -0
  152. package/dist/primitives/input-otp.jsx +24 -0
  153. package/dist/primitives/input.d.ts +5 -0
  154. package/dist/primitives/input.jsx +11 -0
  155. package/dist/primitives/label.d.ts +5 -0
  156. package/dist/primitives/label.jsx +11 -0
  157. package/dist/primitives/list-adaptor.d.ts +9 -0
  158. package/dist/primitives/list-adaptor.js +1 -0
  159. package/dist/primitives/list-box.d.ts +10 -0
  160. package/dist/primitives/list-box.jsx +14 -0
  161. package/dist/primitives/loading-spinner.d.ts +5 -0
  162. package/dist/primitives/loading-spinner.jsx +8 -0
  163. package/dist/primitives/navigation-menu.d.ts +12 -0
  164. package/dist/primitives/navigation-menu.jsx +38 -0
  165. package/dist/primitives/next/image.d.ts +11 -0
  166. package/dist/primitives/next/image.jsx +42 -0
  167. package/dist/primitives/next/index.d.ts +7 -0
  168. package/dist/primitives/next/index.js +7 -0
  169. package/dist/primitives/next/inline-icon.d.ts +13 -0
  170. package/dist/primitives/next/inline-icon.jsx +15 -0
  171. package/dist/primitives/next/link-element.d.ts +23 -0
  172. package/dist/primitives/next/link-element.jsx +56 -0
  173. package/dist/primitives/next/mdx-link.d.ts +3 -0
  174. package/dist/primitives/next/mdx-link.jsx +12 -0
  175. package/dist/primitives/next/media-stack.d.ts +8 -0
  176. package/dist/primitives/next/media-stack.jsx +28 -0
  177. package/dist/primitives/next/nav-items.d.ts +10 -0
  178. package/dist/primitives/next/nav-items.jsx +24 -0
  179. package/dist/primitives/next/youtube-embed.d.ts +11 -0
  180. package/dist/primitives/next/youtube-embed.jsx +23 -0
  181. package/dist/primitives/popover.d.ts +9 -0
  182. package/dist/primitives/popover.jsx +18 -0
  183. package/dist/primitives/progress.d.ts +4 -0
  184. package/dist/primitives/progress.jsx +9 -0
  185. package/dist/primitives/radio-group.d.ts +7 -0
  186. package/dist/primitives/radio-group.jsx +18 -0
  187. package/dist/primitives/scroll-area.d.ts +5 -0
  188. package/dist/primitives/scroll-area.jsx +19 -0
  189. package/dist/primitives/select.d.ts +13 -0
  190. package/dist/primitives/select.jsx +62 -0
  191. package/dist/primitives/separator.d.ts +4 -0
  192. package/dist/primitives/separator.jsx +7 -0
  193. package/dist/primitives/sheet.d.ts +30 -0
  194. package/dist/primitives/sheet.jsx +56 -0
  195. package/dist/primitives/skeleton.d.ts +4 -0
  196. package/dist/primitives/skeleton.jsx +3 -0
  197. package/dist/primitives/slider.d.ts +9 -0
  198. package/dist/primitives/slider.jsx +30 -0
  199. package/dist/primitives/sonner.d.ts +5 -0
  200. package/dist/primitives/sonner.jsx +16 -0
  201. package/dist/primitives/step-indicator.d.ts +9 -0
  202. package/dist/primitives/step-indicator.jsx +23 -0
  203. package/dist/primitives/switch.d.ts +6 -0
  204. package/dist/primitives/switch.jsx +14 -0
  205. package/dist/primitives/table.d.ts +10 -0
  206. package/dist/primitives/table.jsx +21 -0
  207. package/dist/primitives/tabs.d.ts +7 -0
  208. package/dist/primitives/tabs.jsx +18 -0
  209. package/dist/primitives/text-area.d.ts +5 -0
  210. package/dist/primitives/text-area.jsx +9 -0
  211. package/dist/primitives/toggle-group.d.ts +14 -0
  212. package/dist/primitives/toggle-group.jsx +28 -0
  213. package/dist/primitives/toggle.d.ts +14 -0
  214. package/dist/primitives/toggle.jsx +52 -0
  215. package/dist/primitives/tooltip.d.ts +11 -0
  216. package/dist/primitives/tooltip.jsx +18 -0
  217. package/dist/primitives/video-player.d.ts +6 -0
  218. package/dist/primitives/video-player.jsx +8 -0
  219. package/dist/registry/api.d.ts +37 -0
  220. package/dist/registry/api.js +130 -0
  221. package/dist/registry/index.d.ts +9 -0
  222. package/dist/registry/index.js +45 -0
  223. package/dist/style/theme-provider.d.ts +4 -0
  224. package/dist/style/theme-provider.jsx +11 -0
  225. package/dist/tailwind/fontFamily.tailwind.d.ts +8 -0
  226. package/dist/tailwind/fontFamily.tailwind.js +7 -0
  227. package/dist/tailwind/fontSize.tailwind.d.ts +36 -0
  228. package/dist/tailwind/fontSize.tailwind.js +13 -0
  229. package/dist/tailwind/index.d.ts +3 -0
  230. package/dist/tailwind/index.js +2 -0
  231. package/dist/tailwind/screens.tailwind.d.ts +9 -0
  232. package/dist/tailwind/screens.tailwind.js +8 -0
  233. package/dist/tailwind/tw-font-desc.d.ts +6 -0
  234. package/dist/tailwind/tw-font-desc.js +6 -0
  235. package/dist/types/animation-def.d.ts +2 -0
  236. package/dist/types/animation-def.js +1 -0
  237. package/dist/types/breakpoints.d.ts +4 -0
  238. package/dist/types/breakpoints.js +4 -0
  239. package/dist/types/bullet-item.d.ts +6 -0
  240. package/dist/types/bullet-item.js +2 -0
  241. package/dist/types/button-def.d.ts +29 -0
  242. package/dist/types/button-def.js +2 -0
  243. package/dist/types/dimensions.d.ts +5 -0
  244. package/dist/types/dimensions.js +1 -0
  245. package/dist/types/grid-def.d.ts +36 -0
  246. package/dist/types/grid-def.js +33 -0
  247. package/dist/types/image-def.d.ts +27 -0
  248. package/dist/types/image-def.js +1 -0
  249. package/dist/types/index.d.ts +13 -0
  250. package/dist/types/index.js +2 -0
  251. package/dist/types/link-def.d.ts +44 -0
  252. package/dist/types/link-def.js +1 -0
  253. package/dist/types/media-stack-def.d.ts +25 -0
  254. package/dist/types/media-stack-def.js +1 -0
  255. package/dist/types/t-shirt-size.d.ts +2 -0
  256. package/dist/types/t-shirt-size.js +1 -0
  257. package/dist/types/tshirt-dimensions.d.ts +12 -0
  258. package/dist/types/tshirt-dimensions.js +1 -0
  259. package/dist/types/video-def.d.ts +9 -0
  260. package/dist/types/video-def.js +1 -0
  261. package/dist/util/format-and-abbreviate-as-currency.d.ts +11 -0
  262. package/dist/util/format-and-abbreviate-as-currency.js +91 -0
  263. package/dist/util/format-to-max-char.d.ts +5 -0
  264. package/dist/util/format-to-max-char.js +57 -0
  265. package/dist/util/index-client.d.ts +2 -0
  266. package/dist/util/index-client.js +3 -0
  267. package/dist/util/index.d.ts +17 -0
  268. package/dist/util/index.js +41 -0
  269. package/dist/util/number-abbreviate.d.ts +9 -0
  270. package/dist/util/number-abbreviate.js +30 -0
  271. package/dist/util/specifier.d.ts +7 -0
  272. package/dist/util/specifier.js +31 -0
  273. package/dist/util/spread-to-transform.d.ts +7 -0
  274. package/dist/util/spread-to-transform.js +18 -0
  275. package/dist/util/step-animation.d.ts +5 -0
  276. package/dist/util/step-animation.js +60 -0
  277. package/dist/util/two-way-map.d.ts +8 -0
  278. package/dist/util/two-way-map.js +16 -0
  279. package/mcp/README.md +141 -0
  280. package/mcp/enhanced-server.ts +1208 -0
  281. package/mcp/index.ts +518 -0
  282. package/mcp/package.json +10 -0
  283. package/package.json +34 -14
  284. package/primitives/accordion.tsx +5 -5
  285. package/primitives/button.tsx +6 -3
  286. package/primitives/dialog.tsx +12 -7
  287. package/primitives/tabs.tsx +1 -1
  288. package/primitives/tooltip.tsx +1 -1
  289. package/public/r/accordion.json +11 -0
  290. package/public/r/alert.json +11 -0
  291. package/public/r/avatar.json +11 -0
  292. package/public/r/badge.json +11 -0
  293. package/public/r/button.json +11 -0
  294. package/public/r/card.json +11 -0
  295. package/public/r/checkbox.json +11 -0
  296. package/public/r/default.json +6 -0
  297. package/public/r/dialog.json +11 -0
  298. package/public/r/input.json +11 -0
  299. package/public/r/label.json +11 -0
  300. package/public/r/new-york.json +6 -0
  301. package/public/r/popover.json +11 -0
  302. package/public/r/select.json +11 -0
  303. package/public/r/table.json +11 -0
  304. package/public/r/tabs.json +11 -0
  305. package/public/r/toast.json +11 -0
  306. package/registry/api.ts +164 -0
  307. package/registry/index.ts +60 -0
  308. package/registry/package.json +10 -0
  309. package/registry.json +184 -0
  310. package/test/test-registry.js +73 -0
  311. package/tsconfig.json +8 -1
@@ -17,7 +17,7 @@ const DialogPortal = React.forwardRef<
17
17
  DialogPortalProps
18
18
  >(({ className, children, ...props }, ref) => (
19
19
  <DialogPrimitive.Portal {...props}>
20
- <div className={cn("fixed inset-0 z-modal flex items-end justify-center sm:items-center", className)}>
20
+ <div className={cn("fixed inset-0 z-50 flex items-end justify-center sm:items-center", className)}>
21
21
  {children}
22
22
  </div>
23
23
  </DialogPrimitive.Portal>
@@ -32,9 +32,14 @@ const DialogOverlay = React.forwardRef<
32
32
  React.ElementRef<typeof DialogPrimitive.Overlay>,
33
33
  DialogOverlayProps
34
34
  >(({ className, ...props }, ref) => (
35
- <div className={cn("bg-overlay backdrop-blur-sm fixed inset-0 z-below-modal flex items-end justify-center sm:items-center", className)}>
36
- <DialogPrimitive.Overlay ref={ref} {...props} />
37
- </div>
35
+ <DialogPrimitive.Overlay
36
+ ref={ref}
37
+ className={cn(
38
+ "fixed inset-0 z-50 bg-overlay backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
39
+ className
40
+ )}
41
+ {...props}
42
+ />
38
43
  ))
39
44
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
40
45
 
@@ -50,7 +55,7 @@ const DialogClose = React.forwardRef<
50
55
  <DialogPrimitive.Close
51
56
  ref={ref}
52
57
  className={cn(
53
- "absolute right-4 top-3 p-1 justify-self-start hover:brightness-105 hover:scale-110 duration-100 ring-1 ring-muted transition hover:text- focus:outline-none rounded-full items-center",
58
+ "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",
54
59
  className
55
60
  )}
56
61
  {...props}
@@ -71,7 +76,7 @@ const DialogContent = React.forwardRef<
71
76
  <DialogPrimitive.Content
72
77
  ref={ref}
73
78
  className={cn(
74
- "fixed z-50 grid w-full gap-4 rounded-t-lg bg-level-1 p-4 shadow-lg animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-sm sm:rounded-lg sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0",
79
+ "fixed z-50 grid w-full gap-4 rounded-t-lg bg-level-1 p-6 shadow-lg animate-in data-[state=open]:fade-in-90 data-[state=open]:slide-in-from-bottom-10 sm:max-w-lg sm:rounded-lg sm:zoom-in-90 data-[state=open]:sm:slide-in-from-bottom-0",
75
80
  className
76
81
  )}
77
82
  {...props}
@@ -132,7 +137,7 @@ const DialogDescription = React.forwardRef<
132
137
  >(({ className, ...props }, ref) => (
133
138
  <DialogPrimitive.Description
134
139
  ref={ref}
135
- className={cn("text-sm text-muted", className)}
140
+ className={cn("text-sm text-muted-1", className)}
136
141
  {...props}
137
142
  />
138
143
  ))
@@ -13,7 +13,7 @@ const TabsList = React.forwardRef<
13
13
  <TabsPrimitive.List
14
14
  ref={ref}
15
15
  className={cn(
16
- 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-foreground',
16
+ 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',
17
17
  className
18
18
  )}
19
19
  {...props}
@@ -19,7 +19,7 @@ const TooltipContent = React.forwardRef<
19
19
  ref={ref}
20
20
  sideOffset={sideOffset}
21
21
  className={cn(
22
- 'z-floating overflow-hidden rounded-sm border bg-level-1 px-2 py-1.5 text-sm text-muted shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
22
+ 'z-50 overflow-hidden rounded-md border bg-level-1 px-3 py-1.5 text-sm text-muted-foreground shadow-md animate-in fade-in-50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
23
23
  className
24
24
  )}
25
25
  {...props}
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "accordion",
3
+ "type": "registry:component",
4
+ "description": "A accordion component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/accordion/accordion.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "alert",
3
+ "type": "registry:component",
4
+ "description": "A alert component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/alert/alert.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "avatar",
3
+ "type": "registry:component",
4
+ "description": "A avatar component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/avatar/avatar.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "badge",
3
+ "type": "registry:component",
4
+ "description": "A badge component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/badge/badge.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "button",
3
+ "type": "registry:component",
4
+ "description": "A button component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/button/button.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "card",
3
+ "type": "registry:component",
4
+ "description": "A card component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/card/card.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "checkbox",
3
+ "type": "registry:component",
4
+ "description": "A checkbox component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/checkbox/checkbox.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "default",
3
+ "type": "registry:style",
4
+ "description": "The default style for Hanzo UI components.",
5
+ "files": []
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "dialog",
3
+ "type": "registry:component",
4
+ "description": "A dialog component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/dialog/dialog.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "input",
3
+ "type": "registry:component",
4
+ "description": "A input component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/input/input.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "label",
3
+ "type": "registry:component",
4
+ "description": "A label component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/label/label.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "new-york",
3
+ "type": "registry:style",
4
+ "description": "The new-york style for Hanzo UI components.",
5
+ "files": []
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "popover",
3
+ "type": "registry:component",
4
+ "description": "A popover component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/popover/popover.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "select",
3
+ "type": "registry:component",
4
+ "description": "A select component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/select/select.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "table",
3
+ "type": "registry:component",
4
+ "description": "A table component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/table/table.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "tabs",
3
+ "type": "registry:component",
4
+ "description": "A tabs component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/tabs/tabs.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "toast",
3
+ "type": "registry:component",
4
+ "description": "A toast component for your UI.",
5
+ "files": [
6
+ {
7
+ "path": "default/ui/toast/toast.tsx",
8
+ "type": "registry:component"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,164 @@
1
+ import { registryItemSchema, RegistryItem, Registry } from "."
2
+ import { z } from "zod"
3
+
4
+ const registryCache = new Map<string, Promise<any>>()
5
+
6
+ /**
7
+ * Gets the full registry URL based on the registry name or URL provided
8
+ * @param registry - Registry name, URL, or file path
9
+ * @returns The complete registry URL
10
+ */
11
+ export function getRegistryUrl(registry: string): string {
12
+ // Check if registry is a full URL
13
+ if (registry.startsWith("http")) {
14
+ return registry
15
+ }
16
+
17
+ // Default to Hanzo registry if REGISTRY_BASE_URL is defined, otherwise use shadcn
18
+ const baseUrl = process.env.REGISTRY_BASE_URL || "https://ui.shadcn.com/registry"
19
+
20
+ // Check if registry is a path to a JSON file
21
+ if (registry.endsWith(".json")) {
22
+ return `${baseUrl}/${registry}`
23
+ }
24
+
25
+ // Assume registry is a registry style
26
+ return `${baseUrl}/${registry}/registry.json`
27
+ }
28
+
29
+ /**
30
+ * Fetches a specific registry item by URL
31
+ * @param itemUrl - The URL of the item to fetch
32
+ * @param basePath - Base path for resolving imports
33
+ * @returns The registry item or null if not found
34
+ */
35
+ export async function getRegistryItem(
36
+ itemUrl: string,
37
+ basePath: string
38
+ ): Promise<RegistryItem | null> {
39
+ try {
40
+ const response = await fetch(itemUrl)
41
+
42
+ if (!response.ok) {
43
+ console.error(`Failed to fetch registry item from ${itemUrl}: ${response.status} ${response.statusText}`)
44
+ return null
45
+ }
46
+
47
+ const item = await response.json()
48
+ const validatedItem = registryItemSchema.safeParse(item)
49
+
50
+ if (!validatedItem.success) {
51
+ console.error(`Invalid registry item format: ${JSON.stringify(validatedItem.error)}`)
52
+ return null
53
+ }
54
+
55
+ // Process and resolve file paths
56
+ if (validatedItem.data.files) {
57
+ for (const file of validatedItem.data.files) {
58
+ if (!file.content) {
59
+ continue
60
+ }
61
+
62
+ // If the file has a target, we resolve it from the target
63
+ if (file.target) {
64
+ file.target = resolveImport(file.target, basePath)
65
+ }
66
+ }
67
+ }
68
+
69
+ return validatedItem.data
70
+ } catch (error) {
71
+ console.error(`Error fetching registry item: ${error}`)
72
+ return null
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Resolves an import path relative to a base path
78
+ * @param importPath - The import path to resolve
79
+ * @param basePath - The base path to resolve against
80
+ * @returns The resolved import path
81
+ */
82
+ export function resolveImport(importPath: string, basePath: string): string {
83
+ const importParts = importPath?.split("/")
84
+
85
+ // Check if it's a relative import
86
+ if (importPath.startsWith(".")) {
87
+ return [basePath.replace(/^@/, ""), ...importParts].filter(Boolean).join("/")
88
+ }
89
+
90
+ // Check if it's a scope package
91
+ if (importParts?.[0]?.startsWith("@")) {
92
+ return importPath
93
+ }
94
+
95
+ return importPath
96
+ }
97
+
98
+ /**
99
+ * Fetches registry data from one or more paths
100
+ * @param paths - Array of registry paths to fetch
101
+ * @param options - Options for fetching the registry
102
+ * @returns Array of registry data
103
+ */
104
+ export async function fetchRegistry(
105
+ paths: string[],
106
+ options: { useCache?: boolean } = {}
107
+ ): Promise<Registry[]> {
108
+ options = {
109
+ useCache: true,
110
+ ...options,
111
+ }
112
+
113
+ try {
114
+ const results = await Promise.all(
115
+ paths.map(async (path) => {
116
+ const url = getRegistryUrl(path)
117
+
118
+ // Check cache first if caching is enabled
119
+ if (options.useCache && registryCache.has(url)) {
120
+ return registryCache.get(url)
121
+ }
122
+
123
+ // Store the promise in the cache before awaiting if caching is enabled
124
+ const fetchPromise = (async () => {
125
+ const response = await fetch(url)
126
+
127
+ if (!response.ok) {
128
+ throw new Error(
129
+ `Failed to fetch registry from ${url}. ${response.status} ${response.statusText}`
130
+ )
131
+ }
132
+
133
+ return response.json()
134
+ })()
135
+
136
+ if (options.useCache) {
137
+ registryCache.set(url, fetchPromise)
138
+ }
139
+ return fetchPromise
140
+ })
141
+ )
142
+
143
+ return results
144
+ } catch (error) {
145
+ console.error(`Error fetching registry: ${error}`)
146
+ throw error
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Gets the URL for a specific registry item
152
+ * @param itemName - The name of the registry item
153
+ * @param registryUrl - The base registry URL
154
+ * @returns The URL for the specific registry item
155
+ */
156
+ export function getRegistryItemUrl(itemName: string, registryUrl: string): string {
157
+ const registryBaseUrl = registryUrl.replace(/\/registry\.json$/, "")
158
+ return `${registryBaseUrl}/r/${itemName}.json`
159
+ }
160
+
161
+ // Support CommonJS
162
+ if (typeof module !== 'undefined') {
163
+ module.exports = { getRegistryUrl, getRegistryItem, resolveImport, fetchRegistry, getRegistryItemUrl }
164
+ }
@@ -0,0 +1,60 @@
1
+ import { z } from "zod"
2
+
3
+ // Define the file schema to match shadcn/ui's format
4
+ export const fileSchema = z.object({
5
+ path: z.string(),
6
+ content: z.string().optional(),
7
+ type: z.string(),
8
+ target: z.string().optional(),
9
+ })
10
+
11
+ // Registry item schema aligned with shadcn/ui format
12
+ export const registryItemSchema = z.object({
13
+ name: z.string(),
14
+ type: z.string(),
15
+ description: z.string().optional(),
16
+ author: z.string().optional(),
17
+ dependencies: z.array(z.string()).optional(),
18
+ devDependencies: z.array(z.string()).optional(),
19
+ registryDependencies: z.array(z.string()).optional(),
20
+ files: z.array(fileSchema).optional(),
21
+ meta: z.record(z.any()).optional(),
22
+ title: z.string().optional(),
23
+ cssVars: z.record(z.any()).optional(),
24
+ tailwind: z.record(z.any()).optional(),
25
+ category: z.string().optional(),
26
+ subcategory: z.string().optional(),
27
+ })
28
+
29
+ // Registry schema aligned with shadcn/ui format
30
+ export const registrySchema = z.object({
31
+ $schema: z.string().optional(),
32
+ name: z.string(),
33
+ homepage: z.string().optional(),
34
+ style: z.string().optional(),
35
+ items: z.array(registryItemSchema),
36
+ })
37
+
38
+ // Schema for a registry with full content
39
+ export const registryWithContentSchema = registrySchema.extend({
40
+ items: z.array(
41
+ registryItemSchema.extend({
42
+ files: z.array(
43
+ fileSchema.extend({
44
+ content: z.string(),
45
+ })
46
+ ),
47
+ })
48
+ ),
49
+ })
50
+
51
+ // Type definitions for easier use in TypeScript
52
+ export type RegistryItem = z.infer<typeof registryItemSchema>
53
+ export type Registry = z.infer<typeof registrySchema>
54
+ export type RegistryWithContent = z.infer<typeof registryWithContentSchema>
55
+ export type RegistryFile = z.infer<typeof fileSchema>
56
+
57
+ // Support CommonJS
58
+ if (typeof module !== 'undefined') {
59
+ module.exports = { fileSchema, registryItemSchema, registrySchema, registryWithContentSchema }
60
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "@hanzo/ui-registry",
3
+ "private": true,
4
+ "type": "module",
5
+ "main": "../dist/registry/index.js",
6
+ "types": "../dist/registry/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc"
9
+ }
10
+ }