@hanzo/ui 5.0.1 → 5.0.3

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 (685) hide show
  1. package/CHANGELOG.md +184 -0
  2. package/LICENSE +21 -0
  3. package/README.md +185 -192
  4. package/dist/ai/index.js +53 -0
  5. package/dist/ai/index.js.map +1 -0
  6. package/dist/ai/index.mjs +4 -0
  7. package/dist/ai/index.mjs.map +1 -0
  8. package/dist/blocks/index.js +983 -0
  9. package/dist/blocks/index.js.map +1 -0
  10. package/dist/blocks/index.mjs +945 -0
  11. package/dist/blocks/index.mjs.map +1 -0
  12. package/dist/calendar/index.js +14 -0
  13. package/dist/calendar/index.js.map +1 -0
  14. package/dist/calendar/index.mjs +5 -0
  15. package/dist/calendar/index.mjs.map +1 -0
  16. package/dist/carousel/index.js +220 -0
  17. package/dist/carousel/index.js.map +1 -0
  18. package/dist/carousel/index.mjs +191 -0
  19. package/dist/carousel/index.mjs.map +1 -0
  20. package/dist/charts/index.js +945 -0
  21. package/dist/charts/index.js.map +1 -0
  22. package/dist/charts/index.mjs +901 -0
  23. package/dist/charts/index.mjs.map +1 -0
  24. package/dist/chunk-26T4V5QU.mjs +111 -0
  25. package/dist/chunk-26T4V5QU.mjs.map +1 -0
  26. package/dist/chunk-2A5KXDLJ.js +22 -0
  27. package/dist/chunk-2A5KXDLJ.js.map +1 -0
  28. package/dist/chunk-2CJ4HMF4.js +79 -0
  29. package/dist/chunk-2CJ4HMF4.js.map +1 -0
  30. package/dist/chunk-2OIQKC5E.js +236 -0
  31. package/dist/chunk-2OIQKC5E.js.map +1 -0
  32. package/dist/chunk-2X3KSYBN.js +44 -0
  33. package/dist/chunk-2X3KSYBN.js.map +1 -0
  34. package/dist/chunk-3PBQGYR7.mjs +100 -0
  35. package/dist/chunk-3PBQGYR7.mjs.map +1 -0
  36. package/dist/chunk-3POQQ6L7.js +62 -0
  37. package/dist/chunk-3POQQ6L7.js.map +1 -0
  38. package/dist/chunk-4B47GITH.mjs +28 -0
  39. package/dist/chunk-4B47GITH.mjs.map +1 -0
  40. package/dist/chunk-4BC2OH6B.js +129 -0
  41. package/dist/chunk-4BC2OH6B.js.map +1 -0
  42. package/dist/chunk-5AQSGH4R.js +130 -0
  43. package/dist/chunk-5AQSGH4R.js.map +1 -0
  44. package/dist/chunk-5IHRJFOO.mjs +102 -0
  45. package/dist/chunk-5IHRJFOO.mjs.map +1 -0
  46. package/dist/chunk-5LDGR7YN.mjs +28 -0
  47. package/dist/chunk-5LDGR7YN.mjs.map +1 -0
  48. package/dist/chunk-5MCN3VYM.mjs +23 -0
  49. package/dist/chunk-5MCN3VYM.mjs.map +1 -0
  50. package/dist/chunk-6AVAMRMB.mjs +47 -0
  51. package/dist/chunk-6AVAMRMB.mjs.map +1 -0
  52. package/dist/chunk-6H62JRNM.mjs +120 -0
  53. package/dist/chunk-6H62JRNM.mjs.map +1 -0
  54. package/dist/chunk-6KCII3F6.mjs +126 -0
  55. package/dist/chunk-6KCII3F6.mjs.map +1 -0
  56. package/dist/chunk-7EHB43BJ.js +155 -0
  57. package/dist/chunk-7EHB43BJ.js.map +1 -0
  58. package/dist/chunk-7LRD23Q5.js +191 -0
  59. package/dist/chunk-7LRD23Q5.js.map +1 -0
  60. package/dist/chunk-7SAHKOJG.mjs +45 -0
  61. package/dist/chunk-7SAHKOJG.mjs.map +1 -0
  62. package/dist/chunk-A3D2YZK3.js +50 -0
  63. package/dist/chunk-A3D2YZK3.js.map +1 -0
  64. package/dist/chunk-AL4QFH7V.js +63 -0
  65. package/dist/chunk-AL4QFH7V.js.map +1 -0
  66. package/dist/chunk-B3WFEG6U.js +69 -0
  67. package/dist/chunk-B3WFEG6U.js.map +1 -0
  68. package/dist/chunk-BDZQJ6GK.js +242 -0
  69. package/dist/chunk-BDZQJ6GK.js.map +1 -0
  70. package/dist/chunk-BRWFYRGX.js +61 -0
  71. package/dist/chunk-BRWFYRGX.js.map +1 -0
  72. package/dist/chunk-C5DNTLBO.js +53 -0
  73. package/dist/chunk-C5DNTLBO.js.map +1 -0
  74. package/dist/chunk-CRALRACO.js +54 -0
  75. package/dist/chunk-CRALRACO.js.map +1 -0
  76. package/dist/chunk-CVACQJRM.js +149 -0
  77. package/dist/chunk-CVACQJRM.js.map +1 -0
  78. package/dist/chunk-DEIUKFPZ.mjs +63 -0
  79. package/dist/chunk-DEIUKFPZ.mjs.map +1 -0
  80. package/dist/chunk-DN2AEEA2.js +13 -0
  81. package/dist/chunk-DN2AEEA2.js.map +1 -0
  82. package/dist/chunk-DTNRWU4B.mjs +35 -0
  83. package/dist/chunk-DTNRWU4B.mjs.map +1 -0
  84. package/dist/chunk-DXIUEWRJ.mjs +31 -0
  85. package/dist/chunk-DXIUEWRJ.mjs.map +1 -0
  86. package/dist/chunk-DYFV66JX.mjs +54 -0
  87. package/dist/chunk-DYFV66JX.mjs.map +1 -0
  88. package/dist/chunk-F3WMAHXV.mjs +86 -0
  89. package/dist/chunk-F3WMAHXV.mjs.map +1 -0
  90. package/dist/chunk-F4RWPBBB.js +79 -0
  91. package/dist/chunk-F4RWPBBB.js.map +1 -0
  92. package/dist/chunk-FEGAPM6U.js +194 -0
  93. package/dist/chunk-FEGAPM6U.js.map +1 -0
  94. package/dist/chunk-G5TS56PW.mjs +160 -0
  95. package/dist/chunk-G5TS56PW.mjs.map +1 -0
  96. package/dist/chunk-GG6VGOEN.mjs +590 -0
  97. package/dist/chunk-GG6VGOEN.mjs.map +1 -0
  98. package/dist/chunk-GLAMGK32.mjs +54 -0
  99. package/dist/chunk-GLAMGK32.mjs.map +1 -0
  100. package/dist/chunk-GNMMUJXD.mjs +200 -0
  101. package/dist/chunk-GNMMUJXD.mjs.map +1 -0
  102. package/dist/chunk-GNPBULLS.mjs +600 -0
  103. package/dist/chunk-GNPBULLS.mjs.map +1 -0
  104. package/dist/chunk-GTE2DELE.js +65 -0
  105. package/dist/chunk-GTE2DELE.js.map +1 -0
  106. package/dist/chunk-GUQAFFTH.js +94 -0
  107. package/dist/chunk-GUQAFFTH.js.map +1 -0
  108. package/dist/chunk-H5VOYZHT.mjs +34 -0
  109. package/dist/chunk-H5VOYZHT.mjs.map +1 -0
  110. package/dist/chunk-HR6PBOGG.mjs +59 -0
  111. package/dist/chunk-HR6PBOGG.mjs.map +1 -0
  112. package/dist/chunk-HROONQS3.js +55 -0
  113. package/dist/chunk-HROONQS3.js.map +1 -0
  114. package/dist/chunk-IAO7SOQ3.mjs +56 -0
  115. package/dist/chunk-IAO7SOQ3.mjs.map +1 -0
  116. package/dist/chunk-K2QKU3K6.mjs +40 -0
  117. package/dist/chunk-K2QKU3K6.mjs.map +1 -0
  118. package/dist/chunk-KEUZZCCP.js +53 -0
  119. package/dist/chunk-KEUZZCCP.js.map +1 -0
  120. package/dist/chunk-KJXSLTG7.mjs +73 -0
  121. package/dist/chunk-KJXSLTG7.mjs.map +1 -0
  122. package/dist/chunk-L5AFUCVH.mjs +26 -0
  123. package/dist/chunk-L5AFUCVH.mjs.map +1 -0
  124. package/dist/chunk-LB3I52KZ.mjs +42 -0
  125. package/dist/chunk-LB3I52KZ.mjs.map +1 -0
  126. package/dist/chunk-LN75MJQ2.js +71 -0
  127. package/dist/chunk-LN75MJQ2.js.map +1 -0
  128. package/dist/chunk-LRBOFJUV.js +60 -0
  129. package/dist/chunk-LRBOFJUV.js.map +1 -0
  130. package/dist/chunk-MMNYRBOU.js +157 -0
  131. package/dist/chunk-MMNYRBOU.js.map +1 -0
  132. package/dist/chunk-MO65YF6P.js +236 -0
  133. package/dist/chunk-MO65YF6P.js.map +1 -0
  134. package/dist/chunk-N4KHP5FC.mjs +33 -0
  135. package/dist/chunk-N4KHP5FC.mjs.map +1 -0
  136. package/dist/chunk-NP2J7AB7.mjs +121 -0
  137. package/dist/chunk-NP2J7AB7.mjs.map +1 -0
  138. package/dist/chunk-OLR6SGYO.js +57 -0
  139. package/dist/chunk-OLR6SGYO.js.map +1 -0
  140. package/dist/chunk-ON7NQ4DY.js +21 -0
  141. package/dist/chunk-ON7NQ4DY.js.map +1 -0
  142. package/dist/chunk-PE3VFRLV.mjs +198 -0
  143. package/dist/chunk-PE3VFRLV.mjs.map +1 -0
  144. package/dist/chunk-Q7LOOIE5.mjs +8 -0
  145. package/dist/chunk-Q7LOOIE5.mjs.map +1 -0
  146. package/dist/chunk-QFA6U75G.mjs +51 -0
  147. package/dist/chunk-QFA6U75G.mjs.map +1 -0
  148. package/dist/chunk-QJQPT4WX.js +638 -0
  149. package/dist/chunk-QJQPT4WX.js.map +1 -0
  150. package/dist/chunk-QKHQPBSR.mjs +20 -0
  151. package/dist/chunk-QKHQPBSR.mjs.map +1 -0
  152. package/dist/chunk-SJD4XRFJ.mjs +141 -0
  153. package/dist/chunk-SJD4XRFJ.mjs.map +1 -0
  154. package/dist/chunk-SOOJLU4C.mjs +19 -0
  155. package/dist/chunk-SOOJLU4C.mjs.map +1 -0
  156. package/dist/chunk-T66B5IM5.js +51 -0
  157. package/dist/chunk-T66B5IM5.js.map +1 -0
  158. package/dist/chunk-T7RPZDO4.js +645 -0
  159. package/dist/chunk-T7RPZDO4.js.map +1 -0
  160. package/dist/chunk-TGRMDGTV.mjs +38 -0
  161. package/dist/chunk-TGRMDGTV.mjs.map +1 -0
  162. package/dist/chunk-TH2UKMCO.mjs +11 -0
  163. package/dist/chunk-TH2UKMCO.mjs.map +1 -0
  164. package/dist/chunk-TMV45OKE.mjs +113 -0
  165. package/dist/chunk-TMV45OKE.mjs.map +1 -0
  166. package/dist/chunk-TUJ7EVEK.js +171 -0
  167. package/dist/chunk-TUJ7EVEK.js.map +1 -0
  168. package/dist/chunk-ULNWDOI7.js +122 -0
  169. package/dist/chunk-ULNWDOI7.js.map +1 -0
  170. package/dist/chunk-UNUTTHCH.mjs +210 -0
  171. package/dist/chunk-UNUTTHCH.mjs.map +1 -0
  172. package/dist/chunk-VJMI6BG4.mjs +10 -0
  173. package/dist/chunk-VJMI6BG4.mjs.map +1 -0
  174. package/dist/chunk-VZVOB5MG.mjs +26 -0
  175. package/dist/chunk-VZVOB5MG.mjs.map +1 -0
  176. package/dist/chunk-WD67O22C.js +50 -0
  177. package/dist/chunk-WD67O22C.js.map +1 -0
  178. package/dist/chunk-WYPMLIJN.js +53 -0
  179. package/dist/chunk-WYPMLIJN.js.map +1 -0
  180. package/dist/chunk-X32I34NH.js +109 -0
  181. package/dist/chunk-X32I34NH.js.map +1 -0
  182. package/dist/chunk-X5MOZ3YL.js +65 -0
  183. package/dist/chunk-X5MOZ3YL.js.map +1 -0
  184. package/dist/chunk-Y4JVIPQZ.mjs +31 -0
  185. package/dist/chunk-Y4JVIPQZ.mjs.map +1 -0
  186. package/dist/chunk-Y6WOV2LZ.js +95 -0
  187. package/dist/chunk-Y6WOV2LZ.js.map +1 -0
  188. package/dist/chunk-YAEN5SCU.mjs +41 -0
  189. package/dist/chunk-YAEN5SCU.mjs.map +1 -0
  190. package/dist/chunk-YH6XDF3N.js +121 -0
  191. package/dist/chunk-YH6XDF3N.js.map +1 -0
  192. package/dist/chunk-YJKA4D75.mjs +124 -0
  193. package/dist/chunk-YJKA4D75.mjs.map +1 -0
  194. package/dist/chunk-ZANAF7WB.js +88 -0
  195. package/dist/chunk-ZANAF7WB.js.map +1 -0
  196. package/dist/chunk-ZDBWNPLO.js +30 -0
  197. package/dist/chunk-ZDBWNPLO.js.map +1 -0
  198. package/dist/chunk-ZDT2IOK2.js +56 -0
  199. package/dist/chunk-ZDT2IOK2.js.map +1 -0
  200. package/dist/chunk-ZKGVLTSI.js +25 -0
  201. package/dist/chunk-ZKGVLTSI.js.map +1 -0
  202. package/dist/chunk-ZLELESO7.js +34 -0
  203. package/dist/chunk-ZLELESO7.js.map +1 -0
  204. package/dist/chunk-ZUFUEQTX.mjs +157 -0
  205. package/dist/chunk-ZUFUEQTX.mjs.map +1 -0
  206. package/dist/chunk-ZZZWRQQE.mjs +42 -0
  207. package/dist/chunk-ZZZWRQQE.mjs.map +1 -0
  208. package/dist/command/index.js +138 -0
  209. package/dist/command/index.js.map +1 -0
  210. package/dist/command/index.mjs +128 -0
  211. package/dist/command/index.mjs.map +1 -0
  212. package/dist/components/accordion.js +25 -0
  213. package/dist/components/accordion.js.map +1 -0
  214. package/dist/components/accordion.mjs +4 -0
  215. package/dist/components/accordion.mjs.map +1 -0
  216. package/dist/components/alert.js +21 -0
  217. package/dist/components/alert.js.map +1 -0
  218. package/dist/components/alert.mjs +4 -0
  219. package/dist/components/alert.mjs.map +1 -0
  220. package/dist/components/aspect-ratio.js +12 -0
  221. package/dist/components/aspect-ratio.js.map +1 -0
  222. package/dist/components/aspect-ratio.mjs +3 -0
  223. package/dist/components/aspect-ratio.mjs.map +1 -0
  224. package/dist/components/avatar.js +21 -0
  225. package/dist/components/avatar.js.map +1 -0
  226. package/dist/components/avatar.mjs +4 -0
  227. package/dist/components/avatar.mjs.map +1 -0
  228. package/dist/components/badge.js +17 -0
  229. package/dist/components/badge.js.map +1 -0
  230. package/dist/components/badge.mjs +4 -0
  231. package/dist/components/badge.mjs.map +1 -0
  232. package/dist/components/breadcrumb.js +37 -0
  233. package/dist/components/breadcrumb.js.map +1 -0
  234. package/dist/components/breadcrumb.mjs +4 -0
  235. package/dist/components/breadcrumb.mjs.map +1 -0
  236. package/dist/components/button.js +17 -0
  237. package/dist/components/button.js.map +1 -0
  238. package/dist/components/button.mjs +4 -0
  239. package/dist/components/button.mjs.map +1 -0
  240. package/dist/components/card.js +37 -0
  241. package/dist/components/card.js.map +1 -0
  242. package/dist/components/card.mjs +4 -0
  243. package/dist/components/card.mjs.map +1 -0
  244. package/dist/components/checkbox.js +13 -0
  245. package/dist/components/checkbox.js.map +1 -0
  246. package/dist/components/checkbox.mjs +4 -0
  247. package/dist/components/checkbox.mjs.map +1 -0
  248. package/dist/components/collapsible.js +20 -0
  249. package/dist/components/collapsible.js.map +1 -0
  250. package/dist/components/collapsible.mjs +3 -0
  251. package/dist/components/collapsible.mjs.map +1 -0
  252. package/dist/components/context-menu.js +69 -0
  253. package/dist/components/context-menu.js.map +1 -0
  254. package/dist/components/context-menu.mjs +4 -0
  255. package/dist/components/context-menu.mjs.map +1 -0
  256. package/dist/components/dialog.js +49 -0
  257. package/dist/components/dialog.js.map +1 -0
  258. package/dist/components/dialog.mjs +4 -0
  259. package/dist/components/dialog.mjs.map +1 -0
  260. package/dist/components/drawer.js +49 -0
  261. package/dist/components/drawer.js.map +1 -0
  262. package/dist/components/drawer.mjs +4 -0
  263. package/dist/components/drawer.mjs.map +1 -0
  264. package/dist/components/dropdown-menu.js +69 -0
  265. package/dist/components/dropdown-menu.js.map +1 -0
  266. package/dist/components/dropdown-menu.mjs +4 -0
  267. package/dist/components/dropdown-menu.mjs.map +1 -0
  268. package/dist/components/form.js +42 -0
  269. package/dist/components/form.js.map +1 -0
  270. package/dist/components/form.mjs +5 -0
  271. package/dist/components/form.mjs.map +1 -0
  272. package/dist/components/hover-card.js +21 -0
  273. package/dist/components/hover-card.js.map +1 -0
  274. package/dist/components/hover-card.mjs +4 -0
  275. package/dist/components/hover-card.mjs.map +1 -0
  276. package/dist/components/index.js +1047 -0
  277. package/dist/components/index.js.map +1 -0
  278. package/dist/components/index.mjs +46 -0
  279. package/dist/components/index.mjs.map +1 -0
  280. package/dist/components/input-otp.js +25 -0
  281. package/dist/components/input-otp.js.map +1 -0
  282. package/dist/components/input-otp.mjs +4 -0
  283. package/dist/components/input-otp.mjs.map +1 -0
  284. package/dist/components/input.js +13 -0
  285. package/dist/components/input.js.map +1 -0
  286. package/dist/components/input.mjs +4 -0
  287. package/dist/components/input.mjs.map +1 -0
  288. package/dist/components/label.js +13 -0
  289. package/dist/components/label.js.map +1 -0
  290. package/dist/components/label.mjs +4 -0
  291. package/dist/components/label.mjs.map +1 -0
  292. package/dist/components/menubar.js +73 -0
  293. package/dist/components/menubar.js.map +1 -0
  294. package/dist/components/menubar.mjs +4 -0
  295. package/dist/components/menubar.mjs.map +1 -0
  296. package/dist/components/navigation-menu.js +45 -0
  297. package/dist/components/navigation-menu.js.map +1 -0
  298. package/dist/components/navigation-menu.mjs +4 -0
  299. package/dist/components/navigation-menu.mjs.map +1 -0
  300. package/dist/components/pagination.js +38 -0
  301. package/dist/components/pagination.js.map +1 -0
  302. package/dist/components/pagination.mjs +5 -0
  303. package/dist/components/pagination.mjs.map +1 -0
  304. package/dist/components/popover.js +25 -0
  305. package/dist/components/popover.js.map +1 -0
  306. package/dist/components/popover.mjs +4 -0
  307. package/dist/components/popover.mjs.map +1 -0
  308. package/dist/components/progress.js +13 -0
  309. package/dist/components/progress.js.map +1 -0
  310. package/dist/components/progress.mjs +4 -0
  311. package/dist/components/progress.mjs.map +1 -0
  312. package/dist/components/radio-group.js +17 -0
  313. package/dist/components/radio-group.js.map +1 -0
  314. package/dist/components/radio-group.mjs +4 -0
  315. package/dist/components/radio-group.mjs.map +1 -0
  316. package/dist/components/resizable.js +21 -0
  317. package/dist/components/resizable.js.map +1 -0
  318. package/dist/components/resizable.mjs +4 -0
  319. package/dist/components/resizable.mjs.map +1 -0
  320. package/dist/components/scroll-area.js +17 -0
  321. package/dist/components/scroll-area.js.map +1 -0
  322. package/dist/components/scroll-area.mjs +4 -0
  323. package/dist/components/scroll-area.mjs.map +1 -0
  324. package/dist/components/select.js +49 -0
  325. package/dist/components/select.js.map +1 -0
  326. package/dist/components/select.mjs +4 -0
  327. package/dist/components/select.mjs.map +1 -0
  328. package/dist/components/separator.js +13 -0
  329. package/dist/components/separator.js.map +1 -0
  330. package/dist/components/separator.mjs +4 -0
  331. package/dist/components/separator.mjs.map +1 -0
  332. package/dist/components/sheet.js +49 -0
  333. package/dist/components/sheet.js.map +1 -0
  334. package/dist/components/sheet.mjs +4 -0
  335. package/dist/components/sheet.mjs.map +1 -0
  336. package/dist/components/sidebar.js +111 -0
  337. package/dist/components/sidebar.js.map +1 -0
  338. package/dist/components/sidebar.mjs +10 -0
  339. package/dist/components/sidebar.mjs.map +1 -0
  340. package/dist/components/skeleton.js +13 -0
  341. package/dist/components/skeleton.js.map +1 -0
  342. package/dist/components/skeleton.mjs +4 -0
  343. package/dist/components/skeleton.mjs.map +1 -0
  344. package/dist/components/slider.js +13 -0
  345. package/dist/components/slider.js.map +1 -0
  346. package/dist/components/slider.mjs +4 -0
  347. package/dist/components/slider.mjs.map +1 -0
  348. package/dist/components/switch.js +13 -0
  349. package/dist/components/switch.js.map +1 -0
  350. package/dist/components/switch.mjs +4 -0
  351. package/dist/components/switch.mjs.map +1 -0
  352. package/dist/components/table.js +41 -0
  353. package/dist/components/table.js.map +1 -0
  354. package/dist/components/table.mjs +4 -0
  355. package/dist/components/table.mjs.map +1 -0
  356. package/dist/components/tabs.js +25 -0
  357. package/dist/components/tabs.js.map +1 -0
  358. package/dist/components/tabs.mjs +4 -0
  359. package/dist/components/tabs.mjs.map +1 -0
  360. package/dist/components/textarea.js +13 -0
  361. package/dist/components/textarea.js.map +1 -0
  362. package/dist/components/textarea.mjs +4 -0
  363. package/dist/components/textarea.mjs.map +1 -0
  364. package/dist/components/toast.js +37 -0
  365. package/dist/components/toast.js.map +1 -0
  366. package/dist/components/toast.mjs +4 -0
  367. package/dist/components/toast.mjs.map +1 -0
  368. package/dist/components/toggle-group.js +18 -0
  369. package/dist/components/toggle-group.js.map +1 -0
  370. package/dist/components/toggle-group.mjs +5 -0
  371. package/dist/components/toggle-group.mjs.map +1 -0
  372. package/dist/components/toggle.js +17 -0
  373. package/dist/components/toggle.js.map +1 -0
  374. package/dist/components/toggle.mjs +4 -0
  375. package/dist/components/toggle.mjs.map +1 -0
  376. package/dist/components/tooltip.js +25 -0
  377. package/dist/components/tooltip.js.map +1 -0
  378. package/dist/components/tooltip.mjs +4 -0
  379. package/dist/components/tooltip.mjs.map +1 -0
  380. package/dist/effects/index.js +162 -0
  381. package/dist/effects/index.js.map +1 -0
  382. package/dist/effects/index.mjs +156 -0
  383. package/dist/effects/index.mjs.map +1 -0
  384. package/dist/index.js +1089 -9070
  385. package/dist/index.js.map +1 -1
  386. package/dist/index.mjs +45 -8695
  387. package/dist/index.mjs.map +1 -1
  388. package/dist/lib/utils.js +12 -0
  389. package/dist/lib/utils.js.map +1 -0
  390. package/dist/lib/utils.mjs +3 -0
  391. package/dist/lib/utils.mjs.map +1 -0
  392. package/dist/markdown/index.js +669 -0
  393. package/dist/markdown/index.js.map +1 -0
  394. package/dist/markdown/index.mjs +635 -0
  395. package/dist/markdown/index.mjs.map +1 -0
  396. package/dist/qr/index.js +101 -0
  397. package/dist/qr/index.js.map +1 -0
  398. package/dist/qr/index.mjs +98 -0
  399. package/dist/qr/index.mjs.map +1 -0
  400. package/dist/upload/index.js +166 -0
  401. package/dist/upload/index.js.map +1 -0
  402. package/dist/upload/index.mjs +163 -0
  403. package/dist/upload/index.mjs.map +1 -0
  404. package/package.json +153 -272
  405. package/publish.sh +27 -0
  406. package/assets/ai-icons.tsx +0 -207
  407. package/assets/crypto.tsx +0 -33
  408. package/assets/file-type-icon.tsx +0 -66
  409. package/assets/file.tsx +0 -45
  410. package/assets/general.tsx +0 -2318
  411. package/assets/hanzo-logo.svg +0 -9
  412. package/assets/hanzo-logo.tsx +0 -17
  413. package/assets/index.ts +0 -122
  414. package/assets/index.tsx +0 -4
  415. package/assets/llm-provider.tsx +0 -1094
  416. package/bin/cli.js +0 -100
  417. package/bin/create-registry.js +0 -108
  418. package/bin/mcp.js +0 -403
  419. package/bin/npx-registry-mcp.js +0 -15
  420. package/bin/registry-mcp-wrapper.sh +0 -19
  421. package/bin/registry-mcp.js +0 -100
  422. package/bin/start-mcp-server.sh +0 -22
  423. package/bin/test-mcp.sh +0 -52
  424. package/bin/update-registry.js +0 -196
  425. package/blocks/auth/index.ts +0 -6
  426. package/blocks/auth/login-2fa.tsx +0 -165
  427. package/blocks/auth/login-basic.tsx +0 -94
  428. package/blocks/auth/login-social.tsx +0 -148
  429. package/blocks/auth/magic-link.tsx +0 -129
  430. package/blocks/auth/password-reset.tsx +0 -97
  431. package/blocks/auth/signup.tsx +0 -157
  432. package/blocks/components/accordian-block.tsx +0 -48
  433. package/blocks/components/block-component-props.ts +0 -11
  434. package/blocks/components/bullet-cards-block.tsx +0 -46
  435. package/blocks/components/card-block/index.tsx +0 -171
  436. package/blocks/components/card-block/link-out-button.tsx +0 -20
  437. package/blocks/components/card-block/util.ts +0 -28
  438. package/blocks/components/carte-blanche-block/index.tsx +0 -127
  439. package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
  440. package/blocks/components/content.tsx +0 -70
  441. package/blocks/components/cta-block.tsx +0 -115
  442. package/blocks/components/enh-heading-block.tsx +0 -204
  443. package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
  444. package/blocks/components/grid-block/index.tsx +0 -83
  445. package/blocks/components/grid-block/mutator-registry.ts +0 -10
  446. package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
  447. package/blocks/components/group-block.tsx +0 -83
  448. package/blocks/components/heading-block.tsx +0 -88
  449. package/blocks/components/image-block.tsx +0 -111
  450. package/blocks/components/index.ts +0 -30
  451. package/blocks/components/screenful-block/content.tsx +0 -123
  452. package/blocks/components/screenful-block/index.tsx +0 -107
  453. package/blocks/components/screenful-block/poster-background.tsx +0 -34
  454. package/blocks/components/screenful-block/video-background.tsx +0 -45
  455. package/blocks/components/space-block.tsx +0 -66
  456. package/blocks/components/video-block.tsx +0 -138
  457. package/blocks/data-display/activity-feed.tsx +0 -242
  458. package/blocks/data-display/data-table.tsx +0 -235
  459. package/blocks/data-display/stats-grid.tsx +0 -194
  460. package/blocks/def/accordian-block.ts +0 -14
  461. package/blocks/def/block.ts +0 -7
  462. package/blocks/def/bullet-cards-block.ts +0 -22
  463. package/blocks/def/card-block.ts +0 -22
  464. package/blocks/def/carte-blanche-block.ts +0 -21
  465. package/blocks/def/cta-block.ts +0 -19
  466. package/blocks/def/element-block.ts +0 -11
  467. package/blocks/def/enh-heading-block.ts +0 -44
  468. package/blocks/def/grid-block.ts +0 -16
  469. package/blocks/def/group-block.ts +0 -11
  470. package/blocks/def/heading-block.ts +0 -15
  471. package/blocks/def/image-block.ts +0 -31
  472. package/blocks/def/index.ts +0 -35
  473. package/blocks/def/screenful-block.ts +0 -54
  474. package/blocks/def/space-block.ts +0 -64
  475. package/blocks/def/video-block.ts +0 -9
  476. package/blocks/ecommerce/checkout.tsx +0 -242
  477. package/blocks/ecommerce/index.ts +0 -7
  478. package/blocks/ecommerce/product-detail.tsx +0 -257
  479. package/blocks/ecommerce/product-grid.tsx +0 -148
  480. package/blocks/ecommerce/shopping-cart.tsx +0 -181
  481. package/blocks/index.ts +0 -2
  482. package/blocks/marketing/cta-section.tsx +0 -207
  483. package/blocks/marketing/faq.tsx +0 -159
  484. package/blocks/marketing/features-grid.tsx +0 -156
  485. package/blocks/marketing/hero-section.tsx +0 -192
  486. package/blocks/marketing/index.ts +0 -6
  487. package/blocks/marketing/pricing-table.tsx +0 -121
  488. package/blocks/marketing/testimonials.tsx +0 -196
  489. package/components/index.ts +0 -9
  490. package/dist/tailwind.js +0 -2025
  491. package/dist/tailwind.js.map +0 -1
  492. package/dist/tailwind.mjs +0 -2013
  493. package/dist/tailwind.mjs.map +0 -1
  494. package/dist/types.js +0 -59
  495. package/dist/types.js.map +0 -1
  496. package/dist/types.mjs +0 -53
  497. package/dist/types.mjs.map +0 -1
  498. package/dist/utils.js +0 -30
  499. package/dist/utils.js.map +0 -1
  500. package/dist/utils.mjs +0 -26
  501. package/dist/utils.mjs.map +0 -1
  502. package/frameworks/core/index.ts +0 -6
  503. package/frameworks/core/utils/index.ts +0 -64
  504. package/frameworks/react/components/button.tsx +0 -26
  505. package/frameworks/react/components/index.ts +0 -5
  506. package/frameworks/react/hooks/index.ts +0 -5
  507. package/frameworks/react/index.ts +0 -9
  508. package/frameworks/react/package.json +0 -8
  509. package/frameworks/react/utils/index.ts +0 -2
  510. package/frameworks/react-native/index.ts +0 -9
  511. package/frameworks/react-native/package.json +0 -8
  512. package/frameworks/registry.json +0 -371
  513. package/frameworks/setup.sh +0 -69
  514. package/frameworks/svelte/index.ts +0 -9
  515. package/frameworks/svelte/package.json +0 -8
  516. package/frameworks/tracker.json +0 -1854
  517. package/frameworks/vue/index.ts +0 -9
  518. package/frameworks/vue/package.json +0 -8
  519. package/helpers/file.ts +0 -33
  520. package/helpers/memoization.ts +0 -40
  521. package/primitives/accordion.tsx +0 -74
  522. package/primitives/action-button.tsx +0 -42
  523. package/primitives/alert-dialog.tsx +0 -185
  524. package/primitives/alert.tsx +0 -74
  525. package/primitives/apply-typography.tsx +0 -55
  526. package/primitives/aspect-ratio.tsx +0 -5
  527. package/primitives/avatar.tsx +0 -57
  528. package/primitives/background-beams.tsx +0 -142
  529. package/primitives/badge.tsx +0 -45
  530. package/primitives/breadcrumb.tsx +0 -130
  531. package/primitives/breakpoint-indicator.tsx +0 -19
  532. package/primitives/button.tsx +0 -72
  533. package/primitives/calendar.tsx +0 -72
  534. package/primitives/card.tsx +0 -97
  535. package/primitives/carousel.tsx +0 -238
  536. package/primitives/chat/chat-input-area.tsx +0 -88
  537. package/primitives/chat/chat-input.tsx +0 -71
  538. package/primitives/chat/files-preview.tsx +0 -331
  539. package/primitives/chat/index.ts +0 -6
  540. package/primitives/chat/json-form.tsx +0 -8
  541. package/primitives/chat/message-list.tsx +0 -308
  542. package/primitives/chat/message.tsx +0 -569
  543. package/primitives/chat/sqlite-preview.tsx +0 -215
  544. package/primitives/checkbox.tsx +0 -32
  545. package/primitives/collapsible.tsx +0 -9
  546. package/primitives/combobox.tsx +0 -239
  547. package/primitives/command.tsx +0 -151
  548. package/primitives/context-menu.tsx +0 -206
  549. package/primitives/copy-to-clipboard-icon.tsx +0 -60
  550. package/primitives/dialog-video-controller.tsx +0 -38
  551. package/primitives/dialog.tsx +0 -128
  552. package/primitives/dot-pattern.tsx +0 -57
  553. package/primitives/dots-loader.tsx +0 -13
  554. package/primitives/drawer.tsx +0 -113
  555. package/primitives/dropdown-menu.tsx +0 -199
  556. package/primitives/error-message.tsx +0 -19
  557. package/primitives/file-uploader.tsx +0 -203
  558. package/primitives/form.tsx +0 -185
  559. package/primitives/hover-card.tsx +0 -28
  560. package/primitives/icons/github.tsx +0 -14
  561. package/primitives/icons/index.ts +0 -18
  562. package/primitives/icons/youtube-logo.tsx +0 -59
  563. package/primitives/index-client.ts +0 -4
  564. package/primitives/index-common.ts +0 -304
  565. package/primitives/index-next.ts +0 -4
  566. package/primitives/input-otp.tsx +0 -65
  567. package/primitives/input.tsx +0 -128
  568. package/primitives/label.tsx +0 -21
  569. package/primitives/list-adaptor.ts +0 -12
  570. package/primitives/list-box.tsx +0 -74
  571. package/primitives/loading-spinner.tsx +0 -33
  572. package/primitives/markdown-preview.tsx +0 -612
  573. package/primitives/mermaid.tsx +0 -191
  574. package/primitives/navigation-menu.tsx +0 -147
  575. package/primitives/next/image.tsx +0 -91
  576. package/primitives/next/index.ts +0 -7
  577. package/primitives/next/inline-icon.tsx +0 -36
  578. package/primitives/next/link-element.tsx +0 -109
  579. package/primitives/next/mdx-link.tsx +0 -22
  580. package/primitives/next/media-stack.tsx +0 -52
  581. package/primitives/next/nav-items.tsx +0 -45
  582. package/primitives/next/youtube-embed.tsx +0 -83
  583. package/primitives/pagination.tsx +0 -117
  584. package/primitives/popover.tsx +0 -34
  585. package/primitives/pretty-json-print.tsx +0 -28
  586. package/primitives/progress.tsx +0 -27
  587. package/primitives/prompt-textarea.tsx +0 -72
  588. package/primitives/qr-code.tsx +0 -112
  589. package/primitives/radio-group.tsx +0 -42
  590. package/primitives/resizable.tsx +0 -47
  591. package/primitives/scroll-area.tsx +0 -57
  592. package/primitives/search-input.tsx +0 -66
  593. package/primitives/select.tsx +0 -122
  594. package/primitives/separator.tsx +0 -26
  595. package/primitives/sheet.tsx +0 -139
  596. package/primitives/skeleton.tsx +0 -18
  597. package/primitives/slider.tsx +0 -63
  598. package/primitives/sonner.tsx +0 -35
  599. package/primitives/step-indicator.tsx +0 -69
  600. package/primitives/stepper.tsx +0 -272
  601. package/primitives/switch.tsx +0 -27
  602. package/primitives/table.tsx +0 -105
  603. package/primitives/tabs.tsx +0 -50
  604. package/primitives/text-area.tsx +0 -26
  605. package/primitives/text-link.tsx +0 -27
  606. package/primitives/textarea.tsx +0 -64
  607. package/primitives/textfield.tsx +0 -78
  608. package/primitives/toast.tsx +0 -30
  609. package/primitives/toggle-group.tsx +0 -63
  610. package/primitives/toggle.tsx +0 -44
  611. package/primitives/tooltip.tsx +0 -47
  612. package/primitives/video-player.tsx +0 -23
  613. package/src/button.ts +0 -1
  614. package/src/hooks/index.ts +0 -7
  615. package/src/hooks/use-click-away.ts +0 -31
  616. package/src/hooks/use-combined-refs.ts +0 -22
  617. package/src/hooks/use-copy-clipboard.ts +0 -30
  618. package/src/hooks/use-debounce.ts +0 -17
  619. package/src/hooks/use-fill-ids.ts +0 -25
  620. package/src/hooks/use-map.ts +0 -26
  621. package/src/hooks/use-measure.ts +0 -42
  622. package/src/hooks/use-reverse-video-playback.ts +0 -43
  623. package/src/hooks/use-scroll-restoration.ts +0 -50
  624. package/src/index-lean.ts +0 -87
  625. package/src/index.ts +0 -54
  626. package/src/mcp/README.md +0 -141
  627. package/src/mcp/enhanced-server.ts +0 -1208
  628. package/src/mcp/index.ts +0 -518
  629. package/src/mcp/package.json +0 -10
  630. package/src/registry/api.ts +0 -164
  631. package/src/registry/index.ts +0 -60
  632. package/src/registry/package.json +0 -10
  633. package/src/utils.ts +0 -19
  634. package/style/drawer.css +0 -163
  635. package/style/globals.css +0 -13
  636. package/style/hanzo-common.css +0 -31
  637. package/style/hanzo-default-colors.css +0 -82
  638. package/style/theme-provider.tsx +0 -20
  639. package/tailwind/colors.tailwind.js +0 -53
  640. package/tailwind/fontFamily.tailwind.ts +0 -7
  641. package/tailwind/fontSize.tailwind.ts +0 -13
  642. package/tailwind/index.ts +0 -7
  643. package/tailwind/safelist.tailwind.js +0 -26
  644. package/tailwind/screens.tailwind.js +0 -8
  645. package/tailwind/spacing.tailwind.js +0 -65
  646. package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
  647. package/tailwind/tailwind.config.hanzo-preset.js +0 -915
  648. package/tailwind/tw-font-desc.ts +0 -15
  649. package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
  650. package/tailwind/typo-plugin/index.d.ts +0 -9
  651. package/tailwind/typo-plugin/index.js +0 -141
  652. package/tailwind/typo-plugin/utils.js +0 -60
  653. package/tailwind/typography-test.mdx +0 -35
  654. package/tailwind/z-index.tailwind.js +0 -71
  655. package/types/animation-def.ts +0 -3
  656. package/types/breakpoints.ts +0 -11
  657. package/types/bullet-item.ts +0 -10
  658. package/types/button-def.ts +0 -39
  659. package/types/dimensions.ts +0 -8
  660. package/types/grid-def.ts +0 -56
  661. package/types/image-def.ts +0 -32
  662. package/types/index.ts +0 -30
  663. package/types/link-def.ts +0 -56
  664. package/types/media-stack-def.ts +0 -31
  665. package/types/t-shirt-size.ts +0 -5
  666. package/types/tshirt-dimensions.ts +0 -20
  667. package/types/video-def.ts +0 -25
  668. package/util/blob.ts +0 -33
  669. package/util/copy-to-clipboard.ts +0 -17
  670. package/util/create-shadow-root.ts +0 -22
  671. package/util/date.ts +0 -84
  672. package/util/debounce.ts +0 -11
  673. package/util/file.ts +0 -15
  674. package/util/format-and-abbreviate-as-currency.ts +0 -125
  675. package/util/format-text.ts +0 -34
  676. package/util/format-to-max-char.ts +0 -68
  677. package/util/index-client.ts +0 -3
  678. package/util/index.ts +0 -112
  679. package/util/number-abbreviate.ts +0 -49
  680. package/util/specifier.ts +0 -43
  681. package/util/spread-to-transform.ts +0 -25
  682. package/util/step-animation.ts +0 -90
  683. package/util/timing.ts +0 -3
  684. package/util/toasts.tsx +0 -17
  685. package/util/two-way-map.ts +0 -19
@@ -1,1208 +0,0 @@
1
- import { registrySchema, Registry, RegistryItem } from "../registry"
2
- import { fetchRegistry, getRegistryItem, getRegistryItemUrl } from "../registry/api"
3
- import { Server } from "@modelcontextprotocol/sdk/server/index.js"
4
- import {
5
- CallToolRequestSchema,
6
- ListToolsRequestSchema,
7
- ListResourcesRequestSchema,
8
- ReadResourceRequestSchema,
9
- ListPromptsRequestSchema,
10
- GetPromptRequestSchema,
11
- } from "@modelcontextprotocol/sdk/types.js"
12
- import { z } from "zod"
13
- import { zodToJsonSchema } from "zod-to-json-schema"
14
- import * as fs from "fs/promises"
15
- import * as path from "path"
16
- import { fileURLToPath } from "url"
17
- import { dirname } from "path"
18
-
19
- // Get package version
20
- let packageVersion = "4.5.0"
21
- try {
22
- const packageJson = JSON.parse(await fs.readFile(path.join(dirname(fileURLToPath(import.meta.url)), "../../package.json"), "utf-8"))
23
- packageVersion = packageJson.version || packageVersion
24
- } catch (error) {
25
- console.error("Could not load package.json for version", error)
26
- }
27
-
28
- /**
29
- * Enhanced MCP Server implementation for @hanzo/ui registry
30
- * Provides comprehensive tools, resources, and prompts for AI-assisted development
31
- */
32
- export const server = new Server(
33
- {
34
- name: "hanzo-ui",
35
- version: packageVersion,
36
- },
37
- {
38
- capabilities: {
39
- resources: {},
40
- tools: {},
41
- prompts: {},
42
- },
43
- }
44
- )
45
-
46
- // Cache for registry data
47
- let registryCache: Registry | null = null
48
- let registryCacheTime = 0
49
- const CACHE_DURATION = 5 * 60 * 1000 // 5 minutes
50
-
51
- /**
52
- * Fetches and caches the registry
53
- */
54
- async function getRegistry(): Promise<Registry> {
55
- const now = Date.now()
56
- if (registryCache && now - registryCacheTime < CACHE_DURATION) {
57
- return registryCache
58
- }
59
-
60
- try {
61
- const registryUrl = process.env.REGISTRY_URL || "https://ui.hanzo.ai/registry/registry.json"
62
- const [registryJson] = await fetchRegistry([registryUrl], {
63
- useCache: false,
64
- })
65
- registryCache = registrySchema.parse(registryJson)
66
- registryCacheTime = now
67
- return registryCache
68
- } catch (error) {
69
- console.error("Failed to fetch registry:", error)
70
- // Return cached version if available, otherwise minimal registry
71
- return registryCache || {
72
- name: "hanzo-ui",
73
- items: [],
74
- }
75
- }
76
- }
77
-
78
- /**
79
- * Get the source code of a component from the primitives directory
80
- */
81
- async function getComponentSource(componentName: string): Promise<string | null> {
82
- try {
83
- const primitivesPath = path.join(dirname(fileURLToPath(import.meta.url)), "../primitives")
84
- const componentPath = path.join(primitivesPath, `${componentName}.tsx`)
85
-
86
- // Check if file exists
87
- await fs.access(componentPath)
88
- const source = await fs.readFile(componentPath, "utf-8")
89
- return source
90
- } catch (error) {
91
- // Try to find in registry
92
- try {
93
- const registryUrl = process.env.REGISTRY_URL || "https://ui.hanzo.ai/registry/registry.json"
94
- const itemUrl = getRegistryItemUrl(componentName, registryUrl)
95
- const component = await getRegistryItem(itemUrl, "")
96
-
97
- if (component && component.files && component.files.length > 0) {
98
- // Return the first file's content (usually the main component)
99
- const mainFile = component.files.find(f => f.type === "registry:ui") || component.files[0]
100
- return mainFile.content || null
101
- }
102
- } catch (registryError) {
103
- console.error(`Failed to get component source for ${componentName}:`, registryError)
104
- }
105
- return null
106
- }
107
- }
108
-
109
- // Register the available tools
110
- server.setRequestHandler(ListToolsRequestSchema, async () => {
111
- return {
112
- tools: [
113
- {
114
- name: "init",
115
- description: "Initialize a new project using @hanzo/ui components and styles.",
116
- inputSchema: zodToJsonSchema(z.object({
117
- style: z.string().optional().describe("The style to use for the project (e.g., 'default' or 'new-york')"),
118
- })),
119
- },
120
- {
121
- name: "list_components",
122
- description: "List all available components in the registry",
123
- inputSchema: zodToJsonSchema(z.object({
124
- type: z.string().optional().describe("Filter components by type (e.g., 'ui', 'block')"),
125
- category: z.string().optional().describe("Filter components by category"),
126
- })),
127
- },
128
- {
129
- name: "get_component",
130
- description: "Get detailed information about a specific component",
131
- inputSchema: zodToJsonSchema(
132
- z.object({
133
- name: z.string().describe("The name of the component to get from the registry"),
134
- })
135
- ),
136
- },
137
- {
138
- name: "get_component_source",
139
- description: "Get the full source code of a component",
140
- inputSchema: zodToJsonSchema(
141
- z.object({
142
- name: z.string().describe("The name of the component to get source code for"),
143
- })
144
- ),
145
- },
146
- {
147
- name: "get_component_demo",
148
- description: "Get a demo/example implementation of a component",
149
- inputSchema: zodToJsonSchema(
150
- z.object({
151
- name: z.string().describe("The name of the component to get demo for"),
152
- })
153
- ),
154
- },
155
- {
156
- name: "add_component",
157
- description: "Get instructions for adding a component to a project",
158
- inputSchema: zodToJsonSchema(
159
- z.object({
160
- name: z.string().describe("The name of the component to add"),
161
- style: z.string().optional().describe("The style to use (default, new-york, etc.)"),
162
- })
163
- ),
164
- },
165
- {
166
- name: "list_blocks",
167
- description: "List all available UI blocks/patterns",
168
- inputSchema: zodToJsonSchema(z.object({
169
- category: z.string().optional().describe("Filter blocks by category"),
170
- })),
171
- },
172
- {
173
- name: "get_block",
174
- description: "Get detailed information about a specific block",
175
- inputSchema: zodToJsonSchema(
176
- z.object({
177
- name: z.string().describe("The name of the block to get"),
178
- })
179
- ),
180
- },
181
- {
182
- name: "list_styles",
183
- description: "List all available styles in the registry",
184
- inputSchema: zodToJsonSchema(z.object({})),
185
- },
186
- {
187
- name: "search_registry",
188
- description: "Search the registry for components matching criteria",
189
- inputSchema: zodToJsonSchema(
190
- z.object({
191
- query: z.string().describe("Search term to look for in component names and descriptions"),
192
- })
193
- ),
194
- },
195
- {
196
- name: "get_installation_guide",
197
- description: "Get the complete installation guide for setting up Hanzo UI",
198
- inputSchema: zodToJsonSchema(z.object({})),
199
- },
200
- ],
201
- }
202
- })
203
-
204
- // Register available resources
205
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
206
- const registry = await getRegistry()
207
-
208
- return {
209
- resources: [
210
- {
211
- uri: "hanzo://components/list",
212
- name: "Component List",
213
- description: "Complete list of all available Hanzo UI components",
214
- mimeType: "text/markdown",
215
- },
216
- {
217
- uri: "hanzo://blocks/list",
218
- name: "Block List",
219
- description: "List of all UI blocks and patterns",
220
- mimeType: "text/markdown",
221
- },
222
- {
223
- uri: "hanzo://installation/guide",
224
- name: "Installation Guide",
225
- description: "Complete guide for installing and setting up Hanzo UI",
226
- mimeType: "text/markdown",
227
- },
228
- {
229
- uri: "hanzo://theming/guide",
230
- name: "Theming Guide",
231
- description: "Guide for customizing themes and styles",
232
- mimeType: "text/markdown",
233
- },
234
- ],
235
- }
236
- })
237
-
238
- // Handle resource reads
239
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
240
- const uri = request.params.uri
241
- const registry = await getRegistry()
242
-
243
- switch (uri) {
244
- case "hanzo://components/list": {
245
- const components = registry.items.filter(item => item.type.includes("ui:"))
246
- const grouped = components.reduce((acc, item) => {
247
- const category = item.category || "Uncategorized"
248
- if (!acc[category]) acc[category] = []
249
- acc[category].push(item)
250
- return acc
251
- }, {} as Record<string, RegistryItem[]>)
252
-
253
- let content = "# Hanzo UI Components\n\n"
254
- for (const [category, items] of Object.entries(grouped)) {
255
- content += `## ${category}\n\n`
256
- for (const item of items) {
257
- content += `### ${item.name}\n`
258
- content += `${item.description || 'No description'}\n\n`
259
- content += `**Command:** \`npx @hanzo/ui@latest add ${item.name}\`\n\n`
260
- }
261
- }
262
-
263
- return {
264
- contents: [{ uri, mimeType: "text/markdown", text: content }],
265
- }
266
- }
267
-
268
- case "hanzo://blocks/list": {
269
- const blocks = registry.items.filter(item => item.type.includes("block"))
270
- let content = "# Hanzo UI Blocks\n\n"
271
-
272
- for (const block of blocks) {
273
- content += `## ${block.name}\n`
274
- content += `${block.description || 'No description'}\n\n`
275
- content += `**Command:** \`npx @hanzo/ui@latest add ${block.name}\`\n\n`
276
- }
277
-
278
- return {
279
- contents: [{ uri, mimeType: "text/markdown", text: content }],
280
- }
281
- }
282
-
283
- case "hanzo://installation/guide": {
284
- const content = `# Hanzo UI Installation Guide
285
-
286
- ## Quick Start
287
-
288
- ### 1. Create a new project
289
- \`\`\`bash
290
- npm create next-app@latest my-app --typescript --tailwind --app
291
- cd my-app
292
- \`\`\`
293
-
294
- ### 2. Initialize Hanzo UI
295
- \`\`\`bash
296
- npx @hanzo/ui@latest init
297
- \`\`\`
298
-
299
- This will:
300
- - Install dependencies
301
- - Configure Tailwind CSS
302
- - Set up the project structure
303
- - Add the cn() utility function
304
-
305
- ### 3. Add components
306
- \`\`\`bash
307
- # Add specific components
308
- npx @hanzo/ui@latest add button
309
- npx @hanzo/ui@latest add card dialog
310
-
311
- # Add multiple components
312
- npx @hanzo/ui@latest add button card dialog
313
- \`\`\`
314
-
315
- ## Manual Installation
316
-
317
- ### 1. Install dependencies
318
- \`\`\`bash
319
- npm install tailwindcss-animate class-variance-authority clsx tailwind-merge
320
- \`\`\`
321
-
322
- ### 2. Configure tailwind.config.js
323
- \`\`\`javascript
324
- module.exports = {
325
- darkMode: ["class"],
326
- content: [
327
- './pages/**/*.{ts,tsx}',
328
- './components/**/*.{ts,tsx}',
329
- './app/**/*.{ts,tsx}',
330
- './src/**/*.{ts,tsx}',
331
- ],
332
- theme: {
333
- extend: {},
334
- },
335
- plugins: [require("tailwindcss-animate")],
336
- }
337
- \`\`\`
338
-
339
- ### 3. Add the cn() utility
340
- Create \`lib/utils.ts\`:
341
- \`\`\`typescript
342
- import { ClassValue, clsx } from "clsx"
343
- import { twMerge } from "tailwind-merge"
344
-
345
- export function cn(...inputs: ClassValue[]) {
346
- return twMerge(clsx(inputs))
347
- }
348
- \`\`\`
349
-
350
- ## Using Components
351
-
352
- Import and use components in your application:
353
-
354
- \`\`\`tsx
355
- import { Button } from "@/components/ui/button"
356
-
357
- export default function Home() {
358
- return (
359
- <Button variant="outline">Click me</Button>
360
- )
361
- }
362
- \`\`\`
363
- `
364
- return {
365
- contents: [{ uri, mimeType: "text/markdown", text: content }],
366
- }
367
- }
368
-
369
- case "hanzo://theming/guide": {
370
- const content = `# Hanzo UI Theming Guide
371
-
372
- ## Color System
373
-
374
- Hanzo UI uses CSS variables for theming, making it easy to customize colors.
375
-
376
- ### Default Theme Variables
377
-
378
- Add to your \`globals.css\`:
379
-
380
- \`\`\`css
381
- @layer base {
382
- :root {
383
- --background: 0 0% 100%;
384
- --foreground: 222.2 84% 4.9%;
385
- --card: 0 0% 100%;
386
- --card-foreground: 222.2 84% 4.9%;
387
- --popover: 0 0% 100%;
388
- --popover-foreground: 222.2 84% 4.9%;
389
- --primary: 222.2 47.4% 11.2%;
390
- --primary-foreground: 210 40% 98%;
391
- --secondary: 210 40% 96.1%;
392
- --secondary-foreground: 222.2 47.4% 11.2%;
393
- --muted: 210 40% 96.1%;
394
- --muted-foreground: 215.4 16.3% 46.9%;
395
- --accent: 210 40% 96.1%;
396
- --accent-foreground: 222.2 47.4% 11.2%;
397
- --destructive: 0 84.2% 60.2%;
398
- --destructive-foreground: 210 40% 98%;
399
- --border: 214.3 31.8% 91.4%;
400
- --input: 214.3 31.8% 91.4%;
401
- --ring: 222.2 84% 4.9%;
402
- --radius: 0.5rem;
403
- }
404
-
405
- .dark {
406
- --background: 222.2 84% 4.9%;
407
- --foreground: 210 40% 98%;
408
- /* ... dark mode colors ... */
409
- }
410
- }
411
- \`\`\`
412
-
413
- ## Custom Themes
414
-
415
- ### Creating a Custom Theme
416
-
417
- 1. Define your color palette
418
- 2. Convert colors to HSL format
419
- 3. Update CSS variables
420
- 4. Apply to components
421
-
422
- ### Example: Brand Theme
423
-
424
- \`\`\`css
425
- @layer base {
426
- :root {
427
- --primary: 262 80% 50%; /* Purple */
428
- --secondary: 173 80% 40%; /* Teal */
429
- /* ... other custom colors ... */
430
- }
431
- }
432
- \`\`\`
433
-
434
- ## Component Variants
435
-
436
- Many components support variants for different styles:
437
-
438
- \`\`\`tsx
439
- <Button variant="default">Default</Button>
440
- <Button variant="destructive">Destructive</Button>
441
- <Button variant="outline">Outline</Button>
442
- <Button variant="secondary">Secondary</Button>
443
- <Button variant="ghost">Ghost</Button>
444
- <Button variant="link">Link</Button>
445
- \`\`\`
446
-
447
- ## Dark Mode
448
-
449
- Toggle dark mode with a simple class:
450
-
451
- \`\`\`tsx
452
- // Add to your root layout or app
453
- <html className="dark">
454
- {/* Your app */}
455
- </html>
456
- \`\`\`
457
-
458
- ## Advanced Customization
459
-
460
- ### Custom Component Styles
461
-
462
- Override component styles using className:
463
-
464
- \`\`\`tsx
465
- <Button
466
- className="bg-gradient-to-r from-purple-500 to-pink-500"
467
- >
468
- Gradient Button
469
- </Button>
470
- \`\`\`
471
-
472
- ### Global Style Overrides
473
-
474
- Add to your CSS file:
475
-
476
- \`\`\`css
477
- /* Override all buttons */
478
- .ui-button {
479
- @apply font-bold tracking-wide;
480
- }
481
- \`\`\`
482
- `
483
- return {
484
- contents: [{ uri, mimeType: "text/markdown", text: content }],
485
- }
486
- }
487
-
488
- default:
489
- throw new Error(`Unknown resource: ${uri}`)
490
- }
491
- })
492
-
493
- // Register available prompts
494
- server.setRequestHandler(ListPromptsRequestSchema, async () => {
495
- return {
496
- prompts: [
497
- {
498
- name: "component_usage",
499
- description: "Generate usage examples for a Hanzo UI component",
500
- arguments: [
501
- {
502
- name: "component",
503
- description: "Name of the component",
504
- required: true,
505
- },
506
- ],
507
- },
508
- {
509
- name: "build_page",
510
- description: "Build a complete page using Hanzo UI components",
511
- arguments: [
512
- {
513
- name: "page_type",
514
- description: "Type of page (landing, dashboard, form, etc.)",
515
- required: true,
516
- },
517
- ],
518
- },
519
- {
520
- name: "component_composition",
521
- description: "Create a custom component by composing Hanzo UI primitives",
522
- arguments: [
523
- {
524
- name: "component_name",
525
- description: "Name for the new component",
526
- required: true,
527
- },
528
- {
529
- name: "description",
530
- description: "What the component should do",
531
- required: true,
532
- },
533
- ],
534
- },
535
- {
536
- name: "accessibility_review",
537
- description: "Review and improve component accessibility",
538
- arguments: [
539
- {
540
- name: "component_code",
541
- description: "The component code to review",
542
- required: true,
543
- },
544
- ],
545
- },
546
- {
547
- name: "theme_customization",
548
- description: "Generate custom theme for Hanzo UI",
549
- arguments: [
550
- {
551
- name: "brand_colors",
552
- description: "Primary brand colors",
553
- required: true,
554
- },
555
- {
556
- name: "style",
557
- description: "Style preference (minimal, bold, playful, professional)",
558
- required: false,
559
- },
560
- ],
561
- },
562
- ],
563
- }
564
- })
565
-
566
- // Handle prompt requests
567
- server.setRequestHandler(GetPromptRequestSchema, async (request) => {
568
- const promptName = request.params.name
569
- const args = request.params.arguments || {}
570
-
571
- switch (promptName) {
572
- case "component_usage": {
573
- const componentName = args.component as string
574
- return {
575
- messages: [
576
- {
577
- role: "user",
578
- content: {
579
- type: "text",
580
- text: `Generate comprehensive usage examples for the Hanzo UI ${componentName} component. Include:
581
- 1. Basic usage
582
- 2. With all variants (if applicable)
583
- 3. With different props/options
584
- 4. In common scenarios
585
- 5. Accessibility considerations
586
- 6. Common patterns and best practices`,
587
- },
588
- },
589
- ],
590
- }
591
- }
592
-
593
- case "build_page": {
594
- const pageType = args.page_type as string
595
- return {
596
- messages: [
597
- {
598
- role: "user",
599
- content: {
600
- type: "text",
601
- text: `Build a complete ${pageType} page using Hanzo UI components. Requirements:
602
- 1. Use appropriate Hanzo UI components
603
- 2. Implement responsive design
604
- 3. Include proper accessibility
605
- 4. Follow Hanzo UI design patterns
606
- 5. Structure with semantic HTML
607
- 6. Add appropriate interactions
608
- 7. Include comments explaining component choices`,
609
- },
610
- },
611
- ],
612
- }
613
- }
614
-
615
- case "component_composition": {
616
- const componentName = args.component_name as string
617
- const description = args.description as string
618
- return {
619
- messages: [
620
- {
621
- role: "user",
622
- content: {
623
- type: "text",
624
- text: `Create a custom "${componentName}" component that ${description}.
625
- Requirements:
626
- 1. Compose using existing Hanzo UI primitives
627
- 2. Follow Hanzo UI patterns and conventions
628
- 3. Include TypeScript types
629
- 4. Make it reusable and configurable
630
- 5. Add proper accessibility attributes
631
- 6. Include usage examples
632
- 7. Follow the component API patterns from Hanzo UI`,
633
- },
634
- },
635
- ],
636
- }
637
- }
638
-
639
- case "accessibility_review": {
640
- const code = args.component_code as string
641
- return {
642
- messages: [
643
- {
644
- role: "user",
645
- content: {
646
- type: "text",
647
- text: `Review this component for accessibility and suggest improvements:
648
-
649
- \`\`\`tsx
650
- ${code}
651
- \`\`\`
652
-
653
- Check for:
654
- 1. ARIA attributes
655
- 2. Keyboard navigation
656
- 3. Screen reader support
657
- 4. Color contrast
658
- 5. Focus management
659
- 6. Semantic HTML
660
- 7. Alternative text
661
- 8. Error handling
662
-
663
- Provide the improved version with explanations.`,
664
- },
665
- },
666
- ],
667
- }
668
- }
669
-
670
- case "theme_customization": {
671
- const brandColors = args.brand_colors as string
672
- const style = args.style as string || "professional"
673
- return {
674
- messages: [
675
- {
676
- role: "user",
677
- content: {
678
- type: "text",
679
- text: `Generate a custom Hanzo UI theme with these brand colors: ${brandColors}
680
- Style preference: ${style}
681
-
682
- Provide:
683
- 1. Complete CSS variables for light mode
684
- 2. Complete CSS variables for dark mode
685
- 3. Color palette with all shades
686
- 4. Example component styling
687
- 5. Integration instructions
688
- 6. Preview of how components will look`,
689
- },
690
- },
691
- ],
692
- }
693
- }
694
-
695
- default:
696
- throw new Error(`Unknown prompt: ${promptName}`)
697
- }
698
- })
699
-
700
- // Handle tool calls (existing implementation with additions)
701
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
702
- const args = request.params.arguments || {}
703
-
704
- switch (request.params.name) {
705
- // ... existing tool implementations ...
706
-
707
- case "get_component_source": {
708
- const name = z.string().parse(args.name)
709
- const source = await getComponentSource(name)
710
-
711
- if (!source) {
712
- return {
713
- content: [{
714
- type: "text",
715
- text: `Could not find source code for component '${name}'`,
716
- }],
717
- }
718
- }
719
-
720
- return {
721
- content: [{
722
- type: "text",
723
- text: `# Source Code: ${name}\n\n\`\`\`tsx\n${source}\n\`\`\``,
724
- }],
725
- }
726
- }
727
-
728
- case "get_component_demo": {
729
- const name = z.string().parse(args.name)
730
- const registry = await getRegistry()
731
- const component = registry.items.find(item => item.name === name)
732
-
733
- if (!component) {
734
- return {
735
- content: [{
736
- type: "text",
737
- text: `Component '${name}' not found`,
738
- }],
739
- }
740
- }
741
-
742
- // Generate a demo based on component type
743
- let demo = `# ${name} Demo\n\n\`\`\`tsx\n`
744
- demo += `import { ${name.charAt(0).toUpperCase() + name.slice(1)} } from "@/components/ui/${name}"\n\n`
745
- demo += `export default function ${name.charAt(0).toUpperCase() + name.slice(1)}Demo() {\n`
746
- demo += ` return (\n`
747
- demo += ` <div className="space-y-4">\n`
748
-
749
- // Add component-specific demo content
750
- if (name === "button") {
751
- demo += ` <div className="flex gap-4">\n`
752
- demo += ` <${name.charAt(0).toUpperCase() + name.slice(1)}>Default</${name.charAt(0).toUpperCase() + name.slice(1)}>\n`
753
- demo += ` <${name.charAt(0).toUpperCase() + name.slice(1)} variant="outline">Outline</${name.charAt(0).toUpperCase() + name.slice(1)}>\n`
754
- demo += ` <${name.charAt(0).toUpperCase() + name.slice(1)} variant="secondary">Secondary</${name.charAt(0).toUpperCase() + name.slice(1)}>\n`
755
- demo += ` <${name.charAt(0).toUpperCase() + name.slice(1)} variant="destructive">Destructive</${name.charAt(0).toUpperCase() + name.slice(1)}>\n`
756
- demo += ` </div>\n`
757
- } else {
758
- demo += ` <${name.charAt(0).toUpperCase() + name.slice(1)} />\n`
759
- }
760
-
761
- demo += ` </div>\n`
762
- demo += ` )\n`
763
- demo += `}\n`
764
- demo += `\`\`\`\n\n`
765
-
766
- // Add usage notes
767
- demo += `## Usage Notes\n\n`
768
- demo += `- Import the component from \`@/components/ui/${name}\`\n`
769
- demo += `- ${component.description || 'No description available'}\n`
770
-
771
- if (component.dependencies && component.dependencies.length > 0) {
772
- demo += `\n## Required Dependencies\n\n`
773
- component.dependencies.forEach(dep => {
774
- demo += `- ${dep}\n`
775
- })
776
- }
777
-
778
- return {
779
- content: [{ type: "text", text: demo }],
780
- }
781
- }
782
-
783
- case "list_blocks": {
784
- const registry = await getRegistry()
785
- const blocks = registry.items.filter(item =>
786
- item.type.includes("block") || item.type.includes("section")
787
- )
788
-
789
- const categoryFilter = args.category as string | undefined
790
- const filtered = categoryFilter
791
- ? blocks.filter(b => b.category === categoryFilter)
792
- : blocks
793
-
794
- let content = "# Available UI Blocks\n\n"
795
-
796
- if (filtered.length === 0) {
797
- content += "No blocks found"
798
- if (categoryFilter) {
799
- content += ` in category '${categoryFilter}'`
800
- }
801
- content += ".\n"
802
- } else {
803
- const byCategory = filtered.reduce((acc, block) => {
804
- const cat = block.category || "Uncategorized"
805
- if (!acc[cat]) acc[cat] = []
806
- acc[cat].push(block)
807
- return acc
808
- }, {} as Record<string, typeof blocks>)
809
-
810
- for (const [category, items] of Object.entries(byCategory)) {
811
- content += `## ${category}\n\n`
812
- for (const item of items) {
813
- content += `### ${item.name}\n`
814
- content += `${item.description || 'No description'}\n`
815
- content += `**Install:** \`npx @hanzo/ui@latest add ${item.name}\`\n\n`
816
- }
817
- }
818
- }
819
-
820
- return {
821
- content: [{ type: "text", text: content }],
822
- }
823
- }
824
-
825
- case "get_block": {
826
- const name = z.string().parse(args.name)
827
- const registry = await getRegistry()
828
- const block = registry.items.find(item =>
829
- item.name === name && (item.type.includes("block") || item.type.includes("section"))
830
- )
831
-
832
- if (!block) {
833
- return {
834
- content: [{
835
- type: "text",
836
- text: `Block '${name}' not found`,
837
- }],
838
- }
839
- }
840
-
841
- let content = `# ${block.name} Block\n\n`
842
- content += `${block.description || 'No description'}\n\n`
843
-
844
- if (block.category) {
845
- content += `**Category:** ${block.category}\n\n`
846
- }
847
-
848
- // Dependencies
849
- if (block.dependencies && block.dependencies.length > 0) {
850
- content += `## NPM Dependencies\n\n`
851
- block.dependencies.forEach(dep => {
852
- content += `- ${dep}\n`
853
- })
854
- content += "\n"
855
- }
856
-
857
- // Component dependencies
858
- if (block.registryDependencies && block.registryDependencies.length > 0) {
859
- content += `## Required Components\n\n`
860
- block.registryDependencies.forEach(dep => {
861
- content += `- ${dep}\n`
862
- })
863
- content += "\n"
864
- }
865
-
866
- // Installation
867
- content += `## Installation\n\n`
868
- content += `\`\`\`bash\n`
869
- content += `npx @hanzo/ui@latest add ${name}\n`
870
- content += `\`\`\`\n\n`
871
-
872
- // Files
873
- if (block.files && block.files.length > 0) {
874
- content += `## Files\n\n`
875
- block.files.forEach(file => {
876
- content += `- \`${file.path}\` (${file.type})\n`
877
- })
878
- }
879
-
880
- return {
881
- content: [{ type: "text", text: content }],
882
- }
883
- }
884
-
885
- case "get_installation_guide": {
886
- const content = `# Hanzo UI Complete Installation Guide
887
-
888
- ## Prerequisites
889
-
890
- - Node.js 18.17 or later
891
- - React 18 or later
892
- - Tailwind CSS 3.4 or later
893
-
894
- ## Automatic Installation (Recommended)
895
-
896
- ### Step 1: Create Your Project
897
-
898
- Choose your preferred framework:
899
-
900
- #### Next.js
901
- \`\`\`bash
902
- npx create-next-app@latest my-app --typescript --tailwind --app
903
- cd my-app
904
- \`\`\`
905
-
906
- #### Vite
907
- \`\`\`bash
908
- npm create vite@latest my-app -- --template react-ts
909
- cd my-app
910
- npm install -D tailwindcss postcss autoprefixer
911
- npx tailwindcss init -p
912
- \`\`\`
913
-
914
- #### Remix
915
- \`\`\`bash
916
- npx create-remix@latest my-app
917
- cd my-app
918
- npm install -D tailwindcss postcss autoprefixer
919
- npx tailwindcss init -p
920
- \`\`\`
921
-
922
- ### Step 2: Initialize Hanzo UI
923
-
924
- Run the init command to set up your project:
925
-
926
- \`\`\`bash
927
- npx @hanzo/ui@latest init
928
- \`\`\`
929
-
930
- You will be asked a few questions:
931
-
932
- 1. **Style** - Choose between Default and New York styles
933
- 2. **Base color** - Choose your base color scheme
934
- 3. **CSS variables** - Use CSS variables for theming (recommended)
935
- 4. **Components path** - Where to add components (default: @/components)
936
- 5. **Utils path** - Where to add the cn utility (default: @/lib/utils)
937
- 6. **React Server Components** - Whether to use RSC
938
- 7. **Components.json** - Write configuration to components.json
939
-
940
- ### Step 3: Start Adding Components
941
-
942
- \`\`\`bash
943
- # Add individual components
944
- npx @hanzo/ui@latest add button
945
- npx @hanzo/ui@latest add card
946
- npx @hanzo/ui@latest add dialog
947
-
948
- # Add multiple at once
949
- npx @hanzo/ui@latest add button card dialog form
950
-
951
- # Add all components (use with caution)
952
- npx @hanzo/ui@latest add --all
953
- \`\`\`
954
-
955
- ## Manual Installation
956
-
957
- If you prefer to set up manually:
958
-
959
- ### Step 1: Install Dependencies
960
-
961
- \`\`\`bash
962
- npm install tailwindcss-animate class-variance-authority clsx tailwind-merge lucide-react
963
- \`\`\`
964
-
965
- ### Step 2: Configure Path Aliases
966
-
967
- Update your \`tsconfig.json\`:
968
-
969
- \`\`\`json
970
- {
971
- "compilerOptions": {
972
- "baseUrl": ".",
973
- "paths": {
974
- "@/*": ["./src/*"]
975
- }
976
- }
977
- }
978
- \`\`\`
979
-
980
- ### Step 3: Configure Tailwind
981
-
982
- Update \`tailwind.config.js\`:
983
-
984
- \`\`\`javascript
985
- /** @type {import('tailwindcss').Config} */
986
- module.exports = {
987
- darkMode: ["class"],
988
- content: [
989
- './pages/**/*.{ts,tsx}',
990
- './components/**/*.{ts,tsx}',
991
- './app/**/*.{ts,tsx}',
992
- './src/**/*.{ts,tsx}',
993
- ],
994
- prefix: "",
995
- theme: {
996
- container: {
997
- center: true,
998
- padding: "2rem",
999
- screens: {
1000
- "2xl": "1400px",
1001
- },
1002
- },
1003
- extend: {
1004
- colors: {
1005
- border: "hsl(var(--border))",
1006
- input: "hsl(var(--input))",
1007
- ring: "hsl(var(--ring))",
1008
- background: "hsl(var(--background))",
1009
- foreground: "hsl(var(--foreground))",
1010
- primary: {
1011
- DEFAULT: "hsl(var(--primary))",
1012
- foreground: "hsl(var(--primary-foreground))",
1013
- },
1014
- secondary: {
1015
- DEFAULT: "hsl(var(--secondary))",
1016
- foreground: "hsl(var(--secondary-foreground))",
1017
- },
1018
- destructive: {
1019
- DEFAULT: "hsl(var(--destructive))",
1020
- foreground: "hsl(var(--destructive-foreground))",
1021
- },
1022
- muted: {
1023
- DEFAULT: "hsl(var(--muted))",
1024
- foreground: "hsl(var(--muted-foreground))",
1025
- },
1026
- accent: {
1027
- DEFAULT: "hsl(var(--accent))",
1028
- foreground: "hsl(var(--accent-foreground))",
1029
- },
1030
- popover: {
1031
- DEFAULT: "hsl(var(--popover))",
1032
- foreground: "hsl(var(--popover-foreground))",
1033
- },
1034
- card: {
1035
- DEFAULT: "hsl(var(--card))",
1036
- foreground: "hsl(var(--card-foreground))",
1037
- },
1038
- },
1039
- borderRadius: {
1040
- lg: "var(--radius)",
1041
- md: "calc(var(--radius) - 2px)",
1042
- sm: "calc(var(--radius) - 4px)",
1043
- },
1044
- keyframes: {
1045
- "accordion-down": {
1046
- from: { height: "0" },
1047
- to: { height: "var(--radix-accordion-content-height)" },
1048
- },
1049
- "accordion-up": {
1050
- from: { height: "var(--radix-accordion-content-height)" },
1051
- to: { height: "0" },
1052
- },
1053
- },
1054
- animation: {
1055
- "accordion-down": "accordion-down 0.2s ease-out",
1056
- "accordion-up": "accordion-up 0.2s ease-out",
1057
- },
1058
- },
1059
- },
1060
- plugins: [require("tailwindcss-animate")],
1061
- }
1062
- \`\`\`
1063
-
1064
- ### Step 4: Add CSS Variables
1065
-
1066
- Add to your \`globals.css\`:
1067
-
1068
- \`\`\`css
1069
- @tailwind base;
1070
- @tailwind components;
1071
- @tailwind utilities;
1072
-
1073
- @layer base {
1074
- :root {
1075
- --background: 0 0% 100%;
1076
- --foreground: 222.2 84% 4.9%;
1077
- --card: 0 0% 100%;
1078
- --card-foreground: 222.2 84% 4.9%;
1079
- --popover: 0 0% 100%;
1080
- --popover-foreground: 222.2 84% 4.9%;
1081
- --primary: 222.2 47.4% 11.2%;
1082
- --primary-foreground: 210 40% 98%;
1083
- --secondary: 210 40% 96.1%;
1084
- --secondary-foreground: 222.2 47.4% 11.2%;
1085
- --muted: 210 40% 96.1%;
1086
- --muted-foreground: 215.4 16.3% 46.9%;
1087
- --accent: 210 40% 96.1%;
1088
- --accent-foreground: 222.2 47.4% 11.2%;
1089
- --destructive: 0 84.2% 60.2%;
1090
- --destructive-foreground: 210 40% 98%;
1091
- --border: 214.3 31.8% 91.4%;
1092
- --input: 214.3 31.8% 91.4%;
1093
- --ring: 222.2 84% 4.9%;
1094
- --radius: 0.5rem;
1095
- }
1096
-
1097
- .dark {
1098
- --background: 222.2 84% 4.9%;
1099
- --foreground: 210 40% 98%;
1100
- --card: 222.2 84% 4.9%;
1101
- --card-foreground: 210 40% 98%;
1102
- --popover: 222.2 84% 4.9%;
1103
- --popover-foreground: 210 40% 98%;
1104
- --primary: 210 40% 98%;
1105
- --primary-foreground: 222.2 47.4% 11.2%;
1106
- --secondary: 217.2 32.6% 17.5%;
1107
- --secondary-foreground: 210 40% 98%;
1108
- --muted: 217.2 32.6% 17.5%;
1109
- --muted-foreground: 215 20.2% 65.1%;
1110
- --accent: 217.2 32.6% 17.5%;
1111
- --accent-foreground: 210 40% 98%;
1112
- --destructive: 0 62.8% 30.6%;
1113
- --destructive-foreground: 210 40% 98%;
1114
- --border: 217.2 32.6% 17.5%;
1115
- --input: 217.2 32.6% 17.5%;
1116
- --ring: 212.7 26.8% 83.9%;
1117
- }
1118
- }
1119
-
1120
- @layer base {
1121
- * {
1122
- @apply border-border;
1123
- }
1124
- body {
1125
- @apply bg-background text-foreground;
1126
- }
1127
- }
1128
- \`\`\`
1129
-
1130
- ### Step 5: Add the cn Utility
1131
-
1132
- Create \`lib/utils.ts\`:
1133
-
1134
- \`\`\`typescript
1135
- import { ClassValue, clsx } from "clsx"
1136
- import { twMerge } from "tailwind-merge"
1137
-
1138
- export function cn(...inputs: ClassValue[]) {
1139
- return twMerge(clsx(inputs))
1140
- }
1141
- \`\`\`
1142
-
1143
- ## Verify Installation
1144
-
1145
- Create a test component to verify everything works:
1146
-
1147
- \`\`\`tsx
1148
- // app/page.tsx or src/App.tsx
1149
- import { Button } from "@/components/ui/button"
1150
-
1151
- export default function Home() {
1152
- return (
1153
- <div className="flex min-h-screen items-center justify-center">
1154
- <Button>Hello Hanzo UI!</Button>
1155
- </div>
1156
- )
1157
- }
1158
- \`\`\`
1159
-
1160
- ## Next Steps
1161
-
1162
- 1. **Explore Components** - Browse available components with \`list_components\`
1163
- 2. **Customize Theme** - Adjust CSS variables to match your brand
1164
- 3. **Add More Components** - Install components as needed
1165
- 4. **Check Documentation** - Visit ui.hanzo.ai for full docs
1166
-
1167
- ## Troubleshooting
1168
-
1169
- ### Module Resolution Issues
1170
- Ensure your path aliases are correctly configured in both tsconfig.json and your bundler config.
1171
-
1172
- ### Styling Not Applied
1173
- Make sure Tailwind CSS is properly configured and your CSS file is imported in your app.
1174
-
1175
- ### Type Errors
1176
- Install TypeScript definitions: \`npm install -D @types/react @types/react-dom\`
1177
-
1178
- ### Dark Mode Not Working
1179
- Ensure you're toggling the \`dark\` class on your HTML element.
1180
-
1181
- Need help? Visit ui.hanzo.ai or check our GitHub repository.`
1182
-
1183
- return {
1184
- content: [{ type: "text", text: content }],
1185
- }
1186
- }
1187
-
1188
- // Include all existing tool implementations from the original file
1189
- default: {
1190
- // Fallback to original implementation for other tools
1191
- const originalTools = ["init", "list_components", "get_component", "add_component", "list_styles", "search_registry"]
1192
- if (originalTools.includes(request.params.name)) {
1193
- // Call original implementation (would need to be imported/included)
1194
- // For now, return an error
1195
- throw new Error(`Tool ${request.params.name} needs original implementation`)
1196
- }
1197
- throw new Error(`Unknown tool: ${request.params.name}`)
1198
- }
1199
- }
1200
- })
1201
-
1202
- // Export for use
1203
- export default server
1204
-
1205
- // Support CommonJS
1206
- if (typeof module !== 'undefined') {
1207
- module.exports = { server }
1208
- }