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
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/gantt-no-sidebar.tsx",
13
- "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport { EyeIcon, LinkIcon, TrashIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"@/registry/default/ui/context-menu\"\n\nimport {\n GanttCreateMarkerTrigger,\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n const handleViewFeature = (id: string) =>\n console.log(`Feature selected: ${id}`)\n\n const handleCopyLink = (id: string) => console.log(`Copy link: ${id}`)\n\n const handleRemoveFeature = (id: string) =>\n setFeatures((prev) => prev.filter((feature) => feature.id !== id))\n\n const handleRemoveMarker = (id: string) => console.log(`Remove marker: ${id}`)\n\n const handleCreateMarker = (date: Date) =>\n console.log(`Create marker: ${date.toISOString()}`)\n\n const handleMoveFeature = (id: string, startAt: Date, endAt: Date | null) => {\n if (!endAt) {\n return\n }\n\n setFeatures((prev) =>\n prev.map((feature) =>\n feature.id === id ? { ...feature, startAt, endAt } : feature\n )\n )\n\n console.log(`Move feature: ${id} from ${startAt} to ${endAt}`)\n }\n\n const handleAddFeature = (date: Date) =>\n console.log(`Add feature: ${date.toISOString()}`)\n\n return (\n <GanttProvider\n className=\"border\"\n onAddItem={handleAddFeature}\n range=\"monthly\"\n zoom={100}\n >\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <button\n onClick={() => handleViewFeature(feature.id)}\n type=\"button\"\n >\n <GanttFeatureItem\n onMove={handleMoveFeature}\n {...feature}\n >\n <p className=\"flex-1 truncate text-xs\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </GanttFeatureItem>\n </button>\n </ContextMenuTrigger>\n <ContextMenuContent>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleViewFeature(feature.id)}\n >\n <EyeIcon className=\"text-muted-foreground\" size={16} />\n View feature\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleCopyLink(feature.id)}\n >\n <LinkIcon className=\"text-muted-foreground\" size={16} />\n Copy link\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2 text-destructive\"\n onClick={() => handleRemoveFeature(feature.id)}\n >\n <TrashIcon size={16} />\n Remove from roadmap\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker\n key={marker.id}\n {...marker}\n onRemove={handleRemoveMarker}\n />\n ))}\n <GanttToday />\n <GanttCreateMarkerTrigger onCreateMarker={handleCreateMarker} />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport { EyeIcon, LinkIcon, TrashIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"@/registry/default/ui/context-menu\"\n\nimport {\n GanttCreateMarkerTrigger,\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n const handleViewFeature = (id: string) =>\n console.log(`Feature selected: ${id}`)\n\n const handleCopyLink = (id: string) => console.log(`Copy link: ${id}`)\n\n const handleRemoveFeature = (id: string) =>\n setFeatures((prev) => prev.filter((feature) => feature.id !== id))\n\n const handleRemoveMarker = (id: string) => console.log(`Remove marker: ${id}`)\n\n const handleCreateMarker = (date: Date) =>\n console.log(`Create marker: ${date.toISOString()}`)\n\n const handleMoveFeature = (id: string, startAt: Date, endAt: Date | null) => {\n if (!endAt) {\n return\n }\n\n setFeatures((prev) =>\n prev.map((feature) =>\n feature.id === id ? { ...feature, startAt, endAt } : feature\n )\n )\n\n console.log(`Move feature: ${id} from ${startAt} to ${endAt}`)\n }\n\n const handleAddFeature = (date: Date) =>\n console.log(`Add feature: ${date.toISOString()}`)\n\n return (\n <GanttProvider\n className=\"border\"\n onAddItem={handleAddFeature}\n range=\"monthly\"\n zoom={100}\n >\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <button\n onClick={() => handleViewFeature(feature.id)}\n type=\"button\"\n >\n <GanttFeatureItem\n onMove={handleMoveFeature}\n {...feature}\n >\n <p className=\"flex-1 truncate text-xs\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </GanttFeatureItem>\n </button>\n </ContextMenuTrigger>\n <ContextMenuContent>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleViewFeature(feature.id)}\n >\n <EyeIcon className=\"text-muted-foreground\" size={16} />\n Updated View feature\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleCopyLink(feature.id)}\n >\n <LinkIcon className=\"text-muted-foreground\" size={16} />\n Updated Copy link\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2 text-destructive\"\n onClick={() => handleRemoveFeature(feature.id)}\n >\n <TrashIcon size={16} />\n Updated Remove from roadmap\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker\n key={marker.id}\n {...marker}\n onRemove={handleRemoveMarker}\n />\n ))}\n <GanttToday />\n <GanttCreateMarkerTrigger onCreateMarker={handleCreateMarker} />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\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/gantt-read-only.tsx",
13
- "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\n\nimport {\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttSidebar,\n GanttSidebarGroup,\n GanttSidebarItem,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const groupedFeatures = groupBy(exampleFeatures, \"group.name\")\n\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n return (\n <GanttProvider className=\"border\" range=\"monthly\" zoom={100}>\n <GanttSidebar>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttSidebarGroup key={group} name={group}>\n {features.map((feature) => (\n <GanttSidebarItem feature={feature} key={feature.id} />\n ))}\n </GanttSidebarGroup>\n ))}\n </GanttSidebar>\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <GanttFeatureItem {...feature} />\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker key={marker.id} {...marker} />\n ))}\n <GanttToday />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\n\nimport {\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttSidebar,\n GanttSidebarGroup,\n GanttSidebarItem,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const groupedFeatures = groupBy(exampleFeatures, \"group.name\")\n\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n return (\n <GanttProvider className=\"border\" range=\"monthly\" zoom={100}>\n <GanttSidebar>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttSidebarGroup key={group} name={group}>\n {features.map((feature) => (\n <GanttSidebarItem feature={feature} key={feature.id} />\n ))}\n </GanttSidebarGroup>\n ))}\n </GanttSidebar>\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <GanttFeatureItem {...feature} />\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker key={marker.id} {...marker} />\n ))}\n <GanttToday />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\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/gantt.tsx",
13
- "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport { EyeIcon, LinkIcon, TrashIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"@/registry/default/ui/context-menu\"\n\nimport {\n GanttCreateMarkerTrigger,\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttSidebar,\n GanttSidebarGroup,\n GanttSidebarItem,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n const handleViewFeature = (id: string) =>\n console.log(`Feature selected: ${id}`)\n\n const handleCopyLink = (id: string) => console.log(`Copy link: ${id}`)\n\n const handleRemoveFeature = (id: string) =>\n setFeatures((prev) => prev.filter((feature) => feature.id !== id))\n\n const handleRemoveMarker = (id: string) => console.log(`Remove marker: ${id}`)\n\n const handleCreateMarker = (date: Date) =>\n console.log(`Create marker: ${date.toISOString()}`)\n\n const handleMoveFeature = (id: string, startAt: Date, endAt: Date | null) => {\n if (!endAt) {\n return\n }\n\n setFeatures((prev) =>\n prev.map((feature) =>\n feature.id === id ? { ...feature, startAt, endAt } : feature\n )\n )\n\n console.log(`Move feature: ${id} from ${startAt} to ${endAt}`)\n }\n\n const handleAddFeature = (date: Date) =>\n console.log(`Add feature: ${date.toISOString()}`)\n\n return (\n <GanttProvider\n className=\"border\"\n onAddItem={handleAddFeature}\n range=\"monthly\"\n zoom={100}\n >\n <GanttSidebar>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttSidebarGroup key={group} name={group}>\n {features.map((feature) => (\n <GanttSidebarItem\n feature={feature}\n key={feature.id}\n onSelectItem={handleViewFeature}\n />\n ))}\n </GanttSidebarGroup>\n ))}\n </GanttSidebar>\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <button\n onClick={() => handleViewFeature(feature.id)}\n type=\"button\"\n >\n <GanttFeatureItem\n onMove={handleMoveFeature}\n {...feature}\n >\n <p className=\"flex-1 truncate text-xs\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </GanttFeatureItem>\n </button>\n </ContextMenuTrigger>\n <ContextMenuContent>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleViewFeature(feature.id)}\n >\n <EyeIcon className=\"text-muted-foreground\" size={16} />\n View feature\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleCopyLink(feature.id)}\n >\n <LinkIcon className=\"text-muted-foreground\" size={16} />\n Copy link\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2 text-destructive\"\n onClick={() => handleRemoveFeature(feature.id)}\n >\n <TrashIcon size={16} />\n Remove from roadmap\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker\n key={marker.id}\n {...marker}\n onRemove={handleRemoveMarker}\n />\n ))}\n <GanttToday />\n <GanttCreateMarkerTrigger onCreateMarker={handleCreateMarker} />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport { EyeIcon, LinkIcon, TrashIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"@/registry/default/ui/context-menu\"\n\nimport {\n GanttCreateMarkerTrigger,\n GanttFeatureItem,\n GanttFeatureList,\n GanttFeatureListGroup,\n GanttHeader,\n GanttMarker,\n GanttProvider,\n GanttSidebar,\n GanttSidebarGroup,\n GanttSidebarItem,\n GanttTimeline,\n GanttToday,\n} from \"../../../../../packages/gantt\"\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 users = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: faker.person.fullName(),\n image: faker.image.avatar(),\n }))\n\nconst exampleGroups = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleProducts = Array.from({ length: 4 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleInitiatives = Array.from({ length: 2 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\n }))\n\nconst exampleReleases = Array.from({ length: 3 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n name: capitalize(faker.company.buzzPhrase()),\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 owner: faker.helpers.arrayElement(users),\n group: faker.helpers.arrayElement(exampleGroups),\n product: faker.helpers.arrayElement(exampleProducts),\n initiative: faker.helpers.arrayElement(exampleInitiatives),\n release: faker.helpers.arrayElement(exampleReleases),\n }))\n\nconst exampleMarkers = Array.from({ length: 6 })\n .fill(null)\n .map(() => ({\n id: faker.string.uuid(),\n date: faker.date.past({ years: 0.5, refDate: new Date() }),\n label: capitalize(faker.company.buzzPhrase()),\n className: faker.helpers.arrayElement([\n \"bg-blue-100 text-blue-900\",\n \"bg-green-100 text-green-900\",\n \"bg-purple-100 text-purple-900\",\n \"bg-red-100 text-red-900\",\n \"bg-orange-100 text-orange-900\",\n \"bg-teal-100 text-teal-900\",\n ]),\n }))\n\nconst Example = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n const sortedGroupedFeatures = Object.fromEntries(\n Object.entries(groupedFeatures).sort(([nameA], [nameB]) =>\n nameA.localeCompare(nameB)\n )\n )\n\n const handleViewFeature = (id: string) =>\n console.log(`Feature selected: ${id}`)\n\n const handleCopyLink = (id: string) => console.log(`Copy link: ${id}`)\n\n const handleRemoveFeature = (id: string) =>\n setFeatures((prev) => prev.filter((feature) => feature.id !== id))\n\n const handleRemoveMarker = (id: string) => console.log(`Remove marker: ${id}`)\n\n const handleCreateMarker = (date: Date) =>\n console.log(`Create marker: ${date.toISOString()}`)\n\n const handleMoveFeature = (id: string, startAt: Date, endAt: Date | null) => {\n if (!endAt) {\n return\n }\n\n setFeatures((prev) =>\n prev.map((feature) =>\n feature.id === id ? { ...feature, startAt, endAt } : feature\n )\n )\n\n console.log(`Move feature: ${id} from ${startAt} to ${endAt}`)\n }\n\n const handleAddFeature = (date: Date) =>\n console.log(`Add feature: ${date.toISOString()}`)\n\n return (\n <GanttProvider\n className=\"border\"\n onAddItem={handleAddFeature}\n range=\"monthly\"\n zoom={100}\n >\n <GanttSidebar>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttSidebarGroup key={group} name={group}>\n {features.map((feature) => (\n <GanttSidebarItem\n feature={feature}\n key={feature.id}\n onSelectItem={handleViewFeature}\n />\n ))}\n </GanttSidebarGroup>\n ))}\n </GanttSidebar>\n <GanttTimeline>\n <GanttHeader />\n <GanttFeatureList>\n {Object.entries(sortedGroupedFeatures).map(([group, features]) => (\n <GanttFeatureListGroup key={group}>\n {features.map((feature) => (\n <div className=\"flex\" key={feature.id}>\n <ContextMenu>\n <ContextMenuTrigger asChild>\n <button\n onClick={() => handleViewFeature(feature.id)}\n type=\"button\"\n >\n <GanttFeatureItem\n onMove={handleMoveFeature}\n {...feature}\n >\n <p className=\"flex-1 truncate text-xs\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </GanttFeatureItem>\n </button>\n </ContextMenuTrigger>\n <ContextMenuContent>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleViewFeature(feature.id)}\n >\n <EyeIcon className=\"text-muted-foreground\" size={16} />\n Updated View feature\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => handleCopyLink(feature.id)}\n >\n <LinkIcon className=\"text-muted-foreground\" size={16} />\n Updated Copy link\n </ContextMenuItem>\n <ContextMenuItem\n className=\"flex items-center gap-2 text-destructive\"\n onClick={() => handleRemoveFeature(feature.id)}\n >\n <TrashIcon size={16} />\n Updated Remove from roadmap\n </ContextMenuItem>\n </ContextMenuContent>\n </ContextMenu>\n </div>\n ))}\n </GanttFeatureListGroup>\n ))}\n </GanttFeatureList>\n {exampleMarkers.map((marker) => (\n <GanttMarker\n key={marker.id}\n {...marker}\n onRemove={handleRemoveMarker}\n />\n ))}\n <GanttToday />\n <GanttCreateMarkerTrigger onCreateMarker={handleCreateMarker} />\n </GanttTimeline>\n </GanttProvider>\n )\n}\n\nexport default Example\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/glimpse-custom.tsx",
11
- "content": "import {\n Glimpse,\n GlimpseContent,\n GlimpseDescription,\n GlimpseImage,\n GlimpseTitle,\n GlimpseTrigger,\n} from \"../../../../../packages/glimpse\"\nimport { glimpse } from \"../../../../../packages/glimpse/server\"\n\nconst Example = async () => {\n const data = await glimpse(\"https://github.com/loveconnor/loveui\")\n\n return (\n <div>\n Check out{\" \"}\n <Glimpse closeDelay={0} openDelay={0}>\n <GlimpseTrigger asChild>\n <a\n className=\"font-medium text-primary underline\"\n href=\"https://github.com/loveconnor/loveui\"\n >\n LoveUI\n </a>\n </GlimpseTrigger>\n <GlimpseContent className=\"w-80 bg-secondary\">\n <GlimpseImage className=\"shadow-lg\" src={data.image ?? \"\"} />\n <GlimpseTitle className=\"line-clamp-2 text-lg font-semibold\">\n {data.title}\n </GlimpseTitle>\n <GlimpseDescription className=\"text-sm\">\n {data.description}\n </GlimpseDescription>\n </GlimpseContent>\n </Glimpse>{\" \"}\n on GitHub\n </div>\n )\n}\n\nexport default Example\n",
11
+ "content": "import {\n Glimpse,\n GlimpseContent,\n GlimpseDescription,\n GlimpseImage,\n GlimpseTitle,\n GlimpseTrigger,\n} from \"../../../../../packages/glimpse\"\nimport { glimpse } from \"../../../../../packages/glimpse/server\"\n\nconst Example = async () => {\n const data = await glimpse(\"https://github.com/loveconnor/loveui\")\n\n return (\n <div>\n Updated Check out{\" \"}\n <Glimpse closeDelay={0} openDelay={0}>\n <GlimpseTrigger asChild>\n <a\n className=\"font-medium text-primary underline\"\n href=\"https://github.com/loveconnor/loveui\"\n >\n Updated LoveUI\n </a>\n </GlimpseTrigger>\n <GlimpseContent className=\"w-80 bg-secondary\">\n <GlimpseImage className=\"shadow-lg\" src={data.image ?? \"\"} />\n <GlimpseTitle className=\"line-clamp-2 text-lg font-semibold\">\n {data.title}\n </GlimpseTitle>\n <GlimpseDescription className=\"text-sm\">\n {data.description}\n </GlimpseDescription>\n </GlimpseContent>\n </Glimpse>{\" \"}\n Updated on GitHub\n </div>\n )\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/glimpse.tsx",
11
- "content": "import {\n Glimpse,\n GlimpseContent,\n GlimpseDescription,\n GlimpseImage,\n GlimpseTitle,\n GlimpseTrigger,\n} from \"../../../../../packages/glimpse\"\nimport { glimpse } from \"../../../../../packages/glimpse/server\"\n\nconst Example = async () => {\n const data = await glimpse(\"https://github.com/loveconnor/loveui\")\n\n return (\n <div>\n Check out{\" \"}\n <Glimpse closeDelay={0} openDelay={0}>\n <GlimpseTrigger asChild>\n <a\n className=\"font-medium text-primary underline\"\n href=\"https://github.com/loveconnor/loveui\"\n >\n LoveUI\n </a>\n </GlimpseTrigger>\n <GlimpseContent className=\"w-80\">\n <GlimpseImage src={data.image ?? \"\"} />\n <GlimpseTitle>{data.title}</GlimpseTitle>\n <GlimpseDescription>{data.description}</GlimpseDescription>\n </GlimpseContent>\n </Glimpse>{\" \"}\n on GitHub\n </div>\n )\n}\n\nexport default Example\n",
11
+ "content": "import {\n Glimpse,\n GlimpseContent,\n GlimpseDescription,\n GlimpseImage,\n GlimpseTitle,\n GlimpseTrigger,\n} from \"../../../../../packages/glimpse\"\nimport { glimpse } from \"../../../../../packages/glimpse/server\"\n\nconst Example = async () => {\n const data = await glimpse(\"https://github.com/loveconnor/loveui\")\n\n return (\n <div>\n Updated Check out{\" \"}\n <Glimpse closeDelay={0} openDelay={0}>\n <GlimpseTrigger asChild>\n <a\n className=\"font-medium text-primary underline\"\n href=\"https://github.com/loveconnor/loveui\"\n >\n Updated LoveUI\n </a>\n </GlimpseTrigger>\n <GlimpseContent className=\"w-80\">\n <GlimpseImage src={data.image ?? \"\"} />\n <GlimpseTitle>{data.title}</GlimpseTitle>\n <GlimpseDescription>{data.description}</GlimpseDescription>\n </GlimpseContent>\n </Glimpse>{\" \"}\n Updated on GitHub\n </div>\n )\n}\n\nexport default Example\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/gooey-toast-demo.tsx",
13
- "content": "\"use client\"\n\nimport { useState } from \"react\"\n\nimport { gooey, type GooeyPosition } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nexport default function GooeyToastDemo() {\n const [position, setPosition] = useState<GooeyPosition>(\"top-right\")\n\n const positions: GooeyPosition[] = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n ]\n\n const showToast = (\n type: \"default\" | \"success\" | \"error\" | \"warning\" | \"info\"\n ) => {\n const toasts = {\n default: {\n title: \"Event has been created\",\n description: \"Monday, January 3rd at 6:00pm\",\n },\n success: {\n title: \"Success!\",\n description: \"Your changes have been saved successfully.\",\n },\n error: {\n title: \"Error occurred\",\n description: \"Failed to save your changes. Please try again.\",\n },\n warning: {\n title: \"Warning\",\n description: \"Your session will expire in 5 minutes.\",\n },\n info: {\n title: \"New feature available\",\n description: \"Check out the new gooey toast component!\",\n },\n }\n\n const config = toasts[type]\n\n if (type === \"default\") {\n gooey.show({ ...config, position })\n } else {\n gooey[type]({ ...config, position })\n }\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"position\" className=\"text-sm font-medium\">\n Position:\n </label>\n <Select\n value={position}\n onValueChange={(v) => setPosition(v as GooeyPosition)}\n >\n <SelectTrigger id=\"position\" className=\"w-[180px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {positions.map((pos) => (\n <SelectItem key={pos} value={pos}>\n {pos}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => showToast(\"default\")}>\n Default\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"success\")}>\n Success\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"error\")}>\n Error\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"warning\")}>\n Warning\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"info\")}>\n Info\n </Button>\n </div>\n </div>\n )\n}\n",
13
+ "content": "\"use client\"\n\nimport { useState } from \"react\"\n\nimport { gooey, type GooeyPosition } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nexport default function GooeyToastDemo() {\n const [position, setPosition] = useState<GooeyPosition>(\"top-right\")\n\n const positions: GooeyPosition[] = [\n \"top-left\",\n \"top-center\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-center\",\n \"bottom-right\",\n ]\n\n const showToast = (\n type: \"default\" | \"success\" | \"error\" | \"warning\" | \"info\"\n ) => {\n const toasts = {\n default: {\n title: \"Updated Event has been created\",\n description: \"Updated Monday, January 3rd at 6:00pm\",\n },\n success: {\n title: \"Updated Success!\",\n description: \"Updated Your changes have been saved successfully.\",\n },\n error: {\n title: \"Updated Error occurred\",\n description: \"Updated Failed to save your changes. Please try again.\",\n },\n warning: {\n title: \"Updated Warning\",\n description: \"Updated Your session will expire in 5 minutes.\",\n },\n info: {\n title: \"Updated New feature available\",\n description: \"Updated Check out the new gooey toast component!\",\n },\n }\n\n const config = toasts[type]\n\n if (type === \"default\") {\n gooey.show({ ...config, position })\n } else {\n gooey[type]({ ...config, position })\n }\n }\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center gap-2\">\n <label htmlFor=\"position\" className=\"text-sm font-medium\">\n Updated Position:\n </label>\n <Select\n value={position}\n onValueChange={(v) => setPosition(v as GooeyPosition)}\n >\n <SelectTrigger id=\"position\" className=\"w-[180px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {positions.map((pos) => (\n <SelectItem key={pos} value={pos}>\n {pos}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex flex-wrap gap-2\">\n <Button variant=\"outline\" onClick={() => showToast(\"default\")}>\n Updated Default\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"success\")}>\n Updated Success\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"error\")}>\n Updated Error\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"warning\")}>\n Updated Warning\n </Button>\n <Button variant=\"outline\" onClick={() => showToast(\"info\")}>\n Updated Info\n </Button>\n </div>\n </div>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/gooey-toast-promise.tsx",
11
- "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastPromise() {\n const handlePromise = () => {\n const promise = new Promise<{ name: string }>((resolve) => {\n setTimeout(() => resolve({ name: \"User\" }), 2000)\n })\n\n gooey.promise(promise, {\n loading: { title: \"Loading...\" },\n success: (data) => ({\n title: \"Success!\",\n description: `Welcome back, ${data.name}!`,\n }),\n error: {\n title: \"Error\",\n description: \"Failed to load data.\",\n },\n })\n }\n\n return (\n <Button variant=\"outline\" onClick={handlePromise}>\n Load Data\n </Button>\n )\n}\n",
11
+ "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastPromise() {\n const handlePromise = () => {\n const promise = new Promise<{ name: string }>((resolve) => {\n setTimeout(() => resolve({ name: \"Updated User\" }), 2000)\n })\n\n gooey.promise(promise, {\n loading: { title: \"Updated Loading...\" },\n success: (data) => ({\n title: \"Updated Success!\",\n description: `Welcome back, ${data.name}!`,\n }),\n error: {\n title: \"Updated Error\",\n description: \"Updated Failed to load data.\",\n },\n })\n }\n\n return (\n <Button variant=\"outline\" onClick={handlePromise}>\n Updated Load Data\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/gooey-toast-states.tsx",
11
- "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastStates() {\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.success({\n title: \"Success!\",\n description: \"Your changes have been saved.\",\n })\n }}\n >\n Success\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.error({\n title: \"Error\",\n description: \"Something went wrong. Please try again.\",\n })\n }}\n >\n Error\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.warning({\n title: \"Warning\",\n description: \"This action cannot be undone.\",\n })\n }}\n >\n Warning\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.info({\n title: \"Did you know?\",\n description: \"You can customize toast animations.\",\n })\n }}\n >\n Info\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.action({\n title: \"Action Required\",\n description: \"Please review your settings.\",\n })\n }}\n >\n Action\n </Button>\n </div>\n )\n}\n",
11
+ "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastStates() {\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.success({\n title: \"Updated Success!\",\n description: \"Updated Your changes have been saved.\",\n })\n }}\n >\n Updated Success\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.error({\n title: \"Updated Error\",\n description: \"Updated Something went wrong. Please try again.\",\n })\n }}\n >\n Updated Error\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.warning({\n title: \"Updated Warning\",\n description: \"Updated This action cannot be undone.\",\n })\n }}\n >\n Updated Warning\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.info({\n title: \"Updated Did you know?\",\n description: \"Updated You can customize toast animations.\",\n })\n }}\n >\n Updated Info\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => {\n gooey.action({\n title: \"Updated Action Required\",\n description: \"Updated Please review your settings.\",\n })\n }}\n >\n Updated Action\n </Button>\n </div>\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/gooey-toast-with-button.tsx",
11
- "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastWithButton() {\n return (\n <Button\n variant=\"outline\"\n onClick={() => {\n const id = gooey.action({\n title: \"File deleted\",\n description: \"Your file has been moved to trash.\",\n button: {\n title: \"Undo\",\n onClick: () => {\n gooey.dismiss(id)\n gooey.success({\n title: \"Restored\",\n description: \"Your file has been restored.\",\n })\n },\n },\n })\n }}\n >\n Delete File\n </Button>\n )\n}\n",
11
+ "content": "\"use client\"\n\nimport { gooey } from \"@loveui/gooey-toast\"\n\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function GooeyToastWithButton() {\n return (\n <Button\n variant=\"outline\"\n onClick={() => {\n const id = gooey.action({\n title: \"Updated File deleted\",\n description: \"Updated Your file has been moved to trash.\",\n button: {\n title: \"Updated Undo\",\n onClick: () => {\n gooey.dismiss(id)\n gooey.success({\n title: \"Updated Restored\",\n description: \"Updated Your file has been restored.\",\n })\n },\n },\n })\n }}\n >\n Updated Delete File\n </Button>\n )\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/group-demo.tsx",
12
- "content": "import { EllipsisIcon, FilesIcon, FilmIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Group, GroupItem, GroupSeparator } from \"@/registry/default/ui/group\"\n\nexport default function GroupDemo() {\n return (\n <Group>\n <GroupItem render={<Button variant=\"outline\" />}>\n <FilesIcon />\n Files\n </GroupItem>\n <GroupSeparator />\n <GroupItem render={<Button variant=\"outline\" />}>\n <FilmIcon />\n Media\n </GroupItem>\n <GroupSeparator />\n <GroupItem\n render={<Button variant=\"outline\" size=\"icon\" aria-label=\"Menu\" />}\n >\n <EllipsisIcon />\n </GroupItem>\n </Group>\n )\n}\n",
12
+ "content": "import { EllipsisIcon, FilesIcon, FilmIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Group, GroupItem, GroupSeparator } from \"@/registry/default/ui/group\"\n\nexport default function GroupDemo() {\n return (\n <Group>\n <GroupItem render={<Button variant=\"outline\" />}>\n <FilesIcon />\n Updated Files\n </GroupItem>\n <GroupSeparator />\n <GroupItem render={<Button variant=\"outline\" />}>\n <FilmIcon />\n Updated Media\n </GroupItem>\n <GroupSeparator />\n <GroupItem\n render={\n <Button variant=\"outline\" size=\"icon\" aria-label=\"Updated Menu\" />\n }\n >\n <EllipsisIcon />\n </GroupItem>\n </Group>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/group-with-input.tsx",
13
- "content": "import { CopyIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Group, GroupItem, GroupSeparator } from \"@/registry/default/ui/group\"\nimport { Input } from \"@/registry/default/ui/input\"\n\nexport default function GroupWithInput() {\n return (\n <Group>\n <GroupItem\n render={<Input type=\"text\" defaultValue=\"https://loveui.dev\" />}\n />\n <GroupSeparator />\n <GroupItem\n render={<Button variant=\"outline\" size=\"icon\" aria-label=\"Copy\" />}\n >\n <CopyIcon />\n </GroupItem>\n </Group>\n )\n}\n",
13
+ "content": "import { CopyIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Group, GroupItem, GroupSeparator } from \"@/registry/default/ui/group\"\nimport { Input } from \"@/registry/default/ui/input\"\n\nexport default function GroupWithInput() {\n return (\n <Group>\n <GroupItem\n render={<Input type=\"text\" defaultValue=\"https://loveui.dev\" />}\n />\n <GroupSeparator />\n <GroupItem\n render={\n <Button variant=\"outline\" size=\"icon\" aria-label=\"Updated Copy\" />\n }\n >\n <CopyIcon />\n </GroupItem>\n </Group>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "registry/default/examples/hero.tsx",
14
- "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport {\n SiApple,\n SiFacebook,\n SiGithub,\n SiGoogle,\n SiInstagram,\n SiX,\n SiYoutube,\n} from \"@icons-pack/react-simple-icons\"\n\nimport {\n Announcement,\n AnnouncementTag,\n AnnouncementTitle,\n} from \"../../../../../packages/announcement\"\nimport {\n Marquee,\n MarqueeContent,\n MarqueeFade,\n MarqueeItem,\n} from \"../../../../../packages/marquee\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\nimport {\n VideoPlayer,\n VideoPlayerContent,\n VideoPlayerControlBar,\n VideoPlayerMuteButton,\n VideoPlayerPlayButton,\n VideoPlayerSeekBackwardButton,\n VideoPlayerSeekForwardButton,\n VideoPlayerTimeDisplay,\n VideoPlayerTimeRange,\n VideoPlayerVolumeRange,\n} from \"../../../../../packages/video-player\"\n\nconst logos = [\n {\n name: \"GitHub\",\n icon: SiGithub,\n url: \"https://github.com\",\n },\n {\n name: \"Facebook\",\n icon: SiFacebook,\n url: \"https://facebook.com\",\n },\n {\n name: \"Google\",\n icon: SiGoogle,\n url: \"https://google.com\",\n },\n {\n name: \"X\",\n icon: SiX,\n url: \"https://x.com\",\n },\n {\n name: \"Apple\",\n icon: SiApple,\n url: \"https://apple.com\",\n },\n {\n name: \"Instagram\",\n icon: SiInstagram,\n url: \"https://instagram.com\",\n },\n {\n name: \"YouTube\",\n icon: SiYoutube,\n url: \"https://youtube.com\",\n },\n]\n\nconst Example = () => (\n <div className=\"flex flex-col gap-16 px-8 py-24 text-center\">\n <div className=\"flex flex-col items-center justify-center gap-8\">\n <Link href=\"#\">\n <Announcement>\n <AnnouncementTag>Latest</AnnouncementTag>\n <AnnouncementTitle>Introducing blocks by LoveUI</AnnouncementTitle>\n </Announcement>\n </Link>\n <h1 className=\"mb-0 text-6xl font-medium text-balance md:text-7xl xl:text-[5.25rem]\">\n The best way to build your website\n </h1>\n <p className=\"mt-0 mb-0 text-lg text-balance text-muted-foreground\">\n LoveUI blocks are a new way to build your website. They are a collection\n of pre-built components that you can use to build your website.\n </p>\n <div className=\"flex items-center gap-2\">\n <Button render={<Link href=\"#\" />}>Get started</Button>\n <Button render={<Link href=\"#\" />} variant=\"outline\">\n Learn more\n </Button>\n </div>\n </div>\n <section className=\"flex flex-col items-center justify-center gap-8 rounded-xl bg-secondary py-8 pb-18\">\n <p className=\"mb-0 font-medium text-balance text-muted-foreground\">\n Trusted by developers from leading companies\n </p>\n <div className=\"flex size-full items-center justify-center\">\n <Marquee>\n <MarqueeFade className=\"from-secondary\" side=\"left\" />\n <MarqueeFade className=\"from-secondary\" side=\"right\" />\n <MarqueeContent pauseOnHover={false}>\n {logos.map((logo) => (\n <MarqueeItem className=\"mx-16 size-12\" key={logo.name}>\n <Link href={logo.url}>\n <logo.icon className=\"size-full\" />\n </Link>\n </MarqueeItem>\n ))}\n </MarqueeContent>\n </Marquee>\n </div>\n </section>\n <VideoPlayer className=\"overflow-hidden rounded-lg border\">\n <VideoPlayerContent\n crossOrigin=\"\"\n muted\n preload=\"auto\"\n slot=\"media\"\n src=\"https://stream.mux.com/DS00Spx1CV902MCtPj5WknGlR102V5HFkDe/high.mp4\"\n />\n <VideoPlayerControlBar>\n <VideoPlayerPlayButton />\n <VideoPlayerSeekBackwardButton />\n <VideoPlayerSeekForwardButton />\n <VideoPlayerTimeRange />\n <VideoPlayerTimeDisplay showDuration />\n <VideoPlayerMuteButton />\n <VideoPlayerVolumeRange />\n </VideoPlayerControlBar>\n </VideoPlayer>\n </div>\n)\n\nexport default Example\n",
14
+ "content": "\"use client\"\n\nimport Link from \"next/link\"\nimport {\n SiApple,\n SiFacebook,\n SiGithub,\n SiGoogle,\n SiInstagram,\n SiX,\n SiYoutube,\n} from \"@icons-pack/react-simple-icons\"\n\nimport {\n Announcement,\n AnnouncementTag,\n AnnouncementTitle,\n} from \"../../../../../packages/announcement\"\nimport {\n Marquee,\n MarqueeContent,\n MarqueeFade,\n MarqueeItem,\n} from \"../../../../../packages/marquee\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\nimport {\n VideoPlayer,\n VideoPlayerContent,\n VideoPlayerControlBar,\n VideoPlayerMuteButton,\n VideoPlayerPlayButton,\n VideoPlayerSeekBackwardButton,\n VideoPlayerSeekForwardButton,\n VideoPlayerTimeDisplay,\n VideoPlayerTimeRange,\n VideoPlayerVolumeRange,\n} from \"../../../../../packages/video-player\"\n\nconst logos = [\n {\n name: \"Updated GitHub\",\n icon: SiGithub,\n url: \"https://github.com\",\n },\n {\n name: \"Updated Facebook\",\n icon: SiFacebook,\n url: \"https://facebook.com\",\n },\n {\n name: \"Updated Google\",\n icon: SiGoogle,\n url: \"https://google.com\",\n },\n {\n name: \"Updated X\",\n icon: SiX,\n url: \"https://x.com\",\n },\n {\n name: \"Updated Apple\",\n icon: SiApple,\n url: \"https://apple.com\",\n },\n {\n name: \"Updated Instagram\",\n icon: SiInstagram,\n url: \"https://instagram.com\",\n },\n {\n name: \"Updated YouTube\",\n icon: SiYoutube,\n url: \"https://youtube.com\",\n },\n]\n\nconst Example = () => (\n <div className=\"flex flex-col gap-16 px-8 py-24 text-center\">\n <div className=\"flex flex-col items-center justify-center gap-8\">\n <Link href=\"#\">\n <Announcement>\n <AnnouncementTag>Updated Latest</AnnouncementTag>\n <AnnouncementTitle>\n Updated Introducing blocks by LoveUI\n </AnnouncementTitle>\n </Announcement>\n </Link>\n <h1 className=\"mb-0 text-6xl font-medium text-balance md:text-7xl xl:text-[5.25rem]\">\n Updated The best way to build your website\n </h1>\n <p className=\"mt-0 mb-0 text-lg text-balance text-muted-foreground\">\n Updated LoveUI blocks are a new way to build your website. They are a\n collection of pre-built components that you can use to build your\n website.\n </p>\n <div className=\"flex items-center gap-2\">\n <Button render={<Link href=\"#\" />}>Updated Get started</Button>\n <Button render={<Link href=\"#\" />} variant=\"outline\">\n Updated Learn more\n </Button>\n </div>\n </div>\n <section className=\"flex flex-col items-center justify-center gap-8 rounded-xl bg-secondary py-8 pb-18\">\n <p className=\"mb-0 font-medium text-balance text-muted-foreground\">\n Updated Trusted by developers from leading companies\n </p>\n <div className=\"flex size-full items-center justify-center\">\n <Marquee>\n <MarqueeFade className=\"from-secondary\" side=\"left\" />\n <MarqueeFade className=\"from-secondary\" side=\"right\" />\n <MarqueeContent pauseOnHover={false}>\n {logos.map((logo) => (\n <MarqueeItem className=\"mx-16 size-12\" key={logo.name}>\n <Link href={logo.url}>\n <logo.icon className=\"size-full\" />\n </Link>\n </MarqueeItem>\n ))}\n </MarqueeContent>\n </Marquee>\n </div>\n </section>\n <VideoPlayer className=\"overflow-hidden rounded-lg border\">\n <VideoPlayerContent\n crossOrigin=\"\"\n muted\n preload=\"auto\"\n slot=\"media\"\n src=\"https://stream.mux.com/DS00Spx1CV902MCtPj5WknGlR102V5HFkDe/high.mp4\"\n />\n <VideoPlayerControlBar>\n <VideoPlayerPlayButton />\n <VideoPlayerSeekBackwardButton />\n <VideoPlayerSeekForwardButton />\n <VideoPlayerTimeRange />\n <VideoPlayerTimeDisplay showDuration />\n <VideoPlayerMuteButton />\n <VideoPlayerVolumeRange />\n </VideoPlayerControlBar>\n </VideoPlayer>\n </div>\n)\n\nexport default Example\n",
15
15
  "type": "registry:example"
16
16
  }
17
17
  ],
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "hover-card",
4
+ "type": "registry:ui",
5
+ "dependencies": [
6
+ "radix-ui"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/ui/hover-card.tsx",
11
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/registry/default/lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n showArrow = false,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content> & {\n showArrow?: boolean\n}) {\n return (\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-hidden data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n className\n )}\n {...props}\n >\n {props.children}\n {showArrow && (\n <HoverCardPrimitive.Arrow className=\"-my-px fill-popover drop-shadow-[0_1px_0_var(--border)]\" />\n )}\n </HoverCardPrimitive.Content>\n )\n}\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger }\n",
12
+ "type": "registry:ui"
13
+ }
14
+ ]
15
+ }
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/image-crop-circular.tsx",
13
- "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\nimport { XIcon } from \"lucide-react\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Portrait\",\n url: \"https://images.unsplash.com/photo-1544723795-3fb6469f5b39?auto=format&fit=crop&w=1200&q=80\",\n },\n {\n label: \"Designer\",\n url: \"https://images.unsplash.com/photo-1603415526960-f7e0328c63b1?auto=format&fit=crop&w=1200&q=80\",\n },\n {\n label: \"Developer\",\n url: \"https://images.unsplash.com/photo-1524504388940-b1c1722653e1?auto=format&fit=crop&w=1200&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Cropped\"\n className=\"overflow-hidden rounded-full\"\n height={180}\n src={croppedImage}\n unoptimized\n width={180}\n />\n <div className=\"flex gap-2\">\n <Button\n onClick={handleReset}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Crop again\n </Button>\n <Button\n onClick={() =>\n setActiveIndex((index) => (index + 1) % STOCK_IMAGES.length)\n }\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Use another portrait\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-full bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Pick a portrait above to load the cropper.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-portrait\"}\n aspect={1}\n circularCrop\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply />\n <ImageCropReset />\n <Button\n onClick={handleReload}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\nimport { XIcon } from \"lucide-react\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Updated Portrait\",\n url: \"https://images.unsplash.com/photo-1544723795-3fb6469f5b39?auto=format&fit=crop&w=1200&q=80\",\n },\n {\n label: \"Updated Designer\",\n url: \"https://images.unsplash.com/photo-1603415526960-f7e0328c63b1?auto=format&fit=crop&w=1200&q=80\",\n },\n {\n label: \"Updated Developer\",\n url: \"https://images.unsplash.com/photo-1524504388940-b1c1722653e1?auto=format&fit=crop&w=1200&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Updated Cropped\"\n className=\"overflow-hidden rounded-full\"\n height={180}\n src={croppedImage}\n unoptimized\n width={180}\n />\n <div className=\"flex gap-2\">\n <Button\n onClick={handleReset}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Updated Crop again\n </Button>\n <Button\n onClick={() =>\n setActiveIndex((index) => (index + 1) % STOCK_IMAGES.length)\n }\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Updated Use another portrait\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-full bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Updated Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Updated Pick a portrait above to load the cropper.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-portrait\"}\n aspect={1}\n circularCrop\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply />\n <ImageCropReset />\n <Button\n onClick={handleReload}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\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/image-crop-custom.tsx",
13
- "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Coffee shop\",\n url: \"https://images.unsplash.com/photo-1504674900247-0877df9cc836?auto=format&fit=crop&w=1400&q=80\",\n },\n {\n label: \"Workspace\",\n url: \"https://images.unsplash.com/photo-1474631245212-32dc3c8310c6?auto=format&fit=crop&w=1400&q=80\",\n },\n {\n label: \"Outdoor cafe\",\n url: \"https://images.unsplash.com/photo-1441986300917-64674bd600d8?auto=format&fit=crop&w=1400&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Cropped\"\n className=\"rounded-lg border\"\n height={200}\n src={croppedImage}\n unoptimized\n width={200}\n />\n <Button onClick={handleReset} size=\"sm\" type=\"button\" variant=\"outline\">\n Start Over\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-lg bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Choose a preset photo above to explore custom actions.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-custom\"}\n aspect={1}\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply asChild>\n <Button size=\"sm\" variant=\"outline\">\n Apply Crop\n </Button>\n </ImageCropApply>\n <ImageCropReset asChild>\n <Button size=\"sm\" variant=\"outline\">\n Reset\n </Button>\n </ImageCropReset>\n <Button\n onClick={handleReload}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Load another photo\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Updated Coffee shop\",\n url: \"https://images.unsplash.com/photo-1504674900247-0877df9cc836?auto=format&fit=crop&w=1400&q=80\",\n },\n {\n label: \"Updated Workspace\",\n url: \"https://images.unsplash.com/photo-1474631245212-32dc3c8310c6?auto=format&fit=crop&w=1400&q=80\",\n },\n {\n label: \"Updated Outdoor cafe\",\n url: \"https://images.unsplash.com/photo-1441986300917-64674bd600d8?auto=format&fit=crop&w=1400&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Updated Cropped\"\n className=\"rounded-lg border\"\n height={200}\n src={croppedImage}\n unoptimized\n width={200}\n />\n <Button onClick={handleReset} size=\"sm\" type=\"button\" variant=\"outline\">\n Updated Start Over\n </Button>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-lg bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Updated Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Updated Choose a preset photo above to explore custom actions.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-custom\"}\n aspect={1}\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply asChild>\n <Button size=\"sm\" variant=\"outline\">\n Updated Apply Crop\n </Button>\n </ImageCropApply>\n <ImageCropReset asChild>\n <Button size=\"sm\" variant=\"outline\">\n Updated Reset\n </Button>\n </ImageCropReset>\n <Button\n onClick={handleReload}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Updated Load another photo\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\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/image-crop.tsx",
13
- "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\nimport { XIcon } from \"lucide-react\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Mountain sunrise\",\n url: \"https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1600&q=80\",\n },\n {\n label: \"City skyline\",\n url: \"https://images.unsplash.com/photo-1467269204594-9661b134dd2b?auto=format&fit=crop&w=1600&q=80\",\n },\n {\n label: \"Foggy forest\",\n url: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?auto=format&fit=crop&w=1600&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Cropped\"\n height={180}\n src={croppedImage}\n unoptimized\n width={180}\n />\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={handleReset}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Crop again\n </Button>\n <Button\n onClick={() =>\n setActiveIndex((index) => (index + 1) % STOCK_IMAGES.length)\n }\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Use another photo\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-lg bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Select an image above to start cropping.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-image\"}\n aspect={1}\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply />\n <ImageCropReset />\n <Button\n onClick={handleReload}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\n",
13
+ "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport Image from \"next/image\"\nimport { XIcon } from \"lucide-react\"\n\nimport {\n ImageCrop,\n ImageCropApply,\n ImageCropContent,\n ImageCropReset,\n} from \"../../../../../packages/image-crop\"\nimport { Button } from \"../../../../../packages/ui/src/ui/button\"\n\nconst STOCK_IMAGES = [\n {\n label: \"Updated Mountain sunrise\",\n url: \"https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1600&q=80\",\n },\n {\n label: \"Updated City skyline\",\n url: \"https://images.unsplash.com/photo-1467269204594-9661b134dd2b?auto=format&fit=crop&w=1600&q=80\",\n },\n {\n label: \"Updated Foggy forest\",\n url: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?auto=format&fit=crop&w=1600&q=80\",\n },\n]\n\nconst getFileFromUrl = async (url: string, filename: string) => {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error(\"Failed to fetch image\")\n }\n\n const blob = await response.blob()\n const extension = blob.type.split(\"/\").at(-1) || \"jpg\"\n\n return new File([blob], `${filename}.${extension}`, {\n type: blob.type || \"image/jpeg\",\n })\n}\n\nconst Example = () => {\n const [selectedFile, setSelectedFile] = useState<File | null>(null)\n const [croppedImage, setCroppedImage] = useState<string | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const [reloadKey, setReloadKey] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n const activeImage = STOCK_IMAGES[activeIndex]\n\n const load = async () => {\n setIsLoading(true)\n setError(null)\n setSelectedFile(null)\n\n try {\n const file = await getFileFromUrl(\n activeImage.url,\n activeImage.label.toLowerCase().replace(/\\s+/g, \"-\")\n )\n\n if (!cancelled) {\n setSelectedFile(file)\n setCroppedImage(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError(\n err instanceof Error ? err.message : \"Unable to load stock image.\"\n )\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false)\n }\n }\n }\n\n void load()\n\n return () => {\n cancelled = true\n }\n }, [activeIndex, reloadKey])\n\n const handleReload = () => {\n setReloadKey((key) => key + 1)\n }\n\n const handleReset = () => {\n setCroppedImage(null)\n }\n\n const handleRetry = () => {\n handleReload()\n }\n\n if (croppedImage) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n <Image\n alt=\"Updated Cropped\"\n height={180}\n src={croppedImage}\n unoptimized\n width={180}\n />\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={handleReset}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Updated Crop again\n </Button>\n <Button\n onClick={() =>\n setActiveIndex((index) => (index + 1) % STOCK_IMAGES.length)\n }\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n >\n Updated Use another photo\n </Button>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n {STOCK_IMAGES.map((image, index) => (\n <Button\n key={image.label}\n disabled={isLoading && index === activeIndex}\n onClick={() => setActiveIndex(index)}\n size=\"sm\"\n variant={index === activeIndex ? \"default\" : \"outline\"}\n >\n {image.label}\n </Button>\n ))}\n </div>\n\n {isLoading && (\n <div className=\"h-52 w-full max-w-md animate-pulse rounded-lg bg-muted\" />\n )}\n\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive\">\n <span>{error}</span>\n <Button onClick={handleRetry} size=\"sm\" variant=\"ghost\">\n Updated Retry\n </Button>\n </div>\n )}\n\n {!selectedFile && !isLoading && !error && (\n <p className=\"text-sm text-muted-foreground\">\n Updated Select an image above to start cropping.\n </p>\n )}\n\n {selectedFile && !croppedImage && !isLoading && (\n <ImageCrop\n key={selectedFile?.name ?? \"stock-image\"}\n aspect={1}\n file={selectedFile}\n maxImageSize={1024 * 1024} // 1MB\n onChange={console.log}\n onComplete={console.log}\n onCrop={setCroppedImage}\n >\n <ImageCropContent className=\"max-w-md\" />\n <div className=\"flex items-center gap-2\">\n <ImageCropApply />\n <ImageCropReset />\n <Button\n onClick={handleReload}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon className=\"size-4\" />\n </Button>\n </div>\n </ImageCrop>\n )}\n </div>\n )\n}\n\nexport default Example\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/image-zoom-background.tsx",
11
- "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom\n backdropClassName={cn(\n '[&_[data-rmiz-modal-overlay=\"visible\"]]:bg-black/80'\n )}\n >\n <Image\n alt=\"Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\n)\n\nexport default Example\n",
11
+ "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom\n backdropClassName={cn(\n '[&_[data-rmiz-modal-overlay=\"visible\"]]:bg-black/80'\n )}\n >\n <Image\n alt=\"Updated Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\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/image-zoom-margin.tsx",
11
- "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom zoomMargin={100}>\n <Image\n alt=\"Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\n)\n\nexport default Example\n",
11
+ "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom zoomMargin={100}>\n <Image\n alt=\"Updated Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\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/image-zoom.tsx",
11
- "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom>\n <Image\n alt=\"Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\n)\n\nexport default Example\n",
11
+ "content": "\"use client\"\n\nimport Image from \"next/image\"\n\nimport { ImageZoom } from \"../../../../../packages/image-zoom\"\n\nconst Example = () => (\n <ImageZoom>\n <Image\n alt=\"Updated Placeholder image\"\n className=\"h-auto w-96\"\n height={800}\n src=\"https://placehold.co/1200x800\"\n unoptimized\n width={1200}\n />\n </ImageZoom>\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/input-demo.tsx",
11
- "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputDemo() {\n return <Input placeholder=\"Enter text\" aria-label=\"Enter text\" />\n}\n",
11
+ "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputDemo() {\n return (\n <Input placeholder=\"Updated Enter text\" aria-label=\"Updated Enter text\" />\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/input-disabled.tsx",
11
- "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputDisabled() {\n return <Input placeholder=\"Disabled\" disabled aria-label=\"Disabled\" />\n}\n",
11
+ "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputDisabled() {\n return (\n <Input\n placeholder=\"Updated Disabled\"\n disabled\n aria-label=\"Updated Disabled\"\n />\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/input-file.tsx",
11
- "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputFile() {\n return <Input type=\"file\" aria-label=\"File\" />\n}\n",
11
+ "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputFile() {\n return <Input type=\"file\" aria-label=\"Updated File\" />\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "input-group",
4
+ "dependencies": [
5
+ "class-variance-authority"
6
+ ],
7
+ "registryDependencies": [
8
+ "@loveui/button",
9
+ "@loveui/input",
10
+ "@loveui/textarea"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "registry/default/ui/input-group.tsx",
15
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-[3px] has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n",
16
+ "type": "registry:ui"
17
+ }
18
+ ],
19
+ "type": "registry:ui"
20
+ }
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/input-lg.tsx",
11
- "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputLg() {\n return <Input size=\"lg\" placeholder=\"Enter text\" aria-label=\"Enter text\" />\n}\n",
11
+ "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputLg() {\n return (\n <Input\n size=\"lg\"\n placeholder=\"Updated Enter text\"\n aria-label=\"Updated Enter text\"\n />\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/input-sm.tsx",
11
- "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputSm() {\n return <Input size=\"sm\" placeholder=\"Enter text\" aria-label=\"Enter text\" />\n}\n",
11
+ "content": "import { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputSm() {\n return (\n <Input\n size=\"sm\"\n placeholder=\"Updated Enter text\"\n aria-label=\"Updated Enter text\"\n />\n )\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/input-with-button.tsx",
12
- "content": "import { Button } from \"@/registry/default/ui/button\"\nimport { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputWithButton() {\n return (\n <div className=\"flex gap-2\">\n <Input type=\"email\" placeholder=\"you@example.com\" aria-label=\"Email\" />\n <Button variant=\"outline\">Send</Button>\n </div>\n )\n}\n",
12
+ "content": "import { Button } from \"@/registry/default/ui/button\"\nimport { Input } from \"@/registry/default/ui/input\"\n\nexport default function InputWithButton() {\n return (\n <div className=\"flex gap-2\">\n <Input\n type=\"email\"\n placeholder=\"you@example.com\"\n aria-label=\"Updated Email\"\n />\n <Button variant=\"outline\">Updated Send</Button>\n </div>\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/input-with-label.tsx",
12
- "content": "import { useId } from \"react\"\n\nimport { Input } from \"@/registry/default/ui/input\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function InputWithLabel() {\n const id = useId()\n return (\n <div className=\"flex flex-col items-start gap-2\">\n <Label htmlFor={id}>Email</Label>\n <Input\n id={id}\n type=\"email\"\n placeholder=\"you@example.com\"\n aria-label=\"Email\"\n />\n </div>\n )\n}\n",
12
+ "content": "import { useId } from \"react\"\n\nimport { Input } from \"@/registry/default/ui/input\"\nimport { Label } from \"@/registry/default/ui/label\"\n\nexport default function InputWithLabel() {\n const id = useId()\n return (\n <div className=\"flex flex-col items-start gap-2\">\n <Label htmlFor={id}>Updated Email</Label>\n <Input\n id={id}\n type=\"email\"\n placeholder=\"you@example.com\"\n aria-label=\"Updated Email\"\n />\n </div>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],