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
@@ -15,7 +15,7 @@
15
15
  "files": [
16
16
  {
17
17
  "path": "registry/default/examples/roadmap.tsx",
18
- "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport {\n CalendarIcon,\n ChevronRightIcon,\n EyeIcon,\n GanttChartSquareIcon,\n KanbanSquareIcon,\n LinkIcon,\n ListIcon,\n TableIcon,\n TrashIcon,\n} from \"lucide-react\"\n\nimport {\n CalendarBody,\n CalendarDate,\n CalendarDatePagination,\n CalendarDatePicker,\n CalendarHeader,\n CalendarItem,\n CalendarMonthPicker,\n CalendarProvider,\n CalendarYearPicker,\n} from \"../../../../../packages/calendar\"\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\"\nimport {\n KanbanBoard,\n KanbanCard,\n KanbanCards,\n KanbanHeader,\n KanbanProvider,\n} from \"../../../../../packages/kanban\"\nimport {\n ListGroup,\n ListHeader,\n ListItem,\n ListItems,\n ListProvider,\n type DragEndEvent,\n} from \"../../../../../packages/list\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"../../../../../packages/shadcn-ui/components/ui/context-menu\"\nimport type { ColumnDef } from \"../../../../../packages/table\"\nimport {\n TableBody,\n TableCell,\n TableColumnHeader,\n TableHead,\n TableHeader,\n TableHeaderGroup,\n TableProvider,\n TableRow,\n} from \"../../../../../packages/table\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"../../../../../packages/ui/src/ui/avatar\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../../../../packages/ui/src/ui/tabs\"\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 GanttView = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n\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=\"rounded-none\"\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\nconst earliestYear =\n exampleFeatures\n .map((feature) => feature.startAt.getFullYear())\n .sort()\n .at(0) ?? new Date().getFullYear()\n\nconst latestYear =\n exampleFeatures\n .map((feature) => feature.endAt.getFullYear())\n .sort()\n .at(-1) ?? new Date().getFullYear()\n\nconst CalendarView = () => (\n <CalendarProvider>\n <CalendarDate>\n <CalendarDatePicker>\n <CalendarMonthPicker />\n <CalendarYearPicker end={latestYear} start={earliestYear} />\n </CalendarDatePicker>\n <CalendarDatePagination />\n </CalendarDate>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nconst ListView = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n return\n }\n\n const status = statuses.find((status) => status.name === over.id)\n\n if (!status) {\n return\n }\n\n setFeatures(\n features.map((feature) => {\n if (feature.id === active.id) {\n return { ...feature, status }\n }\n\n return feature\n })\n )\n }\n\n return (\n <ListProvider className=\"overflow-auto\" onDragEnd={handleDragEnd}>\n {statuses.map((status) => (\n <ListGroup id={status.name} key={status.name}>\n <ListHeader color={status.color} name={status.name} />\n <ListItems>\n {features\n .filter((feature) => feature.status.name === status.name)\n .map((feature, index) => (\n <ListItem\n id={feature.id}\n index={index}\n key={feature.id}\n name={feature.name}\n parent={feature.status.name}\n >\n <div\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: feature.status.color }}\n />\n <p className=\"m-0 flex-1 text-sm font-medium\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4 shrink-0\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </ListItem>\n ))}\n </ListItems>\n </ListGroup>\n ))}\n </ListProvider>\n )\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n})\n\nconst shortDateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n})\n\nconst KanbanView = () => {\n const [features, setFeatures] = useState(\n exampleFeatures.map((feature) => ({\n ...feature,\n column: feature.status.id,\n }))\n )\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n return\n }\n\n const status = statuses.find(({ id }) => id === over.id)\n\n if (!status) {\n return\n }\n\n setFeatures(\n features.map((feature) => {\n if (feature.id === active.id) {\n return { ...feature, status }\n }\n\n return feature\n })\n )\n }\n\n return (\n <KanbanProvider\n className=\"p-4\"\n columns={statuses}\n data={features}\n onDragEnd={handleDragEnd}\n >\n {(column) => (\n <KanbanBoard id={column.id} key={column.id}>\n <KanbanHeader>{column.name}</KanbanHeader>\n <KanbanCards id={column.id}>\n {(feature: (typeof features)[number]) => (\n <KanbanCard\n column={column.id}\n id={feature.id}\n key={feature.id}\n name={feature.name}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex flex-col gap-1\">\n <p className=\"m-0 flex-1 text-sm font-medium\">\n {feature.name}\n </p>\n <p className=\"m-0 text-xs text-muted-foreground\">\n {feature.initiative.name}\n </p>\n </div>\n {feature.owner && (\n <Avatar className=\"h-4 w-4 shrink-0\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n <p className=\"m-0 text-xs text-muted-foreground\">\n {shortDateFormatter.format(feature.startAt)} -{\" \"}\n {dateFormatter.format(feature.endAt)}\n </p>\n </KanbanCard>\n )}\n </KanbanCards>\n </KanbanBoard>\n )}\n </KanbanProvider>\n )\n}\n\nconst TableView = () => {\n const columns: ColumnDef<(typeof exampleFeatures)[number]>[] = [\n {\n accessorKey: \"name\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Name\" />\n ),\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Avatar className=\"size-6\">\n <AvatarImage src={row.original.owner.image} />\n <AvatarFallback>\n {row.original.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n\n <div\n className=\"absolute right-0 bottom-0 h-2 w-2 rounded-full ring-2 ring-background\"\n style={{\n backgroundColor: row.original.status.color,\n }}\n />\n </div>\n <div>\n <span className=\"font-medium\">{row.original.name}</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span>{row.original.product.name}</span>\n <ChevronRightIcon size={12} />\n <span>{row.original.group.name}</span>\n </div>\n </div>\n </div>\n ),\n },\n {\n accessorKey: \"startAt\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Start At\" />\n ),\n cell: ({ row }) =>\n new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n }).format(row.original.startAt),\n },\n {\n accessorKey: \"endAt\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"End At\" />\n ),\n cell: ({ row }) =>\n new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n }).format(row.original.endAt),\n },\n {\n id: \"release\",\n accessorFn: (row) => row.release.id,\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Release\" />\n ),\n cell: ({ row }) => row.original.release.name,\n },\n ]\n\n return (\n <div className=\"size-full overflow-auto\">\n <TableProvider columns={columns} data={exampleFeatures}>\n <TableHeader>\n {({ headerGroup }) => (\n <TableHeaderGroup headerGroup={headerGroup} key={headerGroup.id}>\n {({ header }) => <TableHead header={header} key={header.id} />}\n </TableHeaderGroup>\n )}\n </TableHeader>\n <TableBody>\n {({ row }) => (\n <TableRow key={row.id} row={row}>\n {({ cell }) => <TableCell cell={cell} key={cell.id} />}\n </TableRow>\n )}\n </TableBody>\n </TableProvider>\n </div>\n )\n}\n\nconst Example = () => {\n const views = [\n {\n id: \"gantt\",\n label: \"Gantt\",\n icon: GanttChartSquareIcon,\n component: GanttView,\n },\n {\n id: \"calendar\",\n label: \"Calendar\",\n icon: CalendarIcon,\n component: CalendarView,\n },\n {\n id: \"list\",\n label: \"List\",\n icon: ListIcon,\n component: ListView,\n },\n {\n id: \"kanban\",\n label: \"Kanban\",\n icon: KanbanSquareIcon,\n component: KanbanView,\n },\n {\n id: \"table\",\n label: \"Table\",\n icon: TableIcon,\n component: TableView,\n },\n ]\n\n return (\n <Tabs className=\"not-prose size-full gap-0 divide-y\" defaultValue=\"gantt\">\n <div className=\"flex items-center justify-between gap-4 p-4\">\n <p className=\"font-medium\">Roadmap</p>\n <TabsList>\n {views.map((view) => (\n <TabsTrigger key={view.id} value={view.id}>\n <view.icon size={16} />\n <span className=\"sr-only\">{view.label}</span>\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n {views.map((view) => (\n <TabsContent className=\"overflow-hidden\" key={view.id} value={view.id}>\n <view.component />\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n\nexport default Example\n",
18
+ "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { faker } from \"@faker-js/faker\"\nimport groupBy from \"lodash.groupby\"\nimport {\n CalendarIcon,\n ChevronRightIcon,\n EyeIcon,\n GanttChartSquareIcon,\n KanbanSquareIcon,\n LinkIcon,\n ListIcon,\n TableIcon,\n TrashIcon,\n} from \"lucide-react\"\n\nimport {\n CalendarBody,\n CalendarDate,\n CalendarDatePagination,\n CalendarDatePicker,\n CalendarHeader,\n CalendarItem,\n CalendarMonthPicker,\n CalendarProvider,\n CalendarYearPicker,\n} from \"../../../../../packages/calendar\"\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\"\nimport {\n KanbanBoard,\n KanbanCard,\n KanbanCards,\n KanbanHeader,\n KanbanProvider,\n} from \"../../../../../packages/kanban\"\nimport {\n ListGroup,\n ListHeader,\n ListItem,\n ListItems,\n ListProvider,\n type DragEndEvent,\n} from \"../../../../../packages/list\"\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuTrigger,\n} from \"../../../../../packages/shadcn-ui/components/ui/context-menu\"\nimport type { ColumnDef } from \"../../../../../packages/table\"\nimport {\n TableBody,\n TableCell,\n TableColumnHeader,\n TableHead,\n TableHeader,\n TableHeaderGroup,\n TableProvider,\n TableRow,\n} from \"../../../../../packages/table\"\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"../../../../../packages/ui/src/ui/avatar\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../../../../packages/ui/src/ui/tabs\"\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 GanttView = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n const groupedFeatures = groupBy(features, \"group.name\")\n\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=\"rounded-none\"\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\nconst earliestYear =\n exampleFeatures\n .map((feature) => feature.startAt.getFullYear())\n .sort()\n .at(0) ?? new Date().getFullYear()\n\nconst latestYear =\n exampleFeatures\n .map((feature) => feature.endAt.getFullYear())\n .sort()\n .at(-1) ?? new Date().getFullYear()\n\nconst CalendarView = () => (\n <CalendarProvider>\n <CalendarDate>\n <CalendarDatePicker>\n <CalendarMonthPicker />\n <CalendarYearPicker end={latestYear} start={earliestYear} />\n </CalendarDatePicker>\n <CalendarDatePagination />\n </CalendarDate>\n <CalendarHeader />\n <CalendarBody features={exampleFeatures}>\n {({ feature }) => <CalendarItem feature={feature} key={feature.id} />}\n </CalendarBody>\n </CalendarProvider>\n)\n\nconst ListView = () => {\n const [features, setFeatures] = useState(exampleFeatures)\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n return\n }\n\n const status = statuses.find((status) => status.name === over.id)\n\n if (!status) {\n return\n }\n\n setFeatures(\n features.map((feature) => {\n if (feature.id === active.id) {\n return { ...feature, status }\n }\n\n return feature\n })\n )\n }\n\n return (\n <ListProvider className=\"overflow-auto\" onDragEnd={handleDragEnd}>\n {statuses.map((status) => (\n <ListGroup id={status.name} key={status.name}>\n <ListHeader color={status.color} name={status.name} />\n <ListItems>\n {features\n .filter((feature) => feature.status.name === status.name)\n .map((feature, index) => (\n <ListItem\n id={feature.id}\n index={index}\n key={feature.id}\n name={feature.name}\n parent={feature.status.name}\n >\n <div\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: feature.status.color }}\n />\n <p className=\"m-0 flex-1 text-sm font-medium\">\n {feature.name}\n </p>\n {feature.owner && (\n <Avatar className=\"h-4 w-4 shrink-0\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </ListItem>\n ))}\n </ListItems>\n </ListGroup>\n ))}\n </ListProvider>\n )\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n})\n\nconst shortDateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n})\n\nconst KanbanView = () => {\n const [features, setFeatures] = useState(\n exampleFeatures.map((feature) => ({\n ...feature,\n column: feature.status.id,\n }))\n )\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (!over) {\n return\n }\n\n const status = statuses.find(({ id }) => id === over.id)\n\n if (!status) {\n return\n }\n\n setFeatures(\n features.map((feature) => {\n if (feature.id === active.id) {\n return { ...feature, status }\n }\n\n return feature\n })\n )\n }\n\n return (\n <KanbanProvider\n className=\"p-4\"\n columns={statuses}\n data={features}\n onDragEnd={handleDragEnd}\n >\n {(column) => (\n <KanbanBoard id={column.id} key={column.id}>\n <KanbanHeader>{column.name}</KanbanHeader>\n <KanbanCards id={column.id}>\n {(feature: (typeof features)[number]) => (\n <KanbanCard\n column={column.id}\n id={feature.id}\n key={feature.id}\n name={feature.name}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex flex-col gap-1\">\n <p className=\"m-0 flex-1 text-sm font-medium\">\n {feature.name}\n </p>\n <p className=\"m-0 text-xs text-muted-foreground\">\n {feature.initiative.name}\n </p>\n </div>\n {feature.owner && (\n <Avatar className=\"h-4 w-4 shrink-0\">\n <AvatarImage src={feature.owner.image} />\n <AvatarFallback>\n {feature.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n )}\n </div>\n <p className=\"m-0 text-xs text-muted-foreground\">\n {shortDateFormatter.format(feature.startAt)} -{\" \"}\n {dateFormatter.format(feature.endAt)}\n </p>\n </KanbanCard>\n )}\n </KanbanCards>\n </KanbanBoard>\n )}\n </KanbanProvider>\n )\n}\n\nconst TableView = () => {\n const columns: ColumnDef<(typeof exampleFeatures)[number]>[] = [\n {\n accessorKey: \"name\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Updated Name\" />\n ),\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Avatar className=\"size-6\">\n <AvatarImage src={row.original.owner.image} />\n <AvatarFallback>\n {row.original.owner.name?.slice(0, 2)}\n </AvatarFallback>\n </Avatar>\n\n <div\n className=\"absolute right-0 bottom-0 h-2 w-2 rounded-full ring-2 ring-background\"\n style={{\n backgroundColor: row.original.status.color,\n }}\n />\n </div>\n <div>\n <span className=\"font-medium\">{row.original.name}</span>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <span>{row.original.product.name}</span>\n <ChevronRightIcon size={12} />\n <span>{row.original.group.name}</span>\n </div>\n </div>\n </div>\n ),\n },\n {\n accessorKey: \"startAt\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Updated Start At\" />\n ),\n cell: ({ row }) =>\n new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n }).format(row.original.startAt),\n },\n {\n accessorKey: \"endAt\",\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Updated End At\" />\n ),\n cell: ({ row }) =>\n new Intl.DateTimeFormat(\"en-US\", {\n dateStyle: \"medium\",\n }).format(row.original.endAt),\n },\n {\n id: \"release\",\n accessorFn: (row) => row.release.id,\n header: ({ column }) => (\n <TableColumnHeader column={column} title=\"Updated Release\" />\n ),\n cell: ({ row }) => row.original.release.name,\n },\n ]\n\n return (\n <div className=\"size-full overflow-auto\">\n <TableProvider columns={columns} data={exampleFeatures}>\n <TableHeader>\n {({ headerGroup }) => (\n <TableHeaderGroup headerGroup={headerGroup} key={headerGroup.id}>\n {({ header }) => <TableHead header={header} key={header.id} />}\n </TableHeaderGroup>\n )}\n </TableHeader>\n <TableBody>\n {({ row }) => (\n <TableRow key={row.id} row={row}>\n {({ cell }) => <TableCell cell={cell} key={cell.id} />}\n </TableRow>\n )}\n </TableBody>\n </TableProvider>\n </div>\n )\n}\n\nconst Example = () => {\n const views = [\n {\n id: \"gantt\",\n label: \"Updated Gantt\",\n icon: GanttChartSquareIcon,\n component: GanttView,\n },\n {\n id: \"calendar\",\n label: \"Updated Calendar\",\n icon: CalendarIcon,\n component: CalendarView,\n },\n {\n id: \"list\",\n label: \"Updated List\",\n icon: ListIcon,\n component: ListView,\n },\n {\n id: \"kanban\",\n label: \"Updated Kanban\",\n icon: KanbanSquareIcon,\n component: KanbanView,\n },\n {\n id: \"table\",\n label: \"Updated Table\",\n icon: TableIcon,\n component: TableView,\n },\n ]\n\n return (\n <Tabs className=\"not-prose size-full gap-0 divide-y\" defaultValue=\"gantt\">\n <div className=\"flex items-center justify-between gap-4 p-4\">\n <p className=\"font-medium\">Updated Roadmap</p>\n <TabsList>\n {views.map((view) => (\n <TabsTrigger key={view.id} value={view.id}>\n <view.icon size={16} />\n <span className=\"sr-only\">{view.label}</span>\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n {views.map((view) => (\n <TabsContent className=\"overflow-hidden\" key={view.id} value={view.id}>\n <view.component />\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n\nexport default Example\n",
19
19
  "type": "registry:example"
20
20
  }
21
21
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/sandbox-no-file-explorer.tsx",
12
- "content": "\"use client\"\n\nimport { AppWindowIcon, CodeIcon, TerminalIcon } from \"lucide-react\"\n\nimport {\n SandboxCodeEditor,\n SandboxConsole,\n SandboxLayout,\n SandboxPreview,\n SandboxProvider,\n SandboxTabs,\n SandboxTabsContent,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../../../../packages/sandbox\"\n\nconst Example = () => (\n <SandboxProvider>\n <SandboxLayout>\n <SandboxTabs defaultValue=\"preview\">\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">\n <CodeIcon size={14} />\n Code\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"preview\">\n <AppWindowIcon size={14} />\n Preview\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"console\">\n <TerminalIcon size={14} />\n Console\n </SandboxTabsTrigger>\n </SandboxTabsList>\n <SandboxTabsContent value=\"code\">\n <SandboxCodeEditor showTabs />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"preview\">\n <SandboxPreview\n showOpenInCodeSandbox={false}\n showRefreshButton={false}\n />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"console\">\n <SandboxConsole />\n </SandboxTabsContent>\n </SandboxTabs>\n </SandboxLayout>\n </SandboxProvider>\n)\n\nexport default Example\n",
12
+ "content": "\"use client\"\n\nimport { AppWindowIcon, CodeIcon, TerminalIcon } from \"lucide-react\"\n\nimport {\n SandboxCodeEditor,\n SandboxConsole,\n SandboxLayout,\n SandboxPreview,\n SandboxProvider,\n SandboxTabs,\n SandboxTabsContent,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../../../../packages/sandbox\"\n\nconst Example = () => (\n <SandboxProvider>\n <SandboxLayout>\n <SandboxTabs defaultValue=\"preview\">\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">\n <CodeIcon size={14} />\n Updated Code\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"preview\">\n <AppWindowIcon size={14} />\n Updated Preview\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"console\">\n <TerminalIcon size={14} />\n Updated Console\n </SandboxTabsTrigger>\n </SandboxTabsList>\n <SandboxTabsContent value=\"code\">\n <SandboxCodeEditor showTabs />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"preview\">\n <SandboxPreview\n showOpenInCodeSandbox={false}\n showRefreshButton={false}\n />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"console\">\n <SandboxConsole />\n </SandboxTabsContent>\n </SandboxTabs>\n </SandboxLayout>\n </SandboxProvider>\n)\n\nexport default Example\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/sandbox.tsx",
12
- "content": "\"use client\"\n\nimport { AppWindowIcon, CodeIcon, TerminalIcon } from \"lucide-react\"\n\nimport {\n SandboxCodeEditor,\n SandboxConsole,\n SandboxFileExplorer,\n SandboxLayout,\n SandboxPreview,\n SandboxProvider,\n SandboxTabs,\n SandboxTabsContent,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../../../../packages/sandbox\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"../../../../../packages/shadcn-ui/components/ui/resizable\"\n\nconst Example = () => (\n <SandboxProvider>\n <SandboxLayout>\n <SandboxTabs defaultValue=\"preview\">\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">\n <CodeIcon size={14} />\n Code\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"preview\">\n <AppWindowIcon size={14} />\n Preview\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"console\">\n <TerminalIcon size={14} />\n Console\n </SandboxTabsTrigger>\n </SandboxTabsList>\n <SandboxTabsContent className=\"overflow-hidden\" value=\"code\">\n <ResizablePanelGroup direction=\"horizontal\">\n <ResizablePanel\n className=\"overflow-y-auto\"\n defaultSize={25}\n maxSize={40}\n minSize={20}\n >\n <SandboxFileExplorer />\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel className=\"overflow-y-auto\">\n <SandboxCodeEditor />\n </ResizablePanel>\n </ResizablePanelGroup>\n </SandboxTabsContent>\n <SandboxTabsContent value=\"preview\">\n <SandboxPreview\n showOpenInCodeSandbox={false}\n showRefreshButton={false}\n />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"console\">\n <SandboxConsole />\n </SandboxTabsContent>\n </SandboxTabs>\n </SandboxLayout>\n </SandboxProvider>\n)\n\nexport default Example\n",
12
+ "content": "\"use client\"\n\nimport { AppWindowIcon, CodeIcon, TerminalIcon } from \"lucide-react\"\n\nimport {\n SandboxCodeEditor,\n SandboxConsole,\n SandboxFileExplorer,\n SandboxLayout,\n SandboxPreview,\n SandboxProvider,\n SandboxTabs,\n SandboxTabsContent,\n SandboxTabsList,\n SandboxTabsTrigger,\n} from \"../../../../../packages/sandbox\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"../../../../../packages/shadcn-ui/components/ui/resizable\"\n\nconst Example = () => (\n <SandboxProvider>\n <SandboxLayout>\n <SandboxTabs defaultValue=\"preview\">\n <SandboxTabsList>\n <SandboxTabsTrigger value=\"code\">\n <CodeIcon size={14} />\n Updated Code\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"preview\">\n <AppWindowIcon size={14} />\n Updated Preview\n </SandboxTabsTrigger>\n <SandboxTabsTrigger value=\"console\">\n <TerminalIcon size={14} />\n Updated Console\n </SandboxTabsTrigger>\n </SandboxTabsList>\n <SandboxTabsContent className=\"overflow-hidden\" value=\"code\">\n <ResizablePanelGroup direction=\"horizontal\">\n <ResizablePanel\n className=\"overflow-y-auto\"\n defaultSize={25}\n maxSize={40}\n minSize={20}\n >\n <SandboxFileExplorer />\n </ResizablePanel>\n <ResizableHandle withHandle />\n <ResizablePanel className=\"overflow-y-auto\">\n <SandboxCodeEditor />\n </ResizablePanel>\n </ResizablePanelGroup>\n </SandboxTabsContent>\n <SandboxTabsContent value=\"preview\">\n <SandboxPreview\n showOpenInCodeSandbox={false}\n showRefreshButton={false}\n />\n </SandboxTabsContent>\n <SandboxTabsContent value=\"console\">\n <SandboxConsole />\n </SandboxTabsContent>\n </SandboxTabs>\n </SandboxLayout>\n </SandboxProvider>\n)\n\nexport default Example\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/scroll-area-both.tsx",
11
- "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nexport default function ScrollAreaBoth() {\n return (\n <ScrollArea orientation=\"both\" className=\"h-80 max-w-80 rounded-md border\">\n <p className=\"min-w-100 p-4\">\n Just as suddenly as it had begun, the sensation stopped, leaving Alice\n feeling slightly disoriented. She looked around and realized that the\n room hadn't changed at all - it was she who had grown smaller, shrinking\n down to a fraction of her previous size. Alice felt herself growing\n larger and larger, filling up the entire room until she feared she might\n burst. The sensation was both thrilling and terrifying, as if she were\n expanding beyond the confines of her own body. She wondered if this was\n what it felt like to be a balloon, swelling with air until it could hold\n no more. Alice peered into the mirror, her reflection staring back at\n her with an air of mischief. She wondered what it would be like to step\n through the glass and into the world beyond, where everything seemed to\n be topsy-turvy and nothing was quite as it seemed. It's no use going\n back to yesterday, because I was a different person then, reflected\n Alice.\n </p>\n </ScrollArea>\n )\n}\n",
11
+ "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nexport default function ScrollAreaBoth() {\n return (\n <ScrollArea orientation=\"both\" className=\"h-80 max-w-80 rounded-md border\">\n <p className=\"min-w-100 p-4\">\n Updated Just as suddenly as it had begun, the sensation stopped, leaving\n Alice feeling slightly disoriented. She looked around and realized that\n the room hadn't changed at all - it was she who had grown smaller,\n shrinking down to a fraction of her previous size. Alice felt herself\n growing larger and larger, filling up the entire room until she feared\n she might burst. The sensation was both thrilling and terrifying, as if\n she were expanding beyond the confines of her own body. She wondered if\n this was what it felt like to be a balloon, swelling with air until it\n could hold no more. Alice peered into the mirror, her reflection staring\n back at her with an air of mischief. She wondered what it would be like\n to step through the glass and into the world beyond, where everything\n seemed to be topsy-turvy and nothing was quite as it seemed. It's no use\n going back to yesterday, because I was a different person then,\n reflected Alice.\n </p>\n </ScrollArea>\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/scroll-area-demo.tsx",
11
- "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nconst tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-alpha.${i}`)\n\nexport default function ScrollAreaDemo() {\n return (\n <ScrollArea className=\"h-64 rounded-md border\">\n <div className=\"px-4 py-2\">\n <h4 className=\"mb-2 text-sm font-medium\">Tags</h4>\n <div className=\"flex flex-col gap-1\">\n {tags.map((tag) => (\n <div key={tag} className=\"text-sm\">\n {tag}\n </div>\n ))}\n </div>\n </div>\n </ScrollArea>\n )\n}\n",
11
+ "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nconst tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-alpha.${i}`)\n\nexport default function ScrollAreaDemo() {\n return (\n <ScrollArea className=\"h-64 rounded-md border\">\n <div className=\"px-4 py-2\">\n <h4 className=\"mb-2 text-sm font-medium\">Updated Tags</h4>\n <div className=\"flex flex-col gap-1\">\n {tags.map((tag) => (\n <div key={tag} className=\"text-sm\">\n {tag}\n </div>\n ))}\n </div>\n </div>\n </ScrollArea>\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/scroll-area-horizontal.tsx",
11
- "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nexport default function ScrollAreaHorizontal() {\n return (\n <ScrollArea className=\"max-w-96 rounded-md border\" orientation=\"horizontal\">\n <div className=\"flex w-max gap-4 p-4\">\n {Array.from({ length: 20 }).map((_, i) => (\n <div\n key={i}\n className=\"flex h-20 w-32 shrink-0 items-center justify-center rounded-md bg-muted\"\n >\n <span className=\"text-sm font-medium\">Item {i + 1}</span>\n </div>\n ))}\n </div>\n </ScrollArea>\n )\n}\n",
11
+ "content": "import { ScrollArea } from \"@/registry/default/ui/scroll-area\"\n\nexport default function ScrollAreaHorizontal() {\n return (\n <ScrollArea className=\"max-w-96 rounded-md border\" orientation=\"horizontal\">\n <div className=\"flex w-max gap-4 p-4\">\n {Array.from({ length: 20 }).map((_, i) => (\n <div\n key={i}\n className=\"flex h-20 w-32 shrink-0 items-center justify-center rounded-md bg-muted\"\n >\n <span className=\"text-sm font-medium\">Updated Item {i + 1}</span>\n </div>\n ))}\n </div>\n </ScrollArea>\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/select-demo.tsx",
11
- "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectDemo() {\n return (\n <Select items={items} defaultValue=\"next\">\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectDemo() {\n return (\n <Select items={items} defaultValue=\"next\">\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\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/select-disabled.tsx",
11
- "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectDisabled() {\n return (\n <Select items={items}>\n <SelectTrigger disabled>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectDisabled() {\n return (\n <Select items={items}>\n <SelectTrigger disabled>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "registry/default/examples/select-form.tsx",
14
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n} from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select a framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectForm() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n alert(`Framework: ${formData.get(\"framework\") || \"\"}`)\n }\n\n return (\n <Form onSubmit={onSubmit} className=\"max-w-64\">\n <Field>\n <FieldLabel>Framework</FieldLabel>\n <Select name=\"framework\" items={items} disabled={loading} required>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n <FieldDescription>Pick your favorite.</FieldDescription>\n <FieldError>Please select a value.</FieldError>\n </Field>\n\n <Button type=\"submit\" disabled={loading}>\n Submit\n </Button>\n </Form>\n )\n}\n",
14
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n} from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select a framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectForm() {\n const [loading, setLoading] = React.useState(false)\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n alert(`Framework: ${formData.get(\"framework\") || \"\"}`)\n }\n\n return (\n <Form onSubmit={onSubmit} className=\"max-w-64\">\n <Field>\n <FieldLabel>Updated Framework</FieldLabel>\n <Select name=\"framework\" items={items} disabled={loading} required>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n <FieldDescription>Updated Pick your favorite.</FieldDescription>\n <FieldError>Updated Please select a value.</FieldError>\n </Field>\n\n <Button type=\"submit\" disabled={loading}>\n Updated Submit\n </Button>\n </Form>\n )\n}\n",
15
15
  "type": "registry:example"
16
16
  }
17
17
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/select-lg.tsx",
11
- "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectLg() {\n return (\n <Select items={items}>\n <SelectTrigger size=\"lg\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectLg() {\n return (\n <Select items={items}>\n <SelectTrigger size=\"lg\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "select-native",
4
+ "type": "registry:ui",
5
+ "files": [
6
+ {
7
+ "path": "registry/default/ui/select-native.tsx",
8
+ "content": "import * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"@/registry/default/lib/utils\"\n\nconst SelectNative = ({\n className,\n children,\n ...props\n}: React.ComponentProps<\"select\">) => {\n return (\n <div className=\"relative flex\">\n <select\n data-slot=\"select-native\"\n className={cn(\n \"peer inline-flex w-full cursor-pointer appearance-none items-center rounded-md border border-input text-sm text-foreground shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 has-[option[disabled]:checked]:text-muted-foreground aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n props.multiple\n ? \"py-1 *:px-3 *:py-1 [&_option:checked]:bg-accent\"\n : \"h-9 ps-3 pe-8\",\n className\n )}\n {...props}\n >\n {children}\n </select>\n {!props.multiple && (\n <span className=\"pointer-events-none absolute inset-y-0 end-0 flex h-full w-9 items-center justify-center text-muted-foreground/80 peer-disabled:opacity-50 peer-aria-invalid:text-destructive/80\">\n <ChevronDownIcon size={16} aria-hidden=\"true\" />\n </span>\n )}\n </div>\n )\n}\n\nexport { SelectNative }\n",
9
+ "type": "registry:ui"
10
+ }
11
+ ]
12
+ }
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/select-sm.tsx",
11
- "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectSm() {\n return (\n <Select items={items}>\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectSm() {\n return (\n <Select items={items}>\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\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/select-with-groups.tsx",
11
- "content": "import {\n Select,\n SelectGroup,\n SelectGroupLabel,\n SelectItem,\n SelectPopup,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst placeholder = [{ label: \"Select framework\", value: null }]\n\nconst frontend = [\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nconst backend = [\n { label: \"Express\", value: \"express\" },\n { label: \"NestJS\", value: \"nestjs\" },\n { label: \"Fastify\", value: \"fastify\" },\n { label: \"Django\", value: \"django\" },\n { label: \"Flask\", value: \"flask\" },\n { label: \"Rails\", value: \"rails\" },\n]\n\nexport default function SelectWithGroups() {\n return (\n <Select items={[...placeholder, ...frontend, ...backend]}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n <SelectGroup>\n <SelectGroupLabel>Frontend</SelectGroupLabel>\n {frontend.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectGroup>\n <SelectSeparator />\n <SelectGroup>\n <SelectGroupLabel>Backend</SelectGroupLabel>\n {backend.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectGroup,\n SelectGroupLabel,\n SelectItem,\n SelectPopup,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst placeholder = [{ label: \"Updated Select framework\", value: null }]\n\nconst frontend = [\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nconst backend = [\n { label: \"Updated Express\", value: \"express\" },\n { label: \"Updated NestJS\", value: \"nestjs\" },\n { label: \"Updated Fastify\", value: \"fastify\" },\n { label: \"Updated Django\", value: \"django\" },\n { label: \"Updated Flask\", value: \"flask\" },\n { label: \"Updated Rails\", value: \"rails\" },\n]\n\nexport default function SelectWithGroups() {\n return (\n <Select items={[...placeholder, ...frontend, ...backend]}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup>\n <SelectGroup>\n <SelectGroupLabel>Updated Frontend</SelectGroupLabel>\n {frontend.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectGroup>\n <SelectSeparator />\n <SelectGroup>\n <SelectGroupLabel>Updated Backend</SelectGroupLabel>\n {backend.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectPopup>\n </Select>\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/select-without-alignment.tsx",
11
- "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Select framework\", value: null },\n { label: \"Next.js\", value: \"next\" },\n { label: \"Vite\", value: \"vite\" },\n { label: \"Astro\", value: \"astro\" },\n]\n\nexport default function SelectWithoutAlignment() {\n return (\n <Select items={items}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup alignItemWithTrigger={false}>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
11
+ "content": "import {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/default/ui/select\"\n\nconst items = [\n { label: \"Updated Select framework\", value: null },\n { label: \"Updated Next.js\", value: \"next\" },\n { label: \"Updated Vite\", value: \"vite\" },\n { label: \"Updated Astro\", value: \"astro\" },\n]\n\nexport default function SelectWithoutAlignment() {\n return (\n <Select items={items}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectPopup alignItemWithTrigger={false}>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": "registry/default/ui/select.tsx",
10
- "content": "\"use client\"\n\nimport { Select as SelectPrimitive } from \"@base-ui-components/react/select\"\nimport {\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ChevronUpIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\" | \"lg\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"relative inline-flex w-full min-w-36 items-center justify-between gap-2 rounded-lg border border-input bg-background bg-clip-padding px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] text-base/5 shadow-xs ring-ring/24 transition-shadow outline-none select-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:border-ring focus-visible:ring-[3px] in-data-[slot=field]:not-data-filled:text-muted-foreground aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:text-sm dark:bg-input/32 dark:not-in-data-[slot=group]:bg-clip-border dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/8%)] dark:aria-invalid:ring-destructive/24 pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&:is([data-disabled],:focus-visible,[aria-invalid],[data-pressed])]:shadow-none\",\n size === \"sm\" &&\n \"gap-1.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)]\",\n size === \"lg\" && \"py-[calc(--spacing(2)-1px)]\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon data-slot=\"select-icon\">\n <ChevronsUpDownIcon className=\"-me-1 size-4 opacity-72\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"truncate\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectPopup({\n className,\n children,\n sideOffset = 4,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props & {\n sideOffset?: SelectPrimitive.Positioner.Props[\"sideOffset\"]\n alignItemWithTrigger?: SelectPrimitive.Positioner.Props[\"alignItemWithTrigger\"]\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n data-slot=\"select-positioner\"\n className=\"z-50 select-none\"\n sideOffset={sideOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n >\n <SelectPrimitive.Popup\n data-slot=\"select-popup\"\n className=\"origin-(--transform-origin) transition-[scale,opacity] has-data-starting-style:scale-98 has-data-starting-style:opacity-0 has-data-[side=none]:scale-100 has-data-[side=none]:transition-none\"\n {...props}\n >\n <SelectPrimitive.ScrollUpArrow\n className=\"top-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:top-px before:h-[200%] before:rounded-t-[calc(var(--radius-lg)-1px)] before:bg-gradient-to-b before:from-popover before:from-50%\"\n data-slot=\"select-scroll-up-arrow\"\n >\n <ChevronUpIcon className=\"relative size-4\" />\n </SelectPrimitive.ScrollUpArrow>\n <span className=\"relative block h-full rounded-lg border bg-popover bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-lg dark:not-in-data-[slot=group]:bg-clip-border\">\n <SelectPrimitive.List\n data-slot=\"select-list\"\n className={cn(\n \"max-h-(--available-height) min-w-(--anchor-width) overflow-y-auto p-1\",\n className\n )}\n >\n {children}\n </SelectPrimitive.List>\n </span>\n <SelectPrimitive.ScrollDownArrow\n className=\"bottom-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:bottom-px before:h-[200%] before:rounded-b-[calc(var(--radius-lg)-1px)] before:bg-gradient-to-t before:from-popover before:from-50%\"\n data-slot=\"select-scroll-down-arrow\"\n >\n <ChevronDownIcon className=\"relative size-4\" />\n </SelectPrimitive.ScrollDownArrow>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"grid cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base outline-none in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] data-disabled:pointer-events-none data-disabled:opacity-64 data-highlighted:bg-accent data-highlighted:text-accent-foreground sm:text-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemIndicator className=\"col-start-1\">\n <svg\n xmlns=\"http://www.w3.org/1500/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n <SelectPrimitive.ItemText className=\"col-start-2\">\n {children}\n </SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"select-separator\"\n {...props}\n />\n )\n}\n\nfunction SelectGroup(props: SelectPrimitive.Group.Props) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectGroupLabel(props: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\"\n data-slot=\"select-group-label\"\n {...props}\n />\n )\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectPopup,\n SelectPopup as SelectContent,\n SelectItem,\n SelectSeparator,\n SelectGroup,\n SelectGroupLabel,\n}\n",
10
+ "content": "\"use client\"\n\nimport { Select as SelectPrimitive } from \"@base-ui-components/react/select\"\nimport {\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ChevronUpIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: SelectPrimitive.Trigger.Props & {\n size?: \"sm\" | \"default\" | \"lg\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n className={cn(\n \"relative inline-flex w-full min-w-36 items-center justify-between gap-2 rounded-lg border border-input bg-background bg-clip-padding px-[calc(--spacing(3)-1px)] py-[calc(--spacing(1.5)-1px)] text-base/5 shadow-xs ring-ring/24 transition-shadow outline-none select-none before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] focus-visible:border-ring focus-visible:ring-[3px] in-data-[slot=field]:not-data-filled:text-muted-foreground aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:text-sm dark:bg-input/32 dark:not-in-data-[slot=group]:bg-clip-border dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/8%)] dark:aria-invalid:ring-destructive/24 pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&:is([data-disabled],:focus-visible,[aria-invalid],[data-pressed])]:shadow-none\",\n size === \"sm\" &&\n \"gap-1.5 px-[calc(--spacing(2.5)-1px)] py-[calc(--spacing(1)-1px)]\",\n size === \"lg\" && \"py-[calc(--spacing(2)-1px)]\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon data-slot=\"select-icon\">\n <ChevronsUpDownIcon className=\"-me-1 size-4 opacity-72\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectValue({\n className,\n placeholder,\n children,\n ...props\n}: SelectPrimitive.Value.Props & { placeholder?: string }) {\n const resolvedChildren =\n children ?? ((value: unknown) => value ?? placeholder)\n\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"truncate\", className)}\n {...props}\n >\n {resolvedChildren as any}\n </SelectPrimitive.Value>\n )\n}\n\nfunction SelectPopup({\n className,\n children,\n sideOffset = 4,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props & {\n sideOffset?: SelectPrimitive.Positioner.Props[\"sideOffset\"]\n alignItemWithTrigger?: SelectPrimitive.Positioner.Props[\"alignItemWithTrigger\"]\n}) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n data-slot=\"select-positioner\"\n className=\"z-50 select-none\"\n sideOffset={sideOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n >\n <SelectPrimitive.Popup\n data-slot=\"select-popup\"\n className=\"origin-(--transform-origin) transition-[scale,opacity] has-data-starting-style:scale-98 has-data-starting-style:opacity-0 has-data-[side=none]:scale-100 has-data-[side=none]:transition-none\"\n {...props}\n >\n <SelectPrimitive.ScrollUpArrow\n className=\"top-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:top-px before:h-[200%] before:rounded-t-[calc(var(--radius-lg)-1px)] before:bg-gradient-to-b before:from-popover before:from-50%\"\n data-slot=\"select-scroll-up-arrow\"\n >\n <ChevronUpIcon className=\"relative size-4\" />\n </SelectPrimitive.ScrollUpArrow>\n <span className=\"relative block h-full rounded-lg border bg-popover bg-clip-padding before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] before:shadow-lg dark:not-in-data-[slot=group]:bg-clip-border\">\n <SelectPrimitive.List\n data-slot=\"select-list\"\n className={cn(\n \"max-h-(--available-height) min-w-(--anchor-width) overflow-y-auto p-1\",\n className\n )}\n >\n {children}\n </SelectPrimitive.List>\n </span>\n <SelectPrimitive.ScrollDownArrow\n className=\"bottom-0 z-50 flex h-6 w-full cursor-default items-center justify-center before:pointer-events-none before:absolute before:inset-x-px before:bottom-px before:h-[200%] before:rounded-b-[calc(var(--radius-lg)-1px)] before:bg-gradient-to-t before:from-popover before:from-50%\"\n data-slot=\"select-scroll-down-arrow\"\n >\n <ChevronDownIcon className=\"relative size-4\" />\n </SelectPrimitive.ScrollDownArrow>\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"grid cursor-default grid-cols-[1rem_1fr] items-center gap-2 rounded-sm py-1 ps-2 pe-4 text-base outline-none in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] data-disabled:pointer-events-none data-disabled:opacity-64 data-highlighted:bg-accent data-highlighted:text-accent-foreground sm:text-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <SelectPrimitive.ItemIndicator className=\"col-start-1\">\n <svg\n xmlns=\"http://www.w3.org/1500/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n <SelectPrimitive.ItemText className=\"col-start-2\">\n {children}\n </SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n className={cn(\"mx-2 my-1 h-px bg-border\", className)}\n data-slot=\"select-separator\"\n {...props}\n />\n )\n}\n\nfunction SelectGroup(props: SelectPrimitive.Group.Props) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectGroupLabel(props: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n className=\"px-2 py-1.5 text-xs font-medium text-muted-foreground\"\n data-slot=\"select-group-label\"\n {...props}\n />\n )\n}\n\nexport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectPopup,\n SelectPopup as SelectContent,\n SelectItem,\n SelectSeparator,\n SelectGroup,\n SelectGroupLabel,\n}\n",
11
11
  "type": "registry:ui"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/separator-demo.tsx",
11
- "content": "import { Separator } from \"@/registry/default/ui/separator\"\n\nexport default function SeparatorDemo() {\n return (\n <div className=\"max-w-72\">\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-medium\">loveui</h4>\n <p className=\"text-sm text-muted-foreground\">\n Unstyled, accessible primitives for fast product UI and design\n systems.\n </p>\n </div>\n <Separator className=\"my-4\" />\n <div className=\"flex items-center gap-4 text-sm\">\n <div>Blog</div>\n <Separator orientation=\"vertical\" />\n <div>Docs</div>\n <Separator orientation=\"vertical\" />\n <div>Source</div>\n <Separator orientation=\"vertical\" />\n <div>Releases</div>\n </div>\n </div>\n )\n}\n",
11
+ "content": "import { Separator } from \"@/registry/default/ui/separator\"\n\nexport default function SeparatorDemo() {\n return (\n <div className=\"max-w-72\">\n <div className=\"space-y-1\">\n <h4 className=\"text-sm font-medium\">loveui</h4>\n <p className=\"text-sm text-muted-foreground\">\n Updated Unstyled, accessible primitives for fast product UI and design\n systems.\n </p>\n </div>\n <Separator className=\"my-4\" />\n <div className=\"flex items-center gap-4 text-sm\">\n <div>Updated Blog</div>\n <Separator orientation=\"vertical\" />\n <div>Updated Docs</div>\n <Separator orientation=\"vertical\" />\n <div>Updated Source</div>\n <Separator orientation=\"vertical\" />\n <div>Updated Releases</div>\n </div>\n </div>\n )\n}\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "registry/default/examples/sheet-demo.tsx",
14
- "content": "\"use client\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Field, FieldControl, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Sheet,\n SheetClose,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetPopup,\n SheetTitle,\n SheetTrigger,\n} from \"@/registry/default/ui/sheet\"\n\nexport default function DialogDemo() {\n return (\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Open Sheet\n </Button>\n )}\n />\n <SheetPopup>\n <Form>\n <SheetHeader>\n <SheetTitle>Edit profile</SheetTitle>\n <SheetDescription>\n Make changes to your profile here. Click save when you&apos;re\n done.\n </SheetDescription>\n </SheetHeader>\n <div className=\"flex flex-col gap-4 px-4\">\n <Field>\n <FieldLabel>Name</FieldLabel>\n <FieldControl type=\"text\" defaultValue=\"Connor Love\" />\n </Field>\n <Field>\n <FieldLabel>Username</FieldLabel>\n <FieldControl type=\"text\" defaultValue=\"@loveconnor\" />\n </Field>\n </div>\n <SheetFooter>\n <SheetClose\n render={(props) => (\n <Button {...props} variant=\"ghost\">\n Cancel\n </Button>\n )}\n />\n <Button type=\"submit\">Save</Button>\n </SheetFooter>\n </Form>\n </SheetPopup>\n </Sheet>\n )\n}\n",
14
+ "content": "\"use client\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Field, FieldControl, FieldLabel } from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport {\n Sheet,\n SheetClose,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetPopup,\n SheetTitle,\n SheetTrigger,\n} from \"@/registry/default/ui/sheet\"\n\nexport default function DialogDemo() {\n return (\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Updated Open Sheet\n </Button>\n )}\n />\n <SheetPopup>\n <Form>\n <SheetHeader>\n <SheetTitle>Updated Edit profile</SheetTitle>\n <SheetDescription>\n Updated Make changes to your profile here. Click save when\n you&apos;re done.\n </SheetDescription>\n </SheetHeader>\n <div className=\"flex flex-col gap-4 px-4\">\n <Field>\n <FieldLabel>Updated Name</FieldLabel>\n <FieldControl type=\"text\" defaultValue=\"Connor Love\" />\n </Field>\n <Field>\n <FieldLabel>Updated Username</FieldLabel>\n <FieldControl type=\"text\" defaultValue=\"@loveconnor\" />\n </Field>\n </div>\n <SheetFooter>\n <SheetClose\n render={(props) => (\n <Button {...props} variant=\"ghost\">\n Updated Cancel\n </Button>\n )}\n />\n <Button type=\"submit\">Updated Save</Button>\n </SheetFooter>\n </Form>\n </SheetPopup>\n </Sheet>\n )\n}\n",
15
15
  "type": "registry:example"
16
16
  }
17
17
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/sheet-position.tsx",
12
- "content": "\"use client\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Sheet,\n SheetDescription,\n SheetHeader,\n SheetPopup,\n SheetTitle,\n SheetTrigger,\n} from \"@/registry/default/ui/sheet\"\n\nexport default function DialogDemo() {\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Open Right\n </Button>\n )}\n />\n <SheetPopup showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Right</SheetTitle>\n <SheetDescription>Right side of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Open Left\n </Button>\n )}\n />\n <SheetPopup side=\"left\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Left</SheetTitle>\n <SheetDescription>Left side of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Open Top\n </Button>\n )}\n />\n <SheetPopup side=\"top\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Top</SheetTitle>\n <SheetDescription>Top of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Open Bottom\n </Button>\n )}\n />\n <SheetPopup side=\"bottom\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Bottom</SheetTitle>\n <SheetDescription>Bottom of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n </div>\n )\n}\n",
12
+ "content": "\"use client\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Sheet,\n SheetDescription,\n SheetHeader,\n SheetPopup,\n SheetTitle,\n SheetTrigger,\n} from \"@/registry/default/ui/sheet\"\n\nexport default function DialogDemo() {\n return (\n <div className=\"flex flex-wrap gap-2\">\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Updated Open Right\n </Button>\n )}\n />\n <SheetPopup showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Updated Right</SheetTitle>\n <SheetDescription>\n Updated Right side of the screen.\n </SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Updated Open Left\n </Button>\n )}\n />\n <SheetPopup side=\"left\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Updated Left</SheetTitle>\n <SheetDescription>\n Updated Left side of the screen.\n </SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Updated Open Top\n </Button>\n )}\n />\n <SheetPopup side=\"top\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Updated Top</SheetTitle>\n <SheetDescription>Updated Top of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n <Sheet>\n <SheetTrigger\n render={(props) => (\n <Button {...props} variant=\"outline\">\n Updated Open Bottom\n </Button>\n )}\n />\n <SheetPopup side=\"bottom\" showCloseButton={false}>\n <SheetHeader>\n <SheetTitle>Updated Bottom</SheetTitle>\n <SheetDescription>Updated Bottom of the screen.</SheetDescription>\n </SheetHeader>\n </SheetPopup>\n </Sheet>\n </div>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "sidebar-nav",
4
+ "description": "Sidebar navigation layout",
5
+ "registryDependencies": [
6
+ "@loveui/button",
7
+ "@loveui/separator"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/examples/sidebar-nav.tsx",
12
+ "content": "import { Button } from \"@/registry/default/ui/button\"\nimport { Separator } from \"@/registry/default/ui/separator\"\n\nconst navItems = [\n { label: \"Overview\", active: true },\n { label: \"Analytics\", active: false },\n { label: \"Customers\", active: false },\n { label: \"Billing\", active: false },\n { label: \"Settings\", active: false },\n]\n\nexport default function SidebarNav() {\n return (\n <aside className=\"w-full max-w-64 rounded-lg border bg-card p-2\">\n <nav className=\"flex flex-col gap-1\">\n {navItems.map((item) => (\n <Button\n key={item.label}\n className=\"justify-start\"\n variant={item.active ? \"secondary\" : \"ghost\"}\n >\n {item.label}\n </Button>\n ))}\n </nav>\n <Separator className=\"my-2\" />\n <Button className=\"w-full\" variant=\"outline\">\n Invite team\n </Button>\n </aside>\n )\n}\n",
13
+ "type": "registry:example"
14
+ }
15
+ ],
16
+ "categories": [
17
+ "sidebar",
18
+ "navigation",
19
+ "dashboard"
20
+ ],
21
+ "type": "registry:example"
22
+ }
@@ -10,7 +10,7 @@
10
10
  "files": [
11
11
  {
12
12
  "path": "registry/default/examples/skeleton-demo.tsx",
13
- "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { UserRoundPlusIcon, UsersRoundIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Skeleton } from \"@/registry/default/ui/skeleton\"\n\nconst users = [\n {\n name: \"Sarah Johnson\",\n role: \"Design Engineer\",\n followers: \"15k\",\n image:\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=80&h=80&dpr=2&q=80\",\n fallback: \"SJ\",\n delay: 3000,\n },\n {\n name: \"Mark Bennett Andersson\",\n role: \"Product Designer\",\n followers: \"8k\",\n image:\n \"https://images.unsplash.com/photo-1543610892-0b1f7e6d8ac1?w=80&h=80&dpr=2&q=80\",\n fallback: \"MA\",\n delay: 4000,\n },\n {\n name: \"Alex Rivera\",\n role: \"UI/UX Designer\",\n followers: \"12k\",\n image:\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=80&h=80&dpr=2&q=80\",\n fallback: \"AR\",\n delay: 3400,\n },\n]\n\nfunction UserCard({ delay, user }: { delay: number; user: (typeof users)[0] }) {\n const [isLoaded, setIsLoaded] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoaded(true)\n }, delay)\n\n return () => clearTimeout(timer)\n }, [delay])\n\n if (!isLoaded) {\n return <UserCardSkeleton />\n }\n\n return (\n <>\n <Avatar className=\"size-10\">\n <AvatarImage src={user.image} alt={user.name} />\n <AvatarFallback>{user.fallback}</AvatarFallback>\n </Avatar>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <h4 className=\"line-clamp-1 text-sm font-medium\">{user.name}</h4>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"truncate\">{user.role}</span>\n <div className=\"flex min-w-0 items-center gap-1\">\n <UsersRoundIcon className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {user.followers}\n <span className=\"max-sm:hidden\"> followers</span>\n </span>\n </div>\n </div>\n </div>\n <Button size=\"xs\">\n <UserRoundPlusIcon />\n Follow\n </Button>\n </>\n )\n}\n\nfunction UserCardSkeleton() {\n return (\n <>\n <Skeleton className=\"size-10 rounded-full\" />\n <div className=\"flex flex-1 flex-col\">\n <Skeleton className=\"my-0.5 h-4 max-w-54\" />\n <div className=\"flex max-w-54 items-center gap-1\">\n <Skeleton className=\"my-0.5 h-4 w-1/2\" />\n <Skeleton className=\"my-0.5 h-4 w-1/2\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-17\" />\n </>\n )\n}\n\nexport default function SkeletonDemo() {\n return (\n <div className=\"flex w-full max-w-92 flex-col gap-6\">\n {users.map((user) => (\n <div key={user.fallback} className=\"flex items-center gap-4\">\n <UserCard delay={user.delay} user={user} />\n </div>\n ))}\n </div>\n )\n}\n",
13
+ "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { UserRoundPlusIcon, UsersRoundIcon } from \"lucide-react\"\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n} from \"@/registry/default/ui/avatar\"\nimport { Button } from \"@/registry/default/ui/button\"\nimport { Skeleton } from \"@/registry/default/ui/skeleton\"\n\nconst users = [\n {\n name: \"Updated Sarah Johnson\",\n role: \"Design Engineer\",\n followers: \"15k\",\n image:\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=80&h=80&dpr=2&q=80\",\n fallback: \"SJ\",\n delay: 3000,\n },\n {\n name: \"Updated Mark Bennett Andersson\",\n role: \"Product Designer\",\n followers: \"8k\",\n image:\n \"https://images.unsplash.com/photo-1543610892-0b1f7e6d8ac1?w=80&h=80&dpr=2&q=80\",\n fallback: \"MA\",\n delay: 4000,\n },\n {\n name: \"Updated Alex Rivera\",\n role: \"UI/UX Designer\",\n followers: \"12k\",\n image:\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=80&h=80&dpr=2&q=80\",\n fallback: \"AR\",\n delay: 3400,\n },\n]\n\nfunction UserCard({ delay, user }: { delay: number; user: (typeof users)[0] }) {\n const [isLoaded, setIsLoaded] = useState(false)\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsLoaded(true)\n }, delay)\n\n return () => clearTimeout(timer)\n }, [delay])\n\n if (!isLoaded) {\n return <UserCardSkeleton />\n }\n\n return (\n <>\n <Avatar className=\"size-10\">\n <AvatarImage src={user.image} alt={user.name} />\n <AvatarFallback>{user.fallback}</AvatarFallback>\n </Avatar>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <h4 className=\"line-clamp-1 text-sm font-medium\">{user.name}</h4>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"truncate\">{user.role}</span>\n <div className=\"flex min-w-0 items-center gap-1\">\n <UsersRoundIcon className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {user.followers}\n <span className=\"max-sm:hidden\"> followers</span>\n </span>\n </div>\n </div>\n </div>\n <Button size=\"xs\">\n <UserRoundPlusIcon />\n Updated Follow\n </Button>\n </>\n )\n}\n\nfunction UserCardSkeleton() {\n return (\n <>\n <Skeleton className=\"size-10 rounded-full\" />\n <div className=\"flex flex-1 flex-col\">\n <Skeleton className=\"my-0.5 h-4 max-w-54\" />\n <div className=\"flex max-w-54 items-center gap-1\">\n <Skeleton className=\"my-0.5 h-4 w-1/2\" />\n <Skeleton className=\"my-0.5 h-4 w-1/2\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-17\" />\n </>\n )\n}\n\nexport default function SkeletonDemo() {\n return (\n <div className=\"flex w-full max-w-92 flex-col gap-6\">\n {users.map((user) => (\n <div key={user.fallback} className=\"flex items-center gap-4\">\n <UserCard delay={user.delay} user={user} />\n </div>\n ))}\n </div>\n )\n}\n",
14
14
  "type": "registry:example"
15
15
  }
16
16
  ],
@@ -4,7 +4,7 @@
4
4
  "files": [
5
5
  {
6
6
  "path": "registry/default/ui/skeleton.tsx",
7
- "content": "import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\n \"animate-skeleton rounded-sm [--skeleton-highlight:--alpha(var(--color-white)/64%)] [background:linear-gradient(120deg,transparent_40%,var(--skeleton-highlight),transparent_60%)_var(--color-muted)_0_0_/_200%_100%_fixed] dark:[--skeleton-highlight:--alpha(var(--color-white)/4%)]\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n",
7
+ "content": "import type { ComponentPropsWithoutRef } from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Skeleton({ className, ...props }: ComponentPropsWithoutRef<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\n \"animate-skeleton rounded-sm [--skeleton-highlight:--alpha(var(--color-white)/64%)] [background:linear-gradient(120deg,transparent_40%,var(--skeleton-highlight),transparent_60%)_var(--color-muted)_0_0_/_200%_100%_fixed] dark:[--skeleton-highlight:--alpha(var(--color-white)/4%)]\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n",
8
8
  "type": "registry:ui"
9
9
  }
10
10
  ],
@@ -11,7 +11,7 @@
11
11
  "files": [
12
12
  {
13
13
  "path": "registry/default/examples/slider-form.tsx",
14
- "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport { Slider, SliderValue } from \"@/registry/default/ui/slider\"\n\nexport default function SliderForm() {\n const [loading, setLoading] = React.useState<boolean>(false)\n const [value, setValue] = React.useState<number | readonly number[]>([25, 75])\n\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const volumes = formData.getAll(\"volume\")\n alert(`Volume: ${volumes.join(\", \")}`)\n }\n\n return (\n <Form onSubmit={onSubmit}>\n <Field name=\"volume\" className=\"items-stretch gap-3\">\n <Slider value={value} onValueChange={setValue} disabled={loading}>\n <div className=\"mb-2 flex items-center justify-between gap-1\">\n <FieldLabel>Volume</FieldLabel>\n <SliderValue />\n </div>\n </Slider>\n <FieldDescription>Choose a value between 0 and 100</FieldDescription>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Submit\n </Button>\n </Form>\n )\n}\n",
14
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport { Button } from \"@/registry/default/ui/button\"\nimport {\n Field,\n FieldDescription,\n FieldLabel,\n} from \"@/registry/default/ui/field\"\nimport { Form } from \"@/registry/default/ui/form\"\nimport { Slider, SliderValue } from \"@/registry/default/ui/slider\"\n\nexport default function SliderForm() {\n const [loading, setLoading] = React.useState<boolean>(false)\n const [value, setValue] = React.useState<number | readonly number[]>([25, 75])\n\n const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n setLoading(true)\n await new Promise((r) => setTimeout(r, 800))\n setLoading(false)\n const volumes = formData.getAll(\"volume\")\n alert(`Volume: ${volumes.join(\", \")}`)\n }\n\n return (\n <Form onSubmit={onSubmit}>\n <Field name=\"volume\" className=\"items-stretch gap-3\">\n <Slider value={value} onValueChange={setValue} disabled={loading}>\n <div className=\"mb-2 flex items-center justify-between gap-1\">\n <FieldLabel>Updated Volume</FieldLabel>\n <SliderValue />\n </div>\n </Slider>\n <FieldDescription>\n Updated Choose a value between 0 and 100\n </FieldDescription>\n </Field>\n <Button type=\"submit\" disabled={loading}>\n Updated Submit\n </Button>\n </Form>\n )\n}\n",
15
15
  "type": "registry:example"
16
16
  }
17
17
  ],
@@ -9,7 +9,7 @@
9
9
  "files": [
10
10
  {
11
11
  "path": "registry/default/examples/slider-with-label-value.tsx",
12
- "content": "import { Label } from \"@/registry/default/ui/label\"\nimport { Slider, SliderValue } from \"@/registry/default/ui/slider\"\n\nexport default function SliderWithLabelValue() {\n return (\n <Slider defaultValue={50}>\n <div className=\"mb-2 flex items-center justify-between gap-1\">\n <Label className=\"text-sm font-medium\">Opacity</Label>\n <SliderValue />\n </div>\n </Slider>\n )\n}\n",
12
+ "content": "import { Label } from \"@/registry/default/ui/label\"\nimport { Slider, SliderValue } from \"@/registry/default/ui/slider\"\n\nexport default function SliderWithLabelValue() {\n return (\n <Slider defaultValue={50}>\n <div className=\"mb-2 flex items-center justify-between gap-1\">\n <Label className=\"text-sm font-medium\">Updated Opacity</Label>\n <SliderValue />\n </div>\n </Slider>\n )\n}\n",
13
13
  "type": "registry:example"
14
14
  }
15
15
  ],
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "sonner",
4
+ "type": "registry:ui",
5
+ "dependencies": [
6
+ "sonner",
7
+ "next-themes"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/ui/sonner.tsx",
12
+ "content": "\"use client\"\n\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, ToasterProps } from \"sonner\"\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n description: \"text-muted-foreground!\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n",
13
+ "type": "registry:ui"
14
+ }
15
+ ]
16
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "stats-card",
4
+ "description": "KPI card for dashboard stats",
5
+ "registryDependencies": [
6
+ "@loveui/badge",
7
+ "@loveui/card"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/examples/stats-card.tsx",
12
+ "content": "import { Badge } from \"@/registry/default/ui/badge\"\nimport {\n Card,\n CardDescription,\n CardHeader,\n CardPanel,\n CardTitle,\n} from \"@/registry/default/ui/card\"\n\nexport default function StatsCard() {\n return (\n <Card className=\"w-full max-w-sm\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-4\">\n <div className=\"space-y-1\">\n <CardDescription>Monthly recurring revenue</CardDescription>\n <CardTitle className=\"text-2xl\">$48,230</CardTitle>\n </div>\n <Badge variant=\"outline\">+12.4%</Badge>\n </CardHeader>\n <CardPanel>\n <p className=\"text-sm text-muted-foreground\">\n Growth compared to last month across all active subscriptions.\n </p>\n </CardPanel>\n </Card>\n )\n}\n",
13
+ "type": "registry:example"
14
+ }
15
+ ],
16
+ "categories": [
17
+ "dashboard",
18
+ "card",
19
+ "stats"
20
+ ],
21
+ "type": "registry:example"
22
+ }
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "registry/default/examples/status-custom.tsx",
11
- "content": "\"use client\"\n\nimport {\n Status,\n StatusIndicator,\n StatusLabel,\n} from \"../../../../../packages/status\"\n\nconst Example = () => (\n <Status\n className=\"gap-4 rounded-full px-6 py-2 text-sm\"\n status=\"online\"\n variant=\"outline\"\n >\n <StatusIndicator />\n <StatusLabel className=\"font-mono\">Fully operational</StatusLabel>\n </Status>\n)\n\nexport default Example\n",
11
+ "content": "\"use client\"\n\nimport {\n Status,\n StatusIndicator,\n StatusLabel,\n} from \"../../../../../packages/status\"\n\nconst Example = () => (\n <Status\n className=\"gap-4 rounded-full px-6 py-2 text-sm\"\n status=\"online\"\n variant=\"outline\"\n >\n <StatusIndicator />\n <StatusLabel className=\"font-mono\">Updated Fully operational</StatusLabel>\n </Status>\n)\n\nexport default Example\n",
12
12
  "type": "registry:example"
13
13
  }
14
14
  ],