love-ui 1.2.12 → 1.2.14

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 (988) hide show
  1. package/dist/index.js +8 -7
  2. package/dist/mcp-server.js +1 -1
  3. package/package.json +3 -2
  4. package/packages/loveui-skills/SKILL.md +99 -0
  5. package/packages/loveui-skills/agents/openai.yaml +11 -0
  6. package/packages/loveui-skills/references/design-directions.md +60 -0
  7. package/packages/loveui-skills/references/mcp-catalog-workflow.md +68 -0
  8. package/packages/loveui-skills/references/page-blueprints.md +76 -0
  9. package/packages/loveui-skills/references/quality-gates.md +51 -0
  10. package/public/r/accordion-controlled.json +1 -1
  11. package/public/r/accordion-demo.json +1 -1
  12. package/public/r/accordion-multiple.json +1 -1
  13. package/public/r/accordion-single.json +1 -1
  14. package/public/r/alert-demo.json +1 -1
  15. package/public/r/alert-dialog-demo.json +1 -1
  16. package/public/r/alert-error.json +1 -1
  17. package/public/r/alert-info.json +1 -1
  18. package/public/r/alert-success.json +1 -1
  19. package/public/r/alert-warning.json +1 -1
  20. package/public/r/alert-with-icon-action.json +1 -1
  21. package/public/r/alert-with-icon.json +1 -1
  22. package/public/r/announcement-tagless.json +1 -1
  23. package/public/r/announcement-themes.json +1 -1
  24. package/public/r/announcement.json +1 -1
  25. package/public/r/autocomplete-async.json +1 -1
  26. package/public/r/autocomplete-autohighlight.json +1 -1
  27. package/public/r/autocomplete-demo.json +1 -1
  28. package/public/r/autocomplete-disabled.json +1 -1
  29. package/public/r/autocomplete-form.json +1 -1
  30. package/public/r/autocomplete-grouped.json +1 -1
  31. package/public/r/autocomplete-inline.json +1 -1
  32. package/public/r/autocomplete-lg.json +1 -1
  33. package/public/r/autocomplete-limit.json +1 -1
  34. package/public/r/autocomplete-sm.json +1 -1
  35. package/public/r/autocomplete-with-clear.json +1 -1
  36. package/public/r/autocomplete-with-label.json +1 -1
  37. package/public/r/autocomplete-with-trigger-clear.json +1 -1
  38. package/public/r/avatar-demo.json +1 -1
  39. package/public/r/avatar-fallback.json +1 -1
  40. package/public/r/avatar-group.json +1 -1
  41. package/public/r/avatar-radius.json +1 -1
  42. package/public/r/avatar-size.json +1 -1
  43. package/public/r/avatar-stack-hover.json +1 -1
  44. package/public/r/avatar-stack.json +1 -1
  45. package/public/r/badge-demo.json +1 -1
  46. package/public/r/badge-destructive.json +1 -1
  47. package/public/r/badge-error.json +1 -1
  48. package/public/r/badge-info.json +1 -1
  49. package/public/r/badge-lg.json +1 -1
  50. package/public/r/badge-outline.json +1 -1
  51. package/public/r/badge-secondary.json +1 -1
  52. package/public/r/badge-sm.json +1 -1
  53. package/public/r/badge-success.json +1 -1
  54. package/public/r/badge-warning.json +1 -1
  55. package/public/r/badge-with-icon.json +1 -1
  56. package/public/r/badge-with-link.json +1 -1
  57. package/public/r/banner-inset.json +1 -1
  58. package/public/r/banner-themes.json +1 -1
  59. package/public/r/banner.json +1 -1
  60. package/public/r/bookmarks.json +206 -0
  61. package/public/r/breadcrumb-custom-separator.json +1 -1
  62. package/public/r/breadcrumb-demo.json +1 -1
  63. package/public/r/button-demo.json +1 -1
  64. package/public/r/button-destructive-outline.json +1 -1
  65. package/public/r/button-destructive.json +1 -1
  66. package/public/r/button-disabled.json +1 -1
  67. package/public/r/button-ghost.json +1 -1
  68. package/public/r/button-lg.json +1 -1
  69. package/public/r/button-link.json +1 -1
  70. package/public/r/button-loading.json +1 -1
  71. package/public/r/button-outline.json +1 -1
  72. package/public/r/button-secondary.json +1 -1
  73. package/public/r/button-sm.json +1 -1
  74. package/public/r/button-with-icon.json +1 -1
  75. package/public/r/button-with-link.json +1 -1
  76. package/public/r/button-xl.json +1 -1
  77. package/public/r/button-xs.json +1 -1
  78. package/public/r/calendar-headless.json +1 -1
  79. package/public/r/calendar-rac.json +16 -0
  80. package/public/r/calendar.json +1 -1
  81. package/public/r/card-demo.json +1 -1
  82. package/public/r/chart.json +15 -0
  83. package/public/r/checkbox-card.json +1 -1
  84. package/public/r/checkbox-demo.json +1 -1
  85. package/public/r/checkbox-disabled.json +1 -1
  86. package/public/r/checkbox-form.json +1 -1
  87. package/public/r/checkbox-group-demo.json +1 -1
  88. package/public/r/checkbox-group-disabled.json +1 -1
  89. package/public/r/checkbox-group-form.json +1 -1
  90. package/public/r/checkbox-group-nested-parent.json +1 -1
  91. package/public/r/checkbox-group-parent.json +1 -1
  92. package/public/r/checkbox-tree.json +12 -0
  93. package/public/r/checkbox-with-description.json +1 -1
  94. package/public/r/choicebox-inline.json +1 -1
  95. package/public/r/choicebox.json +1 -1
  96. package/public/r/codebase.json +1 -1
  97. package/public/r/collaborative-canvas.json +1 -1
  98. package/public/r/collapsible-demo.json +1 -1
  99. package/public/r/combobox-autohighlight.json +1 -1
  100. package/public/r/combobox-controlled.json +1 -1
  101. package/public/r/combobox-create-new.json +1 -1
  102. package/public/r/combobox-demo.json +1 -1
  103. package/public/r/combobox-disabled.json +1 -1
  104. package/public/r/combobox-fixed-width.json +1 -1
  105. package/public/r/combobox-form.json +1 -1
  106. package/public/r/combobox-grouped.json +1 -1
  107. package/public/r/combobox-lg.json +1 -1
  108. package/public/r/combobox-multiple-form.json +1 -1
  109. package/public/r/combobox-multiple.json +1 -1
  110. package/public/r/combobox-sm.json +1 -1
  111. package/public/r/combobox-with-clear.json +1 -1
  112. package/public/r/combobox-with-inner-input.json +1 -1
  113. package/public/r/combobox-with-label.json +1 -1
  114. package/public/r/command.json +18 -0
  115. package/public/r/comp-01.json +22 -0
  116. package/public/r/comp-02.json +23 -0
  117. package/public/r/comp-03.json +23 -0
  118. package/public/r/comp-04.json +23 -0
  119. package/public/r/comp-05.json +22 -0
  120. package/public/r/comp-06.json +23 -0
  121. package/public/r/comp-07.json +22 -0
  122. package/public/r/comp-08.json +23 -0
  123. package/public/r/comp-09.json +22 -0
  124. package/public/r/comp-10.json +22 -0
  125. package/public/r/comp-100.json +23 -0
  126. package/public/r/comp-101.json +23 -0
  127. package/public/r/comp-102.json +23 -0
  128. package/public/r/comp-103.json +23 -0
  129. package/public/r/comp-104.json +23 -0
  130. package/public/r/comp-105.json +23 -0
  131. package/public/r/comp-106.json +22 -0
  132. package/public/r/comp-107.json +22 -0
  133. package/public/r/comp-108.json +23 -0
  134. package/public/r/comp-109.json +22 -0
  135. package/public/r/comp-11.json +22 -0
  136. package/public/r/comp-110.json +22 -0
  137. package/public/r/comp-111.json +21 -0
  138. package/public/r/comp-112.json +21 -0
  139. package/public/r/comp-113.json +22 -0
  140. package/public/r/comp-114.json +23 -0
  141. package/public/r/comp-115.json +22 -0
  142. package/public/r/comp-116.json +22 -0
  143. package/public/r/comp-117.json +23 -0
  144. package/public/r/comp-118.json +23 -0
  145. package/public/r/comp-119.json +27 -0
  146. package/public/r/comp-12.json +22 -0
  147. package/public/r/comp-120.json +27 -0
  148. package/public/r/comp-121.json +27 -0
  149. package/public/r/comp-122.json +27 -0
  150. package/public/r/comp-123.json +22 -0
  151. package/public/r/comp-124.json +22 -0
  152. package/public/r/comp-125.json +31 -0
  153. package/public/r/comp-126.json +31 -0
  154. package/public/r/comp-127.json +21 -0
  155. package/public/r/comp-128.json +21 -0
  156. package/public/r/comp-129.json +24 -0
  157. package/public/r/comp-13.json +22 -0
  158. package/public/r/comp-130.json +23 -0
  159. package/public/r/comp-131.json +23 -0
  160. package/public/r/comp-132.json +23 -0
  161. package/public/r/comp-133.json +23 -0
  162. package/public/r/comp-134.json +23 -0
  163. package/public/r/comp-135.json +24 -0
  164. package/public/r/comp-136.json +23 -0
  165. package/public/r/comp-137.json +23 -0
  166. package/public/r/comp-138.json +25 -0
  167. package/public/r/comp-139.json +23 -0
  168. package/public/r/comp-14.json +22 -0
  169. package/public/r/comp-140.json +23 -0
  170. package/public/r/comp-141.json +23 -0
  171. package/public/r/comp-142.json +25 -0
  172. package/public/r/comp-143.json +23 -0
  173. package/public/r/comp-144.json +24 -0
  174. package/public/r/comp-145.json +24 -0
  175. package/public/r/comp-146.json +24 -0
  176. package/public/r/comp-147.json +24 -0
  177. package/public/r/comp-148.json +25 -0
  178. package/public/r/comp-149.json +24 -0
  179. package/public/r/comp-15.json +22 -0
  180. package/public/r/comp-150.json +21 -0
  181. package/public/r/comp-151.json +23 -0
  182. package/public/r/comp-152.json +23 -0
  183. package/public/r/comp-153.json +23 -0
  184. package/public/r/comp-154.json +23 -0
  185. package/public/r/comp-155.json +23 -0
  186. package/public/r/comp-156.json +25 -0
  187. package/public/r/comp-157.json +27 -0
  188. package/public/r/comp-158.json +24 -0
  189. package/public/r/comp-159.json +24 -0
  190. package/public/r/comp-16.json +22 -0
  191. package/public/r/comp-160.json +24 -0
  192. package/public/r/comp-161.json +24 -0
  193. package/public/r/comp-162.json +24 -0
  194. package/public/r/comp-163.json +28 -0
  195. package/public/r/comp-164.json +24 -0
  196. package/public/r/comp-165.json +24 -0
  197. package/public/r/comp-166.json +25 -0
  198. package/public/r/comp-167.json +24 -0
  199. package/public/r/comp-168.json +24 -0
  200. package/public/r/comp-169.json +23 -0
  201. package/public/r/comp-17.json +25 -0
  202. package/public/r/comp-170.json +25 -0
  203. package/public/r/comp-171.json +28 -0
  204. package/public/r/comp-172.json +23 -0
  205. package/public/r/comp-173.json +23 -0
  206. package/public/r/comp-174.json +23 -0
  207. package/public/r/comp-175.json +23 -0
  208. package/public/r/comp-176.json +23 -0
  209. package/public/r/comp-177.json +23 -0
  210. package/public/r/comp-178.json +23 -0
  211. package/public/r/comp-179.json +24 -0
  212. package/public/r/comp-18.json +25 -0
  213. package/public/r/comp-180.json +23 -0
  214. package/public/r/comp-181.json +25 -0
  215. package/public/r/comp-182.json +24 -0
  216. package/public/r/comp-183.json +25 -0
  217. package/public/r/comp-184.json +25 -0
  218. package/public/r/comp-185.json +24 -0
  219. package/public/r/comp-186.json +25 -0
  220. package/public/r/comp-187.json +25 -0
  221. package/public/r/comp-188.json +25 -0
  222. package/public/r/comp-189.json +23 -0
  223. package/public/r/comp-19.json +23 -0
  224. package/public/r/comp-190.json +23 -0
  225. package/public/r/comp-191.json +24 -0
  226. package/public/r/comp-192.json +23 -0
  227. package/public/r/comp-193.json +23 -0
  228. package/public/r/comp-194.json +24 -0
  229. package/public/r/comp-195.json +23 -0
  230. package/public/r/comp-196.json +24 -0
  231. package/public/r/comp-197.json +23 -0
  232. package/public/r/comp-198.json +23 -0
  233. package/public/r/comp-199.json +23 -0
  234. package/public/r/comp-20.json +23 -0
  235. package/public/r/comp-200.json +25 -0
  236. package/public/r/comp-201.json +22 -0
  237. package/public/r/comp-202.json +22 -0
  238. package/public/r/comp-203.json +23 -0
  239. package/public/r/comp-204.json +23 -0
  240. package/public/r/comp-205.json +23 -0
  241. package/public/r/comp-206.json +24 -0
  242. package/public/r/comp-207.json +23 -0
  243. package/public/r/comp-208.json +23 -0
  244. package/public/r/comp-209.json +23 -0
  245. package/public/r/comp-21.json +23 -0
  246. package/public/r/comp-210.json +24 -0
  247. package/public/r/comp-211.json +24 -0
  248. package/public/r/comp-212.json +23 -0
  249. package/public/r/comp-213.json +23 -0
  250. package/public/r/comp-214.json +23 -0
  251. package/public/r/comp-215.json +24 -0
  252. package/public/r/comp-216.json +22 -0
  253. package/public/r/comp-217.json +22 -0
  254. package/public/r/comp-218.json +25 -0
  255. package/public/r/comp-219.json +23 -0
  256. package/public/r/comp-22.json +23 -0
  257. package/public/r/comp-220.json +24 -0
  258. package/public/r/comp-221.json +23 -0
  259. package/public/r/comp-222.json +26 -0
  260. package/public/r/comp-223.json +26 -0
  261. package/public/r/comp-224.json +23 -0
  262. package/public/r/comp-225.json +24 -0
  263. package/public/r/comp-226.json +26 -0
  264. package/public/r/comp-227.json +26 -0
  265. package/public/r/comp-228.json +26 -0
  266. package/public/r/comp-229.json +30 -0
  267. package/public/r/comp-23.json +24 -0
  268. package/public/r/comp-230.json +30 -0
  269. package/public/r/comp-231.json +32 -0
  270. package/public/r/comp-232.json +31 -0
  271. package/public/r/comp-233.json +30 -0
  272. package/public/r/comp-234.json +28 -0
  273. package/public/r/comp-235.json +28 -0
  274. package/public/r/comp-236.json +24 -0
  275. package/public/r/comp-237.json +26 -0
  276. package/public/r/comp-238.json +26 -0
  277. package/public/r/comp-239.json +26 -0
  278. package/public/r/comp-24.json +23 -0
  279. package/public/r/comp-240.json +23 -0
  280. package/public/r/comp-241.json +24 -0
  281. package/public/r/comp-242.json +23 -0
  282. package/public/r/comp-243.json +23 -0
  283. package/public/r/comp-244.json +23 -0
  284. package/public/r/comp-245.json +23 -0
  285. package/public/r/comp-246.json +23 -0
  286. package/public/r/comp-247.json +23 -0
  287. package/public/r/comp-248.json +23 -0
  288. package/public/r/comp-249.json +24 -0
  289. package/public/r/comp-25.json +24 -0
  290. package/public/r/comp-250.json +25 -0
  291. package/public/r/comp-251.json +25 -0
  292. package/public/r/comp-252.json +25 -0
  293. package/public/r/comp-253.json +25 -0
  294. package/public/r/comp-254.json +35 -0
  295. package/public/r/comp-255.json +30 -0
  296. package/public/r/comp-256.json +25 -0
  297. package/public/r/comp-257.json +25 -0
  298. package/public/r/comp-258.json +32 -0
  299. package/public/r/comp-259.json +26 -0
  300. package/public/r/comp-26.json +24 -0
  301. package/public/r/comp-260.json +26 -0
  302. package/public/r/comp-261.json +24 -0
  303. package/public/r/comp-262.json +31 -0
  304. package/public/r/comp-263.json +25 -0
  305. package/public/r/comp-264.json +33 -0
  306. package/public/r/comp-265.json +32 -0
  307. package/public/r/comp-266.json +24 -0
  308. package/public/r/comp-267.json +19 -0
  309. package/public/r/comp-268.json +19 -0
  310. package/public/r/comp-269.json +19 -0
  311. package/public/r/comp-27.json +24 -0
  312. package/public/r/comp-270.json +19 -0
  313. package/public/r/comp-271.json +19 -0
  314. package/public/r/comp-272.json +19 -0
  315. package/public/r/comp-273.json +19 -0
  316. package/public/r/comp-274.json +19 -0
  317. package/public/r/comp-275.json +19 -0
  318. package/public/r/comp-276.json +19 -0
  319. package/public/r/comp-277.json +21 -0
  320. package/public/r/comp-278.json +21 -0
  321. package/public/r/comp-279.json +23 -0
  322. package/public/r/comp-28.json +24 -0
  323. package/public/r/comp-280.json +23 -0
  324. package/public/r/comp-281.json +23 -0
  325. package/public/r/comp-282.json +23 -0
  326. package/public/r/comp-283.json +23 -0
  327. package/public/r/comp-284.json +23 -0
  328. package/public/r/comp-285.json +23 -0
  329. package/public/r/comp-286.json +23 -0
  330. package/public/r/comp-287.json +24 -0
  331. package/public/r/comp-288.json +23 -0
  332. package/public/r/comp-289.json +24 -0
  333. package/public/r/comp-29.json +24 -0
  334. package/public/r/comp-290.json +24 -0
  335. package/public/r/comp-291.json +24 -0
  336. package/public/r/comp-292.json +24 -0
  337. package/public/r/comp-293.json +26 -0
  338. package/public/r/comp-294.json +24 -0
  339. package/public/r/comp-295.json +23 -0
  340. package/public/r/comp-296.json +23 -0
  341. package/public/r/comp-297.json +30 -0
  342. package/public/r/comp-298.json +26 -0
  343. package/public/r/comp-299.json +28 -0
  344. package/public/r/comp-30.json +23 -0
  345. package/public/r/comp-300.json +29 -0
  346. package/public/r/comp-301.json +24 -0
  347. package/public/r/comp-302.json +18 -0
  348. package/public/r/comp-303.json +18 -0
  349. package/public/r/comp-304.json +18 -0
  350. package/public/r/comp-305.json +21 -0
  351. package/public/r/comp-306.json +21 -0
  352. package/public/r/comp-307.json +21 -0
  353. package/public/r/comp-308.json +21 -0
  354. package/public/r/comp-309.json +21 -0
  355. package/public/r/comp-31.json +21 -0
  356. package/public/r/comp-310.json +23 -0
  357. package/public/r/comp-311.json +20 -0
  358. package/public/r/comp-312.json +21 -0
  359. package/public/r/comp-313.json +26 -0
  360. package/public/r/comp-314.json +26 -0
  361. package/public/r/comp-315.json +24 -0
  362. package/public/r/comp-316.json +25 -0
  363. package/public/r/comp-317.json +24 -0
  364. package/public/r/comp-318.json +24 -0
  365. package/public/r/comp-319.json +24 -0
  366. package/public/r/comp-32.json +21 -0
  367. package/public/r/comp-320.json +27 -0
  368. package/public/r/comp-321.json +28 -0
  369. package/public/r/comp-322.json +27 -0
  370. package/public/r/comp-323.json +30 -0
  371. package/public/r/comp-324.json +28 -0
  372. package/public/r/comp-325.json +29 -0
  373. package/public/r/comp-326.json +30 -0
  374. package/public/r/comp-327.json +30 -0
  375. package/public/r/comp-328.json +37 -0
  376. package/public/r/comp-329.json +38 -0
  377. package/public/r/comp-33.json +18 -0
  378. package/public/r/comp-330.json +27 -0
  379. package/public/r/comp-331.json +42 -0
  380. package/public/r/comp-332.json +25 -0
  381. package/public/r/comp-333.json +29 -0
  382. package/public/r/comp-334.json +22 -0
  383. package/public/r/comp-335.json +22 -0
  384. package/public/r/comp-336.json +22 -0
  385. package/public/r/comp-337.json +22 -0
  386. package/public/r/comp-338.json +22 -0
  387. package/public/r/comp-339.json +22 -0
  388. package/public/r/comp-34.json +27 -0
  389. package/public/r/comp-340.json +22 -0
  390. package/public/r/comp-341.json +22 -0
  391. package/public/r/comp-342.json +22 -0
  392. package/public/r/comp-343.json +22 -0
  393. package/public/r/comp-344.json +22 -0
  394. package/public/r/comp-345.json +22 -0
  395. package/public/r/comp-346.json +22 -0
  396. package/public/r/comp-347.json +22 -0
  397. package/public/r/comp-348.json +22 -0
  398. package/public/r/comp-349.json +22 -0
  399. package/public/r/comp-35.json +27 -0
  400. package/public/r/comp-350.json +22 -0
  401. package/public/r/comp-351.json +22 -0
  402. package/public/r/comp-352.json +24 -0
  403. package/public/r/comp-353.json +24 -0
  404. package/public/r/comp-354.json +23 -0
  405. package/public/r/comp-355.json +23 -0
  406. package/public/r/comp-356.json +23 -0
  407. package/public/r/comp-357.json +23 -0
  408. package/public/r/comp-358.json +23 -0
  409. package/public/r/comp-359.json +24 -0
  410. package/public/r/comp-36.json +26 -0
  411. package/public/r/comp-360.json +25 -0
  412. package/public/r/comp-361.json +23 -0
  413. package/public/r/comp-362.json +24 -0
  414. package/public/r/comp-363.json +27 -0
  415. package/public/r/comp-364.json +26 -0
  416. package/public/r/comp-365.json +24 -0
  417. package/public/r/comp-366.json +23 -0
  418. package/public/r/comp-367.json +23 -0
  419. package/public/r/comp-368.json +23 -0
  420. package/public/r/comp-369.json +23 -0
  421. package/public/r/comp-37.json +23 -0
  422. package/public/r/comp-370.json +23 -0
  423. package/public/r/comp-371.json +24 -0
  424. package/public/r/comp-372.json +24 -0
  425. package/public/r/comp-373.json +25 -0
  426. package/public/r/comp-374.json +26 -0
  427. package/public/r/comp-375.json +25 -0
  428. package/public/r/comp-376.json +26 -0
  429. package/public/r/comp-377.json +27 -0
  430. package/public/r/comp-378.json +24 -0
  431. package/public/r/comp-379.json +24 -0
  432. package/public/r/comp-38.json +23 -0
  433. package/public/r/comp-380.json +24 -0
  434. package/public/r/comp-381.json +26 -0
  435. package/public/r/comp-382.json +25 -0
  436. package/public/r/comp-383.json +26 -0
  437. package/public/r/comp-384.json +24 -0
  438. package/public/r/comp-385.json +24 -0
  439. package/public/r/comp-386.json +24 -0
  440. package/public/r/comp-387.json +28 -0
  441. package/public/r/comp-388.json +26 -0
  442. package/public/r/comp-389.json +24 -0
  443. package/public/r/comp-39.json +23 -0
  444. package/public/r/comp-390.json +23 -0
  445. package/public/r/comp-391.json +23 -0
  446. package/public/r/comp-392.json +23 -0
  447. package/public/r/comp-393.json +23 -0
  448. package/public/r/comp-394.json +24 -0
  449. package/public/r/comp-395.json +24 -0
  450. package/public/r/comp-396.json +24 -0
  451. package/public/r/comp-397.json +25 -0
  452. package/public/r/comp-398.json +26 -0
  453. package/public/r/comp-399.json +26 -0
  454. package/public/r/comp-40.json +23 -0
  455. package/public/r/comp-400.json +20 -0
  456. package/public/r/comp-401.json +19 -0
  457. package/public/r/comp-402.json +19 -0
  458. package/public/r/comp-403.json +19 -0
  459. package/public/r/comp-404.json +19 -0
  460. package/public/r/comp-405.json +19 -0
  461. package/public/r/comp-406.json +19 -0
  462. package/public/r/comp-407.json +19 -0
  463. package/public/r/comp-408.json +19 -0
  464. package/public/r/comp-409.json +22 -0
  465. package/public/r/comp-41.json +29 -0
  466. package/public/r/comp-410.json +22 -0
  467. package/public/r/comp-411.json +22 -0
  468. package/public/r/comp-412.json +19 -0
  469. package/public/r/comp-413.json +22 -0
  470. package/public/r/comp-414.json +22 -0
  471. package/public/r/comp-415.json +22 -0
  472. package/public/r/comp-416.json +23 -0
  473. package/public/r/comp-417.json +22 -0
  474. package/public/r/comp-418.json +23 -0
  475. package/public/r/comp-419.json +23 -0
  476. package/public/r/comp-42.json +30 -0
  477. package/public/r/comp-420.json +23 -0
  478. package/public/r/comp-421.json +23 -0
  479. package/public/r/comp-422.json +23 -0
  480. package/public/r/comp-423.json +24 -0
  481. package/public/r/comp-424.json +22 -0
  482. package/public/r/comp-425.json +23 -0
  483. package/public/r/comp-426.json +23 -0
  484. package/public/r/comp-427.json +23 -0
  485. package/public/r/comp-428.json +23 -0
  486. package/public/r/comp-429.json +23 -0
  487. package/public/r/comp-43.json +32 -0
  488. package/public/r/comp-430.json +23 -0
  489. package/public/r/comp-431.json +23 -0
  490. package/public/r/comp-432.json +23 -0
  491. package/public/r/comp-433.json +24 -0
  492. package/public/r/comp-434.json +24 -0
  493. package/public/r/comp-435.json +24 -0
  494. package/public/r/comp-436.json +24 -0
  495. package/public/r/comp-437.json +25 -0
  496. package/public/r/comp-438.json +23 -0
  497. package/public/r/comp-439.json +24 -0
  498. package/public/r/comp-44.json +25 -0
  499. package/public/r/comp-440.json +25 -0
  500. package/public/r/comp-441.json +25 -0
  501. package/public/r/comp-442.json +24 -0
  502. package/public/r/comp-443.json +24 -0
  503. package/public/r/comp-444.json +24 -0
  504. package/public/r/comp-445.json +24 -0
  505. package/public/r/comp-446.json +24 -0
  506. package/public/r/comp-447.json +25 -0
  507. package/public/r/comp-448.json +23 -0
  508. package/public/r/comp-449.json +23 -0
  509. package/public/r/comp-45.json +25 -0
  510. package/public/r/comp-450.json +23 -0
  511. package/public/r/comp-451.json +23 -0
  512. package/public/r/comp-452.json +23 -0
  513. package/public/r/comp-453.json +25 -0
  514. package/public/r/comp-454.json +22 -0
  515. package/public/r/comp-455.json +22 -0
  516. package/public/r/comp-456.json +22 -0
  517. package/public/r/comp-457.json +21 -0
  518. package/public/r/comp-458.json +22 -0
  519. package/public/r/comp-459.json +26 -0
  520. package/public/r/comp-46.json +26 -0
  521. package/public/r/comp-460.json +26 -0
  522. package/public/r/comp-461.json +27 -0
  523. package/public/r/comp-462.json +27 -0
  524. package/public/r/comp-463.json +30 -0
  525. package/public/r/comp-464.json +29 -0
  526. package/public/r/comp-465.json +29 -0
  527. package/public/r/comp-466.json +21 -0
  528. package/public/r/comp-467.json +23 -0
  529. package/public/r/comp-468.json +21 -0
  530. package/public/r/comp-469.json +21 -0
  531. package/public/r/comp-47.json +32 -0
  532. package/public/r/comp-470.json +21 -0
  533. package/public/r/comp-471.json +21 -0
  534. package/public/r/comp-472.json +23 -0
  535. package/public/r/comp-473.json +24 -0
  536. package/public/r/comp-474.json +22 -0
  537. package/public/r/comp-475.json +22 -0
  538. package/public/r/comp-476.json +21 -0
  539. package/public/r/comp-477.json +31 -0
  540. package/public/r/comp-478.json +36 -0
  541. package/public/r/comp-479.json +28 -0
  542. package/public/r/comp-48.json +32 -0
  543. package/public/r/comp-480.json +30 -0
  544. package/public/r/comp-481.json +34 -0
  545. package/public/r/comp-482.json +33 -0
  546. package/public/r/comp-483.json +37 -0
  547. package/public/r/comp-484.json +41 -0
  548. package/public/r/comp-485.json +43 -0
  549. package/public/r/comp-486.json +23 -0
  550. package/public/r/comp-487.json +26 -0
  551. package/public/r/comp-488.json +27 -0
  552. package/public/r/comp-489.json +28 -0
  553. package/public/r/comp-49.json +32 -0
  554. package/public/r/comp-490.json +23 -0
  555. package/public/r/comp-491.json +24 -0
  556. package/public/r/comp-492.json +25 -0
  557. package/public/r/comp-493.json +23 -0
  558. package/public/r/comp-494.json +23 -0
  559. package/public/r/comp-495.json +24 -0
  560. package/public/r/comp-496.json +23 -0
  561. package/public/r/comp-497.json +24 -0
  562. package/public/r/comp-498.json +24 -0
  563. package/public/r/comp-499.json +24 -0
  564. package/public/r/comp-50.json +32 -0
  565. package/public/r/comp-500.json +25 -0
  566. package/public/r/comp-501.json +25 -0
  567. package/public/r/comp-502.json +26 -0
  568. package/public/r/comp-503.json +27 -0
  569. package/public/r/comp-504.json +28 -0
  570. package/public/r/comp-505.json +28 -0
  571. package/public/r/comp-506.json +26 -0
  572. package/public/r/comp-507.json +27 -0
  573. package/public/r/comp-508.json +25 -0
  574. package/public/r/comp-509.json +25 -0
  575. package/public/r/comp-51.json +23 -0
  576. package/public/r/comp-510.json +24 -0
  577. package/public/r/comp-511.json +27 -0
  578. package/public/r/comp-512.json +27 -0
  579. package/public/r/comp-513.json +21 -0
  580. package/public/r/comp-514.json +21 -0
  581. package/public/r/comp-515.json +21 -0
  582. package/public/r/comp-516.json +22 -0
  583. package/public/r/comp-517.json +22 -0
  584. package/public/r/comp-518.json +21 -0
  585. package/public/r/comp-519.json +21 -0
  586. package/public/r/comp-52.json +23 -0
  587. package/public/r/comp-520.json +22 -0
  588. package/public/r/comp-521.json +22 -0
  589. package/public/r/comp-522.json +21 -0
  590. package/public/r/comp-523.json +21 -0
  591. package/public/r/comp-524.json +21 -0
  592. package/public/r/comp-525.json +21 -0
  593. package/public/r/comp-526.json +22 -0
  594. package/public/r/comp-527.json +23 -0
  595. package/public/r/comp-528.json +22 -0
  596. package/public/r/comp-529.json +22 -0
  597. package/public/r/comp-53.json +24 -0
  598. package/public/r/comp-530.json +22 -0
  599. package/public/r/comp-531.json +22 -0
  600. package/public/r/comp-532.json +22 -0
  601. package/public/r/comp-533.json +22 -0
  602. package/public/r/comp-534.json +22 -0
  603. package/public/r/comp-535.json +22 -0
  604. package/public/r/comp-536.json +22 -0
  605. package/public/r/comp-537.json +22 -0
  606. package/public/r/comp-538.json +22 -0
  607. package/public/r/comp-539.json +22 -0
  608. package/public/r/comp-54.json +26 -0
  609. package/public/r/comp-540.json +21 -0
  610. package/public/r/comp-541.json +21 -0
  611. package/public/r/comp-542.json +124 -0
  612. package/public/r/comp-543.json +29 -0
  613. package/public/r/comp-544.json +26 -0
  614. package/public/r/comp-545.json +29 -0
  615. package/public/r/comp-546.json +29 -0
  616. package/public/r/comp-547.json +29 -0
  617. package/public/r/comp-548.json +29 -0
  618. package/public/r/comp-549.json +29 -0
  619. package/public/r/comp-55.json +27 -0
  620. package/public/r/comp-550.json +29 -0
  621. package/public/r/comp-551.json +30 -0
  622. package/public/r/comp-552.json +29 -0
  623. package/public/r/comp-553.json +29 -0
  624. package/public/r/comp-554.json +36 -0
  625. package/public/r/comp-555.json +23 -0
  626. package/public/r/comp-556.json +23 -0
  627. package/public/r/comp-557.json +23 -0
  628. package/public/r/comp-558.json +23 -0
  629. package/public/r/comp-559.json +23 -0
  630. package/public/r/comp-56.json +26 -0
  631. package/public/r/comp-560.json +23 -0
  632. package/public/r/comp-561.json +25 -0
  633. package/public/r/comp-562.json +23 -0
  634. package/public/r/comp-563.json +23 -0
  635. package/public/r/comp-564.json +24 -0
  636. package/public/r/comp-565.json +20 -0
  637. package/public/r/comp-566.json +20 -0
  638. package/public/r/comp-567.json +20 -0
  639. package/public/r/comp-568.json +20 -0
  640. package/public/r/comp-569.json +20 -0
  641. package/public/r/comp-57.json +26 -0
  642. package/public/r/comp-570.json +20 -0
  643. package/public/r/comp-571.json +23 -0
  644. package/public/r/comp-572.json +23 -0
  645. package/public/r/comp-573.json +20 -0
  646. package/public/r/comp-574.json +22 -0
  647. package/public/r/comp-575.json +20 -0
  648. package/public/r/comp-576.json +21 -0
  649. package/public/r/comp-577.json +23 -0
  650. package/public/r/comp-578.json +28 -0
  651. package/public/r/comp-579.json +28 -0
  652. package/public/r/comp-58.json +25 -0
  653. package/public/r/comp-580.json +29 -0
  654. package/public/r/comp-581.json +45 -0
  655. package/public/r/comp-582.json +42 -0
  656. package/public/r/comp-583.json +41 -0
  657. package/public/r/comp-584.json +41 -0
  658. package/public/r/comp-585.json +41 -0
  659. package/public/r/comp-586.json +34 -0
  660. package/public/r/comp-587.json +29 -0
  661. package/public/r/comp-588.json +33 -0
  662. package/public/r/comp-589.json +37 -0
  663. package/public/r/comp-59.json +22 -0
  664. package/public/r/comp-590.json +40 -0
  665. package/public/r/comp-591.json +29 -0
  666. package/public/r/comp-592.json +41 -0
  667. package/public/r/comp-593.json +36 -0
  668. package/public/r/comp-594.json +33 -0
  669. package/public/r/comp-595.json +22 -0
  670. package/public/r/comp-596.json +26 -0
  671. package/public/r/comp-597.json +22 -0
  672. package/public/r/comp-598.json +22 -0
  673. package/public/r/comp-599.json +22 -0
  674. package/public/r/comp-60.json +23 -0
  675. package/public/r/comp-600.json +17 -0
  676. package/public/r/comp-601.json +20 -0
  677. package/public/r/comp-602.json +17 -0
  678. package/public/r/comp-603.json +20 -0
  679. package/public/r/comp-604.json +17 -0
  680. package/public/r/comp-605.json +17 -0
  681. package/public/r/comp-606.json +20 -0
  682. package/public/r/comp-607.json +20 -0
  683. package/public/r/comp-608.json +20 -0
  684. package/public/r/comp-609.json +20 -0
  685. package/public/r/comp-61.json +23 -0
  686. package/public/r/comp-610.json +23 -0
  687. package/public/r/comp-611.json +23 -0
  688. package/public/r/comp-612.json +17 -0
  689. package/public/r/comp-613.json +20 -0
  690. package/public/r/comp-614.json +17 -0
  691. package/public/r/comp-615.json +26 -0
  692. package/public/r/comp-616.json +26 -0
  693. package/public/r/comp-617.json +26 -0
  694. package/public/r/comp-62.json +23 -0
  695. package/public/r/comp-63.json +22 -0
  696. package/public/r/comp-64.json +23 -0
  697. package/public/r/comp-65.json +22 -0
  698. package/public/r/comp-66.json +22 -0
  699. package/public/r/comp-67.json +23 -0
  700. package/public/r/comp-68.json +24 -0
  701. package/public/r/comp-69.json +24 -0
  702. package/public/r/comp-70.json +24 -0
  703. package/public/r/comp-71.json +22 -0
  704. package/public/r/comp-72.json +21 -0
  705. package/public/r/comp-73.json +18 -0
  706. package/public/r/comp-74.json +27 -0
  707. package/public/r/comp-75.json +22 -0
  708. package/public/r/comp-76.json +23 -0
  709. package/public/r/comp-77.json +22 -0
  710. package/public/r/comp-78.json +21 -0
  711. package/public/r/comp-79.json +22 -0
  712. package/public/r/comp-80.json +21 -0
  713. package/public/r/comp-81.json +21 -0
  714. package/public/r/comp-82.json +22 -0
  715. package/public/r/comp-83.json +21 -0
  716. package/public/r/comp-84.json +21 -0
  717. package/public/r/comp-85.json +22 -0
  718. package/public/r/comp-86.json +22 -0
  719. package/public/r/comp-87.json +21 -0
  720. package/public/r/comp-88.json +22 -0
  721. package/public/r/comp-89.json +21 -0
  722. package/public/r/comp-90.json +22 -0
  723. package/public/r/comp-91.json +22 -0
  724. package/public/r/comp-92.json +22 -0
  725. package/public/r/comp-93.json +22 -0
  726. package/public/r/comp-94.json +24 -0
  727. package/public/r/comp-95.json +26 -0
  728. package/public/r/comp-96.json +21 -0
  729. package/public/r/comp-97.json +21 -0
  730. package/public/r/comp-98.json +22 -0
  731. package/public/r/comp-99.json +23 -0
  732. package/public/r/comparison-event-handlers.json +1 -1
  733. package/public/r/comparison-hover.json +1 -1
  734. package/public/r/comparison.json +1 -1
  735. package/public/r/context-menu.json +16 -0
  736. package/public/r/contribution-graph-custom-footer.json +1 -1
  737. package/public/r/credit-card-apple.json +1 -1
  738. package/public/r/credit-card-back.json +1 -1
  739. package/public/r/credit-card.json +1 -1
  740. package/public/r/cropper.json +15 -0
  741. package/public/r/cursor-color.json +1 -1
  742. package/public/r/cursor-message.json +1 -1
  743. package/public/r/cursor-name-message.json +1 -1
  744. package/public/r/cursor-name.json +1 -1
  745. package/public/r/cursor.json +1 -1
  746. package/public/r/dashboard-1.json +263 -0
  747. package/public/r/dashboard-2.json +264 -0
  748. package/public/r/dashboard-3.json +225 -0
  749. package/public/r/datefield-rac.json +15 -0
  750. package/public/r/deck-controlled.json +1 -1
  751. package/public/r/deck-product-cards.json +1 -1
  752. package/public/r/deck.json +1 -1
  753. package/public/r/dialog-close-confirmation.json +1 -1
  754. package/public/r/dialog-demo.json +1 -1
  755. package/public/r/dialog-from-menu.json +1 -1
  756. package/public/r/dialog-nested.json +1 -1
  757. package/public/r/dialog-stack-controlled.json +1 -1
  758. package/public/r/dialog-stack-navigation.json +1 -1
  759. package/public/r/dialog-stack-six.json +1 -1
  760. package/public/r/dialog-stack.json +1 -1
  761. package/public/r/dropdown-menu.json +15 -0
  762. package/public/r/dropzone-custom-empty-state.json +1 -1
  763. package/public/r/dropzone-image-preview.json +1 -1
  764. package/public/r/editor.json +1 -1
  765. package/public/r/emails.json +243 -0
  766. package/public/r/empty-demo.json +1 -1
  767. package/public/r/example-app-calendar.json +323 -0
  768. package/public/r/field-2.json +19 -0
  769. package/public/r/field-autocomplete.json +1 -1
  770. package/public/r/field-checkbox-group.json +1 -1
  771. package/public/r/field-checkbox.json +1 -1
  772. package/public/r/field-combobox-multiple.json +1 -1
  773. package/public/r/field-combobox.json +1 -1
  774. package/public/r/field-complete-form.json +1 -1
  775. package/public/r/field-demo.json +1 -1
  776. package/public/r/field-disabled.json +1 -1
  777. package/public/r/field-error.json +1 -1
  778. package/public/r/field-number-field.json +1 -1
  779. package/public/r/field-radio.json +1 -1
  780. package/public/r/field-required.json +1 -1
  781. package/public/r/field-select.json +1 -1
  782. package/public/r/field-slider.json +1 -1
  783. package/public/r/field-switch.json +1 -1
  784. package/public/r/field-textarea.json +1 -1
  785. package/public/r/field-validity.json +1 -1
  786. package/public/r/fieldset-demo.json +1 -1
  787. package/public/r/files.json +195 -0
  788. package/public/r/form-demo.json +1 -1
  789. package/public/r/form-zod.json +1 -1
  790. package/public/r/form.json +1 -1
  791. package/public/r/frame-demo.json +1 -1
  792. package/public/r/gantt-lanes.json +1 -1
  793. package/public/r/gantt-no-sidebar.json +1 -1
  794. package/public/r/gantt-read-only.json +1 -1
  795. package/public/r/gantt.json +1 -1
  796. package/public/r/glimpse-custom.json +1 -1
  797. package/public/r/glimpse.json +1 -1
  798. package/public/r/gooey-toast-demo.json +1 -1
  799. package/public/r/gooey-toast-promise.json +1 -1
  800. package/public/r/gooey-toast-states.json +1 -1
  801. package/public/r/gooey-toast-with-button.json +1 -1
  802. package/public/r/group-demo.json +1 -1
  803. package/public/r/group-with-input.json +1 -1
  804. package/public/r/hero.json +1 -1
  805. package/public/r/hover-card.json +15 -0
  806. package/public/r/image-crop-circular.json +1 -1
  807. package/public/r/image-crop-custom.json +1 -1
  808. package/public/r/image-crop.json +1 -1
  809. package/public/r/image-zoom-background.json +1 -1
  810. package/public/r/image-zoom-margin.json +1 -1
  811. package/public/r/image-zoom.json +1 -1
  812. package/public/r/input-demo.json +1 -1
  813. package/public/r/input-disabled.json +1 -1
  814. package/public/r/input-file.json +1 -1
  815. package/public/r/input-group.json +20 -0
  816. package/public/r/input-lg.json +1 -1
  817. package/public/r/input-sm.json +1 -1
  818. package/public/r/input-with-button.json +1 -1
  819. package/public/r/input-with-label.json +1 -1
  820. package/public/r/kanban-simple.json +1 -1
  821. package/public/r/kanban.json +1 -1
  822. package/public/r/kbd.json +12 -0
  823. package/public/r/leads.json +271 -0
  824. package/public/r/list-simple.json +1 -1
  825. package/public/r/list.json +1 -1
  826. package/public/r/maps.json +188 -0
  827. package/public/r/menu-checkbox.json +1 -1
  828. package/public/r/menu-close-on-click.json +1 -1
  829. package/public/r/menu-demo.json +1 -1
  830. package/public/r/menu-group-labels.json +1 -1
  831. package/public/r/menu-hover.json +1 -1
  832. package/public/r/menu-link.json +1 -1
  833. package/public/r/menu-nested.json +1 -1
  834. package/public/r/menu-radio-group.json +1 -1
  835. package/public/r/meter-demo.json +1 -1
  836. package/public/r/meter-with-formatted-value.json +1 -1
  837. package/public/r/meter-with-range.json +1 -1
  838. package/public/r/mini-calendar-controlled.json +1 -1
  839. package/public/r/multiselect.json +15 -0
  840. package/public/r/navigation-menu.json +12 -0
  841. package/public/r/number-field-form.json +1 -1
  842. package/public/r/number-field-with-label.json +1 -1
  843. package/public/r/number-field-with-scrub.json +1 -1
  844. package/public/r/number-field-with-step.json +1 -1
  845. package/public/r/pill-avatar-group.json +1 -1
  846. package/public/r/pill-delta.json +1 -1
  847. package/public/r/pill-icon.json +1 -1
  848. package/public/r/pill-indicator.json +1 -1
  849. package/public/r/pill-status.json +1 -1
  850. package/public/r/pill.json +1 -1
  851. package/public/r/popover-demo.json +1 -1
  852. package/public/r/popover-with-close.json +1 -1
  853. package/public/r/preview-card-demo.json +1 -1
  854. package/public/r/pricing.json +1 -1
  855. package/public/r/progress-with-formatted-value.json +1 -1
  856. package/public/r/progress-with-label-value.json +1 -1
  857. package/public/r/radio-group-card.json +1 -1
  858. package/public/r/radio-group-demo.json +1 -1
  859. package/public/r/radio-group-disabled.json +1 -1
  860. package/public/r/radio-group-form.json +1 -1
  861. package/public/r/radio-group-with-description.json +1 -1
  862. package/public/r/reel-custom.json +1 -1
  863. package/public/r/reel-images.json +1 -1
  864. package/public/r/reel-minimal.json +1 -1
  865. package/public/r/reel.json +1 -1
  866. package/public/r/registry.json +18217 -0
  867. package/public/r/relative-time-controlled.json +1 -1
  868. package/public/r/relative-time-format-date.json +1 -1
  869. package/public/r/relative-time-format-time.json +1 -1
  870. package/public/r/relative-time.json +1 -1
  871. package/public/r/rentals.json +187 -0
  872. package/public/r/roadmap.json +1 -1
  873. package/public/r/sandbox-no-file-explorer.json +1 -1
  874. package/public/r/sandbox.json +1 -1
  875. package/public/r/scroll-area-both.json +1 -1
  876. package/public/r/scroll-area-demo.json +1 -1
  877. package/public/r/scroll-area-horizontal.json +1 -1
  878. package/public/r/select-demo.json +1 -1
  879. package/public/r/select-disabled.json +1 -1
  880. package/public/r/select-form.json +1 -1
  881. package/public/r/select-lg.json +1 -1
  882. package/public/r/select-native.json +12 -0
  883. package/public/r/select-sm.json +1 -1
  884. package/public/r/select-with-groups.json +1 -1
  885. package/public/r/select-without-alignment.json +1 -1
  886. package/public/r/select.json +1 -1
  887. package/public/r/separator-demo.json +1 -1
  888. package/public/r/sheet-demo.json +1 -1
  889. package/public/r/sheet-position.json +1 -1
  890. package/public/r/sidebar-nav.json +22 -0
  891. package/public/r/skeleton-demo.json +1 -1
  892. package/public/r/skeleton.json +1 -1
  893. package/public/r/slider-form.json +1 -1
  894. package/public/r/slider-with-label-value.json +1 -1
  895. package/public/r/sonner.json +16 -0
  896. package/public/r/stats-card.json +22 -0
  897. package/public/r/status-custom.json +1 -1
  898. package/public/r/stepper.json +15 -0
  899. package/public/r/stories-images.json +1 -1
  900. package/public/r/switch-card.json +1 -1
  901. package/public/r/switch-demo.json +1 -1
  902. package/public/r/switch-disabled.json +1 -1
  903. package/public/r/switch-form.json +1 -1
  904. package/public/r/switch-with-description.json +1 -1
  905. package/public/r/table-demo.json +1 -1
  906. package/public/r/table-framed.json +1 -1
  907. package/public/r/table-simple.json +1 -1
  908. package/public/r/table.json +1 -1
  909. package/public/r/tabs-demo.json +1 -1
  910. package/public/r/tabs-underline-vertical.json +1 -1
  911. package/public/r/tabs-underline.json +1 -1
  912. package/public/r/tabs-vertical.json +1 -1
  913. package/public/r/tags-create.json +1 -1
  914. package/public/r/tags-filter.json +1 -1
  915. package/public/r/tags.json +1 -1
  916. package/public/r/template-auth-eight.json +28 -0
  917. package/public/r/template-auth-five.json +28 -0
  918. package/public/r/template-auth-four.json +29 -0
  919. package/public/r/template-auth-nine.json +28 -0
  920. package/public/r/template-auth-one.json +49 -0
  921. package/public/r/template-auth-seven.json +29 -0
  922. package/public/r/template-auth-six.json +28 -0
  923. package/public/r/template-auth-three.json +49 -0
  924. package/public/r/template-auth-two.json +44 -0
  925. package/public/r/template-hero-eight.json +83 -0
  926. package/public/r/template-hero-eleven.json +29 -0
  927. package/public/r/template-hero-five.json +35 -0
  928. package/public/r/template-hero-four.json +35 -0
  929. package/public/r/template-hero-fourteen.json +101 -0
  930. package/public/r/template-hero-nine.json +74 -0
  931. package/public/r/template-hero-one.json +90 -0
  932. package/public/r/template-hero-seven.json +83 -0
  933. package/public/r/template-hero-six.json +83 -0
  934. package/public/r/template-hero-ten.json +77 -0
  935. package/public/r/template-hero-thirteen.json +101 -0
  936. package/public/r/template-hero-three.json +35 -0
  937. package/public/r/template-hero-twelve.json +30 -0
  938. package/public/r/template-hero-two.json +96 -0
  939. package/public/r/template-logo-cloud-five.json +68 -0
  940. package/public/r/template-logo-cloud-four.json +71 -0
  941. package/public/r/template-logo-cloud-one.json +89 -0
  942. package/public/r/template-logo-cloud-three.json +71 -0
  943. package/public/r/template-logo-cloud-two.json +74 -0
  944. package/public/r/textarea-demo.json +1 -1
  945. package/public/r/textarea-disabled.json +1 -1
  946. package/public/r/textarea-form.json +1 -1
  947. package/public/r/textarea-lg.json +1 -1
  948. package/public/r/textarea-sm.json +1 -1
  949. package/public/r/textarea-with-label.json +1 -1
  950. package/public/r/ticker-inline.json +1 -1
  951. package/public/r/timeline.json +15 -0
  952. package/public/r/toast-demo.json +1 -1
  953. package/public/r/toast-heights.json +1 -1
  954. package/public/r/toast-loading.json +1 -1
  955. package/public/r/toast-promise.json +1 -1
  956. package/public/r/toast-with-action.json +1 -1
  957. package/public/r/toast-with-status.json +1 -1
  958. package/public/r/toggle-demo.json +1 -1
  959. package/public/r/toggle-disabled.json +1 -1
  960. package/public/r/toggle-group-demo.json +1 -1
  961. package/public/r/toggle-group-disabled.json +1 -1
  962. package/public/r/toggle-group-lg.json +1 -1
  963. package/public/r/toggle-group-multiple.json +1 -1
  964. package/public/r/toggle-group-outline-with-separator.json +1 -1
  965. package/public/r/toggle-group-outline.json +1 -1
  966. package/public/r/toggle-group-sm.json +1 -1
  967. package/public/r/toggle-group-with-disabled-item.json +1 -1
  968. package/public/r/toggle-icon-group.json +1 -1
  969. package/public/r/toggle-lg.json +1 -1
  970. package/public/r/toggle-outline.json +1 -1
  971. package/public/r/toggle-sm.json +1 -1
  972. package/public/r/toggle-with-icon.json +1 -1
  973. package/public/r/toolbar-demo.json +1 -1
  974. package/public/r/tooltip-demo.json +1 -1
  975. package/public/r/tooltip-grouped.json +1 -1
  976. package/public/r/tree-controlled.json +1 -1
  977. package/public/r/tree-custom-icons.json +1 -1
  978. package/public/r/tree-no-lines.json +1 -1
  979. package/public/r/tree-simple.json +1 -1
  980. package/public/r/tree.json +1 -1
  981. package/public/r/typography.json +1 -1
  982. package/public/r/ui.json +5 -0
  983. package/public/r/use-character-limit.json +12 -0
  984. package/public/r/use-file-upload.json +12 -0
  985. package/public/r/use-pagination.json +12 -0
  986. package/public/r/use-slider-with-input.json +12 -0
  987. package/public/r/use-toast.json +12 -0
  988. package/public/r/utils.json +16 -0
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-loading.tsx",
11
- "content": "import { LoaderCircleIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonLoading() {\n return (\n <Button disabled>\n <LoaderCircleIcon className=\"animate-spin\" />\n Loading...\n </Button>\n )\n}\n",
11
+ "content": "import { LoaderCircleIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonLoading() {\n return (\n <Button disabled>\n <LoaderCircleIcon className=\"animate-spin\" />\n Updated Loading...\n </Button>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-outline.tsx",
11
- "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonOutline() {\n return <Button variant=\"outline\">Outline</Button>\n}\n",
11
+ "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonOutline() {\n return <Button variant=\"outline\">Updated Outline</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-secondary.tsx",
11
- "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonSecondary() {\n return <Button variant=\"secondary\">Secondary</Button>\n}\n",
11
+ "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonSecondary() {\n return <Button variant=\"secondary\">Updated Secondary</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-sm.tsx",
11
- "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonSm() {\n return <Button size=\"sm\">Button</Button>\n}\n",
11
+ "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonSm() {\n return <Button size=\"sm\">Updated Button</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-with-icon.tsx",
11
- "content": "import { DownloadIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonWithIcon() {\n return (\n <Button>\n <DownloadIcon />\n Download\n </Button>\n )\n}\n",
11
+ "content": "import { DownloadIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonWithIcon() {\n return (\n <Button>\n <DownloadIcon />\n Updated Download\n </Button>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-with-link.tsx",
11
- "content": "import Link from \"next/link\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonWithLink() {\n return <Button render={<Link href=\"/\" />}>Link</Button>\n}\n",
11
+ "content": "import Link from \"next/link\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonWithLink() {\n return <Button render={<Link href=\"/\" />}>Updated Link</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-xl.tsx",
11
- "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonXl() {\n return <Button size=\"xl\">Button</Button>\n}\n",
11
+ "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonXl() {\n return <Button size=\"xl\">Updated Button</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/button-xs.tsx",
11
- "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonXs() {\n return <Button size=\"xs\">Button</Button>\n}\n",
11
+ "content": "import { Button } from \"@/registry/default/ui/button\"\n\nexport default function ButtonXs() {\n return <Button size=\"xs\">Updated Button</Button>\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/calendar-headless.tsx",
12
- "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\n\nimport {\n CalendarBody,\n CalendarHeader,\n CalendarItem,\n CalendarProvider,\n} from \"../../../../../packages/calendar\"\n\n// Seed faker to ensure consistent data between server and client\nfaker.seed(123)\n\nconst capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n\nconst statuses = [\n { id: faker.string.uuid(), name: \"Planned\", color: \"#6B7280\" },\n { id: faker.string.uuid(), name: \"In Progress\", color: \"#F59E0B\" },\n { id: faker.string.uuid(), name: \"Done\", color: \"#10B981\" },\n]\n\nconst exampleFeatures = Array.from({ length: 20 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n startAt: faker.date.past({ years: 0.5, refDate: new Date() }),\n endAt: faker.date.future({ years: 0.5, refDate: new Date() }),\n status: faker.helpers.arrayElement(statuses),\n }))\n\nconst Example = () => (\n <CalendarProvider>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nexport default Example\n",
12
+ "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\n\nimport {\n CalendarBody,\n CalendarHeader,\n CalendarItem,\n CalendarProvider,\n} from \"../../../../../packages/calendar\"\n\n// Seed faker to ensure consistent data between server and client\nfaker.seed(123)\n\nconst capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n\nconst statuses = [\n { id: faker.string.uuid(), name: \"Updated Planned\", color: \"#6B7280\" },\n { id: faker.string.uuid(), name: \"Updated In Progress\", color: \"#F59E0B\" },\n { id: faker.string.uuid(), name: \"Updated Done\", color: \"#10B981\" },\n]\n\nconst exampleFeatures = Array.from({ length: 20 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n startAt: faker.date.past({ years: 0.5, refDate: new Date() }),\n endAt: faker.date.future({ years: 0.5, refDate: new Date() }),\n status: faker.helpers.arrayElement(statuses),\n }))\n\nconst Example = () => (\n <CalendarProvider>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nexport default Example\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "calendar-rac",
4
+ "type": "registry:ui",
5
+ "dependencies": [
6
+ "react-aria-components",
7
+ "@internationalized/date"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/ui/calendar-rac.tsx",
12
+ "content": "\"use client\"\n\nimport { ComponentProps } from \"react\"\nimport { getLocalTimeZone, today } from \"@internationalized/date\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\nimport {\n Button,\n CalendarCell as CalendarCellRac,\n CalendarGridBody as CalendarGridBodyRac,\n CalendarGridHeader as CalendarGridHeaderRac,\n CalendarGrid as CalendarGridRac,\n CalendarHeaderCell as CalendarHeaderCellRac,\n Calendar as CalendarRac,\n composeRenderProps,\n Heading as HeadingRac,\n RangeCalendar as RangeCalendarRac,\n} from \"react-aria-components\"\n\nimport { cn } from \"@/registry/default/lib/utils\"\n\ninterface BaseCalendarProps {\n className?: string\n}\n\ntype CalendarProps = ComponentProps<typeof CalendarRac> & BaseCalendarProps\ntype RangeCalendarProps = ComponentProps<typeof RangeCalendarRac> &\n BaseCalendarProps\n\nfunction CalendarHeader() {\n return (\n <header className=\"flex w-full items-center gap-1 pb-1\">\n <Button\n slot=\"previous\"\n className=\"flex size-9 items-center justify-center rounded-md text-muted-foreground/80 transition-[color,box-shadow] outline-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50\"\n >\n <ChevronLeftIcon size={16} />\n </Button>\n <HeadingRac className=\"grow text-center text-sm font-medium\" />\n <Button\n slot=\"next\"\n className=\"flex size-9 items-center justify-center rounded-md text-muted-foreground/80 transition-[color,box-shadow] outline-none hover:bg-accent hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50\"\n >\n <ChevronRightIcon size={16} />\n </Button>\n </header>\n )\n}\n\nfunction CalendarGridComponent({ isRange = false }: { isRange?: boolean }) {\n const now = today(getLocalTimeZone())\n\n return (\n <CalendarGridRac>\n <CalendarGridHeaderRac>\n {(day) => (\n <CalendarHeaderCellRac className=\"size-9 rounded-md p-0 text-xs font-medium text-muted-foreground/80\">\n {day}\n </CalendarHeaderCellRac>\n )}\n </CalendarGridHeaderRac>\n <CalendarGridBodyRac className=\"[&_td]:px-0 [&_td]:py-px\">\n {(date) => (\n <CalendarCellRac\n date={date}\n className={cn(\n \"relative flex size-9 items-center justify-center rounded-md p-0 text-sm font-normal whitespace-nowrap text-foreground [transition-property:color,background-color,border-radius,box-shadow] duration-150 outline-none data-disabled:pointer-events-none data-disabled:opacity-30 data-focus-visible:z-10 data-focus-visible:ring-[3px] data-focus-visible:ring-ring/50 data-hovered:bg-accent data-hovered:text-foreground data-selected:bg-primary data-selected:text-primary-foreground data-unavailable:pointer-events-none data-unavailable:line-through data-unavailable:opacity-30\",\n // Range-specific styles\n isRange &&\n \"data-invalid:bg-red-100 data-selected:rounded-none data-selected:bg-accent data-selected:text-foreground data-selection-end:rounded-e-md data-selection-end:bg-primary data-selection-end:text-primary-foreground data-invalid:data-selection-end:bg-destructive data-invalid:data-selection-end:text-white data-selection-start:rounded-s-md data-selection-start:bg-primary data-selection-start:text-primary-foreground data-invalid:data-selection-start:bg-destructive data-invalid:data-selection-start:text-white\",\n // Today indicator styles\n date.compare(now) === 0 &&\n cn(\n \"after:pointer-events-none after:absolute after:start-1/2 after:bottom-1 after:z-10 after:size-[3px] after:-translate-x-1/2 after:rounded-full after:bg-primary\",\n isRange\n ? \"data-selection-end:after:bg-background data-selection-start:after:bg-background\"\n : \"data-selected:after:bg-background\"\n )\n )}\n />\n )}\n </CalendarGridBodyRac>\n </CalendarGridRac>\n )\n}\n\nfunction Calendar({ className, ...props }: CalendarProps) {\n return (\n <CalendarRac\n {...props}\n className={composeRenderProps(className, (className) =>\n cn(\"w-fit\", className)\n )}\n >\n <CalendarHeader />\n <CalendarGridComponent />\n </CalendarRac>\n )\n}\n\nfunction RangeCalendar({ className, ...props }: RangeCalendarProps) {\n return (\n <RangeCalendarRac\n {...props}\n className={composeRenderProps(className, (className) =>\n cn(\"w-fit\", className)\n )}\n >\n <CalendarHeader />\n <CalendarGridComponent isRange />\n </RangeCalendarRac>\n )\n}\n\nexport { Calendar, RangeCalendar }\n",
13
+ "type": "registry:ui"
14
+ }
15
+ ]
16
+ }
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/calendar.tsx",
12
- "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\n\nimport {\n CalendarBody,\n CalendarDate,\n CalendarDatePagination,\n CalendarDatePicker,\n CalendarHeader,\n CalendarItem,\n CalendarMonthPicker,\n CalendarProvider,\n CalendarYearPicker,\n} from \"../../../../../packages/calendar\"\n\n// Seed faker to ensure consistent data between server and client\nfaker.seed(123)\n\nconst capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n\nconst statuses = [\n { id: faker.string.uuid(), name: \"Planned\", color: \"#6B7280\" },\n { id: faker.string.uuid(), name: \"In Progress\", color: \"#F59E0B\" },\n { id: faker.string.uuid(), name: \"Done\", color: \"#10B981\" },\n]\n\nconst exampleFeatures = Array.from({ length: 20 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n startAt: faker.date.past({ years: 0.5, refDate: new Date() }),\n endAt: faker.date.future({ years: 0.5, refDate: new Date() }),\n status: faker.helpers.arrayElement(statuses),\n }))\n\nconst earliestYear =\n exampleFeatures\n .map((feature) => feature.startAt.getFullYear())\n .sort()\n .at(0) ?? new Date().getFullYear()\n\nconst latestYear =\n exampleFeatures\n .map((feature) => feature.endAt.getFullYear())\n .sort()\n .at(-1) ?? new Date().getFullYear()\n\nconst Example = () => (\n <CalendarProvider>\n <CalendarDate>\n <CalendarDatePicker>\n <CalendarMonthPicker />\n <CalendarYearPicker end={latestYear} start={earliestYear} />\n </CalendarDatePicker>\n <CalendarDatePagination />\n </CalendarDate>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nexport default Example\n",
12
+ "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\n\nimport {\n CalendarBody,\n CalendarDate,\n CalendarDatePagination,\n CalendarDatePicker,\n CalendarHeader,\n CalendarItem,\n CalendarMonthPicker,\n CalendarProvider,\n CalendarYearPicker,\n} from \"../../../../../packages/calendar\"\n\n// Seed faker to ensure consistent data between server and client\nfaker.seed(123)\n\nconst capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n\nconst statuses = [\n { id: faker.string.uuid(), name: \"Updated Planned\", color: \"#6B7280\" },\n { id: faker.string.uuid(), name: \"Updated In Progress\", color: \"#F59E0B\" },\n { id: faker.string.uuid(), name: \"Updated Done\", color: \"#10B981\" },\n]\n\nconst exampleFeatures = Array.from({ length: 20 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n startAt: faker.date.past({ years: 0.5, refDate: new Date() }),\n endAt: faker.date.future({ years: 0.5, refDate: new Date() }),\n status: faker.helpers.arrayElement(statuses),\n }))\n\nconst earliestYear =\n exampleFeatures\n .map((feature) => feature.startAt.getFullYear())\n .sort()\n .at(0) ?? new Date().getFullYear()\n\nconst latestYear =\n exampleFeatures\n .map((feature) => feature.endAt.getFullYear())\n .sort()\n .at(-1) ?? new Date().getFullYear()\n\nconst Example = () => (\n <CalendarProvider>\n <CalendarDate>\n <CalendarDatePicker>\n <CalendarMonthPicker />\n <CalendarYearPicker end={latestYear} start={earliestYear} />\n </CalendarDatePicker>\n <CalendarDatePagination />\n </CalendarDate>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nexport default Example\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -12,7 +12,7 @@
12
12
  "files": [
13
13
  {
14
14
  "path": "registry/default/examples/card-demo.tsx",
15
- "content": "import { Button } from \"@/registry/default/ui/button\"\nimport {\n Card,\n CardDescription,\n CardFooter,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/registry/default/ui/card\"\nimport { Field, FieldControl, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst frameworkOptions = [\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Remix\", value: \"remix\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function CardDemo() {\n return (\n <Card className=\"w-full max-w-xs\">\n <CardHeader>\n <CardTitle>Create project</CardTitle>\n <CardDescription>Deploy your new project in one-click.</CardDescription>\n </CardHeader>\n <Form>\n <CardPanel>\n <div className=\"flex flex-col gap-4\">\n <Field>\n <FieldLabel>Name</FieldLabel>\n <FieldControl type=\"text\" placeholder=\"Name of your project\" />\n </Field>\n <Field>\n <FieldLabel>Framework</FieldLabel>\n <Select items={frameworkOptions} defaultValue=\"next\">\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {frameworkOptions.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </Field>\n </div>\n </CardPanel>\n <CardFooter>\n <Button className=\"w-full\" type=\"submit\">\n Deploy\n </Button>\n </CardFooter>\n </Form>\n </Card>\n )\n}\n",
15
+ "content": "import { Button } from \"@/registry/default/ui/button\"\nimport {\n Card,\n CardDescription,\n CardFooter,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/registry/default/ui/card\"\nimport { Field, FieldControl, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst frameworkOptions = [\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Remix\", value: \"remix\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function CardDemo() {\n return (\n <Card className=\"w-full max-w-xs\">\n <CardHeader>\n <CardTitle>Updated Create project</CardTitle>\n <CardDescription>\n Updated Deploy your new project in one-click.\n </CardDescription>\n </CardHeader>\n <Form>\n <CardPanel>\n <div className=\"flex flex-col gap-4\">\n <Field>\n <FieldLabel>Updated Name</FieldLabel>\n <FieldControl\n type=\"text\"\n placeholder=\"Updated Name of your project\"\n />\n </Field>\n <Field>\n <FieldLabel>Updated Framework</FieldLabel>\n <Select items={frameworkOptions} defaultValue=\"next\">\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {frameworkOptions.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n </Field>\n </div>\n </CardPanel>\n <CardFooter>\n <Button className=\"w-full\" type=\"submit\">\n Updated Deploy\n </Button>\n </CardFooter>\n </Form>\n </Card>\n )\n}\n",
16
16
  "type": "registry:example"
17
17
  }
18
18
  ],
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "chart",
4
+ "dependencies": [
5
+ "recharts"
6
+ ],
7
+ "files": [
8
+ {
9
+ "path": "registry/default/ui/chart.tsx",
10
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"@/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n }) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item?.dataKey || item?.name || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || item.payload.fill || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as any\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean\n nameKey?: string\n }) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n",
11
+ "type": "registry:ui"
12
+ }
13
+ ],
14
+ "type": "registry:ui"
15
+ }
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/checkbox-card.tsx",
12
- "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxCardDemo() {\n return (\n <Label className=\"flex items-start gap-2 rounded-lg border p-3 hover:bg-accent/50 has-data-checked:border-primary/48 has-data-checked:bg-accent/50\">\n <Checkbox defaultChecked />\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm leading-4\">Enable notifications</p>\n <p className=\"text-xs text-muted-foreground\">\n You can enable or disable notifications at any time.\n </p>\n </div>\n </Label>\n )\n}\n",
12
+ "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxCardDemo() {\n return (\n <Label className=\"flex items-start gap-2 rounded-lg border p-3 hover:bg-accent/50 has-data-checked:border-primary/48 has-data-checked:bg-accent/50\">\n <Checkbox defaultChecked />\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm leading-4\">Updated Enable notifications</p>\n <p className=\"text-xs text-muted-foreground\">\n Updated You can enable or disable notifications at any time.\n </p>\n </div>\n </Label>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/checkbox-demo.tsx",
12
- "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxDemo() {\n return (\n <Label>\n <Checkbox />\n Accept terms and conditions\n </Label>\n )\n}\n",
12
+ "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxDemo() {\n return (\n <Label>\n <Checkbox />\n Updated Accept terms and conditions\n </Label>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/checkbox-disabled.tsx",
12
- "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxDisabledDemo() {\n return (\n <Label>\n <Checkbox defaultChecked disabled />\n Accept terms and conditions\n </Label>\n )\n}\n",
12
+ "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxDisabledDemo() {\n return (\n <Label>\n <Checkbox defaultChecked disabled />\n Updated Accept terms and conditions\n </Label>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "registry/default/examples/checkbox-form.tsx",
14
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Field, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\n\nexport default function CheckboxFormDemo() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const accepted = formData.get(\"terms\")\n alert(`Terms: ${accepted}`)\n }\n return (\n <Form onSubmit={onSubmit} className=\"w-auto\">\n <Field name=\"terms\">\n <FieldLabel>\n <Checkbox\n name=\"terms\"\n value=\"yes\"\n defaultChecked\n disabled={loading}\n />\n Accept terms and conditions\n </FieldLabel>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Submit\n </Button>\n </Form>\n )\n}\n",
14
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Field, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\n\nexport default function CheckboxFormDemo() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const accepted = formData.get(\"terms\")\n alert(`Terms: ${accepted}`)\n }\n return (\n <Form onSubmit={onSubmit} className=\"w-auto\">\n <Field name=\"terms\">\n <FieldLabel>\n <Checkbox\n name=\"terms\"\n value=\"yes\"\n defaultChecked\n disabled={loading}\n />\n Updated Accept terms and conditions\n </FieldLabel>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Updated Submit\n </Button>\n </Form>\n )\n}\n",
15
15
  "type": "registry:example"
16
16
  }
17
17
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/checkbox-group-demo.tsx",
13
- "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxGroupDemo() {\n return (\n <CheckboxGroup aria-label=\"Select frameworks\" defaultValue={[\"next\"]}>\n <Label>\n <Checkbox value=\"next\" />\n Next.js\n </Label>\n <Label>\n <Checkbox value=\"vite\" />\n Vite\n </Label>\n <Label>\n <Checkbox value=\"astro\" />\n Astro\n </Label>\n </CheckboxGroup>\n )\n}\n",
13
+ "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxGroupDemo() {\n return (\n <CheckboxGroup\n aria-label=\"Updated Select frameworks\"\n defaultValue={[\"next\"]}\n >\n <Label>\n <Checkbox value=\"next\" />\n Updated Next.js\n </Label>\n <Label>\n <Checkbox value=\"vite\" />\n Updated Vite\n </Label>\n <Label>\n <Checkbox value=\"astro\" />\n Updated Astro\n </Label>\n </CheckboxGroup>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/checkbox-group-disabled.tsx",
13
- "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxGroupDemo() {\n return (\n <CheckboxGroup aria-label=\"Select frameworks\" defaultValue={[\"next\"]}>\n <Label>\n <Checkbox value=\"next\" />\n Next.js\n </Label>\n <Label>\n <Checkbox value=\"vite\" disabled />\n Vite\n </Label>\n <Label>\n <Checkbox value=\"astro\" />\n Astro\n </Label>\n </CheckboxGroup>\n )\n}\n",
13
+ "content": "import { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxGroupDemo() {\n return (\n <CheckboxGroup\n aria-label=\"Updated Select frameworks\"\n defaultValue={[\"next\"]}\n >\n <Label>\n <Checkbox value=\"next\" />\n Updated Next.js\n </Label>\n <Label>\n <Checkbox value=\"vite\" disabled />\n Updated Vite\n </Label>\n <Label>\n <Checkbox value=\"astro\" />\n Updated Astro\n </Label>\n </CheckboxGroup>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -13,7 +13,7 @@
13
13
  "files": [
14
14
  {
15
15
  "path": "registry/default/examples/checkbox-group-form.tsx",
16
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Field, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Fieldset, FieldsetLegend } from \"@/registry/default/ui/fieldset\"\nimport { Form } from \"@/registry/default/ui/form\"\n\nexport default function CheckboxGroupFormDemo() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const frameworks = formData.getAll(\"frameworks\") as string[]\n alert(`Selected: ${frameworks.join(\", \") || \"none\"}`)\n }\n\n return (\n <Form onSubmit={onSubmit} className=\"max-w-[160px]\">\n <Field\n name=\"frameworks\"\n className=\"gap-4\"\n render={(props) => <Fieldset {...props} />}\n >\n <FieldsetLegend className=\"text-sm font-medium\">\n Frameworks\n </FieldsetLegend>\n <CheckboxGroup defaultValue={[\"next\"]} disabled={loading}>\n <FieldLabel>\n <Checkbox value=\"next\" />\n Next.js\n </FieldLabel>\n <FieldLabel>\n <Checkbox value=\"vite\" />\n Vite\n </FieldLabel>\n <FieldLabel>\n <Checkbox value=\"astro\" />\n Astro\n </FieldLabel>\n </CheckboxGroup>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Submit\n </Button>\n </Form>\n )\n}\n",
16
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Field, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Fieldset, FieldsetLegend } from \"@/registry/default/ui/fieldset\"\nimport { Form } from \"@/registry/default/ui/form\"\n\nexport default function CheckboxGroupFormDemo() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const frameworks = formData.getAll(\"frameworks\") as string[]\n alert(`Selected: ${frameworks.join(\", \") || \"none\"}`)\n }\n\n return (\n <Form onSubmit={onSubmit} className=\"max-w-[160px]\">\n <Field\n name=\"frameworks\"\n className=\"gap-4\"\n render={(props) => <Fieldset {...props} />}\n >\n <FieldsetLegend className=\"text-sm font-medium\">\n Updated Frameworks\n </FieldsetLegend>\n <CheckboxGroup defaultValue={[\"next\"]} disabled={loading}>\n <FieldLabel>\n <Checkbox value=\"next\" />\n Updated Next.js\n </FieldLabel>\n <FieldLabel>\n <Checkbox value=\"vite\" />\n Updated Vite\n </FieldLabel>\n <FieldLabel>\n <Checkbox value=\"astro\" />\n Updated Astro\n </FieldLabel>\n </CheckboxGroup>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Updated Submit\n </Button>\n </Form>\n )\n}\n",
17
17
  "type": "registry:example"
18
18
  }
19
19
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/checkbox-group-nested-parent.tsx",
13
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nconst mainPermissions = [\n { id: \"view-dashboard\", name: \"View Dashboard\" },\n { id: \"manage-users\", name: \"Manage Users\" },\n { id: \"access-reports\", name: \"Access Reports\" },\n]\n\nconst userManagementPermissions = [\n { id: \"create-user\", name: \"Create User\" },\n { id: \"edit-user\", name: \"Edit User\" },\n { id: \"delete-user\", name: \"Delete User\" },\n { id: \"assign-roles\", name: \"Assign Roles\" },\n]\n\nexport default function CheckboxGroupNestedParentDemo() {\n const [mainValue, setMainValue] = React.useState<string[]>([])\n const [managementValue, setManagementValue] = React.useState<string[]>([])\n\n const managementIsPartial =\n managementValue.length > 0 &&\n managementValue.length !== userManagementPermissions.length\n\n return (\n <CheckboxGroup\n aria-labelledby=\"user-permissions-caption\"\n value={mainValue}\n onValueChange={(value) => {\n if (value.includes(\"manage-users\")) {\n setManagementValue(userManagementPermissions.map((p) => p.id))\n } else if (\n managementValue.length === userManagementPermissions.length\n ) {\n setManagementValue([])\n }\n setMainValue(value)\n }}\n allValues={mainPermissions.map((p) => p.id)}\n >\n <Label id=\"user-permissions-caption\">\n <Checkbox parent indeterminate={managementIsPartial} />\n User Permissions\n </Label>\n\n {mainPermissions\n .filter((p) => p.id !== \"manage-users\")\n .map((p) => (\n <Label key={p.id} className=\"ms-4\">\n <Checkbox value={p.id} />\n {p.name}\n </Label>\n ))}\n\n <CheckboxGroup\n aria-labelledby=\"manage-users-caption\"\n value={managementValue}\n onValueChange={(value) => {\n if (value.length === userManagementPermissions.length) {\n setMainValue((prev) =>\n Array.from(new Set([...prev, \"manage-users\"]))\n )\n } else {\n setMainValue((prev) => prev.filter((v) => v !== \"manage-users\"))\n }\n setManagementValue(value)\n }}\n allValues={userManagementPermissions.map((p) => p.id)}\n className=\"ms-4\"\n >\n <Label id=\"manage-users-caption\">\n <Checkbox parent />\n Manage Users\n </Label>\n\n {userManagementPermissions.map((p) => (\n <Label key={p.id} className=\"ms-4\">\n <Checkbox value={p.id} />\n {p.name}\n </Label>\n ))}\n </CheckboxGroup>\n </CheckboxGroup>\n )\n}\n",
13
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nconst mainPermissions = [\n { id: \"view-dashboard\", name: \"Updated View Dashboard\" },\n { id: \"manage-users\", name: \"Updated Manage Users\" },\n { id: \"access-reports\", name: \"Updated Access Reports\" },\n]\n\nconst userManagementPermissions = [\n { id: \"create-user\", name: \"Updated Create User\" },\n { id: \"edit-user\", name: \"Updated Edit User\" },\n { id: \"delete-user\", name: \"Updated Delete User\" },\n { id: \"assign-roles\", name: \"Updated Assign Roles\" },\n]\n\nexport default function CheckboxGroupNestedParentDemo() {\n const [mainValue, setMainValue] = React.useState<string[]>([])\n const [managementValue, setManagementValue] = React.useState<string[]>([])\n\n const managementIsPartial =\n managementValue.length > 0 &&\n managementValue.length !== userManagementPermissions.length\n\n return (\n <CheckboxGroup\n aria-labelledby=\"user-permissions-caption\"\n value={mainValue}\n onValueChange={(value) => {\n if (value.includes(\"manage-users\")) {\n setManagementValue(userManagementPermissions.map((p) => p.id))\n } else if (\n managementValue.length === userManagementPermissions.length\n ) {\n setManagementValue([])\n }\n setMainValue(value)\n }}\n allValues={mainPermissions.map((p) => p.id)}\n >\n <Label id=\"user-permissions-caption\">\n <Checkbox parent indeterminate={managementIsPartial} />\n Updated User Permissions\n </Label>\n\n {mainPermissions\n .filter((p) => p.id !== \"manage-users\")\n .map((p) => (\n <Label key={p.id} className=\"ms-4\">\n <Checkbox value={p.id} />\n {p.name}\n </Label>\n ))}\n\n <CheckboxGroup\n aria-labelledby=\"manage-users-caption\"\n value={managementValue}\n onValueChange={(value) => {\n if (value.length === userManagementPermissions.length) {\n setMainValue((prev) =>\n Array.from(new Set([...prev, \"manage-users\"]))\n )\n } else {\n setMainValue((prev) => prev.filter((v) => v !== \"manage-users\"))\n }\n setManagementValue(value)\n }}\n allValues={userManagementPermissions.map((p) => p.id)}\n className=\"ms-4\"\n >\n <Label id=\"manage-users-caption\">\n <Checkbox parent />\n Updated Manage Users\n </Label>\n\n {userManagementPermissions.map((p) => (\n <Label key={p.id} className=\"ms-4\">\n <Checkbox value={p.id} />\n {p.name}\n </Label>\n ))}\n </CheckboxGroup>\n </CheckboxGroup>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/checkbox-group-parent.tsx",
13
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nconst frameworks = [\n { id: \"next\", name: \"Next.js\" },\n { id: \"vite\", name: \"Vite\" },\n { id: \"astro\", name: \"Astro\" },\n]\n\nexport default function CheckboxGroupParentDemo() {\n const [value, setValue] = React.useState<string[]>([])\n\n return (\n <CheckboxGroup\n aria-labelledby=\"frameworks-caption\"\n value={value}\n onValueChange={setValue}\n allValues={frameworks.map((framework) => framework.id)}\n >\n <Label id=\"frameworks-caption\">\n <Checkbox name=\"frameworks\" parent />\n Frameworks\n </Label>\n\n {frameworks.map((framework) => (\n <Label key={framework.id} className=\"ms-4\">\n <Checkbox value={framework.id} />\n {framework.name}\n </Label>\n ))}\n </CheckboxGroup>\n )\n}\n",
13
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { CheckboxGroup } from \"@/registry/default/ui/checkbox-group\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nconst frameworks = [\n { id: \"next\", name: \"Updated Next.js\" },\n { id: \"vite\", name: \"Updated Vite\" },\n { id: \"astro\", name: \"Updated Astro\" },\n]\n\nexport default function CheckboxGroupParentDemo() {\n const [value, setValue] = React.useState<string[]>([])\n\n return (\n <CheckboxGroup\n aria-labelledby=\"frameworks-caption\"\n value={value}\n onValueChange={setValue}\n allValues={frameworks.map((framework) => framework.id)}\n >\n <Label id=\"frameworks-caption\">\n <Checkbox name=\"frameworks\" parent />\n Updated Frameworks\n </Label>\n\n {frameworks.map((framework) => (\n <Label key={framework.id} className=\"ms-4\">\n <Checkbox value={framework.id} />\n {framework.name}\n </Label>\n ))}\n </CheckboxGroup>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "checkbox-tree",
4
+ "type": "registry:ui",
5
+ "files": [
6
+ {
7
+ "path": "registry/default/ui/checkbox-tree.tsx",
8
+ "content": "/**\n * IMPORTANT: This component was built for demo purposes only and has not been tested in production.\n * It serves as a proof of concept for a checkbox tree implementation.\n * If you're interested in collaborating to create a more robust, production-ready\n * headless component, your contributions are welcome!\n */\n\n\"use client\"\n\nimport React, { useCallback, useMemo, useState } from \"react\"\n\ninterface TreeNode {\n id: string\n label: string\n defaultChecked?: boolean\n children?: TreeNode[]\n}\n\nfunction useCheckboxTree(initialTree: TreeNode) {\n const initialCheckedNodes = useMemo(() => {\n const checkedSet = new Set<string>()\n const initializeCheckedNodes = (node: TreeNode) => {\n if (node.defaultChecked) {\n checkedSet.add(node.id)\n }\n node.children?.forEach(initializeCheckedNodes)\n }\n initializeCheckedNodes(initialTree)\n return checkedSet\n }, [initialTree])\n\n const [checkedNodes, setCheckedNodes] =\n useState<Set<string>>(initialCheckedNodes)\n\n const isChecked = useCallback(\n (node: TreeNode): boolean | \"indeterminate\" => {\n if (!node.children) {\n return checkedNodes.has(node.id)\n }\n\n const childrenChecked = node.children.map((child) => isChecked(child))\n if (childrenChecked.every((status) => status === true)) {\n return true\n }\n if (\n childrenChecked.some(\n (status) => status === true || status === \"indeterminate\"\n )\n ) {\n return \"indeterminate\"\n }\n return false\n },\n [checkedNodes]\n )\n\n const handleCheck = useCallback(\n (node: TreeNode) => {\n const newCheckedNodes = new Set(checkedNodes)\n\n const toggleNode = (n: TreeNode, check: boolean) => {\n if (check) {\n newCheckedNodes.add(n.id)\n } else {\n newCheckedNodes.delete(n.id)\n }\n n.children?.forEach((child) => toggleNode(child, check))\n }\n\n const currentStatus = isChecked(node)\n const newCheck = currentStatus !== true\n\n toggleNode(node, newCheck)\n setCheckedNodes(newCheckedNodes)\n },\n [checkedNodes, isChecked]\n )\n\n return { isChecked, handleCheck }\n}\n\ninterface CheckboxTreeProps {\n tree: TreeNode\n renderNode: (props: {\n node: TreeNode\n isChecked: boolean | \"indeterminate\"\n onCheckedChange: () => void\n children: React.ReactNode\n }) => React.ReactNode\n}\n\nexport function CheckboxTree({ tree, renderNode }: CheckboxTreeProps) {\n const { isChecked, handleCheck } = useCheckboxTree(tree)\n\n const renderTreeNode = (node: TreeNode): React.ReactNode => {\n const children = node.children?.map(renderTreeNode)\n\n return renderNode({\n node,\n isChecked: isChecked(node),\n onCheckedChange: () => handleCheck(node),\n children,\n })\n }\n\n return renderTreeNode(tree)\n}\n",
9
+ "type": "registry:ui"
10
+ }
11
+ ]
12
+ }
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/checkbox-with-description.tsx",
12
- "content": "import * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxWithDescriptionDemo() {\n const id = React.useId()\n\n return (\n <div className=\"flex items-start gap-2\">\n <Checkbox id={id} defaultChecked />\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id}>Accept terms and conditions</Label>\n <p className=\"text-xs text-muted-foreground\">\n By clicking this checkbox, you agree to the terms and conditions.\n </p>\n </div>\n </div>\n )\n}\n",
12
+ "content": "import * as React from \"react\"\n\nimport { Checkbox } from \"@/registry/default/ui/checkbox\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function CheckboxWithDescriptionDemo() {\n const id = React.useId()\n\n return (\n <div className=\"flex items-start gap-2\">\n <Checkbox id={id} defaultChecked />\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor={id}>Updated Accept terms and conditions</Label>\n <p className=\"text-xs text-muted-foreground\">\n Updated By clicking this checkbox, you agree to the terms and\n conditions.\n </p>\n </div>\n </div>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/choicebox-inline.tsx",
11
- "content": "import {\n Choicebox,\n ChoiceboxIndicator,\n ChoiceboxItem,\n ChoiceboxItemDescription,\n ChoiceboxItemHeader,\n ChoiceboxItemTitle,\n} from \"../../../../../packages/choicebox\"\n\nconst options = [\n {\n id: \"1\",\n label: \"Option 1\",\n description: \"This is the first option\",\n },\n {\n id: \"2\",\n label: \"Option 2\",\n description: \"This is the second option\",\n },\n]\n\nconst Example = () => (\n <Choicebox\n defaultValue=\"1\"\n style={{\n gridTemplateColumns: `repeat(${options.length}, 1fr)`,\n }}\n >\n {options.map((option) => (\n <ChoiceboxItem key={option.id} value={option.id}>\n <ChoiceboxItemHeader>\n <ChoiceboxItemTitle>{option.label}</ChoiceboxItemTitle>\n <ChoiceboxItemDescription>\n {option.description}\n </ChoiceboxItemDescription>\n </ChoiceboxItemHeader>\n <ChoiceboxIndicator />\n </ChoiceboxItem>\n ))}\n </Choicebox>\n)\n\nexport default Example\n",
11
+ "content": "import {\n Choicebox,\n ChoiceboxIndicator,\n ChoiceboxItem,\n ChoiceboxItemDescription,\n ChoiceboxItemHeader,\n ChoiceboxItemTitle,\n} from \"../../../../../packages/choicebox\"\n\nconst options = [\n {\n id: \"1\",\n label: \"Updated Option 1\",\n description: \"Updated This is the first option\",\n },\n {\n id: \"2\",\n label: \"Updated Option 2\",\n description: \"Updated This is the second option\",\n },\n]\n\nconst Example = () => (\n <Choicebox\n defaultValue=\"1\"\n style={{\n gridTemplateColumns: `repeat(${options.length}, 1fr)`,\n }}\n >\n {options.map((option) => (\n <ChoiceboxItem key={option.id} value={option.id}>\n <ChoiceboxItemHeader>\n <ChoiceboxItemTitle>{option.label}</ChoiceboxItemTitle>\n <ChoiceboxItemDescription>\n {option.description}\n </ChoiceboxItemDescription>\n </ChoiceboxItemHeader>\n <ChoiceboxIndicator />\n </ChoiceboxItem>\n ))}\n </Choicebox>\n)\n\nexport default Example\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/choicebox.tsx",
11
- "content": "import {\n Choicebox,\n ChoiceboxIndicator,\n ChoiceboxItem,\n ChoiceboxItemDescription,\n ChoiceboxItemHeader,\n ChoiceboxItemSubtitle,\n ChoiceboxItemTitle,\n} from \"../../../../../packages/choicebox\"\n\nconst options = [\n {\n id: \"1\",\n label: \"Option 1\",\n subtitle: \"(the first option)\",\n description: \"This is the first option\",\n },\n {\n id: \"2\",\n label: \"Option 2\",\n subtitle: \"(the second option)\",\n description: \"This is the second option\",\n },\n]\n\nconst Example = () => (\n <Choicebox defaultValue=\"1\">\n {options.map((option) => (\n <ChoiceboxItem key={option.id} value={option.id}>\n <ChoiceboxItemHeader>\n <ChoiceboxItemTitle>\n {option.label}\n <ChoiceboxItemSubtitle>{option.subtitle}</ChoiceboxItemSubtitle>\n </ChoiceboxItemTitle>\n <ChoiceboxItemDescription>\n {option.description}\n </ChoiceboxItemDescription>\n </ChoiceboxItemHeader>\n <ChoiceboxIndicator />\n </ChoiceboxItem>\n ))}\n </Choicebox>\n)\n\nexport default Example\n",
11
+ "content": "import {\n Choicebox,\n ChoiceboxIndicator,\n ChoiceboxItem,\n ChoiceboxItemDescription,\n ChoiceboxItemHeader,\n ChoiceboxItemSubtitle,\n ChoiceboxItemTitle,\n} from \"../../../../../packages/choicebox\"\n\nconst options = [\n {\n id: \"1\",\n label: \"Updated Option 1\",\n subtitle: \"Updated (the first option)\",\n description: \"Updated This is the first option\",\n },\n {\n id: \"2\",\n label: \"Updated Option 2\",\n subtitle: \"Updated (the second option)\",\n description: \"Updated This is the second option\",\n },\n]\n\nconst Example = () => (\n <Choicebox defaultValue=\"1\">\n {options.map((option) => (\n <ChoiceboxItem key={option.id} value={option.id}>\n <ChoiceboxItemHeader>\n <ChoiceboxItemTitle>\n {option.label}\n <ChoiceboxItemSubtitle>{option.subtitle}</ChoiceboxItemSubtitle>\n </ChoiceboxItemTitle>\n <ChoiceboxItemDescription>\n {option.description}\n </ChoiceboxItemDescription>\n </ChoiceboxItemHeader>\n <ChoiceboxIndicator />\n </ChoiceboxItem>\n ))}\n </Choicebox>\n)\n\nexport default Example\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -6,7 +6,7 @@
6
6
  "files": [
7
7
  {
8
8
  "path": "registry/default/examples/codebase.tsx",
9
- "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { FileJson, FileText, FileType } from \"lucide-react\"\n\nimport {\n CodeBlock,\n CodeBlockContent,\n CodeBlockGroup,\n CodeBlockHeader,\n CodeBlockIcon,\n CodeblockShiki,\n CopyButton,\n type Languages,\n} from \"../../../../../packages/code-block/src\"\nimport {\n TreeExpander,\n TreeIcon,\n TreeLabel,\n TreeNode,\n TreeNodeContent,\n TreeNodeTrigger,\n TreeProvider,\n TreeView,\n} from \"../../../../../packages/tree\"\n\ntype FileContent = {\n name: string\n language: Languages\n code: string\n}\n\nconst fileContents: Record<string, FileContent> = {\n \"server.ts\": {\n name: \"server.ts\",\n language: \"ts\",\n code: `import express from 'express';\nimport { taskRouter } from './routes/tasks';\nimport { userRouter } from './routes/users';\nimport { errorHandler } from './middleware/errorHandler';\nimport { logger } from './middleware/logger';\nimport { config } from './config';\n\nconst app = express();\n\n// Middleware\napp.use(express.json());\napp.use(logger);\n\n// Routes\napp.use('/api/tasks', taskRouter);\napp.use('/api/users', userRouter);\n\n// Health check\napp.get('/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\n// Error handling\napp.use(errorHandler);\n\napp.listen(config.port, () => {\n console.log(\\`Server running on port \\${config.port}\\`);\n});`,\n },\n \"tasks.ts\": {\n name: \"tasks.ts\",\n language: \"ts\",\n code: `import { Router } from 'express';\nimport { TaskService } from '../services/taskService';\nimport { validateTask } from '../middleware/validation';\n\nconst router = Router();\nconst taskService = new TaskService();\n\nrouter.get('/', async (req, res, next) => {\n try {\n const tasks = await taskService.getAll();\n res.json(tasks);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.get('/:id', async (req, res, next) => {\n try {\n const task = await taskService.getById(req.params.id);\n if (!task) {\n return res.status(404).json({ error: 'Task not found' });\n }\n res.json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.post('/', validateTask, async (req, res, next) => {\n try {\n const task = await taskService.create(req.body);\n res.status(201).json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.put('/:id', validateTask, async (req, res, next) => {\n try {\n const task = await taskService.update(req.params.id, req.body);\n res.json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.delete('/:id', async (req, res, next) => {\n try {\n await taskService.delete(req.params.id);\n res.status(204).send();\n } catch (error) {\n next(error);\n }\n});\n\nexport { router as taskRouter };`,\n },\n \"users.ts\": {\n name: \"users.ts\",\n language: \"ts\",\n code: `import { Router } from 'express';\nimport { UserService } from '../services/userService';\nimport { validateUser } from '../middleware/validation';\n\nconst router = Router();\nconst userService = new UserService();\n\nrouter.get('/', async (req, res, next) => {\n try {\n const users = await userService.getAll();\n res.json(users);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.get('/:id', async (req, res, next) => {\n try {\n const user = await userService.getById(req.params.id);\n if (!user) {\n return res.status(404).json({ error: 'User not found' });\n }\n res.json(user);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.post('/', validateUser, async (req, res, next) => {\n try {\n const user = await userService.create(req.body);\n res.status(201).json(user);\n } catch (error) {\n next(error);\n }\n});\n\nexport { router as userRouter };`,\n },\n \"taskService.ts\": {\n name: \"taskService.ts\",\n language: \"ts\",\n code: `import { db } from '../db';\nimport type { Task, CreateTaskInput, UpdateTaskInput } from '../types';\n\nexport class TaskService {\n async getAll(): Promise<Task[]> {\n return db.tasks.findMany({\n orderBy: { createdAt: 'desc' },\n });\n }\n\n async getById(id: string): Promise<Task | null> {\n return db.tasks.findUnique({\n where: { id },\n });\n }\n\n async create(data: CreateTaskInput): Promise<Task> {\n return db.tasks.create({\n data: {\n ...data,\n status: 'pending',\n createdAt: new Date(),\n },\n });\n }\n\n async update(id: string, data: UpdateTaskInput): Promise<Task> {\n return db.tasks.update({\n where: { id },\n data: {\n ...data,\n updatedAt: new Date(),\n },\n });\n }\n\n async delete(id: string): Promise<void> {\n await db.tasks.delete({\n where: { id },\n });\n }\n}`,\n },\n \"userService.ts\": {\n name: \"userService.ts\",\n language: \"ts\",\n code: `import { db } from '../db';\nimport { hashPassword } from '../utils/crypto';\nimport type { User, CreateUserInput } from '../types';\n\nexport class UserService {\n async getAll(): Promise<User[]> {\n return db.users.findMany({\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n\n async getById(id: string): Promise<User | null> {\n return db.users.findUnique({\n where: { id },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n\n async create(data: CreateUserInput): Promise<User> {\n const hashedPassword = await hashPassword(data.password);\n \n return db.users.create({\n data: {\n ...data,\n password: hashedPassword,\n createdAt: new Date(),\n },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n}`,\n },\n \"errorHandler.ts\": {\n name: \"errorHandler.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\n\nexport class AppError extends Error {\n constructor(\n public statusCode: number,\n public message: string,\n public isOperational = true\n ) {\n super(message);\n Object.setPrototypeOf(this, AppError.prototype);\n }\n}\n\nexport const errorHandler = (\n err: Error | AppError,\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n if (err instanceof AppError) {\n return res.status(err.statusCode).json({\n status: 'error',\n message: err.message,\n });\n }\n\n console.error('Unexpected error:', err);\n \n res.status(500).json({\n status: 'error',\n message: 'Internal server error',\n });\n};`,\n },\n \"logger.ts\": {\n name: \"logger.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\n\nexport const logger = (req: Request, res: Response, next: NextFunction) => {\n const start = Date.now();\n \n res.on('finish', () => {\n const duration = Date.now() - start;\n const log = {\n method: req.method,\n url: req.url,\n status: res.statusCode,\n duration: \\`\\${duration}ms\\`,\n timestamp: new Date().toISOString(),\n };\n \n console.log(JSON.stringify(log));\n });\n \n next();\n};`,\n },\n \"validation.ts\": {\n name: \"validation.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\nimport { AppError } from './errorHandler';\n\nexport const validateTask = (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n const { title, description } = req.body;\n\n if (!title || typeof title !== 'string') {\n throw new AppError(400, 'Title is required and must be a string');\n }\n\n if (title.length < 3 || title.length > 100) {\n throw new AppError(400, 'Title must be between 3 and 100 characters');\n }\n\n if (description && typeof description !== 'string') {\n throw new AppError(400, 'Description must be a string');\n }\n\n next();\n};\n\nexport const validateUser = (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n const { email, password, name } = req.body;\n\n if (!email || !email.includes('@')) {\n throw new AppError(400, 'Valid email is required');\n }\n\n if (!password || password.length < 8) {\n throw new AppError(400, 'Password must be at least 8 characters');\n }\n\n if (!name || typeof name !== 'string') {\n throw new AppError(400, 'Name is required');\n }\n\n next();\n};`,\n },\n \"types.ts\": {\n name: \"types.ts\",\n language: \"ts\",\n code: `export type TaskStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface Task {\n id: string;\n title: string;\n description?: string;\n status: TaskStatus;\n createdAt: Date;\n updatedAt?: Date;\n}\n\nexport interface CreateTaskInput {\n title: string;\n description?: string;\n}\n\nexport interface UpdateTaskInput {\n title?: string;\n description?: string;\n status?: TaskStatus;\n}\n\nexport interface User {\n id: string;\n email: string;\n name: string;\n createdAt: Date;\n}\n\nexport interface CreateUserInput {\n email: string;\n password: string;\n name: string;\n}`,\n },\n \"config.ts\": {\n name: \"config.ts\",\n language: \"ts\",\n code: `export const config = {\n port: process.env.PORT || 3000,\n nodeEnv: process.env.NODE_ENV || 'development',\n database: {\n url: process.env.DATABASE_URL || 'postgresql://localhost:5432/taskdb',\n },\n jwt: {\n secret: process.env.JWT_SECRET || 'your-secret-key',\n expiresIn: '7d',\n },\n} as const;`,\n },\n \"package.json\": {\n name: \"package.json\",\n language: \"json\",\n code: `{\n \"name\": \"task-api\",\n \"version\": \"1.0.0\",\n \"description\": \"RESTful API for task management\",\n \"main\": \"dist/server.js\",\n \"scripts\": {\n \"dev\": \"tsx watch src/server.ts\",\n \"build\": \"tsc\",\n \"start\": \"node dist/server.js\",\n \"test\": \"jest\"\n },\n \"dependencies\": {\n \"express\": \"^4.18.2\",\n \"prisma\": \"^5.7.0\",\n \"@prisma/client\": \"^5.7.0\",\n \"bcrypt\": \"^5.1.1\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"zod\": \"^3.22.4\"\n },\n \"devDependencies\": {\n \"@types/express\": \"^4.17.21\",\n \"@types/node\": \"^20.10.5\",\n \"@types/bcrypt\": \"^5.0.2\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n }\n}`,\n },\n \"README.md\": {\n name: \"README.md\",\n language: \"mdx\",\n code: `# Task Management API\n\nA RESTful API built with Express and TypeScript for managing tasks and users.\n\n## Features\n\n- šŸ“ Full CRUD operations for tasks\n- šŸ‘„ User management\n- āœ… Input validation\n- šŸ”’ Error handling\n- šŸ“Š Request logging\n- šŸ—„ļø PostgreSQL database with Prisma\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- PostgreSQL\n\n### Installation\n\n\\`\\`\\`bash\nnpm install\n\\`\\`\\`\n\n### Environment Variables\n\nCreate a \\`.env\\` file:\n\n\\`\\`\\`env\nPORT=3000\nDATABASE_URL=postgresql://localhost:5432/taskdb\nJWT_SECRET=your-secret-key\n\\`\\`\\`\n\n### Database Setup\n\n\\`\\`\\`bash\nnpx prisma migrate dev\n\\`\\`\\`\n\n### Run\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n\n## API Endpoints\n\n### Tasks\n\n- \\`GET /api/tasks\\` - Get all tasks\n- \\`GET /api/tasks/:id\\` - Get task by ID\n- \\`POST /api/tasks\\` - Create task\n- \\`PUT /api/tasks/:id\\` - Update task\n- \\`DELETE /api/tasks/:id\\` - Delete task\n\n### Users\n\n- \\`GET /api/users\\` - Get all users\n- \\`GET /api/users/:id\\` - Get user by ID\n- \\`POST /api/users\\` - Create user\n\n## Project Structure\n\n\\`\\`\\`\nsrc/\nā”œā”€ā”€ routes/ # API routes\nā”œā”€ā”€ services/ # Business logic\nā”œā”€ā”€ middleware/ # Express middleware\nā”œā”€ā”€ types.ts # TypeScript types\nā”œā”€ā”€ config.ts # Configuration\n└── server.ts # Entry point\n\\`\\`\\``,\n },\n}\n\nexport default function CodebaseExample() {\n const [selectedFile, setSelectedFile] = useState<string>(\"server.ts\")\n const fallbackFile = fileContents[\"server.ts\"]\n\n if (!fallbackFile) {\n return null\n }\n\n const activeFile = fileContents[selectedFile] ?? fallbackFile\n\n const handleFileSelect = (fileId: string) => {\n if (fileContents[fileId]) {\n setSelectedFile(fileId)\n }\n }\n\n return (\n <div className=\"grid size-full grid-cols-[300px_1fr] divide-x overflow-hidden\">\n {/* File Explorer */}\n <div className=\"size-full overflow-y-auto\">\n <TreeProvider\n defaultExpandedIds={[\"src\", \"routes\", \"services\", \"middleware\"]}\n onSelectionChange={(ids) => {\n const firstId = ids[0]\n if (firstId) {\n handleFileSelect(firstId)\n }\n }}\n selectedIds={[selectedFile]}\n >\n <TreeView>\n <TreeNode nodeId=\"src\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>src</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={1} nodeId=\"routes\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>routes</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"tasks.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>tasks.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"users.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>users.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"services\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>services</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"taskService.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>taskService.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"userService.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>userService.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"middleware\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>middleware</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"errorHandler.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>errorHandler.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode level={2} nodeId=\"logger.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>logger.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"validation.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>validation.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"types.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>types.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode level={1} nodeId=\"config.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>config.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={1} nodeId=\"server.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>server.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode nodeId=\"package.json\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileJson className=\"h-4 w-4\" />} />\n <TreeLabel>package.json</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast nodeId=\"README.md\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileText className=\"h-4 w-4\" />} />\n <TreeLabel>README.md</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeView>\n </TreeProvider>\n </div>\n\n {/* Code Viewer */}\n <CodeBlock className=\"size-full overflow-y-auto rounded-none border-none\">\n <CodeBlockHeader>\n <CodeBlockGroup>\n <CodeBlockIcon language={activeFile.language} />\n <span>{activeFile.name}</span>\n </CodeBlockGroup>\n <CopyButton content={activeFile.code} />\n </CodeBlockHeader>\n <CodeBlockContent className=\"h-[calc(100%-2.25rem)] rounded-none\">\n <CodeblockShiki\n code={activeFile.code}\n language={activeFile.language}\n lineNumbers\n />\n </CodeBlockContent>\n </CodeBlock>\n </div>\n )\n}\n",
9
+ "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { FileJson, FileText, FileType } from \"lucide-react\"\n\nimport {\n CodeBlock,\n CodeBlockContent,\n CodeBlockGroup,\n CodeBlockHeader,\n CodeBlockIcon,\n CodeblockShiki,\n CopyButton,\n type Languages,\n} from \"../../../../../packages/code-block/src\"\nimport {\n TreeExpander,\n TreeIcon,\n TreeLabel,\n TreeNode,\n TreeNodeContent,\n TreeNodeTrigger,\n TreeProvider,\n TreeView,\n} from \"../../../../../packages/tree\"\n\ntype FileContent = {\n name: string\n language: Languages\n code: string\n}\n\nconst fileContents: Record<string, FileContent> = {\n \"server.ts\": {\n name: \"server.ts\",\n language: \"ts\",\n code: `import express from 'express';\nimport { taskRouter } from './routes/tasks';\nimport { userRouter } from './routes/users';\nimport { errorHandler } from './middleware/errorHandler';\nimport { logger } from './middleware/logger';\nimport { config } from './config';\n\nconst app = express();\n\n// Middleware\napp.use(express.json());\napp.use(logger);\n\n// Routes\napp.use('/api/tasks', taskRouter);\napp.use('/api/users', userRouter);\n\n// Health check\napp.get('/health', (req, res) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\n// Error handling\napp.use(errorHandler);\n\napp.listen(config.port, () => {\n console.log(\\`Server running on port \\${config.port}\\`);\n});`,\n },\n \"tasks.ts\": {\n name: \"tasks.ts\",\n language: \"ts\",\n code: `import { Router } from 'express';\nimport { TaskService } from '../services/taskService';\nimport { validateTask } from '../middleware/validation';\n\nconst router = Router();\nconst taskService = new TaskService();\n\nrouter.get('/', async (req, res, next) => {\n try {\n const tasks = await taskService.getAll();\n res.json(tasks);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.get('/:id', async (req, res, next) => {\n try {\n const task = await taskService.getById(req.params.id);\n if (!task) {\n return res.status(404).json({ error: 'Task not found' });\n }\n res.json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.post('/', validateTask, async (req, res, next) => {\n try {\n const task = await taskService.create(req.body);\n res.status(201).json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.put('/:id', validateTask, async (req, res, next) => {\n try {\n const task = await taskService.update(req.params.id, req.body);\n res.json(task);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.delete('/:id', async (req, res, next) => {\n try {\n await taskService.delete(req.params.id);\n res.status(204).send();\n } catch (error) {\n next(error);\n }\n});\n\nexport { router as taskRouter };`,\n },\n \"users.ts\": {\n name: \"users.ts\",\n language: \"ts\",\n code: `import { Router } from 'express';\nimport { UserService } from '../services/userService';\nimport { validateUser } from '../middleware/validation';\n\nconst router = Router();\nconst userService = new UserService();\n\nrouter.get('/', async (req, res, next) => {\n try {\n const users = await userService.getAll();\n res.json(users);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.get('/:id', async (req, res, next) => {\n try {\n const user = await userService.getById(req.params.id);\n if (!user) {\n return res.status(404).json({ error: 'User not found' });\n }\n res.json(user);\n } catch (error) {\n next(error);\n }\n});\n\nrouter.post('/', validateUser, async (req, res, next) => {\n try {\n const user = await userService.create(req.body);\n res.status(201).json(user);\n } catch (error) {\n next(error);\n }\n});\n\nexport { router as userRouter };`,\n },\n \"taskService.ts\": {\n name: \"Updated taskService.ts\",\n language: \"ts\",\n code: `import { db } from '../db';\nimport type { Task, CreateTaskInput, UpdateTaskInput } from '../types';\n\nexport class TaskService {\n async getAll(): Promise<Task[]> {\n return db.tasks.findMany({\n orderBy: { createdAt: 'desc' },\n });\n }\n\n async getById(id: string): Promise<Task | null> {\n return db.tasks.findUnique({\n where: { id },\n });\n }\n\n async create(data: CreateTaskInput): Promise<Task> {\n return db.tasks.create({\n data: {\n ...data,\n status: 'pending',\n createdAt: new Date(),\n },\n });\n }\n\n async update(id: string, data: UpdateTaskInput): Promise<Task> {\n return db.tasks.update({\n where: { id },\n data: {\n ...data,\n updatedAt: new Date(),\n },\n });\n }\n\n async delete(id: string): Promise<void> {\n await db.tasks.delete({\n where: { id },\n });\n }\n}`,\n },\n \"userService.ts\": {\n name: \"Updated userService.ts\",\n language: \"ts\",\n code: `import { db } from '../db';\nimport { hashPassword } from '../utils/crypto';\nimport type { User, CreateUserInput } from '../types';\n\nexport class UserService {\n async getAll(): Promise<User[]> {\n return db.users.findMany({\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n\n async getById(id: string): Promise<User | null> {\n return db.users.findUnique({\n where: { id },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n\n async create(data: CreateUserInput): Promise<User> {\n const hashedPassword = await hashPassword(data.password);\n \n return db.users.create({\n data: {\n ...data,\n password: hashedPassword,\n createdAt: new Date(),\n },\n select: {\n id: true,\n email: true,\n name: true,\n createdAt: true,\n },\n });\n }\n}`,\n },\n \"errorHandler.ts\": {\n name: \"Updated errorHandler.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\n\nexport class AppError extends Error {\n constructor(\n public statusCode: number,\n public message: string,\n public isOperational = true\n ) {\n super(message);\n Object.setPrototypeOf(this, AppError.prototype);\n }\n}\n\nexport const errorHandler = (\n err: Error | AppError,\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n if (err instanceof AppError) {\n return res.status(err.statusCode).json({\n status: 'error',\n message: err.message,\n });\n }\n\n console.error('Unexpected error:', err);\n \n res.status(500).json({\n status: 'error',\n message: 'Internal server error',\n });\n};`,\n },\n \"logger.ts\": {\n name: \"logger.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\n\nexport const logger = (req: Request, res: Response, next: NextFunction) => {\n const start = Date.now();\n \n res.on('finish', () => {\n const duration = Date.now() - start;\n const log = {\n method: req.method,\n url: req.url,\n status: res.statusCode,\n duration: \\`\\${duration}ms\\`,\n timestamp: new Date().toISOString(),\n };\n \n console.log(JSON.stringify(log));\n });\n \n next();\n};`,\n },\n \"validation.ts\": {\n name: \"validation.ts\",\n language: \"ts\",\n code: `import type { Request, Response, NextFunction } from 'express';\nimport { AppError } from './errorHandler';\n\nexport const validateTask = (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n const { title, description } = req.body;\n\n if (!title || typeof title !== 'string') {\n throw new AppError(400, 'Title is required and must be a string');\n }\n\n if (title.length < 3 || title.length > 100) {\n throw new AppError(400, 'Title must be between 3 and 100 characters');\n }\n\n if (description && typeof description !== 'string') {\n throw new AppError(400, 'Description must be a string');\n }\n\n next();\n};\n\nexport const validateUser = (\n req: Request,\n res: Response,\n next: NextFunction\n) => {\n const { email, password, name } = req.body;\n\n if (!email || !email.includes('@')) {\n throw new AppError(400, 'Valid email is required');\n }\n\n if (!password || password.length < 8) {\n throw new AppError(400, 'Password must be at least 8 characters');\n }\n\n if (!name || typeof name !== 'string') {\n throw new AppError(400, 'Name is required');\n }\n\n next();\n};`,\n },\n \"types.ts\": {\n name: \"types.ts\",\n language: \"ts\",\n code: `export type TaskStatus = 'pending' | 'in_progress' | 'completed';\n\nexport interface Task {\n id: string;\n title: string;\n description?: string;\n status: TaskStatus;\n createdAt: Date;\n updatedAt?: Date;\n}\n\nexport interface CreateTaskInput {\n title: string;\n description?: string;\n}\n\nexport interface UpdateTaskInput {\n title?: string;\n description?: string;\n status?: TaskStatus;\n}\n\nexport interface User {\n id: string;\n email: string;\n name: string;\n createdAt: Date;\n}\n\nexport interface CreateUserInput {\n email: string;\n password: string;\n name: string;\n}`,\n },\n \"config.ts\": {\n name: \"config.ts\",\n language: \"ts\",\n code: `export const config = {\n port: process.env.PORT || 3000,\n nodeEnv: process.env.NODE_ENV || 'development',\n database: {\n url: process.env.DATABASE_URL || 'postgresql://localhost:5432/taskdb',\n },\n jwt: {\n secret: process.env.JWT_SECRET || 'your-secret-key',\n expiresIn: '7d',\n },\n} as const;`,\n },\n \"package.json\": {\n name: \"package.json\",\n language: \"json\",\n code: `{\n \"name\": \"task-api\",\n \"version\": \"1.0.0\",\n \"description\": \"RESTful API for task management\",\n \"main\": \"dist/server.js\",\n \"scripts\": {\n \"dev\": \"tsx watch src/server.ts\",\n \"build\": \"tsc\",\n \"start\": \"node dist/server.js\",\n \"test\": \"jest\"\n },\n \"dependencies\": {\n \"express\": \"^4.18.2\",\n \"prisma\": \"^5.7.0\",\n \"@prisma/client\": \"^5.7.0\",\n \"bcrypt\": \"^5.1.1\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"zod\": \"^3.22.4\"\n },\n \"devDependencies\": {\n \"@types/express\": \"^4.17.21\",\n \"@types/node\": \"^20.10.5\",\n \"@types/bcrypt\": \"^5.0.2\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.3.3\"\n }\n}`,\n },\n \"README.md\": {\n name: \"Updated README.md\",\n language: \"mdx\",\n code: `# Task Management API\n\nA RESTful API built with Express and TypeScript for managing tasks and users.\n\n## Features\n\n- šŸ“ Full CRUD operations for tasks\n- šŸ‘„ User management\n- āœ… Input validation\n- šŸ”’ Error handling\n- šŸ“Š Request logging\n- šŸ—„ļø PostgreSQL database with Prisma\n\n## Getting Started\n\n### Prerequisites\n\n- Node.js 18+\n- PostgreSQL\n\n### Installation\n\n\\`\\`\\`bash\nnpm install\n\\`\\`\\`\n\n### Environment Variables\n\nCreate a \\`.env\\` file:\n\n\\`\\`\\`env\nPORT=3000\nDATABASE_URL=postgresql://localhost:5432/taskdb\nJWT_SECRET=your-secret-key\n\\`\\`\\`\n\n### Database Setup\n\n\\`\\`\\`bash\nnpx prisma migrate dev\n\\`\\`\\`\n\n### Run\n\n\\`\\`\\`bash\nnpm run dev\n\\`\\`\\`\n\n## API Endpoints\n\n### Tasks\n\n- \\`GET /api/tasks\\` - Get all tasks\n- \\`GET /api/tasks/:id\\` - Get task by ID\n- \\`POST /api/tasks\\` - Create task\n- \\`PUT /api/tasks/:id\\` - Update task\n- \\`DELETE /api/tasks/:id\\` - Delete task\n\n### Users\n\n- \\`GET /api/users\\` - Get all users\n- \\`GET /api/users/:id\\` - Get user by ID\n- \\`POST /api/users\\` - Create user\n\n## Project Structure\n\n\\`\\`\\`\nsrc/\nā”œā”€ā”€ routes/ # API routes\nā”œā”€ā”€ services/ # Business logic\nā”œā”€ā”€ middleware/ # Express middleware\nā”œā”€ā”€ types.ts # TypeScript types\nā”œā”€ā”€ config.ts # Configuration\n└── server.ts # Entry point\n\\`\\`\\``,\n },\n}\n\nexport default function CodebaseExample() {\n const [selectedFile, setSelectedFile] = useState<string>(\"server.ts\")\n const fallbackFile = fileContents[\"server.ts\"]\n\n if (!fallbackFile) {\n return null\n }\n\n const activeFile = fileContents[selectedFile] ?? fallbackFile\n\n const handleFileSelect = (fileId: string) => {\n if (fileContents[fileId]) {\n setSelectedFile(fileId)\n }\n }\n\n return (\n <div className=\"grid size-full grid-cols-[300px_1fr] divide-x overflow-hidden\">\n {/* File Explorer */}\n <div className=\"size-full overflow-y-auto\">\n <TreeProvider\n defaultExpandedIds={[\"src\", \"routes\", \"services\", \"middleware\"]}\n onSelectionChange={(ids) => {\n const firstId = ids[0]\n if (firstId) {\n handleFileSelect(firstId)\n }\n }}\n selectedIds={[selectedFile]}\n >\n <TreeView>\n <TreeNode nodeId=\"src\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>src</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={1} nodeId=\"routes\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>routes</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"tasks.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>tasks.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"users.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>users.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"services\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>services</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"taskService.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>Updated taskService.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"userService.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>Updated userService.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"middleware\">\n <TreeNodeTrigger>\n <TreeExpander hasChildren />\n <TreeIcon hasChildren />\n <TreeLabel>middleware</TreeLabel>\n </TreeNodeTrigger>\n <TreeNodeContent hasChildren>\n <TreeNode level={2} nodeId=\"errorHandler.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>Updated errorHandler.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode level={2} nodeId=\"logger.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>logger.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={2} nodeId=\"validation.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>validation.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode level={1} nodeId=\"types.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>types.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode level={1} nodeId=\"config.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>config.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast level={1} nodeId=\"server.ts\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileType className=\"h-4 w-4\" />} />\n <TreeLabel>server.ts</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeNodeContent>\n </TreeNode>\n <TreeNode nodeId=\"package.json\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileJson className=\"h-4 w-4\" />} />\n <TreeLabel>package.json</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n <TreeNode isLast nodeId=\"README.md\">\n <TreeNodeTrigger>\n <TreeExpander />\n <TreeIcon icon={<FileText className=\"h-4 w-4\" />} />\n <TreeLabel>Updated README.md</TreeLabel>\n </TreeNodeTrigger>\n </TreeNode>\n </TreeView>\n </TreeProvider>\n </div>\n\n {/* Code Viewer */}\n <CodeBlock className=\"size-full overflow-y-auto rounded-none border-none\">\n <CodeBlockHeader>\n <CodeBlockGroup>\n <CodeBlockIcon language={activeFile.language} />\n <span>{activeFile.name}</span>\n </CodeBlockGroup>\n <CopyButton content={activeFile.code} />\n </CodeBlockHeader>\n <CodeBlockContent className=\"h-[calc(100%-2.25rem)] rounded-none\">\n <CodeblockShiki\n code={activeFile.code}\n language={activeFile.language}\n lineNumbers\n />\n </CodeBlockContent>\n </CodeBlock>\n </div>\n )\n}\n",
10
10
  "type": "registry:example"
11
11
  }
12
12
  ],
@@ -6,7 +6,7 @@
6
6
  "files": [
7
7
  {
8
8
  "path": "registry/default/examples/collaborative-canvas.tsx",
9
- "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\n\nimport { AvatarStack } from \"../../../../../packages/avatar-stack\"\nimport {\n Cursor,\n CursorBody,\n CursorMessage,\n CursorName,\n CursorPointer,\n} from \"../../../../../packages/cursor\"\nimport { cn } from \"../../../../../packages/ui/src/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"../../../../../packages/ui/src/ui/avatar\"\n\nconst users = [\n {\n id: 1,\n name: \"Connor Love\",\n avatar: \"https://github.com/loveconnor.png\",\n },\n {\n id: 2,\n name: \"Thomas Raklovits\",\n avatar: \"https://github.com/monster0506.png\",\n message: \"I'm not sure if this is working...\",\n },\n {\n id: 3,\n name: \"Charlie Cambell\",\n avatar: \"https://github.com/loveconnor.png\",\n },\n]\n\nconst colors = [\n {\n foreground: \"text-emerald-800\",\n background: \"bg-emerald-50\",\n },\n {\n foreground: \"text-rose-800\",\n background: \"bg-rose-50\",\n },\n {\n foreground: \"text-sky-800\",\n background: \"bg-sky-50\",\n },\n]\n\n// Helper function to generate random position\nconst getRandomPosition = () => ({\n x: Math.floor(Math.random() * 80) + 10, // Keep within 10-90% range\n y: Math.floor(Math.random() * 80) + 10, // Keep within 10-90% range\n})\n\nconst Example = () => {\n const [user1Position, setUser1Position] = useState({\n x: 10,\n y: 8,\n })\n const [user2Position, setUser2Position] = useState({\n x: 30,\n y: 40,\n })\n const [user3Position, setUser3Position] = useState({\n x: 70,\n y: 50,\n })\n\n // Store all user positions in a single array for easier access\n const userPositions = [user1Position, user2Position, user3Position]\n\n // Create separate useEffects for each user to move at different intervals\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser1Position(getRandomPosition())\n },\n Math.random() * 3000 + 2000\n ) // Random interval between 2-5 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser2Position(getRandomPosition())\n },\n Math.random() * 4000 + 3000\n ) // Random interval between 3-7 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser3Position(getRandomPosition())\n },\n Math.random() * 2500 + 1500\n ) // Random interval between 1.5-4 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n // Assign positions to users\n const usersWithPositions = users.map((user, index) => ({\n ...user,\n position: userPositions[index],\n }))\n\n return (\n <div className=\"relative aspect-[4/3] size-full bg-[radial-gradient(var(--color-secondary),transparent_1px)] [background-size:16px_16px]\">\n <div className=\"absolute top-8 right-8\">\n <AvatarStack animate size={32}>\n {usersWithPositions.map((user) => (\n <Avatar key={user.id}>\n <AvatarImage className=\"mt-0 mb-0\" src={user.avatar} />\n <AvatarFallback>{user.name.slice(0, 2)}</AvatarFallback>\n </Avatar>\n ))}\n </AvatarStack>\n </div>\n {usersWithPositions.map((user, index) => (\n <Cursor\n className=\"absolute transition-all duration-1000\"\n key={user.id}\n style={{\n top: `${user.position.y}%`,\n left: `${user.position.x}%`,\n }}\n >\n <CursorPointer\n className={cn(colors[index % colors.length].foreground)}\n />\n <CursorBody\n className={cn(\n colors[index % colors.length].background,\n colors[index % colors.length].foreground,\n \"gap-1 px-3 py-2\"\n )}\n >\n <div className=\"flex items-center gap-2 opacity-100!\">\n <Image\n alt={user.name}\n className=\"mt-0 mb-0 size-4 rounded-full\"\n height={16}\n src={user.avatar}\n unoptimized\n width={16}\n />\n <CursorName>{user.name}</CursorName>\n </div>\n {user.message && <CursorMessage>{user.message}</CursorMessage>}\n </CursorBody>\n </Cursor>\n ))}\n </div>\n )\n}\nexport default Example\n",
9
+ "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\n\nimport { AvatarStack } from \"../../../../../packages/avatar-stack\"\nimport {\n Cursor,\n CursorBody,\n CursorMessage,\n CursorName,\n CursorPointer,\n} from \"../../../../../packages/cursor\"\nimport { cn } from \"../../../../../packages/ui/src/lib/utils\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"../../../../../packages/ui/src/ui/avatar\"\n\nconst users = [\n {\n id: 1,\n name: \"Updated Connor Love\",\n avatar: \"https://github.com/loveconnor.png\",\n },\n {\n id: 2,\n name: \"Updated Thomas Raklovits\",\n avatar: \"https://github.com/monster0506.png\",\n message: \"Updated I'm not sure if this is working...\",\n },\n {\n id: 3,\n name: \"Updated Charlie Cambell\",\n avatar: \"https://github.com/loveconnor.png\",\n },\n]\n\nconst colors = [\n {\n foreground: \"text-emerald-800\",\n background: \"bg-emerald-50\",\n },\n {\n foreground: \"text-rose-800\",\n background: \"bg-rose-50\",\n },\n {\n foreground: \"text-sky-800\",\n background: \"bg-sky-50\",\n },\n]\n\n// Helper function to generate random position\nconst getRandomPosition = () => ({\n x: Math.floor(Math.random() * 80) + 10, // Keep within 10-90% range\n y: Math.floor(Math.random() * 80) + 10, // Keep within 10-90% range\n})\n\nconst Example = () => {\n const [user1Position, setUser1Position] = useState({\n x: 10,\n y: 8,\n })\n const [user2Position, setUser2Position] = useState({\n x: 30,\n y: 40,\n })\n const [user3Position, setUser3Position] = useState({\n x: 70,\n y: 50,\n })\n\n // Store all user positions in a single array for easier access\n const userPositions = [user1Position, user2Position, user3Position]\n\n // Create separate useEffects for each user to move at different intervals\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser1Position(getRandomPosition())\n },\n Math.random() * 3000 + 2000\n ) // Random interval between 2-5 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser2Position(getRandomPosition())\n },\n Math.random() * 4000 + 3000\n ) // Random interval between 3-7 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n useEffect(() => {\n const interval = setInterval(\n () => {\n setUser3Position(getRandomPosition())\n },\n Math.random() * 2500 + 1500\n ) // Random interval between 1.5-4 seconds\n\n return () => clearInterval(interval)\n }, [])\n\n // Assign positions to users\n const usersWithPositions = users.map((user, index) => ({\n ...user,\n position: userPositions[index],\n }))\n\n return (\n <div className=\"relative aspect-[4/3] size-full bg-[radial-gradient(var(--color-secondary),transparent_1px)] [background-size:16px_16px]\">\n <div className=\"absolute top-8 right-8\">\n <AvatarStack animate size={32}>\n {usersWithPositions.map((user) => (\n <Avatar key={user.id}>\n <AvatarImage className=\"mt-0 mb-0\" src={user.avatar} />\n <AvatarFallback>{user.name.slice(0, 2)}</AvatarFallback>\n </Avatar>\n ))}\n </AvatarStack>\n </div>\n {usersWithPositions.map((user, index) => (\n <Cursor\n className=\"absolute transition-all duration-1000\"\n key={user.id}\n style={{\n top: `${user.position.y}%`,\n left: `${user.position.x}%`,\n }}\n >\n <CursorPointer\n className={cn(colors[index % colors.length].foreground)}\n />\n <CursorBody\n className={cn(\n colors[index % colors.length].background,\n colors[index % colors.length].foreground,\n \"gap-1 px-3 py-2\"\n )}\n >\n <div className=\"flex items-center gap-2 opacity-100!\">\n <Image\n alt={user.name}\n className=\"mt-0 mb-0 size-4 rounded-full\"\n height={16}\n src={user.avatar}\n unoptimized\n width={16}\n />\n <CursorName>{user.name}</CursorName>\n </div>\n {user.message && <CursorMessage>{user.message}</CursorMessage>}\n </CursorBody>\n </Cursor>\n ))}\n </div>\n )\n}\nexport default Example\n",
10
10
  "type": "registry:example"
11
11
  }
12
12
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/collapsible-demo.tsx",
11
- "content": "import { ChevronDownIcon } from \"lucide-react\"\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n} from \"@/registry/default/ui/collapsible\"\n\nexport default function CollapsibleDemo() {\n return (\n <Collapsible>\n <CollapsibleTrigger className=\"inline-flex items-center gap-2 text-sm font-medium data-panel-open:[&_svg]:rotate-180\">\n Show recovery keys\n <ChevronDownIcon className=\"size-4\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <ul className=\"flex flex-col gap-1 py-2 text-sm text-muted-foreground\">\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 4829-1735-6621\n </li>\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 9182-6407-5532\n </li>\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 3051-7924-9018\n </li>\n </ul>\n </CollapsiblePanel>\n </Collapsible>\n )\n}\n",
11
+ "content": "import { ChevronDownIcon } from \"lucide-react\"\n\nimport {\n Collapsible,\n CollapsiblePanel,\n CollapsibleTrigger,\n} from \"@/registry/default/ui/collapsible\"\n\nexport default function CollapsibleDemo() {\n return (\n <Collapsible>\n <CollapsibleTrigger className=\"inline-flex items-center gap-2 text-sm font-medium data-panel-open:[&_svg]:rotate-180\">\n Updated Show recovery keys\n <ChevronDownIcon className=\"size-4\" />\n </CollapsibleTrigger>\n <CollapsiblePanel>\n <ul className=\"flex flex-col gap-1 py-2 text-sm text-muted-foreground\">\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 4829-1735-6621\n </li>\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 9182-6407-5532\n </li>\n <li className=\"rounded-sm bg-muted px-2 py-1 font-mono\">\n 3051-7924-9018\n </li>\n </ul>\n </CollapsiblePanel>\n </Collapsible>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],