love-ui 1.2.11 → 1.2.13

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 (1114) hide show
  1. package/dist/index.js +4 -4
  2. package/dist/mcp-server.js +1 -1
  3. package/package.json +4 -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 +20 -0
  11. package/public/r/accordion-demo.json +19 -0
  12. package/public/r/accordion-multiple.json +19 -0
  13. package/public/r/accordion-single.json +19 -0
  14. package/public/r/accordion.json +15 -0
  15. package/public/r/alert-demo.json +19 -0
  16. package/public/r/alert-dialog-demo.json +20 -0
  17. package/public/r/alert-dialog.json +15 -0
  18. package/public/r/alert-error.json +20 -0
  19. package/public/r/alert-info.json +20 -0
  20. package/public/r/alert-success.json +20 -0
  21. package/public/r/alert-warning.json +20 -0
  22. package/public/r/alert-with-icon-action.json +20 -0
  23. package/public/r/alert-with-icon.json +19 -0
  24. package/public/r/alert.json +32 -0
  25. package/public/r/announcement-tagless.json +21 -0
  26. package/public/r/announcement-themes.json +21 -0
  27. package/public/r/announcement.json +20 -0
  28. package/public/r/autocomplete-async.json +21 -0
  29. package/public/r/autocomplete-autohighlight.json +20 -0
  30. package/public/r/autocomplete-demo.json +20 -0
  31. package/public/r/autocomplete-disabled.json +21 -0
  32. package/public/r/autocomplete-form.json +23 -0
  33. package/public/r/autocomplete-grouped.json +20 -0
  34. package/public/r/autocomplete-inline.json +20 -0
  35. package/public/r/autocomplete-lg.json +20 -0
  36. package/public/r/autocomplete-limit.json +20 -0
  37. package/public/r/autocomplete-sm.json +20 -0
  38. package/public/r/autocomplete-with-clear.json +20 -0
  39. package/public/r/autocomplete-with-label.json +21 -0
  40. package/public/r/autocomplete-with-trigger-clear.json +20 -0
  41. package/public/r/autocomplete.json +19 -0
  42. package/public/r/avatar-demo.json +19 -0
  43. package/public/r/avatar-fallback.json +19 -0
  44. package/public/r/avatar-group.json +20 -0
  45. package/public/r/avatar-radius.json +19 -0
  46. package/public/r/avatar-size.json +19 -0
  47. package/public/r/avatar-stack-hover.json +22 -0
  48. package/public/r/avatar-stack.json +21 -0
  49. package/public/r/avatar.json +15 -0
  50. package/public/r/badge-demo.json +19 -0
  51. package/public/r/badge-destructive.json +21 -0
  52. package/public/r/badge-error.json +20 -0
  53. package/public/r/badge-info.json +20 -0
  54. package/public/r/badge-lg.json +19 -0
  55. package/public/r/badge-outline.json +19 -0
  56. package/public/r/badge-secondary.json +19 -0
  57. package/public/r/badge-sm.json +19 -0
  58. package/public/r/badge-success.json +20 -0
  59. package/public/r/badge-warning.json +20 -0
  60. package/public/r/badge-with-icon.json +19 -0
  61. package/public/r/badge-with-link.json +19 -0
  62. package/public/r/badge.json +35 -0
  63. package/public/r/banner-inset.json +21 -0
  64. package/public/r/banner-themes.json +21 -0
  65. package/public/r/banner.json +20 -0
  66. package/public/r/bookmarks.json +206 -0
  67. package/public/r/breadcrumb-custom-separator.json +19 -0
  68. package/public/r/breadcrumb-demo.json +21 -0
  69. package/public/r/breadcrumb.json +15 -0
  70. package/public/r/button-demo.json +19 -0
  71. package/public/r/button-destructive-outline.json +20 -0
  72. package/public/r/button-destructive.json +21 -0
  73. package/public/r/button-disabled.json +20 -0
  74. package/public/r/button-ghost.json +19 -0
  75. package/public/r/button-icon-lg.json +19 -0
  76. package/public/r/button-icon-sm.json +19 -0
  77. package/public/r/button-icon.json +19 -0
  78. package/public/r/button-lg.json +19 -0
  79. package/public/r/button-link.json +19 -0
  80. package/public/r/button-loading.json +20 -0
  81. package/public/r/button-outline.json +19 -0
  82. package/public/r/button-secondary.json +19 -0
  83. package/public/r/button-sm.json +19 -0
  84. package/public/r/button-with-icon.json +19 -0
  85. package/public/r/button-with-link.json +19 -0
  86. package/public/r/button-xl.json +19 -0
  87. package/public/r/button-xs.json +19 -0
  88. package/public/r/button.json +23 -0
  89. package/public/r/calendar-headless.json +22 -0
  90. package/public/r/calendar-rac.json +16 -0
  91. package/public/r/calendar.json +21 -0
  92. package/public/r/card-demo.json +28 -0
  93. package/public/r/card.json +13 -0
  94. package/public/r/chart.json +15 -0
  95. package/public/r/checkbox-card.json +22 -0
  96. package/public/r/checkbox-demo.json +21 -0
  97. package/public/r/checkbox-disabled.json +22 -0
  98. package/public/r/checkbox-form.json +25 -0
  99. package/public/r/checkbox-group-demo.json +22 -0
  100. package/public/r/checkbox-group-disabled.json +23 -0
  101. package/public/r/checkbox-group-form.json +29 -0
  102. package/public/r/checkbox-group-nested-parent.json +23 -0
  103. package/public/r/checkbox-group-parent.json +23 -0
  104. package/public/r/checkbox-group.json +15 -0
  105. package/public/r/checkbox-tree.json +12 -0
  106. package/public/r/checkbox-with-description.json +23 -0
  107. package/public/r/checkbox.json +15 -0
  108. package/public/r/choicebox-inline.json +20 -0
  109. package/public/r/choicebox.json +20 -0
  110. package/public/r/code-block-diff.json +21 -0
  111. package/public/r/code-block-focus.json +20 -0
  112. package/public/r/code-block-headless.json +21 -0
  113. package/public/r/code-block-highlight-line.json +21 -0
  114. package/public/r/code-block-highlight-word.json +21 -0
  115. package/public/r/code-block-no-highlighting.json +20 -0
  116. package/public/r/code-block-numberless.json +20 -0
  117. package/public/r/code-block-theme.json +21 -0
  118. package/public/r/code-block.json +20 -0
  119. package/public/r/codebase.json +19 -0
  120. package/public/r/collaborative-canvas.json +19 -0
  121. package/public/r/collapsible-demo.json +19 -0
  122. package/public/r/collapsible.json +15 -0
  123. package/public/r/color-picker.json +21 -0
  124. package/public/r/colors-zinc.json +61 -0
  125. package/public/r/combobox-autohighlight.json +20 -0
  126. package/public/r/combobox-controlled.json +21 -0
  127. package/public/r/combobox-create-new.json +21 -0
  128. package/public/r/combobox-demo.json +20 -0
  129. package/public/r/combobox-disabled.json +21 -0
  130. package/public/r/combobox-fixed-width.json +20 -0
  131. package/public/r/combobox-form.json +24 -0
  132. package/public/r/combobox-grouped.json +20 -0
  133. package/public/r/combobox-lg.json +20 -0
  134. package/public/r/combobox-multiple-form.json +25 -0
  135. package/public/r/combobox-multiple.json +20 -0
  136. package/public/r/combobox-sm.json +20 -0
  137. package/public/r/combobox-with-clear.json +20 -0
  138. package/public/r/combobox-with-inner-input.json +21 -0
  139. package/public/r/combobox-with-label.json +21 -0
  140. package/public/r/combobox.json +19 -0
  141. package/public/r/command.json +18 -0
  142. package/public/r/comp-01.json +22 -0
  143. package/public/r/comp-02.json +23 -0
  144. package/public/r/comp-03.json +23 -0
  145. package/public/r/comp-04.json +23 -0
  146. package/public/r/comp-05.json +22 -0
  147. package/public/r/comp-06.json +23 -0
  148. package/public/r/comp-07.json +22 -0
  149. package/public/r/comp-08.json +23 -0
  150. package/public/r/comp-09.json +22 -0
  151. package/public/r/comp-10.json +22 -0
  152. package/public/r/comp-100.json +23 -0
  153. package/public/r/comp-101.json +23 -0
  154. package/public/r/comp-102.json +23 -0
  155. package/public/r/comp-103.json +23 -0
  156. package/public/r/comp-104.json +23 -0
  157. package/public/r/comp-105.json +23 -0
  158. package/public/r/comp-106.json +22 -0
  159. package/public/r/comp-107.json +22 -0
  160. package/public/r/comp-108.json +23 -0
  161. package/public/r/comp-109.json +22 -0
  162. package/public/r/comp-11.json +22 -0
  163. package/public/r/comp-110.json +22 -0
  164. package/public/r/comp-111.json +21 -0
  165. package/public/r/comp-112.json +21 -0
  166. package/public/r/comp-113.json +22 -0
  167. package/public/r/comp-114.json +23 -0
  168. package/public/r/comp-115.json +22 -0
  169. package/public/r/comp-116.json +22 -0
  170. package/public/r/comp-117.json +23 -0
  171. package/public/r/comp-118.json +23 -0
  172. package/public/r/comp-119.json +27 -0
  173. package/public/r/comp-12.json +22 -0
  174. package/public/r/comp-120.json +27 -0
  175. package/public/r/comp-121.json +27 -0
  176. package/public/r/comp-122.json +27 -0
  177. package/public/r/comp-123.json +22 -0
  178. package/public/r/comp-124.json +22 -0
  179. package/public/r/comp-125.json +31 -0
  180. package/public/r/comp-126.json +31 -0
  181. package/public/r/comp-127.json +21 -0
  182. package/public/r/comp-128.json +21 -0
  183. package/public/r/comp-129.json +24 -0
  184. package/public/r/comp-13.json +22 -0
  185. package/public/r/comp-130.json +23 -0
  186. package/public/r/comp-131.json +23 -0
  187. package/public/r/comp-132.json +23 -0
  188. package/public/r/comp-133.json +23 -0
  189. package/public/r/comp-134.json +23 -0
  190. package/public/r/comp-135.json +24 -0
  191. package/public/r/comp-136.json +23 -0
  192. package/public/r/comp-137.json +23 -0
  193. package/public/r/comp-138.json +25 -0
  194. package/public/r/comp-139.json +23 -0
  195. package/public/r/comp-14.json +22 -0
  196. package/public/r/comp-140.json +23 -0
  197. package/public/r/comp-141.json +23 -0
  198. package/public/r/comp-142.json +25 -0
  199. package/public/r/comp-143.json +23 -0
  200. package/public/r/comp-144.json +24 -0
  201. package/public/r/comp-145.json +24 -0
  202. package/public/r/comp-146.json +24 -0
  203. package/public/r/comp-147.json +24 -0
  204. package/public/r/comp-148.json +25 -0
  205. package/public/r/comp-149.json +24 -0
  206. package/public/r/comp-15.json +22 -0
  207. package/public/r/comp-150.json +21 -0
  208. package/public/r/comp-151.json +23 -0
  209. package/public/r/comp-152.json +23 -0
  210. package/public/r/comp-153.json +23 -0
  211. package/public/r/comp-154.json +23 -0
  212. package/public/r/comp-155.json +23 -0
  213. package/public/r/comp-156.json +25 -0
  214. package/public/r/comp-157.json +27 -0
  215. package/public/r/comp-158.json +24 -0
  216. package/public/r/comp-159.json +24 -0
  217. package/public/r/comp-16.json +22 -0
  218. package/public/r/comp-160.json +24 -0
  219. package/public/r/comp-161.json +24 -0
  220. package/public/r/comp-162.json +24 -0
  221. package/public/r/comp-163.json +28 -0
  222. package/public/r/comp-164.json +24 -0
  223. package/public/r/comp-165.json +24 -0
  224. package/public/r/comp-166.json +25 -0
  225. package/public/r/comp-167.json +24 -0
  226. package/public/r/comp-168.json +24 -0
  227. package/public/r/comp-169.json +23 -0
  228. package/public/r/comp-17.json +25 -0
  229. package/public/r/comp-170.json +25 -0
  230. package/public/r/comp-171.json +28 -0
  231. package/public/r/comp-172.json +23 -0
  232. package/public/r/comp-173.json +23 -0
  233. package/public/r/comp-174.json +23 -0
  234. package/public/r/comp-175.json +23 -0
  235. package/public/r/comp-176.json +23 -0
  236. package/public/r/comp-177.json +23 -0
  237. package/public/r/comp-178.json +23 -0
  238. package/public/r/comp-179.json +24 -0
  239. package/public/r/comp-18.json +25 -0
  240. package/public/r/comp-180.json +23 -0
  241. package/public/r/comp-181.json +25 -0
  242. package/public/r/comp-182.json +24 -0
  243. package/public/r/comp-183.json +25 -0
  244. package/public/r/comp-184.json +25 -0
  245. package/public/r/comp-185.json +24 -0
  246. package/public/r/comp-186.json +25 -0
  247. package/public/r/comp-187.json +25 -0
  248. package/public/r/comp-188.json +25 -0
  249. package/public/r/comp-189.json +23 -0
  250. package/public/r/comp-19.json +23 -0
  251. package/public/r/comp-190.json +23 -0
  252. package/public/r/comp-191.json +24 -0
  253. package/public/r/comp-192.json +23 -0
  254. package/public/r/comp-193.json +23 -0
  255. package/public/r/comp-194.json +24 -0
  256. package/public/r/comp-195.json +23 -0
  257. package/public/r/comp-196.json +24 -0
  258. package/public/r/comp-197.json +23 -0
  259. package/public/r/comp-198.json +23 -0
  260. package/public/r/comp-199.json +23 -0
  261. package/public/r/comp-20.json +23 -0
  262. package/public/r/comp-200.json +25 -0
  263. package/public/r/comp-201.json +22 -0
  264. package/public/r/comp-202.json +22 -0
  265. package/public/r/comp-203.json +23 -0
  266. package/public/r/comp-204.json +23 -0
  267. package/public/r/comp-205.json +23 -0
  268. package/public/r/comp-206.json +24 -0
  269. package/public/r/comp-207.json +23 -0
  270. package/public/r/comp-208.json +23 -0
  271. package/public/r/comp-209.json +23 -0
  272. package/public/r/comp-21.json +23 -0
  273. package/public/r/comp-210.json +24 -0
  274. package/public/r/comp-211.json +24 -0
  275. package/public/r/comp-212.json +23 -0
  276. package/public/r/comp-213.json +23 -0
  277. package/public/r/comp-214.json +23 -0
  278. package/public/r/comp-215.json +24 -0
  279. package/public/r/comp-216.json +22 -0
  280. package/public/r/comp-217.json +22 -0
  281. package/public/r/comp-218.json +25 -0
  282. package/public/r/comp-219.json +23 -0
  283. package/public/r/comp-22.json +23 -0
  284. package/public/r/comp-220.json +24 -0
  285. package/public/r/comp-221.json +23 -0
  286. package/public/r/comp-222.json +26 -0
  287. package/public/r/comp-223.json +26 -0
  288. package/public/r/comp-224.json +23 -0
  289. package/public/r/comp-225.json +24 -0
  290. package/public/r/comp-226.json +26 -0
  291. package/public/r/comp-227.json +26 -0
  292. package/public/r/comp-228.json +26 -0
  293. package/public/r/comp-229.json +30 -0
  294. package/public/r/comp-23.json +24 -0
  295. package/public/r/comp-230.json +30 -0
  296. package/public/r/comp-231.json +32 -0
  297. package/public/r/comp-232.json +31 -0
  298. package/public/r/comp-233.json +30 -0
  299. package/public/r/comp-234.json +28 -0
  300. package/public/r/comp-235.json +28 -0
  301. package/public/r/comp-236.json +24 -0
  302. package/public/r/comp-237.json +26 -0
  303. package/public/r/comp-238.json +26 -0
  304. package/public/r/comp-239.json +26 -0
  305. package/public/r/comp-24.json +23 -0
  306. package/public/r/comp-240.json +23 -0
  307. package/public/r/comp-241.json +24 -0
  308. package/public/r/comp-242.json +23 -0
  309. package/public/r/comp-243.json +23 -0
  310. package/public/r/comp-244.json +23 -0
  311. package/public/r/comp-245.json +23 -0
  312. package/public/r/comp-246.json +23 -0
  313. package/public/r/comp-247.json +23 -0
  314. package/public/r/comp-248.json +23 -0
  315. package/public/r/comp-249.json +24 -0
  316. package/public/r/comp-25.json +24 -0
  317. package/public/r/comp-250.json +25 -0
  318. package/public/r/comp-251.json +25 -0
  319. package/public/r/comp-252.json +25 -0
  320. package/public/r/comp-253.json +25 -0
  321. package/public/r/comp-254.json +35 -0
  322. package/public/r/comp-255.json +30 -0
  323. package/public/r/comp-256.json +25 -0
  324. package/public/r/comp-257.json +25 -0
  325. package/public/r/comp-258.json +32 -0
  326. package/public/r/comp-259.json +26 -0
  327. package/public/r/comp-26.json +24 -0
  328. package/public/r/comp-260.json +26 -0
  329. package/public/r/comp-261.json +24 -0
  330. package/public/r/comp-262.json +31 -0
  331. package/public/r/comp-263.json +25 -0
  332. package/public/r/comp-264.json +33 -0
  333. package/public/r/comp-265.json +32 -0
  334. package/public/r/comp-266.json +24 -0
  335. package/public/r/comp-267.json +19 -0
  336. package/public/r/comp-268.json +19 -0
  337. package/public/r/comp-269.json +19 -0
  338. package/public/r/comp-27.json +24 -0
  339. package/public/r/comp-270.json +19 -0
  340. package/public/r/comp-271.json +19 -0
  341. package/public/r/comp-272.json +19 -0
  342. package/public/r/comp-273.json +19 -0
  343. package/public/r/comp-274.json +19 -0
  344. package/public/r/comp-275.json +19 -0
  345. package/public/r/comp-276.json +19 -0
  346. package/public/r/comp-277.json +21 -0
  347. package/public/r/comp-278.json +21 -0
  348. package/public/r/comp-279.json +23 -0
  349. package/public/r/comp-28.json +24 -0
  350. package/public/r/comp-280.json +23 -0
  351. package/public/r/comp-281.json +23 -0
  352. package/public/r/comp-282.json +23 -0
  353. package/public/r/comp-283.json +23 -0
  354. package/public/r/comp-284.json +23 -0
  355. package/public/r/comp-285.json +23 -0
  356. package/public/r/comp-286.json +23 -0
  357. package/public/r/comp-287.json +24 -0
  358. package/public/r/comp-288.json +23 -0
  359. package/public/r/comp-289.json +24 -0
  360. package/public/r/comp-29.json +24 -0
  361. package/public/r/comp-290.json +24 -0
  362. package/public/r/comp-291.json +24 -0
  363. package/public/r/comp-292.json +24 -0
  364. package/public/r/comp-293.json +26 -0
  365. package/public/r/comp-294.json +24 -0
  366. package/public/r/comp-295.json +23 -0
  367. package/public/r/comp-296.json +23 -0
  368. package/public/r/comp-297.json +30 -0
  369. package/public/r/comp-298.json +26 -0
  370. package/public/r/comp-299.json +28 -0
  371. package/public/r/comp-30.json +23 -0
  372. package/public/r/comp-300.json +29 -0
  373. package/public/r/comp-301.json +24 -0
  374. package/public/r/comp-302.json +18 -0
  375. package/public/r/comp-303.json +18 -0
  376. package/public/r/comp-304.json +18 -0
  377. package/public/r/comp-305.json +21 -0
  378. package/public/r/comp-306.json +21 -0
  379. package/public/r/comp-307.json +21 -0
  380. package/public/r/comp-308.json +21 -0
  381. package/public/r/comp-309.json +21 -0
  382. package/public/r/comp-31.json +21 -0
  383. package/public/r/comp-310.json +23 -0
  384. package/public/r/comp-311.json +20 -0
  385. package/public/r/comp-312.json +21 -0
  386. package/public/r/comp-313.json +26 -0
  387. package/public/r/comp-314.json +26 -0
  388. package/public/r/comp-315.json +24 -0
  389. package/public/r/comp-316.json +25 -0
  390. package/public/r/comp-317.json +24 -0
  391. package/public/r/comp-318.json +24 -0
  392. package/public/r/comp-319.json +24 -0
  393. package/public/r/comp-32.json +21 -0
  394. package/public/r/comp-320.json +27 -0
  395. package/public/r/comp-321.json +28 -0
  396. package/public/r/comp-322.json +27 -0
  397. package/public/r/comp-323.json +30 -0
  398. package/public/r/comp-324.json +28 -0
  399. package/public/r/comp-325.json +29 -0
  400. package/public/r/comp-326.json +30 -0
  401. package/public/r/comp-327.json +30 -0
  402. package/public/r/comp-328.json +37 -0
  403. package/public/r/comp-329.json +38 -0
  404. package/public/r/comp-33.json +18 -0
  405. package/public/r/comp-330.json +27 -0
  406. package/public/r/comp-331.json +42 -0
  407. package/public/r/comp-332.json +25 -0
  408. package/public/r/comp-333.json +29 -0
  409. package/public/r/comp-334.json +22 -0
  410. package/public/r/comp-335.json +22 -0
  411. package/public/r/comp-336.json +22 -0
  412. package/public/r/comp-337.json +22 -0
  413. package/public/r/comp-338.json +22 -0
  414. package/public/r/comp-339.json +22 -0
  415. package/public/r/comp-34.json +27 -0
  416. package/public/r/comp-340.json +22 -0
  417. package/public/r/comp-341.json +22 -0
  418. package/public/r/comp-342.json +22 -0
  419. package/public/r/comp-343.json +22 -0
  420. package/public/r/comp-344.json +22 -0
  421. package/public/r/comp-345.json +22 -0
  422. package/public/r/comp-346.json +22 -0
  423. package/public/r/comp-347.json +22 -0
  424. package/public/r/comp-348.json +22 -0
  425. package/public/r/comp-349.json +22 -0
  426. package/public/r/comp-35.json +27 -0
  427. package/public/r/comp-350.json +22 -0
  428. package/public/r/comp-351.json +22 -0
  429. package/public/r/comp-352.json +24 -0
  430. package/public/r/comp-353.json +24 -0
  431. package/public/r/comp-354.json +23 -0
  432. package/public/r/comp-355.json +23 -0
  433. package/public/r/comp-356.json +23 -0
  434. package/public/r/comp-357.json +23 -0
  435. package/public/r/comp-358.json +23 -0
  436. package/public/r/comp-359.json +24 -0
  437. package/public/r/comp-36.json +26 -0
  438. package/public/r/comp-360.json +25 -0
  439. package/public/r/comp-361.json +23 -0
  440. package/public/r/comp-362.json +24 -0
  441. package/public/r/comp-363.json +27 -0
  442. package/public/r/comp-364.json +26 -0
  443. package/public/r/comp-365.json +24 -0
  444. package/public/r/comp-366.json +23 -0
  445. package/public/r/comp-367.json +23 -0
  446. package/public/r/comp-368.json +23 -0
  447. package/public/r/comp-369.json +23 -0
  448. package/public/r/comp-37.json +23 -0
  449. package/public/r/comp-370.json +23 -0
  450. package/public/r/comp-371.json +24 -0
  451. package/public/r/comp-372.json +24 -0
  452. package/public/r/comp-373.json +25 -0
  453. package/public/r/comp-374.json +26 -0
  454. package/public/r/comp-375.json +25 -0
  455. package/public/r/comp-376.json +26 -0
  456. package/public/r/comp-377.json +27 -0
  457. package/public/r/comp-378.json +24 -0
  458. package/public/r/comp-379.json +24 -0
  459. package/public/r/comp-38.json +23 -0
  460. package/public/r/comp-380.json +24 -0
  461. package/public/r/comp-381.json +26 -0
  462. package/public/r/comp-382.json +25 -0
  463. package/public/r/comp-383.json +26 -0
  464. package/public/r/comp-384.json +24 -0
  465. package/public/r/comp-385.json +24 -0
  466. package/public/r/comp-386.json +24 -0
  467. package/public/r/comp-387.json +28 -0
  468. package/public/r/comp-388.json +26 -0
  469. package/public/r/comp-389.json +24 -0
  470. package/public/r/comp-39.json +23 -0
  471. package/public/r/comp-390.json +23 -0
  472. package/public/r/comp-391.json +23 -0
  473. package/public/r/comp-392.json +23 -0
  474. package/public/r/comp-393.json +23 -0
  475. package/public/r/comp-394.json +24 -0
  476. package/public/r/comp-395.json +24 -0
  477. package/public/r/comp-396.json +24 -0
  478. package/public/r/comp-397.json +25 -0
  479. package/public/r/comp-398.json +26 -0
  480. package/public/r/comp-399.json +26 -0
  481. package/public/r/comp-40.json +23 -0
  482. package/public/r/comp-400.json +20 -0
  483. package/public/r/comp-401.json +19 -0
  484. package/public/r/comp-402.json +19 -0
  485. package/public/r/comp-403.json +19 -0
  486. package/public/r/comp-404.json +19 -0
  487. package/public/r/comp-405.json +19 -0
  488. package/public/r/comp-406.json +19 -0
  489. package/public/r/comp-407.json +19 -0
  490. package/public/r/comp-408.json +19 -0
  491. package/public/r/comp-409.json +22 -0
  492. package/public/r/comp-41.json +29 -0
  493. package/public/r/comp-410.json +22 -0
  494. package/public/r/comp-411.json +22 -0
  495. package/public/r/comp-412.json +19 -0
  496. package/public/r/comp-413.json +22 -0
  497. package/public/r/comp-414.json +22 -0
  498. package/public/r/comp-415.json +22 -0
  499. package/public/r/comp-416.json +23 -0
  500. package/public/r/comp-417.json +22 -0
  501. package/public/r/comp-418.json +23 -0
  502. package/public/r/comp-419.json +23 -0
  503. package/public/r/comp-42.json +30 -0
  504. package/public/r/comp-420.json +23 -0
  505. package/public/r/comp-421.json +23 -0
  506. package/public/r/comp-422.json +23 -0
  507. package/public/r/comp-423.json +24 -0
  508. package/public/r/comp-424.json +22 -0
  509. package/public/r/comp-425.json +23 -0
  510. package/public/r/comp-426.json +23 -0
  511. package/public/r/comp-427.json +23 -0
  512. package/public/r/comp-428.json +23 -0
  513. package/public/r/comp-429.json +23 -0
  514. package/public/r/comp-43.json +32 -0
  515. package/public/r/comp-430.json +23 -0
  516. package/public/r/comp-431.json +23 -0
  517. package/public/r/comp-432.json +23 -0
  518. package/public/r/comp-433.json +24 -0
  519. package/public/r/comp-434.json +24 -0
  520. package/public/r/comp-435.json +24 -0
  521. package/public/r/comp-436.json +24 -0
  522. package/public/r/comp-437.json +25 -0
  523. package/public/r/comp-438.json +23 -0
  524. package/public/r/comp-439.json +24 -0
  525. package/public/r/comp-44.json +25 -0
  526. package/public/r/comp-440.json +25 -0
  527. package/public/r/comp-441.json +25 -0
  528. package/public/r/comp-442.json +24 -0
  529. package/public/r/comp-443.json +24 -0
  530. package/public/r/comp-444.json +24 -0
  531. package/public/r/comp-445.json +24 -0
  532. package/public/r/comp-446.json +24 -0
  533. package/public/r/comp-447.json +25 -0
  534. package/public/r/comp-448.json +23 -0
  535. package/public/r/comp-449.json +23 -0
  536. package/public/r/comp-45.json +25 -0
  537. package/public/r/comp-450.json +23 -0
  538. package/public/r/comp-451.json +23 -0
  539. package/public/r/comp-452.json +23 -0
  540. package/public/r/comp-453.json +25 -0
  541. package/public/r/comp-454.json +22 -0
  542. package/public/r/comp-455.json +22 -0
  543. package/public/r/comp-456.json +22 -0
  544. package/public/r/comp-457.json +21 -0
  545. package/public/r/comp-458.json +22 -0
  546. package/public/r/comp-459.json +26 -0
  547. package/public/r/comp-46.json +26 -0
  548. package/public/r/comp-460.json +26 -0
  549. package/public/r/comp-461.json +27 -0
  550. package/public/r/comp-462.json +27 -0
  551. package/public/r/comp-463.json +30 -0
  552. package/public/r/comp-464.json +29 -0
  553. package/public/r/comp-465.json +29 -0
  554. package/public/r/comp-466.json +21 -0
  555. package/public/r/comp-467.json +23 -0
  556. package/public/r/comp-468.json +21 -0
  557. package/public/r/comp-469.json +21 -0
  558. package/public/r/comp-47.json +32 -0
  559. package/public/r/comp-470.json +21 -0
  560. package/public/r/comp-471.json +21 -0
  561. package/public/r/comp-472.json +23 -0
  562. package/public/r/comp-473.json +24 -0
  563. package/public/r/comp-474.json +22 -0
  564. package/public/r/comp-475.json +22 -0
  565. package/public/r/comp-476.json +21 -0
  566. package/public/r/comp-477.json +31 -0
  567. package/public/r/comp-478.json +36 -0
  568. package/public/r/comp-479.json +28 -0
  569. package/public/r/comp-48.json +32 -0
  570. package/public/r/comp-480.json +30 -0
  571. package/public/r/comp-481.json +34 -0
  572. package/public/r/comp-482.json +33 -0
  573. package/public/r/comp-483.json +37 -0
  574. package/public/r/comp-484.json +41 -0
  575. package/public/r/comp-485.json +43 -0
  576. package/public/r/comp-486.json +23 -0
  577. package/public/r/comp-487.json +26 -0
  578. package/public/r/comp-488.json +27 -0
  579. package/public/r/comp-489.json +28 -0
  580. package/public/r/comp-49.json +32 -0
  581. package/public/r/comp-490.json +23 -0
  582. package/public/r/comp-491.json +24 -0
  583. package/public/r/comp-492.json +25 -0
  584. package/public/r/comp-493.json +23 -0
  585. package/public/r/comp-494.json +23 -0
  586. package/public/r/comp-495.json +24 -0
  587. package/public/r/comp-496.json +23 -0
  588. package/public/r/comp-497.json +24 -0
  589. package/public/r/comp-498.json +24 -0
  590. package/public/r/comp-499.json +24 -0
  591. package/public/r/comp-50.json +32 -0
  592. package/public/r/comp-500.json +25 -0
  593. package/public/r/comp-501.json +25 -0
  594. package/public/r/comp-502.json +26 -0
  595. package/public/r/comp-503.json +27 -0
  596. package/public/r/comp-504.json +28 -0
  597. package/public/r/comp-505.json +28 -0
  598. package/public/r/comp-506.json +26 -0
  599. package/public/r/comp-507.json +27 -0
  600. package/public/r/comp-508.json +25 -0
  601. package/public/r/comp-509.json +25 -0
  602. package/public/r/comp-51.json +23 -0
  603. package/public/r/comp-510.json +24 -0
  604. package/public/r/comp-511.json +27 -0
  605. package/public/r/comp-512.json +27 -0
  606. package/public/r/comp-513.json +21 -0
  607. package/public/r/comp-514.json +21 -0
  608. package/public/r/comp-515.json +21 -0
  609. package/public/r/comp-516.json +22 -0
  610. package/public/r/comp-517.json +22 -0
  611. package/public/r/comp-518.json +21 -0
  612. package/public/r/comp-519.json +21 -0
  613. package/public/r/comp-52.json +23 -0
  614. package/public/r/comp-520.json +22 -0
  615. package/public/r/comp-521.json +22 -0
  616. package/public/r/comp-522.json +21 -0
  617. package/public/r/comp-523.json +21 -0
  618. package/public/r/comp-524.json +21 -0
  619. package/public/r/comp-525.json +21 -0
  620. package/public/r/comp-526.json +22 -0
  621. package/public/r/comp-527.json +23 -0
  622. package/public/r/comp-528.json +22 -0
  623. package/public/r/comp-529.json +22 -0
  624. package/public/r/comp-53.json +24 -0
  625. package/public/r/comp-530.json +22 -0
  626. package/public/r/comp-531.json +22 -0
  627. package/public/r/comp-532.json +22 -0
  628. package/public/r/comp-533.json +22 -0
  629. package/public/r/comp-534.json +22 -0
  630. package/public/r/comp-535.json +22 -0
  631. package/public/r/comp-536.json +22 -0
  632. package/public/r/comp-537.json +22 -0
  633. package/public/r/comp-538.json +22 -0
  634. package/public/r/comp-539.json +22 -0
  635. package/public/r/comp-54.json +26 -0
  636. package/public/r/comp-540.json +21 -0
  637. package/public/r/comp-541.json +21 -0
  638. package/public/r/comp-542.json +124 -0
  639. package/public/r/comp-543.json +29 -0
  640. package/public/r/comp-544.json +26 -0
  641. package/public/r/comp-545.json +29 -0
  642. package/public/r/comp-546.json +29 -0
  643. package/public/r/comp-547.json +29 -0
  644. package/public/r/comp-548.json +29 -0
  645. package/public/r/comp-549.json +29 -0
  646. package/public/r/comp-55.json +27 -0
  647. package/public/r/comp-550.json +29 -0
  648. package/public/r/comp-551.json +30 -0
  649. package/public/r/comp-552.json +29 -0
  650. package/public/r/comp-553.json +29 -0
  651. package/public/r/comp-554.json +36 -0
  652. package/public/r/comp-555.json +23 -0
  653. package/public/r/comp-556.json +23 -0
  654. package/public/r/comp-557.json +23 -0
  655. package/public/r/comp-558.json +23 -0
  656. package/public/r/comp-559.json +23 -0
  657. package/public/r/comp-56.json +26 -0
  658. package/public/r/comp-560.json +23 -0
  659. package/public/r/comp-561.json +25 -0
  660. package/public/r/comp-562.json +23 -0
  661. package/public/r/comp-563.json +23 -0
  662. package/public/r/comp-564.json +24 -0
  663. package/public/r/comp-565.json +20 -0
  664. package/public/r/comp-566.json +20 -0
  665. package/public/r/comp-567.json +20 -0
  666. package/public/r/comp-568.json +20 -0
  667. package/public/r/comp-569.json +20 -0
  668. package/public/r/comp-57.json +26 -0
  669. package/public/r/comp-570.json +20 -0
  670. package/public/r/comp-571.json +23 -0
  671. package/public/r/comp-572.json +23 -0
  672. package/public/r/comp-573.json +20 -0
  673. package/public/r/comp-574.json +22 -0
  674. package/public/r/comp-575.json +20 -0
  675. package/public/r/comp-576.json +21 -0
  676. package/public/r/comp-577.json +23 -0
  677. package/public/r/comp-578.json +28 -0
  678. package/public/r/comp-579.json +28 -0
  679. package/public/r/comp-58.json +25 -0
  680. package/public/r/comp-580.json +29 -0
  681. package/public/r/comp-581.json +45 -0
  682. package/public/r/comp-582.json +42 -0
  683. package/public/r/comp-583.json +41 -0
  684. package/public/r/comp-584.json +41 -0
  685. package/public/r/comp-585.json +41 -0
  686. package/public/r/comp-586.json +34 -0
  687. package/public/r/comp-587.json +29 -0
  688. package/public/r/comp-588.json +33 -0
  689. package/public/r/comp-589.json +37 -0
  690. package/public/r/comp-59.json +22 -0
  691. package/public/r/comp-590.json +40 -0
  692. package/public/r/comp-591.json +29 -0
  693. package/public/r/comp-592.json +41 -0
  694. package/public/r/comp-593.json +36 -0
  695. package/public/r/comp-594.json +33 -0
  696. package/public/r/comp-595.json +22 -0
  697. package/public/r/comp-596.json +26 -0
  698. package/public/r/comp-597.json +22 -0
  699. package/public/r/comp-598.json +22 -0
  700. package/public/r/comp-599.json +22 -0
  701. package/public/r/comp-60.json +23 -0
  702. package/public/r/comp-600.json +17 -0
  703. package/public/r/comp-601.json +20 -0
  704. package/public/r/comp-602.json +17 -0
  705. package/public/r/comp-603.json +20 -0
  706. package/public/r/comp-604.json +17 -0
  707. package/public/r/comp-605.json +17 -0
  708. package/public/r/comp-606.json +20 -0
  709. package/public/r/comp-607.json +20 -0
  710. package/public/r/comp-608.json +20 -0
  711. package/public/r/comp-609.json +20 -0
  712. package/public/r/comp-61.json +23 -0
  713. package/public/r/comp-610.json +23 -0
  714. package/public/r/comp-611.json +23 -0
  715. package/public/r/comp-612.json +17 -0
  716. package/public/r/comp-613.json +20 -0
  717. package/public/r/comp-614.json +17 -0
  718. package/public/r/comp-615.json +26 -0
  719. package/public/r/comp-616.json +26 -0
  720. package/public/r/comp-617.json +26 -0
  721. package/public/r/comp-62.json +23 -0
  722. package/public/r/comp-63.json +22 -0
  723. package/public/r/comp-64.json +23 -0
  724. package/public/r/comp-65.json +22 -0
  725. package/public/r/comp-66.json +22 -0
  726. package/public/r/comp-67.json +23 -0
  727. package/public/r/comp-68.json +24 -0
  728. package/public/r/comp-69.json +24 -0
  729. package/public/r/comp-70.json +24 -0
  730. package/public/r/comp-71.json +22 -0
  731. package/public/r/comp-72.json +21 -0
  732. package/public/r/comp-73.json +18 -0
  733. package/public/r/comp-74.json +27 -0
  734. package/public/r/comp-75.json +22 -0
  735. package/public/r/comp-76.json +23 -0
  736. package/public/r/comp-77.json +22 -0
  737. package/public/r/comp-78.json +21 -0
  738. package/public/r/comp-79.json +22 -0
  739. package/public/r/comp-80.json +21 -0
  740. package/public/r/comp-81.json +21 -0
  741. package/public/r/comp-82.json +22 -0
  742. package/public/r/comp-83.json +21 -0
  743. package/public/r/comp-84.json +21 -0
  744. package/public/r/comp-85.json +22 -0
  745. package/public/r/comp-86.json +22 -0
  746. package/public/r/comp-87.json +21 -0
  747. package/public/r/comp-88.json +22 -0
  748. package/public/r/comp-89.json +21 -0
  749. package/public/r/comp-90.json +22 -0
  750. package/public/r/comp-91.json +22 -0
  751. package/public/r/comp-92.json +22 -0
  752. package/public/r/comp-93.json +22 -0
  753. package/public/r/comp-94.json +24 -0
  754. package/public/r/comp-95.json +26 -0
  755. package/public/r/comp-96.json +21 -0
  756. package/public/r/comp-97.json +21 -0
  757. package/public/r/comp-98.json +22 -0
  758. package/public/r/comp-99.json +23 -0
  759. package/public/r/comparison-event-handlers.json +22 -0
  760. package/public/r/comparison-hover.json +22 -0
  761. package/public/r/comparison.json +21 -0
  762. package/public/r/context-menu.json +16 -0
  763. package/public/r/contribution-graph-custom-blocks.json +23 -0
  764. package/public/r/contribution-graph-custom-footer.json +23 -0
  765. package/public/r/contribution-graph-custom-theme.json +23 -0
  766. package/public/r/contribution-graph-minimal.json +22 -0
  767. package/public/r/contribution-graph-size.json +23 -0
  768. package/public/r/contribution-graph-tooltip.json +23 -0
  769. package/public/r/contribution-graph.json +22 -0
  770. package/public/r/credit-card-apple.json +20 -0
  771. package/public/r/credit-card-back.json +20 -0
  772. package/public/r/credit-card.json +20 -0
  773. package/public/r/cropper.json +15 -0
  774. package/public/r/cursor-color.json +20 -0
  775. package/public/r/cursor-message.json +20 -0
  776. package/public/r/cursor-name-message.json +21 -0
  777. package/public/r/cursor-name.json +20 -0
  778. package/public/r/cursor-only.json +19 -0
  779. package/public/r/cursor.json +20 -0
  780. package/public/r/dashboard-1.json +263 -0
  781. package/public/r/dashboard-2.json +264 -0
  782. package/public/r/dashboard-3.json +225 -0
  783. package/public/r/datefield-rac.json +15 -0
  784. package/public/r/deck-controlled.json +22 -0
  785. package/public/r/deck-product-cards.json +22 -0
  786. package/public/r/deck.json +20 -0
  787. package/public/r/dialog-close-confirmation.json +29 -0
  788. package/public/r/dialog-demo.json +25 -0
  789. package/public/r/dialog-from-menu.json +23 -0
  790. package/public/r/dialog-nested.json +23 -0
  791. package/public/r/dialog-stack-controlled.json +22 -0
  792. package/public/r/dialog-stack-navigation.json +22 -0
  793. package/public/r/dialog-stack-six.json +22 -0
  794. package/public/r/dialog-stack.json +22 -0
  795. package/public/r/dialog.json +15 -0
  796. package/public/r/dropdown-menu.json +15 -0
  797. package/public/r/dropzone-accept.json +20 -0
  798. package/public/r/dropzone-custom-empty-state.json +21 -0
  799. package/public/r/dropzone-image-preview.json +21 -0
  800. package/public/r/dropzone-min-max.json +20 -0
  801. package/public/r/dropzone-multiple.json +21 -0
  802. package/public/r/dropzone.json +21 -0
  803. package/public/r/editor.json +21 -0
  804. package/public/r/emails.json +243 -0
  805. package/public/r/empty-demo.json +20 -0
  806. package/public/r/empty.json +12 -0
  807. package/public/r/ether.json +15 -0
  808. package/public/r/example-app-calendar.json +323 -0
  809. package/public/r/field-2.json +19 -0
  810. package/public/r/field-autocomplete.json +23 -0
  811. package/public/r/field-checkbox-group.json +26 -0
  812. package/public/r/field-checkbox.json +22 -0
  813. package/public/r/field-combobox-multiple.json +24 -0
  814. package/public/r/field-combobox.json +23 -0
  815. package/public/r/field-complete-form.json +30 -0
  816. package/public/r/field-demo.json +22 -0
  817. package/public/r/field-disabled.json +23 -0
  818. package/public/r/field-error.json +21 -0
  819. package/public/r/field-number-field.json +25 -0
  820. package/public/r/field-radio.json +26 -0
  821. package/public/r/field-required.json +21 -0
  822. package/public/r/field-select.json +24 -0
  823. package/public/r/field-slider.json +24 -0
  824. package/public/r/field-switch.json +22 -0
  825. package/public/r/field-textarea.json +24 -0
  826. package/public/r/field-validity.json +19 -0
  827. package/public/r/field.json +23 -0
  828. package/public/r/fieldset-demo.json +24 -0
  829. package/public/r/fieldset.json +15 -0
  830. package/public/r/files.json +195 -0
  831. package/public/r/form-demo.json +24 -0
  832. package/public/r/form-zod.json +29 -0
  833. package/public/r/form.json +20 -0
  834. package/public/r/frame-demo.json +19 -0
  835. package/public/r/frame.json +12 -0
  836. package/public/r/gantt-lanes.json +23 -0
  837. package/public/r/gantt-no-sidebar.json +22 -0
  838. package/public/r/gantt-read-only.json +22 -0
  839. package/public/r/gantt.json +22 -0
  840. package/public/r/glimpse-custom.json +21 -0
  841. package/public/r/glimpse.json +20 -0
  842. package/public/r/gooey-toast-demo.json +23 -0
  843. package/public/r/gooey-toast-position.json +20 -0
  844. package/public/r/gooey-toast-promise.json +20 -0
  845. package/public/r/gooey-toast-states.json +20 -0
  846. package/public/r/gooey-toast-with-button.json +20 -0
  847. package/public/r/gradient-blinds.json +15 -0
  848. package/public/r/group-demo.json +20 -0
  849. package/public/r/group-with-input.json +21 -0
  850. package/public/r/group.json +18 -0
  851. package/public/r/hero.json +24 -0
  852. package/public/r/hover-card.json +15 -0
  853. package/public/r/image-crop-circular.json +23 -0
  854. package/public/r/image-crop-custom.json +24 -0
  855. package/public/r/image-crop.json +23 -0
  856. package/public/r/image-zoom-background.json +22 -0
  857. package/public/r/image-zoom-margin.json +21 -0
  858. package/public/r/image-zoom.json +21 -0
  859. package/public/r/input-demo.json +19 -0
  860. package/public/r/input-disabled.json +20 -0
  861. package/public/r/input-file.json +20 -0
  862. package/public/r/input-group.json +20 -0
  863. package/public/r/input-lg.json +19 -0
  864. package/public/r/input-sm.json +19 -0
  865. package/public/r/input-with-button.json +21 -0
  866. package/public/r/input-with-label.json +21 -0
  867. package/public/r/input.json +15 -0
  868. package/public/r/kanban-simple.json +21 -0
  869. package/public/r/kanban.json +21 -0
  870. package/public/r/kbd.json +12 -0
  871. package/public/r/label.json +15 -0
  872. package/public/r/leads.json +271 -0
  873. package/public/r/list-simple.json +21 -0
  874. package/public/r/list.json +21 -0
  875. package/public/r/maps.json +188 -0
  876. package/public/r/marquee-no-fade.json +20 -0
  877. package/public/r/marquee-raw.json +21 -0
  878. package/public/r/marquee-spacing.json +21 -0
  879. package/public/r/marquee.json +20 -0
  880. package/public/r/menu-checkbox.json +21 -0
  881. package/public/r/menu-close-on-click.json +20 -0
  882. package/public/r/menu-demo.json +20 -0
  883. package/public/r/menu-group-labels.json +21 -0
  884. package/public/r/menu-hover.json +20 -0
  885. package/public/r/menu-link.json +21 -0
  886. package/public/r/menu-nested.json +20 -0
  887. package/public/r/menu-radio-group.json +21 -0
  888. package/public/r/menu.json +23 -0
  889. package/public/r/meter-demo.json +19 -0
  890. package/public/r/meter-simple.json +19 -0
  891. package/public/r/meter-with-formatted-value.json +19 -0
  892. package/public/r/meter-with-range.json +19 -0
  893. package/public/r/meter.json +15 -0
  894. package/public/r/mini-calendar-controlled.json +21 -0
  895. package/public/r/mini-calendar-custom.json +21 -0
  896. package/public/r/mini-calendar-days.json +20 -0
  897. package/public/r/mini-calendar.json +20 -0
  898. package/public/r/multiselect.json +15 -0
  899. package/public/r/navigation-menu.json +12 -0
  900. package/public/r/number-field-demo.json +19 -0
  901. package/public/r/number-field-disabled.json +21 -0
  902. package/public/r/number-field-form.json +25 -0
  903. package/public/r/number-field-lg.json +19 -0
  904. package/public/r/number-field-sm.json +19 -0
  905. package/public/r/number-field-with-formatted-value.json +19 -0
  906. package/public/r/number-field-with-label.json +24 -0
  907. package/public/r/number-field-with-range.json +20 -0
  908. package/public/r/number-field-with-scrub.json +19 -0
  909. package/public/r/number-field-with-step.json +19 -0
  910. package/public/r/number-field.json +15 -0
  911. package/public/r/pagination-demo.json +19 -0
  912. package/public/r/pagination.json +18 -0
  913. package/public/r/particle-bu-1.json +22 -0
  914. package/public/r/particle-bu-2.json +22 -0
  915. package/public/r/particle-bu-3.json +22 -0
  916. package/public/r/particle-bu-4.json +22 -0
  917. package/public/r/particle-bu-5.json +22 -0
  918. package/public/r/particle-bu-6.json +22 -0
  919. package/public/r/particle-bu-7.json +22 -0
  920. package/public/r/particle-fr-1.json +25 -0
  921. package/public/r/particle-pa-1.json +19 -0
  922. package/public/r/particle-pa-2.json +21 -0
  923. package/public/r/pill-avatar-group.json +21 -0
  924. package/public/r/pill-avatar.json +21 -0
  925. package/public/r/pill-button.json +20 -0
  926. package/public/r/pill-delta.json +21 -0
  927. package/public/r/pill-icon.json +21 -0
  928. package/public/r/pill-indicator.json +20 -0
  929. package/public/r/pill-status.json +21 -0
  930. package/public/r/pill.json +20 -0
  931. package/public/r/popover-demo.json +27 -0
  932. package/public/r/popover-with-close.json +21 -0
  933. package/public/r/popover.json +15 -0
  934. package/public/r/preview-card-demo.json +21 -0
  935. package/public/r/preview-card.json +15 -0
  936. package/public/r/pricing.json +24 -0
  937. package/public/r/progress-demo.json +19 -0
  938. package/public/r/progress-with-formatted-value.json +19 -0
  939. package/public/r/progress-with-label-value.json +20 -0
  940. package/public/r/progress.json +15 -0
  941. package/public/r/qr-code-robust.json +21 -0
  942. package/public/r/qr-code-server.json +21 -0
  943. package/public/r/qr-code-styling.json +21 -0
  944. package/public/r/qr-code.json +20 -0
  945. package/public/r/radio-group-card.json +21 -0
  946. package/public/r/radio-group-demo.json +21 -0
  947. package/public/r/radio-group-disabled.json +21 -0
  948. package/public/r/radio-group-form.json +27 -0
  949. package/public/r/radio-group-with-description.json +23 -0
  950. package/public/r/radio-group.json +15 -0
  951. package/public/r/rating-colors.json +21 -0
  952. package/public/r/rating-controlled.json +21 -0
  953. package/public/r/rating-icon.json +21 -0
  954. package/public/r/rating-size.json +20 -0
  955. package/public/r/rating.json +20 -0
  956. package/public/r/reel-custom.json +22 -0
  957. package/public/r/reel-images.json +21 -0
  958. package/public/r/reel-minimal.json +20 -0
  959. package/public/r/reel.json +21 -0
  960. package/public/r/registry.json +26204 -0
  961. package/public/r/relative-time-controlled.json +21 -0
  962. package/public/r/relative-time-format-date.json +20 -0
  963. package/public/r/relative-time-format-time.json +20 -0
  964. package/public/r/relative-time.json +20 -0
  965. package/public/r/rentals.json +187 -0
  966. package/public/r/roadmap.json +28 -0
  967. package/public/r/sandbox-no-file-explorer.json +21 -0
  968. package/public/r/sandbox.json +21 -0
  969. package/public/r/scroll-area-both.json +19 -0
  970. package/public/r/scroll-area-demo.json +19 -0
  971. package/public/r/scroll-area-horizontal.json +19 -0
  972. package/public/r/scroll-area.json +15 -0
  973. package/public/r/select-demo.json +19 -0
  974. package/public/r/select-disabled.json +20 -0
  975. package/public/r/select-form.json +26 -0
  976. package/public/r/select-lg.json +19 -0
  977. package/public/r/select-multiple.json +19 -0
  978. package/public/r/select-native.json +12 -0
  979. package/public/r/select-sm.json +19 -0
  980. package/public/r/select-with-groups.json +19 -0
  981. package/public/r/select-without-alignment.json +19 -0
  982. package/public/r/select.json +15 -0
  983. package/public/r/separator-demo.json +19 -0
  984. package/public/r/separator.json +15 -0
  985. package/public/r/sheet-demo.json +23 -0
  986. package/public/r/sheet-position.json +20 -0
  987. package/public/r/sheet.json +18 -0
  988. package/public/r/sidebar-nav.json +22 -0
  989. package/public/r/silk.json +16 -0
  990. package/public/r/skeleton-demo.json +21 -0
  991. package/public/r/skeleton-only.json +19 -0
  992. package/public/r/skeleton.json +24 -0
  993. package/public/r/slider-demo.json +19 -0
  994. package/public/r/slider-form.json +27 -0
  995. package/public/r/slider-range.json +20 -0
  996. package/public/r/slider-vertical.json +20 -0
  997. package/public/r/slider-with-label-value.json +21 -0
  998. package/public/r/slider.json +15 -0
  999. package/public/r/snippet-npm.json +22 -0
  1000. package/public/r/snippet.json +21 -0
  1001. package/public/r/sonner.json +16 -0
  1002. package/public/r/spinner-customization.json +21 -0
  1003. package/public/r/spinner-variants.json +21 -0
  1004. package/public/r/spinner.json +20 -0
  1005. package/public/r/stats-card.json +22 -0
  1006. package/public/r/status-custom.json +21 -0
  1007. package/public/r/status.json +20 -0
  1008. package/public/r/stepper.json +15 -0
  1009. package/public/r/stories-avatars.json +21 -0
  1010. package/public/r/stories-images.json +21 -0
  1011. package/public/r/stories.json +21 -0
  1012. package/public/r/switch-card.json +22 -0
  1013. package/public/r/switch-demo.json +21 -0
  1014. package/public/r/switch-disabled.json +22 -0
  1015. package/public/r/switch-form.json +25 -0
  1016. package/public/r/switch-with-description.json +23 -0
  1017. package/public/r/switch.json +15 -0
  1018. package/public/r/table-demo.json +21 -0
  1019. package/public/r/table-framed.json +23 -0
  1020. package/public/r/table-simple.json +21 -0
  1021. package/public/r/table.json +21 -0
  1022. package/public/r/tabs-demo.json +19 -0
  1023. package/public/r/tabs-underline-vertical.json +20 -0
  1024. package/public/r/tabs-underline.json +19 -0
  1025. package/public/r/tabs-vertical.json +20 -0
  1026. package/public/r/tabs.json +15 -0
  1027. package/public/r/tags-create.json +21 -0
  1028. package/public/r/tags-filter.json +21 -0
  1029. package/public/r/tags.json +20 -0
  1030. package/public/r/template-auth-eight.json +28 -0
  1031. package/public/r/template-auth-five.json +28 -0
  1032. package/public/r/template-auth-four.json +29 -0
  1033. package/public/r/template-auth-nine.json +28 -0
  1034. package/public/r/template-auth-one.json +49 -0
  1035. package/public/r/template-auth-seven.json +29 -0
  1036. package/public/r/template-auth-six.json +28 -0
  1037. package/public/r/template-auth-three.json +49 -0
  1038. package/public/r/template-auth-two.json +44 -0
  1039. package/public/r/template-hero-eight.json +83 -0
  1040. package/public/r/template-hero-eleven.json +29 -0
  1041. package/public/r/template-hero-five.json +35 -0
  1042. package/public/r/template-hero-four.json +35 -0
  1043. package/public/r/template-hero-fourteen.json +101 -0
  1044. package/public/r/template-hero-nine.json +74 -0
  1045. package/public/r/template-hero-one.json +90 -0
  1046. package/public/r/template-hero-seven.json +83 -0
  1047. package/public/r/template-hero-six.json +83 -0
  1048. package/public/r/template-hero-ten.json +77 -0
  1049. package/public/r/template-hero-thirteen.json +101 -0
  1050. package/public/r/template-hero-three.json +35 -0
  1051. package/public/r/template-hero-twelve.json +30 -0
  1052. package/public/r/template-hero-two.json +96 -0
  1053. package/public/r/template-logo-cloud-five.json +68 -0
  1054. package/public/r/template-logo-cloud-four.json +71 -0
  1055. package/public/r/template-logo-cloud-one.json +89 -0
  1056. package/public/r/template-logo-cloud-three.json +71 -0
  1057. package/public/r/template-logo-cloud-two.json +74 -0
  1058. package/public/r/textarea-demo.json +19 -0
  1059. package/public/r/textarea-disabled.json +20 -0
  1060. package/public/r/textarea-form.json +25 -0
  1061. package/public/r/textarea-lg.json +19 -0
  1062. package/public/r/textarea-sm.json +19 -0
  1063. package/public/r/textarea-with-label.json +22 -0
  1064. package/public/r/textarea.json +15 -0
  1065. package/public/r/theme-switcher-uncontrolled.json +21 -0
  1066. package/public/r/theme-switcher.json +21 -0
  1067. package/public/r/ticker-currency.json +20 -0
  1068. package/public/r/ticker-inline.json +20 -0
  1069. package/public/r/ticker-percent.json +20 -0
  1070. package/public/r/ticker.json +20 -0
  1071. package/public/r/timeline.json +15 -0
  1072. package/public/r/toast-demo.json +20 -0
  1073. package/public/r/toast-heights.json +19 -0
  1074. package/public/r/toast-loading.json +21 -0
  1075. package/public/r/toast-promise.json +20 -0
  1076. package/public/r/toast-with-action.json +20 -0
  1077. package/public/r/toast-with-status.json +20 -0
  1078. package/public/r/toast.json +18 -0
  1079. package/public/r/toggle-demo.json +19 -0
  1080. package/public/r/toggle-disabled.json +20 -0
  1081. package/public/r/toggle-group-demo.json +20 -0
  1082. package/public/r/toggle-group-disabled.json +21 -0
  1083. package/public/r/toggle-group-lg.json +20 -0
  1084. package/public/r/toggle-group-multiple.json +20 -0
  1085. package/public/r/toggle-group-outline-with-separator.json +20 -0
  1086. package/public/r/toggle-group-outline.json +20 -0
  1087. package/public/r/toggle-group-sm.json +20 -0
  1088. package/public/r/toggle-group-with-disabled-item.json +21 -0
  1089. package/public/r/toggle-group.json +19 -0
  1090. package/public/r/toggle-icon-group.json +19 -0
  1091. package/public/r/toggle-lg.json +19 -0
  1092. package/public/r/toggle-outline.json +19 -0
  1093. package/public/r/toggle-sm.json +19 -0
  1094. package/public/r/toggle-with-icon.json +19 -0
  1095. package/public/r/toggle.json +15 -0
  1096. package/public/r/toolbar-demo.json +27 -0
  1097. package/public/r/toolbar.json +15 -0
  1098. package/public/r/tooltip-demo.json +21 -0
  1099. package/public/r/tooltip-grouped.json +22 -0
  1100. package/public/r/tooltip.json +15 -0
  1101. package/public/r/tree-controlled.json +21 -0
  1102. package/public/r/tree-custom-icons.json +21 -0
  1103. package/public/r/tree-no-lines.json +20 -0
  1104. package/public/r/tree-simple.json +20 -0
  1105. package/public/r/tree.json +20 -0
  1106. package/public/r/typography.json +21 -0
  1107. package/public/r/ui.json +57 -0
  1108. package/public/r/use-character-limit.json +12 -0
  1109. package/public/r/use-file-upload.json +12 -0
  1110. package/public/r/use-pagination.json +12 -0
  1111. package/public/r/use-slider-with-input.json +12 -0
  1112. package/public/r/use-toast.json +12 -0
  1113. package/public/r/utils.json +16 -0
  1114. package/public/r/video-player.json +21 -0
package/dist/index.js CHANGED
@@ -5,11 +5,11 @@ import { twMerge } from "tailwind-merge"
5
5
  export function cn(...inputs: ClassValue[]) {
6
6
  return twMerge(clsx(inputs))
7
7
  }
8
- `;function V(t){if(!t)return t;let e=t.split("/");return e[e.length-1]||t}function X(t){let e=t.trim();return e&&((e.startsWith("@/")||e.startsWith("~/"))&&(e=`src/${e.slice(2)}`),e.startsWith("/")&&(e=e.slice(1)),e=e.replace(/^\.\//,""),e=e.replace(/\/+$/,""),e)}function ot(t){return t.trim().replace(/\/+$/,"")}function k(t){return t.replace(/\.(?:ts|tsx|js|jsx)$/i,"")}function z(t){let e=k(t);return st.map(s=>`${e}${s}`)}function at(t){let e=t.replace(/\/+$/,"");return e==="src"||e.startsWith("src/")?"src":e==="app"||e.startsWith("app/")?"app":null}function G(t){let e=V(t);return e==="ui"?"love-ui":e}function ct(t){let e=t.loveui??{},s=typeof e.target=="string"?e.target.trim():"",n=e.category;if(s){let r=typeof e.includePackageName=="boolean"?e.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:r}}return n==="feature"?{base:"components",includePackageName:!0}:n==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function lt(t,e,s){let n=t.startsWith("src/")?t.slice(4):t;if(!e.includePackageName){let d=e.base.split("/").filter(Boolean),u=d[d.length-1];u&&n.startsWith(`${u}/`)&&(n=n.slice(u.length+1))}let c=`${(e.includePackageName?`${e.base}/${s}`:e.base).replace(/\/+/g,"/")}/${n}`.replace(/\/+/g,"/");return{cleanedPath:n,target:c}}async function ut(t){let e=a.join(t,"components.json");try{let s=await j(e,"utf8");return JSON.parse(s).aliases??null}catch{return null}}async function gt(t){let e=["tsconfig.json","jsconfig.json"].map(s=>a.join(t,s)).find(s=>p(s));if(!e)return null;try{let s=await j(e,"utf8"),r=JSON.parse(s).compilerOptions?.paths;return!r||typeof r!="object"?null:r}catch{return null}}function pt(t,e){if(typeof t=="string"){if(t.trim().startsWith("~/"))return"~/";if(t.trim().startsWith("@/"))return"@/"}if(e){if(Object.prototype.hasOwnProperty.call(e,"~/*"))return"~/";if(Object.prototype.hasOwnProperty.call(e,"@/*"))return"@/"}return"@/"}async function ft(t,e,s){if(e&&e.length>0)return e;let n=["src/components/ui","app/components/ui","components/ui"];for(let i of n)if(p(a.join(t,i)))return i.replace(/\/ui$/,"");let r=["src/components","app/components","components"];for(let i of r)if(p(a.join(t,i)))return i;if(s){let i=s["@/*"]??s["~/*"]??[];if(Array.isArray(i)&&i.some(c=>/^\.?\/?src\//.test(c)))return"src/components";if(Array.isArray(i)&&i.some(c=>/^\.?\/?app\//.test(c)))return"app/components"}return p(a.join(t,"src"))?"src/components":p(a.join(t,"app"))?"app/components":"components"}async function dt(t,e,s,n){let r=n?.utils??(n?.lib?`${n.lib.replace(/\/+$/,"")}/utils`:void 0);if(r&&r.trim().length>0){let u=k(ot(r)),f=k(X(r));for(let w of z(f))if(p(a.join(t,w)))return{utilsImportPath:u,utilsFilePath:w};return{utilsImportPath:u,utilsFilePath:`${f}.ts`}}let i=at(e),c=i?`${i}/lib/utils`:"lib/utils",d=Array.from(new Set([c,"src/lib/utils","app/lib/utils","lib/utils"]));for(let u of d)for(let f of z(u))if(p(a.join(t,f)))return{utilsImportPath:`${s}lib/utils`,utilsFilePath:f};return{utilsImportPath:`${s}lib/utils`,utilsFilePath:`${c}.ts`}}function M(t,e,s){let n=c=>{let d=c.startsWith("/"),u=c.endsWith("/"),f=c.split("/").filter(Boolean),w=[];for(let $ of f)w[w.length-1]!==$&&w.push($);let x=w.join("/");return`${d?"/":""}${x}${u?"/":""}`},r=e.replace(/\/+$/,""),i=t.replace(/^\.?\//,"");if(J.test(i))return n(s);if(i.startsWith("components/")){let c=i.slice(10);return n(`${r}${c}`.replace(/^\//,""))}if(i.startsWith("lib/")){if(r.startsWith("src/"))return n(`src/${i}`);if(r.startsWith("app/"))return n(`app/${i}`)}if(i.startsWith("hooks/")){if(r.startsWith("src/"))return n(`src/${i}`);if(r.startsWith("app/"))return n(`app/${i}`)}return i.startsWith("ui/")?n(`${r}/${i}`):n(i)}function _(t,e){let s=e.startsWith("~/")?"~/":"@/",n=t;return n=n.replace(/@\/registry\/building-blocks\/default\/components\//g,`${s}components/`),n=n.replace(/@\/registry\/building-blocks\/default\/ui\//g,`${s}components/ui/`),n=n.replace(/@\/registry\/building-blocks\/default\/lib\//g,`${s}lib/`),n=n.replace(/@\/registry\/building-blocks\/default\/hooks\//g,`${s}hooks/`),n=n.replace(/@\/registry\/default\/components\//g,`${s}components/`),n=n.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),n=n.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),n=n.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),n=n.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@loveui\/shadcn-ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@love-ui\/shadcn-ui\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']@\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["']~\/lib\/utils["']/g,`from "${e}"`),n=n.replace(/from\s+["'](?:\.\.\/)+ui\/src\/lib\/utils["']/g,`from "${e}"`),n}async function mt(t,e){if(p(a.join(t,e)))return!1;let s=rt,n=a.join(E,"love-ui","src","lib","utils.ts");if(p(n))try{s=await j(n,"utf8")}catch{}return await L(e,t),await A(a.join(t,e),s,"utf8"),!0}async function L(t,e){let s=a.dirname(a.join(e,t));await O(s,{recursive:!0})}async function ht(t,e){let s=a.join(t,"package.json"),n={};try{let u=await j(s,"utf8");n=JSON.parse(u)}catch{}let r=ct(n),i=V(e),c=[];async function d(u,f){let w=await q(u,{withFileTypes:!0});for(let x of w){if(nt.has(x.name))continue;let $=a.join(u,x.name);if(x.isDirectory()){await d($,f);continue}let P=a.extname(x.name);if(!et.has(P)||x.name==="package.json")continue;let g=a.relative(f,$).split(a.sep).join("/"),{target:v}=lt(g,r,i),R=await j($,"utf8");c.push({path:g,target:v,content:R})}}return await d(t,t),c}async function yt(t,e){let s=a.join(E,"love-ui"),n=a.join(s,"src","ui",`${t}.tsx`);if(!p(n))return null;try{let r=[],i=await j(n,"utf8");i=_(i,e),r.push({path:`src/ui/${t}.tsx`,target:`components/ui/${t}.tsx`,content:i});let c=a.join(s,"src","lib","utils.ts");if(p(c)){let d=await j(c,"utf8");r.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:d})}return r}catch(r){return console.warn(`Warning: unable to read ${t} component`,r),null}}async function bt(t,e){if(B.has(t))return await yt(t,e);let s=G(t),n=a.join(E,s);if(!p(n))return null;try{return await ht(n,t)}catch(r){return console.warn(`Warning: unable to read bundled sources for ${t}`,r),null}}var $t={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","tailwind-merge":"^3.3.1"};async function wt(t){if(B.has(t))return{...$t};let e=G(t),s=a.join(E,e,"package.json");try{let n=await j(s,"utf8");return JSON.parse(n).dependencies??{}}catch{return{}}}async function Pt(t){return p(a.join(t,"bun.lockb"))?"bun":p(a.join(t,"pnpm-lock.yaml"))?"pnpm":p(a.join(t,"yarn.lock"))?"yarn":"npm"}async function jt(t,e,s){let n=Object.entries(t);if(n.length===0)return!0;console.log(`
9
- Installing dependencies...`);let r=n.map(([d,u])=>`${d}@${u}`),i;switch(e){case"bun":i=`bun add ${r.join(" ")}`;break;case"pnpm":i=`pnpm add ${r.join(" ")}`;break;case"yarn":i=`yarn add ${r.join(" ")}`;break;default:i=`npm install ${r.join(" ")}`}let c=Y(i,{stdio:"inherit",shell:!0,cwd:s});return c.error||c.status!==0?(console.warn(`
8
+ `;function V(e){if(!e)return e;let n=e.split("/");return n[n.length-1]||e}function X(e){let n=e.trim();return n&&((n.startsWith("@/")||n.startsWith("~/"))&&(n=`src/${n.slice(2)}`),n.startsWith("/")&&(n=n.slice(1)),n=n.replace(/^\.\//,""),n=n.replace(/\/+$/,""),n)}function ot(e){return e.trim().replace(/\/+$/,"")}function k(e){return e.replace(/\.(?:ts|tsx|js|jsx)$/i,"")}function z(e){let n=k(e);return st.map(s=>`${n}${s}`)}function at(e){let n=e.replace(/\/+$/,"");return n==="src"||n.startsWith("src/")?"src":n==="app"||n.startsWith("app/")?"app":null}function G(e){let n=V(e);return n==="ui"?"love-ui":n}function ct(e){let n=e.loveui??{},s=typeof n.target=="string"?n.target.trim():"",t=n.category;if(s){let r=typeof n.includePackageName=="boolean"?n.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:r}}return t==="feature"?{base:"components",includePackageName:!0}:t==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}}function lt(e,n,s){let t=e.startsWith("src/")?e.slice(4):e;if(!n.includePackageName){let d=n.base.split("/").filter(Boolean),u=d[d.length-1];u&&t.startsWith(`${u}/`)&&(t=t.slice(u.length+1))}let c=`${(n.includePackageName?`${n.base}/${s}`:n.base).replace(/\/+/g,"/")}/${t}`.replace(/\/+/g,"/");return{cleanedPath:t,target:c}}async function ut(e){let n=a.join(e,"components.json");try{let s=await j(n,"utf8");return JSON.parse(s).aliases??null}catch{return null}}async function gt(e){let n=["tsconfig.json","jsconfig.json"].map(s=>a.join(e,s)).find(s=>p(s));if(!n)return null;try{let s=await j(n,"utf8"),r=JSON.parse(s).compilerOptions?.paths;return!r||typeof r!="object"?null:r}catch{return null}}function pt(e,n){if(typeof e=="string"){if(e.trim().startsWith("~/"))return"~/";if(e.trim().startsWith("@/"))return"@/"}if(n){if(Object.prototype.hasOwnProperty.call(n,"~/*"))return"~/";if(Object.prototype.hasOwnProperty.call(n,"@/*"))return"@/"}return"@/"}async function ft(e,n,s){if(n&&n.length>0)return n;let t=["src/components/ui","app/components/ui","components/ui"];for(let i of t)if(p(a.join(e,i)))return i.replace(/\/ui$/,"");let r=["src/components","app/components","components"];for(let i of r)if(p(a.join(e,i)))return i;if(s){let i=s["@/*"]??s["~/*"]??[];if(Array.isArray(i)&&i.some(c=>/^\.?\/?src\//.test(c)))return"src/components";if(Array.isArray(i)&&i.some(c=>/^\.?\/?app\//.test(c)))return"app/components"}return p(a.join(e,"src"))?"src/components":p(a.join(e,"app"))?"app/components":"components"}async function dt(e,n,s,t){let r=t?.utils??(t?.lib?`${t.lib.replace(/\/+$/,"")}/utils`:void 0);if(r&&r.trim().length>0){let u=k(ot(r)),f=k(X(r));for(let w of z(f))if(p(a.join(e,w)))return{utilsImportPath:u,utilsFilePath:w};return{utilsImportPath:u,utilsFilePath:`${f}.ts`}}let i=at(n),c=i?`${i}/lib/utils`:"lib/utils",d=Array.from(new Set([c,"src/lib/utils","app/lib/utils","lib/utils"]));for(let u of d)for(let f of z(u))if(p(a.join(e,f)))return{utilsImportPath:`${s}lib/utils`,utilsFilePath:f};return{utilsImportPath:`${s}lib/utils`,utilsFilePath:`${c}.ts`}}function M(e,n,s){let t=c=>{let d=c.startsWith("/"),u=c.endsWith("/"),f=c.split("/").filter(Boolean),w=[];for(let $ of f)w[w.length-1]!==$&&w.push($);let x=w.join("/");return`${d?"/":""}${x}${u?"/":""}`},r=n.replace(/\/+$/,""),i=e.replace(/^\.?\//,"");if(J.test(i))return t(s);if(i.startsWith("components/")){let c=i.slice(10);return t(`${r}${c}`.replace(/^\//,""))}if(i.startsWith("lib/")){if(r.startsWith("src/"))return t(`src/${i}`);if(r.startsWith("app/"))return t(`app/${i}`)}if(i.startsWith("hooks/")){if(r.startsWith("src/"))return t(`src/${i}`);if(r.startsWith("app/"))return t(`app/${i}`)}return i.startsWith("ui/")?t(`${r}/${i}`):t(i)}function _(e,n){let s=n.startsWith("~/")?"~/":"@/",t=e;return t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@loveui\/ui\/ui\//g,`${s}components/ui/`),t=t.replace(/@loveui\/ui\/lib\//g,`${s}lib/`),t=t.replace(/@\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/building-blocks\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/building-blocks\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/building-blocks\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/@\/registry\/default\/components\//g,`${s}components/`),t=t.replace(/@\/registry\/default\/ui\//g,`${s}components/ui/`),t=t.replace(/@\/registry\/default\/lib\//g,`${s}lib/`),t=t.replace(/@\/registry\/default\/hooks\//g,`${s}hooks/`),t=t.replace(/from\s+["']@loveui\/ui\/lib\/utils["']/g,`from "${n}"`),t=t.replace(/from\s+["']@loveui\/shadcn-ui\/lib\/utils["']/g,`from "${n}"`),t=t.replace(/from\s+["']@love-ui\/shadcn-ui\/lib\/utils["']/g,`from "${n}"`),t=t.replace(/from\s+["']@\/lib\/utils["']/g,`from "${n}"`),t=t.replace(/from\s+["']~\/lib\/utils["']/g,`from "${n}"`),t=t.replace(/from\s+["'](?:\.\.\/)+ui\/src\/lib\/utils["']/g,`from "${n}"`),t}async function mt(e,n){if(p(a.join(e,n)))return!1;let s=rt,t=a.join(E,"love-ui","src","lib","utils.ts");if(p(t))try{s=await j(t,"utf8")}catch{}return await L(n,e),await A(a.join(e,n),s,"utf8"),!0}async function L(e,n){let s=a.dirname(a.join(n,e));await O(s,{recursive:!0})}async function ht(e,n){let s=a.join(e,"package.json"),t={};try{let u=await j(s,"utf8");t=JSON.parse(u)}catch{}let r=ct(t),i=V(n),c=[];async function d(u,f){let w=await q(u,{withFileTypes:!0});for(let x of w){if(nt.has(x.name))continue;let $=a.join(u,x.name);if(x.isDirectory()){await d($,f);continue}let P=a.extname(x.name);if(!et.has(P)||x.name==="package.json")continue;let g=a.relative(f,$).split(a.sep).join("/"),{target:v}=lt(g,r,i),R=await j($,"utf8");c.push({path:g,target:v,content:R})}}return await d(e,e),c}async function yt(e,n){let s=a.join(E,"love-ui"),t=a.join(s,"src","ui",`${e}.tsx`);if(!p(t))return null;try{let r=[],i=await j(t,"utf8");i=_(i,n),r.push({path:`src/ui/${e}.tsx`,target:`components/ui/${e}.tsx`,content:i});let c=a.join(s,"src","lib","utils.ts");if(p(c)){let d=await j(c,"utf8");r.push({path:"src/lib/utils.ts",target:"lib/utils.ts",content:d})}return r}catch(r){return console.warn(`Warning: unable to read ${e} component`,r),null}}async function bt(e,n){if(B.has(e))return await yt(e,n);let s=G(e),t=a.join(E,s);if(!p(t))return null;try{return await ht(t,e)}catch(r){return console.warn(`Warning: unable to read bundled sources for ${e}`,r),null}}var $t={"@base-ui-components/react":"1.0.0-beta.4","class-variance-authority":"^0.7.1",clsx:"^2.1.1","tailwind-merge":"^3.3.1"};async function wt(e){if(B.has(e))return{...$t};let n=G(e),s=a.join(E,n,"package.json");try{let t=await j(s,"utf8");return JSON.parse(t).dependencies??{}}catch{return{}}}async function Pt(e){return p(a.join(e,"bun.lockb"))?"bun":p(a.join(e,"pnpm-lock.yaml"))?"pnpm":p(a.join(e,"yarn.lock"))?"yarn":"npm"}async function jt(e,n,s){let t=Object.entries(e);if(t.length===0)return!0;console.log(`
9
+ Installing dependencies...`);let r=t.map(([d,u])=>`${d}@${u}`),i;switch(n){case"bun":i=`bun add ${r.join(" ")}`;break;case"pnpm":i=`pnpm add ${r.join(" ")}`;break;case"yarn":i=`yarn add ${r.join(" ")}`;break;default:i=`npm install ${r.join(" ")}`}let c=Y(i,{stdio:"inherit",shell:!0,cwd:s});return c.error||c.status!==0?(console.warn(`
10
10
  Failed to install dependencies. You may need to install them manually:`),console.warn(` ${r.join(`
11
11
  `)}`),!1):(console.log(`Dependencies installed successfully!
12
- `),!0)}async function xt(t=process.argv.slice(2)){(t.length===0||t.length===1&&(t[0]==="--version"||t[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(t.length<2||t[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui --version"),process.exit(1));let e=t.slice(1),s=process.cwd(),n=await ut(s),r=await gt(s),i=n?.components?X(n.components):null,c=await ft(s,i,r),d=pt(n?.components,r),{utilsImportPath:u,utilsFilePath:f}=await dt(s,c,d,n),w=await Pt(s),x=c.endsWith("/ui")?c:`${c}/ui`;await O(a.join(s,c),{recursive:!0}),await O(a.join(s,x),{recursive:!0});let $={};for(let P of e){if(!P.trim())continue;console.log(`
12
+ `),!0)}async function xt(e=process.argv.slice(2)){(e.length===0||e.length===1&&(e[0]==="--version"||e[0]==="-v"))&&(console.log("love-ui version 1.1.9"),process.exit(0)),(e.length<2||e[0]!=="add")&&(console.log("Usage: npx love-ui add [...packages]"),console.log(" npx love-ui --version"),process.exit(1));let n=e.slice(1),s=process.cwd(),t=await ut(s),r=await gt(s),i=t?.components?X(t.components):null,c=await ft(s,i,r),d=pt(t?.components,r),{utilsImportPath:u,utilsFilePath:f}=await dt(s,c,d,t),w=await Pt(s),x=c.endsWith("/ui")?c:`${c}/ui`;await O(a.join(s,c),{recursive:!0}),await O(a.join(s,x),{recursive:!0});let $={};for(let P of n){if(!P.trim())continue;console.log(`
13
13
  Adding ${P}...`);let g=null,v=null;if(P.startsWith("http://")||P.startsWith("https://")){let o=P;o.includes("/building-blocks/r/")&&(o=o.replace("/building-blocks/r/","/building-blocks/"),console.log(`Auto-corrected URL to: ${o}`));try{let l=await fetch(o);l.ok?g=await l.json():console.warn(`Failed to fetch ${o}: HTTP ${l.status}`)}catch(l){console.warn(`Failed to fetch from ${o}:`,l)}}else{let o=new URL(`r/${P}.json`,"https://www.loveui.dev/");try{let l=await fetch(o);l.ok&&(g=await l.json())}catch{}v=await bt(P,u)}let R=v??g?.files??[];R=R.map(o=>{let l=o.target||o.path;return l.startsWith("registry/default/")&&(l=l.replace("registry/default/","")),{...o,target:l}});let F=R.find(o=>o.target.match(/^components\/comp-\d+\.tsx$/));if(F){let o=R.filter(l=>l.target.match(/^components\/[^/]+\//)&&l.target!==F.target);if(o.length>0&&o[0]){let l=o[0].target.match(/^components\/([^/]+)\//);if(l&&l[1]){let m=l[1];F.target=`components/${m}-demo.tsx`}}else if(g?.meta?.tags&&Array.isArray(g.meta.tags)&&g.meta.tags.length>0){let m=g.meta.tags.slice(0,2).filter(y=>y.length>0);if(m.length>0){let y=m.join("-").toLowerCase().replace(/\s+/g,"-");F.target=`components/${y}.tsx`}}}if(!R.length){console.warn(`Component "${P}" not found. Available components can be found at https://loveui.dev`);continue}R.some(o=>J.test(o.target)||typeof o.content=="string"&&it.test(o.content))&&await mt(s,f);let T=0,C=0;for(let o of R){if(!o.content)continue;let l=M(o.target,c,f),m=a.join(s,l),y=p(m);if(k(l)===k(f)&&y)continue;let D=_(o.content,u);if(y)try{if(await j(m,"utf8")===D)continue}catch{}await L(l,s),await A(m,D,"utf8"),y?C++:T++}if(T>0&&console.log(`\u2713 Created ${T} file${T>1?"s":""}`),C>0&&console.log(`\u2713 Updated ${C} file${C>1?"s":""}`),g?.registryDependencies&&g.registryDependencies.length>0){console.log(`
14
14
  Installing ${g.registryDependencies.length} required component${g.registryDependencies.length>1?"s":""}...`);for(let o of g.registryDependencies){let l=o;o.startsWith("https://loveui.dev/building-blocks/r/")&&(l=`https://ui.loveui.dev/ui/r/${o.split("/").pop()}`);try{let m=await fetch(l);if(m.ok){let y=await m.json(),D=(y?.files??[]).map(h=>{let b=h.target||h.path;return b.startsWith("registry/default/")&&(b=b.replace("registry/default/","")),{...h,target:b}});for(let h of D){if(!h.content)continue;let b=M(h.target,c,f),W=a.join(s,b),N=p(W);if(k(b)===k(f)&&N)continue;let I=_(h.content,u);if(N)try{if(await j(W,"utf8")===I)continue}catch{}await L(b,s),await A(W,I,"utf8")}let S=["@loveui/shadcn-ui","jotai","lucide-react","react","react-dom"];if(y?.dependencies)if(Array.isArray(y.dependencies))y.dependencies.forEach(h=>{S.includes(h)||($[h]="latest")});else{let h=y.dependencies;Object.keys(h).forEach(b=>{!S.includes(b)&&h[b]&&($[b]=h[b])})}}else console.warn(` \u2717 Failed to fetch ${l}: HTTP ${m.status}`)}catch(m){console.warn(` \u2717 Failed to install ${l}:`,m.message)}}console.log("\u2713 Installed registry dependencies")}let U={};g?.dependencies?Array.isArray(g.dependencies)?g.dependencies.forEach(o=>{U[o]="latest"}):U=g.dependencies:U=await wt(P),Object.assign($,U)}Object.keys($).length>0&&await jt($,w,s),console.log(`
15
- \u2713 Done! You can now import and use the components in your app.`)}var Rt=process.argv[1]&&(import.meta.url===K(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));Rt&&xt().catch(t=>{console.error(t),process.exit(1)});export{xt as run};
15
+ \u2713 Done! You can now import and use the components in your app.`)}var Rt=process.argv[1]&&(import.meta.url===K(process.argv[1]).href||process.argv[1].includes("love-ui")||process.argv[1].includes("loveui"));Rt&&xt().catch(e=>{console.error(e),process.exit(1)});export{xt as run};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{constants as xe}from"fs";import{access as Te,readFile as Q}from"fs/promises";import l from"path";import{fileURLToPath as _e}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as u,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as p,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.10",private:!1,license:"AGPL-3.0-or-later",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","packages","*.ts","*.tsx","*.css","*.mdx"],main:"packages/love-ui/index.ts",types:"packages/love-ui/index.ts",exports:{".":{import:"./packages/love-ui/index.ts",require:"./packages/love-ui/index.ts"},"./lib/*":"./packages/love-ui/*","./components/*":"./packages/love-ui/components/*","./shadcn-ui/*":"./packages/shadcn-ui/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-packages.mjs",clean:"rimraf dist packages"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as me}from"fs";import{access as ue,readFile as U,readdir as q}from"fs/promises";import x,{extname as W,join as j,relative as ge}from"path";import{fileURLToPath as ye}from"url";import z from"postcss";import fe from"postcss-nested";var he=x.dirname(ye(import.meta.url)),ve=x.resolve(he,".."),G=x.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),ke=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),Se=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),Ee=e=>e.replace(/\\/g,"/"),H=async(e,t,n)=>{let s=await q(e,{withFileTypes:!0});for(let i of s){let o=j(e,i.name);if(i.isDirectory()){if(we.has(i.name))continue;await H(o,t,n);continue}let a=W(i.name);!Re.has(a)||ke.has(i.name)||i.name.endsWith(".d.ts")||i.name.endsWith(".test.ts")||i.name.endsWith(".test.tsx")||i.name.endsWith(".stories.tsx")||n.push({absolute:o,relative:Ee(ge(t,o))})}},Ie=(e,t)=>{let n=e.loveui??{},s=typeof n.target=="string"?n.target.trim():"",i=n.category;if(s.length>0){let o=typeof n.includePackageName=="boolean"?n.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:o}}return i==="feature"?{base:"components",includePackageName:!0}:i==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},De=e=>{let n=(e.loveui??{}).type;return typeof n=="string"&&n.trim().length>0?n:"registry:ui"},Pe=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},b=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),be=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),je=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),J=async()=>(await q(G,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!Se.has(t)).sort((t,n)=>t.localeCompare(n)),K=async e=>{let t=j(G,e),n=j(t,"package.json");if(!await Pe(n))throw new Error(`Missing package.json for ${e}`);let s=JSON.parse(await U(n,"utf8")),i=De(s),o=Object.keys(s.dependencies??{}),a=Object.keys(s.peerDependencies??{}),N=Object.keys(s.devDependencies??{}),oe=new Set([...o,...a,...N].filter(b).filter(r=>!je.has(r))),O=[...new Set([...o,...a].filter(r=>!b(r)))],A=[...new Set(N.filter(r=>!b(r)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(r)))],S=[];for(let r of oe){let h=be(r);S.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await H(t,t,C);let f=[],d={},g=Ie(s,e);for(let r of C){let h=await U(r.absolute,"utf8"),E=W(r.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await z([fe]).process(h,{from:void 0});z.parse(v.css).walkAtRules("layer",I=>{let D=`@layer ${I.params}`;d[D]??={},I.walkRules(c=>{if(c.parent&&c.parent.type==="atrule"&&c.parent.name==="media")return;let R=c.selector,m={};c.walkDecls(k=>{m[k.prop]=k.value}),Object.keys(m).length>0&&(d[D][R]=m)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,m=d[D];m[R]??={};let k=m[R];c.walkRules(L=>{let pe=L.selector,P={};L.walkDecls($=>{P[$.prop]=$.value}),Object.keys(P).length>0&&(k[pe]=P)})})});continue}let y=r.relative.startsWith("src/")?r.relative.slice(4):r.relative;if(!g.includePackageName){let v=g.base.split("/").filter(Boolean),w=v[v.length-1];w&&y.startsWith(`${w}/`)&&(y=y.slice(w.length+1))}let ce=e.includes("/")?e.split("/").pop()??e:e,le=(g.includePackageName?`${g.base}/${ce}`:g.base).replace(/\/+$/,"");f.push({type:i,path:y,target:`${le}/${y}`.replace(/\/+/g,"/"),content:h})}let ae=!f.length&&Object.keys(d).length>0?"registry:style":i;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:ae,title:s.title??e,description:s.description,author:s.author??"Connor Love <hello@loveconnor.com>",dependencies:O.length?O:void 0,devDependencies:A.length?A:void 0,registryDependencies:S.length?Array.from(new Set(S)):void 0,files:f.length?f:void 0,css:Object.keys(d).length?d:void 0}};var _="loveui://registry/",Ue="loveui://registry/{package}",M="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),ze=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),qe=e=>`${_}${e}`,We=l.dirname(_e(import.meta.url)),X=l.resolve(We,".."),Ge=[l.join(X,"public","r"),l.resolve(X,"..","..","apps","ui","public","r"),l.resolve(process.cwd(),"apps","ui","public","r")],te=async e=>{try{return await Te(e,xe.R_OK),!0}catch{return!1}},ne=e=>ze.some(t=>e.startsWith(t)),He=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),se=e=>Array.isArray(e)?e.filter(t=>typeof t=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let t=Array.from(new Set(se(e).filter(n=>!ne(n)&&!ee.has(n))));return t.length>0?t:void 0},Je=e=>{let t=Array.from(new Set(se(e).map(n=>n.trim()).filter(Boolean).filter(n=>!ee.has(n)).map(n=>ne(n)?`https://www.loveui.dev/r/${He(n)}.json`:n)));return t.length>0?t:void 0},ie=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Ke=e=>{let t=ie(e);if(Z.has(t))throw new p(u.InvalidParams,`${t} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return t},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let t={...e},n=B(t.dependencies),s=B(t.devDependencies),i=Je(t.registryDependencies),o=typeof t.name=="string"&&t.name.trim().length>0?t.name.trim():"<component>",a={...t,mcpHints:{installPattern:"npx love-ui add <component>",installCommand:`npx love-ui add ${o}`,neverInstall:["@loveui/*","@love-ui/*","@repo/*","@loveui/shadcn-ui"]}};return n?a.dependencies=n:delete a.dependencies,s?a.devDependencies=s:delete a.devDependencies,i?a.registryDependencies=i:delete a.registryDependencies,a},T=null,re=async()=>(T||(T=(async()=>{for(let e of Ge){let t=l.join(e,"registry.json");if(await te(t))try{let n=JSON.parse(await Q(t,"utf8")),s=Array.from(new Set((n.items??[]).map(i=>i.name?.trim()).filter(i=>!!i))).sort((i,o)=>i.localeCompare(o));if(s.length===0)continue;return{dir:e,names:s,nameSet:new Set(s)}}catch{continue}}return null})()),T),Me=async()=>{let[e,t]=await Promise.all([re(),J()]),n=new Set(t);for(let s of e?.names??[])n.add(s);return Array.from(n).map(s=>ie(s)).filter(s=>!Z.has(s)).sort((s,i)=>s.localeCompare(i))},Xe=async e=>{let t=await re();if(!t||!t.nameSet.has(e))return null;let n=l.join(t.dir,`${e}.json`);return await te(n)?JSON.parse(await Q(n,"utf8")):null},Be=e=>{if(!e.startsWith(_))throw new p(u.InvalidParams,`Unsupported resource URI: ${e}`);let t=decodeURIComponent(e.slice(_.length)).trim();if(!t)throw new p(u.InvalidParams,"Package name is required.");return t},V=async e=>{try{let t=Ke(e),n=await Xe(t);return Y(n||await K(t))}catch(t){throw t instanceof p?t:new p(u.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ye(){let e=new Ne({name:"loveui-mcp",version:F.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(Le,async()=>({resources:(await Me()).map(s=>({uri:qe(s),name:s,description:`loveui registry definition for ${s}`,mimeType:"application/json"}))})),e.setRequestHandler(Ce,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Ue,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(Fe,async n=>{let s=Be(n.params.uri),i=await V(s);return{contents:[{uri:n.params.uri,mimeType:"application/json",text:JSON.stringify(i,null,2)}]}}),e.setRequestHandler($e,async()=>({tools:[{name:M,description:"Fetch a loveui registry definition by package name. Always install with `npx love-ui add <component>` and never install @loveui/* packages directly.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ae,async n=>{if(n.params.name!==M)throw new p(u.InvalidParams,`Tool ${n.params.name} not found`);let s=n.params.arguments?.name;if(typeof s!="string"||s.trim()==="")throw new p(u.InvalidParams,"Package name is required.");let i=await V(s.trim());return{content:[{type:"text",text:JSON.stringify(i,null,2)}]}});let t=new Oe;await e.connect(t)}Ye().catch(e=>{console.error(e),process.exit(1)});
2
+ import{constants as xe}from"fs";import{access as Te,readFile as Q}from"fs/promises";import p from"path";import{fileURLToPath as _e}from"url";import{Server as Ne}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as Oe}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as Ae,ErrorCode as d,ListResourceTemplatesRequestSchema as Ce,ListResourcesRequestSchema as Le,ListToolsRequestSchema as $e,McpError as l,ReadResourceRequestSchema as Fe}from"@modelcontextprotocol/sdk/types.js";var F={name:"love-ui",version:"1.2.12",private:!1,license:"AGPL-3.0-or-later",type:"module",bin:{loveui:"dist/index.js","love-ui":"dist/index.js","loveui-mcp":"dist/mcp-server.js"},files:["dist","packages","public","*.ts","*.tsx","*.css","*.mdx"],main:"packages/love-ui/index.ts",types:"packages/love-ui/index.ts",exports:{".":{import:"./packages/love-ui/index.ts",require:"./packages/love-ui/index.ts"},"./lib/*":"./packages/love-ui/*","./components/*":"./packages/love-ui/components/*","./shadcn-ui/*":"./packages/shadcn-ui/*","./package.json":"./package.json"},dependencies:{"@modelcontextprotocol/sdk":"^1.18.1",postcss:"^8.5.6","postcss-nested":"^7.0.2"},scripts:{build:"tsup",postbuild:"node ./scripts/copy-packages.mjs && node ./scripts/verify-registry.mjs","verify:registry":"node ./scripts/verify-registry.mjs",clean:"rimraf dist packages"},devDependencies:{"@types/node":"^20.14.10",rimraf:"^6.0.1",tsup:"^8.5.0"}};import{constants as me}from"fs";import{access as ue,readFile as U,readdir as W}from"fs/promises";import x,{extname as q,join as j,relative as ge}from"path";import{fileURLToPath as ye}from"url";import z from"postcss";import fe from"postcss-nested";var he=x.dirname(ye(import.meta.url)),ve=x.resolve(he,".."),G=x.join(ve,"packages"),we=new Set([".turbo",".next",".git","dist","build","storybook-static","node_modules","__tests__","__mocks__","coverage"]),Re=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".css",".scss",".sass",".mdx"]),ke=new Set(["package.json","tsconfig.json","tsconfig.build.json","tsconfig.test.json","README.md",".DS_Store"]),Se=new Set(["shadcn-ui","typescript-config","patterns","loveui","love-ui"]),Ee=e=>e.replace(/\\/g,"/"),H=async(e,n,t)=>{let s=await W(e,{withFileTypes:!0});for(let r of s){let o=j(e,r.name);if(r.isDirectory()){if(we.has(r.name))continue;await H(o,n,t);continue}let a=q(r.name);!Re.has(a)||ke.has(r.name)||r.name.endsWith(".d.ts")||r.name.endsWith(".test.ts")||r.name.endsWith(".test.tsx")||r.name.endsWith(".stories.tsx")||t.push({absolute:o,relative:Ee(ge(n,o))})}},Ie=(e,n)=>{let t=e.loveui??{},s=typeof t.target=="string"?t.target.trim():"",r=t.category;if(s.length>0){let o=typeof t.includePackageName=="boolean"?t.includePackageName:!1;return{base:s.replace(/\/+$/,""),includePackageName:o}}return r==="feature"?{base:"components",includePackageName:!0}:r==="block"?{base:"components/blocks",includePackageName:!0}:{base:"components/ui",includePackageName:!0}},De=e=>{let t=(e.loveui??{}).type;return typeof t=="string"&&t.trim().length>0?t:"registry:ui"},Pe=async e=>{try{return await ue(e,me.F_OK),!0}catch{return!1}},b=e=>e.startsWith("@loveui/")||e.startsWith("@love-ui/")||e.startsWith("@repo/"),be=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),je=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),M=async()=>(await W(G,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).filter(n=>!Se.has(n)).sort((n,t)=>n.localeCompare(t)),J=async e=>{let n=j(G,e),t=j(n,"package.json");if(!await Pe(t))throw new Error(`Missing package.json for ${e}`);let s=JSON.parse(await U(t,"utf8")),r=De(s),o=Object.keys(s.dependencies??{}),a=Object.keys(s.peerDependencies??{}),N=Object.keys(s.devDependencies??{}),oe=new Set([...o,...a,...N].filter(b).filter(i=>!je.has(i))),O=[...new Set([...o,...a].filter(i=>!b(i)))],A=[...new Set(N.filter(i=>!b(i)&&!["@loveui/typescript-config","@types/react","@types/react-dom","typescript"].includes(i)))],S=[];for(let i of oe){let h=be(i);S.push(`https://www.loveui.dev/r/${h}.json`)}let C=[];await H(n,n,C);let f=[],m={},g=Ie(s,e);for(let i of C){let h=await U(i.absolute,"utf8"),E=q(i.absolute);if(E===".css"||E===".scss"||E===".sass"){let v=await z([fe]).process(h,{from:void 0});z.parse(v.css).walkAtRules("layer",I=>{let D=`@layer ${I.params}`;m[D]??={},I.walkRules(c=>{if(c.parent&&c.parent.type==="atrule"&&c.parent.name==="media")return;let R=c.selector,u={};c.walkDecls(k=>{u[k.prop]=k.value}),Object.keys(u).length>0&&(m[D][R]=u)}),I.walkAtRules("media",c=>{let R=`@media ${c.params}`,u=m[D];u[R]??={};let k=u[R];c.walkRules(L=>{let pe=L.selector,P={};L.walkDecls($=>{P[$.prop]=$.value}),Object.keys(P).length>0&&(k[pe]=P)})})});continue}let y=i.relative.startsWith("src/")?i.relative.slice(4):i.relative;if(!g.includePackageName){let v=g.base.split("/").filter(Boolean),w=v[v.length-1];w&&y.startsWith(`${w}/`)&&(y=y.slice(w.length+1))}let ce=e.includes("/")?e.split("/").pop()??e:e,le=(g.includePackageName?`${g.base}/${ce}`:g.base).replace(/\/+$/,"");f.push({type:r,path:y,target:`${le}/${y}`.replace(/\/+/g,"/"),content:h})}let ae=!f.length&&Object.keys(m).length>0?"registry:style":r;return{$schema:"https://ui.shadcn.com/schema/registry-item.json",name:e,type:ae,title:s.title??e,description:s.description,author:s.author??"Connor Love <hello@loveconnor.com>",dependencies:O.length?O:void 0,devDependencies:A.length?A:void 0,registryDependencies:S.length?Array.from(new Set(S)):void 0,files:f.length?f:void 0,css:Object.keys(m).length?m:void 0}};var _="loveui://registry/",Ue="loveui://registry/{package}",K="get-loveui-package",Z=new Set(["shadcn-ui","typescript-config","eslint-config","patterns","loveui","love-ui"]),ze=["@loveui/","@love-ui/","@repo/"],ee=new Set(["@loveui/shadcn-ui","@love-ui/shadcn-ui"]),We=e=>`${_}${e}`,qe=p.dirname(_e(import.meta.url)),X=p.resolve(qe,".."),Ge=[p.join(X,"public","r"),p.resolve(X,"..","..","apps","ui","public","r"),p.resolve(process.cwd(),"apps","ui","public","r")],te=async e=>{try{return await Te(e,xe.R_OK),!0}catch{return!1}},ne=e=>ze.some(n=>e.startsWith(n)),He=e=>e.replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),se=e=>Array.isArray(e)?e.filter(n=>typeof n=="string"):e&&typeof e=="object"?Object.keys(e):[],B=e=>{let n=Array.from(new Set(se(e).filter(t=>!ne(t)&&!ee.has(t))));return n.length>0?n:void 0},Me=e=>{let n=Array.from(new Set(se(e).map(t=>t.trim()).filter(Boolean).filter(t=>!ee.has(t)).map(t=>ne(t)?`https://www.loveui.dev/r/${He(t)}.json`:t)));return n.length>0?n:void 0},re=e=>e.trim().replace(/^@repo\//,"").replace(/^@loveui\//,"").replace(/^@love-ui\//,""),Je=e=>{let n=re(e);if(Z.has(n))throw new l(d.InvalidParams,`${n} is an internal package and should not be used directly. Use \`npx love-ui add <component>\` with a public component name.`);return n},Y=e=>{if(!e||typeof e!="object")return{mcpHints:{installPattern:"npx love-ui add <component>",neverInstall:["@loveui/*","@love-ui/*","@repo/*"]}};let n={...e},t=B(n.dependencies),s=B(n.devDependencies),r=Me(n.registryDependencies),o=typeof n.name=="string"&&n.name.trim().length>0?n.name.trim():"<component>",a={...n,mcpHints:{installPattern:"npx love-ui add <component>",installCommand:`npx love-ui add ${o}`,neverInstall:["@loveui/*","@love-ui/*","@repo/*","@loveui/shadcn-ui"]}};return t?a.dependencies=t:delete a.dependencies,s?a.devDependencies=s:delete a.devDependencies,r?a.registryDependencies=r:delete a.registryDependencies,a},T=null,ie=async()=>(T||(T=(async()=>{for(let e of Ge){let n=p.join(e,"registry.json");if(await te(n))try{let t=JSON.parse(await Q(n,"utf8")),s=Array.from(new Set((t.items??[]).map(r=>r.name?.trim()).filter(r=>!!r))).sort((r,o)=>r.localeCompare(o));if(s.length===0)continue;return{dir:e,names:s,nameSet:new Set(s)}}catch{continue}}return null})()),T),Ke=async()=>{let[e,n]=await Promise.all([ie(),M()]),t=new Set(n);for(let s of e?.names??[])t.add(s);return Array.from(t).map(s=>re(s)).filter(s=>!Z.has(s)).sort((s,r)=>s.localeCompare(r))},Xe=async e=>{let n=await ie();if(!n||!n.nameSet.has(e))return null;let t=p.join(n.dir,`${e}.json`);return await te(t)?JSON.parse(await Q(t,"utf8")):null},Be=e=>{if(!e.startsWith(_))throw new l(d.InvalidParams,`Unsupported resource URI: ${e}`);let n=decodeURIComponent(e.slice(_.length)).trim();if(!n)throw new l(d.InvalidParams,"Package name is required.");return n},V=async e=>{let n=Je(e);try{let t=await Xe(n);return Y(t||await J(n))}catch(t){throw t instanceof l?t:t instanceof Error&&t.message.startsWith(`Missing package.json for ${n}`)?new l(d.InvalidParams,`Registry item "${n}" was not found. Call resources/list and use an exact item name from the registry.`):new l(d.InvalidParams,t instanceof Error?t.message:String(t))}};async function Ye(){let e=new Ne({name:"loveui-mcp",version:F.version??"0.0.0"},{capabilities:{resources:{listChanged:!0},tools:{listChanged:!0}}});e.setRequestHandler(Le,async()=>({resources:(await Ke()).map(s=>({uri:We(s),name:s,description:`loveui registry definition for ${s}`,mimeType:"application/json"}))})),e.setRequestHandler(Ce,async()=>({resourceTemplates:[{name:"loveui-registry",uriTemplate:Ue,description:"loveui registry definitions by package name",mimeType:"application/json"}]})),e.setRequestHandler(Fe,async t=>{let s=Be(t.params.uri),r=await V(s);return{contents:[{uri:t.params.uri,mimeType:"application/json",text:JSON.stringify(r,null,2)}]}}),e.setRequestHandler($e,async()=>({tools:[{name:K,description:"Fetch a loveui registry definition by package name. Always install with `npx love-ui add <component>` and never install @loveui/* packages directly.",inputSchema:{type:"object",additionalProperties:!1,properties:{name:{type:"string",description:"Package name, e.g. badge"}},required:["name"]}}]})),e.setRequestHandler(Ae,async t=>{if(t.params.name!==K)throw new l(d.InvalidParams,`Tool ${t.params.name} not found`);let s=t.params.arguments?.name;if(typeof s!="string"||s.trim()==="")throw new l(d.InvalidParams,"Package name is required.");let r=await V(s.trim());return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}});let n=new Oe;await e.connect(n)}Ye().catch(e=>{console.error(e),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "love-ui",
3
- "version": "1.2.11",
3
+ "version": "1.2.13",
4
4
  "private": false,
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "type": "module",
@@ -12,6 +12,7 @@
12
12
  "files": [
13
13
  "dist",
14
14
  "packages",
15
+ "public",
15
16
  "*.ts",
16
17
  "*.tsx",
17
18
  "*.css",
@@ -36,7 +37,8 @@
36
37
  },
37
38
  "scripts": {
38
39
  "build": "tsup",
39
- "postbuild": "node ./scripts/copy-packages.mjs",
40
+ "postbuild": "node ./scripts/copy-packages.mjs && node ./scripts/verify-registry.mjs",
41
+ "verify:registry": "node ./scripts/verify-registry.mjs",
40
42
  "clean": "rimraf dist packages"
41
43
  },
42
44
  "devDependencies": {
@@ -0,0 +1,99 @@
1
+ ---
2
+ name: loveui-skills
3
+ description: Build beautiful, professional software interfaces and websites with LoveUI. Use when users ask to create, redesign, or polish web apps, pages, dashboards, landing pages, SaaS UI, or multi-page product experiences with high visual quality, responsive behavior, and production-ready code.
4
+ ---
5
+
6
+ # LoveUI Skills
7
+
8
+ Follow this skill to design and implement polished, production-ready UI in LoveUI projects.
9
+
10
+ ## Required Tooling
11
+
12
+ - Use the `loveui` MCP server as the authoritative source for LoveUI registry knowledge.
13
+ - Use MCP `resources/list` to discover all available registry items.
14
+ - Use MCP tool `get-loveui-package` to fetch exact registry JSON for selected items.
15
+ - Treat MCP results as the source of truth for UI components, building blocks, examples, templates, and related registry entries.
16
+
17
+ ## Core Rules
18
+
19
+ - Start by extracting constraints: product type, audience, framework, existing design system, and timeline.
20
+ - Choose one visual direction before coding. Avoid generic default layouts.
21
+ - Build a coherent token system first: spacing, typography, colors, radius, shadows.
22
+ - Design desktop and mobile together.
23
+ - Define loading, empty, error, and success states for core surfaces.
24
+ - Preserve existing visual patterns when working in an established codebase.
25
+ - For LoveUI installs, use `npx love-ui add <component>` only.
26
+ - Never install internal packages directly (`@loveui/*`, `@love-ui/*`, `@repo/*`).
27
+ - Do not guess component availability from memory when MCP is available.
28
+
29
+ ## Agent UX Contract (Non-Negotiables)
30
+
31
+ When the UI includes an agent, automation, or “apply changes” workflow, the implementation MUST include:
32
+
33
+ ### Plan → Preview → Apply
34
+
35
+ - **Plan:** 1–3 bullets: what will change, why, what won’t change.
36
+ - **Preview:** diffs/screenshots/structured change summary BEFORE commit.
37
+ - **Apply:** execution state + completion summary.
38
+
39
+ ### Undo & History are first‑class
40
+
41
+ - **Undo** in the success toast for reversible actions.
42
+ - **History** panel with restore points for high‑impact operations.
43
+ - High‑risk actions require confirmation + preview.
44
+
45
+ ### Choice Architecture
46
+
47
+ - Default surface shows **3–5** primary actions max.
48
+ - Use progressive disclosure: “More…”, “Advanced”, context menus.
49
+ - Prefer a command palette with context-valid actions (keyboard-first).
50
+
51
+ ### Trust & Explainability Primitives
52
+
53
+ - “Why this?” drawer for suggestions (short, plain-language).
54
+ - Source/provenance pill (e.g., “From LoveUI registry” / “From MCP item X”).
55
+ - Risk labeling: Low (styling), Medium (layout), High (data/auth/routing).
56
+ - No dead ends: every empty/error state offers a next action.
57
+
58
+ ## Workflow
59
+
60
+ 1. Define scope and screens.
61
+ - List exact pages/views and core user actions for each.
62
+ - For agent surfaces, define the Plan/Preview/Apply flow and the rollback strategy.
63
+
64
+ 2. Build live LoveUI catalog context with MCP.
65
+ - Read `references/mcp-catalog-workflow.md`.
66
+ - Call `resources/list` and map candidate registry items for the requested UI.
67
+ - Call `get-loveui-package` for each selected item before implementation.
68
+
69
+ 3. Choose visual direction.
70
+ - Read `references/design-directions.md`.
71
+ - Commit to one direction for the implementation.
72
+
73
+ 4. Choose layout blueprint.
74
+ - Read `references/page-blueprints.md`.
75
+ - Start from the closest blueprint and adapt.
76
+
77
+ 5. Implement foundations.
78
+ - Set design tokens and section rhythm first.
79
+ - Confirm consistent container widths and breakpoints.
80
+
81
+ 6. Build reusable UI and compose pages.
82
+ - Build reusable components before page assembly.
83
+ - Keep APIs variant-driven and minimal.
84
+ - Ensure semantics and keyboard support.
85
+ - For agent UIs, prefer an “Agent UI Kit” set of blocks:
86
+ - command palette, plan/preview/apply panel, diff viewer, run log/timeline, history/restore, inspector.
87
+
88
+ 7. Apply quality gates.
89
+ - Read `references/quality-gates.md`.
90
+ - Fix all failing checks before finalizing.
91
+
92
+ ## Output Contract
93
+
94
+ Always provide:
95
+
96
+ - The chosen visual direction and brief rationale.
97
+ - Files created/updated.
98
+ - Commands run.
99
+ - Any remaining gaps or tradeoffs.
@@ -0,0 +1,11 @@
1
+ interface:
2
+ display_name: "LoveUI Skills"
3
+ short_description: "Build polished, professional LoveUI interfaces"
4
+ default_prompt: "Use $loveui-skills to create a beautiful, professional web app/page with LoveUI and production-ready UX quality."
5
+ dependencies:
6
+ tools:
7
+ - type: "mcp"
8
+ value: "loveui"
9
+ description: "LoveUI MCP server for full registry access and package retrieval"
10
+ policy:
11
+ allow_implicit_invocation: true
@@ -0,0 +1,60 @@
1
+ # Design Directions
2
+
3
+ Choose exactly one direction per project unless the user asks for mixed styles.
4
+
5
+ ## 1) Editorial Premium
6
+
7
+ - Typography-first hierarchy with restrained color.
8
+ - Strong spacing discipline and subtle separators.
9
+ - Best for: marketing pages, product narrative, docs.
10
+
11
+ ## 2) Data-Rich Enterprise
12
+
13
+ - Dense but readable information zoning.
14
+ - Strong table/chart readability and utility controls.
15
+ - Best for: dashboards, admin tools, operations software.
16
+
17
+ ## 3) Modern SaaS Crisp
18
+
19
+ - Clean medium-density layout with clear calls to action.
20
+ - Soft radii, controlled shadows, limited accent color.
21
+ - Best for: SaaS products, onboarding, account flows.
22
+ - Also strong for: agent workflows where you want guided “Plan → Preview → Apply”.
23
+
24
+ ## 4) Minimal Product Studio
25
+
26
+ - Low ornamentation and deliberate whitespace.
27
+ - Strong alignment precision and calm interaction design.
28
+ - Best for: focused tools, portfolio, productivity apps.
29
+
30
+ ## 5) Bold Campaign
31
+
32
+ - High-impact hero and conversion-first section flow.
33
+ - Strong anchors, large typography, selective motion.
34
+ - Best for: launches, event pages, acquisition landers.
35
+
36
+ ## 6) Technical Console
37
+
38
+ - Utility-first, fast-scanning interface style.
39
+ - Compact controls and explicit status signaling.
40
+ - Best for: developer tools, monitoring, internal platforms.
41
+ - Also strong for: agent tooling where logs, diffs, and provenance must be always visible.
42
+
43
+ ## Selection Checklist
44
+
45
+ - Match audience expectations.
46
+ - Match information density.
47
+ - Match brand voice.
48
+ - Confirm readability and contrast.
49
+
50
+ ### Agent UX Fit Checks
51
+
52
+ If the UI includes an agent:
53
+
54
+ - Prefer **Technical Console** for power users (dense, explicit status + logs).
55
+ - Prefer **Modern SaaS Crisp** for mixed audiences (guided steps + clearer affordances).
56
+ - Ensure the direction supports:
57
+ - a clear primary action,
58
+ - visible system status,
59
+ - readable diff/log surfaces,
60
+ - consistent “apply” affordances.
@@ -0,0 +1,68 @@
1
+ # MCP Catalog Workflow
2
+
3
+ Use this workflow whenever the `loveui` MCP server is available.
4
+
5
+ ## Goal
6
+
7
+ Access complete LoveUI registry knowledge from MCP for:
8
+
9
+ - UI components
10
+ - building blocks
11
+ - examples/demos
12
+ - templates and related registry entries
13
+
14
+ ## Mandatory Steps
15
+
16
+ 1. Call `resources/list` on the `loveui` MCP server.
17
+ - Treat this output as the authoritative live catalog.
18
+ - Do not assume availability from memory.
19
+
20
+ 2. Narrow candidates by user intent.
21
+ - Match names to required surfaces and interactions.
22
+ - Keep a shortlist of likely registry items.
23
+
24
+ 3. Fetch exact definitions with `get-loveui-package`.
25
+ - Call once per shortlisted item.
26
+ - Read `type`, `files`, `dependencies`, `registryDependencies`, and metadata.
27
+
28
+ 4. Build install plan.
29
+ - Use `npx love-ui add <component>` for install commands.
30
+ - Never use internal package installs (`@loveui/*`, `@love-ui/*`, `@repo/*`).
31
+
32
+ 5. Validate composition coverage.
33
+ - Ensure selected items cover all required screens and states.
34
+ - Add missing items by repeating steps 2-4.
35
+
36
+ ## Agent UI Kit (When an agent is present)
37
+
38
+ If the experience includes “generate/apply changes”, always attempt to assemble a minimal “Agent UI Kit”
39
+ from registry items (components, blocks, examples). Look for items that cover:
40
+
41
+ - Command palette / quick actions
42
+ - Plan → Preview → Apply panels
43
+ - Diff viewer (code/text) and/or before/after preview
44
+ - Run log / timeline (steps, progress, streaming output)
45
+ - History / restore (snapshots, rollback)
46
+ - Inspector / “why this?” drawer
47
+ - Toasts with Undo, banners, inline status components
48
+
49
+ If any of these are missing from the selected set, return to steps 2–4 and add them.
50
+
51
+ ## Selection Heuristics
52
+
53
+ - Prefer base primitives first, then add higher-level blocks/examples.
54
+ - Use examples/demos to accelerate layout and interaction scaffolding.
55
+ - Keep installed set minimal for maintainability.
56
+ - For agent UIs:
57
+ - prioritize diff/log/history primitives early,
58
+ - prioritize keyboard-first affordances (palette, shortcuts),
59
+ - prefer context-valid actions over huge menus.
60
+
61
+ ## Output Requirements
62
+
63
+ When presenting work, include:
64
+
65
+ - MCP items selected (names).
66
+ - Install commands executed.
67
+ - Why each selected item maps to the requested UX.
68
+ - For agent UIs: where Plan/Preview/Apply, Undo, and History live in the UI.
@@ -0,0 +1,76 @@
1
+ # Page Blueprints
2
+
3
+ Use these as defaults and adapt to product constraints.
4
+
5
+ ## SaaS Dashboard
6
+
7
+ 1. Global header: context, search, notifications, profile.
8
+ 2. KPI row: 3-6 key metrics with trend indicators.
9
+ 3. Primary insights zone: chart/table split.
10
+ 4. Secondary panels: activity, alerts, tasks, or funnel.
11
+ 5. Footer utilities: status/help links.
12
+
13
+ ## Marketing / Landing
14
+
15
+ 1. Hero: value proposition + primary CTA.
16
+ 2. Proof: logos, social proof, key stats.
17
+ 3. Feature grid with concise benefit copy.
18
+ 4. FAQ or comparison section.
19
+ 5. Final CTA + footer.
20
+
21
+ ## Workspace / Tool Screen
22
+
23
+ 1. Top bar: context title + critical actions.
24
+ 2. Left navigation rail or sidebar.
25
+ 3. Main canvas or primary panel.
26
+ 4. Secondary inspector/context panel.
27
+ 5. Feedback layer: toast, inline status, banners.
28
+
29
+ ## Settings / Account
30
+
31
+ 1. Section tabs or sidebar nav.
32
+ 2. Profile and organization settings.
33
+ 3. Billing and subscription controls.
34
+ 4. Security/access controls.
35
+ 5. Danger zone and audit/history.
36
+
37
+ ## Content / Docs
38
+
39
+ 1. Title block with metadata.
40
+ 2. Reading progress + table of contents.
41
+ 3. Main semantic content body.
42
+ 4. Related resources and next action.
43
+ 5. Feedback/edit links.
44
+
45
+ ## Agent Workspace (Plan → Preview → Apply)
46
+
47
+ Use this when the UI includes an agent that proposes changes or executes steps.
48
+
49
+ 1. Top bar: workspace context + primary action (Apply) + secondary (Preview/Run) + palette trigger.
50
+ 2. Left rail: activity feed or “runs” list (recent executions).
51
+ 3. Center: tabbed **Plan / Preview / Apply** surface.
52
+ - Plan: concise bullets + risk label.
53
+ - Preview: diff + before/after preview + impacted files list.
54
+ - Apply: progress, step timeline, streaming log, final summary.
55
+ 4. Right inspector: “Why this?”, provenance, settings, and per-change details.
56
+ 5. Bottom feedback: toasts (with Undo), warnings, and inline error recovery actions.
57
+
58
+ ## Diff Review (Focused)
59
+
60
+ Use for heavy change review or refactors.
61
+
62
+ 1. Header: scope summary (files, risk, estimated impact) + primary actions.
63
+ 2. Diff list (left): files/sections, filters (only changed, risky, failing gates).
64
+ 3. Diff viewer (center): side-by-side by default with inline comments.
65
+ 4. Run/test panel (right or bottom): checks, failures, rerun buttons.
66
+ 5. Footer: Apply/merge controls + Undo/restore point creation.
67
+
68
+ ## History & Restore
69
+
70
+ Use when users need confidence and rollback.
71
+
72
+ 1. Timeline of restore points with metadata (who/when/what).
73
+ 2. Compare view between any two snapshots.
74
+ 3. Restore flow (preview + confirm).
75
+ 4. Guardrails for destructive restores.
76
+ 5. Export/share audit trail if relevant.
@@ -0,0 +1,51 @@
1
+ # Quality Gates
2
+
3
+ Ship only after all gates pass.
4
+
5
+ ## Visual System
6
+
7
+ - Typography scale is consistent.
8
+ - Spacing increments are consistent.
9
+ - Color and elevation are tokenized and purposeful.
10
+ - Radius and border treatment are coherent.
11
+
12
+ ## UX and Interaction
13
+
14
+ - Primary action is obvious on every view.
15
+ - Hover/focus/active/disabled states are present.
16
+ - Loading/empty/error/success states are implemented.
17
+ - Core workflows are obvious and low-friction.
18
+
19
+ ### Agent UX Gates (Ship-blockers)
20
+
21
+ If the UI includes an agent or “apply changes” workflow:
22
+
23
+ - **Plan → Preview → Apply** exists and is the default path.
24
+ - **Preview required** for high-risk operations (routing/auth/data model/destructive ops).
25
+ - **Undo** exists for reversible actions and appears in the success toast.
26
+ - **History/restore** exists for high-impact changes (restore points/snapshots).
27
+ - **Visible system status**: current step, progress, and outcome are always visible.
28
+ - **No dead ends**: every empty/error state has a next action.
29
+ - **Choice architecture**: 3–5 primary actions max on the default surface; progressive disclosure for the rest.
30
+ - **Keyboard-first happy path**: palette + navigable controls for key actions.
31
+ - **Provenance**: users can see where suggestions/actions came from (“Why this?”, sources).
32
+
33
+ ## Responsive Behavior
34
+
35
+ - Layout works on mobile, tablet, desktop.
36
+ - Critical actions remain accessible on small screens.
37
+ - Data surfaces degrade gracefully on narrow viewports.
38
+
39
+ ## Accessibility
40
+
41
+ - Text/control contrast is sufficient.
42
+ - Keyboard navigation works for all key actions.
43
+ - Semantic headings/landmarks are present.
44
+ - Form labels and validation feedback are clear.
45
+
46
+ ## Maintainability
47
+
48
+ - Components are reusable and not tightly coupled.
49
+ - Motion is meaningful and restrained.
50
+ - Naming and file organization are consistent.
51
+ - Avoid unnecessary client-side complexity.
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "accordion-controlled",
4
+ "description": "Controlled accordion",
5
+ "registryDependencies": [
6
+ "@loveui/accordion",
7
+ "@loveui/button"
8
+ ],
9
+ "files": [
10
+ {
11
+ "path": "registry/default/examples/accordion-controlled.tsx",
12
+ "content": "\"use client\"\n\nimport * as React from \"react\"\n\nimport {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\nimport { Button } from \"@/registry/default/ui/button\"\n\nexport default function AccordionControlledDemo() {\n const [value, setValue] = React.useState<string[]>([])\n\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <Accordion className=\"w-full\" value={value} onValueChange={setValue}>\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Updated What is Base UI?</AccordionTrigger>\n <AccordionPanel>\n Updated Base UI is a library of high-quality unstyled React\n components for design systems and web apps.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-2\">\n <AccordionTrigger>Updated How do I get started?</AccordionTrigger>\n <AccordionPanel>\n Updated Head to the \"Quick start\" guide in the docs. If you've used\n unstyled libraries before, you'll feel at home.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-3\">\n <AccordionTrigger>\n Updated Can I use it for my project?\n </AccordionTrigger>\n <AccordionPanel>\n Updated Of course! Base UI is free and open source.\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n\n <div className=\"flex flex-col items-start gap-4\">\n <Button\n variant=\"outline\"\n onClick={() => setValue([\"item-1\", \"item-2\"])}\n >\n Updated Open First Two\n </Button>\n <p className=\"text-sm text-muted-foreground\">\n Updated Open items: {value.length > 0 ? value.join(\", \") : \"None\"}\n </p>\n </div>\n </div>\n )\n}\n",
13
+ "type": "registry:example"
14
+ }
15
+ ],
16
+ "categories": [
17
+ "accordion"
18
+ ],
19
+ "type": "registry:example"
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "accordion-demo",
4
+ "description": "Basic accordion",
5
+ "registryDependencies": [
6
+ "@loveui/accordion"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/examples/accordion-demo.tsx",
11
+ "content": "import {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nconst items = [\n {\n id: \"1\",\n title: \"Updated What is Base UI?\",\n content:\n \"Updated Base UI is a library of high-quality unstyled React components for design systems and web apps.\",\n },\n {\n id: \"2\",\n title: \"Updated How do I get started?\",\n content:\n \"Updated Head to the \\\"Quick start\\\" guide in the docs. If you've used unstyled libraries before, you'll feel at home.\",\n },\n {\n id: \"3\",\n title: \"Updated Can I use it for my project?\",\n content: \"Updated Of course! Base UI is free and open source.\",\n },\n]\n\nexport default function AccordionDemo() {\n return (\n <Accordion className=\"w-full\" defaultValue={[\"3\"]}>\n {items.map((item) => (\n <AccordionItem value={item.id} key={item.id}>\n <AccordionTrigger>{item.title}</AccordionTrigger>\n <AccordionPanel>{item.content}</AccordionPanel>\n </AccordionItem>\n ))}\n </Accordion>\n )\n}\n",
12
+ "type": "registry:example"
13
+ }
14
+ ],
15
+ "categories": [
16
+ "accordion"
17
+ ],
18
+ "type": "registry:example"
19
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "accordion-multiple",
4
+ "description": "Accordion allowing multiple panels open",
5
+ "registryDependencies": [
6
+ "@loveui/accordion"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/examples/accordion-multiple.tsx",
11
+ "content": "import {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nexport default function AccordionMultipleDemo() {\n return (\n <Accordion className=\"w-full\" multiple={true}>\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Updated What is Base UI?</AccordionTrigger>\n <AccordionPanel>\n Updated Base UI is a library of high-quality unstyled React components\n for design systems and web apps.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-2\">\n <AccordionTrigger>Updated How do I get started?</AccordionTrigger>\n <AccordionPanel>\n Updated Head to the \"Quick start\" guide in the docs. If you've used\n unstyled libraries before, you'll feel at home.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-3\">\n <AccordionTrigger>\n Updated Can I use it for my project?\n </AccordionTrigger>\n <AccordionPanel>\n Updated Of course! Base UI is free and open source.\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n )\n}\n",
12
+ "type": "registry:example"
13
+ }
14
+ ],
15
+ "categories": [
16
+ "accordion"
17
+ ],
18
+ "type": "registry:example"
19
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "accordion-single",
4
+ "description": "Accordion with one panel open",
5
+ "registryDependencies": [
6
+ "@loveui/accordion"
7
+ ],
8
+ "files": [
9
+ {
10
+ "path": "registry/default/examples/accordion-single.tsx",
11
+ "content": "import {\n Accordion,\n AccordionItem,\n AccordionPanel,\n AccordionTrigger,\n} from \"@/registry/default/ui/accordion\"\n\nexport default function AccordionSingleDemo() {\n return (\n <Accordion className=\"w-full\" multiple={false}>\n <AccordionItem value=\"item-1\">\n <AccordionTrigger>Updated What is Base UI?</AccordionTrigger>\n <AccordionPanel>\n Updated Base UI is a library of high-quality unstyled React components\n for design systems and web apps.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-2\">\n <AccordionTrigger>Updated How do I get started?</AccordionTrigger>\n <AccordionPanel>\n Updated Head to the \"Quick start\" guide in the docs. If you've used\n unstyled libraries before, you'll feel at home.\n </AccordionPanel>\n </AccordionItem>\n <AccordionItem value=\"item-3\">\n <AccordionTrigger>\n Updated Can I use it for my project?\n </AccordionTrigger>\n <AccordionPanel>\n Updated Of course! Base UI is free and open source.\n </AccordionPanel>\n </AccordionItem>\n </Accordion>\n )\n}\n",
12
+ "type": "registry:example"
13
+ }
14
+ ],
15
+ "categories": [
16
+ "accordion"
17
+ ],
18
+ "type": "registry:example"
19
+ }